Sfoglia il codice sorgente

Improve sync validation logic (#1864)

* Improve sync validation logic

* Fix test setup for sync validation, remove stale error codes

* Fix & add validation rule for sync transitions

* Add test for outgoing transition on sync, fix other test
Rene Beckmann 7 anni fa
parent
commit
8b199bdc34

+ 29 - 16
plugins/org.yakindu.sct.model.sgraph/src/org/yakindu/sct/model/sgraph/validation/SGraphJavaValidator.java

@@ -13,11 +13,11 @@ package org.yakindu.sct.model.sgraph.validation;
 import static org.yakindu.sct.model.sgraph.util.SGgraphUtil.areOrthogonal;
 import static org.yakindu.sct.model.sgraph.util.SGgraphUtil.collectAncestors;
 import static org.yakindu.sct.model.sgraph.util.SGgraphUtil.commonAncestor;
-import static org.yakindu.sct.model.sgraph.util.SGgraphUtil.findCommonAncestor;
 import static org.yakindu.sct.model.sgraph.util.SGgraphUtil.sources;
 import static org.yakindu.sct.model.sgraph.util.SGgraphUtil.targets;
 
 import java.util.ArrayList;
+import java.util.Arrays;
 import java.util.HashSet;
 import java.util.Iterator;
 import java.util.List;
@@ -77,10 +77,10 @@ public class SGraphJavaValidator extends AbstractDeclarativeValidator {
 	public static final String ISSUE_REGION_CANT_BE_ENTERED_USING_SHALLOW_HISTORY_NON_CONNECTED_DEFAULT_ENTRY = "The region can't be entered using the shallow history. Add a transition from default entry to a state.";
 	public static final String ISSUE_SUBMACHINE_UNRESOLVABLE = "Referenced substate machine '%s'does not exist!";
 	public static final String ISSUE_SYNCHRONIZATION_TARGET_STATES_NOT_ORTHOGONAL = "The target states of a synchronization must be orthogonal!";
-	public static final String ISSUE_SYNCHRONIZATION_TARGET_STATES_NOT_WITHIN_SAME_PARENTSTATE = "The target states of a synchronization have to be contained in the same parent state within different regions!";
 	public static final String ISSUE_SYNCHRONIZATION_SOURCE_STATES_NOT_ORTHOGONAL = "The source states of a synchronization must be orthogonal!";
-	public static final String ISSUE_SYNCHRONIZATION_SOURCE_STATES_NOT_WITHIN_SAME_PARENTSTATE = "The source states of a synchronization have to be contained in the same parent state within different regions!";
-	public static final String ISSUE_SYNCHRONIZATION_TRANSITION_COUNT = "A synchronization should have at least two incoming or two outgoing transitions.";
+	public static final String ISSUE_SYNCHRONIZATION_TRANSITION_COUNT = "A synchronization must have at least two incoming or two outgoing transitions.";
+	public static final String ISSUE_SYNCHRONIZATION_TRANSITION_OUTGOING = "A synchronization must have an outgoing transition.";
+	public static final String ISSUE_SYNCHRONIZATION_SOURCE_TARGET_STATES_PARENT_REGION = "A synchronization's source- and parent states last common ancestor has to be a region!";
 	public static final String ISSUE_TRANSITION_ORTHOGONAL = "Source and target of a transition must not be located in orthogonal regions!";
 	public static final String ISSUE_INITIAL_ENTRY_WITH_TRANSITION_TO_CONTAINER = "Outgoing transitions from entries can only target to sibling or inner states.";
 	public static final String ISSUE_STATECHART_NAME_NO_IDENTIFIER = "%s is not a valid identifier!";
@@ -223,10 +223,19 @@ public class SGraphJavaValidator extends AbstractDeclarativeValidator {
 		}
 	}
 
+	@Check(CheckType.FAST)
+	public void synchronizationOutgoingTransitionCount(Synchronization sync) {
+		if (sync.getOutgoingTransitions().size() == 0) {
+			error(ISSUE_SYNCHRONIZATION_TRANSITION_OUTGOING, sync, null, -1);
+		}
+	}
+	
 	@Check(CheckType.FAST)
 	public void synchronizationTransitionCount(Synchronization sync) {
-		if (sync.getIncomingTransitions().size() < 2 && sync.getOutgoingTransitions().size() < 2) {
-			warning(ISSUE_SYNCHRONIZATION_TRANSITION_COUNT, sync, null, -1);
+		int in = sync.getIncomingTransitions().size();
+		int out = sync.getOutgoingTransitions().size();
+		if (in < 2 && out < 2) {
+			error(ISSUE_SYNCHRONIZATION_TRANSITION_COUNT, sync, null, -1);
 		}
 	}
 
@@ -330,7 +339,7 @@ public class SGraphJavaValidator extends AbstractDeclarativeValidator {
 			error(ISSUE_SYNCHRONIZATION_TARGET_STATES_NOT_ORTHOGONAL, sync, null, -1);
 		}
 	}
-
+	
 	@Check
 	public void orthogonalSynchronizedTransition(Synchronization sync) {
 
@@ -346,27 +355,31 @@ public class SGraphJavaValidator extends AbstractDeclarativeValidator {
 			outAncestorsList.add(collectAncestors(trans.getTarget(), new ArrayList<EObject>()));
 		}
 
-		Set<Transition> inOrthogonal = new HashSet<Transition>(incoming);
-		Set<Transition> outOrthogonal = new HashSet<Transition>(outgoing);
+		Set<Transition> inOrthogonal = new HashSet<Transition>();
+		Set<Transition> outOrthogonal = new HashSet<Transition>();
+		
+		if(incoming.size() == 0 || outgoing.size() == 0) {
+			return;
+		}
 
 		for (int i = 0; i < incoming.size(); i++) {
 			for (int j = 0; j < outgoing.size(); j++) {
 
-				EObject commonAncestor = findCommonAncestor(inAncestorsList.get(i), outAncestorsList.get(j));
-
-				if (commonAncestor instanceof Region) {
-					inOrthogonal.remove(incoming.get(i));
-					outOrthogonal.remove(outgoing.get(j));
+				List<Vertex> states = new ArrayList<>(Arrays.asList(incoming.get(i).getSource(), outgoing.get(j).getTarget()));
+				
+				if (areOrthogonal(states)) {
+					inOrthogonal.add(incoming.get(i));
+					outOrthogonal.add(outgoing.get(j));
 				}
 			}
 		}
 
 		for (Transition trans : inOrthogonal) {
-			error(ISSUE_SYNCHRONIZATION_SOURCE_STATES_NOT_WITHIN_SAME_PARENTSTATE, trans, null, -1);
+			error(ISSUE_SYNCHRONIZATION_SOURCE_TARGET_STATES_PARENT_REGION, trans, null, -1);
 		}
 
 		for (Transition trans : outOrthogonal) {
-			error(ISSUE_SYNCHRONIZATION_TARGET_STATES_NOT_WITHIN_SAME_PARENTSTATE, trans, null, -1);
+			error(ISSUE_SYNCHRONIZATION_SOURCE_TARGET_STATES_PARENT_REGION, trans, null, -1);
 		}
 
 	}

+ 18 - 6
test-plugins/org.yakindu.sct.model.sgraph.test/src/org/yakindu/sct/model/sgraph/test/SGraphJavaValidationTest.java

@@ -572,13 +572,13 @@ public class SGraphJavaValidationTest {
 		while (iter.hasNext()) {
 			EObject element = iter.next();
 			if (element instanceof Synchronization) {
-				assertTrue(validator.validate(element, diagnostics,
+				assertFalse(validator.validate(element, diagnostics,
 						new HashMap<Object, Object>()));
 			}
 		}
 
 		assertIssueCount(diagnostics, 2);
-		assertWarning(diagnostics, ISSUE_SYNCHRONIZATION_TRANSITION_COUNT);
+		assertError(diagnostics, ISSUE_SYNCHRONIZATION_TRANSITION_COUNT);
 	}
 
 	
@@ -693,8 +693,8 @@ public class SGraphJavaValidationTest {
 		Synchronization sync = (Synchronization) stateB.getOutgoingTransitions().get(0).getTarget();
 		
 		assertFalse(validator.validate(sync, diagnostics, new HashMap<Object, Object>()));
-		assertIssueCount(diagnostics, 1);
-		assertError(diagnostics, ISSUE_SYNCHRONIZATION_TARGET_STATES_NOT_WITHIN_SAME_PARENTSTATE);
+		assertIssueCount(diagnostics, 2);
+		assertError(diagnostics, ISSUE_SYNCHRONIZATION_SOURCE_TARGET_STATES_PARENT_REGION);
 	}
 
 
@@ -705,8 +705,8 @@ public class SGraphJavaValidationTest {
 		Synchronization sync = (Synchronization) stateC.getOutgoingTransitions().get(0).getTarget();
 		
 		assertFalse(validator.validate(sync, diagnostics, new HashMap<Object, Object>()));
-		assertIssueCount(diagnostics, 1);
-		assertError(diagnostics, ISSUE_SYNCHRONIZATION_SOURCE_STATES_NOT_WITHIN_SAME_PARENTSTATE);
+		assertIssueCount(diagnostics, 2);
+		assertError(diagnostics, ISSUE_SYNCHRONIZATION_SOURCE_TARGET_STATES_PARENT_REGION);
 	}
 
 
@@ -809,6 +809,18 @@ public class SGraphJavaValidationTest {
 				new HashMap<Object, Object>());
 		assertIssueCount(diagnostics, 0);
 	}
+	
+	@Test
+	public void synchronizationOutgoingTransitionCount() {
+		statechart = loadStatechart("SyncOutgoingTransition.sct");
+		
+		State state = firstNamed(EcoreUtil2.eAllOfType(statechart, State.class), "StateB");
+		Synchronization sync = (Synchronization) state.getOutgoingTransitions().get(0).getTarget();
+		
+		assertFalse(validator.validate(sync, diagnostics, new HashMap<Object, Object>()));
+		assertIssueCount(diagnostics, 1);
+		assertError(diagnostics, ISSUE_SYNCHRONIZATION_TRANSITION_OUTGOING);
+	}
 
 	/**
 	 * checks that each @Check method of {@link STextJavaValidator} has a @Test

+ 215 - 0
test-plugins/org.yakindu.sct.test.models/testmodels/validation/SyncOutgoingTransition.sct

@@ -0,0 +1,215 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<xmi:XMI xmi:version="2.0" xmlns:xmi="http://www.omg.org/XMI" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:notation="http://www.eclipse.org/gmf/runtime/1.0.2/notation" xmlns:sgraph="http://www.yakindu.org/sct/sgraph/2.0.0">
+  <sgraph:Statechart xmi:id="_VTHl4AETEeiXS5l_BRhbwg" specification="interface:&#xA;// Define events and&#xA;// and variables here. &#xA;//Use CTRL + Space for content assist." name="SyncOutgoingTransition">
+    <regions xmi:id="_VTKpMAETEeiXS5l_BRhbwg" name="main region">
+      <vertices xsi:type="sgraph:Entry" xmi:id="_VTUaMQETEeiXS5l_BRhbwg">
+        <outgoingTransitions xmi:id="_VTZ5wQETEeiXS5l_BRhbwg" target="_VTWPYQETEeiXS5l_BRhbwg"/>
+      </vertices>
+      <vertices xsi:type="sgraph:State" xmi:id="_VTWPYQETEeiXS5l_BRhbwg" name="StateA" incomingTransitions="_VTZ5wQETEeiXS5l_BRhbwg">
+        <regions xmi:id="_gOThEAETEeiXS5l_BRhbwg" name="">
+          <vertices xsi:type="sgraph:Entry" xmi:id="_gOThEQETEeiXS5l_BRhbwg">
+            <outgoingTransitions xmi:id="_gOThEgETEeiXS5l_BRhbwg" specification="" target="_gOUIIAETEeiXS5l_BRhbwg"/>
+          </vertices>
+          <vertices xsi:type="sgraph:State" xmi:id="_gOUIIAETEeiXS5l_BRhbwg" name="StateB" incomingTransitions="_gOThEgETEeiXS5l_BRhbwg">
+            <outgoingTransitions xmi:id="_XwTaAAETEeiXS5l_BRhbwg" specification="always" target="_WjwHUAETEeiXS5l_BRhbwg"/>
+          </vertices>
+        </regions>
+        <regions xmi:id="_hL3VgAETEeiXS5l_BRhbwg" name="">
+          <vertices xsi:type="sgraph:Entry" xmi:id="_hL3VgQETEeiXS5l_BRhbwg">
+            <outgoingTransitions xmi:id="_hL38kAETEeiXS5l_BRhbwg" specification="" target="_hL38kQETEeiXS5l_BRhbwg"/>
+          </vertices>
+          <vertices xsi:type="sgraph:State" xmi:id="_hL38kQETEeiXS5l_BRhbwg" name="State1" incomingTransitions="_hL38kAETEeiXS5l_BRhbwg">
+            <outgoingTransitions xmi:id="_il3OUAETEeiXS5l_BRhbwg" specification="always" target="_WjwHUAETEeiXS5l_BRhbwg"/>
+          </vertices>
+        </regions>
+      </vertices>
+      <vertices xsi:type="sgraph:Synchronization" xmi:id="_WjwHUAETEeiXS5l_BRhbwg" incomingTransitions="_XwTaAAETEeiXS5l_BRhbwg _il3OUAETEeiXS5l_BRhbwg"/>
+    </regions>
+  </sgraph:Statechart>
+  <notation:Diagram xmi:id="_VTKCIAETEeiXS5l_BRhbwg" type="org.yakindu.sct.ui.editor.editor.StatechartDiagramEditor" element="_VTHl4AETEeiXS5l_BRhbwg" measurementUnit="Pixel">
+    <children xmi:id="_VTOTkAETEeiXS5l_BRhbwg" type="Region" element="_VTKpMAETEeiXS5l_BRhbwg">
+      <children xsi:type="notation:DecorationNode" xmi:id="_VTSlAAETEeiXS5l_BRhbwg" type="RegionName">
+        <styles xsi:type="notation:ShapeStyle" xmi:id="_VTSlAQETEeiXS5l_BRhbwg"/>
+        <layoutConstraint xsi:type="notation:Location" xmi:id="_VTSlAgETEeiXS5l_BRhbwg"/>
+      </children>
+      <children xsi:type="notation:Shape" xmi:id="_VTTMEAETEeiXS5l_BRhbwg" type="RegionCompartment" fontName="Verdana" lineColor="4210752">
+        <children xmi:id="_VTVBQAETEeiXS5l_BRhbwg" type="Entry" element="_VTUaMQETEeiXS5l_BRhbwg">
+          <children xmi:id="_VTVoUAETEeiXS5l_BRhbwg" type="BorderItemLabelContainer">
+            <children xsi:type="notation:DecorationNode" xmi:id="_VTVoUwETEeiXS5l_BRhbwg" type="BorderItemLabel">
+              <styles xsi:type="notation:ShapeStyle" xmi:id="_VTVoVAETEeiXS5l_BRhbwg"/>
+              <layoutConstraint xsi:type="notation:Location" xmi:id="_VTVoVQETEeiXS5l_BRhbwg"/>
+            </children>
+            <styles xsi:type="notation:ShapeStyle" xmi:id="_VTVoUQETEeiXS5l_BRhbwg" fontName="Verdana" lineColor="4210752"/>
+            <layoutConstraint xsi:type="notation:Bounds" xmi:id="_VTVoUgETEeiXS5l_BRhbwg"/>
+          </children>
+          <styles xsi:type="notation:ShapeStyle" xmi:id="_VTVBQQETEeiXS5l_BRhbwg" fontName="Verdana" fillColor="0" lineColor="16777215"/>
+          <styles xsi:type="notation:NamedStyle" xmi:id="_VTVBQgETEeiXS5l_BRhbwg" name="allowColors"/>
+          <layoutConstraint xsi:type="notation:Bounds" xmi:id="_VTWPYAETEeiXS5l_BRhbwg" x="70" y="20"/>
+        </children>
+        <children xmi:id="_VTXdgAETEeiXS5l_BRhbwg" type="State" element="_VTWPYQETEeiXS5l_BRhbwg">
+          <children xsi:type="notation:DecorationNode" xmi:id="_VTYEkAETEeiXS5l_BRhbwg" type="StateName">
+            <styles xsi:type="notation:ShapeStyle" xmi:id="_VTYEkQETEeiXS5l_BRhbwg"/>
+            <layoutConstraint xsi:type="notation:Location" xmi:id="_VTYEkgETEeiXS5l_BRhbwg"/>
+          </children>
+          <children xsi:type="notation:Compartment" xmi:id="_VTYroAETEeiXS5l_BRhbwg" type="StateTextCompartment">
+            <children xsi:type="notation:Shape" xmi:id="_VTYroQETEeiXS5l_BRhbwg" type="StateTextCompartmentExpression" fontName="Verdana" lineColor="4210752">
+              <layoutConstraint xsi:type="notation:Bounds" xmi:id="_VTYrogETEeiXS5l_BRhbwg"/>
+            </children>
+          </children>
+          <children xsi:type="notation:Compartment" xmi:id="_VTZSsAETEeiXS5l_BRhbwg" type="StateFigureCompartment">
+            <children xmi:id="_gORr4AETEeiXS5l_BRhbwg" type="Region" element="_gOThEAETEeiXS5l_BRhbwg">
+              <children xsi:type="notation:DecorationNode" xmi:id="_gORr4QETEeiXS5l_BRhbwg" type="RegionName">
+                <styles xsi:type="notation:ShapeStyle" xmi:id="_gORr4gETEeiXS5l_BRhbwg"/>
+                <layoutConstraint xsi:type="notation:Location" xmi:id="_gORr4wETEeiXS5l_BRhbwg"/>
+              </children>
+              <children xsi:type="notation:Shape" xmi:id="_gORr5AETEeiXS5l_BRhbwg" type="RegionCompartment" fontName="Verdana" lineColor="4210752">
+                <children xmi:id="_gORr5QETEeiXS5l_BRhbwg" type="Entry" element="_gOThEQETEeiXS5l_BRhbwg">
+                  <children xmi:id="_gORr5gETEeiXS5l_BRhbwg" type="BorderItemLabelContainer">
+                    <children xsi:type="notation:DecorationNode" xmi:id="_gORr5wETEeiXS5l_BRhbwg" type="BorderItemLabel">
+                      <styles xsi:type="notation:ShapeStyle" xmi:id="_gORr6AETEeiXS5l_BRhbwg"/>
+                      <layoutConstraint xsi:type="notation:Location" xmi:id="_gORr6QETEeiXS5l_BRhbwg"/>
+                    </children>
+                    <styles xsi:type="notation:ShapeStyle" xmi:id="_gORr6gETEeiXS5l_BRhbwg" fontName="Verdana" lineColor="4210752"/>
+                    <layoutConstraint xsi:type="notation:Bounds" xmi:id="_gORr6wETEeiXS5l_BRhbwg"/>
+                  </children>
+                  <styles xsi:type="notation:ShapeStyle" xmi:id="_gORr7AETEeiXS5l_BRhbwg" fontName="Verdana" lineColor="4210752"/>
+                  <layoutConstraint xsi:type="notation:Bounds" xmi:id="_gORr7QETEeiXS5l_BRhbwg" x="39" y="12"/>
+                </children>
+                <children xmi:id="_gORr7gETEeiXS5l_BRhbwg" type="State" element="_gOUIIAETEeiXS5l_BRhbwg">
+                  <children xsi:type="notation:DecorationNode" xmi:id="_gORr7wETEeiXS5l_BRhbwg" type="StateName">
+                    <styles xsi:type="notation:ShapeStyle" xmi:id="_gORr8AETEeiXS5l_BRhbwg"/>
+                    <layoutConstraint xsi:type="notation:Location" xmi:id="_gORr8QETEeiXS5l_BRhbwg"/>
+                  </children>
+                  <children xsi:type="notation:Compartment" xmi:id="_gORr8gETEeiXS5l_BRhbwg" type="StateTextCompartment">
+                    <children xsi:type="notation:Shape" xmi:id="_gORr8wETEeiXS5l_BRhbwg" type="StateTextCompartmentExpression" fontName="Verdana" lineColor="4210752">
+                      <layoutConstraint xsi:type="notation:Bounds" xmi:id="_gORr9AETEeiXS5l_BRhbwg"/>
+                    </children>
+                  </children>
+                  <children xsi:type="notation:Compartment" xmi:id="_gORr9QETEeiXS5l_BRhbwg" type="StateFigureCompartment"/>
+                  <styles xsi:type="notation:ShapeStyle" xmi:id="_gORr9gETEeiXS5l_BRhbwg" fontName="Verdana" fillColor="15981773" lineColor="12632256"/>
+                  <styles xsi:type="notation:FontStyle" xmi:id="_gORr9wETEeiXS5l_BRhbwg"/>
+                  <styles xsi:type="notation:BooleanValueStyle" xmi:id="_gORr-AETEeiXS5l_BRhbwg" name="isHorizontal" booleanValue="true"/>
+                  <layoutConstraint xsi:type="notation:Bounds" xmi:id="_gORr-QETEeiXS5l_BRhbwg" x="20" y="47"/>
+                </children>
+                <layoutConstraint xsi:type="notation:Bounds" xmi:id="_gORr-gETEeiXS5l_BRhbwg"/>
+              </children>
+              <styles xsi:type="notation:ShapeStyle" xmi:id="_gORr-wETEeiXS5l_BRhbwg" fontName="Verdana" fillColor="15790320" lineColor="12632256"/>
+              <layoutConstraint xsi:type="notation:Bounds" xmi:id="_gORr_AETEeiXS5l_BRhbwg" x="90" y="10"/>
+            </children>
+            <children xmi:id="_hL2ucAETEeiXS5l_BRhbwg" type="Region" element="_hL3VgAETEeiXS5l_BRhbwg">
+              <children xsi:type="notation:DecorationNode" xmi:id="_hL2ucQETEeiXS5l_BRhbwg" type="RegionName">
+                <styles xsi:type="notation:ShapeStyle" xmi:id="_hL2ucgETEeiXS5l_BRhbwg"/>
+                <layoutConstraint xsi:type="notation:Location" xmi:id="_hL2ucwETEeiXS5l_BRhbwg"/>
+              </children>
+              <children xsi:type="notation:Shape" xmi:id="_hL2udAETEeiXS5l_BRhbwg" type="RegionCompartment" fontName="Verdana" lineColor="4210752">
+                <children xmi:id="_hL2udQETEeiXS5l_BRhbwg" type="Entry" element="_hL3VgQETEeiXS5l_BRhbwg">
+                  <children xmi:id="_hL2udgETEeiXS5l_BRhbwg" type="BorderItemLabelContainer">
+                    <children xsi:type="notation:DecorationNode" xmi:id="_hL2udwETEeiXS5l_BRhbwg" type="BorderItemLabel">
+                      <styles xsi:type="notation:ShapeStyle" xmi:id="_hL2ueAETEeiXS5l_BRhbwg"/>
+                      <layoutConstraint xsi:type="notation:Location" xmi:id="_hL2ueQETEeiXS5l_BRhbwg"/>
+                    </children>
+                    <styles xsi:type="notation:ShapeStyle" xmi:id="_hL2uegETEeiXS5l_BRhbwg" fontName="Verdana" lineColor="4210752"/>
+                    <layoutConstraint xsi:type="notation:Bounds" xmi:id="_hL2uewETEeiXS5l_BRhbwg"/>
+                  </children>
+                  <styles xsi:type="notation:ShapeStyle" xmi:id="_hL2ufAETEeiXS5l_BRhbwg" fontName="Verdana" lineColor="4210752"/>
+                  <layoutConstraint xsi:type="notation:Bounds" xmi:id="_hL2ufQETEeiXS5l_BRhbwg" x="39" y="12"/>
+                </children>
+                <children xmi:id="_hL2ufgETEeiXS5l_BRhbwg" type="State" element="_hL38kQETEeiXS5l_BRhbwg">
+                  <children xsi:type="notation:DecorationNode" xmi:id="_hL2ufwETEeiXS5l_BRhbwg" type="StateName">
+                    <styles xsi:type="notation:ShapeStyle" xmi:id="_hL2ugAETEeiXS5l_BRhbwg"/>
+                    <layoutConstraint xsi:type="notation:Location" xmi:id="_hL2ugQETEeiXS5l_BRhbwg"/>
+                  </children>
+                  <children xsi:type="notation:Compartment" xmi:id="_hL2uggETEeiXS5l_BRhbwg" type="StateTextCompartment">
+                    <children xsi:type="notation:Shape" xmi:id="_hL2ugwETEeiXS5l_BRhbwg" type="StateTextCompartmentExpression" fontName="Verdana" lineColor="4210752">
+                      <layoutConstraint xsi:type="notation:Bounds" xmi:id="_hL2uhAETEeiXS5l_BRhbwg"/>
+                    </children>
+                  </children>
+                  <children xsi:type="notation:Compartment" xmi:id="_hL2uhQETEeiXS5l_BRhbwg" type="StateFigureCompartment"/>
+                  <styles xsi:type="notation:ShapeStyle" xmi:id="_hL2uhgETEeiXS5l_BRhbwg" fontName="Verdana" fillColor="15981773" lineColor="12632256"/>
+                  <styles xsi:type="notation:FontStyle" xmi:id="_hL2uhwETEeiXS5l_BRhbwg"/>
+                  <styles xsi:type="notation:BooleanValueStyle" xmi:id="_hL2uiAETEeiXS5l_BRhbwg" name="isHorizontal" booleanValue="true"/>
+                  <layoutConstraint xsi:type="notation:Bounds" xmi:id="_hL2uiQETEeiXS5l_BRhbwg" x="20" y="47"/>
+                </children>
+                <layoutConstraint xsi:type="notation:Bounds" xmi:id="_hL2uigETEeiXS5l_BRhbwg"/>
+              </children>
+              <styles xsi:type="notation:ShapeStyle" xmi:id="_hL2uiwETEeiXS5l_BRhbwg" fontName="Verdana" fillColor="15790320" lineColor="12632256"/>
+              <layoutConstraint xsi:type="notation:Bounds" xmi:id="_hL2ujAETEeiXS5l_BRhbwg" x="90" y="10"/>
+            </children>
+          </children>
+          <styles xsi:type="notation:ShapeStyle" xmi:id="_VTXdgQETEeiXS5l_BRhbwg" fontName="Verdana" fillColor="15981773" lineColor="12632256"/>
+          <styles xsi:type="notation:FontStyle" xmi:id="_VTXdggETEeiXS5l_BRhbwg"/>
+          <styles xsi:type="notation:BooleanValueStyle" xmi:id="_VTZSsQETEeiXS5l_BRhbwg" name="isHorizontal" booleanValue="true"/>
+          <layoutConstraint xsi:type="notation:Bounds" xmi:id="_VTZ5wAETEeiXS5l_BRhbwg" x="40" y="80"/>
+        </children>
+        <children xsi:type="notation:Shape" xmi:id="_Wj0YwAETEeiXS5l_BRhbwg" type="Synchronization" element="_WjwHUAETEeiXS5l_BRhbwg" fontName="Verdana" lineColor="4210752">
+          <layoutConstraint xsi:type="notation:Bounds" xmi:id="_Wj0YwQETEeiXS5l_BRhbwg" x="129" y="327" width="68" height="8"/>
+        </children>
+        <layoutConstraint xsi:type="notation:Bounds" xmi:id="_VTTMEQETEeiXS5l_BRhbwg"/>
+      </children>
+      <styles xsi:type="notation:ShapeStyle" xmi:id="_VTOTkQETEeiXS5l_BRhbwg" fontName="Verdana" fillColor="15790320" lineColor="12632256"/>
+      <layoutConstraint xsi:type="notation:Bounds" xmi:id="_VTUaMAETEeiXS5l_BRhbwg" x="235" y="20" width="400" height="400"/>
+    </children>
+    <children xsi:type="notation:Shape" xmi:id="_VTeLMAETEeiXS5l_BRhbwg" type="StatechartText" fontName="Verdana" lineColor="4210752">
+      <children xsi:type="notation:DecorationNode" xmi:id="_VTeyQAETEeiXS5l_BRhbwg" type="StatechartName">
+        <styles xsi:type="notation:ShapeStyle" xmi:id="_VTeyQQETEeiXS5l_BRhbwg"/>
+        <layoutConstraint xsi:type="notation:Location" xmi:id="_VTeyQgETEeiXS5l_BRhbwg"/>
+      </children>
+      <children xsi:type="notation:Shape" xmi:id="_VTeyQwETEeiXS5l_BRhbwg" type="StatechartTextExpression" fontName="Verdana" lineColor="4210752">
+        <layoutConstraint xsi:type="notation:Bounds" xmi:id="_VTeyRAETEeiXS5l_BRhbwg"/>
+      </children>
+      <layoutConstraint xsi:type="notation:Bounds" xmi:id="_VTgAYAETEeiXS5l_BRhbwg" x="10" y="10" width="200" height="400"/>
+    </children>
+    <styles xsi:type="notation:BooleanValueStyle" xmi:id="_VTKCIQETEeiXS5l_BRhbwg" name="inlineDefinitionSection" booleanValue="true"/>
+    <styles xsi:type="notation:DiagramStyle" xmi:id="_VTKCIgETEeiXS5l_BRhbwg"/>
+    <edges xmi:id="_VTcWAAETEeiXS5l_BRhbwg" type="Transition" element="_VTZ5wQETEeiXS5l_BRhbwg" source="_VTVBQAETEeiXS5l_BRhbwg" target="_VTXdgAETEeiXS5l_BRhbwg">
+      <children xsi:type="notation:DecorationNode" xmi:id="_VTdkIAETEeiXS5l_BRhbwg" type="TransitionExpression">
+        <styles xsi:type="notation:ShapeStyle" xmi:id="_VTdkIQETEeiXS5l_BRhbwg"/>
+        <layoutConstraint xsi:type="notation:Location" xmi:id="_VTdkIgETEeiXS5l_BRhbwg" y="10"/>
+      </children>
+      <styles xsi:type="notation:ConnectorStyle" xmi:id="_VTcWAQETEeiXS5l_BRhbwg" routing="Rectilinear" lineColor="4210752"/>
+      <styles xsi:type="notation:FontStyle" xmi:id="_VTc9EAETEeiXS5l_BRhbwg" fontName="Verdana"/>
+      <bendpoints xsi:type="notation:RelativeBendpoints" xmi:id="_VTcWAgETEeiXS5l_BRhbwg" points="[0, 0, 0, 0]$[0, 0, 0, 0]"/>
+    </edges>
+    <edges xmi:id="_XwWdUAETEeiXS5l_BRhbwg" type="Transition" element="_XwTaAAETEeiXS5l_BRhbwg" source="_gORr7gETEeiXS5l_BRhbwg" target="_Wj0YwAETEeiXS5l_BRhbwg">
+      <children xsi:type="notation:DecorationNode" xmi:id="_XwXEYQETEeiXS5l_BRhbwg" type="TransitionExpression">
+        <styles xsi:type="notation:ShapeStyle" xmi:id="_XwXEYgETEeiXS5l_BRhbwg"/>
+        <layoutConstraint xsi:type="notation:Location" xmi:id="_XwXrcAETEeiXS5l_BRhbwg" x="-3" y="19"/>
+      </children>
+      <styles xsi:type="notation:ConnectorStyle" xmi:id="_XwWdUQETEeiXS5l_BRhbwg" routing="Rectilinear" lineColor="4210752"/>
+      <styles xsi:type="notation:FontStyle" xmi:id="_XwXEYAETEeiXS5l_BRhbwg" fontName="Verdana"/>
+      <bendpoints xsi:type="notation:RelativeBendpoints" xmi:id="_XwWdUgETEeiXS5l_BRhbwg" points="[15, 24, -71, -117]$[86, 141, 0, 0]"/>
+      <sourceAnchor xsi:type="notation:IdentityAnchor" xmi:id="_iHyLMAETEeiXS5l_BRhbwg" id="(0.6101694915254238,0.7735849056603774)"/>
+      <targetAnchor xsi:type="notation:IdentityAnchor" xmi:id="_Xwb84AETEeiXS5l_BRhbwg" id="(0.5294117647058824,0.0)"/>
+    </edges>
+    <edges xmi:id="_gOUvMAETEeiXS5l_BRhbwg" type="Transition" element="_gOThEgETEeiXS5l_BRhbwg" source="_gORr5QETEeiXS5l_BRhbwg" target="_gORr7gETEeiXS5l_BRhbwg">
+      <children xsi:type="notation:DecorationNode" xmi:id="_gOUvMQETEeiXS5l_BRhbwg" type="TransitionExpression">
+        <styles xsi:type="notation:ShapeStyle" xmi:id="_gOUvMgETEeiXS5l_BRhbwg"/>
+        <layoutConstraint xsi:type="notation:Location" xmi:id="_gOUvMwETEeiXS5l_BRhbwg" y="10"/>
+      </children>
+      <styles xsi:type="notation:ConnectorStyle" xmi:id="_gOUvNAETEeiXS5l_BRhbwg" routing="Rectilinear" lineColor="4210752"/>
+      <styles xsi:type="notation:FontStyle" xmi:id="_gOUvNQETEeiXS5l_BRhbwg" fontName="Verdana"/>
+      <bendpoints xsi:type="notation:RelativeBendpoints" xmi:id="_gOUvNgETEeiXS5l_BRhbwg" points="[7, 2, -94, -35]$[103, 30, 2, -7]"/>
+      <targetAnchor xsi:type="notation:IdentityAnchor" xmi:id="_gOUvNwETEeiXS5l_BRhbwg" id="(0.32,0.1509433962264151)"/>
+    </edges>
+    <edges xmi:id="_hL4jogETEeiXS5l_BRhbwg" type="Transition" element="_hL38kAETEeiXS5l_BRhbwg" source="_hL2udQETEeiXS5l_BRhbwg" target="_hL2ufgETEeiXS5l_BRhbwg">
+      <children xsi:type="notation:DecorationNode" xmi:id="_hL4jowETEeiXS5l_BRhbwg" type="TransitionExpression">
+        <styles xsi:type="notation:ShapeStyle" xmi:id="_hL4jpAETEeiXS5l_BRhbwg"/>
+        <layoutConstraint xsi:type="notation:Location" xmi:id="_hL4jpQETEeiXS5l_BRhbwg" y="10"/>
+      </children>
+      <styles xsi:type="notation:ConnectorStyle" xmi:id="_hL4jpgETEeiXS5l_BRhbwg" routing="Rectilinear" lineColor="4210752"/>
+      <styles xsi:type="notation:FontStyle" xmi:id="_hL4jpwETEeiXS5l_BRhbwg" fontName="Verdana"/>
+      <bendpoints xsi:type="notation:RelativeBendpoints" xmi:id="_hL4jqAETEeiXS5l_BRhbwg" points="[7, 2, -94, -35]$[103, 30, 2, -7]"/>
+      <targetAnchor xsi:type="notation:IdentityAnchor" xmi:id="_hL4jqQETEeiXS5l_BRhbwg" id="(0.32,0.1509433962264151)"/>
+    </edges>
+    <edges xmi:id="_il4ccAETEeiXS5l_BRhbwg" type="Transition" element="_il3OUAETEeiXS5l_BRhbwg" source="_hL2ufgETEeiXS5l_BRhbwg" target="_Wj0YwAETEeiXS5l_BRhbwg">
+      <children xsi:type="notation:DecorationNode" xmi:id="_il4cdAETEeiXS5l_BRhbwg" type="TransitionExpression">
+        <styles xsi:type="notation:ShapeStyle" xmi:id="_il4cdQETEeiXS5l_BRhbwg"/>
+        <layoutConstraint xsi:type="notation:Location" xmi:id="_il5DgAETEeiXS5l_BRhbwg" y="10"/>
+      </children>
+      <styles xsi:type="notation:ConnectorStyle" xmi:id="_il4ccQETEeiXS5l_BRhbwg" routing="Rectilinear" lineColor="4210752"/>
+      <styles xsi:type="notation:FontStyle" xmi:id="_il4ccwETEeiXS5l_BRhbwg" fontName="Verdana"/>
+      <bendpoints xsi:type="notation:RelativeBendpoints" xmi:id="_il4ccgETEeiXS5l_BRhbwg" points="[-4, 24, 14, -89]$[-5, 111, 13, -2]"/>
+      <targetAnchor xsi:type="notation:IdentityAnchor" xmi:id="_il6RoAETEeiXS5l_BRhbwg" id="(0.8088235294117647,0.25)"/>
+    </edges>
+  </notation:Diagram>
+</xmi:XMI>