Implements semantics of Timed_AcceptEventActionActivation as a
specialization of AcceptEventActionActivation.

Change-Id: I6e0ce85bf30e468cc44166ff10a31d9a3eebf5f2
Signed-off-by: jeremie.tatibouet <jeremie.tatibouet@cea.fr>
diff --git a/bundles/core/engines/org.eclipse.papyrus.moka.timedfuml/.classpath b/bundles/core/engines/org.eclipse.papyrus.moka.timedfuml/.classpath
index 7498423..3f379a2 100644
--- a/bundles/core/engines/org.eclipse.papyrus.moka.timedfuml/.classpath
+++ b/bundles/core/engines/org.eclipse.papyrus.moka.timedfuml/.classpath
@@ -3,5 +3,10 @@
 	<classpathentry kind="con" path="org.eclipse.jdt.launching.JRE_CONTAINER/org.eclipse.jdt.internal.debug.ui.launcher.StandardVMType/JavaSE-1.8"/>

 	<classpathentry kind="con" path="org.eclipse.pde.core.requiredPlugins"/>

 	<classpathentry kind="src" path="src/"/>

+	<classpathentry kind="src" path="/org.eclipse.papyrus.moka.fuml">

+		<attributes>

+			<attribute name="org.eclipse.ajdt.aspectpath" value="org.eclipse.ajdt.aspectpath"/>

+		</attributes>

+	</classpathentry>

 	<classpathentry kind="output" path="target/classes"/>

 </classpath>

diff --git a/bundles/core/engines/org.eclipse.papyrus.moka.timedfuml/.project b/bundles/core/engines/org.eclipse.papyrus.moka.timedfuml/.project
index fe9e2b2..78afd1f 100644
--- a/bundles/core/engines/org.eclipse.papyrus.moka.timedfuml/.project
+++ b/bundles/core/engines/org.eclipse.papyrus.moka.timedfuml/.project
@@ -6,7 +6,7 @@
 	</projects>

 	<buildSpec>

 		<buildCommand>

-			<name>org.eclipse.jdt.core.javabuilder</name>

+			<name>org.eclipse.ajdt.core.ajbuilder</name>

 			<arguments>

 			</arguments>

 		</buildCommand>

@@ -32,6 +32,7 @@
 		</buildCommand>

 	</buildSpec>

 	<natures>

+		<nature>org.eclipse.ajdt.ui.ajnature</nature>

 		<nature>org.eclipse.m2e.core.maven2Nature</nature>

 		<nature>org.eclipse.pde.PluginNature</nature>

 		<nature>org.eclipse.jdt.core.javanature</nature>

diff --git a/bundles/core/engines/org.eclipse.papyrus.moka.timedfuml/META-INF/MANIFEST.MF b/bundles/core/engines/org.eclipse.papyrus.moka.timedfuml/META-INF/MANIFEST.MF
index bbc8b82..05fe960 100644
--- a/bundles/core/engines/org.eclipse.papyrus.moka.timedfuml/META-INF/MANIFEST.MF
+++ b/bundles/core/engines/org.eclipse.papyrus.moka.timedfuml/META-INF/MANIFEST.MF
@@ -8,7 +8,8 @@
  org.eclipse.papyrus.moka.discreteevent;bundle-version="2.0.100";visibility:=reexport,
  org.eclipse.papyrus.moka;bundle-version="2.0.100",
  org.eclipse.papyrus.moka.fuml.statemachines;bundle-version="1.0.100";visibility:=reexport,
- org.eclipse.papyrus.moka.fuml
+ org.eclipse.papyrus.moka.fuml,
+ org.aspectj.runtime
 Bundle-RequiredExecutionEnvironment: JavaSE-1.8
 Bundle-ActivationPolicy: lazy
 Export-Package: org.eclipse.papyrus.moka.timedfuml,
