/* * Initial version copyright 2008 Lockheed Martin Corporation, except * as stated in the file entitled Licensing-Information. * * All modifications copyright 2009-2012 Data Access Technologies, Inc. * * Licensed under the Academic Free License version 3.0 * (http://www.opensource.org/licenses/afl-3.0.php), except as stated * in the file entitled Licensing-Information. */ package fUML.Semantics.Activities.CompleteStructuredActivities; import fUML.Debug; import UMLPrimitiveTypes.*; import java.util.Iterator; import fUML.Syntax.*; import fUML.Syntax.Classes.Kernel.*; import fUML.Syntax.CommonBehaviors.BasicBehaviors.*; import fUML.Syntax.CommonBehaviors.Communications.*; import fUML.Syntax.Activities.IntermediateActivities.*; import fUML.Syntax.Activities.CompleteStructuredActivities.*; import fUML.Syntax.Actions.BasicActions.*; import fUML.Semantics.*; import fUML.Semantics.Classes.Kernel.*; import fUML.Semantics.CommonBehaviors.BasicBehaviors.*; import fUML.Semantics.Activities.IntermediateActivities.*; import fUML.Semantics.Actions.BasicActions.*; import fUML.Semantics.Loci.LociL1.*; public class ConditionalNodeActivation extends fUML.Semantics.Activities.CompleteStructuredActivities.StructuredActivityNodeActivation { public fUML.Semantics.Activities.CompleteStructuredActivities.ClauseActivationList clauseActivations = new fUML.Semantics.Activities.CompleteStructuredActivities.ClauseActivationList(); public fUML.Syntax.Activities.CompleteStructuredActivities.ClauseList selectedClauses = new fUML.Syntax.Activities.CompleteStructuredActivities.ClauseList(); public fUML.Syntax.Activities.CompleteStructuredActivities.Clause selectedClause = null; public void doStructuredActivity() { // Run all the non-executable, non-pin nodes in the conditional node. // Activate all clauses in the conditional node and pass control to // those that are ready (i.e., have no predecessors). // If one or more clauses have succeeded in being selected, choose one // non-deterministically and run its body, then copy the outputs of that // clause to the output pins of the node. ConditionalNode node = (ConditionalNode) (this.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); this.clauseActivations.clear(); ClauseList clauses = node.clause; for (int i = 0; i < clauses.size(); i++) { Clause clause = clauses.getValue(i); ClauseActivation clauseActivation = new ClauseActivation(); clauseActivation.clause = clause; clauseActivation.conditionalNodeActivation = this; this.clauseActivations.addValue(clauseActivation); } this.selectedClauses.clear(); ClauseActivationList readyClauseActivations = new ClauseActivationList(); for (int i = 0; i < this.clauseActivations.size(); i++) { ClauseActivation clauseActivation = this.clauseActivations .getValue(i); Debug.println("[doStructuredActivity] clauseActivations[" + i + "] = " + clauseActivation); if (clauseActivation.isReady()) { Debug .println("[doStructuredActivity] Clause activation is ready."); readyClauseActivations.addValue(clauseActivation); } } // *** Give control to all ready clauses concurrently. *** for (Iterator i = readyClauseActivations.iterator(); i.hasNext();) { ClauseActivation clauseActivation = (ClauseActivation) i.next(); Debug.println("[doStructuredActivity] Giving control to " + clauseActivation + "..."); clauseActivation.receiveControl(); } this.selectedClause = null; if (this.selectedClauses.size() > 0 & this.isRunning()) { Debug.println("[doStructuredActivity] " + this.selectedClauses.size() + " clause(s) selected."); // *** If multiple clauses are selected, choose one // non-deterministically. *** int i = ((ChoiceStrategy) this.getExecutionLocus().factory .getStrategy("choice")).choose(this.selectedClauses.size()); this.selectedClause = this.selectedClauses.getValue(i - 1); Debug.println("[doStructuredActivity] Running selectedClauses[" + i + "] = " + this.selectedClause); for (int j = 0; j < clauses.size(); j++) { Clause clause = clauses.getValue(j); if (clause != selectedClause) { ExecutableNodeList testNodes = clause.test; for (int k = 0; k < testNodes.size(); k++) { ExecutableNode testNode = testNodes.getValue(k); this.activationGroup.getNodeActivation(testNode) .terminate(); } } } this.activationGroup.runNodes(this .makeActivityNodeList(this.selectedClause.body)); } } // doStructuredActivity public void completeBody() { // Complete the activation of the body of a conditional note by // copying the outputs of the selected clause (if any) to the output // pins of the node and terminating the activation of all nested nodes. if (this.selectedClause != null) { ConditionalNode node = (ConditionalNode) (this.node); OutputPinList resultPins = node.result; OutputPinList bodyOutputPins = this.selectedClause.bodyOutput; for (int k = 0; k < resultPins.size(); k++) { OutputPin resultPin = resultPins.getValue(k); OutputPin bodyOutputPin = bodyOutputPins.getValue(k); this.putTokens(resultPin, this.getPinValues(bodyOutputPin)); } } this.activationGroup.terminateAll(); } // completeBody public fUML.Semantics.Activities.IntermediateActivities.TokenList completeAction() { // Only complete the conditional node if it is not suspended. if (!this.isSuspended()) { completeBody(); } return super.completeAction(); } // completeAction public fUML.Semantics.Activities.CompleteStructuredActivities.ClauseActivation getClauseActivation( fUML.Syntax.Activities.CompleteStructuredActivities.Clause clause) { // Get the clause activation corresponding to the given clause. // Debug.println("[getClauseActivation] clause = " + clause); ClauseActivation selectedClauseActivation = null; int i = 1; while ((selectedClauseActivation == null) & i <= this.clauseActivations.size()) { ClauseActivation clauseActivation = this.clauseActivations .getValue(i - 1); // Debug.println("[getClauseActivations] clauseActivations[" + i + // "].clause = " + clauseActivation.clause); if (clauseActivation.clause == clause) { selectedClauseActivation = clauseActivation; } i = i + 1; } return selectedClauseActivation; } // getClauseActivation public void runTest( fUML.Syntax.Activities.CompleteStructuredActivities.Clause clause) { // Run the test for the given clause. if (this.isRunning()) { this.activationGroup.runNodes(this .makeActivityNodeList(clause.test)); } } // runTest public void selectBody( fUML.Syntax.Activities.CompleteStructuredActivities.Clause clause) { // Add the clause to the list of selected clauses. this.selectedClauses.addValue(clause); } // selectBody public void resume() { // When this conditional node is resumed after being suspended, complete // its body and then resume it as a structured activity node. // [Note that this presumes that accept event actions are not allowed // in the test part of a clause of a conditional node.] completeBody(); super.resume(); } // resume } // ConditionalNodeActivation