Issues for Foundational Subset of Executable UML Models Finalization Task Force

To comment on any of these issues, send email to [email protected]. (Please include the issue number in the Subject: header, thusly: [Issue ###].) To submit a new issue, send email to [email protected].

List of issues (green=resolved, yellow=pending Board vote, red=unresolved)

List options: All ; Open Issues only; or Closed Issues only

Jira Issues

Issue 13167: Reference Menzel in Section 10 Jira Issue FUML-55
Issue 13307: Issue: Sending offers from ForkNodeActivation::fire Jira Issue FUML-1
Issue 13308: Issue: ActivityNodeActivation::clearTokens incorrect Jira Issue FUML-2
Issue 13309: Issue: InitialNodeActivation::fire should use sendOffers Jira Issue FUML-3
Issue 13310: An action can consume more tokens from a pin than the allowed multiplicity upper bound Jira Issue FUML-4
Issue 13311: The call to receiveOffer at the end of ActionActivation::fire could can cause an infinite recursion Jira Issue FUML-5
Issue 13312: Issue: ObjectNodeActivation::offeredTokenCount is not initialized Jira Issue FUML-6
Issue 13313: Issue: CallActionActivation cannot handle more than one concurrent call Jira Issue FUML-7
Issue 13314: Issue: The result pin of clear and write structural feature actions can be optional Jira Issue FUML-8
Issue 13315: Issue: Bug in ReclassifyObjectActionActivation::doAction Jira Issue FUML-9
Issue 13450: Error in return value of ActivityNodeActivation::removeToken Jira Issue FUML-10
Issue 13453: ExecutionFactory::instantiateVisitor should not use Java reflection Jira Issue FUML-11
Issue 13454: ExecutionFactory::getStrategy doesn't follow conventions Jira Issue FUML-12
Issue 13455: BooleanValue::toString uses Java String.valueOf Jira Issue FUML-13
Issue 13456: CompoundValue::equals does not conform to Annex A conventions Jira Issue FUML-14
Issue 13457: EnumerationValue::specify missing a "this" Jira Issue FUML-15
Issue 13458: FeatureValue::hasEqualValues does not follow Annex A conventions Jira Issue FUML-16
Issue 13459: InstanceValueEvaluation::evaluate does not initialize local variables Jira Issue FUML-17
Issue 13460: IntegerValue::toString uses Java String.valueOf Jira Issue FUML-18
Issue 13461: Link::getTypes does not initialize a local variable Jira Issue FUML-19
Issue 13462: UnlimitedNaturalValue::toString does not follow Annex A conventions Jira Issue FUML-20
Issue 13463: ActionActivation::isSourceFor does not initialize a local variable Jira Issue FUML-21
Issue 13464: LoopNodeActivation::doStructuredActivity uses a Java array Jira Issue FUML-22
Issue 13504: Event should be a specialization of PackageableElement Jira Issue FUML-23
Issue 13509: [FUML] 7.4.2.2.14 ObjectFlow Jira Issue FUML-24
Issue 13511: 7.5.2.2.9 SendSignalAction Jira Issue FUML-25
Issue 13544: [FUML] 8.6.3.2.4 CreateLinkActionActivation.doAction() Jira Issue FUML-26
Issue 13546: 8.6.4.2.1 [5]AcceptEventActionActivation::accept(in signalInstance:SignalInstance) Jira Issue FUML-27
Issue 13869: Error in ReadLinkActionActivation Jira Issue FUML-28
Issue 13873: 8.6.2.2.1 ActionActivation, 8.6.3.2.4 CreateLinkActionActivation and 8.6.3.2.8 LinkActionActivation Jira Issue FUML-29
Issue 13881: Subclause: 8.5.2.2.6 ActivityParameterNodeActivation Jira Issue FUML-30
Issue 13882: Only abstract classes should be able to have abstract behavioral features Jira Issue FUML-31
Issue 13883: Receptions should never be abstract Jira Issue FUML-32
Issue 13921: The superclass of ActvityNode and ActivityEdge should be RedefinableElement Jira Issue FUML-33
Issue 14193: Base Semantics Jira Issue FUML-34
Issue 14519: Active class should not have to have classifier behaviors Jira Issue FUML-35
Issue 14520: A passive class should not be able to specialize an active class Jira Issue FUML-36
Issue 14521: A data type should not be allowed to have operations Jira Issue FUML-37
Issue 14522: OpaqueBehavior::opaqueBehavior should be OpaqueBehavior::language Jira Issue FUML-38
Issue 14523: Items excluded from Kernel Jira Issue FUML-39
Issue 14524: Incorrect generalizations in Kernel Jira Issue FUML-40
Issue 14525: InstanceValue constraint is redundant Jira Issue FUML-41
Issue 14527: The composition from ObjectNode to TypedElement is incorrect Jira Issue FUML-42
Issue 14528: Pin should be abstract Jira Issue FUML-43
Issue 14529: OCL incomplete for CallBehaviorAction::proper_context Jira Issue FUML-44
Issue 14530: OCL for SendSignalAction::target_signal_reception is incorrect Jira Issue FUML-45
Issue 14531: Problems with OCL for AcceptEventAction::fUML_active_context Jira Issue FUML-46
Issue 14532: References to uml::Class in OCL Jira Issue FUML-47
Issue 14533: Include activity diagrams for classifier behaviors Jira Issue FUML-48
Issue 14545: Variable needs initialization in InputPinActivation::receiveOffer Jira Issue FUML-49
Issue 14547: Structured activity node execution model needs to be corrected Jira Issue FUML-50
Issue 14550: Revise fUML to be based on UML 2.3 Jira Issue FUML-51
Issue 14556: ObjectNodeOrderingKind should be in Activities::IntermediateActivities Jira Issue FUML-52
Issue 14561: Attributes introduced in CompleteActivities should not be included in the fUML subset Jira Issue FUML-53
Issue 14618: ObjectNodeActivation::unofferedTokens is spurious Jira Issue FUML-54
Issue 14990: Values passed out to pins from empty parameter nodes Jira Issue FUML_-1
Issue 14992: UML input pins do not accept more tokens than their actions can immediately consume Jira Issue FUML_-2
Issue 15004: Diagram graphics in the fUML specification Jira Issue FUML_-3
Issue 15088: Additional changes required for structured activity node execution Jira Issue FUML_-4
Issue 15089: Modification to AcceptEventActionActivation Jira Issue FUML_-5
Issue 15090: Error in ObjectActivation::dispatchNextEvent Jira Issue FUML_-6
Issue 15094: Additional changes required for action firing semantics Jira Issue FUML_-7
Issue 15127: Corrections to previous resolutions Jira Issue FUML_-8

Issue 13167: Reference Menzel in Section 10 (fuml-ftf)

Click here for this issue's archive.
Source: NIST (Dr. Conrad Bock, conrad.bock(at)nist.gov)
Nature: Revision
Severity: Minor
Summary:
Reference Menzel in Section 10: http://philebus.tamu.edu/cmenzel/Papers/AxiomaticSemantics.pdf  

Resolution: Add reference as requested
Revised Text: In Base Semantics, Design Rationale, last paragraph, add footnote at end: The axiomitization of numbers and cardinality is adapted from http://philebus.tamu.edu/cmenzel/Papers/AxiomaticSemantics.pdf.
Actions taken:
December 18, 2008: received issue
July 23, 2010: closed issue

Issue 13307: Issue: Sending offers from ForkNodeActivation::fire (fuml-ftf)

Click
here for this issue's archive.
Source: Model Driven Solutions (Mr. Ed Seidewitz, ed-s(at)modeldriven.com)
Nature: Uncategorized Issue
Severity:
Summary:
    At the end of the ForkNodeActivation::fire operation, offers are sent on all outgoing edges. However, the loop used to do this repeats the logic already in the inherited sendOffers operation, except that the sending is not indicated to be done concurrently, as it should be.         Proposed resolution:         Replace the loop:         for (int i = 0; i < outgoingEdges.size(); i++) {        ActivityEdgeInstance outgoingEdge = outgoingEdges.getValue(i);        outgoingEdge.sendOffer(forkedTokens);    }         with:         this.sendOffers(forkedTokens);       

Resolution: Replace the offending loop as proposed
Revised Text: In the method for ForkNodeActivation::fire, replace the loop: for (int i = 0; i < outgoingEdges.size(); i++) { ActivityEdgeInstance outgoingEdge = outgoingEdges.getValue(i); outgoingEdge.sendOffer(forkedTokens); } with: this.sendOffers(forkedTokens);
Actions taken:
January 20, 2009: received issue
July 23, 2010: closed issue

Issue 13308: Issue: ActivityNodeActivation::clearTokens incorrect (fuml-ftf)

Click
here for this issue's archive.
Source: Model Driven Solutions (Mr. Ed Seidewitz, ed-s(at)modeldriven.com)
Nature: Uncategorized Issue
Severity:
Summary:
Specification: Semantics of a Foundation Subset for Executable UML Models, FTF � Beta 1 (ptc/08-11-03)    Section: 8.5.2.2.3 (ActivityNodeActivation)         Summary:         The logic for the ActivityNodeActivation::clearTokens operation is incorrect. As coded, this operation withdraws each token held by an activity node activation. However, as each token is withdrawn, it gets removed from the activity node. This means that the indexing of the getValue used to get the next held token will be incorrect.         Proposed resolution:         Replace the current code with the following:         while (this.heldTokens.size() > 0) {        this.heldTokens.getValue(0).withdraw();    }       

Resolution: Change the code as proposed
Revised Text: In Section: 8.5.2.2.3 (ActivityNodeActivation): Replace the current code with the following: while (this.heldTokens.size() > 0) { this.heldTokens.getValue(0).withdraw(); }
Actions taken:
January 20, 2009: received issue
July 23, 2010: closed issue

Issue 13309: Issue: InitialNodeActivation::fire should use sendOffers (fuml-ftf)

Click
here for this issue's archive.
Source: Model Driven Solutions (Mr. Ed Seidewitz, ed-s(at)modeldriven.com)
Nature: Uncategorized Issue
Severity:
Summary:
Specification: Semantics of a Foundation Subset for Executable UML Models, FTF � Beta 1 (ptc/08-11-03)    Section: 8.5.2.2.12 (InitialNodeActivation)         Summary:         The InitialNodeActivation::fire operation is documented as �Create a single token and send offers for it.� However, this operation ends by calling super.fire, which only happens by default to just send offers for the given tokens. The initial node activation semantics should not depend on this default, but should explicitly call this.sendOffers, so that the semantics is clear.         Proposed resolution:         Replace:         super.fire(tokens);         with:         this.sendOffers(tokens);       

Resolution: Change the code as proposed.
Revised Text: In Section: 8.5.2.2.12 (InitialNodeActivation): Replace: super.fire(tokens); with: this.sendOffers(tokens);
Actions taken:
January 20, 2009: received issue
July 23, 2010: closed issue

Issue 13310: An action can consume more tokens from a pin than the allowed multiplicity upper bound (fuml-ftf)

Click
here for this issue's archive.
Source: Model Driven Solutions (Mr. Ed Seidewitz, ed-s(at)modeldriven.com)
Nature: Uncategorized Issue
Severity:
Summary:
Specification: Semantics of a Foundation Subset for Executable UML Models, FTF � Beta 1 (ptc/08-11-03)    Sections: 8.5.2.2.15 (ObjectNodeActivation), 8.6.2.2.1 (ActionActivation), 8.6.2.2.7 (OutputPinActivation), 8.6.2.2.8 (PinActivation)         Summary:         When an action fires, all offered tokens are accepted on all input pins (because the default object flow weight for fUML is �*�). However, an action cannot consume more tokens from an input pin than the multiplicity upper bound for that pin. Any additional tokens remain on the pin, the intent being that they can be consumed if and when the action fires again.         However, currently the ActionActivation::getTokens operation (used to get values from the tokens on an input pin) uses the ActivityNodeActivation::takeTokens operation inherited by InputPin. This operation returns all the tokens on the pin and clears them from the pin, without respecting the multiplicity upper bound. As a result, the ActionActivation::getTokens operation does not respect this upper bound either.         Proposed resolution:         Add the following operation to ObjectNodeActivation:         ObjectNodeActivation::takeUnofferedTokens(): Token[*]    // Take the next set of unoffered tokens to be offered from this node activation and return them.         TokenList tokens = this.getUnofferedTokens();    for (int i = 0; i < tokens.size(); i++) {        Token token = tokens.getValue(i);        token.withdraw();    }    return tokens;         (Note: The getUnofferedTokens operation returns a number of tokens equal to the result of the countUnofferedTokens operation. This is overridden in InputPin to limit the count to at most the multiplicity upper bound.)         In ActionActivation::getTokens, replace the call to getTokens with a call to getUnofferedTokens.         Add the following operation to OutputPinActivation (overriding the inherited operation):         OutputPinActivation::fire(incomingTokens: Token[*])    // Add incoming tokens and send offers on outgoing edges.         super.fire(incomingTokens);    this.sendUnofferedTokens();         In PinActivation::fire, remove the call to this.sendUnofferedTokens.         (Note: The change to not automatically send the tokens from an input pin is necessary to avoid having the tokens marked as sent before they are read by an action that is not a structured activity node. An input pin can only have outgoing flows if it is an input pin of a structured activity node anyway, so the sending of offers from input pins should be handled in the semantics of structured activity nodes. This will be addressed in a separate, related issue on structured activity node activations.)  

Resolution: Change the code as proposed
Revised Text: Add the following operation to ObjectNodeActivation: ObjectNodeActivation::takeUnofferedTokens(): Token[*] // Take the next set of unoffered tokens to be offered // from this node activation and return them. TokenList tokens = this.getUnofferedTokens(); for (int i = 0; i < tokens.size(); i++) { Token token = tokens.getValue(i); token.withdraw(); } return tokens; In ActionActivation::getTokens, replace the call to takeTokens with a call to takeUnofferedTokens. [But see also the resolutions to Issue 13873.] Add the following operation to OutputPinActivation (overriding the inherited operation): OutputPinActivation::fire(incomingTokens: Token[*]) // Add incoming tokens and send offers on outgoing edges. super.fire(incomingTokens); this.sendUnofferedTokens(); In PinActivation::fire, remove the call to this.sendUnofferedTokens
Actions taken:
January 20, 2009: received issue
July 23, 2010: closed issue

Issue 13311: The call to receiveOffer at the end of ActionActivation::fire could can cause an infinite recursion (fuml-ftf)

Click
here for this issue's archive.
Source: Model Driven Solutions (Mr. Ed Seidewitz, ed-s(at)modeldriven.com)
Nature: Uncategorized Issue
Severity:
Summary:
Specification: Semantics of a Foundation Subset for Executable UML Models, FTF � Beta 1 (ptc/08-11-03)    Section: 8.6.2.2.1 (ActionActivation)         Summary:         At the end of ActionActivation::fire, a check is made to see if the action should fire again. The intent is that this should happen if the action has input pins and there are still tokens left on one or more pins after the previous firing (because there were more tokens on the pins than the multiplicity upper bound). Currently, this check is made by first checking that the action has input pins and then calling receiveOffer, so that the isReady test can check for inputs.         However, if the action input pins, but they are all optional (i.e., multiplicity lower bound of 0), and no incoming control flows, then the action will be ready to fire whether or not there are any inputs on the pins. This will result in an infinite recursion of the action continually firing.         Proposed resolution:         Replace:         // Activate the action again, if prerequisites are still satisfied (i.e., when tokens have been left on input pins).    Debug.println("[fire] Checking if " + this.node.name + " should fire again...");    if (((Action)(this.node)).input.size() > 0) {        this.receiveOffer();    }         with:         // Activate the action again, if tokens have been left on input pins and the action has no incoming control flows.    Debug.println("[fire] Checking if " + this.node.name + " should fire again...");    if (((Action)(this.node)).input.size() > 0 & this.node.incoming.size() == 0) {             boolean fireAgain = true;        InputPinList inputPins = ((Action)(this.node)).input;        int j = 1;        while (fireAgain & j <= inputPins.size()) {            PinActivation inputPinActivation = this.getPinActivation(inputPins.getValue(j-1));            fireAgain = inputPinActivation.isReady() & inputPinActivation.countUnofferedTokens() > 0;            j = j + 1;        }             if (fireAgain) {            this.fire(new TokenList());        }    }         (Note: This code does not check for incoming control tokens, but, rather, only fires the action again if it has no incoming control flows. If an action has incoming control flows and inputs left on its input pins, then an offer on a control flow will trigger the action to fire again.)       

Resolution: Change the code as proposed.
Revised Text: In the method for ActionActivation::doAction, replace: // Activate the action again, if prerequisites are still // satisfied (i.e., when tokens have been left on input // pins). Debug.println("[fire] Checking if " + this.node.name + " should fire again..."); if (((Action)(this.node)).input.size() > 0) { this.receiveOffer(); } with: // Activate the action again, if tokens have been left on input pins and the action has no incoming control flows. Debug.println("[fire] Checking if " + this.node.name + " should fire again..."); if (((Action)(this.node)).input.size() > 0 & this.node.incoming.size() == 0) { boolean fireAgain = true; InputPinList inputPins = ((Action)(this.node)).input; int j = 1; while (fireAgain & j <= inputPins.size()) { PinActivation inputPinActivation = this.getPinActivation(inputPins.getValue(j-1)); fireAgain = inputPinActivation.isReady() & inputPinActivation.countUnofferedTokens() > 0; j = j + 1; } if (fireAgain) { this.fire(new TokenList()); } }
Actions taken:
January 20, 2009: received issue
July 23, 2010: closed issue

Issue 13312: Issue: ObjectNodeActivation::offeredTokenCount is not initialized (fuml-ftf)

Click
here for this issue's archive.
Source: Model Driven Solutions (Mr. Ed Seidewitz, ed-s(at)modeldriven.com)
Nature: Uncategorized Issue
Severity:
Summary:
Specification: Semantics of a Foundation Subset for Executable UML Models, FTF � Beta 1 (ptc/08-11-03)    Section: 8.5.2.2.15 (ObjectNodeActivation)         Summary:         The ObjectNodeActivation::offeredTokenCount attribute is never initialized. This is not a problem for Java execution, since Java semantics initializes integer variables to zero by default. But this is not correct per UML execution semantics.         Proposed resolution:         Add an ObjectNodeActivation::run() operation that overrides the inherited operation with the following body:         super.run();    this.offeredTokenCount = 0;         

Resolution: Change the code as proposed
Revised Text: Add an ObjectNodeActivation::run() operation that overrides the inherited operation with the following body: super.run(); this.offeredTokenCount = 0;
Actions taken:
January 20, 2009: received issue
July 23, 2010: closed issue

Issue 13313: Issue: CallActionActivation cannot handle more than one concurrent call (fuml-ftf)

Click
here for this issue's archive.
Source: Model Driven Solutions (Mr. Ed Seidewitz, ed-s(at)modeldriven.com)
Nature: Uncategorized Issue
Severity:
Summary:
Specification: Semantics of a Foundation Subset for Executable UML Models, FTF � Beta 1 (ptc/08-11-03)    Section: 8.6.2.2.2 (CallActionActivation)         Summary:         A call action may fire multiple times concurrently. A call action activation needs to keep track of currently ongoing call executions, so that they can all be terminated if the call action activation is terminated. However, CallActionActivation::callExecution currently has a multiplicity upper bound of 1. Therefore, if a call action fires more than once concurrently, subsequent firings will incorrectly overwrite the reference to the callExecution from the first firing.         Proposed resolution:         Under associations, replace CallActionActivation::callExecution with:         callExecutions: Execution [*]    The set of execution objects for currently ongoing calls made through this call action activation.         At the beginning of CallActionActivation::doAction, replace:         this.callExecution = this.getCallExecution();    if (this.callExecution != null) {         with:         Execution callExecution = this.getCallExecution();    if (callExecution != null) {        this.callExecutions.addValue(callExecution);         Throughout CallActionActivation::doAction, replace with this.callExecution with callExection. At the end of CallActionActivation::doAction, replace:         this.callExecution = null;         with:         this.removeCallExecution(callExecution);         Replace the body of CallActionActivation::terminate with:         // Terminate all call executions (if any), then terminate the call action activation (self).         for (int i = 0; i < this.callExecutions.size(); i++) {        Execution execution = this.callExecutions.getValue(i);        execution.terminate();    }         super.terminate();         Add the following operation:         CallActionActivation::removeCallExecution(execution: Execution)    // Remove the given execution from the current list of call executions.         boolean notFound = true;    int i = 1;    while (notFound & i <= this.callExecutions.size()) {        if (this.callExecutions.getValue(i-1) == execution) {            this.callExecutions.removeValue(i-1);            notFound = false;        }    }       

Resolution: Change the code as proposed
Revised Text: In Subclause 8.6.2.2, under associations, replace CallActionActivation::callExecution with: callExecutions: Execution [*] The set of execution objects for currently ongoing calls made through this call action activation. At the beginning of CallActionActivation::doAction, replace: this.callExecution = this.getCallExecution(); if (this.callExecution != null) { with: Execution callExecution = this.getCallExecution(); if (callExecution != null) { this.callExecutions.addValue(callExecution); Throughout CallActionActivation::doAction, replace with this.callExecution with callExecution. At the end of CallActionActivation::doAction, replace: this.callExecution = null; with: this.removeCallExecution(callExecution); Replace the body of CallActionActivation::terminate with: // Terminate all call executions (if any), then terminate the call action activation (self). for (int i = 0; i < this.callExecutions.size(); i++) { Execution execution = this.callExecutions.getValue(i); execution.terminate(); } super.terminate(); Add the following operation: CallActionActivation::removeCallExecution(execution: Execution) // Remove the given execution from the current list of // call executions. boolean notFound = true; int i = 1; while (notFound & i <= this.callExecutions.size()) { if (this.callExecutions.getValue(i-1) == execution) { this.callExecutions.removeValue(i-1); notFound = false; } }
Actions taken:
January 21, 2009: received issue
July 23, 2010: closed issue

Issue 13314: Issue: The result pin of clear and write structural feature actions can be optional (fuml-ftf)

Click
here for this issue's archive.
Source: Model Driven Solutions (Mr. Ed Seidewitz, ed-s(at)modeldriven.com)
Nature: Uncategorized Issue
Severity:
Summary:
Specification: Semantics of a Foundation Subset for Executable UML Models, FTF � Beta 1 (ptc/08-11-03)  Sections: 8.6.3.2.1 (AddStructuralFeatureValueActionActivation), 8.6.3.2.3 (ClearStructuralFeatureActionActivation), 8.6.3.2.12 (RemoveStructuralFeatureValueActionActivation)     Summary:        UML 2.2 added an optional result pin to clear and write structural feature actions. However, the corresponding activation doAction operations assume the result pins are mandatory. If an action does not have a result pin, an error results.         Proposed resolution:         At the end of the doAction operations for AddStructuralFeatureValueActionActivation, ClearStructuralFeatureActionActivation and RemoveStructuralFeatureValueActionActivation, replace:         this.putToken(action.result, value);         with:         if (action.result != null) {        this.putToken(action.result, value);    }    

Resolution: Change the code as proposed.
Revised Text: At the end of the doAction operations for AddStructuralFeatureValueActionActivation, ClearStructuralFeatureActionActivation and RemoveStructuralFeatureValueActionActivation, replace: this.putToken(action.result, value); with: if (action.result != null) { this.putToken(action.result, value); }
Actions taken:
January 21, 2009: received issue
July 23, 2010: closed issue

Issue 13315: Issue: Bug in ReclassifyObjectActionActivation::doAction (fuml-ftf)

Click
here for this issue's archive.
Source: Model Driven Solutions (Mr. Ed Seidewitz, ed-s(at)modeldriven.com)
Nature: Uncategorized Issue
Severity:
Summary:
Specification: Semantics of a Foundation Subset for Executable UML Models, FTF � Beta 1 (ptc/08-11-03)  Section: 8.6.4.2.5 (ReclassifyObjectActionActivation)     Summary:        In ReclassifyObjectActionActivation::doAction, there is a for loop with loop variable �n�. However, the loop test uses �i� instead of �n�.         Proposed resolution:         Replace:         for (int n = 0; i < newClassifiers.size(); n++) {         with:         for (int n = 0; n < newClassifiers.size(); n++) {       

Resolution: Change the code as proposed.
Revised Text: In ReclassifyObjectActionActivation::doAction, replace: for (int n = 0; i < newClassifiers.size(); n++) { with: for (int n = 0; n < newClassifiers.size(); n++) {
Actions taken:
January 21, 2009: received issue
July 23, 2010: closed issue

Issue 13450: Error in return value of ActivityNodeActivation::removeToken (fuml-ftf)

Click
here for this issue's archive.
Source: Model Driven Solutions (Mr. Ed Seidewitz, ed-s(at)modeldriven.com)
Nature: Uncategorized Issue
Severity:
Summary:
Specification: Semantics of a Foundation Subset for Executable UML Models, FTF � Beta 1 (ptc/08-11-03)  Section: 8.5.2.2.4 ActivityNodeActivation     Summary:         The ActivityNodeActivation::removeToken operation is documented as returning 0 if no token is removed. However, the code does not currently do this.         Proposed Resolution:         At the end of the operation replace:         return i -1;         with:         if (notFound) {        i = 0;    } else {        i = i � 1;        return i;    }       

Resolution: Change the code as proposed.
Revised Text: At the end of ActivityNodeActivation::removeToken replace: return i -1; with: if (notFound) { i = 0; } else { i = i � 1; return i; }
Actions taken:
February 6, 2009: received issue
July 23, 2010: closed issue

Issue 13453: ExecutionFactory::instantiateVisitor should not use Java reflection (fuml-ftf)

Click
here for this issue's archive.
Source: Model Driven Solutions (Mr. Ed Seidewitz, ed-s(at)modeldriven.com)
Nature: Uncategorized Issue
Severity:
Summary:
Specification: Semantics of a Foundation Subset for Executable UML Models, FTF � Beta 1 (ptc/08-11-03)  Section: 8.2.2.2 ExecutionFactory     Summary:         The ExecutionFactory::instantiateVisitor operation currently uses Java reflection to instantiate an appropriate visitor class. However, there is no Annex A mapping for this.         Proposed Resolution:         Remove the �suffix� parameter from the signature for instantiateVisitor and update the calls in ExecutionFactory::createExecution, ExecutionFactory::createEvaluation and ActivityNodeActivationGroup::createNodeActivation to remove the corresponding second argument. Replace the body of instantiateVistor with:         // Instantiate a visitor object for the given element.         SemanticVisitor visitor = null;         if (element instanceof fUML.Syntax.Classes.Kernel.LiteralBoolean) {      visitor = new fUML.Semantics.Classes.Kernel.LiteralBooleanEvaluation();    }         if (element instanceof fUML.Syntax.Classes.Kernel.LiteralString) {      visitor = new fUML.Semantics.Classes.Kernel.LiteralStringEvaluation();    }         if (element instanceof fUML.Syntax.Classes.Kernel.LiteralNull) {      visitor = new fUML.Semantics.Classes.Kernel.LiteralNullEvaluation();    }         if (element instanceof fUML.Syntax.Classes.Kernel.InstanceValue) {      visitor = new fUML.Semantics.Classes.Kernel.InstanceValueEvaluation();    }         if (element instanceof fUML.Syntax.Classes.Kernel.LiteralUnlimitedNatural) {      visitor = new fUML.Semantics.Classes.Kernel.LiteralUnlimitedNaturalEvaluation();    }         if (element instanceof fUML.Syntax.Classes.Kernel.LiteralInteger) {      visitor = new fUML.Semantics.Classes.Kernel.LiteralIntegerEvaluation();    }         if (element instanceof fUML.Syntax.Activities.IntermediateActivities.Activity) {      visitor = new fUML.Semantics.Activities.IntermediateActivities.ActivityExecution();    }         if (element instanceof fUML.Syntax.Actions.BasicActions.OutputPin) {      visitor = new fUML.Semantics.Actions.BasicActions.OutputPinActivation();    }         if (element instanceof fUML.Syntax.Actions.BasicActions.InputPin) {      visitor = new fUML.Semantics.Actions.BasicActions.InputPinActivation();    }         if (element instanceof fUML.Syntax.Actions.CompleteActions.StartClassifierBehaviorAction) {      visitor = new fUML.Semantics.Actions.CompleteActions.StartClassifierBehaviorActionActivation();    }         if (element instanceof fUML.Syntax.Actions.IntermediateActions.ReadStructuralFeatureAction) {      visitor = new fUML.Semantics.Actions.IntermediateActions.ReadStructuralFeatureActionActivation();    }         if (element instanceof fUML.Syntax.Activities.CompleteStructuredActivities.ConditionalNode) {      visitor = new fUML.Semantics.Activities.CompleteStructuredActivities.ConditionalNodeActivation();    }         if (element instanceof fUML.Syntax.Actions.IntermediateActions.ReadSelfAction) {      visitor = new fUML.Semantics.Actions.IntermediateActions.ReadSelfActionActivation();    }         if (element instanceof fUML.Syntax.Actions.IntermediateActions.DestroyLinkAction) {      visitor = new fUML.Semantics.Actions.IntermediateActions.DestroyLinkActionActivation();    }         if (element instanceof fUML.Syntax.Activities.CompleteStructuredActivities.StructuredActivityNode) {      visitor = new fUML.Semantics.Activities.CompleteStructuredActivities.StructuredActivityNodeActivation();    }         if (element instanceof fUML.Syntax.Actions.BasicActions.SendSignalAction) {      visitor = new fUML.Semantics.Actions.BasicActions.SendSignalActionActivation();    }         if (element instanceof fUML.Syntax.Activities.ExtraStructuredActivities.ExpansionNode) {      visitor = new fUML.Semantics.Activities.ExtraStructuredActivities.ExpansionNodeActivation();    }         if (element instanceof fUML.Syntax.Actions.IntermediateActions.CreateObjectAction) {      visitor = new fUML.Semantics.Actions.IntermediateActions.CreateObjectActionActivation();    }         if (element instanceof fUML.Syntax.Actions.IntermediateActions.ReadLinkAction) {      visitor = new fUML.Semantics.Actions.IntermediateActions.ReadLinkActionActivation();    }         if (element instanceof fUML.Syntax.Actions.IntermediateActions.ClearAssociationAction) {      visitor = new fUML.Semantics.Actions.IntermediateActions.ClearAssociationActionActivation();    }         if (element instanceof fUML.Syntax.Activities.IntermediateActivities.JoinNode) {      visitor = new fUML.Semantics.Activities.IntermediateActivities.JoinNodeActivation();    }         if (element instanceof fUML.Syntax.Actions.CompleteActions.ReclassifyObjectAction) {      visitor = new fUML.Semantics.Actions.CompleteActions.ReclassifyObjectActionActivation();    }         if (element instanceof fUML.Syntax.Activities.IntermediateActivities.InitialNode) {      visitor = new fUML.Semantics.Activities.IntermediateActivities.InitialNodeActivation();    }         if (element instanceof fUML.Syntax.Actions.CompleteActions.StartObjectBehaviorAction) {      visitor = new fUML.Semantics.Actions.CompleteActions.StartObjectBehaviorActionActivation();    }         if (element instanceof fUML.Syntax.Actions.CompleteActions.ReadIsClassifiedObjectAction) {      visitor = new fUML.Semantics.Actions.CompleteActions.ReadIsClassifiedObjectActionActivation();    }         if (element instanceof fUML.Syntax.Actions.BasicActions.CallOperationAction) {      visitor = new fUML.Semantics.Actions.BasicActions.CallOperationActionActivation();    }         if (element instanceof fUML.Syntax.Actions.BasicActions.CallBehaviorAction) {      visitor = new fUML.Semantics.Actions.BasicActions.CallBehaviorActionActivation();    }         if (element instanceof fUML.Syntax.Activities.ExtraStructuredActivities.ExpansionRegion) {      visitor = new fUML.Semantics.Activities.ExtraStructuredActivities.ExpansionRegionActivation();    }         if (element instanceof fUML.Syntax.Actions.IntermediateActions.AddStructuralFeatureValueAction) {      visitor = new fUML.Semantics.Actions.IntermediateActions.AddStructuralFeatureValueActionActivation();    }         if (element instanceof fUML.Syntax.Activities.IntermediateActivities.ActivityParameterNode) {      visitor = new fUML.Semantics.Activities.IntermediateActivities.ActivityParameterNodeActivation();    }         if (element instanceof fUML.Syntax.Actions.IntermediateActions.ValueSpecificationAction) {      visitor = new fUML.Semantics.Actions.IntermediateActions.ValueSpecificationActionActivation();    }         if (element instanceof fUML.Syntax.Activities.IntermediateActivities.ActivityFinalNode) {      visitor = new fUML.Semantics.Activities.IntermediateActivities.ActivityFinalNodeActivation();    }         if (element instanceof fUML.Syntax.Activities.IntermediateActivities.ForkNode) {      visitor = new fUML.Semantics.Activities.IntermediateActivities.ForkNodeActivation();    }         if (element instanceof fUML.Syntax.Actions.CompleteActions.AcceptEventAction) {      visitor = new fUML.Semantics.Actions.CompleteActions.AcceptEventActionActivation();    }         if (element instanceof fUML.Syntax.Activities.CompleteStructuredActivities.LoopNode) {      visitor = new fUML.Semantics.Activities.CompleteStructuredActivities.LoopNodeActivation();    }         if (element instanceof fUML.Syntax.Activities.IntermediateActivities.DecisionNode) {      visitor = new fUML.Semantics.Activities.IntermediateActivities.DecisionNodeActivation();    }         if (element instanceof fUML.Syntax.Actions.CompleteActions.ReduceAction) {      visitor = new fUML.Semantics.Actions.CompleteActions.ReduceActionActivation();    }         if (element instanceof fUML.Syntax.Actions.IntermediateActions.DestroyObjectAction) {      visitor = new fUML.Semantics.Actions.IntermediateActions.DestroyObjectActionActivation();    }         if (element instanceof fUML.Syntax.Actions.IntermediateActions.ClearStructuralFeatureAction) {      visitor = new fUML.Semantics.Actions.IntermediateActions.ClearStructuralFeatureActionActivation();    }         if (element instanceof fUML.Syntax.Actions.IntermediateActions.TestIdentityAction) {      visitor = new fUML.Semantics.Actions.IntermediateActions.TestIdentityActionActivation();    }         if (element instanceof fUML.Syntax.Actions.IntermediateActions.CreateLinkAction) {      visitor = new fUML.Semantics.Actions.IntermediateActions.CreateLinkActionActivation();    }         if (element instanceof fUML.Syntax.Actions.IntermediateActions.RemoveStructuralFeatureValueAction) {      visitor = new fUML.Semantics.Actions.IntermediateActions.RemoveStructuralFeatureValueActionActivation();    }         if (element instanceof fUML.Syntax.Activities.IntermediateActivities.MergeNode) {      visitor = new fUML.Semantics.Activities.IntermediateActivities.MergeNodeActivation();    }         if (element instanceof fUML.Syntax.Actions.CompleteActions.ReadExtentAction) {      visitor = new fUML.Semantics.Actions.CompleteActions.ReadExtentActionActivation();    }         return visitor;       

Resolution: The proposed resolution will only work at conformance level 3 (L3). That is because it references classes that are not available at lower conformance levels. Accommodating all three conformance levels requires having a different instantiateVistor implementation for each level. This can be achieved by making ExecutionFactory abstract and added three concrete subclasses, one for each conformance level, each of which appropriately overrides instantiateVisitor. Then an execution environment can be set up for the appropriate conformance level by using an instance of the correct ExecutionFactory subclass for that level.
Revised Text: In Subclause 2.1 Conformance Levels: � In the last bullet on page 2 and in the following paragraph, replace "Loci" with "Loci::LociL1". � At the end of the list of bullets on page 3, add a bullet "Loci::LociL2 (semantics only)". � At the end of the list of bullets on page 4, add a bullet "Loci::LociL3 (semantics only)". � Replace the figures with the diagrams given below: Figure 2 - fUML Semantics Level 1 Package Merges Figure 4 - fUML Semantics Level 2 Package Merges Figure 6 - fUML Semantics Level 3 Package Merges In Subclause 8.2.1 Overview: � Replace the first paragraph with: The Loci package includes the model of the key concepts of an execution locus and of the executor that provides the abstract external interface of the execution model. The package has three subpackages corresponding to the three fUML conformance levels (see Subclause 2.1). The subpackage LociL1 contains the majority of the classes. The subpackages LociL2 and LociL3 each contain only a single class, specialized execution factories that are used to instantiate semantic visitor classes corresponding to executable syntactic elements at the corresponding conformance levels (the concept of semantic visitors is discussed in Subclause 8.2.2.1 below). Figure 51 shows the dependencies of the Loci packages on other packages. � Replace the figure with: Figure 51 - Loci Semantics Packages � After Figure 51, before the heading "The Executor and the Execution Locus", add: 8.2.2 LociL1 8.2.2.1 Overview The LociL1 package contains the majority of the model related to execution loci (see Figure 52). It also includes an execution factory for instantiating semantic visitors for executable syntactic elements at fUML conformance level 1. The execution factory is extended for conformance levels 2 and 3 in the packages LociL2 and LociL3 (see Subclauses 8.2.3 and 8.2.4). � At the end of the section on "Visitor Classes and the Execution Factory", before the heading "Strategy Classes and Semantic Variation Points", add the paragraph: All three types of visitor classes are ultimately instantiated using the instantiateVisitor operation of the ExecutionFactory class. This operation is actually abstract in the ExecutionFactory base class, with concrete methods for it provided in subclasses of ExecutionFactory. The LociL1 package includes the concrete ExecutionFactoryL1 class, which provides a method for instantiateVisitor that only handles the instantiation of visitors for the relevant syntactic elements found at fUML Conformance Level 1. Further extensions for higher conformance levels are provided in packages LociL2 and LociL3 (see Subclauses 8.2.3 and 8.2.4). In Figure 52, show the class ExecutionFactory and its operation instantiateVistor as being abstract (italicized). Add the following figure: Figure 53 Execution Factory for L1 Renumber Subclause 8.2.2 Class Descriptions as 8.2.2.2, and renumber its subclauses correspondingly. In (renumbered) Subclause 8.2.2.2.2 ExecutionFactory: � In the operation createEvaluation, replace the first statement with: Evaluation evaluation = (Evaluation)this.instantiateVisitor(specification); � In the operation createExecution, replace the statement: execution = (Execution)(this.instantiateVisitor(behavior, "Execution")); with: execution = (Execution)this.instantiateVisitor(behavior); � Replace the operation instantiateVistor(in element: Element, in suffix: String): SemanticVisitor with: [9] instantiateVisitor(in element: Element): SemanticVisitor Instantiate a visitor object for the given element. Add the following subclause: 8.2.2.2.3 ExecutionFactoryL1 An execution factory is used to create objects that represent the execution of a behavior, the evaluation of a value specification or the activation of an activity node. This class only handles elements available at Conformance Level 1. Generalizations ExecutionFactory Attributes None Associations None Operations [1] instantiateVisitor(in element: Element): SemanticVisitor // Instantiate a visitor object for the given element (at Conformance Level 1) SemanticVisitor visitor = null; if (element instanceof LiteralBoolean) { visitor = new LiteralBooleanEvaluation(); } else if (element instanceof fUML.Syntax.Classes.Kernel.LiteralString) { visitor = new LiteralStringEvaluation(); } else if (element instanceof fUML.Syntax.Classes.Kernel.LiteralNull) { visitor = new LiteralNullEvaluation(); } else if (element instanceof fUML.Syntax.Classes.Kernel.InstanceValue) { visitor = new InstanceValueEvaluation(); } else if (element instanceof fUML.Syntax.Classes.Kernel.LiteralUnlimitedNatural) { visitor = new LiteralUnlimitedNaturalEvaluation(); } else if (element instanceof fUML.Syntax.Classes.Kernel.LiteralInteger) { visitor = new LiteralIntegerEvaluation(); } return visitor; After the (renumbered) Subclause 8.2.2.2, add the following subclauses: 8.2.3 LociL2 8.2.3.1 Overview As shown in Figure 54, the LociL2 package contains the class ExecutionFactoryL2, which provides for the instantiation of semantic visitors for all appropriate syntactic elements at Conformance Level 2. Figure 54 - Execution Factory for L2 8.2.3.2 Class Descriptions 8.2.3.2.1 ExecutionFactoryL2 An execution factory is used to create objects that represent the execution of a behavior, the evaluation of a value specification or the activation of an activity node. This class only handles elements available at Conformance Level 2. Generalizations ExecutionFactoryL1 Attributes None Associations None Operations [1] instantiateVisitor(in element: Element): SemanticVisitor // Instantiate a visitor object for the given element (at Conformance Level 2) SemanticVisitor visitor = null; if (element instanceof Activity) { visitor = new ActivityExecution(); } else if (element instanceof ActivityParameterNode) { visitor = new ActivityParameterNodeActivation(); } else if (element instanceof InitialNode) { visitor = new InitialNodeActivation(); } else if (element instanceof ActivityFinalNode) { visitor = new ActivityFinalNodeActivation(); } else if (element instanceof JoinNode) { visitor = new JoinNodeActivation(); } else if (element instanceof MergeNode) { visitor = new MergeNodeActivation(); } else if (element instanceof ForkNode) { visitor = new ForkNodeActivation(); } else if (element instanceof DecisionNode) { visitor = new DecisionNodeActivation(); } else if (element instanceof InputPin) { visitor = new InputPinActivation(); } else if (element instanceof OutputPin) { visitor = new OutputPinActivation(); } else if (element instanceof CallBehaviorAction) { visitor = new CallBehaviorActionActivation(); } else if (element instanceof CallOperationAction) { visitor = new CallOperationActionActivation(); } else if (element instanceof SendSignalAction) { visitor = new SendSignalActionActivation(); } else if (element instanceof ReadSelfAction) { visitor = new ReadSelfActionActivation(); } else if (element instanceof TestIdentityAction) { visitor = new TestIdentityActionActivation(); } else if (element instanceof ValueSpecificationAction) { visitor = new ValueSpecificationActionActivation(); } else if (element instanceof CreateObjectAction) { visitor = new CreateObjectActionActivation(); } else if (element instanceof DestroyObjectAction) { visitor = new DestroyObjectActionActivation(); } else if (element instanceof ReadStructuralFeatureAction) { visitor = new ReadStructuralFeatureActionActivation(); } else if (element instanceof ClearStructuralFeatureAction) { visitor = new ClearStructuralFeatureActionActivation(); } else if (element instanceof AddStructuralFeatureValueAction) { visitor = new AddStructuralFeatureValueActionActivation(); } else if (element instanceof RemoveStructuralFeatureValueAction) { visitor = new RemoveStructuralFeatureValueActionActivation(); } else if (element instanceof ReadLinkAction) { visitor = new ReadLinkActionActivation(); } else if (element instanceof ClearAssociationAction) { visitor = new ClearAssociationActionActivation(); } else if (element instanceof CreateLinkAction) { visitor = new CreateLinkActionActivation(); } else if (element instanceof DestroyLinkAction) { visitor = new DestroyLinkActionActivation(); } else { visitor = super.instantiateVisitor(element); } return visitor; 8.2.4 LociL3 8.2.4.1 Overview As shown in Figure 55, the LociL3 package contains the class ExecutionFactoryL3, which provides for the instantiation of semantic visitors for all appropriate syntactic elements at Conformance Level 3. Figure 55 - Execution Factory for L3 8.2.4.2 Class Descriptions 8.2.4.2.1 ExecutionFactoryL3 An execution factory is used to create objects that represent the execution of a behavior, the evaluation of a value specification or the activation of an activity node. This class only handles elements available at Conformance Level 3. Generalizations ExecutionFactoryL2 Attributes None Associations None Operations [1] instantiateVisitor(in element: Element): SemanticVisitor // Instantiate a visitor object for the given element (at Conformance Level 3) SemanticVisitor visitor = null; if (element instanceof ConditionalNode) { visitor = new ConditionalNodeActivation(); } else if (element instanceof LoopNode) { visitor = new LoopNodeActivation(); } else if (element instanceof ExpansionRegion) { visitor = new ExpansionRegionActivation(); } // Note: Since ConditionalNode, LoopNode and ExpansionRegion are subclasses of // StructuredActivityNode, element must be tested against the three subclasses before // the superclass else if (element instanceof StructuredActivityNode) { visitor = new StructuredActivityNodeActivation(); } else if (element instanceof ExpansionNode) { visitor = new ExpansionNodeActivation(); } else if (element instanceof ReadExtentAction) { visitor = new ReadExtentActionActivation(); } else if (element instanceof ReadIsClassifiedObjectAction) { visitor = new ReadIsClassifiedObjectActionActivation(); } else if (element instanceof ReclassifyObjectAction) { visitor = new ReclassifyObjectActionActivation(); } else if (element instanceof StartObjectBehaviorAction) { visitor = new StartObjectBehaviorActionActivation(); } else if (element instanceof StartClassifierBehaviorAction) { visitor = new StartClassifierBehaviorActionActivation(); } else if (element instanceof AcceptEventAction) { visitor = new AcceptEventActionActivation(); } else if (element instanceof ReduceAction) { visitor = new ReduceActionActivation(); } else { visitor = super.instantiateVisitor(element); } return visitor;
Actions taken:
February 6, 2009: received issue
July 23, 2010: closed issue

Issue 13454: ExecutionFactory::getStrategy doesn't follow conventions (fuml-ftf)

Click
here for this issue's archive.
Source: Model Driven Solutions (Mr. Ed Seidewitz, ed-s(at)modeldriven.com)
Nature: Uncategorized Issue
Severity:
Summary:
Specification: Semantics of a Foundation Subset for Executable UML Models, FTF � Beta 1 (ptc/08-11-03)  Section: 8.2.2.2 ExecutionFactory     Summary:        The ExecutionFactory::getStrategy operation does not initialize the strategy variable, as required by Annex A.3.3.         Proposed Resolution:         Replace the body of getStrategy with:         // Get the strategy with the given name.         int i = this.getStrategyIndex(name);         SemanticStrategy strategy = null;    if (i <= this.strategies.size()) {        strategy = this.strategies.getValue(i-1);    }         return strategy;       

Resolution: Change the code as proposed.
Revised Text: Replace the body of ExecutionFactory::getStrategy with: // Get the strategy with the given name. int i = this.getStrategyIndex(name); SemanticStrategy strategy = null; if (i <= this.strategies.size()) { strategy = this.strategies.getValue(i-1); } return strategy;
Actions taken:
February 6, 2009: received issue
July 23, 2010: closed issue

Issue 13455: BooleanValue::toString uses Java String.valueOf (fuml-ftf)

Click
here for this issue's archive.
Source: Model Driven Solutions (Mr. Ed Seidewitz, ed-s(at)modeldriven.com)
Nature: Uncategorized Issue
Severity:
Summary:
Specification: Semantics of a Foundation Subset for Executable UML Models, FTF � Beta 1 (ptc/08-11-03)  Section: 8.3.2.2.1 BooleanValue     Summary:         The BooleanValue::toString operation uses the Java String.valueOf operation, which has no Annex A mapping.         Proposed Resolution:         Replace the body of the toString operation with:         String stringValue = "false";         if (this.value) {      stringValue = "true";    }         return stringValue;       

Resolution: Change the code as proposed.
Revised Text: Replace the body of the BooleanValue::toString operation with: String stringValue = "false"; if (this.value) { stringValue = "true"; } return stringValue;
Actions taken:
February 6, 2009: received issue
July 23, 2010: closed issue

Issue 13456: CompoundValue::equals does not conform to Annex A conventions (fuml-ftf)

Click
here for this issue's archive.
Source: Model Driven Solutions (Mr. Ed Seidewitz, ed-s(at)modeldriven.com)
Nature: Uncategorized Issue
Severity:
Summary:
Specification: Semantics of a Foundation Subset for Executable UML Models, FTF � Beta 1 (ptc/08-11-03)  Section: 8.3.2.2.2 CompoundValue     Summary:         The CompoundValue::equals operation has more than one return statement and uses the �&&�. These are not allowed by the conventions of Annex A.         Proposed Resolution:         Replace the body of the equals operation with:         boolean isEqual = otherValue instanceof CompoundValue;          if (isEqual) {             CompoundValue otherCompoundValue = (CompoundValue)otherValue;        // Debug.println("[equals] " + this.featureValues.size() + " feature(s).");             isEqual = super.equals(otherValue) & otherCompoundValue.featureValues.size() == this.featureValues.size();             int i = 1;        while (isEqual & i <= this.featureValues.size()) {            FeatureValue thisFeatureValue = this.featureValues.getValue(i-1);                 boolean matched = false;            int j = 1;            while (!matched & j <= otherCompoundValue.featureValues.size()) {                FeatureValue otherFeatureValue = otherCompoundValue.featureValues.getValue(j-1);                if (thisFeatureValue.feature == otherFeatureValue.feature) {                    matched = thisFeatureValue.hasEqualValues(otherFeatureValue);                }                j = j + 1;            }                 isEqual = matched;            i = i + 1;        }    }         return isEqual;       

Resolution: Change the code as proposed
Revised Text: Replace the body of the CompoundValue::equals operation with: boolean isEqual = otherValue instanceof CompoundValue; if (isEqual) { CompoundValue otherCompoundValue = (CompoundValue)otherValue; // Debug.println("[equals] " + this.featureValues.size() + " feature(s)."); isEqual = super.equals(otherValue) & otherCompoundValue.featureValues.size() == this.featureValues.size(); int i = 1; while (isEqual & i <= this.featureValues.size()) { FeatureValue thisFeatureValue = this.featureValues.getValue(i-1); boolean matched = false; int j = 1; while (!matched & j <= otherCompoundValue.featureValues.size()) { FeatureValue otherFeatureValue = otherCompoundValue.featureValues.getValue(j-1); if (thisFeatureValue.feature == otherFeatureValue.feature) { matched = thisFeatureValue.hasEqualValues(otherFeatureValue); } j = j + 1; } isEqual = matched; i = i + 1; } }
Actions taken:
February 6, 2009: received issue
July 23, 2010: closed issue

Issue 13457: EnumerationValue::specify missing a "this" (fuml-ftf)

Click
here for this issue's archive.
Source: Model Driven Solutions (Mr. Ed Seidewitz, ed-s(at)modeldriven.com)
Nature: Uncategorized Issue
Severity:
Summary:
Specification: Semantics of a Foundation Subset for Executable UML Models, FTF � Beta 1 (ptc/08-11-03)  Section: 8.3.2.2.5 EnumerationValue     Summary:         The EnumerationValue::specify operation includes a reference to the �literal� field without prefacing it with �this�. This is not allowed by the conventions of Annex A.         Proposed Resolution:         Replace the reference to �literal� with �this.literal�.    

Resolution: Change the code as proposed.
Revised Text: In EnumerationValue::specify, replace the reference to �literal� with �this.literal�.
Actions taken:
February 6, 2009: received issue
July 23, 2010: closed issue

Discussion:
  


Issue 13458: FeatureValue::hasEqualValues does not follow Annex A conventions (fuml-ftf)

Click
here for this issue's archive.
Source: Model Driven Solutions (Mr. Ed Seidewitz, ed-s(at)modeldriven.com)
Nature: Uncategorized Issue
Severity:
Summary:
Specification: Semantics of a Foundation Subset for Executable UML Models, FTF � Beta 1 (ptc/08-11-03)  Section: 8.3.2.2.8 FeatureValue     Summary:         The operation FeatureValue::hasEqualValues uses the remove operation on a local list variable. This is not allowed by the conventions of Annex A.         Proposed Resolution:         Rather than introducing a special class as a �ValueList holder�, a local instance of FeatureValue can be used for this purpose.         Replace:         ValueList otherValues = new ValueList();         with:         FeatureValue otherFeatureValues = new FeatureValue();         In subsequent code, replace all references to �otherValues� with �otherFeatureValues.values�.              

Resolution: Change the code as proposed
Revised Text: In FeatureValue::hasEqualValues, replace: ValueList otherValues = new ValueList(); with: FeatureValue otherFeatureValues = new FeatureValue(); In subsequent code, replace all references to �otherValues� with �otherFeatureValues.values�.
Actions taken:
February 7, 2009: received issue
July 23, 2010: closed issue

Issue 13459: InstanceValueEvaluation::evaluate does not initialize local variables (fuml-ftf)

Click
here for this issue's archive.
Source: Model Driven Solutions (Mr. Ed Seidewitz, ed-s(at)modeldriven.com)
Nature: Uncategorized Issue
Severity:
Summary:
Specification: Semantics of a Foundation Subset for Executable UML Models, FTF � Beta 1 (ptc/08-11-03)  Section: 8.3.2.2.9 InstanceValueEvaluation       Summary:         The operation InstanceValueEvaluation::evaluate does not initialize the local variables structuredValue and object, as required by the conventions of Annex A.         Proposed Resolution:         In the declarations for structuredValue and object, add the initialization code �= null�.    

Resolution: Change the code as proposed.
Revised Text: In the method for the operation InstanceValueEvaluation::evaluate, in the declarations for structuredValue and object, add the initialization code �= null�.
Actions taken:
February 7, 2009: received issue
July 23, 2010: closed issue

Issue 13460: IntegerValue::toString uses Java String.valueOf (fuml-ftf)

Click
here for this issue's archive.
Source: Model Driven Solutions (Mr. Ed Seidewitz, ed-s(at)modeldriven.com)
Nature: Uncategorized Issue
Severity:
Summary:
Specification: Semantics of a Foundation Subset for Executable UML Models, FTF � Beta 1 (ptc/08-11-03)  Section: 8.3.2.2.10 IntegerValue     Summary:         The IntegerValue::toString operation uses the Java String.valueOf operation, which has no Annex A mapping.         Proposed Resolution:         Replace the body of the toString operation with:         String stringValue = "";         if (this.value == 0) {        stringValue = "0";    } else {        int positiveValue = this.value;             if (positiveValue < 0) {          positiveValue = -positiveValue;        }             do {            int digit = positiveValue % 10;                 if (digit == 0) {                stringValue = "0" + stringValue;            } else if (digit == 1) {                stringValue = "1" + stringValue;            } else if (digit == 2) {                stringValue = "2" + stringValue;            } else if (digit == 3) {                stringValue = "3" + stringValue;            } else if (digit == 4) {                stringValue = "4" + stringValue;            } else if (digit == 5) {                stringValue = "5" + stringValue;            } else if (digit == 6) {                stringValue = "6" + stringValue;            } else if (digit == 7) {                stringValue = "7" + stringValue;            } else if (digit == 8) {                stringValue = "8" + stringValue;            } else if (digit == 9) {                stringValue = "9" + stringValue;            }                 positiveValue = positiveValue / 10;        } while (positiveValue > 0);             if (this.value < 0) {            stringValue = "-" + stringValue;        }    }         return stringValue;            

Resolution: Change the code as proposed
Revised Text: Replace the body of the IntegerValue::toString operation with: String stringValue = ""; if (this.value == 0) { stringValue = "0"; } else { int positiveValue = this.value; if (positiveValue < 0) { positiveValue = -positiveValue; } do { int digit = positiveValue % 10; if (digit == 0) { stringValue = "0" + stringValue; } else if (digit == 1) { stringValue = "1" + stringValue; } else if (digit == 2) { stringValue = "2" + stringValue; } else if (digit == 3) { stringValue = "3" + stringValue; } else if (digit == 4) { stringValue = "4" + stringValue; } else if (digit == 5) { stringValue = "5" + stringValue; } else if (digit == 6) { stringValue = "6" + stringValue; } else if (digit == 7) { stringValue = "7" + stringValue; } else if (digit == 8) { stringValue = "8" + stringValue; } else if (digit == 9) { stringValue = "9" + stringValue; } positiveValue = positiveValue / 10; } while (positiveValue > 0); if (this.value < 0) { stringValue = "-" + stringValue; } }
Actions taken:
February 7, 2009: received issue
July 23, 2010: closed issue

Discussion:
  


Issue 13461: Link::getTypes does not initialize a local variable (fuml-ftf)

Click
here for this issue's archive.
Source: Model Driven Solutions (Mr. Ed Seidewitz, ed-s(at)modeldriven.com)
Nature: Uncategorized Issue
Severity:
Summary:
Specification: Semantics of a Foundation Subset for Executable UML Models, FTF � Beta 1 (ptc/08-11-03)  Section: 8.3.2.2.11 Link       Summary:         The operation Link::getTypes does not initialize the local variable types, as required by the conventions of Annex A.         Proposed Resolution:         In the declaration for typest, add the initialization code �= null�.    

Resolution: Change the code as proposed.
Revised Text: In the method for the operation Link::getTypes, in the declaration for types, add the initialization code �= null�.
Actions taken:
February 7, 2009: received issue
July 23, 2010: closed issue

Issue 13462: UnlimitedNaturalValue::toString does not follow Annex A conventions (fuml-ftf)

Click
here for this issue's archive.
Source: Model Driven Solutions (Mr. Ed Seidewitz, ed-s(at)modeldriven.com)
Nature: Uncategorized Issue
Severity:
Summary:
Specification: Semantics of a Foundation Subset for Executable UML Models, FTF � Beta 1 (ptc/08-11-03)  Section: 8.3.2.2.24 UnlimitedNaturalValue     Summary:         The UnlimitedNaturalValue::toString operation has multiple return statements and uses the Java String.valueOf operation, which do not follow Annex A conventions.         Proposed Resolution:         Replace the body of the toString operation with:         String stringValue = "*";         if (this.value.naturalValue >= 0) {        IntegerValue integerValue = new IntegerValue();        integerValue.value = this.value.naturalValue;        stringValue = integerValue.toString();    }         return stringValue;  

Resolution: Change the code as proposed.
Revised Text: Replace the body of the UnlimitedNaturalValue::toString operation with: String stringValue = "*"; if (this.value.naturalValue >= 0) { IntegerValue integerValue = new IntegerValue(); integerValue.value = this.value.naturalValue; stringValue = integerValue.toString(); return stringValue;
Actions taken:
February 7, 2009: received issue
July 23, 2010: closed issue

Issue 13463: ActionActivation::isSourceFor does not initialize a local variable (fuml-ftf)

Click
here for this issue's archive.
Source: Model Driven Solutions (Mr. Ed Seidewitz, ed-s(at)modeldriven.com)
Nature: Uncategorized Issue
Severity:
Summary:
Specification: Semantics of a Foundation Subset for Executable UML Models, FTF � Beta 1 (ptc/08-11-03)  Section: 8.6.2.2.1 ActionActivation       Summary:         The operation ActionActivation::isSourceFor does not initialize the local variable isSource, as required by the conventions of Annex A.         Proposed Resolution:         Replace the body of isSourceFor with:         // If this action has an outgoing fork node, check that the fork node is the source of the given edge instance.         boolean isSource = false;    if (this.outgoingEdges.size() > 0) {        isSource = this.outgoingEdges.getValue(0).target.isSourceFor(edgeInstance);    }         return isSource;    

Resolution: Change the code as proposed.
Revised Text: Replace the body of ActionActivation::isSourceFor with: // If this action has an outgoing fork node, check that the fork node is the source // of the given edge instance. boolean isSource = false; if (this.outgoingEdges.size() > 0) { isSource = this.outgoingEdges.getValue(0).target.isSourceFor(edgeInstance); } return isSource;
Actions taken:
February 7, 2009: received issue
July 23, 2010: closed issue

Issue 13464: LoopNodeActivation::doStructuredActivity uses a Java array (fuml-ftf)

Click
here for this issue's archive.
Source: Model Driven Solutions (Mr. Ed Seidewitz, ed-s(at)modeldriven.com)
Nature: Uncategorized Issue
Severity:
Summary:
Specification: Semantics of a Foundation Subset for Executable UML Models, FTF � Beta 1 (ptc/08-11-03)  Section: 8.5.3.2.3 LoopNodeActivation     Summary:         The operation LoopNodeActivation::doStructuredActivity uses a Java array, which has no mapping in Annex A.         Proposed Resolution:         Add a class Values to the package Semantics::Activities::CompleteStructuredActivities that has a property values: Semantics::Classes::Kernel::Value[*]. Then add a property bodyValueLists: Values[*] to LoopNodeActivation, which can be used in place of the local array variable.         In the body of doStructuredActivity, within the statement �if (continuing) { � }�, replace the code with:                 this.activationGroup.terminateAll();                 this.bodyOutputLists.clear();                 OutputPinList bodyOutputs = loopNode.bodyOutput;            for (int i = 0; i < bodyOutputs.size(); i++) {                OutputPin bodyOutput = bodyOutputs.getValue(i);                Values bodyOutputList = new Values();                bodyOutputList.values = this.getPinValues(bodyOutput);                this.bodyOutputLists.addValue(bodyOutputList);            }                 this.runLoopVariables();                 for (int i = 0; i < loopVariables.size(); i++) {                OutputPin loopVariable = loopVariables.getValue(i);                Values bodyOutputList = this.bodyOutputLists.getValue(i);                ValueList values = bodyOutputList.values;                this.putPinValues(loopVariable, values);            }         

Resolution: Change the code as proposed
Revised Text: Add a class Values to the package Semantics::Activities::CompleteStructuredActivities that has a property values: Semantics::Classes::Kernel::Value[*]. Then add a property bodyValueLists: Values[*] to LoopNodeActivation, which can be used in place of the local array variable. In the body of doStructuredActivity, within the statement �if (continuing) { � }�, replace the code with: this.activationGroup.terminateAll(); this.bodyOutputLists.clear(); OutputPinList bodyOutputs = loopNode.bodyOutput; for (int i = 0; i < bodyOutputs.size(); i++) { OutputPin bodyOutput = bodyOutputs.getValue(i); Values bodyOutputList = new Values(); bodyOutputList.values = this.getPinValues(bodyOutput); this.bodyOutputLists.addValue(bodyOutputList); } this.runLoopVariables(); for (int i = 0; i < loopVariables.size(); i++) { OutputPin loopVariable = loopVariables.getValue(i); Values bodyOutputList = this.bodyOutputLists.getValue(i); ValueList values = bodyOutputList.values; this.putPinValues(loopVariable, values); }
Actions taken:
February 7, 2009: received issue
July 23, 2010: closed issue

Issue 13504: Event should be a specialization of PackageableElement (fuml-ftf)

Click
here for this issue's archive.
Source: Model Driven Solutions (Mr. Ed Seidewitz, ed-s(at)modeldriven.com)
Nature: Uncategorized Issue
Severity:
Summary:
Specification: Semantics of a Foundation Subset for Executable UML Models, FTF � Beta 1 (ptc/08-11-03)  Section: 7.3.3.2.1 Event     Summary:         Event should have PackageableElement as a generalization (as it does in the full UML2 specification). Otherwise, it is not possible to contain an event anywhere within a model.         

Resolution: Event should, indeed, have PackageableElement as a generalization
Revised Text: see page 34 of OMG document ptc/2009-10-02
Actions taken:
February 16, 2009: received issue
July 23, 2010: closed issue

Issue 13509: [FUML] 7.4.2.2.14 ObjectFlow (fuml-ftf)

Click
here for this issue's archive.
Source: NASA (Dr. Nicolas F. Rouquette, nicolas.f.rouquette(at)jpl.nasa.gov)
Nature: Uncategorized Issue
Severity:
Summary:
Specification: Semantics of a Foundation Subset for Executable UML Models, FTF � Beta 1 (ptc/08-11-03)    Section: 7.4.2.2.14 (ObjectFlow)         Summary:         As shown in Fig. 12.14 of the UML 2.2 Beta1 specification, an ObjectFlow can have two optional behaviors,     a transformation and a selection. No such behaviors are supported in the fUML subset.         Proposed resolution:         Add a second OCL constraint on ObjectFlow:         [2] ObjectFlow::no_transformation_or_selection_behavior()    -- An ObjectFlow cannot have a transformation or a selection behavior in the fUML subset.    self.transformation->isEmpty() and self.selection->isEmpty()         

Resolution: The transformation and selection properties of ObjectFlow are only introduced at the level of CompleteActivities. And, per Subclause 7.4.1 of the fUML spec, �The UML 2 Superstructure package CompleteActivities is excluded in its entirety from fUML�. Since transformation and selection are association ends, their associations simply do not appear in the fUML subset, so no constraints are necessary. Of course, the isMulticase and isMultireceive attributes on ObjectFlow are also only in CompleteActivities, but they still appear in the fUML subset (with constraints). However, these and other similar attributes should actually be removed from the fUML subset abstract syntax (see Issue 14561). Revised Text: None. Disposition: Closed, no change
Revised Text:
Actions taken:
February 18, 2009: received issue
July 23, 2010: closed issue

Discussion:
  


Issue 13511: 7.5.2.2.9 SendSignalAction (fuml-ftf)

Click
here for this issue's archive.
Source: NASA (Dr. Nicolas F. Rouquette, nicolas.f.rouquette(at)jpl.nasa.gov)
Nature: Uncategorized Issue
Severity:
Summary:
Specification: Semantics of a Foundation Subset for Executable UML Models, FTF � Beta 1 (ptc/08-11-03)    Section: 7.5.2.2.9 SendSignalAction         Summary:         The description of the constraint states:         The target input pin must have a type that has a reception for the signal         The OCL constraint is invalid:         self.target.activity.allFeatures()->select(oclIsKindOf(Reception))->collect(oclAsType(Reception).signal)-    >includes(self.signal)              Proposed resolution:         Change:         self.target.activity.allFeatures()->select(oclIsKindOf(Reception))->collect(oclAsType(Reception).signal)-    >includes(self.signal)         To:         self.target.type.oclAsType(Classifier).allFeatures()->select(oclIsKindOf(Reception))    ->exists(f:Feature|self.signal.conformsTo(f.oclAsType(Reception).signal))  

Resolution: Change the constraint as proposed
Revised Text: In Subcluase 7.5.2.2.9, change: self.target.activity.allFeatures()->select(oclIsKindOf(Reception)) ->collect(oclAsType(Reception).signal)->includes(self.signal) to: self.target.type.oclAsType(Classifier).allFeatures() ->select(oclIsKindOf(Reception)) ->exists(f:Feature|self.signal.conformsTo(f.oclAsType(Reception).signal))
Actions taken:
February 18, 2009: received issue
July 23, 2010: closed issue

Issue 13544: [FUML] 8.6.3.2.4 CreateLinkActionActivation.doAction() (fuml-ftf)

Click
here for this issue's archive.
Source: NASA (Dr. Nicolas F. Rouquette, nicolas.f.rouquette(at)jpl.nasa.gov)
Nature: Uncategorized Issue
Severity:
Summary:
Specification: Semantics of a Foundation Subset for Executable UML Models, FTF � Beta 1 (ptc/08-11-03)    Section: 8.6.3.2.4 CreateLinkActionActivation         Summary:         CreateLinkActionActivation.doAction() creates a Link object and sets its features according to the link end data specified in the CreateLinkAction; however, the link type is not set to the association.         Proposed resolution:         Change the end of the CreateLinkActionActivation.doAction() method from:                 ExtensionalValueList extent = this.getExecutionLocus().getExtent(this.getAssociation());                 for (int i = 0; i < extent.size(); i++) {                ExtensionalValue value = extent.getValue(i);                Link link = (Link) value;                     boolean noMatch = true;                int j = 1;                while (noMatch & j <= endDataList.size()) {                    LinkEndCreationData endData = endDataList.getValue(j - 1);                    if (endData.isReplaceAll & this.endMatchesEndData(link, endData)) {                        link.destroy();                        noMatch = false;                    }                    j = j + 1;                }            }                 Link newLink = new Link();                 for (int i = 0; i < endDataList.size(); i++) {                LinkEndCreationData endData = endDataList.getValue(i);                     int insertAt = 0;                if (endData.insertAt != null) {                    insertAt = ((UnlimitedNaturalValue) (this.getTokens(endData.insertAt).getValue(0))).value.naturalValue;                }                newLink.setFeatureValue(endData.end, this.getTokens(endData.value), insertAt);            }                 this.getExecutionLocus().add(newLink);         To:                 Association linkAssociation = this.getAssociation();            ExtensionalValueList extent = this.getExecutionLocus().getExtent(linkAssociation);                 for (int i = 0; i < extent.size(); i++) {                ExtensionalValue value = extent.getValue(i);                Link link = (Link) value;                     boolean noMatch = true;                int j = 1;                while (noMatch & j <= endDataList.size()) {                    LinkEndCreationData endData = endDataList.getValue(j - 1);                    if (endData.isReplaceAll & this.endMatchesEndData(link, endData)) {                        link.destroy();                        noMatch = false;                    }                    j = j + 1;                }            }                 Link newLink = new Link();                 for (int i = 0; i < endDataList.size(); i++) {                LinkEndCreationData endData = endDataList.getValue(i);                     int insertAt = 0;                if (endData.insertAt != null) {                    insertAt = ((UnlimitedNaturalValue) (this.getTokens(endData.insertAt).getValue(0))).value.naturalValue;                }                newLink.setFeatureValue(endData.end, this.getTokens(endData.value), insertAt);            }                 newLink.type = linkAssociation;            this.getExecutionLocus().add(newLink);         

Resolution: Change the code as (essentially) as proposed.
Revised Text: In CreateLinkActionActivation::doAction(), change: ExtensionalValueList extent = this.getExecutionLocus().getExtent(this.getAssociation()); to: Association linkAssociation = this.getAssociation(); ExtensionalValueList extent = this.getExecutionLocus().getExtent(linkAssociation); And after: Link newLink = new Link(); add: newLink.type = linkAssociation;
Actions taken:
February 22, 2009: received issue
July 23, 2010: closed issue

Issue 13546: 8.6.4.2.1 [5]AcceptEventActionActivation::accept(in signalInstance:SignalInstance) (fuml-ftf)

Click
here for this issue's archive.
Source: NASA (Dr. Nicolas F. Rouquette, nicolas.f.rouquette(at)jpl.nasa.gov)
Nature: Uncategorized Issue
Severity:
Summary:
Specification: Semantics of a Foundation Subset for Executable UML Models, FTF � Beta 1 (ptc/08-11-03)  Section: 8.6.4.2.1 AcceptEventActionActivation         Summary:     The AcceptEventActionActivation::accept() unconditionally places values on output pins even if the action does not have any output pin.         Proposed resolution:         Change the operation from:                 // Accept a signal occurance for the given signal instance.            // If the action does not unmarshall, then place the signal instance on            // the result pin.            // If the action does unmarshall, then get the feature values of the            // signal instance, and place the values for each feature on the            // corresponding output pin.            // Concurrently fire all output pins while offering a single control            // token.            // If there are no incoming edges, then re-register this accept event            // action execution with the context object.                 AcceptEventAction action = (AcceptEventAction) (this.node);            OutputPinList resultPins = action.result;                 Debug.println("[accept] action = " + action.name + ", signalinstance = " + signalInstance);                 if (this.running) {                if (!action.isUnmarshall) {                    ValueList result = new ValueList();                    result.addValue(signalInstance);                    this.putTokens(resultPins.getValue(0), result);                } else {                    FeatureValueList featureValues = signalInstance.getFeatureValues();                    for (int i = 0; i < featureValues.size(); i++) {                        FeatureValue featureValue = featureValues.getValue(i);                        OutputPin resultPin = resultPins.getValue(i);                        this.putTokens(resultPin, featureValue.values);                    }                }                     this.sendOffers();                     this.waiting = false;                     Debug.println("[fire] Checking if " + this.node.name + " should fire again...");                // if (this.isReady()) {                // this.fire();                // }                this.receiveOffer();            }             }         To:                 // Accept a signal occurance for the given signal instance.            // If the action does not unmarshall, then place the signal instance on            // the result pin, if any.            // If the action does unmarshall, then get the feature values of the            // signal instance, and place the values for each feature on the            // corresponding output pin, if any.            // Concurrently fire all output pins, if any, while offering a single control            // token.            // If there are no incoming edges, then re-register this accept event            // action execution with the context object.                 AcceptEventAction action = (AcceptEventAction) (this.node);            OutputPinList resultPins = action.result;                 Debug.println("[accept] action = " + action.name + ", signalinstance = " + signalInstance);                 if (this.running) {                if (resultPins.size() > 0) {                      if (!action.isUnmarshall) {                            ValueList result = new ValueList();                            result.addValue(signalInstance);                            this.putTokens(resultPins.getValue(0), result);                      } else {                            FeatureValueList featureValues = signalInstance.getFeatureValues();                            for (int i = 0; i < featureValues.size(); i++) {                                  FeatureValue featureValue = featureValues.getValue(i);                                  OutputPin resultPin = resultPins.getValue(i);                                  this.putTokens(resultPin, featureValue.values);                            }                      }                }                this.sendOffers();                     this.waiting = false;                     Debug.println("[fire] Checking if " + this.node.name + " should fire again...");                // if (this.isReady()) {                // this.fire();                // }                this.receiveOffer();            }             }    

Resolution: If isUnmarshall is true, then the action is required to have output pins corresponding to any signal attributes, and the specification is already correct in this case. It is only in the case that isUnmarshall is false that the specification is incorrect in assuming that there must be an output pin.
Revised Text: In the introductory comment for AcceptEventActionActivation::accept, at the end of the sentence: // If the action does unmarshall, then get the feature values of the // signal instance, and place the values for each feature on the // corresponding output pin. add �if any�. In the code, change this.putTokens(resultPins.getValue(0), result); to if (this.resultPins.size() > 0) { this.putTokens(resultPins.getValue(0), result); }
Actions taken:
February 25, 2009: received issue
July 23, 2010: closed issue

Discussion:
  


Issue 13869: Error in ReadLinkActionActivation (fuml-ftf)

Click
here for this issue's archive.
Source: Model Driven Solutions (Mr. Ed Seidewitz, ed-s(at)modeldriven.com)
Nature: Uncategorized Issue
Severity:
Summary:
Specification: Semantics of a Foundational Subset for Executable UML Models, Beta 1 (ptc/2008-11-03)    Section: 8.6.3.2.9 ReadLinkActionActivation         In ReadLinkActionActivation::doAction, the code:         if (endDataList.getValue(i).value == null) {        openEnd = endDataList.getValue(i);    }         Should be changed to:         if (endDataList.getValue(i-1).value == null) {        openEnd = endDataList.getValue(i-1);    }    

Resolution: Change the code as proposed
Revised Text: In ReadLinkActionActivation::doAction, change: if (endDataList.getValue(i).value == null) { openEnd = endDataList.getValue(i); } to: if (endDataList.getValue(i-1).value == null) { openEnd = endDataList.getValue(i-1); }
Actions taken:
April 15, 2009: received issue
July 23, 2010: closed issue

Issue 13873: 8.6.2.2.1 ActionActivation, 8.6.3.2.4 CreateLinkActionActivation and 8.6.3.2.8 LinkActionActivation (fuml-ftf)

Click
here for this issue's archive.
Source: NASA (Dr. Nicolas F. Rouquette, nicolas.f.rouquette(at)jpl.nasa.gov)
Nature: Uncategorized Issue
Severity:
Summary:
Specification: Semantics of a Foundation Subset for Executable UML Models, FTF � Beta 1 (ptc/08-11-03)    Section: 8.6.2.2.1 ActionActivation, 8.6.3.2.4 CreateLinkActionActivation and 8.6.3.2.8 LinkActionActivation         Depends on: https://www.omg.org/issues/fuml-ftf.html#Issue13544         Summary:         Part of CreateLinkActionActivation.doAction() entails destroying all links that have a value for any end for which isReplaceAll is true. (see fUML 1.0, page 238). This involves the following chain of invocations:    -          fUML.Semantics.Actions.IntermediateActions.LinkActionActivation.endMatchesEndData(Link, LinkEndData) � see fUML 1.0, page 238;    -          fUML.Semantics.Actions.BasicActions.ActionActivation.getTokens(InputPin) -- see fUML 1.0, page 233;    -          fUML.Semantics.Activities.IntermediateActivities.ActivityNodeActivation.takeTokens() � see fUML 1.0, p. 215         By taking the tokens from the pin activation corresponding to the input pin, LinkActionActivation.endMatchesEndData() induces side effects on the state of the execution engine each time it is called.          Proposed Resolution:         Resolving this issue entails 3 things:         a)      Defining a read-only operation to read the tokens available on an input pin:         fUML.Semantics.Actions.BasicActions.ActionActivation.readTokens(InputPin)             /**         * NFR 04/16/2009 For LinkActionActivation.endMatchesEndData(Link, LinkEndData),         * we need a mechanism to test whether the available tokens match the link end data         * and if they do, then actually remove them.          *          * readTokens() is the same as getTokens() except that:         * getTokens() removes the tokens on the pin activation, i.e, pinActivation.takeTokens()         * readTokens() leaves the tokens on the pin activation, i.e., pinActivation.getTokens()         * @param pin         * @return         */        public fUML.Semantics.Classes.Kernel.ValueList readTokens(                fUML.Syntax.Actions.BasicActions.InputPin pin) {            // Precondition: The action execution has fired and the given pin is            // owned by the action of the action execution.            // Take any tokens held by the pin activation corresponding to the given            // input pin and return them.               // NFR 04/16/2009            Debug.println("[readTokens] node = " + this.node.name + " (pin: " + pin.name + ")");                 PinActivation pinActivation = this.getPinActivation(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;             }         b)      With the above operation, LinkActionActivation.endMatchesEndData() can be fixed as follows:             public boolean endMatchesEndData(fUML.Semantics.Classes.Kernel.Link link,                fUML.Syntax.Actions.IntermediateActions.LinkEndData endData) {            // Test whether the appropriate end of the given link matches the given            // end data.                 boolean matches = false;                        if (endData.value == null) {                matches = true;            } else {                Property end = endData.end;                FeatureValue linkFeatureValue = link.getFeatureValue(end);                Value endValue = this.readTokens(endData.value).getValue(0);                if (endData instanceof LinkEndDestructionData) {                    if (!((LinkEndDestructionData) endData).isDestroyDuplicates                            & !end.multiplicityElement.isUnique & end.multiplicityElement.isOrdered) {                        int destroyAt = ((UnlimitedNaturalValue) (this                                .readTokens(((LinkEndDestructionData) endData).destroyAt).getValue(0))).value.naturalValue;                        matches = linkFeatureValue.values.getValue(0).equals(endValue)                                && linkFeatureValue.position == destroyAt;                    } else {                        matches = linkFeatureValue.values.getValue(0).equals(endValue);                    }                } else {                    matches = linkFeatureValue.values.getValue(0).equals(endValue);                }            }                 return matches;             }         c)       All other actions/activity behaviors which directly or indirectly invoked LinkActionActivation.endMatchesEndData() need to be reviewed to make sure that the tokens will be consumed. There are only 3 cases to consider:         fUML.Semantics.Actions.IntermediateActions.CreateLinkActionActivation.doAction()    fUML.Semantics.Actions.IntermediateActions.DestroyLinkActionActivation.doAction()    fUML.Semantics.Actions.IntermediateActions.ReadLinkActionActivation.doAction()         CreateLinkActionActivation.doAction() already consumes the tokens when creating the new link instance.         DestroyLinkActionActivation.doAction() needs extra logic to delete the tokens from the input pins *after* determining the matching links to destroy, if any. This requires modifying this operation as follows:             public void doAction() {            // Get the extent, at the current execution locus, of the association            // for which links are being destroyed.            // Destroy all links that match the given link end destruction data.            // For unique ends, or non-unique ends for which isDestroyDuplicates is            // true, match links with a matching value for that end.            // For non-unique, ordered ends for which isDestroyDuplicates is false,            // match links with an end value at the given destroyAt position. [Must            // a value be given, too, in this case?]            // For non-unique, non-ordered ends for which isDestroyDuplicates is            // false, pick one matching link (if any) non-deterministically. [The            // semantics of this case is not clear from the current spec.]                 DestroyLinkAction action = (DestroyLinkAction) (this.node);            LinkEndDestructionDataList destructionDataList = action.endData;                 boolean destroyOnlyOne = false;            int j = 1;            while (!destroyOnlyOne & j <= destructionDataList.size()) {                LinkEndDestructionData endData = destructionDataList.getValue(j - 1);                destroyOnlyOne = !endData.end.multiplicityElement.isUnique                        & !endData.end.multiplicityElement.isOrdered & !endData.isDestroyDuplicates;                j = j + 1;            }                 LinkEndDataList endDataList = new LinkEndDataList();            for (int i = 0; i < destructionDataList.size(); i++) {                LinkEndDestructionData endData = destructionDataList.getValue(i);                endDataList.addValue(endData);            }                 ExtensionalValueList extent = this.getExecutionLocus().getExtent(this.getAssociation());            ExtensionalValueList matchingLinks = new ExtensionalValueList();                 for (int i = 0; i < extent.size(); i++) {                ExtensionalValue value = extent.getValue(i);                Link link = (Link) value;                if (this.linkMatchesEndData(link, endDataList)) {                    matchingLinks.addValue(link);                }            }                 /*             * NFR 04/16/2009             * Now that we know which matching links to destroy,             * we need to ensure all of the tokens on the input pins              * of this action are consumed.             */            for (int i = 0; i < destructionDataList.size(); i++) {                LinkEndDestructionData endData = destructionDataList.getValue(i);                Property end = endData.end;                if (!endData.isDestroyDuplicates                    & !end.multiplicityElement.isUnique & end.multiplicityElement.isOrdered) {                  this.getTokens(endData.destroyAt);                }                this.getTokens(endData.value);            }                        if (destroyOnlyOne) {                // *** If there is more than one matching link,                // non-deterministically choose one. ***                if (matchingLinks.size() > 0) {                    int i = ((ChoiceStrategy) this.getExecutionLocus().factory.getStrategy("choice"))                            .choose(matchingLinks.size());                    matchingLinks.getValue(i - 1).destroy();                }            } else {                for (int i = 0; i < matchingLinks.size(); i++) {                    ExtensionalValue matchingLink = matchingLinks.getValue(i);                    matchingLink.destroy();                }            }             }         ReadLinkActionActivation.doAction() needs extra logic to consume the tokens after matching the data against all of the links in the extension.             public void doAction() {            // Get the extent, at the current execution locus, of the association to            // which the action applies.            // For all links that match the link end data, place the value of the            // remaining "open" end on the result pin.                 ReadLinkAction action = (ReadLinkAction) (this.node);            LinkEndDataList endDataList = action.endData;            LinkEndData openEnd = null;                             int i = 1;            while ((openEnd == null) & i <= endDataList.size()) {                if (endDataList.getValue(i-1).value == null) {                    openEnd = endDataList.getValue(i-1);                }                i = i + 1;            }                 ExtensionalValueList extent = this.getExecutionLocus().getExtent(this.getAssociation());                 for (int j = 0; j < extent.size(); j++) {                ExtensionalValue value = extent.getValue(j);                Link link = (Link) value;                if (this.linkMatchesEndData(link, endDataList)) {                    Value resultValue = link.getFeatureValue(openEnd.end).values.getValue(0);                    this.putToken(action.result, resultValue);                }            }                        /*             * NFR 04/16/2009             * Now that we have checked all links for possible matches,             * we have to consume the tokens on the input pins corresponding to the non-open link ends.             */            for (int k=0; k<endDataList.size(); k++) {                LinkEndData endData = endDataList.getValue(k);                if (endData.value != null) {                      this.getTokens(endData.value);                }            }             }    

Resolution: Part of the problem is that the name for ActionActivation::getTokens is inconsistent with the names of other operations in the execution model, where �get� is used for operations that do not consume tokens while �take� is used for operations that do. Therefore, it makes sense to change the name of the current �getTokens� operation to �takeTokens� and use the name �getTokens� for the new operation (rather than �readTokens�, as proposed). Also, to be consistent with the resolution to issue 13310, the new operation should call pinActivation.getUnofferedTokens(), rather than pinActivation.getTokens(). Other than this, the rest of the proposed resolution is accepted.
Revised Text: In Figure 74 add the following operation to ActionActivation: takeTokens(pin: InputPin): Value[*] In Subclause 8.6.2.2.1, rename �ActionActivation::getTokens� to �ActionActivation::takeTokens� and add: ActionActivation::getTokens(in pin: InputPin): Values[*] // Precondition: The action execution has fired and the given pin is owned by the action of the action execution. // Get any tokens held by the pin activation corresponding to the given input pin and return them // (but leave the tokens on the pin). Debug.println("[getTokens] node = " + this.node.name + ", pin = " + pin.name); PinActivation pinActivation = this.getPinActivation(pin); TokenList tokens = pinActivation.getUnofferedTokens(); 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; In the methods for the following operations, replace uses of �getTokens� with �takeTokens�: BasicActions:: CallActionActivation::doAction CallOperationActionActivation::getCallExecution SendSignalActivation::doAction IntermediateActions:: AddStructuralFeatureValueActionActivation::doAction ClearAssociationActionActivation::doAction ClearStructuralFeatureActionActivation::doAction CreateLinkActionActivation::doAction DestroyObjectActionActivation::doAction ReadStructuralFeatureValueActivation::doAction RemoveStructuralFeatureActionActivation::doAction TestIdentityActionActivation::doAction CompleteActions:: ReadIsClassifiedObjectActionActivation::doAction ReclassifyObjectActionActivation::doAction ReduceAction::Activation::doAction StartClassifierBehaviorActionActivation::doAction StartObjectBehaviorActivation::doAction CompleteStructuredActivities::LoopNodeActivation::doStructuredActivity In DestroyLinkActionActivation::doAction, before the final if statement, add: // Now that matching is done, ensure that all tokens on end data input pins // are consumed. for (int i = 0; i < destructionDataList.size(); i++) { LinkEndDestructionData endData = destructionDataList.getValue(i); Property end = endData.end; if (!endData.isDestroyDuplicates & !end.multiplicityElement.isUnique & end.multiplicityElement.isOrdered) { this.takeTokens(endData.destroyAt); } this.takeTokens(endData.value); } In ReadLinkActionActivation::doAction, at the end, add: // Now that matching is done, ensure that all tokens on end data input pins // are consumed. for (int k=0; k<endDataList.size(); k++) { LinkEndData endData = endDataList.getValue(k); if (endData.value != null) { this.takeTokens(endData.value); } }
Actions taken:
April 16, 2009: received issue
July 23, 2010: closed issue

Issue 13881: Subclause: 8.5.2.2.6 ActivityParameterNodeActivation (fuml-ftf)

Click
here for this issue's archive.
Source: Model Driven Solutions (Mr. Ed Seidewitz, ed-s(at)modeldriven.com)
Nature: Uncategorized Issue
Severity:
Summary:
When an activity execution is terminated (e.g., by an activity final node), tokens are cleared from all object nodes (see the ObjectNode::terminate operation). However, this means that output activity parameter nodes (which are object nodes) get their tokens cleared. As a result, the tokens meant to be placed on the output parameters of the activity are lost.         The ActivityParameterNodeActivation class should override the terminate operation and, if for an output activity parameter node, not clear the tokens in the node.         

Resolution: The ObjectNode::terminate operation uses the clearToken operation to clear the tokens from the node activation. However, ActivityParameterNodeActivation already overrides this operation to only clear tokens if the node is an input parameter node. So no change is needed. Revised Text: None Disposition: Closed, No Change
Revised Text:
Actions taken:
April 19, 2009: received issue
July 23, 2010: closed issue

Issue 13882: Only abstract classes should be able to have abstract behavioral features (fuml-ftf)

Click
here for this issue's archive.
Source: Model Driven Solutions (Mr. Ed Seidewitz, ed-s(at)modeldriven.com)
Nature: Uncategorized Issue
Severity:
Summary:
Specification: Semantics of a Foundational Subset for Executable UML Models    Subclause: 7.2.2.2.3 Class         The UML superstructure does not restrict abstract behavioral features to only be members of abstract classes. However, trying to invoke an abstract operation on an object instantiated from a non abstract will result in an execution error. Therefore, fUML should add a constraint on Class that none of its behavioral features are abstract unless the class is abstract. That is:         self.members->select(oclIsKindOf(BehavioralFeature))->exists(isAbstract) implies self.isAbstract    

Resolution: Add the constraint as proposed
Revised Text: In Subclause 7.2.2.2.3, add the constraint: [2] abstract_class Only an abstract class may have abstract behavioral features. self.members->select(oclIsKindOf(BehavioralFeature))->exists(isAbstract) implies self.isAbstract
Actions taken:
April 23, 2009: received issue
July 23, 2010: closed issue

Issue 13883: Receptions should never be abstract (fuml-ftf)

Click
here for this issue's archive.
Source: Model Driven Solutions (Mr. Ed Seidewitz, ed-s(at)modeldriven.com)
Nature: Uncategorized Issue
Severity:
Summary:
Specification: Semantics of a Foundational Subset for Executable UML Models (ptc/2008-11-03)    Subclause: 7.3.3.2.3 Reception         A Reception is a kind of BehavioralFeature and therefore inherits the isAbstract attribute. However, it doesn't really make sense for receptions to be abstract, since fUML doesn't allow them to have methods anyway. Further, since UML does not seem to provide any way to redefine a reception, it would be impossible to ever redefine it in a subclass to be non-abstract.         The  constraint "not isAbstract" should be added to Reception.    

Resolution: Add the constraint as proposed
Revised Text: In Subclause 7.3.3.2.3, add the constraint: [2] not_abstract A reception may not be abstract. not self.isAbstract
Actions taken:
April 23, 2009: received issue
July 23, 2010: closed issue

Issue 13921: The superclass of ActvityNode and ActivityEdge should be RedefinableElement (fuml-ftf)

Click
here for this issue's archive.
Source: Model Driven Solutions (Mr. Ed Seidewitz, ed-s(at)modeldriven.com)
Nature: Uncategorized Issue
Severity:
Summary:
Specification: Semantics of a Foundational Subset for Executable UML Models (ptc/2008-11-03)  Subclause: 7.4.2.2.2 ActivityEdge, 7.4.2.2.7 ControlNode         The fUML abstract syntax currently has NamedElement as the immediate superclass of ActivityNode and ActivityEdge. However, in UML, at the level of IntermediateActivities included in the fUML subset, ActivityNode and ActivityEdge are subclasses of RedefinableElement. They should be in the fUML abstract syntax, too.         

Resolution: Agreed.
Revised Text: see pages 54 - 55 of OMG document ptc/2009-10-02
Actions taken:
May 6, 2009: received issue
July 23, 2010: closed issue

Issue 14193: Base Semantics (fuml-ftf)

Click
here for this issue's archive.
Nature: Clarification
Severity: Minor
Summary:
Base Semantics A definition of the execution semantics of those UML constructs [is] used in the execution model, using some formalism other than the execution model itself. Since the execution model is a UML model, the base semantics are necessary in order to provide non-circular grounding for the execution semantics defined by the execution model." Either a verb such as the word [is] needs to be inserted, otherwise a sentence fragment results with uncertain meaning. Furthermore, the challenge expressed in the statement, it seems, is trying to avoid a self-referential, therefore a potentially inconsistent model.

Resolution: All the definitions in Clause 4 are in the form of (or begin with) a noun phrase sentence fragment, so the style for Base Semantics is consistent. The definition is taken directly from the glossary of the original RFP, and is considered to be the required definition of base semantics for the purpose of this specification. Revised Text: None. Disposition: Closed, no change
Revised Text:
Actions taken:
August 17, 2009: received issue
July 23, 2010: closed issue

Issue 14519: Active class should not have to have classifier behaviors (fuml-ftf)

Click
here for this issue's archive.
Source: Model Driven Solutions (Mr. Ed Seidewitz, ed-s(at)modeldriven.com)
Nature: Uncategorized Issue
Severity:
Summary:
Specification: Semantics of a Foundational Subset for Executable UML Models (ptc/2008-11-03)  Subclause:  7.2.2.2.3 Class         Constraint [1] �If isActive is true, then the class must be a behavior or have a classifier behavior� is too strong. It should at least be possible to have an abstract active class that does not have a classifier behavior. Indeed, the execution model for an active class still works even if concrete classes are allowed to have no classifier behavior (instances just don�t do anything once started), so perhaps the constraint is not necessary at all.    

Resolution: It is agreed that it is not necessary to require that an active class have a classifier behavior. However, it is still necessary to have a constraint requiring a class to be active if it has a classifier behavior.
Revised Text: In Subclause 7.2.2.2.3 Class, replace constraint [1] with: [1] active_class_classifier_behavior Only active classes may have classifier behaviors. self.classifierBehavior->notEmpty() implies self.isActive
Actions taken:
October 6, 2009: received issue
July 23, 2010: closed issue

Issue 14520: A passive class should not be able to specialize an active class (fuml-ftf)

Click
here for this issue's archive.
Source: Model Driven Solutions (Mr. Ed Seidewitz, ed-s(at)modeldriven.com)
Nature: Uncategorized Issue
Severity:
Summary:
Specification: Semantics of a Foundational Subset for Executable UML Models (ptc/2008-11-03)  Subclause:  7.2.2.2.3 Class         If a class has any parents that are active, then the class should be active, since it effectively �inherits� the classifier behaviors from its active parents. (This would still allow an active class to have passive parents, though.)    

Resolution: Agreed.
Revised Text: In Subclause 7.2.2.2.3 Class, add the constraint [2] active_class_specialization Only an active class may specialize an active class. self.parents()->exist(isActive) implies self.isActive
Actions taken:
October 6, 2009: received issue
July 23, 2010: closed issue

Issue 14521: A data type should not be allowed to have operations (fuml-ftf)

Click
here for this issue's archive.
Source: Model Driven Solutions (Mr. Ed Seidewitz, ed-s(at)modeldriven.com)
Nature: Uncategorized Issue
Severity:
Summary:
Specification: Semantics of a Foundational Subset for Executable UML Models (ptc/2008-11-03)  Subclause:  7.2.2.2.6 Data Type         A data type should not be allowed to have operations. A data type is not a behaviored classifier, so it cannot own behaviors and so cannot provide methods to actually implement any operations.    

Resolution: Agreed.
Revised Text: In Subclause 7.2.2.1, replace: From Data Types (see Figure 23): No exclusions. with: From Data Types (see Figure 23): � DataType::ownedOperation. Data types cannot have operations in fUML because they are not behaviored classifiers and so cannot own behaviors. This means that there is no way to provide executable methods for the operations of a data type. In Figure 23, remove the association from DataType to Operation and remove Operation from the diagram. In Subclause 7.2.2.2.6 DataType, under Associations, remove the entry for "ownedOperation". At the end of Subclause 8.3.2.1 Overview (in the section on Polymorphic Operation Dispatching), add the following: The UML Superstructure allows data types to own operations, as well as classes. However, data types are not behaviored classifiers, so they cannot own behaviors to be used as methods for their operations. Since fUML requires that every non-abstract operation have a method, it would thus only be possible to have abstract operations on data types, which would not be very useful. Therefore, data types are prohibited from having operations at all in fUML (see the constraint in Subclause 7.2.2.2.6). It is thus not possible to use owned operations to define the primitive behaviors of a data type. Instead, the Foundational Model Library defines a set of primitive function behaviors that take values of primitive data types as their arguments. Rather than being operations of the primitive types, these primitive behaviors are grouped into library packages corresponding to the appropriate types (e.g., IntegerFunctions for type Integer, etc.). Implementations for these behaviors are then registered with the execution factory as part of the configuration of the execution environment (see Subclause 8.2.1). Not being operations, such primitive behaviors are, of course, not polymorphic. They are called using call behavior actions, rather than call operation actions.
Actions taken:
October 6, 2009: received issue
July 23, 2010: closed issue

Issue 14522: OpaqueBehavior::opaqueBehavior should be OpaqueBehavior::language (fuml-ftf)

Click
here for this issue's archive.
Source: Model Driven Solutions (Mr. Ed Seidewitz, ed-s(at)modeldriven.com)
Nature: Uncategorized Issue
Severity:
Summary:
Specification: Semantics of a Foundational Subset for Executable UML Models (ptc/2008-11-03)  Subclause:  7.3.2.2.4 OpaqueBehavior         The OpaqueBehavior::opaqueBehavior attribute should instead be �language�, consistent with the UML 2.2 specification.    

Resolution: Agreed.
Revised Text: see page 60 of OMG document ptc/2009-10-02
Actions taken:
October 6, 2009: received issue
July 23, 2010: closed issue

Issue 14523: Items excluded from Kernel (fuml-ftf)

Click
here for this issue's archive.
Source: Model Driven Solutions (Mr. Ed Seidewitz, ed-s(at)modeldriven.com)
Nature: Uncategorized Issue
Severity:
Summary:
Specification: Semantics of a Foundational Subset for Executable UML Models (ptc/2008-11-03)  Subclause:  7.2.2 Kernel         There are some things excluded from the Kernel in the fUML subset that would probably be better to include.         - ElementImport and PackageImport: While these are irrelevant to execution, they will often be used in models with elements that are otherwise executable. It seems unnecessary to force these to be stripped out in order to not have the model rejected by an execution tool.    - Class::nestedClassifier: It is sometimes useful to nest one classifier in another, and this would have no effect on the execution semantics. So it also seems unnecessary to force a model to be re-organized to remove such nesting just in order to not have the model rejected by an execution tool.    - Package::ownedType and Package::nestedPackage: These derived properties are not needed for fUML, but they really should be included in the fUML subset in order to make it a well formed subset of UML L3 and to ensure that constraints in the UML spec involving these properties an be carried over without change into fUML.    

Resolution: Agreed.
Revised Text: see pages 61 - 64 of OMG document ptc/2009-10-02
Actions taken:
October 6, 2009: received issue
July 23, 2010: closed issue

Issue 14524: Incorrect generalizations in Kernel (fuml-ftf)

Click
here for this issue's archive.
Source: Model Driven Solutions (Mr. Ed Seidewitz, ed-s(at)modeldriven.com)
Nature: Uncategorized Issue
Severity:
Summary:
Specification: Semantics of a Foundational Subset for Executable UML Models (ptc/2008-11-03)  Subclause:  7.2 Kernel         During work on the fUML submission, the abstract syntax generalization hierarchy was altered to collapse a number of cases of multiple inheritance to single inheritance, in order to allow a mapping to Java for bootstrap execution purposes. Unfortunately, some of these alterations remain in the spec, even though this violates the intended strict subsetting of the full UML Superstructure abstract syntax. The specific cases include:         - Type -> Namespace -> PackageableElement in Figure 15    - Namespace -> PackageableElement in Figure 16         Recommendation:         The normative fUML abstract syntax should be updated so its generalization hierarchy is a strict subset of that in the full UML superstructure abstract syntax.    

Resolution: Agreed.
Revised Text: see pages 65 - 67 of OMG document ptc/2009-10-02
Actions taken:
October 6, 2009: received issue
July 23, 2010: closed issue

Issue 14525: InstanceValue constraint is redundant (fuml-ftf)

Click
here for this issue's archive.
Source: Model Driven Solutions (Mr. Ed Seidewitz, ed-s(at)modeldriven.com)
Nature: Uncategorized Issue
Severity:
Summary:
Specification: Semantics of a Foundational Subset for Executable UML Models (ptc/2008-11-03)  Subclause:  7.2.2.2.13 InstanceValue         The allowedClassifiers constraint on InstanceValue is redundant with the possible_classifiers constraint on InstanceSpecification.         Recommendation: Remove the constraint on InstanceValue.    

Resolution: Agreed. In addition, simplify the possible_classifiers constraint on InstanceSpecification by removing the specific check that the instance classifier is an enumeration, since enumerations are kinds of data types.
Revised Text: In Subclause 7.2.2.2.13 InstanceValue, remove the constraint allowedClassifiers. Also remove it from Figure 17 � Expressions. In Subclause 7.2.2.2.12 InstanceSpecification, replace the constraint possible_classifiers with [1] possible_classifiers Either all the classifiers are classes, or there is one classifier that is a data type. self.classifier->forAll(oclIsKindOf(uml::Class)) or self.classifier->size() = 1 and self.classifier->forAll(oclIsKindOf(uml::DataType)) Also change the description of the constraint shown on Figure 18 � Instances.
Actions taken:
October 6, 2009: received issue
July 23, 2010: closed issue

Issue 14527: The composition from ObjectNode to TypedElement is incorrect (fuml-ftf)

Click
here for this issue's archive.
Source: Model Driven Solutions (Mr. Ed Seidewitz, ed-s(at)modeldriven.com)
Nature: Uncategorized Issue
Severity:
Summary:
Specification: Semantics of a Foundational Subset for Executable UML Models (ptc/2008-11-03)  Subclause:  7.4.2.2.15 ObjectNode         The composition association from ObjectNode to TypedElement (see also Figure 31) should be a generalization, consistent with the UML Superstructure abstract syntax.       

Resolution: Agreed.
Revised Text: see page 69 of OMG document ptc/2009-10-02
Actions taken:
October 6, 2009: received issue
July 23, 2010: closed issue

Issue 14528: Pin should be abstract (fuml-ftf)

Click
here for this issue's archive.
Source: Model Driven Solutions (Mr. Ed Seidewitz, ed-s(at)modeldriven.com)
Nature: Uncategorized Issue
Severity:
Summary:
Specification: Semantics of a Foundational Subset for Executable UML Models (ptc/2008-11-03)  Subclause:  7.5.2 BasicActions         In Figure 39, Pin should be shown as abstract.    

Resolution: Agreed.
Revised Text: see page 70 of OMG document ptc/2009-10-02
Actions taken:
October 6, 2009: received issue
July 23, 2010: closed issue

Issue 14529: OCL incomplete for CallBehaviorAction::proper_context (fuml-ftf)

Click
here for this issue's archive.
Source: Model Driven Solutions (Mr. Ed Seidewitz, ed-s(at)modeldriven.com)
Nature: Uncategorized Issue
Severity:
Summary:
Specification: Semantics of a Foundational Subset for Executable UML Models (ptc/2008-11-03)  Subclause:  7.5.2.2.3 CallBehaviorAction         The OCL for constraint [3] of CallBehaviorAction (propert_context) is incomplete.    

Resolution: Agreed.
Revised Text: In Subclause 7.5.2.2.3 CallBehaviorAction, replace constraint [3] proper_context with self.behavior.context->notEmpty() implies self.context->union(self.context.allParents())->includes(self.behavior.context)
Actions taken:
October 6, 2009: received issue
July 23, 2010: closed issue

Issue 14530: OCL for SendSignalAction::target_signal_reception is incorrect (fuml-ftf)

Click
here for this issue's archive.
Source: Model Driven Solutions (Mr. Ed Seidewitz, ed-s(at)modeldriven.com)
Nature: Uncategorized Issue
Severity:
Summary:
Specification: Semantics of a Foundational Subset for Executable UML Models (ptc/2008-11-03)  Subclause:  7.5.2.2.9 SendSignalAction         In the OCL for constraint [1] of SendSignalAction (target_signal_reception), �self.target.activity� should be �self.target.type�.       

Resolution: This is a (partial) duplicate of Issue 13511, which is already resolved. Revised Text: None. Disposition: Duplicate/merged
Revised Text:
Actions taken:
October 6, 2009: received issue
July 23, 2010: closed issue

Issue 14531: Problems with OCL for AcceptEventAction::fUML_active_context (fuml-ftf)

Click
here for this issue's archive.
Source: Model Driven Solutions (Mr. Ed Seidewitz, ed-s(at)modeldriven.com)
Nature: Uncategorized Issue
Severity:
Summary:
Specification: Semantics of a Foundational Subset for Executable UML Models (ptc/2008-11-03)  Subclause:  7.5.4.2.2 AcceptEventAction         The OCL for constraint [1] of AcceptEventAction (fUML_active_context) uses �self.activity� to get the activity for the accept event action. However, the activity property of an action is only non-empty if the action is directly owned by the activity, not nested in a structured activity node. Also, the OCL uses the getContext() operation, which does not seem to be defined in the UML Superstructure or the fUML specification.       

Resolution: Note that the subclause for AcceptEventAction is actually 7.5.4.2.1. Action has an attribute "context" that gives "the classifier that owns the behavior of which this action is a part". This should be used instead of the "getContext()" operation.
Revised Text: In Subclause 7.5.4.2.1 AcceptEventAction, change the OCL for constraint [1] fUML_active_context to: self.context.oclAsType(Class).isActive
Actions taken:
October 6, 2009: received issue
July 23, 2010: closed issue

Discussion:
  


Issue 14532: References to uml::Class in OCL (fuml-ftf)

Click
here for this issue's archive.
Source: Model Driven Solutions (Mr. Ed Seidewitz, ed-s(at)modeldriven.com)
Nature: Uncategorized Issue
Severity:
Summary:
Specification: Semantics of a Foundational Subset for Executable UML Models (ptc/2008-11-03)  Subclauses: 7.5.4.2.1 AcceptEventAction, 7.5.4.2.2 ReadExtentAction, 7.5.4.2.4 ReclassifyObjectAction         The OCL for constraint [3] of AcceptEventAction, constraint [1] of ReadExtentAction and constraint [1] of ReclassifyObjectAction reference �uml::Class�. These references should be changed to just �Class� (i.e., Class from the fUML abstract syntax model).    

Resolution: Agreed.
Revised Text: The OCL for constraint [3] of AcceptEventAction, constraint [1] of ReadExtentAction and constraint [1] of ReclassifyObjectAction, change references to "uml::Class" to "Class".
Actions taken:
October 6, 2009: received issue
July 23, 2010: closed issue

Issue 14533: Include activity diagrams for classifier behaviors (fuml-ftf)

Click
here for this issue's archive.
Source: Model Driven Solutions (Mr. Ed Seidewitz, ed-s(at)modeldriven.com)
Nature: Uncategorized Issue
Severity:
Summary:
Specification: Semantics of a Foundational Subset for Executable UML Models (ptc/2008-11-03)  Subclauses:  8.4.3.2.2 ClassifierBehaviorExecutionActivity, 8.4.3.2.4 EventDispatchLoop         These are activities that should be the classifier behaviors for ClassifierBehaviorExecution and ObjectActivation and activity diagrams should be included in the specification document for them, rather than class descriptions.       

Resolution: Agreed.
Revised Text: Remove Subclauses 8.4.3.2.2 ClassifierBehaviorExecutionActivity and 8.4.3.2.4 EventDispatchLoop. In Subclause 8.4.3.2.1 ClassifierBehaviorExecution, add the following figure: Figure XX Classifier Behavior for ClassifierBehaviorExecution Change Subclause 8.4.3.2.6 ObjectActivation to 8.4.3.2.5 and add the following figure: Figure XX Classifier Behavior for ObjectActivation
Actions taken:
October 6, 2009: received issue
July 23, 2010: closed issue

Issue 14545: Variable needs initialization in InputPinActivation::receiveOffer (fuml-ftf)

Click
here for this issue's archive.
Source: Model Driven Solutions (Mr. Ed Seidewitz, ed-s(at)modeldriven.com)
Nature: Uncategorized Issue
Severity:
Summary:
Specification: Semantics of a Foundational Subset for Executable UML Models (ptc/2008-11-03)  Subclause:  8.6.2.2.5 InputPinActivation         In the method for InputPinActivation::receiveOffer, the declaration �boolean ready;� should have an initialization, per the requirements of Annex A.    

Resolution: Actually, the offending declaration is in the method for isReady, not receiveOffer. It should have an initialization.
Revised Text: In Subclause 8.6.2.2.5, at the beginning of the InputPinActivation::isReady code, replace: boolean ready; if (!super.isReady()) { ready = false; } else { � with: boolean ready = super.isReady; if (ready) { �
Actions taken:
October 8, 2009: received issue
July 23, 2010: closed issue

Issue 14547: Structured activity node execution model needs to be corrected (fuml-ftf)

Click
here for this issue's archive.
Source: Model Driven Solutions (Mr. Ed Seidewitz, ed-s(at)modeldriven.com)
Nature: Uncategorized Issue
Severity:
Summary:
Specification: Semantics of a Foundational Subset for Executable UML Models (ptc/2008-11-03)  Subclause:  8.5.3 Complete Structured Activities, 8.5.4 Extra Structured Activities         The execution model for structured activity nodes has never been tested and thus likely contains errors. At the very least, the specifications for ConditionalNodeActivation and LoopNodeActivation need to be corrected to reflect the fact that the test and body properties only reference executable nodes, not all the nodes that might be contained in the structured activity node and the specification for StructuredActivityNode needs to handle input and output pins.         

Resolution: The execution model for structured activity nodes, conditional nodes, loop nodes and expansion regions has now been updated and tested, per the proposed revisions to the specification text.
Revised Text: In Subclause 8.5.2.2.5, ActivityNodeActivationGroup: � Replace the code for the getNodeActivation operation with: // Return the node activation (if any) in this group, // or any nested group, corresponding to the given activity node. // If this is a group for a structured activity node activation, // also include the pin activations for that node activation. ActivityNodeActivation activation = null; if (this.containingNodeActivation != null && node instanceof Pin) { activation = this.containingNodeActivation.getPinActivation((Pin)node); } } if (activation == null) { int i = 1; while (activation == null & i <= this.nodeActivations.size()) { activation = this.nodeActivations.getValue(i-1).getNodeActivation(node); i = i + 1; } } return activation; In Subclause 8.5.3.2.1, ClauseActivation: � Replace the code for the isReady operation with: // Test if all predecessors to this clause activation have failed. ClauseActivationList predecessors = this.getPredecessors(); boolean ready = true; int i = 1; while (ready & i <= predecessors.size()) { ClauseActivation predecessor = predecessors.getValue(i-1); BooleanValue decisionValue = predecessor.getDecision(); // Note that the decision will be null if the predecessor clause has not run yet. if (decisionValue == null) { ready = false; } else { ready = !decisionValue.value; } i = i + 1; } return ready; In Subclause 8.5.3.2.2, ConditionalNodeActivation: � In the doStructuredActivity operation, at the beginning add: // Run all the non-executable nodes in the conditional node. After the statement "ConditionalNode node = (ConditionalNode)(this.node);", add: ActivityNodeActivationList nodeActivations = this.activationGroup.nodeActivations; ActivityNodeActivationList nonExecutableNodeActivations = new ActivityNodeActivationList(); for (int i = 0; i < nodeActivations.size(); i++) { ActivityNodeActivation nodeActivation = nodeActivations.getValue(i); if (!(nodeActivation.node instanceof ExecutableNode)) { nonExecutableNodeActivations.addValue(nodeActivation); } } this.activationGroup.run(nonExecutableNodeActivations); After the statement "clauseActivation.clause = clause;", add: clauseActivation.conditionalNodeActivation = this; Move the statement "this.activationGroup.terminateAll();" to the end of the code. After the statement "Clause selectedClause = this.selectedClauses.getValue(i-1);", add: for (int j = 0; j < clauses.size(); j++) { Clause clause = clauses.getValue(i); if (clause != selectedClause) { ExecutableNodeList nodes = clause.test; for (int k = 0; k < nodes.size; k++) { ExecutableNode node = nodes.getValue(k); this.activationGroup.getNodeActivation(node).terminate(); } } } In Subclause 8.5.3.2.3, LoopNodeActivation: � Replace the code for the doStructuredActivity operation with: // Set the initial values for the body outputs to the values of the loop variable input pins. // If isTestedFirst is true, then repeatedly run the test part and the body part of the loop, copying values from the body outputs to the loop variables. // If isTestedFirst is false, then repeatedly run the body part and the test part of the loop, copying values from the body outputs to the loop variables. // When the test fails, copy the values of the body outputs to the loop outputs. // [Note: The body outputs are used for the loop outputs, rather than the loop variables, since values on the loop variables may be consumed when running the test for the last time.] LoopNode loopNode = (LoopNode)(this.node); InputPinList loopVariableInputs = loopNode.loopVariableInput; OutputPinList loopVariables = loopNode.loopVariable; OutputPinList resultPins = loopNode.result; ValuesList bodyOutputLists = this.bodyOutputLists; for (int i = 0; i < loopVariableInputs.size(); i++) { InputPin loopVariableInput = loopVariableInputs.getValue(i); Values bodyOutputList = new Values(); bodyOutputList.values = this.takeTokens(loopVariableInput); this.bodyOutputLists.addValue(bodyOutputList); } boolean continuing = true; do { // Set loop variable values this.runLoopVariables(); for (int i = 0; i < loopVariables.size(); i++) { OutputPin loopVariable = loopVariables.getValue(i); Values bodyOutputList = bodyOutputLists.getValue(i); ValueList values = bodyOutputList.values; this.putPinValues(loopVariable, values); ((OutputPinActivation)this.activationGroup.getNodeActivation(loopVariable)). sendUnofferedTokens(); } // Run all the non-executable, non-pin nodes in the conditional node. ActivityNodeActivationList nodeActivations = this.activationGroup.nodeActivations; ActivityNodeActivationList nonExecutableNodeActivations = new ActivityNodeActivationList(); for (int i = 0; i < nodeActivations.size(); i++) { ActivityNodeActivation nodeActivation = nodeActivations.getValue(i); if (!(nodeActivation.node instanceof ExecutableNode | nodeActivation.node instanceof Pin)) { nonExecutableNodeActivations.addValue(nodeActivation); } } this.activationGroup.run(nonExecutableNodeActivations); // Run the loop if (loopNode.isTestedFirst) { continuing = this.runTest(); if (continuing) { this.runBody(); } } else { this.runBody(); continuing = this.runTest(); } this.activationGroup.terminateAll(); } while (continuing); for (int i = 0; i < bodyOutputLists.size(); i++) { Values bodyOutputList = bodyOutputLists.getValue(i); OutputPin resultPin = resultPins.getValue(i); this.putTokens(resultPin, bodyOutputList.values); } � In the runTest operation, replace the statement return ((BooleanValue)(this.getPinValues(loopNode.decider).getValue(0))).value; with: ValueList values = this.getPinValues(loopNode.decider); // If there is no decider value, treat it as false. boolean decision = false; if (values.size() > 0) { decision = ((BooleanValue)(values.getValue(0))).value; } return decision; � Replace the code for the runBody operation with: // Run the body part of the loop node for this node activation and save the body outputs. LoopNode loopNode = (LoopNode)this.node; this.activationGroup.runNodes(this.makeActivityNodeList(loopNode.bodyPart)); OutputPinList bodyOutputs = loopNode.bodyOutput; ValuesList bodyOutputLists = this.bodyOutputLists; for (int i = 0; i < bodyOutputs.size(); i++) { OutputPin bodyOutput = bodyOutputs.getValue(i); Values bodyOutputList = bodyOutputLists.getValue(i); bodyOutputList.values = this.getPinValues(bodyOutput); } In Subclause 8.5.3.2.4, StructuredActivityNodeActivation: � At the beginning of the doStructuredActivity operation, add: 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(); } � In the getNodeActivation operation, replace: ActivityNodeActivation activation; if (thisActivation != null) { activation = thisActivation; } else { activation = this.activationGroup.getNodeActivation(node); } with: ActivityNodeActivation activation = null; if (thisActivation != null) { activation = thisActivation; } else if (this.activationGroup != null) { activation = this.activationGroup.getNodeActivation(node); } � At the beginning of the createNodeActivations operation, add: super.createNodeActivations(); � Replace the code for makeActivityNodeList with: // 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 inputPin = outputPins.getValue(j); activityNodes.addValue(outputPin); } } } return activityNodes; In Figure 72 and Subclause 8.5.4.2.1, for class ExpansionRegionActivationGroup: � Add the following description for the attribute regionActivation The expansion region activation this activation group is for. � Add the attribute index: Integer with the description: The index (starting at 1) of this activation group in the list held by the expansion region activation. � Add the operation getActivityExecution() with the code: // Get the activity execution that contains the expansion region activation for this activation group. return this.regionActivation.getActivityExecution(); In Subclause 8.5.4.2.3, ExpansionRegionActivation: � Add the following association descriptions: activationGroups The set of expansion activation groups for this expansion region activation. One activation group is created corresponding to each token held by the first input expansion node activation for the expansion region. inputExpansionTokens The tokens taken from each of the input expansion node activations for this expansion region activation. These are preserved for initializing the group input of each of the activation groups. inputTokens The tokens taken from each of the input pin activations for this expansion region activation. These are preserved for initializing the region inputs of each of the activation groups. � In the takeOfferedTokens operation: Replace the initial comment with "// Take the tokens from the input pin and input expansion node activations and save them." Remove all the code after the second for loop and before the return statement. � Replace the code for the doStructuredActivity operation with: // Create a number of expansion region activation groups equal to the number of values expanded in the region, // setting the region inputs and group inputs for each group. // Run the body of the region in each group, either iteratively or in parallel. // Add the outputs of each activation group to the corresonding output expansion node activations. ExpansionRegion region = (ExpansionRegion)this.node; InputPinList inputPins = region.input; ExpansionNodeList inputElements = region.inputElement; ExpansionNodeList outputElements = region.outputElement; int n = this.inputExpansionTokens.getValue(0).tokens.size(); int k = 1; while (k <= n) { ExpansionActivationGroup activationGroup = new ExpansionActivationGroup(); activationGroup.regionActivation = this; activationGroup.index = k; int j = 1; while (j <= inputPins.size()) { OutputPinActivation regionInput = new OutputPinActivation(); regionInput.run(); activationGroup.regionInputs.addValue(regionInput); j = j + 1; } j = 1; while (j <= inputElements.size()) { OutputPinActivation groupInput = new OutputPinActivation(); groupInput.run(); activationGroup.groupInputs.addValue(groupInput); j = j + 1; } j = 1; while (j <= outputElements.size()) { OutputPinActivation groupOutput = new OutputPinActivation(); groupOutput.run(); activationGroup.groupOutputs.addValue(new OutputPinActivation()); j = j + 1; } activationGroup.createNodeActivations(region.node); activationGroup.createEdgeInstances(region.edge); this.activationGroups.addValue(activationGroup); k = k + 1; } ExpansionActivationGroupList activationGroups = this.activationGroups; if (region.mode == ExpansionKind.iterative) { for (int i = 0; i < activationGroups.size(); i++) { ExpansionActivationGroup activationGroup = activationGroups.getValue(i); this.runGroup(activationGroup); } } else if (region.mode == ExpansionKind.parallel) { // *** Activate all groups concurrently. *** for (Iterator i = activationGroups.iterator(); i.hasNext();) { ExpansionActivationGroup activationGroup = (ExpansionActivationGroup)i.next(); this.runGroup(activationGroup); } } for (int i = 0; i < activationGroups.size(); i++) { ExpansionActivationGroup activationGroup = activationGroups.getValue(i); OutputPinActivationList groupOutputs = activationGroup.groupOutputs; for (int j = 0; j < groupOutputs.size(); j++) { OutputPinActivation groupOutput = groupOutputs.getValue(j); ExpansionNode outputElement = outputElements.getValue(j); this.getExpansionNodeActivation(outputElement). addTokens(groupOutput.takeTokens()); } } � In the isReady operation, replace boolean ready = false; if (super.isReady()) { � With: boolean ready = super.isReady(); if (ready) { � � In Figure 72 and Subclause 8.5.4.2.3, rename the activateGroup operation to runGroup and replace its code with: // Set up the inputs for the group with the given index, run the group and then fire the group outputs. TokenSetList inputTokens = this.inputTokens; for (int j = 0; j < inputTokens.size(); j++) { TokenSet tokenSet = inputTokens.getValue(j); OutputPinActivation regionInput = activationGroup.regionInputs.getValue(j); regionInput.clearTokens(); regionInput.addTokens(tokenSet.tokens); regionInput.sendUnofferedTokens(); } TokenSetList inputExpansionTokens = this.inputExpansionTokens; for (int j = 0; j < inputExpansionTokens.size(); j++) { TokenSet tokenSet = inputExpansionTokens.getValue(j); OutputPinActivation groupInput = activationGroup.groupInputs.getValue(j); groupInput.clearTokens(); groupInput.addToken(tokenSet.tokens.getValue(activationGroup.index-1)); regionInput.sendUnofferedTokens(); } activationGroup.run(activationGroup.nodeActivations); OutputPinActivationList groupOutputs = activationGroup.groupOutputs; for (int i = 0; i < groupOutputs.size(); i++) { OutputPinActivation groupOutput = groupOutputs.getValue(i); groupOutput.fire(groupOutput.takeOfferedTokens()); } activationGroup.terminateAll(); In Subclause 8.6.2.2.1, ActionActivation: � In the SendOffers operation, replace: // *** Fire all output pins concurrently. *** with: // *** Send offers from all output pins concurrently. *** And replace: pinActivation.fire(pinActivation.takeOfferedTokens()); with: pinActivation.sendUnofferedTokens(); In subclause 8.5.4.2.4, TokenSet: � Add the class description: A set of tokens taken from an input pin activation or input expansion node activation for an expansion region. � Add the association description tokens The set of tokens in this token set. In Subclause 8.6.2.2.7, OutputPinActivation, remove the isReady and fire operations. In Figure 74 and Subclause 8.6.2.2.8, change the multiplicity of PinActivation::actionActivation to 0..1.
Actions taken:
October 8, 2009: received issue
July 23, 2010: closed issue

Issue 14550: Revise fUML to be based on UML 2.3 (fuml-ftf)

Click
here for this issue's archive.
Source: Model Driven Solutions (Mr. Ed Seidewitz, ed-s(at)modeldriven.com)
Nature: Uncategorized Issue
Severity:
Summary:
Specification: Semantics of a Foundational Subset for Executable UML Models (ptc/2008-11-03)        The fUML syntax subset and its semantics are currently based on UML 2.2. The UML 2.3 resolved a number of issues relevant to execution semantics. The fUML specification should be updated so it is based on UML 2.3 rather than UML 2.2.         Relevant semantic issues include, in particular:         - 6111 Reentrancy 1    - 9863 Section: Actions � Output of read actions for no values    - 9870 Actions on non-unique properties with location specified    - 9858 Default weight    - 9873 Section: Common Behavior � isReentrant should default to true    - 10045 11.3.47 on StructuralFeatureAction (and related sections on subclasses)    - 11646 StructuredActivityNode    - 13898 what's the difference > between weight=1 and weight=*?    - 13914 Clarify that input pins do not accept more tokens than their actions can immediately consume    

Resolution: In addition to the issues noted above, the following UML RTF Issues resolved in UML 2.3 make abstract syntax changes within the fUML subset. While these do not result in any semantic changes, they should be made in the fUML abstract syntax to ensure that it remains a proper subset of the UML 2.3 abstract syntax. � 8682 A test case cannot be empty � 10081 Section 13.2 (body property of OpaqueBehavior) � 10515 Section 7 (property isLeaf inherited by Class) � 12558 Section 13.3 (multiplicity of Reception::signal) For the issues identified in the issue, which do have semantic effect, the following summarizes the changes needed in the fUML Execution Model. � 6111 - The resolution to this issue adds the attribute isLocallyReentrant to Action. The default is false, meaning that an action cannot fire more than once concurrently within the same activity execution. The current fUML behavior effectively presumes isLocallyReentrant=true, that is, that all actions can fire multiple times concurrently. The fUML semantics should be updated to support isLocallyReentrant=false as the default, as well as isLocallyReentrant=true. This requires adding an attribute to the ActionActivation class to record that the action is firing and checking this in the isReady operation. The check at the end of an action firing for whether an action should fire again should trigger any firing that is still pending after being delayed by a lack of local reentrancy. � 9863 - The resolution of this issue clarifies that a read structural feature action will offer a null token if it reads an empty structural feature and that a read link action will offer a null token if there are no matching links. Currently, the fUML semantics are that no offers are made from an object node that contains no tokens, including the output pins of actions. This should be changed in general so that an object node offers a null token when it fires and holds no tokens. This can be done by overriding the sendOffers operation in ObjectNodeActivation. � 9858 - This issue suggested that the default activity edge weight should be * rather than 1. However, the resolution clarified that weight=1 actually does have the behavior the issue writer desired, so the issue was closed with no change. ActivityEdge::weight is defined in the CompleteActivities package, so it is not actually included in the fUML subset. However, this issue resolution means that the current fUML semantics are, in fact, consistent with the default weight=1, rather than weight=*, as previously thought. � 9870 - The resolution of this issue changes remove structural feature value actions so that they do not have a value pin if they have a removeAt pin. This requires an update to the RemoveStructuralFeatureValueActionActivation::doAction operation. � 9873 - The resolution of this issue changes the default to true for Behavior::isReentrant. However, the fUML subset already requires this, so no change is necessary. The fUML semantics are now consistent with the UML default, however. � 10045 - The resolution of this issue clarifies that a structural feature action can be used to read and write an association end of a binary association as if it was a feature of the opposite classifier, even if the end is not actually owned by that classifier. This requires updating the doAction operations of the various structural feature action activation classes so that the actions behave like the corresponding link action if their structural feature is an association end. (Note that association ends are never classifier-owned in fUML.) � 11646 - The resolution of this issue adds structuredNodeInput and structuredNodeOutput properties to StructuredActivityNode, subsetting the input and output properties of Action. This allows structured activity nodes to properly own input and output pins. However, this actually has no direct effect on the fUML Execution Model, which already presumed that structured activity nodes could own pins, but referenced them using the inherited Action::input and output properties. � 13898 - The resolution to this issue clarifies that the weight on an activity edge only specifies the minimum number of tokens that must be accepted for tokens to flow, not the maximum number that can flow. The fUML semantics are consistent with the default of weight=1. (See also the discussion of Issue 9858 above.) � 13914 - The resolution to this issue clarifies that an input pin cannot accept more tokens than their actions can immediately consume. Currently, fUML semantics allows an input pin to accept all tokens offered to it, which then can be consumed by its action over multiple firings. This can be corrected by overriding the takeOfferedTokens operation in PinActivation to take no more tokens than the multiplicity upper bound of the pin. (Note that by doing this in PinActivation rather than InputPinActivation, an output pin of a structured activity node is also restricted to not take more tokens than its multiplicity upper bound from its incoming flows - which is correct per UML Superstructure Subclause 11.3.27.) This also requires updating the takeOfferedTokens operation on ActivityEdgeInstance to allow taking a specific number of tokens, rather than just the next group of tokens offered together.
Revised Text: Text Changes In Clause 3 Normative References, replace the three UML 2.2 references with the following : UML 2.3 Beta 2 Infrastructure Specification (ptc/09-09-11) UML 2.3 Beta 2 Superstructure convenience document (ptc/09-09-09) In Subclause 6.1 Changes to Adopted OMG Specifications: � Remove the first bullet after "The following areas have been identified as semantic inconsistencies at this time." � Replace the final paragraph with: NOTE: The foundational subset is based on UML 2.3. Particular changes made in UML 2.2 and UML 2.3 over previous UML versions that are incorporated into the foundational subset include changes to decisions nodes, structural feature actions and structured activity nodes, the addition of the "isLocallyReentrant" property to actions and the addition of the start object behavior action. In Subclause 8.5.2.1 Overview, remove the last paragraph (beginning "NOTE: The UML 2 Superstructure Specification (Subclause 12.3.6) states that�"). Abstract Syntax Changes In Figure 19 and Subclause 7.2.2.2.4, add the attribute Classifier::isFinalSpecification: Boolean. In Figure 38 and Subclause 7.5.2.2.1, add the attribute Action::isLocallyReentrant = false. In Figure 42 and Subclause 7.5.3.2.20, change the multiplicity of WriteStructuralFeatureAction::value from 1 to 0..1. In Figure 35 and Subclause 7.4.3.2.1, change the multiplicity of Clause::test to 1..*. In Figure 35 and Subclause 7.4.3.2.4, change the multiplicity of LoopNode::test to 1..*. In Figure 35 and Subclause 7.4.3.2.5, add the associations StructuredActivityNode::structuredNodeInput: InputPin[0..*] {subsets Action::input} and structuredNoteOutput: OutputPin[0..*] {subsets Action::output} associations. In the normative XMI, change ConditionalNode::result from {subsets Action::output} to {redefines StructuredActivityNode::structuredNodeOutput}. In the normative XMI, change LoopNode::loopVariableInput from {subsets Action::input} to {redefines StructuredActivityNode::structuredNodeInput} and result from {subsets Action::output} to {redefines StructuredActivityNode::structuredNodeOutput}. In Figure 26 and Subclause 7.3.2.2.4, change the default value for Behavior::isReentrant to true. In the normative XMI, add {nonunique} to OpaqueBehavior::body. In Figure 27 and in Subclause 7.3.3.2.3, change the multiplicity of Reception::signal from 0..1 to 1. Remove the constraint "A reception must have an associated signal." Change "a_signal_but_no_method" to "no_method", with the OCL "self.method -> isEmpty()". Execution Model Changes In Figure 68: � In ActivityEdgeInstance: o Rename the operation "countOfferedTokens" to "countOfferedValues". o Add the operation "takeOfferedTokens(maxCount: Integer): Token[*]". o Remove the operation "getNextOffer". � In ObjectNodeActivation: o Add the operation "sendOffers(tokens: Token[*])" o Add the operation "countOfferedValues". � In Offer: o Rename the operation "countOfferedTokens" to "countOfferedValues". o Add the operation "removeOfferedValues(count: Integer)". o Add the operation "hasTokens(): Boolean". In Figure 73: � Remove the operation "countUnofferedTokens" from ExpansionNodeActivation. In Figure 74: � Add the attribute "firing: Boolean" and the operation "isFiring():Boolean" to ActionActivation. � Remove the operation "countUnofferedTokens" from InputPinActivation. � Add the operation "takeOfferedTokens(): Tokens[*]" to PinActivation. In Figure 76: � Add the operations "getAssociation(feature: StructuralFeature): Association[0..1]", "getMatchingLinks(association: Association, end: StructuralFeature, oppositeValue: Value): Link[*]" and "getOppositeEnd(association: Association, end: StructuralFeature): Property" to StructuralFeatureActionActivation. In Subclause 8.3.2.2.11 Link: � In the operation destroy, after the initial comment add: // Shift the positions of the feature values of any remaining links in // the extent of the same association, for ends that are ordered. PropertyList ends = this.type.memberEnd; ExtensionalValueList extent = this.locus.getExtent(this.type); for (int i = 0; i < extent.size(); i++) { ExtensionalValue otherLink = extent.getValue(i); for (int j=0; j < ends.size(); j++) { Property end = ends.getValue(j); if (end.multiplicityElement.isOrdered) { FeatureValue featureValue = otherLink.getFeatureValue(end); if (this.getFeatureValue(end).position < featureValue.position) { featureValue.position = featureValue.position - 1; } } } } In Subclause 8.5.2.2.1 ActivityEdgeInstance: � Rename the operation "countOfferedTokens" to "countOfferedValues" and replace the code with: // 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; � Replace the code for the operation takeOfferedTokens with: // 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; � Add the operation takeOfferedTokens(maxCount: Integer): Token[*] with the code: // 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.offer.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); } } remainingCount = 0; } } return tokens; � Replace the code for getOfferedTokens with: // 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; � Replace the code for hasOffer with: // 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; � Remove the operation getNextOffer. In Subclause 8.5.2.2.15 ObjectNodeActivation: � Add the operation sendOffers(tokens: Token[*]) with the code: // If the set of tokens to be sent is empty, then offer a null token instead. // Otherwise, offer the given tokens as usual. if (tokens.size() == 0) { tokens.addValue(new ObjectToken()); } super.sendOffers(tokens); � In the operation addToken, replace the lines // Transfer the given token to be held by this node only if it is a control token. // If it is a control token, consume it without holding it. if (token.getValue().isControl()) { with: // Transfer the given token to be held by this node only if it is a non-null object token. // If it is a control token or a null token, consume it without holding it. if (token.getValue() == null) { � Add the operation countTotalValues with the code: // Count the total number of non-null object tokens being offered to this node activation. int totalValueCount = 0; int i = 1; while (i <= this.incomingEdges.size()) { totalValueCount = totalValueCount + this.incomingEdges.getValue(i-1).countOfferedValues(); i = i + 1; } return totalValueCount; In Subclause 8.5.2.2.17 Offer: � Add the description: An offer is a group of tokens offered together. The grouping of offered tokens into offers usually does not matter for how the tokens may be accepted. However, control and object tokens may become grouped together in the same offer due to a join node that has both incoming control and object flows. In this case, the control tokens are implicitly accepted once all the object tokens in the same offer have been accepted. � Rename the operation "countOfferedTokens" to "countOfferedValues" and replace its code with: // Return the number of values being offered on object tokens. this.removeWithdrawnTokens(); int count = 0; for (int i = 0; i < this.offeredTokens.size(); i++) { if (this.offeredTokens.getValue(i).getValue() != null) { count = count + 1; } } return count; � In the operation getOfferedTokens, change the comment to // Get the offered tokens, removing any that have been withdrawn. and after that add: this.removeWithdrawnTokens(); � Add the operation removeOfferedValues(count: Integer), with the code: // Remove the given number of non-null object tokens from those in this offer. int n = count; int i = 1; while (n > 0) { if (this.offeredTokens.getValue(i-1).getValue() != null) { this.offeredTokens.removeValue(i-1); } else { i = i + 1; } n = n - 1; } � Add the operation "hasTokens(): Boolean", with the code: // Check whether this offer has any tokens that have not been withdrawn. this.removeWithdrawnTokens(); return this.offeredTokens.size() > 0; In Subclause 8.5.4.2.2 ExpansionNodeActivation: � Remove the operation countUnofferedTokens. In Subclause 8.5.4.2.3 ExpansionRegionActivation: � In the operations isReady and numberOfValues, replace occurrences of "countUnofferedTokens" with "countOfferedValues". In Subclause 8.6.2.2.1 Action Activation: � Under Attributes, add: firing: Boolean Whether this action activation is already firing. This attribute is only used if the action for this action activation has isLocallyReentrant = false (the default). If isLocallyReentrant=true, then firing always just remains false. � Add the operation isFiring():Boolean, with the code: // Indicate whether this action activation is currently firing or not. return firing; � In the run operation, add the following line at the end: this.firing = false; � In the isReady operation, change the initial comment line to // In addition to the default condition, check that, if the action has isLocallyReentrant=false, then the activation is not currently firing, // and that the sources of all incoming edges (control flows) have offers and all input pin activations are ready. Change the line: boolean ready = super.isReady(); to: boolean ready = super.isReady() & (((Action)this.node).isLocallyReentrant | !this.isFiring()); � Replace the code for the fire operation with: // Do the main action behavior then concurrently fire all output pin activations // and offer a single control token. Then activate the action again, // if there are still enough tokens available to the input pins // and the action has no incoming control flows. Debug.println("[fire] Action " + this.node.name + "..."); Action action = (Action)this.node; InputPinList inputPins = action.input; boolean fireAgain = false; do { this.doAction(); this.sendOffers(); Debug.println("[fire] Checking if " + this.node.name + " should fire again..."); fireAgain = inputPins.size() > 0 & action.incoming.size() == 0; int j = 1; while (fireAgain & j <= inputPins.size()) { PinActivation inputPinActivation = this.getPinActivation(inputPins.getValue(j-1)); fireAgain = inputPinActivation.isReady(); j = j + 1; } } while (fireAgain); // Note: If the action is not locally reentrant, then this is the only firing. // If the action is locally reentrant, then firing always remains false anyway. // In either case, isolation is not required. this.firing = false; � At the beginning of the takeOfferedTokens operation, add: // Note: This is included here to happen in the same isolation scope as the isReady test. this.firing = !((Action)this.node).isLocallyReentrant; In Subclause 8.6.2.2.5 InputPinActivation: � Replace the code of operation isReady with: // Return true if the total number of values already being offered by this pin plus those being offered // by the sources of incoming edges is at least equal to the minimum multiplicity of the pin. boolean ready = super.isReady(); if (ready) { int totalValueCount = this.countUnofferedTokens() + this.countOfferedValues(); int minimum = ((Pin)this.node).multiplicityElement.lower; ready = totalValueCount >= minimum; } return ready; � Remove operation countUnofferedTokens. In Subclause 8.6.2.2.8 PinActivation: � Add the operation takeOfferedTokens(): Tokens[*] with the code: // 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) { int upper = ((Pin)(this.node)).multiplicityElement.upper.naturalValue; } TokenList tokens = new TokenList(); // Note: upper < 0 indicates an unbounded upper multiplicity. if (upper < 0 | count < upper) { ActivityEdgeInstance 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; In Subclause 8.6.3.2.1 AddStructuralFeatureValueAction: � Replace the code for doAction with: // Get the values of the object and value input pins. // If the given feature is an association end, then create a link between the object and value inputs. // Otherwise, if the object input is a structural value, then add a value to the values for the feature. // If isReplaceAll is true, first remove all current matching links or feature values. // If isReplaceAll is false and there is an insertAt pin, insert the value at the appropriate position. AddStructuralFeatureValueAction action = (AddStructuralFeatureValueAction)(this.node); StructuralFeature feature = action.structuralFeature; Association association = this.getAssociation(feature); Value value = this.takeTokens(action.object).getValue(0); ValueList inputValues = this.takeTokens(action.value); // NOTE: Multiplicity of the value input pin is required to be 1..1. Value inputValue = inputValues.getValue(0); int insertAt = 0; if (action.insertAt != null) { insertAt = ((UnlimitedNaturalValue)this.takeTokens(action.insertAt).getValue(0)).value.naturalValue; } if (association != null) { LinkList links = this.getMatchingLinks(association, feature, value); Property oppositeEnd = this.getOppositeEnd(association, feature); int position = 0; if (oppositeEnd.multiplicityElement.isOrdered) { position = -1; } if (action.isReplaceAll) { for (int i = 0; i < links.size(); i++) { Link link = links.getValue(i); link.destroy(); } } else if (feature.multiplicityElement.isUnique) { for (int i=0; i < links.size(); i++) { Link link = links.getValue(i); FeatureValue featureValue = link.getFeatureValue(feature); if (featureValue.values.getValue(0).equals(inputValue)) { position = link.getFeatureValue(oppositeEnd).position; if (insertAt > 0 & featureValue.position < insertAt) { insertAt = insertAt - 1; } link.destroy(); } } } Link newLink = new Link(); newLink.type = association; // This necessary when setting a feature value with an insertAt position newLink.locus = this.getExecutionLocus(); newLink.setFeatureValue(feature, inputValues, insertAt); ValueList oppositeValues = new ValueList(); oppositeValues.addValue(value); newLink.setFeatureValue(oppositeEnd, oppositeValues, position); newLink.locus.add(newLink); } else if (value instanceof StructuredValue) { StructuredValue structuredValue = (StructuredValue)value; if (action.isReplaceAll) { structuredValue.setFeatureValue(feature, inputValues, 0); } else { FeatureValue featureValue = structuredValue.getFeatureValue(feature); if (featureValue.values.size() > 0 & insertAt == 0 ) { // *** If there is no insertAt pin, then the structural feature must be unordered, and the insertion position is immaterial. *** insertAt = ((ChoiceStrategy)this.getExecutionLocus().factory.getStrategy("choice")).choose(featureValue.values.size()); } if (feature.multiplicityElement.isUnique) { // Remove any existing value that duplicates the input value int j = position(inputValue, featureValue.values, 1); if (j > 0) { featureValue.values.remove(j-1); if (insertAt > 0 & j < insertAt) { insertAt = insertAt - 1; } } } if (insertAt <= 0) { // Note: insertAt = -1 indicates an unlimited value of "*" featureValue.values.addValue(inputValue); } else { featureValue.values.addValue(insertAt - 1, inputValue); } } } if (action.result != null) { this.putToken(action.result, value); } In Subclause 8.6.3.2.3 ClearStructuralFeatureActionActivation: � Replace the code for doAction with: // Get the value of the object input pin. // If the given feature is an association end, then // destroy all links that have the object input on the opposite end. // Otherwise, if the object input is a structured value, then // set the appropriate feature of the input value to be empty. ClearStructuralFeatureAction action = (ClearStructuralFeatureAction)(this.node); StructuralFeature feature = action.structuralFeature; Association association = this.getAssociation(feature); Value value = this.takeTokens(action.object).getValue(0); if (association != null) { LinkList links = this.getMatchingLinks(association, feature, value); for (int i = 0; i < links.size(); i++) { link.destroy(); } } else if (value instanceof StructuredValue) { ((StructuredValue)value).setFeatureValue(action.structuralFeature, new ValueList(), 0); } if (action.result != null) { this.putToken(action.result, value); } In Subclause 8.6.3.2.4 CreateLinkActionActivation: � Replace the code for doAction with: // Get the extent at the current execution locus of the association for which a link is being created. // Destroy all links that have a value for any end for which isReplaceAll is true. // Create a new link for the association, at the current locus, with the given end data values, // inserted at the given insertAt position (for ordered ends). CreateLinkAction action = (CreateLinkAction)(this.node); LinkEndCreationDataList endDataList = action.endData; Association linkAssociation = this.getAssociation(); ExtensionalValueList extent = this.getExecutionLocus().getExtent(linkAssociation); Link oldLink = null; for (int i = 0; i < extent.size(); i++) { ExtensionalValue value = extent.getValue(i); Link link = (Link)value; boolean nomatch = true; int j = 1; while (noMatch & j <= endDataList.size()) { LinkEndCreationData endData = endDataList.getValue(j-1); if (endData.isReplaceAll & this.endMatchesEndData(link, endData)) { oldLink = link; link.destroy(); noMatch = false; } j = j + 1; } } Link newLink = new Link(); newLink.type = linkAssociation; // This necessary when setting a feature value with an insertAt position newLink.locus = this.getExecutionLocus(); for (int i = 0; i < endDataList.size(); i++) { LinkEndCreationData endData = endDataList.getValue(i); int insertAt; if (endData.insertAt == null) { insertAt = 0; } else { insertAt = ((UnlimitedNaturalValue)(this.takeTokens(endData.insertAt).getValue(0))).value.naturalValue; if (oldLink != null) { if (oldLink.getFeatureValue(endData.end).position < insertAt) { insertAt = insertAt - 1; } } } newLink.setFeatureValue(endData.end, this.takeTokens(endData.value), insertAt); } this.getExecutionLocus().add(newLink); In Subclause 8.6.3.2.9 ReadLinkActionActivation: � In the operation doAction, replace the first for loop with: FeatureValueList featureValues = new FeatureValueList(); for (int j = 0; j < extent.size(); j++) { ExtensionalValue value = extent.getValue(j); Link link = (Link)value; if (this.linkMatchesEndData(link, endDataList)) { FeatureValue featureValue = link.getFeatureValue(openEnd.end); if (!openEnd.end.multiplicityElement.isOrdered | featureValues.size() == 0) { featureValues.addValue(featureValue); } else { int n = featureValue.position; boolean continueSearching = true; int k = 0; while (continueSearching & k < featureValues.size()) { k = k + 1; continueSearching = featureValues.getValue(k-1).position < n; } featureValues.addValue(k-1, featureValue); } } } for (int j = 0; j < featureValues.size(); j++) { FeatureValue featureValue = featureValues.getValue(j); this.putToken(action.result, featureValue.values.getValue(0)); } In Subclause 8.6.3.2.11 ReadStructuralFeatureActionActivation: � Replace the code for the operation doAction with: // Get the value of the object input pin. // If the given feature is an association end, then get all values of the that end // for which the opposite end has the object input value and place them on the result pin. // Otherwise, if the object input value is a structural value, then get the values // of the appropriate feature of the input value and place them on the result output pin. ReadStructuralFeatureAction action = (ReadStructuralFeatureAction)(this.node); StructuralFeature feature = action.structuralFeature; Association association = this.getAssociation(feature); Value value = this.takeTokens(action.object).getValue(0); ValueList resultValues = new ValueList(); if (association != null) { LinkList links = this.getMatchingLinks(association, feature, value); for (int i = 0; i < links.size(); i++) { Link link = links.getValue(i); resultValues.addValue(link.getFeatureValue(feature).values.getValue(0)); } } else if (value instanceof StructuredValue) { resultValues = ((StructuredValue)value).getFeatureValue(feature).values; } this.putTokens(action.result, resultValues); In Subclause 8.6.3.2.12 RemoveStructuralFeatureValueActionActivation: � Replace the code for the operation doAction with: // 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.getMatchingLinks(association, feature, value); 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(); } } } } else if (value instanceof StructuredValue) { 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); } 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); } In Subclause 8.6.3.2.13 StructuralFeatureActionActivation: � Add the operation getAssociation(feature: StructuralFeature): Association[0..1] with the code: // 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; � Add the operation getMatchingLinks(association: Association, end: StructuralFeature, oppositeValue: Value): Link[*] with the code: // Get the links of the given binary association whose end opposite // to the given end has the given value 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)) { 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; } links.addValue(j-1, (Link)link); } } } return links; � Add the operation getOppositeEnd(association: Association, end: StructuralFeature): Property with the code: // 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;
Actions taken:
December 18, 2008: received issue
October 8, 2009: received issue
July 23, 2010: closed issue
July 23, 2010: closed issue

Issue 14556: ObjectNodeOrderingKind should be in Activities::IntermediateActivities (fuml-ftf)

Click
here for this issue's archive.
Source: Model Driven Solutions (Mr. Ed Seidewitz, ed-s(at)modeldriven.com)
Nature: Uncategorized Issue
Severity:
Summary:
Specification: Semantics of a Foundational Subset for Executable UML Models Syntax CMOF (ad/2008-08-05)         While it is not apparent in the spec document, in the normative Syntax CMOF, the enumeration ObjectOrderingKind is in the package Actions::BasicActions when it should be in Activities::IntermediateActivities (consistent with the UML Superstructure).    

Resolution: Per the resolution for Issue 14561, the enumeration ObjectOrderingKind is no longer needed in the fUML subset. Therefore, this issue is effectively handled by that resolution. Revised Text: None. Disposition: Duplicate/merged
Revised Text:
Actions taken:
October 12, 2009: received issue
July 23, 2010: closed issue

Issue 14561: Attributes introduced in CompleteActivities should not be included in the fUML subset (fuml-ftf)

Click
here for this issue's archive.
Source: Model Driven Solutions (Mr. Ed Seidewitz, ed-s(at)modeldriven.com)
Nature: Uncategorized Issue
Severity:
Summary:
Specification: Semantics of a Foundational Subset for Executable UML Models (ptc/2008-11-03)  Subclause:  7.4 Activities         In Subclause 7.4.1, it says that �The UML 2 Superstructure package CompleteActivities is excluded in its entirety from fUML�. However, there are several Activities metaclasses in the fUML subset that currently include attributes that are only introduced in CompleteActivities. These are:         Activity::isSingleExecution    ObjectFlow::isMulticast    ObjectFlow::isMultiReceive    ObjectNode::ordering    ObjectNode::isControlType    Pin::isControl    JoinNode::isCombineDuplicate    Parameter::isException    Parameter::isStream    Parameter::effect         These attributes should be removed from the fUML abstract syntax, along with any constraints that currently reference them. Note that metaclass properties that are the ends of associations introduced in CompleteActivities have already been excluded from the fUML subset.  

Resolution: Agreed. This is consistent with exclusions made in other areas of the fUML subset. In addition, once the attributes ObjectNode::ordering and Parameter::effect are removed, it is no longer necessary to include the enumerations ObjectNodeOrderingKind and ParameterEffectKind in the fUML subset.
Revised Text: In Subclause 7.2.2.2.26 Parameter, under Attributes, remove the entries for "isException", "isStream" and "effect". Remove constraint [1] no_exceptions_no_streaming_in_fUML. In Subclause 7.4.2.2.1 Activity, under Attributes, remove the entry for "isSingleExecution". Remove constraint [1] fUML_single_execution. In Subclause 7.4.2.2.12 JoinNode, under Attributes, remove the entry for "isCombineDuplicate" and replace it with "None". In Subclause 7.4.2.2.14 ObjectFlow, under Attributes, remove both entries and replace them with "None". Remove constraint [1] no_multicast_or_receive. In Subclause 7.4.2.2.15 ObjectNode, under Attributes, remove both entries and replace them with "None". Remove constraint [1] fifo_ordering_no_control. In Subclause 7.5.2.2.8 Pin, under Attributes, remove both entries and replace them with "None". (Note that the entry for "multiplicityElement" is spurious.) Remove constraint [1] isControl_fUML. Also remove the relevant attributes and constraint documentation from the diagrams shown in Figure 20 � Features, Figure 31 � Nodes, Figure 33 � Control Nodes, Figure 34 � Flows and Figure 39 � Basic Pins. Remove ObjectNodeOrderingKind from Figure 31 and ParameterEffectKind from Figure 20.
Actions taken:
October 14, 2009: received issue
July 23, 2010: closed issue

Issue 14618: ObjectNodeActivation::unofferedTokens is spurious (fuml-ftf)

Click
here for this issue's archive.
Source: Model Driven Solutions (Mr. Ed Seidewitz, ed-s(at)modeldriven.com)
Nature: Uncategorized Issue
Severity:
Summary:
Specification: Semantics of a Foundational Subset for Executable UML Models (ptc/2008-11-03)  Subclause:  8.5.2.2.15 ObjectNodeActivation        ObjectNodeActivation has an unofferedTokens association listed in 8.5.2.2.15 that is never used in any operation method and is not shown in Figure 69.  

Resolution: The association should be removed.
Revised Text: In Subclause 8.6.2.2.15, ObjectNodeActivation, under Associations, remove the entry for "unofferedTokens".
Actions taken:
November 10, 2009: received issue
July 23, 2010: closed issue

Issue 14990: Values passed out to pins from empty parameter nodes (fuml-ftf)

Click
here for this issue's archive.
Source: NIST (Dr. Conrad Bock, conrad.bock(at)nist.gov)
Nature: Revision
Severity: Significant
Summary:
    In UML empty parameter nodes are currently given the null value when an  activity terminates.  The semantics of ActivityParameterNode says: "If  some output parameter nodes are empty at that time [when the activity is  finished], they are assigned the null token, and the activity  terminates.      If it is decided that the execution engine should not reflect the above  semantics, then UML needs an additional attribute on  ActivityParameterNode to indicate whether null tokens are passed out to  pins when the activity is finished executing and the activity parameter  node is empty, or whether nothing is passed out.  In ExecUML this  attribute value would always be for the second option.

Resolution: Resolution: The resolution to Issue 14550, in response to UML Issue 9863 on the output of read actions for no values, changes the fUML semantics so that the discrepancy described in this issue no longer exists. Revised Text: None. Disposition: Duplicate/Merged
Revised Text:
Actions taken:
January 19, 2010: received issue
July 23, 2010: closed issue

Issue 14992: UML input pins do not accept more tokens than their actions can immediately consume (fuml-ftf)

Click
here for this issue's archive.
Source: NIST (Dr. Conrad Bock, conrad.bock(at)nist.gov)
Nature: Revision
Severity: Significant
Summary:
UML input pins do not accept more tokens than their actions can  immediately consume.  The execution engine should reflect this.      The Activities, Action, Semantics, item 1, says "The object flow  prerequisite is satisfied when all of the input pins are offered all  necessary tokens and accept them all at once, precluding them from being  consumed by any other actions. This ensures that multiple action  executions competing for tokens do not accept only some of the tokens  they need to begin, causing deadlock as each execution waits for tokens  that are already taken by others."      The "necessary tokens" in the first sentence above are the ones needed  to execute the actions (meeting the minimum multiplicity), but should  include any additional ones offered up the maximum multiplicity.  Only  these are accepted by the input pins, then immediately consumed by the  action.  The second sentence gives the motivation, which is to avoid  having tokens in input pins that are not immediately consumed.  This  would prevent those tokens from being used to execute other actions,  potentially creating deadlock or starvation.  Deadlock is discussed more  in issue 7221 of the UML 2.0 FTF report  (http://doc.omg.org/ptc/04-10-01).    This is also clarified in the revised text for UML RTF issue 13914.

Resolution: Resolution: The resolution to Issue 14550, in response to UML Issue 13914, changes the fUML semantics so that the fUML semantics reflect the constraint discussed in the issue. Revised Text: None. Disposition: Duplicate/Merged
Revised Text:
Actions taken:
January 10, 2010: received issue
July 23, 2010: closed issue

Issue 15004: Diagram graphics in the fUML specification (fuml-ftf)

Click
here for this issue's archive.
Source: Model Driven Solutions (Mr. Ed Seidewitz, ed-s(at)modeldriven.com)
Nature: Uncategorized Issue
Severity:
Summary:
Specification: Semantics of a Foundational Subset for Executable UML Models, v1.0 Beta 2 (ptc/2009-10-05)        All the abstract syntax diagrams in the spec should:         1. Use the �dot notation� to show which association ends are owned by classes rather than by the associations. Even though the fUML subset diagrams follow the same convention as in the UML Superstructure spec that all navigable ends are class owned and all non-navigable ends are association owned, it is still better make this explicitly clear. This is especially so for fUML, since, when  the abstract syntax interpreted as an fUML model itself when referenced from the execution model, the navigable ends are a always accessed as class-owned structural features and the associations themselves are ignored (since they don�t meet the fUML constraint of owning all their ends).         2. Show subsetting and redefinition annotations, consistent (for the fUML subset) with the similar annotations in the UML superstructure abstract syntax. Even though subsetting and redefinition are not in the fUML feature subset, the fUML abstract syntax model is supposed to itself be a proper subset of the UML abstract syntax model and, therefore, needs to include subsetting and redefinition consistent with the full model. Indeed, these relationships are in the fUML abstract syntax model as serialized in the normative XMI, they are just currently not shown on the diagrams. (Note also that Subclause 8.1 discusses the conventions on derivation and redefinition for fUML.)        

Resolution: Agreed. see pages 50 - 66 of OMG document ptc/2010-03-12 for details
Revised Text: Replace the abstract syntax figures in Clause 7 as indicated below. Figure 14 - Root Figure 15 - Multiplicities Figure 16 - Namespaces Figure 17 - Expressions Figure 18 - Instances Figure 19 - Classifiers Figure 20 - Features Figure 21 - Operations Figure 22 - Classes Figure 23 - Data Types Figure 24 - Packages Figure 26 - Common Behavior Figure 27 - Reception Figure 28 - Triggers Figure 29 - Events Figure 31 - Nodes Figure 32 - Object Nodes Figure 33 - Control Nodes Figure 34 - Flows Figure 35 - Structured Nodes Figure 36 - Expansion Regions Figure 38 - Basic Actions Figure 39 - Basic Pins Figure 40 - Basic Invocation Actions Figure 41 - Object Actions Figure 42 - Structural Feature Actions Figure 43 - Link Identification Figure 44 - Read Link Actions Figure 45 - Write Link Actions Figure 46 - Accept Event Actions Figure 47 - Object Lifecycle Actions Figure 48 - Reduce Actions
Actions taken:
January 22, 2010: received issue
July 23, 2010: closed issue

Issue 15088: Additional changes required for structured activity node execution (fuml-ftf)

Click
here for this issue's archive.
Source: Model Driven Solutions (Mr. Ed Seidewitz, ed-s(at)modeldriven.com)
Nature: Uncategorized Issue
Severity:
Summary:
Specification: Semantics of a Foundational Subset for Executable UML Models     Subclause:  8.5.2.2.5 ActivityNodeActivationGroup         Some necessary changes to the specification for ActivityNodeActivationGroup were inadvertently left out of the revised text for the resolution to Issue 14547 approved by the FTF. The additional changes are:         Added the operation checkIncomingEdges ( in incomingEdges : ActivityEdgeInstance [0..*], in activations : ActivityNodeActivation [0..*] ) : Boolean with the code:         // Check if any incoming edges have a source in a given set of activations.         int j = 1;    boolean notFound = true;            while (j <= incomingEdges.size() & notFound) {        int k = 1;        while (k <= activations.size() & notFound) {            if (activations.getValue(k-1).isSourceFor(incomingEdges.getValue(j-1))) {                notFound = false;            }            k = k + 1;        }        j = j + 1;    }         return notFound;         In the operation Run, replace the code:             ActivityEdgeInstanceList incomingEdges = activation.incomingEdges;             boolean isEnabled;        if (activation instanceof ActionActivation) {            isEnabled = ((Action)activation.node).input.size() == 0;        } else {            isEnabled = (activation instanceof ControlNodeActivation) | (activation instanceof ActivityParameterNodeActivation);        }             int j = 1;        while (j <= incomingEdges.size() & isEnabled) {            int k = 1;            while (k <= activations.size() & isEnabled) {                if (activations.getValue(k-1).isSourceFor(incomingEdges.getValue(j-1))) {                    isEnabled = false;                 }                k = k + 1;            }            j = j + 1;        }             if (isEnabled) {            Debug.println("[run] Node " + activation.node.name + " is enabled.");            enabledActivations.addValue(activation);        }    }         With:             if (activation instanceof ActionActivation |             activation instanceof ControlNodeActivation |             activation instanceof ActivityParameterNodeActivation) {                 boolean isEnabled = this.checkIncomingEdges(activation.incomingEdges, activations);                 // For an action activation, also consider incoming edges to input pins            if (isEnabled & activation instanceof ActionActivation) {                InputPinList inputPins = ((Action)activation.node).input;                int j = 1;                while (j <= inputPins.size() & isEnabled) {                    InputPin inputPin = inputPins.getValue(j-1);                    ActivityEdgeInstanceList inputEdges = ((ActionActivation)activation).getPinActivation(inputPin).incomingEdges;                    isEnabled = this.checkIncomingEdges(inputEdges, activations);                    j = j + 1;                }            }                 if (isEnabled) {                Debug.println("[run] Node " + activation.node.name + " is enabled.");                enabledActivations.addValue(activation);            }        }    }       

Resolution: Agreed.
Revised Text: In Subclause 8.5.2.2.5 and in Figure 73, add the operation checkIncomingEdges ( in incomingEdges : ActivityEdgeInstance [0..*], in activations : ActivityNodeActivation [0..*] ) : Boolean with the code: // Check if any incoming edges have a source in a given set of activations. int j = 1; boolean notFound = true; while (j <= incomingEdges.size() & notFound) { int k = 1; while (k <= activations.size() & notFound) { if (activations.getValue(k-1).isSourceFor(incomingEdges.getValue(j-1))) { notFound = false; } k = k + 1; } j = j + 1; } return notFound; In the operation Run, replace the code: ActivityEdgeInstanceList incomingEdges = activation.incomingEdges; boolean isEnabled; if (activation instanceof ActionActivation) { isEnabled = ((Action)activation.node).input.size() == 0; } else { isEnabled = (activation instanceof ControlNodeActivation) | (activation instanceof ActivityParameterNodeActivation); } int j = 1; while (j <= incomingEdges.size() & isEnabled) { int k = 1; while (k <= activations.size() & isEnabled) { if (activations.getValue(k-1).isSourceFor(incomingEdges.getValue(j-1))) { isEnabled = false; } k = k + 1; } j = j + 1; } if (isEnabled) { Debug.println("[run] Node " + activation.node.name + " is enabled."); enabledActivations.addValue(activation); } } With: if (activation instanceof ActionActivation | activation instanceof ControlNodeActivation | activation instanceof ActivityParameterNodeActivation) { boolean isEnabled = this.checkIncomingEdges(activation.incomingEdges, activations); // For an action activation, also consider incoming edges to input pins if (isEnabled & activation instanceof ActionActivation) { InputPinList inputPins = ((Action)activation.node).input; int j = 1; while (j <= inputPins.size() & isEnabled) { InputPin inputPin = inputPins.getValue(j-1); ActivityEdgeInstanceList inputEdges = ((ActionActivation)activation).getPinActivation(inputPin).incomingEdges; isEnabled = this.checkIncomingEdges(inputEdges, activations); j = j + 1; } } if (isEnabled) { Debug.println("[run] Node " + activation.node.name + " is enabled."); enabledActivations.addValue(activation); } } }
Actions taken:
February 25, 2010: received issue
July 23, 2010: closed issue

Issue 15089: Modification to AcceptEventActionActivation (fuml-ftf)

Click
here for this issue's archive.
Source: Model Driven Solutions (Mr. Ed Seidewitz, ed-s(at)modeldriven.com)
Nature: Uncategorized Issue
Severity:
Summary:
Specification: Semantics of a Foundational Subset for Executable UML Models     Subclause:  8.6.4.2.1 AcceptEventActionActivation         The revisions adopted to resolve Issue 14550 (Revise fUML to be based on UML 2.3) necessitate a change to AcceptEventActionActivation that was not included in the adopted resolution. The resolution to 14550 adds a �firing� attribute to ActionActivation, which is set to false at the end of the �fire� operation. However, AcceptEventActionActivation is a special case among the subclasses of ActionActivation in that it does not call its superclass �fire� operation. Therefore, the �firing� attribute also needs to be explicitly set to false at the end of AcceptEventActionActivation::fire. Otherwise, if an accept event action is not locally reentrant (which is the default), it will never be able to fire more than once.         

Resolution: Agreed.
Revised Text: In Subclause 8.6.4.2.1 AcceptEventActionActivation, at the end of the fire operation, add: this.firing = false;
Actions taken:
February 25, 2010: received issue
July 23, 2010: closed issue

Issue 15090: Error in ObjectActivation::dispatchNextEvent (fuml-ftf)

Click
here for this issue's archive.
Source: Model Driven Solutions (Mr. Ed Seidewitz, ed-s(at)modeldriven.com)
Nature: Uncategorized Issue
Severity:
Summary:
Specification: Semantics of a Foundational Subset for Executable UML Models     Subclause:  8.4.3.2.5 ObjectActivation         In the operation ObjectActivation::dispatchNextEvent, the line                 EventAccepter selectedEventAccepter = this.waitingEventAccepters.getValue(j-1);         should be:                 EventAccepter selectedEventAccepter = this.waitingEventAccepters.getValue(matchingEventAccepterIndexes.getValue(j-1));       

Resolution: Agreed.
Revised Text: In Subclause 8.4.3.2.5 ObjectActivation, in the operation dispatchNextEvent, change the line: EventAccepter selectedEventAccepter = this.waitingEventAccepters.getValue(j-1); to: EventAccepter selectedEventAccepter = this.waitingEventAccepters.getValue(matchingEventAccepterIndexes.getValue(j-1));
Actions taken:
February 25, 2010: received issue
July 23, 2010: closed issue

Issue 15094: Additional changes required for action firing semantics (fuml-ftf)

Click
here for this issue's archive.
Source: Model Driven Solutions (Mr. Ed Seidewitz, ed-s(at)modeldriven.com)
Nature: Uncategorized Issue
Severity:
Summary:
Specification: Semantics of a Foundational Subset for Executable UML Models    Subclause:  8.6.2.2.1 ActionActivation         Before the adoption of the resolution to Issue 14550 (Revise fUML to be based on UML 2.3), when an action fired it accepted all tokens offered to its input pins, even if this was more than the multiplicity upper bound of a pin. However, on any one firing, it would only consume at most a number of tokens equal to the multiplicity upper bound on each pin. If tokens were left on pins greater than the multiplicity lower bounds, then it would fire again.         UML 2.3 clarified that an action never accepts offers for tokens above the multiplicity upper bounds of its pins. The semantics of actions were changed in the resolution of 14550 to be consistent with this. However, the semantics for firing the again were not properly changed to reflect the fact that, if the action is, indeed, ready to fire again, the tokens it needs will not actually be on its input pins yet. The semantics for firing again needs to be updated to explicitly accept the pending offers for incoming tokens when the action fires again.       

Resolution: Agreed.
Revised Text: In Subclause 8.6.2.2.1 ActionActivation, change the code for the fire operation to: // Do the main action behavior then concurrently fire all output pin activations // and offer a single control token. Then activate the action again, // if it is still ready to fire and has at least one token actually being // offered to it. Action action = (Action)this.node; InputPinList inputPins = action.input; boolean fireAgain = false; do { Debug.println("[fire] Action " + this.node.name + "..."); this.doAction(); this.sendOffers(); Debug.println("[fire] Checking if " + this.node.name + " should fire again..."); _beginIsolation(); this.firing = false; if (this.isReady()) { incomingTokens = this.takeOfferedTokens(); fireAgain = incomingTokens.size() > 0; this.firing = this.isFiring() & fireAgain; } _endIsolation(); } while (fireAgain); In the takeOfferedTokens operation, before the first loop, add the line: TokenList offeredTokens = new TokenList(); At the end of the nested loop within the first loop, add the line: offeredTokens.addValue(token); At the end of the second loop, add: for (int j = 0; j < tokens.size(); j++) { Token token = tokens.getValue(j); offeredTokens.addValue(token); } Replace: return new TokenList(); with: return offeredTokens;
Actions taken:
February 27, 2010: received issue
July 23, 2010: closed issue

Issue 15127: Corrections to previous resolutions (fuml-ftf)

Click
here for this issue's archive.
Source: Model Driven Solutions (Mr. Ed Seidewitz, ed-s(at)modeldriven.com)
Nature: Uncategorized Issue
Severity:
Summary:
The resolution text for the following fUML issues had minor errors and inconsistencies. The following points reflect the correct interpretation for changes to be made to the specification according to these resolutions.         Issue 13435: Type "instanceVistor" for "instanceVisitor" occurs in a number of places, but not in any of the revised code snippets. The correct spelling is �instanceVisitor�.   Issue 14545: The revised code includes "super.isReady" instead of "super.isReady()", which is clearly a syntax error. The correct code is �super.isReady()�.   Issue 14550: The resolution refers to changing "Behavior::isReentrant" in Subclause 7.3.2.2.4, while the correct Behavior subclause is actually 7.3.2.2.1.   Issue 14550: The resolution says to add an operation "countOfferedValues" to the class ObjectNodeActivation, but then refers to this operation in one place later as "countTotalValues". The correct operation name is �countOfferedValues�.   Issue 14618: The revised text section of the resolution refers to �Subclause 8.6.2.2.15, ObjectNodeActivation�, whereas the ccorrect ObjectNodeActivation subclause is 8.5.2.2.15 (as given in the issue summary).             

Resolution: Agreed.
Revised Text: � For Issue 13435, the correct operation name is "instanceVisitor". � For Issue 14545, in Subclause 8.6.2.2.5 InputPinActivation, the revised code in the receiveOffer operation should include "super.isReady()" instead of "super.isReady". � For Issue 14550, the default value for Behavior::isReentrant should be changed to "true" in Subclause 7.3.2.2.1, rather than 7.3.2.2.4 and the operation added to ObjectNodeActivation in Subclause 8.5.2.2.15 should be called "countOfferedValues". � For Issue 14618, the entry for "unofferedTokens" should be removed from Subclause 8.5.2.2.15 rather than 8.6.2.2.15.
Actions taken:
March 17, 2010: received issue
July 23, 2010: closed issue