ソースを参照

Removed Dependency to Statechart in SimulationEngine

Andreas Mülder 11 年 前
コミット
8d714bd304

+ 7 - 7
plugins/org.yakindu.sct.simulation.core.sexec/src/org/yakindu/sct/simulation/core/sexec/container/AbstractExecutionFlowSimulationEngine.java

@@ -44,7 +44,7 @@ public abstract class AbstractExecutionFlowSimulationEngine implements ISimulati
 	@Inject
 	private IModelSequencer sequencer;
 	@Inject
-	private IExecutionFlowInterpreter interpreter;
+	protected IExecutionFlowInterpreter interpreter;
 	@Inject
 	private IExecutionContextInitializer contextInitializer;
 
@@ -53,10 +53,6 @@ public abstract class AbstractExecutionFlowSimulationEngine implements ISimulati
 
 	private Statechart statechart;
 
-	public AbstractExecutionFlowSimulationEngine(Statechart statechart) {
-		this.statechart = statechart;
-	}
-
 	protected final void runCycle() {
 		try {
 			interpreter.runCycle();
@@ -72,13 +68,17 @@ public abstract class AbstractExecutionFlowSimulationEngine implements ISimulati
 			}
 		}
 	}
-
-	public void start() {
+	
+	@Override
+	public void init() {
 		ExecutionFlow flow = sequencer.transform(statechart);
 		if (!context.isSnapshot()) {
 			contextInitializer.initialize(context, flow);
 		}
 		interpreter.initialize(flow, context);
+	}
+
+	public void start() {
 		interpreter.enter();
 	}
 

+ 1 - 3
plugins/org.yakindu.sct.simulation.core.sexec/src/org/yakindu/sct/simulation/core/sexec/container/CycleBasedSimulationEngine.java

@@ -13,7 +13,6 @@ package org.yakindu.sct.simulation.core.sexec.container;
 import java.util.Timer;
 import java.util.TimerTask;
 
-import org.yakindu.sct.model.sgraph.Statechart;
 import org.yakindu.sct.simulation.core.engine.ISimulationEngine;
 
 /**
@@ -28,8 +27,7 @@ public class CycleBasedSimulationEngine extends AbstractExecutionFlowSimulationE
 
 	private long cyclePeriod;
 
-	public CycleBasedSimulationEngine(Statechart statechart, long cyclePeriod) {
-		super(statechart);
+	public CycleBasedSimulationEngine(long cyclePeriod) {
 		this.cyclePeriod = cyclePeriod;
 		timer = new Timer();
 	}

+ 3 - 4
plugins/org.yakindu.sct.simulation.core.sexec/src/org/yakindu/sct/simulation/core/sexec/container/DefaultSimulationEngineFactory.java

@@ -25,7 +25,6 @@ import org.eclipse.emf.ecore.resource.ResourceSet;
 import org.eclipse.emf.ecore.resource.URIConverter;
 import org.eclipse.emf.ecore.resource.impl.ResourceSetImpl;
 import org.eclipse.emf.ecore.util.EcoreUtil;
-import org.yakindu.sct.model.sgraph.Statechart;
 import org.yakindu.sct.simulation.core.engine.ISimulationEngine;
 import org.yakindu.sct.simulation.core.sexec.launch.ISCTLaunchParameters;
 import org.yakindu.sct.simulation.core.sruntime.ExecutionContext;
@@ -43,14 +42,14 @@ public class DefaultSimulationEngineFactory implements ISimulationEngineFactory
 	@Inject
 	private Injector injector;
 
-	public ISimulationEngine createExecutionContainer(Statechart statechart, ILaunch launch) throws CoreException {
+	public ISimulationEngine createExecutionContainer(ILaunch launch) throws CoreException {
 		ISimulationEngine controller = null;
 		boolean isCycleBased = launch.getLaunchConfiguration().getAttribute(IS_CYCLE_BASED, DEFAULT_IS_CYCLE_BASED);
 		if (isCycleBased) {
 			long cyclePeriod = launch.getLaunchConfiguration().getAttribute(CYCLE_PERIOD, DEFAULT_CYCLE_PERIOD);
-			controller = new CycleBasedSimulationEngine(statechart, cyclePeriod);
+			controller = new CycleBasedSimulationEngine(cyclePeriod);
 		} else {
-			controller = new EventDrivenSimulationEngine(statechart);
+			controller = new EventDrivenSimulationEngine();
 		}
 		injector.injectMembers(controller);
 

+ 1 - 6
plugins/org.yakindu.sct.simulation.core.sexec/src/org/yakindu/sct/simulation/core/sexec/container/EventDrivenSimulationEngine.java

@@ -11,7 +11,6 @@
 
 package org.yakindu.sct.simulation.core.sexec.container;
 
-import org.yakindu.sct.model.sgraph.Statechart;
 import org.yakindu.sct.simulation.core.engine.ISimulationEngine;
 
 /**
@@ -24,10 +23,6 @@ public class EventDrivenSimulationEngine extends AbstractExecutionFlowSimulation
 
 	private Thread cycleRunner;
 
-	public EventDrivenSimulationEngine(Statechart statechart) {
-		super(statechart);
-	}
-
 	public void start() {
 		super.start();
 		cycleRunner = new Thread(new CycleRunner());
@@ -44,7 +39,7 @@ public class EventDrivenSimulationEngine extends AbstractExecutionFlowSimulation
 		super.terminate();
 	}
 
-	private final class CycleRunner implements Runnable {
+	protected  final class CycleRunner implements Runnable {
 		public void run() {
 			while (!terminated && !suspended) {
 				if (context.getRaisedEvents().size() > 0 || context.getScheduledEvents().size() > 0) {

+ 1 - 2
plugins/org.yakindu.sct.simulation.core.sexec/src/org/yakindu/sct/simulation/core/sexec/container/ISimulationEngineFactory.java

@@ -12,7 +12,6 @@ package org.yakindu.sct.simulation.core.sexec.container;
 
 import org.eclipse.core.runtime.CoreException;
 import org.eclipse.debug.core.ILaunch;
-import org.yakindu.sct.model.sgraph.Statechart;
 import org.yakindu.sct.simulation.core.engine.ISimulationEngine;
 
 /**
@@ -23,5 +22,5 @@ import org.yakindu.sct.simulation.core.engine.ISimulationEngine;
  */
 public interface ISimulationEngineFactory {
 
-	public ISimulationEngine createExecutionContainer(Statechart statechart, ILaunch launch) throws CoreException;
+	public ISimulationEngine createExecutionContainer(ILaunch launch) throws CoreException;
 }

+ 42 - 32
plugins/org.yakindu.sct.simulation.core.sexec/src/org/yakindu/sct/simulation/core/sexec/interpreter/DefaultExecutionFlowInterpreter.xtend

@@ -41,16 +41,16 @@ import org.yakindu.sct.simulation.core.sruntime.ExecutionContext
  * @author andreas muelder - Initial contribution and API
  * @author axel terfloth - minimized changes on execution context
  * 
- */
- @Singleton
+ */
+@Singleton
 class DefaultExecutionFlowInterpreter implements IExecutionFlowInterpreter {
 
 	@Inject
 	IStatementInterpreter statementInterpreter
 	@Inject
 	ITimingService timingService
-	@Inject extension SexecExtensions
-	@Inject(optional = true)
+	@Inject extension SexecExtensions
+	@Inject(optional=true)
 	ITraceStepInterpreter traceInterpreter
 
 	ExecutionFlow flow
@@ -68,45 +68,56 @@ class DefaultExecutionFlowInterpreter implements IExecutionFlowInterpreter {
 		executionStack = newLinkedList()
 		activeStateConfiguration = newArrayOfSize(flow.stateVector.size)
 		activeStateIndex = 0
-		historyStateConfiguration = newHashMap()
-		if(!executionContext.snapshot)
+		historyStateConfiguration = newHashMap()
+		if (!executionContext.snapshot)
 			flow.initSequence.scheduleAndRun
 	}
 
-	override enter() {
-		if(!executionContext.snapshot)
-			flow.enterSequences?.defaultSequence?.scheduleAndRun
-		else{
-			executionContext.activeStates.forEach[state | activeStateConfiguration.set(state.toExecutionState.stateVector.offset, state.toExecutionState)]
-		}
-	}
-	
-	def ExecutionState toExecutionState(RegularState state){
-		return flow.eAllContents.filter[it instanceof ExecutionState && EcoreUtil::equals((it as ExecutionState).sourceElement,state)].head as ExecutionState
+	override enter() {
+		if (!executionContext.snapshot)
+			flow.enterSequences?.defaultSequence?.scheduleAndRun
+		else {
+			executionContext.activeStates.forEach[state|
+				activeStateConfiguration.set(state.toExecutionState.stateVector.offset, state.toExecutionState)]
+		}
+	}
+
+	def ExecutionState toExecutionState(RegularState state) {
+		return flow.eAllContents.filter[
+			it instanceof ExecutionState && EcoreUtil::equals((it as ExecutionState).sourceElement, state)].head as ExecutionState
 	}
 
-	override runCycle() {
-		//Raise all schedules events
-		executionContext.allEvents.filter[scheduled].forEach[raised = true scheduled = false]
+	override runCycle() {
+		raiseScheduledEvents()
 		activeStateIndex = 0
-		if (executionContext.executedElements.size > 0) executionContext.executedElements.clear
-		//Clear all out events
-		executionContext.allEvents.filter[direction == EventDirection.OUT].forEach[if(raised) raised=false]
+		if(executionContext.executedElements.size > 0) executionContext.executedElements.clear
+		clearOutEvents()
 		while (activeStateIndex < activeStateConfiguration.size) {
 			var state = activeStateConfiguration.get(activeStateIndex)
 			state?.reactSequence?.scheduleAndRun
 			activeStateIndex = activeStateIndex + 1
 		}
-		//clear all local and in events
+		clearLocalAndInEvents()
+	}
+
+	def raiseScheduledEvents() {
+		executionContext.allEvents.filter[scheduled].forEach[raised = true scheduled = false]
+	}
+
+	def clearOutEvents() {
+		executionContext.allEvents.filter[direction == EventDirection.OUT].forEach[if(raised) raised = false]
+	}
+
+	def clearLocalAndInEvents() {
 		executionContext.allEvents.filter[direction == EventDirection.IN || direction == EventDirection.LOCAL].forEach[
-			if(raised) raised=false]
+			if(raised) raised = false]
 	}
 
-	override resume() {
+	override resume() {
 		executionContext.suspendedElements.clear
 		suspended = false
 		run
-	}
+	}
 
 	override suspend() {
 		suspended = true
@@ -145,12 +156,11 @@ class DefaultExecutionFlowInterpreter implements IExecutionFlowInterpreter {
 	def dispatch Object execute(Step step) {
 	}
 
-	def dispatch Object execute(Trace trace) {
-		traceInterpreter?.evaluate(trace, executionContext)
+	def dispatch Object execute(Trace trace) {
+		traceInterpreter?.evaluate(trace, executionContext)
 		null
-	}
-	
-	
+	}
+
 	def dispatch Object execute(Check check) {
 		if (check.condition == null)
 			return true
@@ -171,7 +181,7 @@ class DefaultExecutionFlowInterpreter implements IExecutionFlowInterpreter {
 
 	def dispatch Object execute(ExitState exitState) {
 		activeStateConfiguration.set(exitState.state.stateVector.offset, null)
-		var activeStates = executionContext.activeStates.filter[EcoreUtil::equals(it,exitState.state.sourceElement)]
+		var activeStates = executionContext.activeStates.filter[EcoreUtil::equals(it, exitState.state.sourceElement)]
 		executionContext.activeStates.removeAll(activeStates)
 		null
 	}

+ 100 - 91
plugins/org.yakindu.sct.simulation.core.sexec/src/org/yakindu/sct/simulation/core/sexec/interpreter/ExecutionContextHelper.xtend

@@ -1,95 +1,104 @@
-package org.yakindu.sct.simulation.core.sexec.interpreter
-
-import com.google.inject.Inject
-import java.util.List
-import org.eclipse.emf.ecore.EObject
-import org.eclipse.xtext.naming.IQualifiedNameProvider
-import org.eclipse.xtext.util.SimpleAttributeResolver
-import org.yakindu.base.expressions.expressions.AssignmentExpression
-import org.yakindu.base.expressions.expressions.ElementReferenceExpression
-import org.yakindu.base.expressions.expressions.FeatureCall
-import org.yakindu.base.types.Operation
-import org.yakindu.base.types.Property
-import org.yakindu.sct.model.stext.stext.VariableDefinition
-import org.yakindu.sct.simulation.core.sruntime.CompositeSlot
-import org.yakindu.sct.simulation.core.sruntime.ExecutionContext
-import org.yakindu.sct.simulation.core.sruntime.ExecutionEvent
-import org.yakindu.sct.simulation.core.sruntime.ExecutionSlot
-import org.yakindu.sct.simulation.core.sruntime.ExecutionVariable
-
-class ExecutionContextHelper {
-	
-	@Inject
-	extension IQualifiedNameProvider nameProvider
-	
-	def dispatch ExecutionSlot resolveVariable(ExecutionContext context, ElementReferenceExpression e) {
-		if (e.reference instanceof VariableDefinition) {
-			return context.getVariable(e.reference.getFullyQualifiedName.toString)
-		} 
-		else null
-	}
-
-	def dispatch ExecutionSlot resolveVariable(ExecutionContext context, FeatureCall e) {
-		if (e.feature instanceof VariableDefinition) {
-			return context.getVariable(e.feature.getFullyQualifiedName.toString)
-		}
-		else if (e.feature instanceof Property) {
-			var current = e
-			val List<EObject> calls = newArrayList
-			calls.add(0, e.feature)
-			while (!(current.owner instanceof ElementReferenceExpression)) {
-				current = current.owner as FeatureCall
-				calls.add(0, current.feature)
-			}
-			
-			val varDef = (current.owner as ElementReferenceExpression).reference as VariableDefinition
-			val varDefFqn = varDef.getFullyQualifiedName.toString
-			
-			var featureSlot = context.getSlot(varDefFqn)
-			if (featureSlot == null) {
-				featureSlot = context.getVariable(varDef.getFullyQualifiedName.toString)
-				if (featureSlot == null)
+package org.yakindu.sct.simulation.core.sexec.interpreter
+
+import com.google.inject.Inject
+import de.itemis.xtext.utils.jface.viewers.ContextElementAdapter
+import java.util.List
+import org.eclipse.emf.ecore.EObject
+import org.eclipse.emf.ecore.util.EcoreUtil
+import org.eclipse.xtext.naming.IQualifiedNameProvider
+import org.eclipse.xtext.util.SimpleAttributeResolver
+import org.yakindu.base.expressions.expressions.AssignmentExpression
+import org.yakindu.base.expressions.expressions.ElementReferenceExpression
+import org.yakindu.base.expressions.expressions.FeatureCall
+import org.yakindu.base.types.Operation
+import org.yakindu.base.types.Property
+import org.yakindu.sct.model.stext.stext.VariableDefinition
+import org.yakindu.sct.simulation.core.sruntime.CompositeSlot
+import org.yakindu.sct.simulation.core.sruntime.ExecutionContext
+import org.yakindu.sct.simulation.core.sruntime.ExecutionEvent
+import org.yakindu.sct.simulation.core.sruntime.ExecutionSlot
+import org.yakindu.sct.simulation.core.sruntime.ExecutionVariable
+
+class ExecutionContextHelper {
+
+	@Inject
+	extension IQualifiedNameProvider nameProvider
+
+	def dispatch ExecutionSlot resolveVariable(ExecutionContext context, ElementReferenceExpression e) {
+		if (e.reference instanceof VariableDefinition) {
+			return context.getVariable(e.reference.getFullyQualifiedName.toString)
+		} else
+			null
+	}
+
+	def dispatch ExecutionSlot resolveVariable(ExecutionContext context, FeatureCall e) {
+		if (e.feature instanceof VariableDefinition) {
+			return context.getVariable(e.feature.getFullyQualifiedName.toString)
+		} else if (e.feature instanceof Property) {
+			var current = e
+			val List<EObject> calls = newArrayList
+			calls.add(0, e.feature)
+			while (!(current.owner instanceof ElementReferenceExpression)) {
+				current = current.owner as FeatureCall
+				calls.add(0, current.feature)
+			}
+
+			//TODO:!!!!!FIXME
+			val varDef = (current.owner as ElementReferenceExpression).reference as VariableDefinition
+			var varDefFqn = varDef.getFullyQualifiedName.toString
+			if (varDefFqn.equals("this")) {
+				var flow = EcoreUtil.getRootContainer(current)
+				var ContextElementAdapter adapter = EcoreUtil.getExistingAdapter(flow, typeof(ContextElementAdapter)) as ContextElementAdapter
+				varDefFqn = (adapter.element as VariableDefinition).fullyQualifiedName.toString
+				println(varDefFqn)
+			}
+
+			var featureSlot = context.getSlot(varDefFqn)
+			if (featureSlot == null) {
+				featureSlot = context.getVariable(varDef.getFullyQualifiedName.toString)
+				if (featureSlot == null)
 					return null // could not find starting slot for feature call
-			}
-			
+			}
+
 			// go through all calls and traverse execution context hierarchy accordingly
-			for (EObject feature : calls) {
-				
-				if (featureSlot instanceof CompositeSlot && feature instanceof Property) {
-					featureSlot = (featureSlot as CompositeSlot).slots.findFirst[slot | slot.name == feature.name]
-				}
-				if (featureSlot instanceof ExecutionVariable && feature instanceof Operation) {
-//					TODO (featureSlot as ExecutionVariable).value
-				}
-			}
-			
-			return featureSlot
-		}
-		else if (e.feature instanceof Operation) {
+			for (EObject feature : calls) {
+
+				if (featureSlot instanceof CompositeSlot && feature instanceof Property) {
+					featureSlot = (featureSlot as CompositeSlot).slots.findFirst[slot|slot.name == feature.name]
+				}
+				if (featureSlot instanceof ExecutionVariable && feature instanceof Operation) {
+					//					TODO (featureSlot as ExecutionVariable).value
+				}
+			}
+
+			return featureSlot
+		} else if (e.feature instanceof Operation) {
+
 			// for operation return the execution variable of the operation call's owner on which the operation is to be executed
-			return context.resolveVariable(e.owner)
-		}
-		else null
-	}
-	
-	def dispatch ExecutionSlot resolveVariable(ExecutionContext context, AssignmentExpression e) {
-		return context.resolveVariable(e.varRef)
-	}
-	
-	def ExecutionEvent resolveEvent(ExecutionContext context, FeatureCall call) {
+			return context.resolveVariable(e.owner)
+		} else
+			null
+	}
+
+	def dispatch ExecutionSlot resolveVariable(ExecutionContext context, AssignmentExpression e) {
+		return context.resolveVariable(e.varRef)
+	}
+
+	def ExecutionEvent resolveEvent(ExecutionContext context, FeatureCall call) {
+
 		// TODO consider deeper nested calls as done in resolveVariable
-		var fqn = call.feature.fullyQualifiedName.toString
-		if (call.owner instanceof ElementReferenceExpression) {
-			val ref = (call.owner as ElementReferenceExpression).reference
-			val variableSlot = context.getSlot(ref.fullyQualifiedName.toString)
-			if (variableSlot != null) {
-				fqn = variableSlot.fqName + "." + call.feature.fullyQualifiedName.toString
-			}
-		}
-		context.getEvent(fqn)
-	}
-	
-	def private name(EObject e) {
-		return SimpleAttributeResolver::NAME_RESOLVER.apply(e)
-	}
-}
+		var fqn = call.feature.fullyQualifiedName.toString
+		if (call.owner instanceof ElementReferenceExpression) {
+			val ref = (call.owner as ElementReferenceExpression).reference
+			val variableSlot = context.getSlot(ref.fullyQualifiedName.toString)
+			if (variableSlot != null) {
+				fqn = variableSlot.fqName + "." + call.feature.fullyQualifiedName.toString
+			}
+		}
+		context.getEvent(fqn)
+	}
+
+	def private name(EObject e) {
+		return SimpleAttributeResolver::NAME_RESOLVER.apply(e)
+	}
+}

+ 1 - 1
plugins/org.yakindu.sct.simulation.core.sexec/src/org/yakindu/sct/simulation/core/sexec/launch/SexecLaunchConfigurationDelegate.java

@@ -51,7 +51,7 @@ public class SexecLaunchConfigurationDelegate extends AbstractSCTLaunchConfigura
 		});
 		Guice.createInjector(module).injectMembers(this);
 		try {
-			return factory.createExecutionContainer(statechart, launch);
+			return factory.createExecutionContainer(launch);
 		} catch (CoreException e) {
 			e.printStackTrace();
 			return null;