소스 검색

Reverted changes

Andreas Mülder 11 년 전
부모
커밋
01a6a248a9

+ 6 - 1
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
-	protected IExecutionFlowInterpreter interpreter;
+	private IExecutionFlowInterpreter interpreter;
 	@Inject
 	private IExecutionContextInitializer contextInitializer;
 
@@ -53,6 +53,10 @@ public abstract class AbstractExecutionFlowSimulationEngine implements ISimulati
 
 	private Statechart statechart;
 
+	public AbstractExecutionFlowSimulationEngine(Statechart statechart) {
+		this.statechart = statechart;
+	}
+
 	protected final void runCycle() {
 		try {
 			interpreter.runCycle();
@@ -69,6 +73,7 @@ public abstract class AbstractExecutionFlowSimulationEngine implements ISimulati
 		}
 	}
 
+	@Override
 	public void init() {
 		ExecutionFlow flow = sequencer.transform(statechart);
 		if (!context.isSnapshot()) {

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

@@ -13,6 +13,7 @@ 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;
 
 /**
@@ -27,7 +28,8 @@ public class CycleBasedSimulationEngine extends AbstractExecutionFlowSimulationE
 
 	private long cyclePeriod;
 
-	public CycleBasedSimulationEngine(long cyclePeriod) {
+	public CycleBasedSimulationEngine(Statechart statechart, long cyclePeriod) {
+		super(statechart);
 		this.cyclePeriod = cyclePeriod;
 		timer = new Timer();
 	}

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

@@ -25,6 +25,7 @@ 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;
@@ -42,14 +43,14 @@ public class DefaultSimulationEngineFactory implements ISimulationEngineFactory
 	@Inject
 	private Injector injector;
 
-	public ISimulationEngine createExecutionContainer(ILaunch launch) throws CoreException {
+	public ISimulationEngine createExecutionContainer(Statechart statechart, 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(cyclePeriod);
+			controller = new CycleBasedSimulationEngine(statechart, cyclePeriod);
 		} else {
-			controller = new EventDrivenSimulationEngine();
+			controller = new EventDrivenSimulationEngine(statechart);
 		}
 		injector.injectMembers(controller);
 

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

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

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

@@ -12,6 +12,7 @@ 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;
 
 /**
@@ -22,5 +23,5 @@ import org.yakindu.sct.simulation.core.engine.ISimulationEngine;
  */
 public interface ISimulationEngineFactory {
 
-	public ISimulationEngine createExecutionContainer(ILaunch launch) throws CoreException;
+	public ISimulationEngine createExecutionContainer(Statechart statechart, ILaunch launch) throws CoreException;
 }

+ 32 - 42
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,56 +68,45 @@ 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() {
-		raiseScheduledEvents()
+	override runCycle() {
+		//Raise all schedules events
+		executionContext.allEvents.filter[scheduled].forEach[raised = true scheduled = false]
 		activeStateIndex = 0
-		if(executionContext.executedElements.size > 0) executionContext.executedElements.clear
-		clearOutEvents()
+		if (executionContext.executedElements.size > 0) executionContext.executedElements.clear
+		//Clear all out events
+		executionContext.allEvents.filter[direction == EventDirection.OUT].forEach[if(raised) raised=false]
 		while (activeStateIndex < activeStateConfiguration.size) {
 			var state = activeStateConfiguration.get(activeStateIndex)
 			state?.reactSequence?.scheduleAndRun
 			activeStateIndex = activeStateIndex + 1
 		}
-		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() {
+		//clear all local and in events
 		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
@@ -156,11 +145,12 @@ 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
@@ -181,7 +171,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
 	}

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

@@ -1,104 +1,95 @@
-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)
+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)
 					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(launch);
+			return factory.createExecutionContainer(statechart, launch);
 		} catch (CoreException e) {
 			e.printStackTrace();
 			return null;