/*
* Initial version copyright 2008 Lockheed Martin Corporation, except
* as stated in the file entitled Licensing-Information.
*
* All modifications copyright 2009-2015 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.IntermediateActions;
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.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.LociL1.*;
public class RemoveStructuralFeatureValueActionActivation
extends
fUML.Semantics.Actions.IntermediateActions.WriteStructuralFeatureActionActivation {
public void doAction() {
// Get the values of the object and value input pins.
// If the given feature is an association end, then destroy any matching
// links.
// Otherwise, if the object input is a structural value, remove values
// from the given feature.
// If isRemoveDuplicates is true, then destroy all current matching
// links or remove all values equal to the input value.
// If isRemoveDuplicates is false and there is no removeAt input pin,
// remove any one feature value equal to the input value (if there are
// any that are equal).
// If isRemoveDuplicates is false, and there is a removeAt input pin
// remove the feature value at that position.
RemoveStructuralFeatureValueAction action = (RemoveStructuralFeatureValueAction) (this.node);
StructuralFeature feature = action.structuralFeature;
Association association = this.getAssociation(feature);
Value value = this.takeTokens(action.object).getValue(0);
Value inputValue = null;
if (action.value != null) {
// NOTE: Multiplicity of the value input pin is required to be 1..1.
inputValue = this.takeTokens(action.value).getValue(0);
}
int removeAt = 0;
if (action.removeAt != null) {
removeAt = ((UnlimitedNaturalValue) this
.takeTokens(action.removeAt).getValue(0)).value.naturalValue;
}
if (association != null) {
LinkList links = this.getMatchingLinksForEndValue(association, feature, value, inputValue);
if (action.isRemoveDuplicates) {
for (int i = 0; i < links.size(); i++) {
Link link = links.getValue(i);
link.destroy();
}
} else if (action.removeAt == null) {
// *** If there is more than one matching link,
// non-deterministically choose one. ***
if (links.size() > 0) {
int i = ((ChoiceStrategy) this.getExecutionLocus().factory
.getStrategy("choice")).choose(links.size());
links.getValue(i - 1).destroy();
}
} else {
boolean notFound = true;
int i = 1;
while (notFound & i <= links.size()) {
Link link = links.getValue(i - 1);
if (link.getFeatureValue(feature).position == removeAt) {
notFound = false;
link.destroy();
}
i = i + 1;
}
}
} else if (value instanceof StructuredValue) {
// If the value is a data value, then it must be copied before
// any change is made.
if (!(value instanceof Reference)) {
value = value.copy();
}
FeatureValue featureValue = ((StructuredValue) value)
.getFeatureValue(action.structuralFeature);
if (action.isRemoveDuplicates) {
int j = this.position(inputValue, featureValue.values, 1);
while (j > 0) {
featureValue.values.remove(j - 1);
j = this.position(inputValue, featureValue.values, j);
}
} else if (action.removeAt == null) {
intList positions = new intList();
int j = this.position(inputValue, featureValue.values, 1);
while (j > 0) {
positions.addValue(j);
j = this.position(inputValue, featureValue.values, j + 1);
}
if (positions.size() > 0) {
// *** Nondeterministically choose which value to remove.
// ***
int k = ((ChoiceStrategy) this.getExecutionLocus().factory
.getStrategy("choice")).choose(positions.size());
featureValue.values.remove(positions.getValue(k - 1) - 1);
}
} else {
if (featureValue.values.size() >= removeAt) {
featureValue.values.remove(removeAt - 1);
}
}
}
if (action.result != null) {
this.putToken(action.result, value);
}
} // doAction
} // RemoveStructuralFeatureValueActionActivation