blob: 3e6cf435296135bde4839a49177ddc0c7395a5ce [file] [log] [blame]
/*****************************************************************************
*
* Copyright (c) 2017 CEA LIST.
*
* All rights reserved. This program and the accompanying materials
* are made available under the terms of the Eclipse Public License 2.0
* which accompanies this distribution, and is available at
* https://www.eclipse.org/legal/epl-2.0/
*
* SPDX-License-Identifier: EPL-2.0
*
* Contributors:
* CEA LIST Initial API and implementation
*
*****************************************************************************/
package org.eclipse.papyrus.moka.externalcontrol.semantics;
import java.util.List;
import org.eclipse.papyrus.moka.externalcontrol.advice.IControllerAdvice;
import org.eclipse.papyrus.moka.externalcontrol.controller.AbstractExternallyControlledVisitor;
import org.eclipse.papyrus.moka.externalcontrol.controller.ExternalController;
import org.eclipse.papyrus.moka.fuml.activities.ActivityExecution;
import org.eclipse.papyrus.moka.fuml.activities.ActivityNodeActivationGroup;
import org.eclipse.papyrus.moka.fuml.activities.IActivityExecution;
import org.eclipse.papyrus.moka.fuml.activities.IActivityNodeActivationGroup;
import org.eclipse.papyrus.moka.fuml.activities.IActivityParameterNodeActivation;
import org.eclipse.papyrus.moka.fuml.activities.IToken;
import org.eclipse.papyrus.moka.fuml.activities.ObjectToken;
import org.eclipse.papyrus.moka.fuml.commonbehavior.IEventAccepter;
import org.eclipse.papyrus.moka.fuml.commonbehavior.IEventOccurrence;
import org.eclipse.papyrus.moka.fuml.commonbehavior.IExecution;
import org.eclipse.papyrus.moka.fuml.commonbehavior.IObjectActivation;
import org.eclipse.papyrus.moka.fuml.commonbehavior.IParameterValue;
import org.eclipse.papyrus.moka.fuml.commonbehavior.ParameterValue;
import org.eclipse.papyrus.moka.fuml.debug.Debug;
import org.eclipse.papyrus.moka.fuml.loci.ILocus;
import org.eclipse.papyrus.moka.fuml.loci.ISemanticVisitor;
import org.eclipse.papyrus.moka.fuml.simpleclassifiers.IFeatureValue;
import org.eclipse.papyrus.moka.fuml.simpleclassifiers.IValue;
import org.eclipse.papyrus.moka.fuml.structuredclassifiers.IObject_;
import org.eclipse.uml2.uml.Activity;
import org.eclipse.uml2.uml.ActivityParameterNode;
import org.eclipse.uml2.uml.Behavior;
import org.eclipse.uml2.uml.Class;
import org.eclipse.uml2.uml.Classifier;
import org.eclipse.uml2.uml.NamedElement;
import org.eclipse.uml2.uml.Operation;
import org.eclipse.uml2.uml.Parameter;
import org.eclipse.uml2.uml.StructuralFeature;
import org.eclipse.uml2.uml.ValueSpecification;
public class ExternallyControlledActivityExecution extends AbstractExternallyControlledVisitor<ActivityExecution> implements IActivityExecution {
public ExternallyControlledActivityExecution(ActivityExecution visitor, ExternalController controller, List<IControllerAdvice> advices) {
super(visitor, controller, advices);
}
protected AbstractExternallyControlledVisitor<? extends ISemanticVisitor> stackParent;
@Override
public AbstractExternallyControlledVisitor<? extends ISemanticVisitor> getStackParent() {
return stackParent;
}
//This operation is normally called by the ExternallyControlledCallActionActivation which created this execution
public void setStackParent(AbstractExternallyControlledVisitor<? extends ISemanticVisitor> parent) {
this.stackParent = parent;
}
@Override
protected void doSemanticAction() {
// Execute the activity for this execution by creating an activity node
// activation group and activating all the activity nodes in the
// activity.
// When this is complete, copy the values on the tokens offered by
// output parameter nodes to the corresponding output parameters.
Activity activity = (Activity) (this.getTypes().get(0));
Debug.println("[execute] Activity " + activity.getName() + "...");
// Debug.println("[execute] context = " + this.context.objectId());
Debug.println("[event] Execute activity=" + activity.getName());
setGroup( new ActivityNodeActivationGroup());
this.getGroup().setActivityExecution_(this);
this.getGroup().activate(activity.getNodes(), activity.getEdges());
}
@Override
protected void doResumeExecution() {
Activity activity = (Activity) (this.getTypes().get(0));
// Debug.println("[execute] Getting output parameter node activations...");
List<IActivityParameterNodeActivation> outputActivations = this.getGroup().getOutputParameterNodeActivations();
// Debug.println("[execute] There are " + outputActivations.size() +
// " output parameter node activations.");
for (int i = 0; i < outputActivations.size(); i++) {
IActivityParameterNodeActivation outputActivation = outputActivations.get(i);
ParameterValue parameterValue = new ParameterValue();
parameterValue.parameter = ((ActivityParameterNode) (outputActivation.getNode())).getParameter();
List<IToken> tokens = outputActivation.getTokens();
for (int j = 0; j < tokens.size(); j++) {
IToken token = tokens.get(j);
IValue value = ((ObjectToken) token).value;
if (value != null) {
parameterValue.values.add(value);
Debug.println("[event] Output activity=" + activity.getName() + " parameter=" + parameterValue.parameter.getName() + " value=" + value);
}
}
this.setParameterValue(parameterValue);
}
Debug.println("[execute] Activity " + activity.getName() + " completed.");
}
@Override
public void execute() {
//we suspend for control immediately
suspendForControl();
}
@Override
public void addType(Class type) {
delegatedVisitor.addType(type);
}
@Override
public void removeType(Class type) {
delegatedVisitor.removeType(type);
}
@Override
public void startBehavior(Class classifier, List<IParameterValue> inputs) {
delegatedVisitor.startBehavior(classifier, inputs);
}
@Override
public IExecution dispatch(Operation operation) {
return delegatedVisitor.dispatch(operation);
}
@Override
public void send(IEventOccurrence eventOccurrence) {
delegatedVisitor.send(eventOccurrence);
}
@Override
public void register(IEventAccepter accepter) {
delegatedVisitor.register(accepter);
}
@Override
public void unregister(IEventAccepter accepter) {
delegatedVisitor.unregister(accepter);
}
@Override
public IObjectActivation getObjectActivation() {
return delegatedVisitor.getObjectActivation();
}
@Override
public void setObjectActivation(IObjectActivation objectActivation) {
delegatedVisitor.setObjectActivation(objectActivation);
}
@Override
public void destroy() {
delegatedVisitor.destroy();
}
@Override
public void setLocus(ILocus locus) {
delegatedVisitor.setLocus(locus);
}
@Override
public ILocus getLocus() {
return delegatedVisitor.getLocus();
}
@Override
public void setIdentifier(String identifier) {
delegatedVisitor.setIdentifier(identifier);
}
@Override
public String getIdentifier() {
return delegatedVisitor.getIdentifier();
}
@Override
public void addFeatureValues(List<IFeatureValue> oldFeatureValues) {
delegatedVisitor.addFeatureValues(oldFeatureValues);
}
@Override
public void addFeatureValuesForType(Classifier type, List<IFeatureValue> oldFeatureValues) {
delegatedVisitor.addFeatureValuesForType(type, oldFeatureValues);
}
@Override
public void createFeatureValues() {
delegatedVisitor.createFeatureValues();
}
@Override
public List<IFeatureValue> getMemberValues() {
return delegatedVisitor.getMemberValues();
}
@Override
public List<IValue> getValues(NamedElement feature, List<IFeatureValue> featureValues) {
return delegatedVisitor.getValues(feature, featureValues);
}
@Override
public IFeatureValue getFeatureValue(StructuralFeature feature) {
return delegatedVisitor.getFeatureValue(feature);
}
@Override
public void setFeatureValue(StructuralFeature feature, List<IValue> values, Integer position) {
delegatedVisitor.setFeatureValue(feature, values, position);
}
@Override
public List<IFeatureValue> getFeatureValues() {
return delegatedVisitor.getFeatureValues();
}
@Override
public void setFeatureValues(List<IFeatureValue> featureValues) {
delegatedVisitor.setFeatureValues(featureValues);
}
@Override
public ValueSpecification specify() {
return delegatedVisitor.specify();
}
@Override
public Boolean equals(IValue otherValue) {
return delegatedVisitor.equals(otherValue);
}
@Override
public IValue copy() {
return delegatedVisitor.copy();
}
@Override
public IValue new_() {
return delegatedVisitor.new_();
}
@Override
public List<Classifier> getTypes() {
return delegatedVisitor.getTypes();
}
@Override
public Boolean hasType(Classifier type) {
return delegatedVisitor.hasType(type);
}
@Override
public void _endIsolation() {
delegatedVisitor._endIsolation();
}
@Override
public void _beginIsolation() {
delegatedVisitor._beginIsolation();
}
@Override
public void setParameterValue(IParameterValue parameterValue) {
delegatedVisitor.setParameterValue(parameterValue);
}
@Override
public IParameterValue getReturnParameterValue() {
return delegatedVisitor.getReturnParameterValue();
}
@Override
public IParameterValue getParameterValue(Parameter parameter) {
return delegatedVisitor.getParameterValue(parameter);
}
@Override
public List<IParameterValue> getOutputParameterValues() {
return delegatedVisitor.getOutputParameterValues();
}
@Override
public Behavior getBehavior() {
return delegatedVisitor.getBehavior();
}
@Override
public void terminate() {
delegatedVisitor.terminate();
}
@Override
public void setContext(IObject_ context) {
delegatedVisitor.setContext(context);
}
@Override
public IObject_ getContext() {
return delegatedVisitor.getContext();
}
@Override
public List<IParameterValue> getParameterValues() {
return delegatedVisitor.getParameterValues();
}
@Override
public void setGroup(IActivityNodeActivationGroup group) {
delegatedVisitor.setGroup(group);
}
@Override
public IActivityNodeActivationGroup getGroup() {
return delegatedVisitor.getGroup();
}
@Override
public boolean checkAllParents(Classifier type, Classifier classifier) {
return this.delegatedVisitor.checkAllParents(type, classifier);
}
@Override
public boolean isInstanceOf(Classifier classifier) {
return this.delegatedVisitor.isInstanceOf(classifier);
}
}