/* * 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.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.*; public abstract class StructuralFeatureActionActivation extends fUML.Semantics.Actions.BasicActions.ActionActivation { public fUML.Syntax.Classes.Kernel.Association getAssociation( fUML.Syntax.Classes.Kernel.StructuralFeature feature) { // If the structural feature for the action of this activation is an // association end, // then get the associated association. Association association = null; if (feature instanceof Property) { association = ((Property) feature).association; } return association; } // getAssociation public fUML.Semantics.Classes.Kernel.LinkList getMatchingLinks( fUML.Syntax.Classes.Kernel.Association association, fUML.Syntax.Classes.Kernel.StructuralFeature end, fUML.Semantics.Classes.Kernel.Value oppositeValue) { // Get the links of the given binary association whose end opposite // to the given end has the given value return this.getMatchingLinksForEndValue(association, end, oppositeValue, null); } public fUML.Semantics.Classes.Kernel.LinkList getMatchingLinksForEndValue( fUML.Syntax.Classes.Kernel.Association association, fUML.Syntax.Classes.Kernel.StructuralFeature end, fUML.Semantics.Classes.Kernel.Value oppositeValue, fUML.Semantics.Classes.Kernel.Value endValue) { // Get the links of the given binary association whose end opposite // to the given end has the given opposite value and, optionally, that // has a given end value for the given end. Property oppositeEnd = this.getOppositeEnd(association, end); ExtensionalValueList extent = this.getExecutionLocus().getExtent( association); LinkList links = new LinkList(); for (int i = 0; i < extent.size(); i++) { ExtensionalValue link = extent.getValue(i); if (link.getFeatureValue(oppositeEnd).values.getValue(0).equals(oppositeValue)) { boolean matches = true; if (endValue != null) { matches = link.getFeatureValue(end).values.getValue(0).equals(endValue); } if (matches) { if (!end.multiplicityElement.isOrdered | links.size() == 0) { links.addValue((Link) link); } else { int n = link.getFeatureValue(end).position; boolean continueSearching = true; int j = 0; while (continueSearching & j < links.size()) { j = j + 1; continueSearching = links.getValue(j - 1).getFeatureValue(end).position < n; } if (continueSearching) { links.addValue((Link) link); } else { links.addValue(j - 1, (Link) link); } } } } } return links; } // getMatchingLinks public fUML.Syntax.Classes.Kernel.Property getOppositeEnd( fUML.Syntax.Classes.Kernel.Association association, fUML.Syntax.Classes.Kernel.StructuralFeature end) { // Get the end of a binary association opposite to the given end. Property oppositeEnd = association.memberEnd.getValue(0); if (oppositeEnd == end) { oppositeEnd = association.memberEnd.getValue(1); } return oppositeEnd; } // getOppositeEnd } // StructuralFeatureActionActivation