/**
* 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.workflows.visitors;
import static org.whole.lang.workflows.reflect.WorkflowsEntityDescriptorEnum.ClassPath_ord;
import static org.whole.lang.workflows.reflect.WorkflowsEntityDescriptorEnum.CurrentJavaProject_ord;
import static org.whole.lang.workflows.reflect.WorkflowsEntityDescriptorEnum.JavaProject_ord;
import java.util.Set;
import java.util.TreeSet;
import org.eclipse.core.resources.IContainer;
import org.eclipse.core.resources.IResource;
import org.eclipse.core.resources.ResourcesPlugin;
import org.eclipse.core.runtime.IProgressMonitor;
import org.eclipse.jdt.core.IJavaProject;
import org.whole.gen.util.JDTUtils;
import org.whole.lang.artifacts.util.WorkspaceResourceOperations;
import org.whole.lang.bindings.BindingManagerFactory;
import org.whole.lang.bindings.IBindingManager;
import org.whole.lang.codebase.IPersistenceProvider;
import org.whole.lang.e4.ui.util.E4Utils;
import org.whole.lang.java.codebase.JavaSourceTemplateFactory;
import org.whole.lang.java.model.CompilationUnit;
import org.whole.lang.matchers.Matcher;
import org.whole.lang.model.IEntity;
import org.whole.lang.operations.OperationCanceledException;
import org.whole.lang.operations.PrettyPrinterOperation;
import org.whole.lang.reflect.EntityDescriptor;
import org.whole.lang.templates.ITemplateFactory;
import org.whole.lang.ui.actions.JavaModelGeneratorAction;
import org.whole.lang.ui.util.SuspensionKind;
import org.whole.lang.util.BehaviorUtils;
import org.whole.lang.util.EntityUtils;
import org.whole.lang.visitors.VisitException;
import org.whole.lang.workflows.model.Assignments;
import org.whole.lang.workflows.model.Breakpoint;
import org.whole.lang.workflows.model.ClassProvider;
import org.whole.lang.workflows.model.Condition;
import org.whole.lang.workflows.model.LoadJavaModel;
import org.whole.lang.workflows.model.ResourceKind;
import org.whole.lang.workflows.model.ResourceKindEnum;
import org.whole.lang.workflows.model.Task;
import org.whole.lang.workflows.model.Variable;
import org.whole.lang.workflows.model.Variables;
import org.whole.lang.workflows.reflect.WorkflowsEntityDescriptorEnum;
import org.whole.lang.workflows.ui.dialogs.AssignmentsDialogFactory;
import org.whole.lang.workflows.ui.dialogs.ConfirmationDialogFactory;
import org.whole.lang.workflows.ui.dialogs.ITaskDialogFactory;
import org.whole.lang.workflows.ui.dialogs.TaskDialogHelper;
/**
* @author Riccardo Solmi, Enrico Persiani
*/
public class WorkflowsIDEInterpreterVisitor extends WorkflowsInterpreterVisitor {
@Override
public void visit(Task entity) {
entity.getLabel().accept(this);
String title = PrettyPrinterOperation.toPrettyPrintString(getResult());
entity.getDescription().accept(this);
String description = PrettyPrinterOperation.toPrettyPrintString(getResult());
Assignments assignments = EntityUtils.clone(entity.getAssignments());
Variable factoryVariable = entity.getFactory();
ITaskDialogFactory factory;
if (EntityUtils.isNotResolver(factoryVariable)) {
factoryVariable.accept(this);
factory = (ITaskDialogFactory) getResultValue();
} else if (EntityUtils.isNotResolver(assignments)) {
factory = AssignmentsDialogFactory.instance();
} else
factory = ConfirmationDialogFactory.instance();
if (EntityUtils.isNotResolver(assignments)) {
stagedVisit(assignments, 1);
assignments = (Assignments) getResult();
}
if (!TaskDialogHelper.showTaskDialog(factory, title, description, assignments, getBindings()))
throw new OperationCanceledException(new VisitException("task not completed: "+description));
assignments.accept(this);
}
@Override
public void visit(Breakpoint entity) {
setResult(null);
IBindingManager debugEnv = getBindings();
if (entity.getDisabled().wBooleanValue() ||
(debugEnv.wIsSet("debug#reportModeEnabled") && !debugEnv.wBooleanValue("debug#reportModeEnabled")) ||
(debugEnv.wIsSet("debug#debugModeEnabled") && !debugEnv.wBooleanValue("debug#debugModeEnabled")) ||
(debugEnv.wIsSet("debug#breakpointsEnabled") && !debugEnv.wBooleanValue("debug#breakpointsEnabled")))
return;
Condition condition = entity.getCondition();
if (!EntityUtils.isResolver(condition)) {
if (!BehaviorUtils.evaluatePredicate(condition, 0, debugEnv))
return;
}
Set<String> includeNames = new TreeSet<String>();
Variables variables = entity.getShowVariables();
if (Matcher.matchImpl(WorkflowsEntityDescriptorEnum.Variables, variables)) {
for (Variable variable : variables)
includeNames.add(variable.getValue());
}
E4Utils.suspendOperation(SuspensionKind.BREAK, null, entity, debugEnv, includeNames);
}
@Override
protected IPersistenceProvider getWorkspaceProvider(IBindingManager bm, String resourceString) {
return E4Utils.createWorkspaceProvider(bm, resourceString);
}
@Override
protected IBindingManager createArtifactsBindings(String resource, ResourceKind resourceKind) {
if (!ResourceKindEnum.WORKSPACE.equals(resourceKind.getValue()))
return super.createArtifactsBindings(resource, resourceKind);
try {
IBindingManager bindings = BindingManagerFactory.instance.createBindingManager();
IResource rootResource = ResourcesPlugin.getWorkspace().getRoot().findMember(resource);
if (rootResource == null)
throw new IllegalArgumentException("root resource does not exist");
bindings.wDefValue("artifactsOperations", new WorkspaceResourceOperations());
bindings.wDefValue("rootResource", rootResource);
IContainer container = rootResource.getParent();
if (container != null) {
int type = container.getType();
switch (type) {
case IResource.PROJECT:
bindings.wDefValue("project", container);
break;
case IResource.FOLDER:
bindings.wDefValue("folder", container);
break;
default:
break;
}
}
return bindings;
} catch (Exception e) {
throw new IllegalArgumentException("Cannot find the specified resource", e);
}
}
@Override
protected ITemplateFactory<CompilationUnit> getJavaTemplateFactory(LoadJavaModel entity) {
ClassProvider classProvider = entity.getClassProvider();
EntityDescriptor<?> ed = classProvider.wGetEntityDescriptor();
IJavaProject javaProject;
switch (ed.getOrdinal()) {
case ClassPath_ord:
return super.getJavaTemplateFactory(entity);
case CurrentJavaProject_ord:
javaProject = (IJavaProject) getBindings().wGetValue("javaProject");
break;
case JavaProject_ord:
javaProject = JDTUtils.getJavaProject(classProvider.wStringValue());
break;
default:
throw new IllegalArgumentException("invalid ClassProvider");
}
entity.getClassName().accept(this);
String className = getResultString();
return new JavaSourceTemplateFactory(className, javaProject);
}
@Override
protected void performJavaCompilerOperation(IEntity model) {
try {
IProgressMonitor progressMonitor = getOperation()
.getProgressMonitor().getAdapter(IProgressMonitor.class);
JavaModelGeneratorAction.generate(progressMonitor, model, getBindings());
} catch (Exception e) {
throw new IllegalStateException(e);
}
}
}