diff --git a/bundles/core/engines/org.eclipse.papyrus.moka.timedfuml/src/org/eclipse/papyrus/moka/timedfuml/actions/_sendAcceptEventOfferAction.java b/bundles/core/engines/org.eclipse.papyrus.moka.timedfuml/src/org/eclipse/papyrus/moka/timedfuml/actions/_sendAcceptEventOfferAction.java
index 4ac0528..9deb9fb 100644
--- a/bundles/core/engines/org.eclipse.papyrus.moka.timedfuml/src/org/eclipse/papyrus/moka/timedfuml/actions/_sendAcceptEventOfferAction.java
+++ b/bundles/core/engines/org.eclipse.papyrus.moka.timedfuml/src/org/eclipse/papyrus/moka/timedfuml/actions/_sendAcceptEventOfferAction.java
@@ -27,17 +27,10 @@
 		super();

 		this.actionActivation = actionActivation;

 	}

-

-	/**

-	 * @see org.eclipse.papyrus.moka.discreteevent.actions.Action#execute()

-	 *

-	 */

+	

 	@Override

 	public void execute() {

-		// System.out.println(DEScheduler.getInstance().getCurrentTime() + " : sending offer - " + this.actionActivation);

-		this.actionActivation.sendOffersDefault();

-		actionActivation.receiveOffer();

-		actionActivation.resume() ;

+		this.actionActivation.accept(null);

 	}

 

 }

diff --git a/bundles/core/engines/org.eclipse.papyrus.moka.timedfuml/src/org/eclipse/papyrus/moka/timedfuml/semantics/Timed_AcceptEventActionActivation.java b/bundles/core/engines/org.eclipse.papyrus.moka.timedfuml/src/org/eclipse/papyrus/moka/timedfuml/semantics/Timed_AcceptEventActionActivation.java
index 84dcbcc..fcafefb 100644
--- a/bundles/core/engines/org.eclipse.papyrus.moka.timedfuml/src/org/eclipse/papyrus/moka/timedfuml/semantics/Timed_AcceptEventActionActivation.java
+++ b/bundles/core/engines/org.eclipse.papyrus.moka.timedfuml/src/org/eclipse/papyrus/moka/timedfuml/semantics/Timed_AcceptEventActionActivation.java
@@ -7,85 +7,83 @@
  * http://www.eclipse.org/legal/epl-v10.html

  *

  * Contributors:

+ * 	Sahar Guermazi

  *  CEA LIST Initial API and implementation

  *****************************************************************************/

 package org.eclipse.papyrus.moka.timedfuml.semantics;

 

+import java.util.List;

+

 import org.eclipse.papyrus.moka.discreteevent.DEScheduler;

 import org.eclipse.papyrus.moka.discreteevent.Event;

+import org.eclipse.papyrus.moka.fuml.Semantics.Activities.IntermediateActivities.IToken;

 import org.eclipse.papyrus.moka.fuml.Semantics.Classes.Kernel.IEvaluation;

 import org.eclipse.papyrus.moka.fuml.Semantics.Classes.Kernel.IRealValue;

-import org.eclipse.papyrus.moka.fuml.Semantics.impl.Actions.BasicActions.ActionActivation;

+import org.eclipse.papyrus.moka.fuml.Semantics.CommonBehaviors.Communications.IEventOccurrence;

+import org.eclipse.papyrus.moka.fuml.Semantics.impl.Actions.CompleteActions.AcceptEventActionActivation;

+import org.eclipse.papyrus.moka.fuml.statemachines.interfaces.Semantics.Values.ISM_OpaqueExpressionEvaluation;

 import org.eclipse.papyrus.moka.timedfuml.actions._sendAcceptEventOfferAction;

 import org.eclipse.uml2.uml.AcceptEventAction;

-import org.eclipse.uml2.uml.OpaqueExpression;

 import org.eclipse.uml2.uml.TimeEvent;

-import org.eclipse.uml2.uml.TimeExpression;

 import org.eclipse.uml2.uml.Trigger;

 

-/**

- * @author sg239226

- *

- */

