Преглед на файлове

Issue 2068 exitpoints (#2069)

* Add validation test for non-existing default exit transition

* Fix detecting default exit transition

* Change & unify error message for missing exit transitions

* Improve documentation for exit point transitions

This fixes #2068

* Forgot to commit image
Rene Beckmann преди 7 години
родител
ревизия
b34100aec8

BIN
plugins/org.yakindu.sct.doc.user/src/user-guide/images/exit_point_transitions.png


Файловите разлики са ограничени, защото са твърде много
+ 6 - 1
plugins/org.yakindu.sct.doc.user/src/user-guide/statechart_language.textile


+ 3 - 3
plugins/org.yakindu.sct.model.stext/src/org/yakindu/sct/model/stext/validation/STextJavaValidator.java

@@ -405,8 +405,8 @@ public class STextJavaValidator extends AbstractSTextJavaValidator implements ST
 				Iterator<Transition> transitionIt = state.getOutgoingTransitions().iterator();
 				while (transitionIt.hasNext() && !hasOutgoingTransition) {
 					Transition transition = transitionIt.next();
-					hasOutgoingTransition = STextValidationModelUtils.isDefaultExitTransition(transition) ? true
-							: STextValidationModelUtils.isNamedExitTransition(transition, exit.getName());
+					hasOutgoingTransition = STextValidationModelUtils.isDefaultExitTransition(transition)
+							|| STextValidationModelUtils.isNamedExitTransition(transition, exit.getName());
 				}
 				if (!hasOutgoingTransition) {
 					error(EXIT_UNUSED, exit, null, -1);
@@ -418,7 +418,7 @@ public class STextJavaValidator extends AbstractSTextJavaValidator implements ST
 					hasOutgoingTransition = STextValidationModelUtils.isDefaultExitTransition(transitionIt.next());
 				}
 				if (!hasOutgoingTransition) {
-					error(EXIT_DEFAULT_UNUSED, exit, null, -1);
+					error(EXIT_UNUSED, exit, null, -1);
 				}
 			}
 		}

+ 1 - 2
plugins/org.yakindu.sct.model.stext/src/org/yakindu/sct/model/stext/validation/STextValidationMessages.java

