/* * Initial version copyright 2008 Lockheed Martin Corporation, except * as stated in the file entitled Licensing-Information. * * All modifications copyright 2009-2017 Data Access Technologies, Inc. * * Licensed under the Academic Free License version 3.0 * (http://www.opensource.org/licenses/afl-3.0.php), except as stated * in the file entitled Licensing-Information. */ package org.modeldriven.fuml.test.builtin.environment; import org.modeldriven.fuml.test.builtin.library.IntegerFunctions; import org.modeldriven.fuml.test.builtin.library.PrimitiveTypes; import org.modeldriven.fuml.test.builtin.library.StandardIOClasses; import fUML.Debug; import fUML.Syntax.Classes.Kernel.*; import fUML.Syntax.CommonBehaviors.BasicBehaviors.*; import fUML.Syntax.CommonBehaviors.Communications.*; import fUML.Syntax.Activities.IntermediateActivities.*; import fUML.Syntax.Activities.CompleteActivities.DataStoreNode; import fUML.Syntax.Activities.CompleteStructuredActivities.*; import fUML.Syntax.Activities.ExtraStructuredActivities.*; import fUML.Syntax.Actions.BasicActions.*; import fUML.Syntax.Actions.IntermediateActions.*; import fUML.Syntax.Actions.CompleteActions.*; import fUML.Semantics.Classes.Kernel.*; public class ActivityFactory { public TestEnvironment environment = null; public ActivityFactory(org.modeldriven.fuml.test.builtin.environment.TestEnvironment environment) { this.environment = environment; } // ActivityFactory protected void addEdge( fUML.Syntax.Activities.IntermediateActivities.Activity activity, fUML.Syntax.Activities.IntermediateActivities.ActivityEdge edge, fUML.Syntax.Activities.IntermediateActivities.ActivityNode source, fUML.Syntax.Activities.IntermediateActivities.ActivityNode target, fUML.Syntax.Classes.Kernel.ValueSpecification guard) { edge.setSource(source); edge.setTarget(target); edge.setGuard(guard); activity.addEdge(edge); } // addEdge protected void addNode( fUML.Syntax.Activities.IntermediateActivities.Activity activity, fUML.Syntax.Activities.IntermediateActivities.ActivityNode node) { activity.addNode(node); } // addNode protected fUML.Syntax.Classes.Kernel.Parameter addParameter( fUML.Syntax.Activities.IntermediateActivities.Activity activity, String name, fUML.Syntax.Classes.Kernel.ParameterDirectionKind direction, fUML.Syntax.Classes.Kernel.Type type) { Parameter parameter = new Parameter(); parameter.setName(name); parameter.setType(type); parameter.setDirection(direction); parameter.setLower(1); parameter.setUpper(1); activity.addOwnedParameter(parameter); return parameter; } // addParameter protected fUML.Syntax.Classes.Kernel.Property addProperty( fUML.Syntax.Activities.IntermediateActivities.Activity activity, String name, fUML.Syntax.Classes.Kernel.Type type, int lower, int upper) { Property property = new Property(); property.setName(name); property.setType(type); property.setLower(lower); property.setUpper(upper); activity.addOwnedAttribute(property); return property; } // addProperty protected fUML.Syntax.Actions.BasicActions.InputPin addInputPin( fUML.Syntax.Actions.BasicActions.Action action, String name, int lower, int upper) { // Debug.println("[addInputPin] name = " + name); InputPin inputPin = new InputPin(); this.setPin(inputPin, name, lower, upper); action.input.addValue(inputPin); return inputPin; } // addInputPin protected fUML.Syntax.Actions.BasicActions.OutputPin addOutputPin( fUML.Syntax.Actions.BasicActions.Action action, String name, int lower, int upper) { // Debug.println("[addOutputPin] name = " + name); OutputPin outputPin = new OutputPin(); this.setPin(outputPin, name, lower, upper); action.output.addValue(outputPin); return outputPin; } // addOutputPin protected fUML.Syntax.Actions.BasicActions.InputPin makeInputPin( String name, int lower, int upper) { // Debug.println("[makeInputPin] name = " + name); InputPin inputPin = new InputPin(); this.setPin(inputPin, name, lower, upper); return inputPin; } // makeInputPin protected fUML.Syntax.Actions.BasicActions.OutputPin makeOutputPin( String name, int lower, int upper) { // Debug.println("[makeOutputPin] name = " + name); OutputPin outputPin = new OutputPin(); this.setPin(outputPin, name, lower, upper); return outputPin; } // makeOutputPin protected void setPin(fUML.Syntax.Actions.BasicActions.Pin pin, String name, int lower, int upper) { // Debug.println("[setPin] name = " + name); pin.setName(name); pin.setLower(lower); pin.setUpper(upper); // this.addNode(activity, pin); } // setPin protected void setMultiplicity( fUML.Syntax.Classes.Kernel.MultiplicityElement element, int lower, int upper) { element.setLower(lower); element.setUpper(upper); } // setMultiplicity protected fUML.Syntax.Classes.Kernel.Operation getOperation( fUML.Syntax.Classes.Kernel.Class_ class_, String operationName) { for (int i = 0; i < class_.member.size(); i++) { NamedElement member = class_.member.getValue(i); if (member.name.equals(operationName)) { if (!(member instanceof Operation)) { return null; } return (Operation) member; } } return null; } // getOperation protected fUML.Syntax.Classes.Kernel.Property getProperty( fUML.Syntax.Classes.Kernel.Classifier classifier, String propertyName) { for (int i = 0; i < classifier.member.size(); i++) { NamedElement member = classifier.member.getValue(i); if (member.name.equals(propertyName)) { if (!(member instanceof Property)) { return null; } return (Property) member; } } return null; } // getProperty protected fUML.Syntax.Classes.Kernel.LiteralInteger createLiteralInteger( String name, int value) { LiteralInteger literal = (LiteralInteger) (this.environment .makeValue((Classifier) (PrimitiveTypes.Integer)) .specify()); literal.setName(name); literal.setValue(value); return literal; } // createLiteralInteger protected fUML.Syntax.Classes.Kernel.LiteralString createLiteralString( String name, String value) { LiteralString literal = (LiteralString) (this.environment .makeValue((Classifier) (PrimitiveTypes.String)) .specify()); literal.setName(name); literal.setValue(value); return literal; } // createLiteralString protected fUML.Syntax.Classes.Kernel.LiteralBoolean createLiteralBoolean( String name, boolean value) { LiteralBoolean literal = (LiteralBoolean) (this.environment .makeValue((Classifier) (PrimitiveTypes.Boolean)) .specify()); literal.setName(name); literal.setValue(value); return literal; } // createLiteralBoolean protected fUML.Syntax.Classes.Kernel.LiteralUnlimitedNatural createLiteralUnlimitedNatural( String name, int value) { LiteralUnlimitedNatural literal = (LiteralUnlimitedNatural) (this.environment .makeValue((Classifier) (PrimitiveTypes.UnlimitedNatural)) .specify()); literal.setName(name); literal.value.naturalValue = value; return literal; } // createLiteralUnlimitedNatural protected fUML.Syntax.Activities.IntermediateActivities.Activity createInstanceGetter( fUML.Syntax.Classes.Kernel.Classifier classifier, fUML.Syntax.Classes.Kernel.Operation operation, fUML.Semantics.Classes.Kernel.Value value) { Activity testActivity = new Activity(); testActivity.setName("Test(" + operation.name + ")"); Parameter testInput = this.addParameter(testActivity, "testInput", ParameterDirectionKind.in, classifier); Parameter testOutput = this.addParameter(testActivity, "testOutput", ParameterDirectionKind.out, PrimitiveTypes.Boolean); ActivityParameterNode testInputNode = new ActivityParameterNode(); testInputNode.setName("TestInputNode"); testInputNode.setParameter(testInput); testInputNode.setType(testInput.type); this.addNode(testActivity, testInputNode); CallOperationAction callOperationAction = new CallOperationAction(); callOperationAction.setName("Call(" + operation.name + ")"); callOperationAction.setOperation(operation); callOperationAction.setTarget(this.makeInputPin( callOperationAction.name + ".object", 1, 1)); callOperationAction.addResult(this.makeOutputPin( callOperationAction.name + ".result", 1, 1)); this.addNode(testActivity, callOperationAction); ValueSpecificationAction valueAction = new ValueSpecificationAction(); valueAction.setName("Value(" + value + ")"); valueAction.setValue(value.specify()); valueAction.setResult(this.makeOutputPin(valueAction.name + ".result", 1, 1)); this.addNode(testActivity, valueAction); TestIdentityAction testIdentityAction = new TestIdentityAction(); testIdentityAction .setName("Test(" + operation.name + "=" + value + ")"); testIdentityAction.setFirst(this.makeInputPin("Test.first", 1, 1)); testIdentityAction.setSecond(this.makeInputPin("Test.second", 1, 1)); testIdentityAction.setResult(this.makeOutputPin("Test.result", 1, 1)); this.addNode(testActivity, testIdentityAction); ActivityParameterNode testOutputNode = new ActivityParameterNode(); testOutputNode.setName("TestOutputNode"); testOutputNode.setParameter(testOutput); testOutputNode.setType(testOutput.type); this.addNode(testActivity, testOutputNode); this.addEdge(testActivity, new ObjectFlow(), testInputNode, callOperationAction.target, null); this.addEdge(testActivity, new ObjectFlow(), callOperationAction.result .getValue(0), testIdentityAction.first, null); this.addEdge(testActivity, new ObjectFlow(), valueAction.result, testIdentityAction.second, null); this.addEdge(testActivity, new ObjectFlow(), testIdentityAction.result, testOutputNode, null); Activity instanceGetterActivity = new Activity(); instanceGetterActivity.setName(classifier.name + "InstanceGetter"); Parameter instanceOutput = this.addParameter(instanceGetterActivity, "instance", ParameterDirectionKind.out, classifier); ReadExtentAction readExtentAction = new ReadExtentAction(); readExtentAction.setName("ReadExtent(" + classifier.name + ")"); readExtentAction.setClassifier(classifier); readExtentAction.setResult(this.makeOutputPin(readExtentAction.name + ".result", 0, -1)); this.addNode(instanceGetterActivity, readExtentAction); DecisionNode decisionNode = new DecisionNode(); decisionNode.setName("Decision(" + operation.name + "=" + value + ")"); decisionNode.setDecisionInput(testActivity); this.addNode(instanceGetterActivity, decisionNode); ActivityParameterNode outputNode = new ActivityParameterNode(); outputNode.setName("OutputNode"); outputNode.setParameter(instanceOutput); outputNode.setType(instanceOutput.type); this.addNode(instanceGetterActivity, outputNode); this.addEdge(instanceGetterActivity, new ObjectFlow(), readExtentAction.result, decisionNode, null); this.addEdge(instanceGetterActivity, new ObjectFlow(), decisionNode, outputNode, this.createLiteralBoolean("true", true)); return instanceGetterActivity; } // createInstanceGetter protected fUML.Syntax.Activities.IntermediateActivities.Activity getCopier() { return this.getActivity("Copier"); } // getCopier public fUML.Syntax.Activities.IntermediateActivities.Activity getActivity( String name) { NamedElement activity = this.environment.getElement(name); if ((activity == null) || !(activity instanceof Activity)) { if (activity == null) { Debug .println("[getActivity] Creating a " + name + " activity."); } else { Debug.println("[getActivity] Replacing the existing " + name + " element with an activity."); this.environment.removeElement(activity); activity = null; } try { this.getClass().getMethod("create" + name, new Class[0]) .invoke(this, new Object[0]); activity = this.environment.getElement(name); } catch (NoSuchMethodException e) { Debug.println("[getActivity] create" + name + "() not found."); } catch (Exception e) { Debug.println("[getActivity] Exeception: " + e); } } return (Activity) activity; } // getActivity public void createCopier() { Activity activity = new Activity(); activity.setName("Copier"); Parameter inputParameter = this.addParameter(activity, "input", ParameterDirectionKind.in, PrimitiveTypes.Integer); Parameter outputParameter = this.addParameter(activity, "output", ParameterDirectionKind.out, PrimitiveTypes.Integer); // Debug.println("[createCopier] Creating input node..."); ActivityParameterNode inputNode = new ActivityParameterNode(); inputNode.setName("inputNode"); inputNode.setParameter(inputParameter); this.addNode(activity, inputNode); // Debug.println("[createCopier] Creating output node..."); ActivityParameterNode outputNode = new ActivityParameterNode(); outputNode.setName("outputNode"); outputNode.setParameter(outputParameter); this.addNode(activity, outputNode); // Debug.println("[createCopier] Creating edge..."); this.addEdge(activity, new ObjectFlow(), inputNode, outputNode, null); this.environment.addElement(activity); } // createCopier public void createCaller(String calledActivityName) { Element element = this.getActivity(calledActivityName); Activity calledActivity = (Activity) element; ParameterList parameters = calledActivity.ownedParameter; Activity callerActivity = new Activity(); callerActivity.setName(calledActivityName + "Caller"); CallBehaviorAction callAction = new CallBehaviorAction(); callAction.setName("Call(" + calledActivityName + ")"); callAction.setBehavior(calledActivity); this.addNode(callerActivity, callAction); for (int i = 0; i < parameters.size(); i++) { Parameter parameter = parameters.getValue(i); if (parameter.direction.equals(ParameterDirectionKind.in) || parameter.direction.equals(ParameterDirectionKind.inout)) { ValueSpecification valueSpecification = this.environment .makeValue((Classifier) (parameter.type)).specify(); ValueSpecificationAction valueAction = new ValueSpecificationAction(); valueAction.setName("Value(" + parameter.name + ":" + parameter.type.name + ")"); valueAction.setValue(valueSpecification); valueAction.setResult(this.makeOutputPin(valueAction.name + ".result", 1, 1)); this.addNode(callerActivity, valueAction); InputPin inputPin = this.makeInputPin(callAction.name + ".argument[" + parameter.name + "]", 1, 1); callAction.addArgument(inputPin); this.addEdge(callerActivity, new ObjectFlow(), valueAction.result, inputPin, null); } else { ActivityParameterNode parameterNode = new ActivityParameterNode(); parameterNode.setName("Parameter(" + parameter.name + ")"); parameterNode.setParameter(this.addParameter(callerActivity, parameter.name, ParameterDirectionKind.out, parameter.type)); this.addNode(callerActivity, parameterNode); OutputPin outputPin = this.makeOutputPin(callAction.name + ".result[" + parameter.name + "]", 1, 1); callAction.addResult(outputPin); this.addEdge(callerActivity, new ObjectFlow(), outputPin, parameterNode, null); } } this.environment.addElement(callerActivity); } // createCaller public void createSimpleDecision(int testValue) { Activity simpleDecisionActivity = new Activity(); simpleDecisionActivity.setName("SimpleDecision" + testValue); Parameter parameter0 = this.addParameter(simpleDecisionActivity, "output_0", ParameterDirectionKind.out, PrimitiveTypes.Integer); Parameter parameter1 = this.addParameter(simpleDecisionActivity, "output_1", ParameterDirectionKind.out, PrimitiveTypes.Integer); ValueSpecificationAction valueAction = new ValueSpecificationAction(); valueAction.setName("ValueAction_" + testValue); valueAction.setValue(this.createLiteralInteger("", testValue)); valueAction.setResult(this.makeOutputPin(valueAction.name + ".result", 1, 1)); this.addNode(simpleDecisionActivity, valueAction); DecisionNode decisionNode = new DecisionNode(); decisionNode.setName("DecisionNode"); this.addNode(simpleDecisionActivity, decisionNode); ActivityParameterNode parameterNode0 = new ActivityParameterNode(); parameterNode0.setName("ParameterNode_0"); parameterNode0.setParameter(parameter0); this.addNode(simpleDecisionActivity, parameterNode0); ActivityParameterNode parameterNode1 = new ActivityParameterNode(); parameterNode1.setName("ParameterNode_1"); parameterNode1.setParameter(parameter1); this.addNode(simpleDecisionActivity, parameterNode1); LiteralInteger value0 = this.createLiteralInteger("guard_0", 0); LiteralInteger value1 = this.createLiteralInteger("guard_1", 1); this.addEdge(simpleDecisionActivity, new ObjectFlow(), valueAction.result, decisionNode, null); this.addEdge(simpleDecisionActivity, new ObjectFlow(), decisionNode, parameterNode0, value0); this.addEdge(simpleDecisionActivity, new ObjectFlow(), decisionNode, parameterNode1, value1); this.environment.addElement(simpleDecisionActivity); } // createSimpleDecision public void createForkJoin() { Activity forkJoinActivity = new Activity(); forkJoinActivity.setName("ForkJoin"); InitialNode initialNode = new InitialNode(); initialNode.setName("InitialNode"); this.addNode(forkJoinActivity, initialNode); ForkNode forkNode = new ForkNode(); forkNode.setName("ForkNode"); this.addNode(forkJoinActivity, forkNode); JoinNode joinNode = new JoinNode(); joinNode.setName("JoinNode"); this.addNode(forkJoinActivity, joinNode); ActivityFinalNode finalNode = new ActivityFinalNode(); finalNode.setName("FinalNode"); this.addNode(forkJoinActivity, finalNode); this.addEdge(forkJoinActivity, new ControlFlow(), initialNode, forkNode, null); this.addEdge(forkJoinActivity, new ControlFlow(), forkNode, joinNode, null); this.addEdge(forkJoinActivity, new ControlFlow(), forkNode, joinNode, null); this.addEdge(forkJoinActivity, new ControlFlow(), joinNode, finalNode, null); this.environment.addElement(forkJoinActivity); } // createForkJoin public void createDecisionJoin() { Activity copierActivity = this.getCopier(); Activity decisionJoinActivity = new Activity(); decisionJoinActivity.setName("DecisionJoin"); ValueSpecificationAction valueAction0 = new ValueSpecificationAction(); valueAction0.setName("ValueAction_0"); valueAction0.setValue(this.createLiteralInteger("", 0)); valueAction0.setResult(this.makeOutputPin( valueAction0.name + ".result", 1, 1)); this.addNode(decisionJoinActivity, valueAction0); ValueSpecificationAction valueAction1 = new ValueSpecificationAction(); valueAction1.setName("ValueAction_1"); valueAction1.setValue(this.createLiteralInteger("", 1)); valueAction1.setResult(this.makeOutputPin( valueAction1.name + ".result", 1, 1)); this.addNode(decisionJoinActivity, valueAction1); CallBehaviorAction callActionA = new CallBehaviorAction(); callActionA.setName("Action_A"); callActionA.setBehavior(copierActivity); callActionA.addArgument(this.makeInputPin(callActionA.name + ".argument", 1, 1)); callActionA.addResult(this.makeOutputPin(callActionA.name + ".result", 1, 1)); this.addNode(decisionJoinActivity, callActionA); DecisionNode decisionNode = new DecisionNode(); decisionNode.setName("DecisionNode"); decisionNode.setDecisionInput(null); this.addNode(decisionJoinActivity, decisionNode); JoinNode joinNode = new JoinNode(); joinNode.setName("JoinNode"); this.addNode(decisionJoinActivity, joinNode); CallBehaviorAction callActionB = new CallBehaviorAction(); callActionB.setName("Action_B"); callActionB.setBehavior(copierActivity); callActionB.addArgument(this.makeInputPin(callActionB.name + ".argument", 2, 2)); callActionB.addResult(this.makeOutputPin(callActionB.name + ".result", 2, 2)); this.addNode(decisionJoinActivity, callActionB); ActivityParameterNode outputNode = new ActivityParameterNode(); outputNode.setName("OutputNode"); outputNode.setParameter(this.addParameter(decisionJoinActivity, "output", ParameterDirectionKind.out, PrimitiveTypes.Integer)); this.addNode(decisionJoinActivity, outputNode); this.addEdge(decisionJoinActivity, new ControlFlow(), valueAction0, valueAction1, null); this.addEdge(decisionJoinActivity, new ObjectFlow(), valueAction0.result, callActionA.argument.getValue(0), null); this.addEdge(decisionJoinActivity, new ObjectFlow(), valueAction1.result, callActionA.argument.getValue(0), null); this.addEdge(decisionJoinActivity, new ObjectFlow(), callActionA.result .getValue(0), decisionNode, null); this.addEdge(decisionJoinActivity, new ObjectFlow(), decisionNode, joinNode, this.createLiteralInteger("guard_0", 0)); this.addEdge(decisionJoinActivity, new ObjectFlow(), decisionNode, joinNode, this.createLiteralInteger("guard_1", 1)); this.addEdge(decisionJoinActivity, new ObjectFlow(), joinNode, callActionB.argument.getValue(0), null); this.addEdge(decisionJoinActivity, new ObjectFlow(), callActionB.result .getValue(0), outputNode, null); this.environment.addElement(decisionJoinActivity); } // createDecisionJoin public void createForkMerge() { Activity forkMergeActivity = new Activity(); forkMergeActivity.name = "ForkMerge"; InitialNode initialNode = new InitialNode(); initialNode.setName("InitialNode"); this.addNode(forkMergeActivity, initialNode); ForkNode forkNode = new ForkNode(); forkNode.setName("ForkNode"); this.addNode(forkMergeActivity, forkNode); MergeNode mergeNode = new MergeNode(); mergeNode.setName("MergeNode"); this.addNode(forkMergeActivity, mergeNode); ValueSpecificationAction valueAction = new ValueSpecificationAction(); valueAction.setName("ValueAction_0"); valueAction.setValue(this.createLiteralInteger("", 0)); valueAction.setResult(this.makeOutputPin(valueAction.name + ".result", 1, 1)); this.addNode(forkMergeActivity, valueAction); ActivityParameterNode outputNode = new ActivityParameterNode(); outputNode.setName("OutputNode"); outputNode.setParameter(this.addParameter(forkMergeActivity, "output", ParameterDirectionKind.out, PrimitiveTypes.Integer)); this.addNode(forkMergeActivity, outputNode); this.addEdge(forkMergeActivity, new ControlFlow(), initialNode, forkNode, null); this.addEdge(forkMergeActivity, new ControlFlow(), forkNode, mergeNode, null); this.addEdge(forkMergeActivity, new ControlFlow(), forkNode, mergeNode, null); this.addEdge(forkMergeActivity, new ControlFlow(), mergeNode, valueAction, null); this.addEdge(forkMergeActivity, new ObjectFlow(), valueAction.result, outputNode, null); this.environment.addElement(forkMergeActivity); } // createForkMerge public void createForkMergeData() { Activity forkMergeActivity = new Activity(); forkMergeActivity.name = "ForkMergeData"; ValueSpecificationAction actionA = new ValueSpecificationAction(); actionA.setName("Action_A"); actionA.setValue(this.createLiteralInteger("", 0)); actionA.setResult(this.makeOutputPin(actionA.name + ".result", 1, 1)); this.addNode(forkMergeActivity, actionA); ForkNode forkNode = new ForkNode(); forkNode.setName("ForkNode"); this.addNode(forkMergeActivity, forkNode); MergeNode mergeNode = new MergeNode(); mergeNode.setName("MergeNode"); this.addNode(forkMergeActivity, mergeNode); CallBehaviorAction actionB = new CallBehaviorAction(); actionB.setName("Action_B"); actionB.setBehavior(this.getCopier()); actionB .addArgument(this .makeInputPin(actionB.name + ".argument", 1, 1)); actionB.addResult(this.makeOutputPin(actionB.name + ".result", 1, 1)); this.addNode(forkMergeActivity, actionB); ActivityParameterNode outputNode = new ActivityParameterNode(); outputNode.setName("OutputNode"); outputNode.setParameter(this.addParameter(forkMergeActivity, "output", ParameterDirectionKind.out, PrimitiveTypes.Integer)); this.addNode(forkMergeActivity, outputNode); this.addEdge(forkMergeActivity, new ObjectFlow(), actionA.result, forkNode, null); this.addEdge(forkMergeActivity, new ObjectFlow(), forkNode, mergeNode, null); this.addEdge(forkMergeActivity, new ObjectFlow(), forkNode, mergeNode, null); this.addEdge(forkMergeActivity, new ObjectFlow(), mergeNode, actionB.argument.getValue(0), null); this.addEdge(forkMergeActivity, new ObjectFlow(), actionB.result .getValue(0), outputNode, null); this.environment.addElement(forkMergeActivity); } // createForkMergeData public void createExtentReader(String className) { Element element = environment.getElement(className); if (element == null) { Debug.println("[createExtentReader] " + className + " not found."); return; } if (!(element instanceof Class_)) { Debug.println("[createExtentReader] " + className + " is not a class."); return; } Class_ theClass = (Class_) element; Activity extentReaderActivity = new Activity(); extentReaderActivity.setName(className + "ExtentReader"); ReadExtentAction readExtentAction = new ReadExtentAction(); readExtentAction.setName("ReadExtent(" + theClass.name + ")"); readExtentAction.setClassifier(theClass); readExtentAction.setResult(this.makeOutputPin(readExtentAction.name + ".result", 0, -1)); this.addNode(extentReaderActivity, readExtentAction); ActivityParameterNode outputNode = new ActivityParameterNode(); outputNode.setName("OutputNode"); outputNode.setParameter(this.addParameter(extentReaderActivity, "extent", ParameterDirectionKind.out, theClass)); this.addNode(extentReaderActivity, outputNode); this.addEdge(extentReaderActivity, new ObjectFlow(), readExtentAction.result, outputNode, null); this.environment.addElement(extentReaderActivity); } // createExtentReader public void createSelfReader() { Activity selfReaderActivity = new Activity(); selfReaderActivity.setName("SelfReader"); ReadSelfAction readSelfAction = new ReadSelfAction(); readSelfAction.setName("ReadSelf"); readSelfAction.setResult(this.addOutputPin(readSelfAction, readSelfAction.name + ".result", 1, 1)); this.addNode(selfReaderActivity, readSelfAction); ActivityParameterNode outputNode = new ActivityParameterNode(); outputNode.setName("OutputNode"); outputNode.setParameter(this.addParameter(selfReaderActivity, "self", ParameterDirectionKind.out, selfReaderActivity)); this.addNode(selfReaderActivity, outputNode); this.addEdge(selfReaderActivity, new ObjectFlow(), readSelfAction.result, outputNode, null); this.environment.addElement(selfReaderActivity); } // createSelfReader // public void createIdentityTester(String nameSuffix, String variableName1, // String variableName2) { // Variable variable1 = this.environment.getVariable(variableName1); // Variable variable2 = this.environment.getVariable(variableName2); // // if (variable1 == null) { // Debug.println("[createIdentityTester] " + variableName1 // + " does not exist."); // return; // } // // if (variable2 == null) { // Debug.println("[createIdentityTester] " + variableName2 // + " does not exist."); // return; // } // // Value value1 = variable1.value; // Value value2 = variable2.value; // // Activity identityTesterActivity = new Activity(); // identityTesterActivity.setName("IdentityTester_" + nameSuffix); // // ValueSpecificationAction valueAction1 = new ValueSpecificationAction(); // valueAction1.setName("ValueAction_1"); // valueAction1.setValue(value1.specify()); // valueAction1.setResult(this.makeOutputPin( // valueAction1.name + ".result", 1, 1)); // this.addNode(identityTesterActivity, valueAction1); // // ValueSpecificationAction valueAction2 = new ValueSpecificationAction(); // valueAction2.setName("ValueAction_2"); // valueAction2.setValue(value2.specify()); // valueAction2.setResult(this.addOutputPin(valueAction2, // valueAction2.name + ".result", 1, 1)); // this.addNode(identityTesterActivity, valueAction2); // // TestIdentityAction testIdentityAction = new TestIdentityAction(); // testIdentityAction.setName("TestIdentityAction"); // testIdentityAction.setFirst(this.makeInputPin(testIdentityAction.name // + ".first", 1, 1)); // testIdentityAction.setSecond(this.makeInputPin(testIdentityAction.name // + ".second", 1, 1)); // testIdentityAction.setResult(this.makeOutputPin(testIdentityAction.name // + ".result", 1, 1)); // this.addNode(identityTesterActivity, testIdentityAction); // // ActivityParameterNode outputNode = new ActivityParameterNode(); // outputNode.setName("outputNode"); // outputNode.setParameter(this.addParameter(identityTesterActivity, // "result", ParameterDirectionKind.out, // PrimitiveTypes.Boolean)); // this.addNode(identityTesterActivity, outputNode); // // this.addEdge(identityTesterActivity, new ObjectFlow(), // valueAction1.result, testIdentityAction.first, null); // this.addEdge(identityTesterActivity, new ObjectFlow(), // valueAction2.result, testIdentityAction.second, null); // this.addEdge(identityTesterActivity, new ObjectFlow(), // testIdentityAction.result, outputNode, null); // // this.environment.addElement(identityTesterActivity); // } // createIdentityTester public void createObjectCreater(String className) { NamedElement element = this.environment.getElement(className); if (element == null || !(element instanceof Class_)) { Debug.println("[createObjectCreater] " + className + " does not exist or is not a class."); return; } Class_ type = (Class_) element; Activity objectCreatorActivity = new Activity(); objectCreatorActivity.setName(className + "ObjectCreator"); CreateObjectAction createObjectAction = new CreateObjectAction(); createObjectAction.setName("Create(" + className + ")"); createObjectAction.setClassifier(type); createObjectAction.setResult(this.makeOutputPin(createObjectAction.name + ".result", 1, 1)); this.addNode(objectCreatorActivity, createObjectAction); ActivityParameterNode outputNode = new ActivityParameterNode(); outputNode.setName("OutputNode"); outputNode.setParameter(this.addParameter(objectCreatorActivity, "result", ParameterDirectionKind.out, type)); this.addNode(objectCreatorActivity, outputNode); this.addEdge(objectCreatorActivity, new ObjectFlow(), createObjectAction.result, outputNode, null); this.environment.addElement(objectCreatorActivity); } // createObjectCreater public void createObjectDestroyer(String className, boolean isDestroyLinks, boolean isDestroyOwnedObjects) { NamedElement element = this.environment.getElement(className); if (element == null || !(element instanceof Class_)) { Debug.println("[createObjectDestroyer] " + className + " does not exist or is not a class."); return; } Class_ type = (Class_) element; Activity objectDestroyerActivity = new Activity(); objectDestroyerActivity.setName(className + "ObjectDestroyer"); ValueSpecificationAction valueAction = new ValueSpecificationAction(); valueAction.setName("ValueAction"); valueAction.setValue(this.environment.makeValue(type).specify()); valueAction.setResult(this.makeOutputPin(valueAction.name + ".result", 1, 1)); this.addNode(objectDestroyerActivity, valueAction); ForkNode forkNode = new ForkNode(); forkNode.setName("ForkNode"); this.addNode(objectDestroyerActivity, forkNode); DestroyObjectAction destroyObjectAction = new DestroyObjectAction(); destroyObjectAction.setName("Destroy(" + className + ")"); destroyObjectAction.setIsDestroyLinks(isDestroyLinks); destroyObjectAction.setIsDestroyOwnedObjects(isDestroyOwnedObjects); destroyObjectAction.setTarget(this.makeInputPin( destroyObjectAction.name + ".target", 1, 1)); this.addNode(objectDestroyerActivity, destroyObjectAction); ActivityParameterNode outputNode = new ActivityParameterNode(); outputNode.setName("OutputNode"); outputNode.setParameter(this.addParameter(objectDestroyerActivity, "object", ParameterDirectionKind.out, type)); this.addNode(objectDestroyerActivity, outputNode); this.addEdge(objectDestroyerActivity, new ObjectFlow(), valueAction.result, forkNode, null); this.addEdge(objectDestroyerActivity, new ObjectFlow(), forkNode, destroyObjectAction.target, null); this.addEdge(objectDestroyerActivity, new ObjectFlow(), forkNode, outputNode, null); this.environment.addElement(objectDestroyerActivity); } // createObjectDestroyer public void createWriterReader(String classifierName, String attributeName) { NamedElement element = this.environment.getElement(classifierName); if (element == null || !(element instanceof Classifier)) { Debug.println("[createWriterReader] " + classifierName + " does not exist or is not a classifier."); return; } Classifier classifier = (Classifier) element; StructuralFeature attribute = null; // Debug.println("[createWriterReader] classifier.member.size = " + // classifier.member.size()); for (int i = 0; i < classifier.member.size(); i++) { if (classifier.member.getValue(i).name.equals(attributeName)) { if (classifier.member.getValue(i) instanceof StructuralFeature) { attribute = (StructuralFeature) (classifier.member .getValue(i)); break; } else { Debug.println("[createWriterReader] " + classifierName + "::" + attributeName + " is not a structural feature."); return; } } } if (attribute == null) { Debug.println("[createWriterReader] " + classifierName + "::" + attributeName + " not found."); return; } // Debug.println("[createWriterReader] " + classifierName + "::" + // attributeName + " found."); Activity writerReaderActivity = new Activity(); writerReaderActivity.setName(classifierName + "_" + attributeName + "_WriterReader"); // Debug.println("[createWriterReader] Creating value specification..."); ValueSpecification valueSpecification = environment.makeValue( (Classifier) (attribute.typedElement.type)).specify(); ValueSpecificationAction valueAction = new ValueSpecificationAction(); valueAction.setName(attribute.typedElement.type.name + "Value"); valueAction.setValue(valueSpecification); valueAction.setResult(this.makeOutputPin(valueAction.name + ".result", 1, 1)); this.addNode(writerReaderActivity, valueAction); // Debug.println("[createWriterReader] Creating object action..."); CreateObjectAction createAction = new CreateObjectAction(); createAction.setName("Create(" + classifierName + ")"); createAction.setClassifier(classifier); createAction.setResult(this.makeOutputPin( createAction.name + ".result", 1, 1)); this.addNode(writerReaderActivity, createAction); // ForkNode forkNode = new ForkNode(); // forkNode.name = "ObjectFork"; // this.addNode(writerReaderActivity, forkNode); // Debug.println("[createWriterReader] Creating add structural feature action..."); AddStructuralFeatureValueAction writeAction = new AddStructuralFeatureValueAction(); writeAction.setName("Write(" + attribute.name + ")"); writeAction.setStructuralFeature(attribute); writeAction.setIsReplaceAll(true); writeAction.setObject(this.makeInputPin(writeAction.name + ".object", 1, 1)); writeAction.setValue(this.makeInputPin(writeAction.name + ".value", 1, -1)); writeAction.setResult(this.makeOutputPin(writeAction.name + ".result", 1, 1)); this.addNode(writerReaderActivity, writeAction); // Debug.println("[createWriterReader] Creating read structural feature action..."); ReadStructuralFeatureAction readAction = new ReadStructuralFeatureAction(); readAction.setName("Read(" + attribute.name + ")"); readAction.setStructuralFeature(attribute); readAction.setObject(this.makeInputPin(readAction.name + ".object", 1, 1)); readAction.setResult(this.makeOutputPin(readAction.name + ".result", 0, -1)); this.addNode(writerReaderActivity, readAction); // Debug.println("[createWriterReader] Creating output node..."); ActivityParameterNode outputNode = new ActivityParameterNode(); outputNode.setName("OutputNode"); outputNode.setParameter(this.addParameter(writerReaderActivity, attribute.name, ParameterDirectionKind.out, attribute.typedElement.type)); this.addNode(writerReaderActivity, outputNode); // Debug.println("[createWriterReader] Creating edges..."); // this.addEdge(writerReaderActivity, new ObjectFlow(), // createAction.result, forkNode, null); // this.addEdge(writerReaderActivity, new ObjectFlow(), forkNode, // writeAction.object, null); this.addEdge(writerReaderActivity, new ObjectFlow(), createAction.result, writeAction.object, null); this.addEdge(writerReaderActivity, new ObjectFlow(), valueAction.result, writeAction.value, null); this.addEdge(writerReaderActivity, new ControlFlow(), writeAction, readAction, null); // this.addEdge(writerReaderActivity, new ObjectFlow(), forkNode, // readAction.object, null); this.addEdge(writerReaderActivity, new ObjectFlow(), writeAction.result, readAction.object, null); this.addEdge(writerReaderActivity, new ObjectFlow(), readAction.result, outputNode, null); this.environment.addElement(writerReaderActivity); } // createWriterReader public void createAttributeWriter(String classifierName, String attributeName, boolean isReplaceAll) { NamedElement element = this.environment.getElement(classifierName); if (element == null || !(element instanceof Classifier)) { Debug.println("[createAttributeWriter] " + classifierName + " does not exist or is not a classifier."); return; } Classifier classifier = (Classifier) element; StructuralFeature attribute = null; for (int i = 0; i < classifier.member.size(); i++) { if (classifier.member.getValue(i).name.equals(attributeName)) { if (classifier.member.getValue(i) instanceof StructuralFeature) { attribute = (StructuralFeature) (classifier.member .getValue(i)); break; } else { Debug.println("[createAttrbuteWriter] " + classifierName + "::" + attributeName + " is not a structural feature."); return; } } } if (attribute == null) { Debug.println("[createAttributeWriter] " + classifierName + "::" + attributeName + " not found."); return; } Activity attributeWriterActivity = new Activity(); if (isReplaceAll) { attributeWriterActivity.setName(classifierName + "_" + attributeName + "_all_AttributeWriter"); } else { attributeWriterActivity.setName(classifierName + "_" + attributeName + "_AttributeWriter"); } ActivityParameterNode objectNode = new ActivityParameterNode(); objectNode.setName("Parameter(object)"); objectNode.setParameter(this.addParameter(attributeWriterActivity, "object", ParameterDirectionKind.in, classifier)); this.addNode(attributeWriterActivity, objectNode); ActivityParameterNode valueNode = new ActivityParameterNode(); valueNode.setName("Parameter(value)"); valueNode .setParameter(this.addParameter(attributeWriterActivity, "value", ParameterDirectionKind.in, attribute.typedElement.type)); this.addNode(attributeWriterActivity, valueNode); ActivityParameterNode insertAtNode = null; if (!isReplaceAll) { insertAtNode = new ActivityParameterNode(); insertAtNode.setName("Parameter(insertAt)"); insertAtNode.setParameter(this.addParameter( attributeWriterActivity, "insertAt", ParameterDirectionKind.in, PrimitiveTypes.UnlimitedNatural)); this.addNode(attributeWriterActivity, insertAtNode); } AddStructuralFeatureValueAction writeAction = new AddStructuralFeatureValueAction(); writeAction.setName("Write(" + attribute.name + ")"); writeAction.setStructuralFeature(attribute); writeAction.setIsReplaceAll(isReplaceAll); writeAction.setObject(this.makeInputPin(writeAction.name + ".object", 1, 1)); writeAction.setValue(this.makeInputPin(writeAction.name + ".value", 1, -1)); if (!isReplaceAll) { writeAction.setInsertAt(this.makeInputPin( writeAction + ".insertAt", 1, 1)); } writeAction.setResult(this.addOutputPin(writeAction, writeAction.name + ".result", 1, 1)); this.addNode(attributeWriterActivity, writeAction); ActivityParameterNode outputNode = new ActivityParameterNode(); outputNode.setName("Parameter(output)"); outputNode.setParameter(this.addParameter(attributeWriterActivity, "output", ParameterDirectionKind.out, classifier)); this.addNode(attributeWriterActivity, outputNode); this.addEdge(attributeWriterActivity, new ObjectFlow(), objectNode, writeAction.object, null); this.addEdge(attributeWriterActivity, new ObjectFlow(), valueNode, writeAction.value, null); if (!isReplaceAll) { this.addEdge(attributeWriterActivity, new ObjectFlow(), insertAtNode, writeAction.insertAt, null); } this.addEdge(attributeWriterActivity, new ObjectFlow(), writeAction.result, outputNode, null); this.environment.addElement(attributeWriterActivity); } // createAttributeWriter public void createAttributedCaller(String calledBehaviorName) { Element element = environment.getElement(calledBehaviorName); if (element == null) { Debug.println("[createAttributedCaller] " + calledBehaviorName + " not found."); return; } if (!(element instanceof Behavior)) { Debug.println("[createAttributedCaller] " + calledBehaviorName + " is not an behavior."); return; } Behavior calledBehavior = (Behavior) element; ParameterList parameters = calledBehavior.ownedParameter; Activity callerActivity = new Activity(); callerActivity.setName("Attributed" + calledBehaviorName + "Caller"); ReadSelfAction readSelfAction = new ReadSelfAction(); readSelfAction.setName("Read(self)"); readSelfAction.setResult(this.makeOutputPin(readSelfAction.name + ".result", 1, 1)); this.addNode(callerActivity, readSelfAction); ForkNode forkNode = new ForkNode(); forkNode.setName("ForkSelf"); this.addNode(callerActivity, forkNode); this.addEdge(callerActivity, new ObjectFlow(), readSelfAction.result, forkNode, null); CallBehaviorAction callAction = new CallBehaviorAction(); callAction.setName("Call(" + calledBehaviorName + ")"); callAction.setBehavior(calledBehavior); this.addNode(callerActivity, callAction); for (int i = 0; i < parameters.size(); i++) { Parameter parameter = parameters.getValue(i); if (parameter.direction.equals(ParameterDirectionKind.in) || parameter.direction.equals(ParameterDirectionKind.inout)) { ReadStructuralFeatureAction readAction = new ReadStructuralFeatureAction(); readAction.setName("Read(" + parameter.name + ")"); readAction.setStructuralFeature(this.addProperty( callerActivity, parameter.name, parameter.type, 0, -1)); readAction.setObject(this.makeInputPin(readAction.name + ".object", 1, 1)); readAction.setResult(this.makeOutputPin(readAction.name + ".result", 0, -1)); this.addNode(callerActivity, readAction); this.addEdge(callerActivity, new ObjectFlow(), forkNode, readAction.object, null); InputPin inputPin = this.makeInputPin(callAction.name + ".argument[" + parameter.name + "]", 1, 1); callAction.addArgument(inputPin); this.addEdge(callerActivity, new ObjectFlow(), readAction.result, inputPin, null); } else { ActivityParameterNode parameterNode = new ActivityParameterNode(); parameterNode.setName("Parameter(" + parameter.name + ")"); parameterNode.setParameter(this.addParameter(callerActivity, parameter.name, ParameterDirectionKind.out, parameter.type)); this.addNode(callerActivity, parameterNode); OutputPin outputPin = this.makeOutputPin(callAction.name + ".result[" + parameter.name + "]", 1, 1); callAction.addResult(outputPin); this.addEdge(callerActivity, new ObjectFlow(), outputPin, parameterNode, null); } } this.environment.addElement(callerActivity); } // createAttributedCaller public void createHelloWorld1() { Class_ standardOutputChannelClass = StandardIOClasses.StandardOutputChannel; Activity helloWorldActivity = new Activity(); helloWorldActivity.setName("HelloWorld1"); ReadExtentAction readExtentAction = new ReadExtentAction(); readExtentAction.setName("ReadExtent(StandardOutputChannel)"); readExtentAction.setClassifier(standardOutputChannelClass); readExtentAction.setResult(this.makeOutputPin(readExtentAction.name + ".result", 0, -1)); this.addNode(helloWorldActivity, readExtentAction); ValueSpecificationAction valueAction = new ValueSpecificationAction(); valueAction.setName("ValueAction(\"Hello World\")"); valueAction.setValue(this.createLiteralString("", "Hello World!")); valueAction.setResult(this.makeOutputPin(valueAction.name + ".result", 1, 1)); this.addNode(helloWorldActivity, valueAction); CallOperationAction callAction = new CallOperationAction(); callAction.setName("Call(StandardOutputChannel::writeLine)"); callAction.setTarget(this.makeInputPin(callAction.name + ".target", 1, 1)); callAction.addArgument(this.makeInputPin(callAction.name + ".argument", 1, 1)); callAction.addResult(this.makeOutputPin(callAction.name + ".result", 1, 1)); callAction.setOperation(this.getOperation(standardOutputChannelClass, "writeLine")); if (callAction.operation == null) { Debug .println("[createHelloWorld1] Operation StandardOutputChannelClass::writeLine not found."); return; } this.addNode(helloWorldActivity, callAction); this.addEdge(helloWorldActivity, new ObjectFlow(), readExtentAction.result, callAction.target, null); this.addEdge(helloWorldActivity, new ObjectFlow(), valueAction.result, callAction.argument.getValue(0), null); this.environment.addElement(helloWorldActivity); } // createHelloWorld1 public void createHelloWorld2() { Activity helloWorldActivity = new Activity(); helloWorldActivity.setName("HelloWorld2"); ValueSpecificationAction valueAction = new ValueSpecificationAction(); valueAction.setName("ValueAction(\"Hello World\")"); valueAction.setValue(this.createLiteralString("", "Hello World!")); valueAction.setResult(this.makeOutputPin(valueAction.name + ".result", 1, 1)); this.addNode(helloWorldActivity, valueAction); CallBehaviorAction callAction = new CallBehaviorAction(); callAction.setName("Call(WriteLine)"); callAction.setBehavior(this.getActivity("WriteLine")); callAction.addArgument(this.makeInputPin(callAction.name + ".argument", 1, 1)); callAction.addResult(this.makeOutputPin(callAction.name + ".result", 1, 1)); this.addNode(helloWorldActivity, callAction); if (callAction.behavior == null) { return; } this.addEdge(helloWorldActivity, new ObjectFlow(), valueAction.result, callAction.argument.getValue(0), null); this.environment.addElement(helloWorldActivity); } // createHelloWorld2 public void createChannelReader(String channelName) { Class_ inputChannelClass = StandardIOClasses.InputChannel; Operation getNameOperation = this.getOperation(inputChannelClass, "getName"); if (getNameOperation == null) { Debug .println("[createChannelReader] Operation InputChannel::getName not found."); return; } StringValue channelNameValue = new StringValue(); channelNameValue.value = channelName; Activity channelReaderActivity = new Activity(); channelReaderActivity.setName(channelName + "ChannelReader"); Parameter output = this.addParameter(channelReaderActivity, "value", ParameterDirectionKind.out, null); CallBehaviorAction channelGetterAction = new CallBehaviorAction(); channelGetterAction.setName("Call(InputChannelInstanceGetter)"); channelGetterAction.setBehavior(this.createInstanceGetter( inputChannelClass, getNameOperation, channelNameValue)); channelGetterAction.addResult(this.makeOutputPin( channelGetterAction.name + ".result", 1, 1)); this.addNode(channelReaderActivity, channelGetterAction); CallOperationAction callOperationAction = new CallOperationAction(); callOperationAction.setName("Call(read)"); callOperationAction.setOperation(this.getOperation(inputChannelClass, "read")); callOperationAction.setTarget(this.makeInputPin( callOperationAction.name + ".target", 1, 1)); callOperationAction.addResult(this.makeOutputPin( callOperationAction.name + ".result[value]", 0, 1)); this.addNode(channelReaderActivity, callOperationAction); ActivityParameterNode outputNode = new ActivityParameterNode(); outputNode.setName("OutputNode(" + output.name + ")"); outputNode.setParameter(output); outputNode.setType(output.type); this.addNode(channelReaderActivity, outputNode); this.addEdge(channelReaderActivity, new ObjectFlow(), channelGetterAction.result.getValue(0), callOperationAction.target, null); this.addEdge(channelReaderActivity, new ObjectFlow(), callOperationAction.result.getValue(0), outputNode, null); this.environment.addElement(channelReaderActivity); } // createChannelReader public void createChannelWriter(String channelName) { Class_ outputChannelClass = StandardIOClasses.OutputChannel; Operation getNameOperation = this.getOperation(outputChannelClass, "getName"); if (getNameOperation == null) { Debug .println("[createChannelWriter] Operation OutputChannel::getName not found."); return; } StringValue channelNameValue = new StringValue(); channelNameValue.value = channelName; Activity channelWriterActivity = new Activity(); channelWriterActivity.setName(channelName + "ChannelWriter"); Parameter input = this.addParameter(channelWriterActivity, "value", ParameterDirectionKind.in, PrimitiveTypes.String); ActivityParameterNode inputNode = new ActivityParameterNode(); inputNode.setName("InputNode(" + input.name + ")"); inputNode.setParameter(input); inputNode.setType(input.type); this.addNode(channelWriterActivity, inputNode); CallBehaviorAction channelGetterAction = new CallBehaviorAction(); channelGetterAction.setName("Call(OutputChannelInstanceGetter)"); channelGetterAction.setBehavior(this.createInstanceGetter( outputChannelClass, getNameOperation, channelNameValue)); channelGetterAction.addResult(this.makeOutputPin( channelGetterAction.name + ".result", 1, 1)); this.addNode(channelWriterActivity, channelGetterAction); CallOperationAction callOperationAction = new CallOperationAction(); callOperationAction.setName("Call(write)"); callOperationAction.setOperation(this.getOperation(outputChannelClass, "write")); callOperationAction.setTarget(this.makeInputPin( callOperationAction.name + ".target", 1, 1)); callOperationAction.addArgument(this.makeInputPin( callOperationAction.name + ".argument[value]", 0, 1)); this.addNode(channelWriterActivity, callOperationAction); this.addEdge(channelWriterActivity, new ObjectFlow(), inputNode, callOperationAction.argument.getValue(0), null); this.addEdge(channelWriterActivity, new ObjectFlow(), channelGetterAction.result.getValue(0), callOperationAction.target, null); this.environment.addElement(channelWriterActivity); this.createAttributedCaller(channelWriterActivity.name); } // createChannelWriter public void createWriteLine() { Class_ standardOutputChannelClass = StandardIOClasses.StandardOutputChannel; Activity writeLineActivity = new Activity(); writeLineActivity.setName("WriteLine"); ReadExtentAction readExtentAction = new ReadExtentAction(); readExtentAction.setName("ReadExtent(StandardOutputChannel)"); readExtentAction.setClassifier(standardOutputChannelClass); readExtentAction.setResult(this.makeOutputPin(readExtentAction.name + ".result", 0, -1)); this.addNode(writeLineActivity, readExtentAction); ActivityParameterNode inputNode = new ActivityParameterNode(); inputNode.setName("input(value)"); inputNode.setParameter(this.addParameter(writeLineActivity, "value", ParameterDirectionKind.in, null)); this.addNode(writeLineActivity, inputNode); CallOperationAction callAction = new CallOperationAction(); callAction.setName("Call(StandardOutputChannel::writeLine)"); callAction.setTarget(this.makeInputPin(callAction.name + ".target", 1, 1)); callAction.addArgument(this.makeInputPin(callAction.name + ".argument", 1, 1)); callAction.setOperation(this.getOperation(standardOutputChannelClass, "writeLine")); if (callAction.operation == null) { Debug .println("[createWriteLine] Operation StandardOutputChannelClass::writeLine not found."); return; } this.addNode(writeLineActivity, callAction); this.addEdge(writeLineActivity, new ObjectFlow(), readExtentAction.result, callAction.target, null); this.addEdge(writeLineActivity, new ObjectFlow(), inputNode, callAction.argument.getValue(0), null); this.environment.addElement(writeLineActivity); } // createWriteLine public void createOperationCaller(String className, String operationName) { NamedElement element = this.environment.getElement(className); if (element == null || !(element instanceof Class_)) { Debug.println("[createOperationCaller] " + className + " does not exist or is not a class."); return; } Class_ type = (Class_) element; Operation operation = this.getOperation(type, operationName); if (operation == null) { Debug.println("[createOperationCaller] " + operationName + " is not an operation of " + className + "."); return; } Activity operationCallerActivity = new Activity(); operationCallerActivity.setName(className + operationName + "Caller"); CreateObjectAction createObjectAction = new CreateObjectAction(); createObjectAction.setName("Create(" + className + ")"); createObjectAction.setClassifier(type); createObjectAction.setResult(this.makeOutputPin(createObjectAction.name + ".result", 1, 1)); this.addNode(operationCallerActivity, createObjectAction); CallOperationAction callOperationAction = new CallOperationAction(); callOperationAction.setName("Call(" + operationName + ")"); callOperationAction.setOperation(operation); callOperationAction.setTarget(this.makeInputPin( callOperationAction.name + ".target", 1, 1)); this.addNode(operationCallerActivity, callOperationAction); this.addEdge(operationCallerActivity, new ObjectFlow(), createObjectAction.result, callOperationAction.target, null); this.environment.addElement(operationCallerActivity); } // createOperationCaller public void createPolymorphicOperationCaller(String subclassName, String superclassName, String operationName) { NamedElement element = this.environment.getElement(subclassName); if (element == null || !(element instanceof Class_)) { Debug.println("[createPolymorphicOperationCaller] " + subclassName + " does not exist or is not a class."); return; } Class_ subclass = (Class_) element; element = this.environment.getElement(superclassName); if (element == null || !(element instanceof Class_)) { Debug.println("[createPolymorphicOperationCaller] " + superclassName + " does not exist or is not a class."); return; } Class_ superclass = (Class_) element; Operation operation = this.getOperation(superclass, operationName); if (operation == null) { Debug.println("[createPolymorphicOperationCaller] " + operationName + " is not an operation of " + superclassName + "."); return; } Activity operationCallerActivity = new Activity(); operationCallerActivity.setName(subclassName + superclassName + operationName + "Caller"); CreateObjectAction createObjectAction = new CreateObjectAction(); createObjectAction.setName("Create(" + subclassName + ")"); createObjectAction.setClassifier(subclass); createObjectAction.setResult(this.makeOutputPin(createObjectAction.name + ".result", 1, 1)); this.addNode(operationCallerActivity, createObjectAction); CallOperationAction callOperationAction = new CallOperationAction(); callOperationAction.setName("Call(" + operationName + ")"); callOperationAction.setOperation(operation); callOperationAction.setTarget(this.makeInputPin( callOperationAction.name + ".target", 1, 1)); this.addNode(operationCallerActivity, callOperationAction); this.addEdge(operationCallerActivity, new ObjectFlow(), createObjectAction.result, callOperationAction.target, null); this.environment.addElement(operationCallerActivity); } // createPolymorphicOperationCaller public void createSelfCaller(String className, String operationName) { NamedElement element = this.environment.getElement(className); if (element == null || !(element instanceof Class_)) { Debug.println("[createSelfCaller] " + className + " does not exist or is not a class."); return; } Class_ type = (Class_) element; Operation operation = this.getOperation(type, operationName); if (operation == null) { Debug.println("[createSelfCaller] " + operationName + " is not an operation of " + className + "."); return; } Activity selfCallerActivity = new Activity(); selfCallerActivity.setName(className + operationName + "SelfCaller"); ReadSelfAction readSelfAction = new ReadSelfAction(); readSelfAction.setName("ReadSelf"); readSelfAction.setResult(this.makeOutputPin(readSelfAction.name + ".result", 1, 1)); this.addNode(selfCallerActivity, readSelfAction); CallOperationAction callOperationAction = new CallOperationAction(); callOperationAction.setName("Call(" + operationName + ")"); callOperationAction.setOperation(operation); callOperationAction.setTarget(this.makeInputPin( callOperationAction.name + ".target", 1, 1)); this.addNode(selfCallerActivity, callOperationAction); this.addEdge(selfCallerActivity, new ObjectFlow(), readSelfAction.result, callOperationAction.target, null); this.environment.addElement(selfCallerActivity); } // createSelfCaller public void createMethodCaller(String className, String operationName) { NamedElement element = this.environment.getElement(className); if (element == null || !(element instanceof Class_)) { Debug.println("[createMethodCaller] " + className + " does not exist or is not a class."); return; } Class_ type = (Class_) element; Operation operation = this.getOperation(type, operationName); if (operation == null) { Debug.println("[createMethodCaller] " + operationName + " is not an operation of " + className + "."); return; } if (operation.method.size() == 0) { Debug.println("[createMethodCaller] " + operationName + " has no method."); return; } Behavior method = (Behavior) (operation.method.get(0)); Activity superCallerActivity = new Activity(); superCallerActivity.setName(className + operationName + "MethodCaller"); CallBehaviorAction callBehaviorAction = new CallBehaviorAction(); callBehaviorAction.setName("Call(" + method.name + ")"); callBehaviorAction.setBehavior(method); this.addNode(superCallerActivity, callBehaviorAction); this.environment.addElement(superCallerActivity); } // createMethodCaller public void createAccepter(String signalName) { NamedElement element = this.environment.getElement(signalName); if (element == null || !(element instanceof Signal)) { Debug.println("[createAccepter] " + signalName + " does not exist or is not a signal."); return; } Signal signal = (Signal) element; Activity accepterActivity = new Activity(); accepterActivity.setName(signal.name + "Accepter"); accepterActivity.setIsActive(true); Property property = this.addProperty(accepterActivity, "signal", null, 0, 1); Reception reception = new Reception(); reception.setSignal(signal); accepterActivity.addOwnedReception(reception); SignalEvent signalEvent = new SignalEvent(); signalEvent.setSignal(signal); Trigger trigger = new Trigger(); trigger.setEvent(signalEvent); AcceptEventAction acceptEventAction = new AcceptEventAction(); acceptEventAction.setName("Accept(" + signal.name + ")"); acceptEventAction.addTrigger(trigger); acceptEventAction.setIsUnmarshall(false); acceptEventAction.addResult(this.makeOutputPin(acceptEventAction.name + ".result", 1, 1)); this.addNode(accepterActivity, acceptEventAction); ReadSelfAction readSelfAction = new ReadSelfAction(); readSelfAction.setName("ReadSelf"); readSelfAction.setResult(this.makeOutputPin( readSelfAction.name + ".result", 1, 1)); this.addNode(accepterActivity, readSelfAction); AddStructuralFeatureValueAction writeAction = new AddStructuralFeatureValueAction(); writeAction.setName("Write(signal)"); writeAction.setStructuralFeature(property); writeAction.setObject(this.makeInputPin( writeAction.name + ".object", 1, 1)); writeAction.setValue(this.makeInputPin( writeAction.name + ".value", 1, 1)); writeAction.setResult(this.makeOutputPin( writeAction.name + ".result", 1, 1)); accepterActivity.addNode(writeAction); InitialNode initialNode = new InitialNode(); this.addNode(accepterActivity, initialNode); this.addEdge(accepterActivity, new ControlFlow(), initialNode, acceptEventAction, null); this.addEdge(accepterActivity, new ObjectFlow(), acceptEventAction.result.getValue(0), writeAction.value, null); this.addEdge(accepterActivity, new ObjectFlow(), readSelfAction.result, writeAction.object, null); this.environment.addElement(accepterActivity); } // createAccepter public void createSender(String signalName) { NamedElement element = this.environment.getElement(signalName); if (element == null || !(element instanceof Signal)) { Debug.println("[createSender] " + signalName + " does not exist or is not a signal."); return; } Signal signal = (Signal) element; this.createAccepter(signalName); element = this.environment.getElement(signalName + "Accepter"); if (!(element instanceof Activity)) { Debug.println("[createSender] " + signalName + "Accepter is not an activity."); return; } Activity accepterActivity = (Activity) element; Activity senderActivity = new Activity(); senderActivity.setName(signalName + "Sender"); CreateObjectAction createObjectAction = new CreateObjectAction(); createObjectAction.setName("Create(" + signalName + "Accepter)"); createObjectAction.setClassifier(accepterActivity); createObjectAction.setResult(this.makeOutputPin(createObjectAction.name + ".result", 1, 1)); this.addNode(senderActivity, createObjectAction); ForkNode forkNode = new ForkNode(); forkNode.setName("Fork(accepterActivity)"); this.addNode(senderActivity, forkNode); StartObjectBehaviorAction startAction = new StartObjectBehaviorAction(); startAction.setName("Start"); startAction.setObject(this.makeInputPin(startAction.name + ".object", 1, 1)); this.addNode(senderActivity, startAction); SendSignalAction sendAction = new SendSignalAction(); sendAction.setName("Send(" + signalName + ")"); sendAction.setSignal(signal); sendAction.setTarget(this.makeInputPin(sendAction.name + ".target", 1, 1)); this.addNode(senderActivity, sendAction); this.addEdge(senderActivity, new ObjectFlow(), createObjectAction.result, forkNode, null); this.addEdge(senderActivity, new ObjectFlow(), forkNode, startAction.object, null); this.addEdge(senderActivity, new ObjectFlow(), forkNode, sendAction.target, null); this.addEdge(senderActivity, new ControlFlow(), startAction, sendAction, null); this.environment.addElement(senderActivity); } // createSender public void createCallAccepter(String operationName) { Activity accepterActivity = new Activity(); accepterActivity.setName(operationName + "CallAccepter"); accepterActivity.setIsActive(true); Operation operation = new Operation(); operation.setName(operationName); accepterActivity.addOwnedOperation(operation); Parameter parameter = new Parameter(); parameter.setName("input"); parameter.setType(PrimitiveTypes.Integer); parameter.setLower(1); parameter.setUpper(1); parameter.setDirection(ParameterDirectionKind.in); operation.addOwnedParameter(parameter); parameter = new Parameter(); parameter.setName("output"); parameter.setType(PrimitiveTypes.Integer); parameter.setLower(1); parameter.setUpper(1); parameter.setDirection(ParameterDirectionKind.out); operation.addOwnedParameter(parameter); CallEvent callEvent = new CallEvent(); callEvent.setOperation(operation); Trigger trigger = new Trigger(); trigger.setEvent(callEvent); AcceptCallAction acceptCallAction = new AcceptCallAction(); acceptCallAction.setName("Accept(" + operationName + ")"); acceptCallAction.addTrigger(trigger); acceptCallAction.setIsUnmarshall(true); acceptCallAction.addResult(this.makeOutputPin( acceptCallAction.name + ".result", 1, 1)); acceptCallAction.setReturnInformation(this.makeOutputPin( acceptCallAction.name + ".returnInfo", 1, 1)); this.addNode(accepterActivity, acceptCallAction); ReplyAction replyAction = new ReplyAction(); replyAction.setName("Reply(" + operation.name + ")"); replyAction.setReplyToCall(trigger); replyAction.addReplyValue(this.makeInputPin( replyAction.name + ".replyValue", 1, 1)); replyAction.setReturnInformation(this.makeInputPin( replyAction.name + ".returnInfo", 1, 1)); this.addNode(accepterActivity, replyAction); InitialNode initialNode = new InitialNode(); this.addNode(accepterActivity, initialNode); this.addEdge(accepterActivity, new ControlFlow(), initialNode, acceptCallAction, null); this.addEdge(accepterActivity, new ControlFlow(), acceptCallAction, replyAction, null); this.addEdge(accepterActivity, new ObjectFlow(), acceptCallAction.result.getValue(0), replyAction.replyValue.get(0), null); this.addEdge(accepterActivity, new ObjectFlow(), acceptCallAction.returnInformation, replyAction.returnInformation, null); this.environment.addElement(accepterActivity); } public void createCallSender(String operationName, String signalName) { NamedElement element = this.environment.getElement(signalName); if (element == null || !(element instanceof Signal)) { Debug.println("[createCallSender] " + signalName + " does not exist or is not a signal."); return; } Signal signal = (Signal) element; this.createCallAccepter(operationName); element = this.environment.getElement(operationName + "CallAccepter"); if (!(element instanceof Activity)) { Debug.println("[createCallSender] " + operationName + "CallAccepter is not an activity."); return; } Activity accepterActivity = (Activity) element; if (accepterActivity.ownedOperation.size() == 0) { Debug.println("[createCallSender] " + operationName + "CallAccepter has no owned operations."); return; } Operation operation = accepterActivity.ownedOperation.get(0); Activity senderActivity = new Activity(); senderActivity.setName(operationName + "CallSender"); senderActivity.setIsActive(true); Property property = this.addProperty(senderActivity, "value", null, 0, 1); CreateObjectAction createAction = new CreateObjectAction(); createAction.setName("Create(" + accepterActivity.name + ")"); createAction.setClassifier(accepterActivity); createAction.setResult(this.makeOutputPin( createAction.name + ".result", 1, 1)); this.addNode(senderActivity, createAction); ForkNode forkNode = new ForkNode(); forkNode.setName("ForkNode"); this.addNode(senderActivity, forkNode); StartObjectBehaviorAction startAction = new StartObjectBehaviorAction(); startAction.setName("Start(" + accepterActivity.name + ")"); startAction.setObject(this.makeInputPin( startAction.name + ".object", 1, 1)); this.addNode(senderActivity, startAction); CallOperationAction callAction = new CallOperationAction(); callAction.setName("Call(" + operationName + ")"); callAction.setOperation(operation); callAction.setTarget(this.makeInputPin( callAction.name + ".target", 1, 1)); callAction.addArgument(this.makeInputPin( callAction.name + ".argument", 1, 1)); callAction.addResult(this.makeOutputPin( callAction.name + ".result", 1, 1)); this.addNode(senderActivity, callAction); ValueSpecificationAction valueAction = new ValueSpecificationAction(); valueAction.setName("Value(0)"); valueAction.setValue(this.createLiteralInteger("", 0)); valueAction.setResult(this.makeOutputPin( valueAction.name + ".result", 1, 1)); this.addNode(senderActivity, valueAction); SignalEvent signalEvent = new SignalEvent(); signalEvent.signal = signal; Trigger trigger = new Trigger(); trigger.event = signalEvent; AcceptEventAction acceptAction = new AcceptEventAction(); acceptAction.setName("Accept(" + signal.name + ")"); acceptAction.addTrigger(trigger); this.addNode(senderActivity, acceptAction); ActivityFinalNode finalNode = new ActivityFinalNode(); finalNode.setName("FinalNode"); this.addNode(senderActivity, finalNode); ReadSelfAction readSelfAction = new ReadSelfAction(); readSelfAction.setName("ReadSelf"); readSelfAction.setResult(this.makeOutputPin( readSelfAction.name + ".result", 1, 1)); this.addNode(senderActivity, readSelfAction); AddStructuralFeatureValueAction writeAction = new AddStructuralFeatureValueAction(); writeAction.setName("Write(" + property.name + ")"); writeAction.setStructuralFeature(property); writeAction.setObject(this.makeInputPin( writeAction.name + ".object", 1, 1)); writeAction.setValue(this.makeInputPin( writeAction.name + ".value", 1, 1)); this.addNode(senderActivity, writeAction); this.addEdge(senderActivity, new ControlFlow(), startAction, callAction, null); this.addEdge(senderActivity, new ControlFlow(), acceptAction, finalNode, null); this.addEdge(senderActivity, new ObjectFlow(), createAction.result, forkNode, null); this.addEdge(senderActivity, new ObjectFlow(), forkNode, startAction.object, null); this.addEdge(senderActivity, new ObjectFlow(), forkNode, callAction.target, null); this.addEdge(senderActivity, new ObjectFlow(), valueAction.result, callAction.argument.get(0), null); this.addEdge(senderActivity, new ObjectFlow(), readSelfAction.result, writeAction.object, null); this.addEdge(senderActivity, new ObjectFlow(), callAction.result.get(0), writeAction.value, null); this.environment.addElement(senderActivity); Activity driverActivity = new Activity(); driverActivity.setName("Do" + senderActivity.name); createAction = new CreateObjectAction(); createAction.setName("Create(" + senderActivity.name + ")"); createAction.setClassifier(senderActivity); createAction.setResult(this.makeOutputPin( createAction.name + ".result", 1, 1)); this.addNode(driverActivity, createAction); forkNode = new ForkNode(); forkNode.setName("ForkNode"); this.addNode(driverActivity, forkNode); startAction = new StartObjectBehaviorAction(); startAction.setName("Start(" + senderActivity.name + ")"); startAction.setObject(this.makeInputPin( startAction.name + ".object", 1, 1)); this.addNode(driverActivity, startAction); SendSignalAction sendAction = new SendSignalAction(); sendAction.signal = signal; sendAction.setTarget(this.makeInputPin( sendAction.name + ".target", 1, 1)); this.addNode(driverActivity, sendAction); this.addEdge(driverActivity, new ControlFlow(), startAction, sendAction, null); this.addEdge(driverActivity, new ObjectFlow(), createAction.result, forkNode, null); this.addEdge(driverActivity, new ObjectFlow(), forkNode, startAction.object, null); this.addEdge(driverActivity, new ObjectFlow(), forkNode, sendAction.target, null); this.environment.addElement(driverActivity); } public void createStructuredNodeTester(String activityName) { // Note that the named activity is actually modified in place. Activity activity = this.getActivity(activityName); if (activity != null) { StructuredActivityNode structuredNode = new StructuredActivityNode(); structuredNode.setName("StructuredNode"); int i = 0; while (i < activity.node.size()) { ActivityNode node = activity.node.getValue(i); if (node instanceof ActivityParameterNode) { i++; } else { activity.node.removeValue(i); node.activity = null; structuredNode.addNode(node); } } i = 0; while (i < activity.edge.size()) { ActivityEdge edge = activity.edge.getValue(i); if (edge.source instanceof ActivityParameterNode && !(edge.target instanceof ActivityParameterNode)) { Parameter parameter = ((ActivityParameterNode) edge.source).parameter; InputPin inputPin = makeInputPin(structuredNode.name + "." + parameter.name, parameter.multiplicityElement.lower, parameter.multiplicityElement.upper.naturalValue); structuredNode.addStructuredNodeInput(inputPin); ActivityNode target = edge.target; for (int j = 0; j < target.incoming.size(); j++) { if (target.incoming.getValue(j) == edge) { target.incoming.removeValue(j); break; } } ObjectFlow objectFlow = new ObjectFlow(); objectFlow.setSource(inputPin); objectFlow.setTarget(target); objectFlow.setGuard(null); structuredNode.addEdge(objectFlow); edge.setTarget(inputPin); i++; } else if (edge.target instanceof ActivityParameterNode && !(edge.source instanceof ActivityParameterNode)) { Parameter parameter = ((ActivityParameterNode) edge.target).parameter; OutputPin outputPin = makeOutputPin(structuredNode.name + "." + parameter.name, parameter.multiplicityElement.lower, parameter.multiplicityElement.upper.naturalValue); structuredNode.addStructuredNodeOutput(outputPin); ActivityNode source = edge.source; for (int j = 0; j < source.outgoing.size(); j++) { if (source.outgoing.getValue(j) == edge) { source.outgoing.removeValue(j); break; } } ObjectFlow objectFlow = new ObjectFlow(); objectFlow.setSource(source); objectFlow.setTarget(outputPin); objectFlow.setGuard(null); structuredNode.addEdge(objectFlow); edge.setSource(outputPin); i++; } else { activity.edge.remove(i); edge.activity = null; structuredNode.addEdge(edge); } } activity.setName("Structured" + activity.name); activity.addNode(structuredNode); } } // createStructuredNodeTester public void createForkMergeInput() { Activity forkMergeActivity = new Activity(); forkMergeActivity.name = "ForkMergeInput"; ActivityParameterNode inputNode = new ActivityParameterNode(); inputNode.setName("InputNode"); inputNode.setParameter(this.addParameter(forkMergeActivity, "input", ParameterDirectionKind.in, PrimitiveTypes.Integer)); this.addNode(forkMergeActivity, inputNode); ForkNode forkNode = new ForkNode(); forkNode.setName("ForkNode"); this.addNode(forkMergeActivity, forkNode); MergeNode mergeNode = new MergeNode(); mergeNode.setName("MergeNode"); this.addNode(forkMergeActivity, mergeNode); CallBehaviorAction action = new CallBehaviorAction(); action.setName("Action"); action.setBehavior(this.getCopier()); action.addArgument(this.makeInputPin(action.name + ".argument", 1, 1)); action.addResult(this.makeOutputPin(action.name + ".result", 1, 1)); this.addNode(forkMergeActivity, action); ActivityParameterNode outputNode = new ActivityParameterNode(); outputNode.setName("OutputNode"); outputNode.setParameter(this.addParameter(forkMergeActivity, "output", ParameterDirectionKind.out, PrimitiveTypes.Integer)); this.setMultiplicity(outputNode.parameter.multiplicityElement, 1, -1); this.addNode(forkMergeActivity, outputNode); this.addEdge(forkMergeActivity, new ObjectFlow(), inputNode, forkNode, null); this.addEdge(forkMergeActivity, new ObjectFlow(), forkNode, mergeNode, null); this.addEdge(forkMergeActivity, new ObjectFlow(), forkNode, mergeNode, null); this.addEdge(forkMergeActivity, new ObjectFlow(), mergeNode, action.argument.getValue(0), null); this.addEdge(forkMergeActivity, new ObjectFlow(), action.result .getValue(0), outputNode, null); this.environment.addElement(forkMergeActivity); } // createForkMergeInput public void createConditionalNodeTester(int value) { Activity copierActivity = this.getCopier(); if (copierActivity == null) { return; } Activity conditionalNodeActivity = new Activity(); conditionalNodeActivity.setName("ConditionalNodeTester_" + value); ValueSpecificationAction valueAction = new ValueSpecificationAction(); valueAction.setName("Value(" + value + ")"); valueAction.setValue(this.createLiteralInteger("", value)); valueAction.setResult(this.makeOutputPin(valueAction.name + ".result", 1, 1)); conditionalNodeActivity.addNode(valueAction); ForkNode forkNode = new ForkNode(); forkNode.setName("ForkNode"); conditionalNodeActivity.addNode(forkNode); this.addEdge(conditionalNodeActivity, new ObjectFlow(), valueAction.result, forkNode, null); ConditionalNode conditionalNode = new ConditionalNode(); conditionalNode.setName("ConditionalNode"); conditionalNode.addResult(this.makeOutputPin(conditionalNode.name + ".result", 1, 1)); conditionalNodeActivity.addNode(conditionalNode); Clause clause; TestIdentityAction testIdentityAction; ObjectFlow flow; ForkNode otherForkNode; CallBehaviorAction callAction; for (int i = 0; i <= 2; i++) { clause = new Clause(); callAction = new CallBehaviorAction(); callAction.setName("CallAction_" + i); callAction.setBehavior(copierActivity); callAction.addArgument(this.makeInputPin(callAction.name + ".argument", 1, 1)); callAction.addResult(this.makeOutputPin( callAction.name + ".result", 1, 1)); conditionalNode.addNode(callAction); clause.addBody(callAction); clause.addBodyOutput(callAction.result.getValue(0)); valueAction = new ValueSpecificationAction(); if (i < 2) { otherForkNode = new ForkNode(); otherForkNode.setName("ForkNode_" + i); conditionalNode.addNode(otherForkNode); this.addEdge(conditionalNodeActivity, new ObjectFlow(), forkNode, otherForkNode, null); valueAction.setName("TestValue(" + i + ")"); valueAction.setValue(this.createLiteralInteger("", i)); valueAction.setResult(this.makeOutputPin(valueAction.name + ".result", 1, 1)); conditionalNode.addNode(valueAction); clause.addTest(valueAction); testIdentityAction = new TestIdentityAction(); testIdentityAction.setName("Test(value=" + i + ")"); testIdentityAction.setFirst(this.makeInputPin( testIdentityAction.name + ".first", 1, 1)); testIdentityAction.setSecond(this.makeInputPin( testIdentityAction.name + ".second", 1, 1)); testIdentityAction.setResult(this.makeOutputPin( testIdentityAction.name + ".result", 1, 1)); conditionalNode.addNode(testIdentityAction); clause.addTest(testIdentityAction); clause.setDecider(testIdentityAction.result); flow = new ObjectFlow(); flow.setSource(otherForkNode); flow.setTarget(testIdentityAction.first); conditionalNode.addEdge(flow); flow = new ObjectFlow(); flow.setSource(valueAction.result); flow.setTarget(testIdentityAction.second); conditionalNode.addEdge(flow); flow = new ObjectFlow(); flow.setSource(otherForkNode); flow.setTarget(callAction.argument.getValue(0)); conditionalNode.addEdge(flow); } else { for (int j = 0; j < conditionalNode.clause.size(); j++) { clause.addPredecessorClause(conditionalNode.clause .getValue(j)); } valueAction.setName("Value(true)"); valueAction.setValue(this.createLiteralBoolean("", true)); valueAction.setResult(this.makeOutputPin(valueAction.name + ".result", 1, 1)); conditionalNode.addNode(valueAction); clause.addTest(valueAction); clause.setDecider(valueAction.result); this.addEdge(conditionalNodeActivity, new ObjectFlow(), forkNode, callAction.argument.getValue(0), null); } conditionalNode.addClause(clause); } ActivityParameterNode outputNode = new ActivityParameterNode(); outputNode.setName("OutputNode"); outputNode.setParameter(this.addParameter(conditionalNodeActivity, "output", ParameterDirectionKind.out, PrimitiveTypes.Integer)); conditionalNodeActivity.addNode(outputNode); this.addEdge(conditionalNodeActivity, new ObjectFlow(), conditionalNode.result.getValue(0), outputNode, null); this.environment.addElement(conditionalNodeActivity); } // createConditionalNodeTester public void createLoopNodeTester(int value) { Activity loopNodeActivity = new Activity(); loopNodeActivity.setName("LoopNodeTester_" + value); ValueSpecificationAction valueAction = new ValueSpecificationAction(); valueAction.setName("InitValue(" + value + ")"); valueAction.setValue(this.createLiteralInteger("", value)); valueAction.setResult(this.makeOutputPin(valueAction.name + ".result", 1, 1)); loopNodeActivity.addNode(valueAction); ValueSpecificationAction valueAction1 = new ValueSpecificationAction(); valueAction1.setName("InitValue(1)"); valueAction1.setValue(this.createLiteralInteger("", 1)); valueAction1.setResult(this.makeOutputPin( valueAction1.name + ".result", 1, 1)); loopNodeActivity.addNode(valueAction1); LoopNode loopNode = new LoopNode(); loopNode.setName("LoopNode"); loopNode.addLoopVariableInput(this.makeInputPin(loopNode.name + ".loopVariableInput(i)", 1, 1)); loopNode.addLoopVariableInput(this.makeInputPin(loopNode.name + ".loopVariableInput(n)", 1, 1)); loopNode.addLoopVariable(this.makeOutputPin(loopNode.name + ".loopVariable(i)", 1, 1)); loopNode.addLoopVariable(this.makeOutputPin(loopNode.name + ".loopVariable(n)", 1, 1)); loopNode.addResult(this.makeOutputPin(loopNode.name + ".result(i)", 1, 1)); loopNode.addResult(this.makeOutputPin(loopNode.name + ".result(n)", 1, 1)); loopNode.setIsTestedFirst(true); loopNodeActivity.addNode(loopNode); ActivityParameterNode outputNode0 = new ActivityParameterNode(); outputNode0.setName("Output(i)"); outputNode0.setParameter(this.addParameter(loopNodeActivity, "i", ParameterDirectionKind.out, PrimitiveTypes.Integer)); loopNodeActivity.addNode(outputNode0); ActivityParameterNode outputNode1 = new ActivityParameterNode(); outputNode1.setName("Output(n)"); outputNode1.setParameter(this.addParameter(loopNodeActivity, "n", ParameterDirectionKind.out, PrimitiveTypes.Integer)); loopNodeActivity.addNode(outputNode1); this.addEdge(loopNodeActivity, new ObjectFlow(), valueAction.result, loopNode.loopVariableInput.getValue(0), null); this.addEdge(loopNodeActivity, new ObjectFlow(), valueAction1.result, loopNode.loopVariableInput.getValue(1), null); this.addEdge(loopNodeActivity, new ObjectFlow(), loopNode.result .getValue(0), outputNode0, null); this.addEdge(loopNodeActivity, new ObjectFlow(), loopNode.result .getValue(1), outputNode1, null); ForkNode forkNode = new ForkNode(); forkNode.setName("ForkNode"); loopNode.addNode(forkNode); ValueSpecificationAction valueAction0 = new ValueSpecificationAction(); valueAction0.setName("Value(0)"); valueAction0.setValue(this.createLiteralInteger("", 0)); valueAction0.setResult(this.makeOutputPin( valueAction0.name + ".result", 1, 1)); loopNode.addNode(valueAction0); loopNode.addTest(valueAction0); CallBehaviorAction greaterCall = new CallBehaviorAction(); greaterCall.setName("Call(Greater)"); greaterCall .setBehavior(IntegerFunctions.integerGreater); greaterCall.addArgument(this.makeInputPin(greaterCall.name + ".argument(first)", 1, 1)); greaterCall.addArgument(this.makeInputPin(greaterCall.name + ".argument(second)", 1, 1)); greaterCall.addResult(this.makeOutputPin(greaterCall.name + ".result", 1, 1)); loopNode.addNode(greaterCall); loopNode.addTest(greaterCall); loopNode.setDecider(greaterCall.result.getValue(0)); ObjectFlow flow = new ObjectFlow(); flow.setSource(loopNode.loopVariable.getValue(0)); flow.setTarget(forkNode); loopNode.addEdge(flow); flow = new ObjectFlow(); flow.setSource(forkNode); flow.setTarget(greaterCall.argument.getValue(0)); loopNode.addEdge(flow); flow = new ObjectFlow(); flow.setSource(valueAction0.result); flow.setTarget(greaterCall.argument.getValue(1)); loopNode.addEdge(flow); valueAction1 = new ValueSpecificationAction(); valueAction1.setName("Value(1)"); valueAction1.setValue(this.createLiteralInteger("", 1)); valueAction1.setResult(this.makeOutputPin( valueAction1.name + ".result", 1, 1)); loopNode.addNode(valueAction1); loopNode.addBodyPart(valueAction1); CallBehaviorAction minusCall = new CallBehaviorAction(); minusCall.setName("Call(Minus)"); minusCall.setBehavior(IntegerFunctions.integerMinus); minusCall.addArgument(this.makeInputPin(minusCall.name + ".argument(first)", 1, 1)); minusCall.addArgument(this.makeInputPin(minusCall.name + ".argument(second)", 1, 1)); minusCall.addResult(this .makeOutputPin(minusCall.name + ".result", 1, 1)); loopNode.addNode(minusCall); loopNode.addBodyPart(minusCall); loopNode.addBodyOutput(minusCall.result.getValue(0)); CallBehaviorAction timesCall = new CallBehaviorAction(); timesCall.setName("Call(Times)"); timesCall.setBehavior(IntegerFunctions.integerTimes); timesCall.addArgument(this.makeInputPin(timesCall.name + ".argument(first)", 1, 1)); timesCall.addArgument(this.makeInputPin(timesCall.name + ".argument(second)", 1, 1)); timesCall.addResult(this .makeOutputPin(timesCall.name + ".result", 1, 1)); loopNode.addNode(timesCall); loopNode.addBodyPart(timesCall); loopNode.addBodyOutput(timesCall.result.getValue(0)); flow = new ObjectFlow(); flow.setSource(forkNode); flow.setTarget(minusCall.argument.getValue(0)); loopNode.addEdge(flow); flow = new ObjectFlow(); flow.setSource(valueAction1.result); flow.setTarget(minusCall.argument.getValue(1)); loopNode.addEdge(flow); flow = new ObjectFlow(); flow.setSource(loopNode.loopVariable.getValue(1)); flow.setTarget(timesCall.argument.getValue(0)); loopNode.addEdge(flow); flow = new ObjectFlow(); flow.setSource(forkNode); flow.setTarget(timesCall.argument.getValue(1)); loopNode.addEdge(flow); this.environment.addElement(loopNodeActivity); } // createLoopNodeTester public void createExpansionRegionTester(int n) { Activity expansionRegionActivity = new Activity(); expansionRegionActivity.setName("ExpansionRegionTester_" + n); ValueSpecificationAction[] valueAction = new ValueSpecificationAction[n]; ActivityNode node = new InitialNode(); node.setName("InitialNode"); expansionRegionActivity.addNode(node); for (int i = 0; i < n; i++) { valueAction[i] = new ValueSpecificationAction(); valueAction[i].setName("Value(" + (i + 1) + ")"); valueAction[i].setValue(this.createLiteralInteger("", i + 1)); valueAction[i].setResult(this.makeOutputPin(valueAction[i].name + ".result", 1, 1)); expansionRegionActivity.addNode(valueAction[i]); this.addEdge(expansionRegionActivity, new ControlFlow(), node, valueAction[i], null); node = valueAction[i]; } ExpansionRegion expansionRegion = new ExpansionRegion(); expansionRegion.setName("ExpansionRegion"); expansionRegion.mode = ExpansionKind.iterative; expansionRegionActivity.addNode(expansionRegion); this.addEdge(expansionRegionActivity, new ControlFlow(), node, expansionRegion, null); ExpansionNode expansionNode = new ExpansionNode(); expansionNode.setName(expansionRegion.name + ".input(list)"); expansionRegion.addInputElement(expansionNode); expansionRegionActivity.addNode(expansionNode); expansionNode = new ExpansionNode(); expansionNode.setName(expansionRegion.name + ".output(list)"); expansionRegion.addOutputElement(expansionNode); expansionRegionActivity.addNode(expansionNode); expansionNode = new ExpansionNode(); expansionNode.setName(expansionRegion.name + ".output(list*10)"); expansionRegion.addOutputElement(expansionNode); expansionRegionActivity.addNode(expansionNode); ActivityParameterNode outputNode0 = new ActivityParameterNode(); outputNode0.setName("Output(list)"); outputNode0.setParameter(this.addParameter(expansionRegionActivity, "list", ParameterDirectionKind.out, PrimitiveTypes.Integer)); expansionRegionActivity.addNode(outputNode0); ActivityParameterNode outputNode1 = new ActivityParameterNode(); outputNode1.setName("Output(list*10)"); outputNode1.setParameter(this.addParameter(expansionRegionActivity, "list*10", ParameterDirectionKind.out, PrimitiveTypes.Integer)); expansionRegionActivity.addNode(outputNode1); for (int i = 0; i < n; i++) { this.addEdge(expansionRegionActivity, new ObjectFlow(), valueAction[i].result, expansionRegion.inputElement .getValue(0), null); } this.addEdge(expansionRegionActivity, new ObjectFlow(), expansionRegion.outputElement.getValue(0), outputNode0, null); this.addEdge(expansionRegionActivity, new ObjectFlow(), expansionRegion.outputElement.getValue(1), outputNode1, null); ForkNode forkNode = new ForkNode(); forkNode.setName("ForkNode"); expansionRegion.addNode(forkNode); ValueSpecificationAction valueAction10 = new ValueSpecificationAction(); valueAction10.setName("Value(10)"); valueAction10.setValue(this.createLiteralInteger("", 10)); valueAction10.setResult(this.makeOutputPin(valueAction10.name + ".result", 1, 1)); expansionRegion.addNode(valueAction10); CallBehaviorAction timesCall = new CallBehaviorAction(); timesCall.setName("Call(Times)"); timesCall.setBehavior(IntegerFunctions.integerTimes); timesCall.addArgument(this .makeInputPin(timesCall.name + ".first", 1, 1)); timesCall.addArgument(this.makeInputPin(timesCall.name + ".second", 1, 1)); timesCall.addResult(this .makeOutputPin(timesCall.name + ".result", 1, 1)); expansionRegion.addNode(timesCall); ObjectFlow flow = new ObjectFlow(); flow.setSource(expansionRegion.inputElement.getValue(0)); flow.setTarget(forkNode); expansionRegion.addEdge(flow); flow = new ObjectFlow(); flow.setSource(forkNode); flow.setTarget(expansionRegion.outputElement.getValue(0)); expansionRegion.addEdge(flow); flow = new ObjectFlow(); flow.setSource(forkNode); flow.setTarget(timesCall.argument.getValue(0)); expansionRegion.addEdge(flow); flow = new ObjectFlow(); flow.setSource(valueAction10.result); flow.setTarget(timesCall.argument.getValue(1)); expansionRegion.addEdge(flow); flow = new ObjectFlow(); flow.setSource(timesCall.result.getValue(0)); flow.setTarget(expansionRegion.outputElement.getValue(1)); expansionRegion.addEdge(flow); this.environment.addElement(expansionRegionActivity); } // createExpansionRegionTester public void createLinkCreator(String associationName) { NamedElement element = this.environment.getElement(associationName); if (element == null || !(element instanceof Association)) { Debug.println("[createLinkCreator] " + associationName + " does not exist or is not an association."); return; } Association association = (Association) element; Property endA = association.memberEnd.getValue(0); Property endB = association.memberEnd.getValue(1); Class_ classA = (Class_) (endA.typedElement.type); Class_ classB = (Class_) (endB.typedElement.type); Activity linkCreatorActivity = new Activity(); linkCreatorActivity.setName(associationName + "LinkCreator"); InitialNode initialNode = new InitialNode(); initialNode.setName("Init"); this.addNode(linkCreatorActivity, initialNode); CreateObjectAction createActionA = new CreateObjectAction(); createActionA.setName("Create A"); createActionA.classifier = classA; createActionA.result = this.addOutputPin(createActionA, createActionA.name + ".a", 1, 1); this.addNode(linkCreatorActivity, createActionA); CreateObjectAction createActionB1 = new CreateObjectAction(); createActionB1.setName("Create B1"); createActionB1.classifier = classB; createActionB1.result = this.addOutputPin(createActionB1, createActionB1.name + ".b", 1, 1); this.addNode(linkCreatorActivity, createActionB1); CreateObjectAction createActionB2 = new CreateObjectAction(); createActionB2.setName("Create B2"); createActionB2.classifier = classB; createActionB2.result = this.addOutputPin(createActionB2, createActionB2.name + ".b", 1, 1); this.addNode(linkCreatorActivity, createActionB2); ForkNode forkNodeA = new ForkNode(); forkNodeA.setName("ForkA"); this.addNode(linkCreatorActivity, forkNodeA); ForkNode forkNodeB = new ForkNode(); forkNodeB.setName("ForkB"); this.addNode(linkCreatorActivity, forkNodeB); ActivityParameterNode outputNodeA = new ActivityParameterNode(); outputNodeA.setName("Parameter(outputA)"); outputNodeA.parameter = this.addParameter(linkCreatorActivity, "outputA", ParameterDirectionKind.out, classA); this.addNode(linkCreatorActivity, outputNodeA); ActivityParameterNode outputNodeB = new ActivityParameterNode(); outputNodeB.setName("Parameter(outputB)"); outputNodeB.parameter = this.addParameter(linkCreatorActivity, "outputB", ParameterDirectionKind.out, classB); this.addNode(linkCreatorActivity, outputNodeB); CreateLinkAction linkAction1 = new CreateLinkAction(); linkAction1.setName("Create Link 1"); this.addNode(linkCreatorActivity, linkAction1); LinkEndCreationData endData1a = new LinkEndCreationData(); endData1a.setIsReplaceAll(false); endData1a.setEnd(endA); endData1a.value = this.addInputPin(linkAction1, linkAction1.name + ".a", 1, 1); LinkEndCreationData endData1b = new LinkEndCreationData(); endData1b.setIsReplaceAll(false); endData1b.setEnd(endB); endData1b.value = this.addInputPin(linkAction1, linkAction1.name + ".b", 1, 1); linkAction1.addEndData(endData1a); linkAction1.addEndData(endData1b); CreateLinkAction linkAction2 = new CreateLinkAction(); linkAction2.setName("Create Link 2"); this.addNode(linkCreatorActivity, linkAction2); LinkEndCreationData endData2a = new LinkEndCreationData(); endData2a.setIsReplaceAll(false); endData2a.setEnd(endA); endData2a.value = this.addInputPin(linkAction2, linkAction2.name + ".a", 1, 1); LinkEndCreationData endData2b = new LinkEndCreationData(); endData2b.setIsReplaceAll(false); endData2b.setEnd(endB); endData2b.value = this.addInputPin(linkAction2, linkAction2.name + ".b", 1, 1); linkAction2.addEndData(endData2a); linkAction2.addEndData(endData2b); this.addEdge(linkCreatorActivity, new ControlFlow(), initialNode, createActionA, null); this.addEdge(linkCreatorActivity, new ObjectFlow(), createActionA.result, forkNodeA, null); this.addEdge(linkCreatorActivity, new ObjectFlow(), forkNodeA, outputNodeA, null); this.addEdge(linkCreatorActivity, new ObjectFlow(), forkNodeA, endData1a.value, null); this.addEdge(linkCreatorActivity, new ObjectFlow(), forkNodeA, endData2a.value, null); this.addEdge(linkCreatorActivity, new ObjectFlow(), createActionB1.result, forkNodeB, null); this.addEdge(linkCreatorActivity, new ObjectFlow(), forkNodeB, outputNodeB, null); this.addEdge(linkCreatorActivity, new ObjectFlow(), forkNodeB, endData1b.value, null); this.addEdge(linkCreatorActivity, new ObjectFlow(), createActionB2.result, endData2b.value, null); if (endB.multiplicityElement.isOrdered) { ValueSpecificationAction valueAction = new ValueSpecificationAction(); valueAction.setName("Value(1)"); valueAction.setValue(this.createLiteralUnlimitedNatural("", 1)); valueAction.setResult(this.makeOutputPin(valueAction.name + ".result", 1, 1)); linkCreatorActivity.addNode(valueAction); ForkNode forkNode1 = new ForkNode(); forkNode1.setName("Fork(1)"); linkCreatorActivity.addNode(forkNode1); InputPin insertAt1 = this.makeInputPin(linkAction1.name + ".insertAt", 1, 1); linkAction1.addInputValue(insertAt1); endData1b.setInsertAt(insertAt1); InputPin insertAt2 = this.makeInputPin(linkAction2.name + ".insertAt", 1, 1); linkAction2.addInputValue(insertAt2); endData2b.setInsertAt(insertAt2); this.addEdge(linkCreatorActivity, new ObjectFlow(), valueAction.result, forkNode1, null); this.addEdge(linkCreatorActivity, new ObjectFlow(), forkNode1, insertAt1, null); this.addEdge(linkCreatorActivity, new ObjectFlow(), forkNode1, insertAt2, null); } this.environment.addElement(linkCreatorActivity); } // createLinkCreator public void createLinkDestroyer(String associationName) { NamedElement element = this.environment.getElement(associationName); if (element == null || !(element instanceof Association)) { Debug.println("[createLinkDestroyer] " + associationName + " not found or is not an asssociation."); return; } Association association = (Association) element; Property endA = association.memberEnd.getValue(0); Property endB = association.memberEnd.getValue(1); Activity linkDestroyerActivity = new Activity(); linkDestroyerActivity.setName(associationName + "LinkDestroyer"); String linkCreatorName = associationName + "LinkCreator"; NamedElement linkCreatorActivity = this.environment .getElement(linkCreatorName); if ((linkCreatorActivity == null) || !(linkCreatorActivity instanceof Activity)) { if (linkCreatorActivity == null) { Debug.println("[createLinkDestroyer] Creating a " + linkCreatorName + " activity."); } else { Debug.println("[createLinkDestroyer] Replacing the existing " + linkCreatorName + " element with an activity."); this.environment.removeElement(linkCreatorActivity); } this.createLinkCreator(associationName); linkCreatorActivity = this.environment.getElement(linkCreatorName); if (linkCreatorActivity == null) { return; } } CallBehaviorAction callAction = new CallBehaviorAction(); callAction.setName("Call(" + linkCreatorName + ")"); callAction.setBehavior((Activity) linkCreatorActivity); callAction.addResult(this.makeOutputPin(callAction.name + ".result(a)", 1, 1)); callAction.addResult(this.makeOutputPin(callAction.name + ".result(b)", 1, 1)); linkDestroyerActivity.addNode(callAction); ForkNode forkNodeA = new ForkNode(); forkNodeA.setName("ForkA"); linkDestroyerActivity.addNode(forkNodeA); ForkNode forkNodeB = new ForkNode(); forkNodeA.setName("ForkB"); linkDestroyerActivity.addNode(forkNodeB); DestroyLinkAction destroyLinkAction = new DestroyLinkAction(); destroyLinkAction.setName("DestroyLink(" + associationName + ")"); destroyLinkAction.addInputValue(this.makeInputPin( destroyLinkAction.name + ".a", 1, 1)); destroyLinkAction.addInputValue(this.makeInputPin( destroyLinkAction.name + ".b", 1, 1)); linkDestroyerActivity.addNode(destroyLinkAction); LinkEndData endDataA = new LinkEndDestructionData(); endDataA.setEnd(endA); endDataA.setValue(destroyLinkAction.inputValue.getValue(0)); destroyLinkAction.addEndData(endDataA); LinkEndData endDataB = new LinkEndDestructionData(); endDataB.setEnd(endB); endDataB.setValue(destroyLinkAction.inputValue.getValue(1)); destroyLinkAction.addEndData(endDataB); ActivityParameterNode outputNodeA = new ActivityParameterNode(); outputNodeA.setName("Parameter(outputA)"); outputNodeA.setParameter(this.addParameter(linkDestroyerActivity, "outputA", ParameterDirectionKind.out, endA.typedElement.type)); linkDestroyerActivity.addNode(outputNodeA); ActivityParameterNode outputNodeB = new ActivityParameterNode(); outputNodeB.setName("Parameter(outputB)"); outputNodeB.setParameter(this.addParameter(linkDestroyerActivity, "outputB", ParameterDirectionKind.out, endB.typedElement.type)); linkDestroyerActivity.addNode(outputNodeB); this.addEdge(linkDestroyerActivity, new ObjectFlow(), callAction.result .getValue(0), forkNodeA, null); this.addEdge(linkDestroyerActivity, new ObjectFlow(), callAction.result .getValue(1), forkNodeB, null); this.addEdge(linkDestroyerActivity, new ObjectFlow(), forkNodeA, endDataA.value, null); this.addEdge(linkDestroyerActivity, new ObjectFlow(), forkNodeB, endDataB.value, null); this.addEdge(linkDestroyerActivity, new ObjectFlow(), forkNodeA, outputNodeA, null); this.addEdge(linkDestroyerActivity, new ObjectFlow(), forkNodeB, outputNodeB, null); this.environment.addElement(linkDestroyerActivity); } // createLinkDestroyer public void createLinkReader(String associationName) { NamedElement element = this.environment.getElement(associationName); if (element == null || !(element instanceof Association)) { Debug.println("[createLinkReader] " + associationName + " not found or is not an asssociation."); return; } Association association = (Association) element; Property endA = association.memberEnd.getValue(0); Property endB = association.memberEnd.getValue(1); Activity linkReaderActivity = new Activity(); linkReaderActivity.setName(associationName + "LinkReader"); String linkCreatorName = associationName + "LinkCreator"; NamedElement linkCreatorActivity = this.environment .getElement(linkCreatorName); if ((linkCreatorActivity == null) || !(linkCreatorActivity instanceof Activity)) { if (linkCreatorActivity == null) { Debug.println("[createLinkReader] Creating a " + linkCreatorName + " activity."); } else { Debug.println("[createLinkReader] Replacing the existing " + linkCreatorName + " element with an activity."); this.environment.removeElement(linkCreatorActivity); } this.createLinkCreator(associationName); linkCreatorActivity = this.environment.getElement(linkCreatorName); if (linkCreatorActivity == null) { return; } } CallBehaviorAction callAction = new CallBehaviorAction(); callAction.setName("Call(" + linkCreatorName + ")"); callAction.setBehavior((Activity) linkCreatorActivity); callAction.addResult(this.makeOutputPin(callAction.name + ".result(a)", 1, 1)); callAction.addResult(this.makeOutputPin(callAction.name + ".result(b)", 1, 1)); linkReaderActivity.addNode(callAction); ForkNode fork = new ForkNode(); fork.setName("ForkNode"); linkReaderActivity.addNode(fork); ReadLinkAction readLinkAction = new ReadLinkAction(); readLinkAction.setName("ReadLink(" + associationName + "::" + endB.name + ")"); readLinkAction.addInputValue(this.makeInputPin(readLinkAction.name + ".input", 1, 1)); readLinkAction.setResult(this.makeOutputPin(readLinkAction.name + ".result", 0, -1)); linkReaderActivity.addNode(readLinkAction); LinkEndData linkEndData = new LinkEndData(); linkEndData.setEnd(endA); linkEndData.setValue(readLinkAction.inputValue.getValue(0)); readLinkAction.addEndData(linkEndData); linkEndData = new LinkEndData(); linkEndData.setEnd(endB); readLinkAction.addEndData(linkEndData); ReadStructuralFeatureAction readFeatureAction = new ReadStructuralFeatureAction(); readFeatureAction.setName("ReadFeature(" + endB.name + ")"); readFeatureAction.setStructuralFeature(endB); readFeatureAction.setObject(this.makeInputPin(readFeatureAction.name + ".object", 1, 1)); readFeatureAction.setResult(this.makeOutputPin(readFeatureAction.name + ".result", 0, -1)); linkReaderActivity.addNode(readFeatureAction); ActivityParameterNode linkOutput = new ActivityParameterNode(); linkOutput.setName("LinkOutput"); linkOutput.setParameter(this.addParameter(linkReaderActivity, "linkOutput", ParameterDirectionKind.out, endB.typedElement.type)); linkReaderActivity.addNode(linkOutput); ActivityParameterNode featureOutput = new ActivityParameterNode(); featureOutput.setName("FeatureOutput"); featureOutput.setParameter(this.addParameter(linkReaderActivity, "featureOutput", ParameterDirectionKind.out, endB.typedElement.type)); linkReaderActivity.addNode(featureOutput); this.addEdge(linkReaderActivity, new ObjectFlow(), callAction.result .getValue(0), fork, null); this.addEdge(linkReaderActivity, new ObjectFlow(), fork, readLinkAction.inputValue.getValue(0), null); this.addEdge(linkReaderActivity, new ObjectFlow(), readLinkAction.result, linkOutput, null); this.addEdge(linkReaderActivity, new ObjectFlow(), fork, readFeatureAction.object, null); this.addEdge(linkReaderActivity, new ObjectFlow(), readFeatureAction.result, featureOutput, null); this.environment.addElement(linkReaderActivity); } // createLinkReader public void createLinkWriter(String associationName) { NamedElement element = this.environment.getElement(associationName); if (element == null || !(element instanceof Association)) { Debug.println("[createLinkWriter] " + associationName + " does not exist or is not an association."); return; } Association association = (Association) element; Property endA = association.memberEnd.getValue(0); Property endB = association.memberEnd.getValue(1); Class_ classA = (Class_) (endA.typedElement.type); Class_ classB = (Class_) (endB.typedElement.type); Activity linkWriterActivity = new Activity(); linkWriterActivity.setName(associationName + "LinkWriter"); InitialNode initialNode = new InitialNode(); initialNode.setName("Init"); linkWriterActivity.addNode(initialNode); CreateObjectAction createActionA = new CreateObjectAction(); createActionA.setName("Create A"); createActionA.setClassifier(classA); createActionA.setResult(this.makeOutputPin(createActionA.name + ".a", 1, 1)); linkWriterActivity.addNode(createActionA); CreateObjectAction createActionB1 = new CreateObjectAction(); createActionB1.setName("Create B1"); createActionB1.setClassifier(classB); createActionB1.setResult(this.makeOutputPin(createActionB1.name + ".b", 1, 1)); linkWriterActivity.addNode(createActionB1); CreateObjectAction createActionB2 = new CreateObjectAction(); createActionB2.setName("Create B2"); createActionB2.setClassifier(classB); createActionB2.setResult(this.makeOutputPin(createActionB2.name + ".b", 1, 1)); linkWriterActivity.addNode(createActionB2); ForkNode forkNodeA = new ForkNode(); forkNodeA.setName("ForkA"); linkWriterActivity.addNode(forkNodeA); ForkNode forkNodeB = new ForkNode(); forkNodeB.setName("ForkB"); linkWriterActivity.addNode(forkNodeB); ActivityParameterNode outputNodeA = new ActivityParameterNode(); outputNodeA.setName("Parameter(outputA)"); outputNodeA.setParameter(this.addParameter(linkWriterActivity, "outputA", ParameterDirectionKind.out, classA)); linkWriterActivity.addNode(outputNodeA); ActivityParameterNode outputNodeB = new ActivityParameterNode(); outputNodeB.setName("Parameter(outputB)"); outputNodeB.setParameter(this.addParameter(linkWriterActivity, "outputB", ParameterDirectionKind.out, classB)); linkWriterActivity.addNode(outputNodeB); AddStructuralFeatureValueAction writeAction1 = new AddStructuralFeatureValueAction(); writeAction1.setName("Write 1"); writeAction1.setStructuralFeature(endB); writeAction1.setObject(this.makeInputPin(writeAction1.name + ".object", 1, 1)); writeAction1.setValue(this.makeInputPin(writeAction1.name + ".value", 1, 1)); writeAction1.setResult(this.makeOutputPin( writeAction1.name + ".result", 1, 1)); linkWriterActivity.addNode(writeAction1); AddStructuralFeatureValueAction writeAction2 = new AddStructuralFeatureValueAction(); writeAction2.setName("Write 2"); writeAction2.setStructuralFeature(endB); writeAction2.setObject(this.makeInputPin(writeAction2.name + ".object", 1, 1)); writeAction2.setValue(this.makeInputPin(writeAction2.name + ".value", 1, 1)); linkWriterActivity.addNode(writeAction2); this.addEdge(linkWriterActivity, new ObjectFlow(), createActionA.result, forkNodeA, null); this.addEdge(linkWriterActivity, new ObjectFlow(), createActionB1.result, forkNodeB, null); this.addEdge(linkWriterActivity, new ObjectFlow(), createActionB2.result, writeAction2.value, null); this.addEdge(linkWriterActivity, new ObjectFlow(), forkNodeA, outputNodeA, null); this.addEdge(linkWriterActivity, new ObjectFlow(), forkNodeA, writeAction1.object, null); this.addEdge(linkWriterActivity, new ObjectFlow(), forkNodeA, writeAction2.object, null); this.addEdge(linkWriterActivity, new ObjectFlow(), forkNodeB, outputNodeB, null); this.addEdge(linkWriterActivity, new ObjectFlow(), forkNodeB, writeAction1.value, null); this.addEdge(linkWriterActivity, new ControlFlow(), writeAction1, writeAction2, null); if (endB.multiplicityElement.isOrdered) { ValueSpecificationAction valueAction = new ValueSpecificationAction(); valueAction.setName("Value(1)"); valueAction.setValue(this.createLiteralUnlimitedNatural("", 1)); valueAction.setResult(this.makeOutputPin(valueAction.name + ".result", 1, 1)); linkWriterActivity.addNode(valueAction); ForkNode forkNode1 = new ForkNode(); forkNode1.setName("Fork(1)"); linkWriterActivity.addNode(forkNode1); writeAction1.setInsertAt(this.makeInputPin(writeAction1.name + ".insertAt", 1, 1)); writeAction2.setInsertAt(this.makeInputPin(writeAction2.name + ".insertAt", 1, 1)); this.addEdge(linkWriterActivity, new ObjectFlow(), valueAction.result, forkNode1, null); this.addEdge(linkWriterActivity, new ObjectFlow(), forkNode1, writeAction1.insertAt, null); this.addEdge(linkWriterActivity, new ObjectFlow(), forkNode1, writeAction2.insertAt, null); } this.environment.addElement(linkWriterActivity); } // createLinkWriter public void createLinkRemover(String associationName) { NamedElement element = this.environment.getElement(associationName); if (element == null || !(element instanceof Association)) { Debug.println("[createLinkRemover] " + associationName + " not found or is not an asssociation."); return; } Association association = (Association) element; Property endA = association.memberEnd.getValue(0); Property endB = association.memberEnd.getValue(1); Activity linkRemoverActivity = new Activity(); linkRemoverActivity.setName(associationName + "LinkRemover"); String linkWriterName = associationName + "LinkWriter"; NamedElement linkWriterActivity = this.environment .getElement(linkWriterName); if ((linkWriterActivity == null) || !(linkWriterActivity instanceof Activity)) { if (linkWriterActivity == null) { Debug.println("[createLinkRemover] Creating a " + linkWriterName + " activity."); } else { Debug.println("[createLinkRemover] Replacing the existing " + linkWriterName + " element with an activity."); this.environment.removeElement(linkWriterActivity); } this.createLinkWriter(associationName); linkWriterActivity = this.environment.getElement(linkWriterName); if (linkWriterActivity == null) { return; } } CallBehaviorAction callAction = new CallBehaviorAction(); callAction.setName("Call(" + linkWriterName + ")"); callAction.setBehavior((Activity) linkWriterActivity); callAction.addResult(this.makeOutputPin(callAction.name + ".result(a)", 1, 1)); callAction.addResult(this.makeOutputPin(callAction.name + ".result(b)", 1, 1)); linkRemoverActivity.addNode(callAction); ForkNode forkNodeA = new ForkNode(); forkNodeA.setName("ForkA"); linkRemoverActivity.addNode(forkNodeA); ForkNode forkNodeB = new ForkNode(); forkNodeA.setName("ForkB"); linkRemoverActivity.addNode(forkNodeB); RemoveStructuralFeatureValueAction removeAction = new RemoveStructuralFeatureValueAction(); removeAction.setName("Remove(" + endB.name + ")"); removeAction.setStructuralFeature(endB); removeAction.setObject(this.makeInputPin(removeAction.name + ".object", 1, 1)); linkRemoverActivity.addNode(removeAction); ActivityParameterNode outputNodeA = new ActivityParameterNode(); outputNodeA.setName("Parameter(outputA)"); outputNodeA.setParameter(this.addParameter(linkRemoverActivity, "outputA", ParameterDirectionKind.out, endA.typedElement.type)); linkRemoverActivity.addNode(outputNodeA); ActivityParameterNode outputNodeB = new ActivityParameterNode(); outputNodeB.setName("Parameter(outputB)"); outputNodeB.setParameter(this.addParameter(linkRemoverActivity, "outputB", ParameterDirectionKind.out, endB.typedElement.type)); linkRemoverActivity.addNode(outputNodeB); this.addEdge(linkRemoverActivity, new ObjectFlow(), callAction.result .getValue(0), forkNodeA, null); this.addEdge(linkRemoverActivity, new ObjectFlow(), callAction.result .getValue(1), forkNodeB, null); this.addEdge(linkRemoverActivity, new ObjectFlow(), forkNodeA, removeAction.object, null); this.addEdge(linkRemoverActivity, new ObjectFlow(), forkNodeA, outputNodeA, null); this.addEdge(linkRemoverActivity, new ObjectFlow(), forkNodeB, outputNodeB, null); if (!endB.multiplicityElement.isOrdered || endB.multiplicityElement.isUnique) { removeAction.setValue(this.makeInputPin(removeAction.name + ".value", 1, 1)); this.addEdge(linkRemoverActivity, new ObjectFlow(), forkNodeB, removeAction.value, null); } else { ValueSpecificationAction valueAction = new ValueSpecificationAction(); valueAction.setName("Value(1)"); valueAction.setValue(this.createLiteralUnlimitedNatural("", 1)); valueAction.setResult(this.makeOutputPin(valueAction.name + ".result", 1, 1)); linkRemoverActivity.addNode(valueAction); removeAction.setRemoveAt(this.makeInputPin(removeAction.name + ".removeAt", 1, 1)); this.addEdge(linkRemoverActivity, new ObjectFlow(), valueAction.result, removeAction.removeAt, null); } this.environment.addElement(linkRemoverActivity); } // createLinkRemover public void createIsClassifiedTester(String classifierName) { NamedElement element = this.environment.getElement(classifierName); if (element == null || !(element instanceof Classifier)) { Debug.println("[createIsClassifiedTester] " + classifierName + " does not exist or is not a classifier."); return; } Classifier type = (Classifier) element; Activity activity = new Activity(); activity.setName("TestIs" + classifierName); ActivityParameterNode inputNode = new ActivityParameterNode(); inputNode.setName("Parameter(input)"); inputNode.setParameter(this.addParameter(activity, "input", ParameterDirectionKind.in, type)); activity.addNode(inputNode); ReadIsClassifiedObjectAction testAction = new ReadIsClassifiedObjectAction(); testAction.setName("InstanceOf(" + classifierName + ")"); testAction.setClassifier(type); testAction.setObject(this.makeInputPin(testAction.name + ".object", 1, 1)); testAction.setResult(this.makeOutputPin(testAction.name + ".result", 1, 1)); activity.addNode(testAction); ActivityParameterNode outputNode = new ActivityParameterNode(); outputNode.setName("Parameter(output)"); outputNode.setParameter(this.addParameter(activity, "output", ParameterDirectionKind.out, PrimitiveTypes.Boolean)); activity.addNode(outputNode); this.addEdge(activity, new ObjectFlow(), inputNode, testAction.object, null); this.addEdge(activity, new ObjectFlow(), testAction.result, outputNode, null); this.environment.addElement(activity); } // createIsClassifiedTester public void createFireAgainTester() { Activity activity = new Activity(); activity.setName("FireAgainTester"); ValueSpecificationAction valueAction1 = new ValueSpecificationAction(); valueAction1.setName("Value(1)"); valueAction1.setValue(this.createLiteralInteger("", 1)); valueAction1.setResult(this.makeOutputPin( valueAction1.name + ".result", 1, 1)); activity.addNode(valueAction1); ValueSpecificationAction valueAction2 = new ValueSpecificationAction(); valueAction2.setName("Value(2)"); valueAction2.setValue(this.createLiteralInteger("", 2)); valueAction2.setResult(this.makeOutputPin( valueAction2.name + ".result", 1, 1)); activity.addNode(valueAction2); StructuredActivityNode structuredNode = new StructuredActivityNode(); structuredNode.setName("StructuredNode"); activity.addNode(structuredNode); CallBehaviorAction callAction = new CallBehaviorAction(); callAction.setName("Call"); callAction.setBehavior(this.getActivity("Copier")); callAction.addArgument(this.makeInputPin(callAction.name + ".argument", 0, 1)); callAction.addResult(this.makeOutputPin(callAction.name + ".result", 0, 1)); structuredNode.addNode(callAction); ActivityParameterNode outputNode = new ActivityParameterNode(); outputNode.setName("Parameter(output)"); outputNode.setParameter(this.addParameter(activity, "output", ParameterDirectionKind.out, null)); activity.addNode(outputNode); this.addEdge(activity, new ControlFlow(), valueAction1, valueAction2, null); this.addEdge(activity, new ControlFlow(), valueAction2, structuredNode, null); this.addEdge(activity, new ObjectFlow(), valueAction1.result, callAction.argument.getValue(0), null); this.addEdge(activity, new ObjectFlow(), valueAction2.result, callAction.argument.getValue(0), null); this.addEdge(activity, new ObjectFlow(), callAction.result.getValue(0), outputNode, null); this.environment.addElement(activity); } // createFireAgainTester public void createFlowFinal() { Activity flowFinalActivity = new Activity(); flowFinalActivity.setName("FlowFinal"); ValueSpecificationAction actionA = new ValueSpecificationAction(); actionA.setName("Action_A"); actionA.setValue(this.createLiteralInteger("", 0)); actionA.setResult(this.makeOutputPin(actionA.name + ".result", 1, 1)); this.addNode(flowFinalActivity, actionA); ValueSpecificationAction actionB = new ValueSpecificationAction(); actionB.setName("Action_B"); actionB.setValue(this.createLiteralInteger("", 1)); actionB.setResult(this.makeOutputPin(actionB.name + ".result", 1, 1)); this.addNode(flowFinalActivity, actionB); FlowFinalNode finalNode = new FlowFinalNode(); finalNode.setName("FlowFinalNode"); this.addNode(flowFinalActivity, finalNode); this.addEdge(flowFinalActivity, new ObjectFlow(), actionA.result, finalNode, null); this.addEdge(flowFinalActivity, new ObjectFlow(), actionB.result, finalNode, null); this.addEdge(flowFinalActivity, new ControlFlow(), actionA, actionB, null); this.addEdge(flowFinalActivity, new ControlFlow(), actionB, finalNode, null); this.environment.addElement(flowFinalActivity); } // createFlowFinal public void createCentralBuffer() { Activity activity = new Activity(); activity.setName("CentralBuffer"); InitialNode initialNode = new InitialNode(); initialNode.setName("InitialNode"); activity.addNode(initialNode); StructuredActivityNode structuredNode = new StructuredActivityNode(); structuredNode.setName("StructuredActivityNode"); activity.addNode(structuredNode); CentralBufferNode bufferNode = new CentralBufferNode(); bufferNode.setName("CentralBufferNode"); structuredNode.addNode(bufferNode); ActivityParameterNode inputNode1 = new ActivityParameterNode(); inputNode1.setName("Parameter(input1)"); inputNode1.setParameter(this.addParameter(activity, "input1", ParameterDirectionKind.in, PrimitiveTypes.Integer)); activity.addNode(inputNode1); ActivityParameterNode inputNode2 = new ActivityParameterNode(); inputNode2.setName("Parameter(input2)"); inputNode2.setParameter(this.addParameter(activity, "input2", ParameterDirectionKind.in, PrimitiveTypes.Integer)); activity.addNode(inputNode2); ActivityParameterNode outputNode = new ActivityParameterNode(); outputNode.setName("Parameter(output)"); Parameter parameter = this.addParameter(activity, "output", ParameterDirectionKind.out, null); parameter.setLower(0); parameter.setUpper(-1); outputNode.setParameter(parameter); activity.addNode(outputNode); this.addEdge(activity, new ControlFlow(), initialNode, structuredNode, null); this.addEdge(activity, new ObjectFlow(), inputNode1, bufferNode, null); this.addEdge(activity, new ObjectFlow(), inputNode2, bufferNode, null); this.addEdge(activity, new ObjectFlow(), bufferNode, outputNode, null); this.environment.addElement(activity); } public void createDataStore() { Activity activity = new Activity(); activity.setName("DataStore"); MergeNode mergeNode1 = new MergeNode(); mergeNode1.setName("MergeNode1"); activity.addNode(mergeNode1); ValueSpecificationAction initAction1 = new ValueSpecificationAction(); initAction1.setName("Value(1)-Init-1"); initAction1.setValue(this.createLiteralInteger("", 1)); initAction1.setResult(this.makeOutputPin( initAction1.name + ".result", 1, 1)); activity.addNode(initAction1); ValueSpecificationAction initAction2 = new ValueSpecificationAction(); initAction2.setName("Value(1)-Init-2"); initAction2.setValue(this.createLiteralInteger("", 1)); initAction2.setResult(this.makeOutputPin( initAction1.name + ".result", 1, 1)); activity.addNode(initAction2); ValueSpecificationAction initAction3 = new ValueSpecificationAction(); initAction3.setName("Value(2)-Init-3"); initAction3.setValue(this.createLiteralInteger("", 2)); initAction3.setResult(this.makeOutputPin( initAction1.name + ".result", 1, 1)); activity.addNode(initAction3); ValueSpecificationAction valueAction1 = new ValueSpecificationAction(); valueAction1.setName("Value(1)"); valueAction1.setValue(this.createLiteralInteger("", 1)); valueAction1.setResult(this.makeOutputPin( valueAction1.name + ".result", 1, 1)); activity.addNode(valueAction1); ValueSpecificationAction valueAction2 = new ValueSpecificationAction(); valueAction2.setName("Value(2)"); valueAction2.setValue(this.createLiteralInteger("", 2)); valueAction2.setResult(this.makeOutputPin( valueAction2.name + ".result", 1, 1)); activity.addNode(valueAction2); ValueSpecificationAction valueAction3 = new ValueSpecificationAction(); valueAction3.setName("Value(3)"); valueAction3.setValue(this.createLiteralInteger("", 3)); valueAction3.setResult(this.makeOutputPin( valueAction3.name + ".result", 1, 1)); activity.addNode(valueAction3); ForkNode forkNode1 = new ForkNode(); forkNode1.setName("ForkNode1"); activity.addNode(forkNode1); ForkNode forkNode2 = new ForkNode(); forkNode2.setName("ForkNode2"); activity.addNode(forkNode2); DataStoreNode dataStoreNode = new DataStoreNode(); dataStoreNode.setName("DataStoreNode"); activity.addNode(dataStoreNode); MergeNode mergeNode2 = new MergeNode(); mergeNode2.setName("MergeNode2"); activity.addNode(mergeNode2); DecisionNode decisionNode = new DecisionNode(); decisionNode.setName("DecisionNode"); decisionNode.setDecisionInputFlow(new ObjectFlow()); activity.addNode(decisionNode); CallBehaviorAction callAction1 = new CallBehaviorAction(); callAction1.setName("Call(Copier)-1"); callAction1.setBehavior(this.getActivity("Copier")); callAction1.addArgument(this.makeInputPin( callAction1.name + ".argument", 1, 1)); callAction1.addResult(this.makeOutputPin( callAction1.name + ".result", 1, 1)); activity.addNode(callAction1); CallBehaviorAction callAction2 = new CallBehaviorAction(); callAction2.setName("Call(Copier)-2"); callAction2.setBehavior(this.getActivity("Copier")); callAction2.addArgument(this.makeInputPin( callAction2.name + ".argument", 1, 1)); callAction2.addResult(this.makeOutputPin( callAction2.name + ".result", 1, 1)); activity.addNode(callAction2); ActivityFinalNode finalNode = new ActivityFinalNode(); finalNode.setName("FinalNode"); activity.addNode(finalNode); ActivityParameterNode outputNode = new ActivityParameterNode(); outputNode.setName("Parameter(output)"); Parameter parameter = this.addParameter(activity, "output", ParameterDirectionKind.out, null); parameter.setLower(0); parameter.setUpper(-1); outputNode.setParameter(parameter); activity.addNode(outputNode); this.addEdge(activity, new ControlFlow(), initAction1, initAction2, null); this.addEdge(activity, new ControlFlow(), initAction2, initAction3, null); this.addEdge(activity, new ControlFlow(), initAction3, mergeNode1, null); this.addEdge(activity, new ControlFlow(), mergeNode1, decisionNode, null); this.addEdge(activity, new ControlFlow(), decisionNode, callAction1, this.createLiteralInteger("", 1)); this.addEdge(activity, new ControlFlow(), decisionNode, callAction2, this.createLiteralInteger("", 2)); this.addEdge(activity, new ControlFlow(), decisionNode, finalNode, this.createLiteralInteger("", 3)); this.addEdge(activity, new ControlFlow(), callAction1, valueAction2, null); this.addEdge(activity, new ControlFlow(), valueAction2, mergeNode1, null); this.addEdge(activity, new ControlFlow(), callAction2, valueAction3, null); this.addEdge(activity, new ControlFlow(), valueAction3, mergeNode1, null); this.addEdge(activity, new ObjectFlow(), initAction1.result, dataStoreNode, null); this.addEdge(activity, new ObjectFlow(), initAction2.result, dataStoreNode, null); this.addEdge(activity, new ObjectFlow(), initAction3.result, dataStoreNode, null); this.addEdge(activity, new ObjectFlow(), valueAction1.result, mergeNode2, null); this.addEdge(activity, decisionNode.decisionInputFlow, mergeNode2, decisionNode, null); this.addEdge(activity, new ObjectFlow(), valueAction2.result, mergeNode2, null); this.addEdge(activity, new ObjectFlow(), dataStoreNode, callAction1.argument.get(0), null); this.addEdge(activity, new ObjectFlow(), callAction1.result.get(0), outputNode, null); this.addEdge(activity, new ObjectFlow(), dataStoreNode, callAction2.argument.get(0), null); this.addEdge(activity, new ObjectFlow(), callAction2.result.get(0), outputNode, null); this.environment.addElement(activity); } } // ActivityFactory