/*
* 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.IntermediateActivities;
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.Actions.BasicActions.*;
import fUML.Semantics.Loci.*;
public class ActivityEdgeInstance extends org.modeldriven.fuml.FumlObject {
public fUML.Syntax.Activities.IntermediateActivities.ActivityEdge edge = null;
public fUML.Semantics.Activities.IntermediateActivities.ActivityNodeActivationGroup group = null;
public fUML.Semantics.Activities.IntermediateActivities.ActivityNodeActivation source = null;
public fUML.Semantics.Activities.IntermediateActivities.ActivityNodeActivation target = null;
public fUML.Semantics.Activities.IntermediateActivities.OfferList offers = new fUML.Semantics.Activities.IntermediateActivities.OfferList();
public void sendOffer(
fUML.Semantics.Activities.IntermediateActivities.TokenList tokens) {
// Send an offer from the source to the target.
// Keep the offered tokens until taken by the target.
// (Note that any one edge should only be handling either all object
// tokens or all control tokens.)
Offer offer = new Offer();
for (int i = 0; i < tokens.size(); i++) {
Token token = tokens.getValue(i);
// Debug.println("[sendOffer] token value = " + token.getValue());
offer.offeredTokens.addValue(token);
}
this.offers.addValue(offer);
this.target.receiveOffer();
} // sendOffer
public int countOfferedValues() {
// Return the number of values being offered in object tokens.
int count = 0;
OfferList offers = this.offers;
for (int i = 0; i < offers.size(); i++) {
count = count + offers.getValue(i).countOfferedValues();
}
return count;
} // countOfferedValues
public fUML.Semantics.Activities.IntermediateActivities.TokenList takeOfferedTokens() {
// Take all the offered tokens and return them.
TokenList tokens = new TokenList();
while (this.offers.size() > 0) {
TokenList offeredTokens = this.offers.getValue(0)
.getOfferedTokens();
for (int i = 0; i < offeredTokens.size(); i++) {
tokens.addValue(offeredTokens.getValue(i));
}
this.offers.removeValue(0);
}
return tokens;
} // takeOfferedTokens
public fUML.Semantics.Activities.IntermediateActivities.TokenList takeOfferedTokens(
int maxCount) {
// Take all the offered tokens, up to the given maximum count of
// non-null object tokens, and return them.
TokenList tokens = new TokenList();
int remainingCount = maxCount;
while (this.offers.size() > 0 & remainingCount > 0) {
Offer offer = this.offers.getValue(0);
TokenList offeredTokens = offer.getOfferedTokens();
int count = offer.countOfferedValues();
if (count <= remainingCount) {
for (int i = 0; i < offeredTokens.size(); i++) {
tokens.addValue(offeredTokens.getValue(i));
}
remainingCount = remainingCount - count;
this.offers.removeValue(0);
} else {
for (int i = 0; i < remainingCount; i++) {
Token token = offeredTokens.getValue(i);
if (token.getValue() != null) {
tokens.addValue(token);
}
}
offer.removeOfferedValues(remainingCount);
remainingCount = 0;
}
}
return tokens;
} // takeOfferedTokens
public fUML.Semantics.Activities.IntermediateActivities.TokenList getOfferedTokens() {
// Get the offered tokens (after which the tokens will still be
// offered).
TokenList tokens = new TokenList();
OfferList offers = this.offers;
for (int i = 0; i < offers.size(); i++) {
TokenList offeredTokens = offers.getValue(i).getOfferedTokens();
for (int j = 0; j < offeredTokens.size(); j++) {
tokens.addValue(offeredTokens.getValue(j));
}
}
return tokens;
} // getOfferedTokens
public boolean hasOffer() {
// Return true if there are any pending offers.
boolean hasTokens = false;
int i = 1;
while (!hasTokens & i <= this.offers.size()) {
hasTokens = this.offers.getValue(i - 1).hasTokens();
i = i + 1;
}
return hasTokens;
} // hasOffer
} // ActivityEdgeInstance