Просмотр исходного кода

Added some improvements regarding handling hierarchical statecharts ( YAKHMI-271 & YAKHMI-272 ).

terfloth@itemis.de 14 лет назад
Родитель
Сommit
b73def86ce

+ 15 - 10
plugins/org.yakindu.sct.model.sexec/src/org/yakindu/sct/model/sexec/transformation/ModelSequencer.xtend

@@ -245,15 +245,20 @@ class ModelSequencer {
 		}])
 		
 		if (t.source != null) sequence.steps.add(newExitStateStep(t.source as State))
+		
 		if (t.effect != null) sequence.steps.add(t.effect.mapEffect)		
-		if (t.target != null && t.target instanceof State) sequence.steps.add(newEnterStateStep(t.target as State))
-	
 
 		t.entryStates().reverse.fold(sequence, [seq, state | {
 			if (state.create.entryAction != null) seq.steps.add(state.create.entryAction.newCall)
 			seq
 		}])
 		
+		//TODO: make sure target state entry action is not called twice !!
+
+		if (t.target != null && t.target instanceof State) {
+			sequence.steps.add((t.target as State).create.enterSequence.newCall)	
+		}
+			
 		return sequence
 	}	
 	
@@ -570,18 +575,18 @@ class ModelSequencer {
 	
 	
 	def defineEnterSequence(ExecutionFlow flow, Statechart sc) {
-		val enterSteps = new ArrayList<Step>()
+
+		val enterSequence = sexecFactory.createSequence
+		enterSequence.name = "enter"
+		enterSequence.comment = "Default enter sequence for statechart " + sc.name
 		
 		for ( r : sc.regions) {
-			val step = r.entry?.target?.newEnterStateStep
-			if (step != null) enterSteps.add(step);
+			if ( r.entry?.target != null) {
+				val step = r.entry?.target?.create.enterSequence.newCall
+				if (step != null) enterSequence.steps.add(step);
+			}
 		} 
 		
-		// sc.regions.map(r | r.entry?.target?.newEnterStateStep).filter(e | e != null)
-		val enterSequence = sexecFactory.createSequence
-		enterSequence.name = "enter"
-		enterSequence.comment = "Default enter sequence for statechart " + sc.name
-		enterSteps.forEach(e | enterSequence.steps.add(e));
 		flow.enterSequence = enterSequence
 		return enterSequence
 	}

+ 41 - 42
plugins/org.yakindu.sct.model.sexec/xtend-gen/org/yakindu/sct/model/sexec/transformation/ModelSequencer.java

@@ -439,21 +439,6 @@ public class ModelSequencer {
         Sequence _mapEffect = this.mapEffect(_effect_1);
         _steps_2.add(_mapEffect);
       }
-      boolean _operator_and = false;
-      Vertex _target = t.getTarget();
-      boolean _operator_notEquals_3 = ObjectExtensions.operator_notEquals(_target, null);
-      if (!_operator_notEquals_3) {
-        _operator_and = false;
-      } else {
-        Vertex _target_1 = t.getTarget();
-        _operator_and = BooleanExtensions.operator_and(_operator_notEquals_3, (_target_1 instanceof org.yakindu.sct.model.sgraph.State));
-      }
-      if (_operator_and) {
-        EList<Step> _steps_3 = sequence.getSteps();
-        Vertex _target_2 = t.getTarget();
-        EnterState _newEnterStateStep = this.newEnterStateStep(((State) _target_2));
-        _steps_3.add(_newEnterStateStep);
-      }
       List<State> _entryStates = this.entryStates(t);
       List<State> _reverse = ListExtensions.<State>reverse(_entryStates);
       final Function2<Sequence,State,Sequence> _function_1 = new Function2<Sequence,State,Sequence>() {
@@ -462,13 +447,13 @@ public class ModelSequencer {
             {
               ExecutionState _create_2 = ModelSequencer.this.factory.create(state_1);
               Step _entryAction = _create_2.getEntryAction();
-              boolean _operator_notEquals_4 = ObjectExtensions.operator_notEquals(_entryAction, null);
-              if (_operator_notEquals_4) {
-                EList<Step> _steps_4 = seq_1.getSteps();
+              boolean _operator_notEquals_3 = ObjectExtensions.operator_notEquals(_entryAction, null);
+              if (_operator_notEquals_3) {
+                EList<Step> _steps_3 = seq_1.getSteps();
                 ExecutionState _create_3 = ModelSequencer.this.factory.create(state_1);
                 Step _entryAction_1 = _create_3.getEntryAction();
                 Call _newCall_1 = ModelSequencer.this.factory.newCall(_entryAction_1);
-                _steps_4.add(_newCall_1);
+                _steps_3.add(_newCall_1);
               }
               _xblockexpression_1 = (seq_1);
             }
@@ -476,6 +461,23 @@ public class ModelSequencer {
           }
         };
       IterableExtensions.<State, Sequence>fold(_reverse, sequence, _function_1);
+      boolean _operator_and = false;
+      Vertex _target = t.getTarget();
+      boolean _operator_notEquals_4 = ObjectExtensions.operator_notEquals(_target, null);
+      if (!_operator_notEquals_4) {
+        _operator_and = false;
+      } else {
+        Vertex _target_1 = t.getTarget();
+        _operator_and = BooleanExtensions.operator_and(_operator_notEquals_4, (_target_1 instanceof org.yakindu.sct.model.sgraph.State));
+      }
+      if (_operator_and) {
+        EList<Step> _steps_4 = sequence.getSteps();
+        Vertex _target_2 = t.getTarget();
+        ExecutionState _create_4 = this.factory.create(((State) _target_2));
+        Sequence _enterSequence = _create_4.getEnterSequence();
+        Call _newCall_2 = this.factory.newCall(_enterSequence);
+        _steps_4.add(_newCall_2);
+      }
       return sequence;
     }
   }
@@ -1186,22 +1188,6 @@ public class ModelSequencer {
   
   public Sequence defineEnterSequence(final ExecutionFlow flow, final Statechart sc) {
     {
-      ArrayList<Step> _arrayList = new ArrayList<Step>();
-      final ArrayList<Step> enterSteps = _arrayList;
-      EList<Region> _regions = sc.getRegions();
-      for (Region r : _regions) {
-        {
-          Entry _entry = this.entry(r);
-          State _target = this==null?(State)null:this.target(_entry);
-          EnterState _newEnterStateStep = this==null?(EnterState)null:this.newEnterStateStep(_target);
-          final EnterState step = _newEnterStateStep;
-          boolean _operator_notEquals = ObjectExtensions.operator_notEquals(step, null);
-          if (_operator_notEquals) {
-            final ArrayList<Step> typeConverted_enterSteps = (ArrayList<Step>)enterSteps;
-            typeConverted_enterSteps.add(step);
-          }
-        }
-      }
       SexecFactory _sexecFactory = this.sexecFactory();
       Sequence _createSequence = _sexecFactory.createSequence();
       final Sequence enterSequence = _createSequence;
@@ -1209,14 +1195,27 @@ public class ModelSequencer {
       String _name = sc.getName();
       String _operator_plus = StringExtensions.operator_plus("Default enter sequence for statechart ", _name);
       enterSequence.setComment(_operator_plus);
-      final Function1<Step,Boolean> _function = new Function1<Step,Boolean>() {
-          public Boolean apply(final Step e) {
-            EList<Step> _steps = enterSequence.getSteps();
-            boolean _add = _steps.add(e);
-            return ((Boolean)_add);
+      EList<Region> _regions = sc.getRegions();
+      for (Region r : _regions) {
+        Entry _entry = this.entry(r);
+        State _target = this==null?(State)null:this.target(_entry);
+        boolean _operator_notEquals = ObjectExtensions.operator_notEquals(_target, null);
+        if (_operator_notEquals) {
+          {
+            Entry _entry_1 = this.entry(r);
+            State _target_1 = this==null?(State)null:this.target(_entry_1);
+            ExecutionState _create = this.factory==null?(ExecutionState)null:this.factory.create(_target_1);
+            Sequence _enterSequence = _create.getEnterSequence();
+            Call _newCall = this.factory.newCall(_enterSequence);
+            final Call step = _newCall;
+            boolean _operator_notEquals_1 = ObjectExtensions.operator_notEquals(step, null);
+            if (_operator_notEquals_1) {
+              EList<Step> _steps = enterSequence.getSteps();
+              _steps.add(step);
+            }
           }
-        };
-      IterableExtensions.<Step>forEach(enterSteps, _function);
+        }
+      }
       flow.setEnterSequence(enterSequence);
       return enterSequence;
     }

+ 18 - 0
test-plugins/org.yakindu.sct.model.sexec.test/src/org/yakindu/sct/model/sexec/transformation/test/Assert.java

@@ -0,0 +1,18 @@
+package org.yakindu.sct.model.sexec.transformation.test;
+
+import static org.junit.Assert.assertSame;
+
+import org.yakindu.sct.model.sexec.Call;
+import org.yakindu.sct.model.sexec.Sequence;
+import org.yakindu.sct.model.sexec.Step;
+
+
+public class Assert {
+
+	public static void assertCall(Sequence seq, int pos, Step target) {
+		Call call = (Call) seq.getSteps().get(pos);
+		assertSame(target, call.getStep());		
+	}
+	
+
+}

+ 6 - 10
test-plugins/org.yakindu.sct.model.sexec.test/src/org/yakindu/sct/model/sexec/transformation/test/ModelSequencerStateTest.java

@@ -27,7 +27,7 @@ import com.google.inject.Guice;
 import com.google.inject.Inject;
 import com.google.inject.Injector;
 
-public class ModelSequencerStateTest {
+public class ModelSequencerStateTest extends Assert {
 
 	
 	@Inject
@@ -151,9 +151,9 @@ public class ModelSequencerStateTest {
 		assertNotNull(_s1.getEntryAction());
 		assertNotNull(_s1.getEnterSequence());
 		assertEquals(2, _s1.getEnterSequence().getSteps().size());
-		Call entryCall = (Call) _s1.getEnterSequence().getSteps().get(0);
-		assertSame(_s1.getEntryAction(), entryCall.getStep());
 		
+		assertCall(_s1.getEnterSequence(), 0, _s1.getEntryAction());
+				
 		assertTrue(_s1.getEnterSequence().getSteps().get(1) instanceof EnterState);
 	}
 
@@ -199,14 +199,10 @@ public class ModelSequencerStateTest {
 		assertNotNull(_s1.getEntryAction());
 		assertNotNull(_s1.getEnterSequence());
 		assertEquals(3, _s1.getEnterSequence().getSteps().size());
-		Call entryCall = (Call) _s1.getEnterSequence().getSteps().get(0);
-		assertSame(_s1.getEntryAction(), entryCall.getStep());
 		
-		Call subEnterCall1 = (Call) _s1.getEnterSequence().getSteps().get(1);
-		assertSame(_s2.getEnterSequence(), subEnterCall1.getStep());
-
-		Call subEnterCall2 = (Call) _s1.getEnterSequence().getSteps().get(2);
-		assertSame(_s3.getEnterSequence(), subEnterCall2.getStep());
+		assertCall(_s1.getEnterSequence(), 0, _s1.getEntryAction());
+		assertCall(_s1.getEnterSequence(), 1, _s2.getEnterSequence());
+		assertCall(_s1.getEnterSequence(), 2, _s3.getEnterSequence());
 	}
 
 

+ 7 - 8
test-plugins/org.yakindu.sct.model.sexec.test/src/org/yakindu/sct/model/sexec/transformation/test/ModelSequencerTest.java

@@ -39,6 +39,7 @@ import org.yakindu.sct.model.sexec.If;
 import org.yakindu.sct.model.sexec.Reaction;
 import org.yakindu.sct.model.sexec.ScheduleTimeEvent;
 import org.yakindu.sct.model.sexec.Sequence;
+import org.yakindu.sct.model.sexec.Step;
 import org.yakindu.sct.model.sexec.TimeEvent;
 import org.yakindu.sct.model.sexec.UnscheduleTimeEvent;
 import org.yakindu.sct.model.sexec.transformation.ModelSequencer;
@@ -88,7 +89,7 @@ import com.google.inject.Injector;
  * 
  */
 @SuppressWarnings("unused")
-public class ModelSequencerTest {
+public class ModelSequencerTest extends Assert {
 
 	@Inject
 	private ModelSequencer sequencer;
@@ -194,13 +195,13 @@ public class ModelSequencerTest {
 		
 		assertNotNull(flow.getEnterSequence());
 		assertEquals(1, flow.getEnterSequence().getSteps().size());
-
-		EnterState enterState = (EnterState) flow.getEnterSequence().getSteps().get(0);
-		assertEquals(tsc.s1.getName(), enterState.getState().getSimpleName());
+		
+		assertCall(flow.getEnterSequence(), 0, flow.getStates().get(0).getEnterSequence());
 	}
 	
 	
 	
+	
 	/**
 	 * For each top level region a EnterState step must be performed.
 	 */
@@ -212,11 +213,9 @@ public class ModelSequencerTest {
 		assertNotNull(flow.getEnterSequence());
 		assertEquals(2, flow.getEnterSequence().getSteps().size());
 
-		EnterState enterState = (EnterState) flow.getEnterSequence().getSteps().get(0);
-		assertEquals(tsc.s1.getName(), enterState.getState().getSimpleName());
+		assertCall(flow.getEnterSequence(), 0, flow.getStates().get(0).getEnterSequence());
+		assertCall(flow.getEnterSequence(), 1, flow.getStates().get(2).getEnterSequence());
 
-		enterState = (EnterState) flow.getEnterSequence().getSteps().get(1);
-		assertEquals(tsc.s3.getName(), enterState.getState().getSimpleName());
 	}