-public class Timed_AcceptEventActionActivation extends ActionActivation {

+public class Timed_AcceptEventActionActivation extends AcceptEventActionActivation {

 

 	public Timed_AcceptEventActionActivation() {

 		super();

 	}

 

-	public void sendOffers() {

-

+	@Override

+	public void fire(List<IToken> incomingTokens) {

+		// Register an event in the DEScheduler (clock manager) and suspend this action.

+		// Note: UML 2.5 does not put any restrictions on the number of triggers with a

+		// time event that may be referenced by a single accept event action.

 		double relativeDate = 0;

 		double absoluteDate = 0;

 		double currentTime = 0;

 		for (Trigger trigger : ((AcceptEventAction) node).getTriggers()) {

-			boolean isMissed = false;

-			TimeEvent e = (TimeEvent) trigger.getEvent();

-			TimeExpression texp = ((TimeEvent) e).getWhen();

-			IEvaluation evaluation = null;

-			// FIXME Hack. Changes would be required in fUML

-			// In fUML, evaluations cannot have a context

-			// A context might however be useful, at least in the case of OpaqueExpression, for the execution of the expression Behavior

-			if (texp.getExpr() instanceof OpaqueExpression) {

-				OpaqueExpressionEvaluationWithContext opaqueEvaluation = new OpaqueExpressionEvaluationWithContext();

-				opaqueEvaluation.specification = texp.getExpr();

-				opaqueEvaluation.locus = this.getExecutionLocus();

-				opaqueEvaluation.context = this.getExecutionContext();

-				evaluation = opaqueEvaluation;

-			} else {

-				evaluation = this.getExecutionLocus().getFactory().createEvaluation(texp.getExpr());

-			}

-			if (e.isRelative()) {

-				relativeDate = ((IRealValue) evaluation.evaluate()).getValue();

-			} else {

-				absoluteDate = ((IRealValue) evaluation.evaluate()).getValue();

-				currentTime = DEScheduler.getInstance().getCurrentTime();

-				if (absoluteDate < currentTime) {

-					isMissed = true;

-					System.out.println("Time Event is missed, absoluteTime = " + absoluteDate + " > currentTime = " + currentTime);

-				} else {

-					relativeDate = absoluteDate - currentTime;

+			if (trigger.getEvent() instanceof TimeEvent) {

+				boolean isMissed = false;

+				TimeEvent timeEvent = (TimeEvent) trigger.getEvent();

+				IEvaluation evaluation = null;

+				if (timeEvent.getWhen() != null && timeEvent.getWhen().getExpr() != null) {

+					evaluation = this.getExecutionLocus().getFactory().createEvaluation(timeEvent.getWhen().getExpr());

+					if(evaluation instanceof ISM_OpaqueExpressionEvaluation){

+						((ISM_OpaqueExpressionEvaluation)evaluation).setContext(this.getExecutionContext()) ;

+					}

+					if (timeEvent.isRelative()) {

+						relativeDate = ((IRealValue) evaluation.evaluate()).getValue();

+					} else {

+						absoluteDate = ((IRealValue) evaluation.evaluate()).getValue();

+						currentTime = DEScheduler.getInstance().getCurrentTime();

+						if (absoluteDate < currentTime) {

+							isMissed = true;

+							System.err.println("Time Event is missed, absoluteTime = " + absoluteDate + " > currentTime = "

+									+ currentTime);

+						} else {

+							relativeDate = absoluteDate - currentTime;

+						}

+					}

+					if (!isMissed) {

+						_sendAcceptEventOfferAction sendOfferAction = new _sendAcceptEventOfferAction(this);

+						DEScheduler.getInstance().pushEvent(new Event(relativeDate, sendOfferAction));

+						this.waiting = true;

+						this.firing = false;

+						this.suspend();

+					}

 				}

-

-			}

-			if (!isMissed) {

-				_sendAcceptEventOfferAction sendOfferAction = new _sendAcceptEventOfferAction(this);

-				this.suspend();

-				DEScheduler.getInstance().pushEvent(new Event(relativeDate, sendOfferAction));

 			}

 		}

 	}

 

-	public void sendOffersDefault() {

-		this.resume();

-		super.sendOffers();

-	}

-

 	@Override

-	public void doAction() {

-		// TODO Auto-generated method stub

-

+	public void accept(IEventOccurrence eventOccurrence) {

+		// There is no acceptance of "time event occurrence". The accepted event

+		// occurrence

+		// will always be null at this point.

+		this.sendOffers();

+		this.waiting = false;

+		this.receiveOffer();

+		this.resume();

 	}

-

-

 }