/*
* Initial version copyright 2008 Lockheed Martin Corporation, except
* as stated in the file entitled Licensing-Information.
*
* All modifications copyright 2009-2012 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 fUML.Semantics.Actions.CompleteActions;
import fUML.Debug;
import UMLPrimitiveTypes.*;
import fUML.Syntax.*;
import fUML.Syntax.Classes.Kernel.*;
import fUML.Syntax.CommonBehaviors.BasicBehaviors.*;
import fUML.Syntax.CommonBehaviors.Communications.*;
import fUML.Syntax.Activities.IntermediateActivities.*;
import fUML.Syntax.Actions.BasicActions.*;
import fUML.Syntax.Actions.IntermediateActions.*;
import fUML.Syntax.Actions.CompleteActions.*;
import fUML.Semantics.*;
import fUML.Semantics.Classes.Kernel.*;
import fUML.Semantics.CommonBehaviors.BasicBehaviors.*;
import fUML.Semantics.Activities.IntermediateActivities.*;
import fUML.Semantics.Actions.BasicActions.*;
import fUML.Semantics.Actions.IntermediateActions.*;
import fUML.Semantics.Loci.*;
public class StartObjectBehaviorActionActivation extends
fUML.Semantics.Actions.BasicActions.InvocationActionActivation {
public void doAction() {
// Get the value on the object input pin. If it is not a reference, then
// do nothing.
// Start the behavior of the referent object for the classifier given as
// the type of the object input pin, with parameter values taken from
// the argument input pins.
// If the object input pin has no type, then start the classifier
// behaviors of all types of the referent object.
StartObjectBehaviorAction action = (StartObjectBehaviorAction) (this.node);
Value object = this.takeTokens(action.object).getValue(0);
if (object instanceof Reference) {
Class_ type = (Class_) (action.object.typedElement.type);
InputPinList argumentPins = action.argument;
ParameterValueList inputs = new ParameterValueList();
if (type != null) {
Behavior behavior;
if (type instanceof Behavior) {
behavior = (Behavior) type;
} else {
behavior = type.classifierBehavior;
}
if (behavior != null) {
ParameterList parameters = behavior.ownedParameter;
int pinNumber = 1;
int i = 1;
while (i <= parameters.size()) {
Parameter parameter = parameters.getValue(i - 1);
int j = pinNumber;
if (parameter.direction == ParameterDirectionKind.in
| parameter.direction == ParameterDirectionKind.inout) {
ParameterValue parameterValue = new ParameterValue();
parameterValue.parameter = parameter;
parameterValue.values = this
.takeTokens(argumentPins.getValue(j - 1));
inputs.addValue(parameterValue);
j = j + 1;
}
pinNumber = j;
i = i + 1;
}
}
}
((Reference) object).startBehavior(type, inputs);
}
} // doAction
} // StartObjectBehaviorActionActivation