@@ -41,8 +41,7 @@ public interface STextValidationMessages {
 	public static final String REGION_UNBOUND_DEFAULT_ENTRY_POINT = "Region must have a 'default' entry.";
 	public static final String REGION_UNBOUND_NAMED_ENTRY_POINT = "Region should have a named entry to support transitions entry specification: ";
 	public static final String ENTRY_UNUSED = "The named entry is not used by incoming transitions.";
-	public static final String EXIT_UNUSED = "The named exit is not used by outgoing transitions.";
-	public static final String EXIT_DEFAULT_UNUSED = "The parent composite state has no 'default' exit transition.";
+	public static final String EXIT_UNUSED = "This exit is not connected to any outgoing transitions.";
 	public static final String TRANSITION_EXIT_SPEC_ON_MULTIPLE_SIBLINGS = "ExitPointSpec can't be used on transition siblings.";
 	public static final String ISSUE_TRANSITION_WITHOUT_TRIGGER = "Missing trigger. Transition is never taken. Use 'oncycle' or 'always' instead.";
 	public static final String EXITPOINTSPEC_WITH_TRIGGER = "Transitions with an exit point spec does not have a trigger or guard.";

+ 42 - 47
plugins/org.yakindu.sct.model.stext/src/org/yakindu/sct/model/stext/validation/STextValidationModelUtils.java

@@ -4,10 +4,10 @@
  * are made available under the terms of the Eclipse Public License v1.0
  * which accompanies this distribution, and is available at
  * http://www.eclipse.org/legal/epl-v10.html
- * 
+ *
  * Contributors:
  * 	itemis AG - initial API and implementation
- * 
+ *
  */
 package org.yakindu.sct.model.stext.validation;
 
@@ -35,22 +35,21 @@ public final class STextValidationModelUtils {
 	/**
 	 * Sorts the given elements in transition without and with
 	 * {@link EntryPointSpec}s
-	 * 
+	 *
 	 * @param elements
 	 *            list of transitions to sort
-	 * @return an array with the sorted elements. The first index contains a
-	 *         list of the transitions without {@link EntryPointSpec}s. The
-	 *         second index contains a list of the transitions with
-	 *         {@link EntryPointSpec}s.
+	 * @return an array with the sorted elements. The first index contains a list of
+	 *         the transitions without {@link EntryPointSpec}s. The second index
+	 *         contains a list of the transitions with {@link EntryPointSpec}s.
 	 */
 	public static List<Transition>[] getEntrySpecSortedTransitions(
 			List<Transition> elements) {
 		@SuppressWarnings("unchecked")
 		final List<Transition>[] transitions = new ArrayList[2];
 		// first list contains Transitions without entry spec
-		transitions[0] = new ArrayList<Transition>();
+		transitions[0] = new ArrayList<>();
 		// second list contains Transitions with entry spec
-		transitions[1] = new ArrayList<Transition>();
+		transitions[1] = new ArrayList<>();
 		for (Transition transition : elements) {
 			boolean hasEntrySpec = false;
 			for (ReactionProperty property : transition.getProperties()) {
@@ -70,22 +69,21 @@ public final class STextValidationModelUtils {
 	/**
 	 * Sorts the given elements in transition without and with
 	 * {@link ExitPointSpec}s
-	 * 
+	 *
 	 * @param elements
 	 *            - list of transitions to sort
-	 * @return an array with the sorted elements. The first index contains a
-	 *         list of the transitions without {@link ExitPointSpec}s. The
-	 *         second index contains a list of the transitions with
-	 *         {@link ExitPointSpec}s.
+	 * @return an array with the sorted elements. The first index contains a list of
+	 *         the transitions without {@link ExitPointSpec}s. The second index
+	 *         contains a list of the transitions with {@link ExitPointSpec}s.
 	 */
 	public static List<Transition>[] getExitSpecSortedTransitions(
 			List<Transition> elements) {
 		@SuppressWarnings("unchecked")
 		final List<Transition>[] transitions = new ArrayList[2];
 		// first list contains Transitions without exit spec
-		transitions[0] = new ArrayList<Transition>();
+		transitions[0] = new ArrayList<>();
 		// second list contains Transitions with exit spec
-		transitions[1] = new ArrayList<Transition>();
+		transitions[1] = new ArrayList<>();
 		for (Transition transition : elements) {
 			boolean hasExitSpec = false;
 			for (ReactionProperty property : transition.getProperties()) {
@@ -103,18 +101,17 @@ public final class STextValidationModelUtils {
 	}
 
 	/**
-	 * If a {@link Region} contains no 'default' named {@link entry} it is added
-	 * as key to a map with a list of all entries of the region.
-	 * 
+	 * If a {@link Region} contains no 'default' named {@link entry} it is added as
+	 * key to a map with a list of all entries of the region.
+	 *
 	 * @param elements
 	 *            - a list with {@link Region} elements.
-	 * @return a map with a region (key) which contains no default {@link entry}
-	 *         and a list of all {@link entry} elements of the {@link Region}
-	 *         (value).
+	 * @return a map with a region (key) which contains no default {@link entry} and
+	 *         a list of all {@link entry} elements of the {@link Region} (value).
 	 */
 	public static Map<Region, List<Entry>> getRegionsWithoutDefaultEntry(
 			List<Region> elements) {
-		Map<Region, List<Entry>> regions = new HashMap<Region, List<Entry>>();
+		Map<Region, List<Entry>> regions = new HashMap<>();
 		for (Region region : elements) {
 			boolean hasDefaultEntry = false;
 			final List<Entry> entries = getEntries(region.eContents());
@@ -132,18 +129,17 @@ public final class STextValidationModelUtils {
 	}
 
 	/**
-	 * If a {@link Region} contains no 'default' named {@link exit} it is added
-	 * as key to a map with a list of all exits of the region.
-	 * 
+	 * If a {@link Region} contains no 'default' named {@link exit} it is added as
+	 * key to a map with a list of all exits of the region.
+	 *
 	 * @param elements
 	 *            - a list with {@link Region} elements.
-	 * @return a map with a region (key) which contains no default {@link exit}
-	 *         and a list of all {@link exit} elements of the {@link Region}
-	 *         (value).
+	 * @return a map with a region (key) which contains no default {@link exit} and
+	 *         a list of all {@link exit} elements of the {@link Region} (value).
 	 */
 	public static Map<Region, List<Exit>> getRegionsWithoutDefaultExit(
 			List<Region> elements) {
-		Map<Region, List<Exit>> regions = new HashMap<Region, List<Exit>>();
+		Map<Region, List<Exit>> regions = new HashMap<>();
 		for (Region region : elements) {
 			boolean hasDefaultExit = false;
 			final List<Exit> exits = getExits(region.eContents());
@@ -168,11 +164,11 @@ public final class STextValidationModelUtils {
 	/**
 	 * Checks if the name of the given element matches the requirements to be a
 	 * 'default' element.
-	 * 
+	 *
 	 * @param element
 	 *            - the {@link NamedElement}
-	 * @return {@code true} if the name is null, empty or equals 'default'
-	 *         (ignoring case).
+	 * @return {@code true} if the name is null, empty or equals 'default' (ignoring
+	 *         case).
 	 */
 	public static boolean isDefault(final NamedElement element) {
 		return element.getName() == null
@@ -181,9 +177,9 @@ public final class STextValidationModelUtils {
 	}
 
 	/**
-	 * Validates if the a {@link Transition} has an {@link ExitPointSpec} with
-	 * the given name.
-	 * 
+	 * Validates if the a {@link Transition} has an {@link ExitPointSpec} with the
+	 * given name.
+	 *
 	 * @param transition
 	 *            - the transition to check
 	 * @param name
@@ -224,24 +220,23 @@ public final class STextValidationModelUtils {
 				}
 			}
 		} else {
-			isDefault = true;
+			isDefault = transition.getTrigger() == null;
 		}
 
 		return isDefault;
 	}
 
 	/**
-	 * Filters the given list of {@link ReactionProperty} to return only a list
-	 * of {@link ExitPointSpec}.
-	 * 
+	 * Filters the given list of {@link ReactionProperty} to return only a list of
+	 * {@link ExitPointSpec}.
+	 *
 	 * @param elements
-	 * 			- list of ReactionProperties
-	 * @return
-	 * 		A list of ExitPointSpecs.
+	 *            - list of ReactionProperties
+	 * @return A list of ExitPointSpecs.
 	 */
 	public static List<ExitPointSpec> getExitPointSpecs(
 			List<ReactionProperty> elements) {
-		List<ExitPointSpec> exits = new ArrayList<ExitPointSpec>();
+		List<ExitPointSpec> exits = new ArrayList<>();
 		for (ReactionProperty element : elements) {
 			if (element instanceof ExitPointSpec) {
 				exits.add((ExitPointSpec) element);
@@ -251,17 +246,17 @@ public final class STextValidationModelUtils {
 	}
 
 	public static List<Entry> getEntries(List<?> elements) {
-		List<Entry> entries = new ArrayList<Entry>();
+		List<Entry> entries = new ArrayList<>();
 		for (Object element : elements) {
 			if (element instanceof Entry) {
-				entries.add((Entry) element); 
+				entries.add((Entry) element);
 			}
 		}
 		return entries;
 	}
 
 	public static List<Exit> getExits(List<EObject> elements) {
-		List<Exit> exits = new ArrayList<Exit>();
+		List<Exit> exits = new ArrayList<>();
 		for (EObject element : elements) {
 			if (element instanceof Exit) {
 				exits.add((Exit) element);

+ 10 - 1
test-plugins/org.yakindu.sct.model.stext.test/src/org/yakindu/sct/model/stext/test/validation/STextJavaValidatorTest.java

@@ -705,7 +705,7 @@ public class STextJavaValidatorTest extends AbstractSTextValidationTest implemen
 		doValidateAllContents(Exit.class);
 
 		assertIssueCount(diagnostics, 1);
-		assertError(diagnostics, EXIT_DEFAULT_UNUSED);
+		assertError(diagnostics, EXIT_UNUSED);
 	}
 
 	@Test
@@ -803,6 +803,15 @@ public class STextJavaValidatorTest extends AbstractSTextValidationTest implemen
 		assertError(diagnostics, EXITPOINTSPEC_WITH_TRIGGER);
 	}
 
+	@Test
+	public void checkExitTransitionExists() {
+		statechart = AbstractTestModelsUtil.loadStatechart(VALIDATION_TESTMODEL_DIR + "NoExitTransition.sct");
+
+		Diagnostic diagnostics = Diagnostician.INSTANCE.validate(statechart);
+		assertIssueCount(diagnostics, 1);
+		assertError(diagnostics, EXIT_UNUSED);
+	}
+
 	@Test
 	public void checkAssignmentToFinalVariable() {
 		Statechart statechart = AbstractTestModelsUtil

+ 184 - 0
test-plugins/org.yakindu.sct.test.models/testmodels/validation/NoExitTransition.sct

@@ -0,0 +1,184 @@
+<?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="_y5zQgFjvEeicW6NqCSWe_g" specification="@CycleBased(200)&#xA;&#xA;interface:&#xA;in event e1&#xA;in event e2" name="NoExitTransition">
+    <regions xmi:id="_y52T0FjvEeicW6NqCSWe_g" name="main region">
+      <vertices xsi:type="sgraph:Entry" xmi:id="_y57zYFjvEeicW6NqCSWe_g">
+        <outgoingTransitions xmi:id="_y5-Po1jvEeicW6NqCSWe_g" target="_y58ad1jvEeicW6NqCSWe_g"/>
+      </vertices>
+      <vertices xsi:type="sgraph:State" xmi:id="_y58ad1jvEeicW6NqCSWe_g" name="StateA" incomingTransitions="_y5-Po1jvEeicW6NqCSWe_g">
+        <outgoingTransitions xmi:id="_DkiLolj0EeicW6NqCSWe_g" specification="e2" target="_DkhkkFj0EeicW6NqCSWe_g"/>
+        <regions xmi:id="__AmGYFjzEeicW6NqCSWe_g" name="">
+          <vertices xsi:type="sgraph:Entry" xmi:id="__AmGYVjzEeicW6NqCSWe_g">
+            <outgoingTransitions xmi:id="__AmGYljzEeicW6NqCSWe_g" specification="" target="__An7kFjzEeicW6NqCSWe_g"/>
+          </vertices>
+          <vertices xsi:type="sgraph:State" xmi:id="__An7kFjzEeicW6NqCSWe_g" specification="" name="State1" incomingTransitions="__AmGYljzEeicW6NqCSWe_g">
+            <outgoingTransitions xmi:id="_BfTkgFj0EeicW6NqCSWe_g" specification="e1" target="_AcVroFj0EeicW6NqCSWe_g"/>
+          </vertices>
+          <vertices xsi:type="sgraph:Exit" xmi:id="_AcVroFj0EeicW6NqCSWe_g" incomingTransitions="_BfTkgFj0EeicW6NqCSWe_g"/>
+        </regions>
+      </vertices>
+      <vertices xsi:type="sgraph:State" xmi:id="_DkhkkFj0EeicW6NqCSWe_g" name="end" incomingTransitions="_DkiLolj0EeicW6NqCSWe_g"/>
+    </regions>
+  </sgraph:Statechart>
+  <notation:Diagram xmi:id="_y51swFjvEeicW6NqCSWe_g" type="org.yakindu.sct.ui.editor.editor.StatechartDiagramEditor" element="_y5zQgFjvEeicW6NqCSWe_g" measurementUnit="Pixel">
+    <children xmi:id="_y54wEFjvEeicW6NqCSWe_g" type="Region" element="_y52T0FjvEeicW6NqCSWe_g">
+      <children xsi:type="notation:DecorationNode" xmi:id="_y56lQFjvEeicW6NqCSWe_g" type="RegionName">
+        <styles xsi:type="notation:ShapeStyle" xmi:id="_y56lQVjvEeicW6NqCSWe_g"/>
+        <layoutConstraint xsi:type="notation:Location" xmi:id="_y56lQljvEeicW6NqCSWe_g"/>
+      </children>
+      <children xsi:type="notation:Shape" xmi:id="_y57MUFjvEeicW6NqCSWe_g" type="RegionCompartment" fontName="Verdana" lineColor="4210752">
+        <children xmi:id="_y57zYVjvEeicW6NqCSWe_g" type="Entry" element="_y57zYFjvEeicW6NqCSWe_g">
+          <children xmi:id="_y58acFjvEeicW6NqCSWe_g" type="BorderItemLabelContainer">
+            <children xsi:type="notation:DecorationNode" xmi:id="_y58ac1jvEeicW6NqCSWe_g" type="BorderItemLabel">
+              <styles xsi:type="notation:ShapeStyle" xmi:id="_y58adFjvEeicW6NqCSWe_g"/>
+              <layoutConstraint xsi:type="notation:Location" xmi:id="_y58adVjvEeicW6NqCSWe_g"/>
+            </children>
+            <styles xsi:type="notation:ShapeStyle" xmi:id="_y58acVjvEeicW6NqCSWe_g" fontName="Verdana" lineColor="4210752"/>
+            <layoutConstraint xsi:type="notation:Bounds" xmi:id="_y58acljvEeicW6NqCSWe_g"/>
+          </children>
+          <styles xsi:type="notation:ShapeStyle" xmi:id="_y57zYljvEeicW6NqCSWe_g" fontName="Verdana" fillColor="0" lineColor="16777215"/>
+          <styles xsi:type="notation:NamedStyle" xmi:id="_y57zY1jvEeicW6NqCSWe_g" name="allowColors"/>
+          <layoutConstraint xsi:type="notation:Bounds" xmi:id="_y58adljvEeicW6NqCSWe_g" x="70" y="20" width="15" height="15"/>
+        </children>
+        <children xmi:id="_y59BgljvEeicW6NqCSWe_g" type="State" element="_y58ad1jvEeicW6NqCSWe_g">
+          <children xsi:type="notation:DecorationNode" xmi:id="_y59okFjvEeicW6NqCSWe_g" type="StateName">
+            <styles xsi:type="notation:ShapeStyle" xmi:id="_y59okVjvEeicW6NqCSWe_g"/>
+            <layoutConstraint xsi:type="notation:Location" xmi:id="_y59okljvEeicW6NqCSWe_g"/>
+          </children>
+          <children xsi:type="notation:Compartment" xmi:id="_y59ok1jvEeicW6NqCSWe_g" type="StateTextCompartment">
+            <children xsi:type="notation:Shape" xmi:id="_y59olFjvEeicW6NqCSWe_g" type="StateTextCompartmentExpression" fontName="Verdana" lineColor="4210752">
+              <layoutConstraint xsi:type="notation:Bounds" xmi:id="_y59olVjvEeicW6NqCSWe_g"/>
+            </children>
+          </children>
+          <children xsi:type="notation:Compartment" xmi:id="_y5-PoFjvEeicW6NqCSWe_g" type="StateFigureCompartment">
+            <children xmi:id="__AjqIFjzEeicW6NqCSWe_g" type="Region" element="__AmGYFjzEeicW6NqCSWe_g">
+              <children xsi:type="notation:DecorationNode" xmi:id="__AjqIVjzEeicW6NqCSWe_g" type="RegionName">
+                <styles xsi:type="notation:ShapeStyle" xmi:id="__AjqIljzEeicW6NqCSWe_g"/>
+                <layoutConstraint xsi:type="notation:Location" xmi:id="__AjqI1jzEeicW6NqCSWe_g"/>
+              </children>
+              <children xsi:type="notation:Shape" xmi:id="__AjqJFjzEeicW6NqCSWe_g" type="RegionCompartment" fontName="Verdana" lineColor="4210752">
+                <children xmi:id="__AjqJVjzEeicW6NqCSWe_g" type="Entry" element="__AmGYVjzEeicW6NqCSWe_g">
+                  <children xmi:id="__AjqJljzEeicW6NqCSWe_g" type="BorderItemLabelContainer">
+                    <children xsi:type="notation:DecorationNode" xmi:id="__AjqJ1jzEeicW6NqCSWe_g" type="BorderItemLabel">
+                      <styles xsi:type="notation:ShapeStyle" xmi:id="__AjqKFjzEeicW6NqCSWe_g"/>
+                      <layoutConstraint xsi:type="notation:Location" xmi:id="__AjqKVjzEeicW6NqCSWe_g"/>
+                    </children>
+                    <styles xsi:type="notation:ShapeStyle" xmi:id="__AjqKljzEeicW6NqCSWe_g" fontName="Verdana" lineColor="4210752"/>
+                    <layoutConstraint xsi:type="notation:Bounds" xmi:id="__AjqK1jzEeicW6NqCSWe_g"/>
+                  </children>
+                  <styles xsi:type="notation:ShapeStyle" xmi:id="__AjqLFjzEeicW6NqCSWe_g" fontName="Verdana" lineColor="4210752"/>
+                  <layoutConstraint xsi:type="notation:Bounds" xmi:id="__AjqLVjzEeicW6NqCSWe_g" x="39" y="12"/>
+                </children>
+                <children xmi:id="__AjqLljzEeicW6NqCSWe_g" type="State" element="__An7kFjzEeicW6NqCSWe_g">
+                  <children xsi:type="notation:DecorationNode" xmi:id="__AjqL1jzEeicW6NqCSWe_g" type="StateName">
+                    <styles xsi:type="notation:ShapeStyle" xmi:id="__AjqMFjzEeicW6NqCSWe_g"/>
+                    <layoutConstraint xsi:type="notation:Location" xmi:id="__AjqMVjzEeicW6NqCSWe_g"/>
+                  </children>
+                  <children xsi:type="notation:Compartment" xmi:id="__AjqMljzEeicW6NqCSWe_g" type="StateTextCompartment">
+                    <children xsi:type="notation:Shape" xmi:id="__AjqM1jzEeicW6NqCSWe_g" type="StateTextCompartmentExpression" fontName="Verdana" lineColor="4210752">
+                      <layoutConstraint xsi:type="notation:Bounds" xmi:id="__AjqNFjzEeicW6NqCSWe_g"/>
+                    </children>
+                  </children>
+                  <children xsi:type="notation:Compartment" xmi:id="__AjqNVjzEeicW6NqCSWe_g" type="StateFigureCompartment"/>
+                  <styles xsi:type="notation:ShapeStyle" xmi:id="__AjqNljzEeicW6NqCSWe_g" fontName="Verdana" fillColor="15981773" lineColor="12632256"/>
+                  <styles xsi:type="notation:FontStyle" xmi:id="__AjqN1jzEeicW6NqCSWe_g"/>
+                  <styles xsi:type="notation:BooleanValueStyle" xmi:id="__AjqOFjzEeicW6NqCSWe_g" name="isHorizontal" booleanValue="true"/>
+                  <layoutConstraint xsi:type="notation:Bounds" xmi:id="__AjqOVjzEeicW6NqCSWe_g" x="20" y="47"/>
+                </children>
+                <children xmi:id="_AcW5wFj0EeicW6NqCSWe_g" type="Exit" element="_AcVroFj0EeicW6NqCSWe_g">
+                  <children xmi:id="_AcYH4Fj0EeicW6NqCSWe_g" type="BorderItemLabelContainer">
+                    <children xsi:type="notation:DecorationNode" xmi:id="_AcYH41j0EeicW6NqCSWe_g" type="BorderItemLabel">
+                      <styles xsi:type="notation:ShapeStyle" xmi:id="_AcYH5Fj0EeicW6NqCSWe_g"/>
+                      <layoutConstraint xsi:type="notation:Location" xmi:id="_AcYH5Vj0EeicW6NqCSWe_g"/>
+                    </children>
+                    <styles xsi:type="notation:ShapeStyle" xmi:id="_AcYH4Vj0EeicW6NqCSWe_g" fontName="Verdana" lineColor="4210752"/>
+                    <layoutConstraint xsi:type="notation:Bounds" xmi:id="_AcYH4lj0EeicW6NqCSWe_g"/>
+                  </children>
+                  <styles xsi:type="notation:ShapeStyle" xmi:id="_AcW5wVj0EeicW6NqCSWe_g" fontName="Verdana" lineColor="4210752"/>
+                  <layoutConstraint xsi:type="notation:Bounds" xmi:id="_AcW5wlj0EeicW6NqCSWe_g" x="177" y="79"/>
+                </children>
+                <layoutConstraint xsi:type="notation:Bounds" xmi:id="__AjqOljzEeicW6NqCSWe_g"/>
+              </children>
+              <styles xsi:type="notation:ShapeStyle" xmi:id="__AjqO1jzEeicW6NqCSWe_g" fontName="Verdana" fillColor="15790320" lineColor="12632256"/>
+              <layoutConstraint xsi:type="notation:Bounds" xmi:id="__AjqPFjzEeicW6NqCSWe_g" x="90" y="10"/>
+            </children>
+          </children>
+          <styles xsi:type="notation:ShapeStyle" xmi:id="_y59Bg1jvEeicW6NqCSWe_g" fontName="Verdana" fillColor="15981773" lineColor="12632256"/>
+          <styles xsi:type="notation:FontStyle" xmi:id="_y59BhFjvEeicW6NqCSWe_g"/>
+          <styles xsi:type="notation:BooleanValueStyle" xmi:id="_y5-PoVjvEeicW6NqCSWe_g" name="isHorizontal" booleanValue="true"/>
+          <layoutConstraint xsi:type="notation:Bounds" xmi:id="_y5-PoljvEeicW6NqCSWe_g" x="40" y="80" width="296" height="226"/>
+        </children>
+        <children xmi:id="_DkpgYFj0EeicW6NqCSWe_g" type="State" element="_DkhkkFj0EeicW6NqCSWe_g">
+          <children xsi:type="notation:DecorationNode" xmi:id="_DkqHcFj0EeicW6NqCSWe_g" type="StateName">
+            <styles xsi:type="notation:ShapeStyle" xmi:id="_DkqHcVj0EeicW6NqCSWe_g"/>
+            <layoutConstraint xsi:type="notation:Location" xmi:id="_DkqHclj0EeicW6NqCSWe_g"/>
+          </children>
+          <children xsi:type="notation:Compartment" xmi:id="_DkqHc1j0EeicW6NqCSWe_g" type="StateTextCompartment">
+            <children xsi:type="notation:Shape" xmi:id="_DkqHdFj0EeicW6NqCSWe_g" type="StateTextCompartmentExpression" fontName="Verdana" lineColor="4210752">
+              <layoutConstraint xsi:type="notation:Bounds" xmi:id="_DkqHdVj0EeicW6NqCSWe_g"/>
+            </children>
+          </children>
+          <children xsi:type="notation:Compartment" xmi:id="_DkqHdlj0EeicW6NqCSWe_g" type="StateFigureCompartment"/>
+          <styles xsi:type="notation:ShapeStyle" xmi:id="_DkpgYVj0EeicW6NqCSWe_g" fontName="Verdana" fillColor="15981773" lineColor="12632256"/>
+          <styles xsi:type="notation:FontStyle" xmi:id="_DkpgYlj0EeicW6NqCSWe_g"/>
+          <styles xsi:type="notation:BooleanValueStyle" xmi:id="_DkqHd1j0EeicW6NqCSWe_g" name="isHorizontal" booleanValue="true"/>
+          <layoutConstraint xsi:type="notation:Bounds" xmi:id="_DkpgY1j0EeicW6NqCSWe_g" x="150" y="353" width="44" height="53"/>
+        </children>
+        <layoutConstraint xsi:type="notation:Bounds" xmi:id="_y57MUVjvEeicW6NqCSWe_g"/>
+      </children>
+      <styles xsi:type="notation:ShapeStyle" xmi:id="_y54wEVjvEeicW6NqCSWe_g" fontName="Verdana" fillColor="15790320" lineColor="12632256"/>
+      <layoutConstraint xsi:type="notation:Bounds" xmi:id="_y57MUljvEeicW6NqCSWe_g" x="220" y="10" width="464" height="448"/>
+    </children>
+    <children xsi:type="notation:Shape" xmi:id="_y6Ar4FjvEeicW6NqCSWe_g" type="StatechartText" fontName="Verdana" lineColor="4210752">
+      <children xsi:type="notation:DecorationNode" xmi:id="_y6Ar4ljvEeicW6NqCSWe_g" type="StatechartName">
+        <styles xsi:type="notation:ShapeStyle" xmi:id="_y6Ar41jvEeicW6NqCSWe_g"/>
+        <layoutConstraint xsi:type="notation:Location" xmi:id="_y6Ar5FjvEeicW6NqCSWe_g"/>
+      </children>
+      <children xsi:type="notation:Shape" xmi:id="_y6Ar5VjvEeicW6NqCSWe_g" type="StatechartTextExpression" fontName="Verdana" lineColor="4210752">
+        <layoutConstraint xsi:type="notation:Bounds" xmi:id="_y6Ar5ljvEeicW6NqCSWe_g"/>
+      </children>
+      <layoutConstraint xsi:type="notation:Bounds" xmi:id="_y6BS8FjvEeicW6NqCSWe_g" x="10" y="10" width="200" height="400"/>
+    </children>
+    <styles xsi:type="notation:BooleanValueStyle" xmi:id="_y51swVjvEeicW6NqCSWe_g" name="inlineDefinitionSection"/>
+    <styles xsi:type="notation:DiagramStyle" xmi:id="_y51swljvEeicW6NqCSWe_g"/>
+    <edges xmi:id="_y5_dwFjvEeicW6NqCSWe_g" type="Transition" element="_y5-Po1jvEeicW6NqCSWe_g" source="_y57zYVjvEeicW6NqCSWe_g" target="_y59BgljvEeicW6NqCSWe_g">
+      <children xsi:type="notation:DecorationNode" xmi:id="_y6AE0VjvEeicW6NqCSWe_g" type="TransitionExpression">
+        <styles xsi:type="notation:ShapeStyle" xmi:id="_y6AE0ljvEeicW6NqCSWe_g"/>
+        <layoutConstraint xsi:type="notation:Location" xmi:id="_y6AE01jvEeicW6NqCSWe_g" y="10"/>
+      </children>
+      <styles xsi:type="notation:ConnectorStyle" xmi:id="_y5_dwVjvEeicW6NqCSWe_g" routing="Rectilinear" lineColor="4210752"/>
+      <styles xsi:type="notation:FontStyle" xmi:id="_y6AE0FjvEeicW6NqCSWe_g" fontName="Verdana"/>
+      <bendpoints xsi:type="notation:RelativeBendpoints" xmi:id="_y5_dwljvEeicW6NqCSWe_g" points="[0, 0, 0, 0]$[0, 0, 0, 0]"/>
+    </edges>
+    <edges xmi:id="__AqX0FjzEeicW6NqCSWe_g" type="Transition" element="__AmGYljzEeicW6NqCSWe_g" source="__AjqJVjzEeicW6NqCSWe_g" target="__AjqLljzEeicW6NqCSWe_g">
+      <children xsi:type="notation:DecorationNode" xmi:id="__AqX0VjzEeicW6NqCSWe_g" type="TransitionExpression">
+        <styles xsi:type="notation:ShapeStyle" xmi:id="__AqX0ljzEeicW6NqCSWe_g"/>
+        <layoutConstraint xsi:type="notation:Location" xmi:id="__AqX01jzEeicW6NqCSWe_g" y="10"/>
+      </children>
+      <styles xsi:type="notation:ConnectorStyle" xmi:id="__AqX1FjzEeicW6NqCSWe_g" routing="Rectilinear" lineColor="4210752"/>
+      <styles xsi:type="notation:FontStyle" xmi:id="__AqX1VjzEeicW6NqCSWe_g" fontName="Verdana"/>
+      <bendpoints xsi:type="notation:RelativeBendpoints" xmi:id="__AqX1ljzEeicW6NqCSWe_g" points="[7, 2, -94, -35]$[103, 30, 2, -7]"/>
+      <targetAnchor xsi:type="notation:IdentityAnchor" xmi:id="__AqX11jzEeicW6NqCSWe_g" id="(0.32,0.1509433962264151)"/>
+    </edges>
+    <edges xmi:id="_BfWAwFj0EeicW6NqCSWe_g" type="Transition" element="_BfTkgFj0EeicW6NqCSWe_g" source="__AjqLljzEeicW6NqCSWe_g" target="_AcW5wFj0EeicW6NqCSWe_g">
+      <children xsi:type="notation:DecorationNode" xmi:id="_BfWn0Fj0EeicW6NqCSWe_g" type="TransitionExpression">
+        <styles xsi:type="notation:ShapeStyle" xmi:id="_BfWn0Vj0EeicW6NqCSWe_g"/>
+        <layoutConstraint xsi:type="notation:Location" xmi:id="_BfWn0lj0EeicW6NqCSWe_g" y="10"/>
+      </children>
+      <styles xsi:type="notation:ConnectorStyle" xmi:id="_BfWAwVj0EeicW6NqCSWe_g" routing="Rectilinear" lineColor="4210752"/>
+      <styles xsi:type="notation:FontStyle" xmi:id="_BfWAw1j0EeicW6NqCSWe_g" fontName="Verdana"/>
+      <bendpoints xsi:type="notation:RelativeBendpoints" xmi:id="_BfWAwlj0EeicW6NqCSWe_g" points="[40, 13, -82, -26]$[127, 44, 5, 5]"/>
+      <sourceAnchor xsi:type="notation:IdentityAnchor" xmi:id="_BfaSMFj0EeicW6NqCSWe_g" id="(0.5172413793103449,0.0)"/>
+    </edges>
+    <edges xmi:id="_DkyDQFj0EeicW6NqCSWe_g" type="Transition" element="_DkiLolj0EeicW6NqCSWe_g" source="_y59BgljvEeicW6NqCSWe_g" target="_DkpgYFj0EeicW6NqCSWe_g">
+      <children xsi:type="notation:DecorationNode" xmi:id="_DkyDRFj0EeicW6NqCSWe_g" type="TransitionExpression">
+        <styles xsi:type="notation:ShapeStyle" xmi:id="_DkyDRVj0EeicW6NqCSWe_g"/>
+        <layoutConstraint xsi:type="notation:Location" xmi:id="_DkyqUFj0EeicW6NqCSWe_g" y="10"/>
+      </children>
+      <styles xsi:type="notation:ConnectorStyle" xmi:id="_DkyDQVj0EeicW6NqCSWe_g" routing="Rectilinear" lineColor="4210752"/>
+      <styles xsi:type="notation:FontStyle" xmi:id="_DkyDQ1j0EeicW6NqCSWe_g" fontName="Verdana"/>
+      <bendpoints xsi:type="notation:RelativeBendpoints" xmi:id="_DkyDQlj0EeicW6NqCSWe_g" points="[-105, -104, 83, 83]$[-185, -184, 3, 3]"/>
+      <targetAnchor xsi:type="notation:IdentityAnchor" xmi:id="_D7ujoFj0EeicW6NqCSWe_g" id="(0.5,0.5)"/>
+    </edges>
+  </notation:Diagram>
+</xmi:XMI>