fUML.Semantics.Actions.CompleteActions.AcceptEventActionActivation Maven / Gradle / Ivy
Go to download
Show more of this group Show more artifacts with this name
Show all versions of fuml Show documentation
Show all versions of fuml Show documentation
This open source software is a reference implementation, consisting of software and related files, for the OMG specification called the Semantics of a Foundational Subset for Executable UML Models (fUML). The reference implementation is intended to implement the execution semantics of UML activity models, accepting an XMI file from a conformant UML model as its input and providing an execution trace of the selected activity model(s) as its output. The core execution engine, which is directly generated from the normative syntactic and semantic models for fUML, may also be used as a library implementation of fUML in other software.
/*
* Initial version copyright 2008 Lockheed Martin Corporation, except
* as stated in the file entitled Licensing-Information.
*
* All modifications copyright 2009-2017 Data Access Technologies, Inc.
*
* Licensed under the Academic Free License version 3.0
* (http://www.opensource.org/licenses/afl-3.0.php), except as stated
* in the file entitled Licensing-Information.
*/
package fUML.Semantics.Actions.CompleteActions;
import fUML.Debug;
import fUML.Syntax.CommonBehaviors.Communications.*;
import fUML.Syntax.Activities.IntermediateActivities.*;
import fUML.Syntax.Actions.BasicActions.*;
import fUML.Syntax.Actions.CompleteActions.*;
import fUML.Semantics.Classes.Kernel.*;
import fUML.Semantics.CommonBehaviors.BasicBehaviors.ParameterValue;
import fUML.Semantics.CommonBehaviors.BasicBehaviors.ParameterValueList;
import fUML.Semantics.CommonBehaviors.Communications.SignalEventOccurrence;
import fUML.Semantics.CommonBehaviors.Communications.SignalInstance;
import fUML.Semantics.Activities.IntermediateActivities.*;
public class AcceptEventActionActivation extends
fUML.Semantics.Actions.BasicActions.ActionActivation {
public fUML.Semantics.Actions.CompleteActions.AcceptEventActionEventAccepter eventAccepter = null;
public Boolean waiting = false;
public void initialize(ActivityNode node, ActivityNodeActivationGroup group) {
// Initialize this accept event action activation to be not waiting for an event.
super.initialize(node, group);
this.waiting = false;
}
public void run() {
// Create an event accepter and initialize waiting to false.
super.run();
this.eventAccepter = new AcceptEventActionEventAccepter();
this.eventAccepter.actionActivation = this;
this.waiting = false;
} // run
public void fire(
fUML.Semantics.Activities.IntermediateActivities.TokenList incomingTokens) {
// Register the event accepter for this accept event action activation
// with the context object of the enclosing activity execution
// and wait for an event to be accepted.
Debug.println("[fire] Action " + this.node.name + "...");
this.getExecutionContext().register(this.eventAccepter);
this.waiting = true;
this.firing = false;
this.suspend();
} // fire
public boolean isReady() {
// An accept event action activation is ready to fire only if it is not
// already waiting for an event.
boolean ready;
if (this.waiting) {
ready = false;
} else {
ready = super.isReady();
}
return ready;
} // isReady
public void doAction() {
// Do nothing. [This will never be called.]
return;
} // doAction
public void accept(
fUML.Semantics.CommonBehaviors.Communications.EventOccurrence eventOccurrence) {
// Accept the given event occurrence.
// If the action does not unmarshall, then, if the event occurrence is
// a signal event occurrence, place the signal instance of the signal
// event occurrence on the result pin, if any.
// If the action does unmarshall, then get the parameter values of the
// event occurrence, and place the values for each parameter 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 + ", eventOccurrence = " + eventOccurrence);
if (this.running) {
if (!action.isUnmarshall) {
if (eventOccurrence instanceof SignalEventOccurrence) {
SignalInstance signalInstance = ((SignalEventOccurrence)eventOccurrence).signalInstance;
Debug.println("[accept] isUnmarshall = false, signalInstance = " + signalInstance);
ValueList result = new ValueList();
result.addValue(signalInstance);
if (resultPins.size() > 0) {
this.putTokens(resultPins.getValue(0), result);
}
}
} else {
ParameterValueList parameterValues = eventOccurrence.getParameterValues();
for (int i = 0; i < parameterValues.size(); i++) {
ParameterValue parameterValue = parameterValues.getValue(i);
OutputPin resultPin = resultPins.getValue(i);
this.putTokens(resultPin, parameterValue.values);
}
}
this.sendOffers();
this.waiting = false;
Debug.println("[accept] Checking if " + this.node.name + " should fire again...");
this.receiveOffer();
this.resume();
}
} // accept
public boolean match(
fUML.Semantics.CommonBehaviors.Communications.EventOccurrence eventOccurrence) {
// Return true if the given event occurrence matches a trigger of the
// accept event action of this activation.
AcceptEventAction action = (AcceptEventAction) (this.node);
TriggerList triggers = action.trigger;
return eventOccurrence.matchAny(triggers);
} // match
public void terminate() {
// Terminate this action and unregister its event accepter.
super.terminate();
if (this.waiting) {
this.getExecutionContext().unregister(this.eventAccepter);
this.waiting = false;
}
} // terminate
} // AcceptEventActionActivation