/*
* 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.BasicActions;
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.Semantics.*;
import fUML.Semantics.Classes.Kernel.*;
import fUML.Semantics.CommonBehaviors.BasicBehaviors.*;
import fUML.Semantics.Activities.IntermediateActivities.*;
import fUML.Semantics.Loci.*;
public abstract class PinActivation extends
fUML.Semantics.Activities.IntermediateActivities.ObjectNodeActivation {
public fUML.Semantics.Actions.BasicActions.ActionActivation actionActivation = null;
public void fire(
fUML.Semantics.Activities.IntermediateActivities.TokenList incomingTokens) {
// Add all incoming tokens to the pin.
Debug.println("[fire] Pin " + (this.node == null ? "" : this.node.name + "..."));
this.addTokens(incomingTokens);
} // fire
public fUML.Semantics.Activities.IntermediateActivities.TokenList takeOfferedTokens() {
// Take only a number of tokens only up to the limit allowed by
// the multiplicity upper bound of the pin for this activation.
int count = this.countUnofferedTokens();
int upper = -1;
// Note: A pin activation used in an expansion activation group
// will have this.node == null.
if (this.node != null) {
upper = ((Pin) (this.node)).multiplicityElement.upper.naturalValue;
}
TokenList tokens = new TokenList();
// Note: upper < 0 indicates an unbounded upper multiplicity.
if (upper < 0 | count < upper) {
ActivityEdgeInstanceList incomingEdges = this.incomingEdges;
for (int i = 0; i < incomingEdges.size(); i++) {
ActivityEdgeInstance edge = incomingEdges.getValue(i);
int incomingCount = edge.countOfferedValues();
TokenList incomingTokens = new TokenList();
if (upper < 0 | incomingCount < upper - count) {
incomingTokens = edge.takeOfferedTokens();
count = count + incomingCount;
} else if (count < upper) {
incomingTokens = edge.takeOfferedTokens(upper - count);
count = upper;
}
for (int j = 0; j < incomingTokens.size(); j++) {
Token token = incomingTokens.getValue(j);
tokens.addValue(token);
}
}
}
return tokens;
} // takeOfferedTokens
} // PinActivation