/**
* Copyright 2004-2016 Riccardo Solmi. All rights reserved.
* This file is part of the Whole Platform.
*
* The Whole Platform is free software: you can redistribute it and/or modify
* it under the terms of the GNU Lesser General Public License as published by
* the Free Software Foundation, either version 3 of the License, or
* (at your option) any later version.
*
* The Whole Platform is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU Lesser General Public License for more details.
*
* You should have received a copy of the GNU Lesser General Public License
* along with the Whole Platform. If not, see <http://www.gnu.org/licenses/>.
*/
package org.whole.lang.actions.visitors;
import org.whole.lang.actions.model.ActionCall;
import org.whole.lang.actions.model.ContextMenuActions;
import org.whole.lang.actions.model.GuardedAction;
import org.whole.lang.actions.model.LanguageActionFactory;
import org.whole.lang.actions.model.Name;
import org.whole.lang.actions.model.SimpleAction;
import org.whole.lang.actions.model.ToolbarActions;
import org.whole.lang.actions.model.URI;
import org.whole.lang.actions.reflect.ActionsEntityDescriptorEnum;
import org.whole.lang.actions.resources.ActionsRegistry;
import org.whole.lang.bindings.BindingManagerFactory;
import org.whole.lang.bindings.IBindingManager;
import org.whole.lang.matchers.Matcher;
import org.whole.lang.model.IEntity;
import org.whole.lang.model.adapters.IEntityAdapter;
import org.whole.lang.operations.ArtifactsGeneratorOperation;
import org.whole.lang.operations.ContentAssistOperation;
import org.whole.lang.operations.DynamicCompilerOperation;
import org.whole.lang.operations.InterpreterOperation;
import org.whole.lang.operations.NormalizerOperation;
import org.whole.lang.operations.PrettyPrinterOperation;
import org.whole.lang.operations.ValidatorOperation;
import org.whole.lang.reflect.ILanguageKit;
import org.whole.lang.reflect.ReflectionFactory;
import org.whole.lang.util.EntityUtils;
import org.whole.lang.visitors.DynamicContentAssistVisitor;
import org.whole.lang.visitors.DynamicGeneratorVisitor;
import org.whole.lang.visitors.DynamicInterpreterVisitor;
import org.whole.lang.visitors.IVisitorFactory;
/**
* @author Riccardo Solmi
*/
public class ActionsInterpreterVisitor extends ActionsTraverseAllVisitor {
protected String name;
protected String uri;
protected ILanguageKit languageKit;
public enum WholeAction {VALUE_ASSIST, VALIDATOR, NORMALIZER, PRETTY_PRINTER, INTERPRETER, GENERATOR};
protected WholeAction wholeAction;
@Override
public void visit(LanguageActionFactory entity) {
entity = NormalizerOperation.normalize(EntityUtils.clone(entity));
ActionsRegistry.instance().addResource(entity, entity.getUri().getValue(), false);
entity.getName().accept(this);
entity.getTargetLanguage().accept(this);
entity.getToolbarActions().accept(this);
entity.getContextMenuActions().accept(this);
setResult(BindingManagerFactory.instance.createVoid());
}
protected String actionsUri;
protected String getActionsUri(IEntity entity) {
if (actionsUri == null) {
LanguageActionFactory laf = Matcher.findAncestor(ActionsEntityDescriptorEnum.LanguageActionFactory, entity);
actionsUri = laf != null ? laf.getUri().getValue() : getBindings().wStringValue("actionsUri");
}
return actionsUri;
}
@Override
public boolean visitAdapter(IEntityAdapter entity) {
if (!EntityUtils.isResolver(entity))
stagedVisit(entity.wGetAdaptee(false));
return false;
}
@Override
public void visit(ActionCall entity) {
handleCancelRequest();
DynamicCompilerOperation.compile(entity, getBindings());
}
@Override
public void visit(URI entity) {
uri = entity.wStringValue();
}
@Override
public void visit(Name entity) {
name = entity.wStringValue();
}
@Override
public void visit(ToolbarActions entity) {
if (uri == null)
return;
wholeAction = WholeAction.VALIDATOR;
entity.getValidatorAction().accept(this);
wholeAction = WholeAction.NORMALIZER;
entity.getNormalizerAction().accept(this);
wholeAction = WholeAction.PRETTY_PRINTER;
entity.getPrettyPrinterAction().accept(this);
wholeAction = WholeAction.INTERPRETER;
entity.getInterpreterAction().accept(this);
wholeAction = WholeAction.GENERATOR;
entity.getGeneratorAction().accept(this);
}
@Override
public void visit(GuardedAction entity) {
ActionsRegistry.instance().putFunctionModel(
getActionsUri(entity)+"#"+entity.getName().getValue(), entity);
IBindingManager bm = getBindings();
if (!bm.wIsSet("LazyInterpretation") || !bm.wBooleanValue("LazyInterpretation"))
DynamicCompilerOperation.compile(entity, getBindings());
}
@Override
public void visit(SimpleAction entity) {
String functionUri = getActionsUri(entity)+"#"+entity.getName().getValue();
ActionsRegistry.instance().putFunctionModel(functionUri, entity);
IBindingManager bm = getBindings();
if (!bm.wIsSet("LazyInterpretation") || !bm.wBooleanValue("LazyInterpretation"))
DynamicCompilerOperation.compile(entity, getBindings());
if (languageKit == null) {
String contextUri = getBindings().wIsSet("contextURI") ? getBindings().wStringValue("contextURI") : null;
languageKit = ReflectionFactory.getLanguageKit(uri, true, contextUri);
}
switch (wholeAction) {
case VALUE_ASSIST:
addVisitorFactory(languageKit, ContentAssistOperation.ID,
DynamicContentAssistVisitor.createVisitorFactory(ActionsRegistry.instance(), functionUri));
break;
case VALIDATOR:
addVisitorFactory(languageKit, ValidatorOperation.ID, functionUri, false);
break;
case NORMALIZER:
addVisitorFactory(languageKit, NormalizerOperation.ID, functionUri, false);
break;
case PRETTY_PRINTER:
addVisitorFactory(languageKit, PrettyPrinterOperation.ID, functionUri, false);
break;
case INTERPRETER:
addVisitorFactory(languageKit, InterpreterOperation.ID, functionUri, true);
break;
case GENERATOR:
addVisitorFactory(languageKit, ArtifactsGeneratorOperation.ID,
DynamicGeneratorVisitor.createVisitorFactory(ActionsRegistry.instance(), functionUri));
break;
}
}
protected void addVisitorFactory(ILanguageKit languageKit, String operationId, String functionUri, boolean stage0Only) {
addVisitorFactory(languageKit, operationId, DynamicInterpreterVisitor.createVisitorFactory(ActionsRegistry.instance(), functionUri, stage0Only));
}
protected void addVisitorFactory(ILanguageKit languageKit, String operationId, IVisitorFactory visitorFactory) {
languageKit.addVisitorFactory(operationId, visitorFactory);
}
@Override
public void visit(ContextMenuActions entity) {
wholeAction = WholeAction.VALUE_ASSIST;
entity.getValueAssistActions().accept(this);
entity.getSourceMenuActions().accept(this);
entity.getRefactorMenuActions().accept(this);
entity.getTranslateMenuActions().accept(this);
entity.getAnalyzeMenuActions().accept(this);
entity.getMigrateMenuActions().accept(this);
}
}