fUML.Semantics.Activities.CompleteStructuredActivities.StructuredActivityNodeActivation Maven / Gradle / Ivy
Go to download
Show more of this group Show more artifacts with this name
Show all versions of fuml Show documentation
Show all versions of fuml Show documentation
This open source software is a reference implementation, consisting of software and related files, for the OMG specification called the Semantics of a Foundational Subset for Executable UML Models (fUML). The reference implementation is intended to implement the execution semantics of UML activity models, accepting an XMI file from a conformant UML model as its input and providing an execution trace of the selected activity model(s) as its output. The core execution engine, which is directly generated from the normative syntactic and semantic models for fUML, may also be used as a library implementation of fUML in other software.
/*
* 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.Activities.CompleteStructuredActivities;
import fUML.Debug;
import UMLPrimitiveTypes.*;
import java.util.*;
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.Activities.CompleteStructuredActivities.*;
import fUML.Syntax.Actions.BasicActions.*;
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.Loci.*;
public class StructuredActivityNodeActivation extends
fUML.Semantics.Actions.BasicActions.ActionActivation {
public fUML.Semantics.Activities.IntermediateActivities.ActivityNodeActivationGroup activationGroup = null;
public void doAction() {
// If the structured activity node has mustIsolate=true, then carry out
// its behavior with isolation.
// Otherwise just activate it normally.
if (((StructuredActivityNode) (this.node)).mustIsolate) {
_beginIsolation();
this.doStructuredActivity();
_endIsolation();
} else {
this.doStructuredActivity();
}
} // doAction
public void doStructuredActivity() {
// Run all activations of contained nodes. When this is complete,
// return.
// (This is the default behavior for a structured activity node used
// simply as a group. It is overridden for the execution of conditional
// and loop nodes.)
Action action = (Action) (this.node);
// *** Concurrently send offers from all input pins. ***
InputPinList inputPins = action.input;
for (Iterator i = inputPins.iterator(); i.hasNext();) {
InputPin inputPin = (InputPin) i.next();
PinActivation pinActivation = this.getPinActivation(inputPin);
pinActivation.sendUnofferedTokens();
}
this.activationGroup.run(this.activationGroup.nodeActivations);
} // doStructuredActivity
public void terminate() {
// Terminate the execution of all contained node activations (which
// completes the performance of the structured activity node
// activation), and then terminate this node itself.
this.terminateAll();
super.terminate();
} // terminate
public fUML.Semantics.Activities.IntermediateActivities.ActivityNodeActivation getNodeActivation(
fUML.Syntax.Activities.IntermediateActivities.ActivityNode node) {
// If this structured activity node activation is not for the given
// node, then check if there is an activation for the node in the
// activation group.
ActivityNodeActivation thisActivation = super.getNodeActivation(node);
ActivityNodeActivation activation = null;
if (thisActivation != null) {
activation = thisActivation;
} else if (this.activationGroup != null) {
activation = this.activationGroup.getNodeActivation(node);
}
return activation;
} // getNodeActivation
public fUML.Syntax.Activities.IntermediateActivities.ActivityNodeList makeActivityNodeList(
fUML.Syntax.Activities.CompleteStructuredActivities.ExecutableNodeList nodes) {
// Return an activity node list containing the given list of executable
// nodes
// and any pins that they own.
ActivityNodeList activityNodes = new ActivityNodeList();
for (int i = 0; i < nodes.size(); i++) {
ActivityNode node = nodes.getValue(i);
activityNodes.addValue(node);
if (node instanceof Action) {
Action action = (Action) node;
InputPinList inputPins = action.input;
for (int j = 0; j < inputPins.size(); j++) {
InputPin inputPin = inputPins.getValue(j);
activityNodes.addValue(inputPin);
}
OutputPinList outputPins = action.output;
for (int j = 0; j < outputPins.size(); j++) {
OutputPin outputPin = outputPins.getValue(j);
activityNodes.addValue(outputPin);
}
}
}
return activityNodes;
} // makeActivityNodeList
public fUML.Semantics.Classes.Kernel.ValueList getPinValues(
fUML.Syntax.Actions.BasicActions.OutputPin pin) {
// Return the values of the tokens on the pin activation corresponding
// to the given pin in the internal activation group for this node
// activation.
PinActivation pinActivation = (PinActivation) (this.activationGroup
.getNodeActivation(pin));
TokenList tokens = pinActivation.getTokens();
ValueList values = new ValueList();
for (int i = 0; i < tokens.size(); i++) {
Token token = tokens.getValue(i);
Value value = ((ObjectToken) token).value;
if (value != null) {
values.addValue(value);
}
}
return values;
} // getPinValues
public void putPinValues(fUML.Syntax.Actions.BasicActions.OutputPin pin,
fUML.Semantics.Classes.Kernel.ValueList values) {
// Place tokens for the given values on the pin activation corresponding
// to the given output pin on the internal activation group for this
// node activation.
PinActivation pinActivation = (PinActivation) (this.activationGroup
.getNodeActivation(pin));
for (int i = 0; i < values.size(); i++) {
Value value = values.getValue(i);
ObjectToken token = new ObjectToken();
token.value = value;
pinActivation.addToken(token);
}
} // putPinValues
public void createNodeActivations() {
// Create an activation group and create node activations for all the
// nodes within the structured activity node.
super.createNodeActivations();
this.activationGroup = new ActivityNodeActivationGroup();
this.activationGroup.containingNodeActivation = this;
this.activationGroup
.createNodeActivations(((StructuredActivityNode) (this.node)).node);
} // createNodeActivations
public void createEdgeInstances() {
// Create instances for all edges owned by this node.
this.activationGroup
.createEdgeInstances(((StructuredActivityNode) (this.node)).edge);
} // createEdgeInstances
public boolean isSourceFor(
fUML.Semantics.Activities.IntermediateActivities.ActivityEdgeInstance edgeInstance) {
// Returns true if this node is either the source for the given
// edgeInstance itself or if it contains the source in its
// activation group.
boolean isSource = super.isSourceFor(edgeInstance);
if (!isSource) {
isSource = this.activationGroup.hasSourceFor(edgeInstance);
}
return isSource;
} // isSourceFor
public void terminateAll() {
// Terminate the execution of all contained node activations (which
// completes the performance of the structured activity node
// activation).
this.activationGroup.terminateAll();
} // terminateAll
public boolean isSuspended() {
// Check if the activation group for this node is suspended.
return this.activationGroup.isSuspended();
} // isSuspended
public fUML.Semantics.Activities.IntermediateActivities.TokenList completeAction() {
// Only actually complete this structured activity node if it is not
// suspended.
TokenList incomingTokens = new TokenList();
if (!this.isSuspended()) {
incomingTokens = super.completeAction();
}
return incomingTokens;
} // completeAction
public void resume() {
// When this structured activity node is resumed after being suspended,
// then complete its prior firing and, if there are more incoming
// tokens, fire it again. If, after that, the node is not suspended,
// then finish its resumption.
TokenList incomingTokens = super.completeAction();
if (incomingTokens.size() > 0) {
this.fire(incomingTokens);
}
if (!this.isSuspended()) {
super.resume();
}
} // resume
} // StructuredActivityNodeActivation