Direct region entry doesn't bypass initial state entry

- Enhance state context to have more info about target
  states which is needed to make a proper decision if
  region needs to be started.
- Fix RegionState to not to start if it looks like
  direct entry will be done later.
- Relates to #221
This commit is contained in:
Janne Valkealahti
2016-05-07 15:52:12 +01:00
parent 12137222a8
commit 2eb8788ce3
8 changed files with 606 additions and 21 deletions

View File

@@ -49,6 +49,25 @@ public class ForkJoinEntryExitTests extends AbstractBuildTests {
plan.test();
}
@Test
@SuppressWarnings("unchecked")
public void testForkEntrysViaChoices() throws Exception {
context.register(Config2.class);
context.refresh();
StateMachine<String, String> stateMachine = context.getBean(StateMachine.class);
StateMachineTestPlan<String, String> plan =
StateMachineTestPlanBuilder.<String, String>builder()
.stateMachine(stateMachine)
.step().expectState("S1").and()
.step()
.sendEvent("E1")
.expectStateEntered(3)
.expectStates("S2", "S210", "S220").and()
.build();
plan.test();
}
@Test
@SuppressWarnings("unchecked")
public void testJoinExits() throws Exception {
@@ -89,6 +108,23 @@ public class ForkJoinEntryExitTests extends AbstractBuildTests {
}
}
@Configuration
@EnableStateMachine
public static class Config2 extends StateMachineConfigurerAdapter<String, String> {
@Override
public void configure(StateMachineModelConfigurer<String, String> model) throws Exception {
model
.withModel()
.factory(modelFactory());
}
@Bean
public StateMachineModelFactory<String, String> modelFactory() {
return new UmlStateMachineModelFactory("classpath:org/springframework/statemachine/buildtests/forkjoin-entryexit2.uml");
}
}
@Override
protected AnnotationConfigApplicationContext buildContext() {
return new AnnotationConfigApplicationContext();

View File

@@ -0,0 +1,2 @@
<?xml version="1.0" encoding="UTF-8"?>
<xmi:XMI xmi:version="2.0" xmlns:xmi="http://www.omg.org/XMI"/>

View File

@@ -0,0 +1,421 @@
<?xml version="1.0" encoding="UTF-8"?>
<notation:Diagram xmi:version="2.0" xmlns:xmi="http://www.omg.org/XMI" xmlns:ecore="http://www.eclipse.org/emf/2002/Ecore" xmlns:notation="http://www.eclipse.org/gmf/runtime/1.0.2/notation" xmlns:style="http://www.eclipse.org/papyrus/infra/viewpoints/policy/style" xmlns:uml="http://www.eclipse.org/uml2/5.0.0/UML" xmi:id="_flEccBNdEeaeH5SlvwGOyg" type="PapyrusUMLStateMachineDiagram" name="StateMachine Diagram" measurementUnit="Pixel">
<children xmi:type="notation:Shape" xmi:id="_flEccRNdEeaeH5SlvwGOyg" type="2000">
<children xmi:type="notation:DecorationNode" xmi:id="_flEcchNdEeaeH5SlvwGOyg" type="2001">
<layoutConstraint xmi:type="notation:Bounds" xmi:id="_flEccxNdEeaeH5SlvwGOyg" width="1068" height="23"/>
</children>
<children xmi:type="notation:DecorationNode" xmi:id="_flEcdBNdEeaeH5SlvwGOyg" type="2002">
<children xmi:type="notation:Shape" xmi:id="_flEcdRNdEeaeH5SlvwGOyg" type="3000">
<eAnnotations xmi:type="ecore:EAnnotation" xmi:id="_flEcdhNdEeaeH5SlvwGOyg" source="RegionAnnotationKey">
<details xmi:type="ecore:EStringToStringMapEntry" xmi:id="_flEcdxNdEeaeH5SlvwGOyg" key="RegionZoneKey" value=""/>
</eAnnotations>
<children xmi:type="notation:DecorationNode" xmi:id="_flEceBNdEeaeH5SlvwGOyg" type="3002">
<children xmi:type="notation:Shape" xmi:id="_pOKdoBNdEeaeH5SlvwGOyg" type="6000">
<children xmi:type="notation:DecorationNode" xmi:id="_pOKdohNdEeaeH5SlvwGOyg" type="6001">
<layoutConstraint xmi:type="notation:Bounds" xmi:id="_Ne658BNeEeaeH5SlvwGOyg" width="55"/>
</children>
<children xmi:type="notation:DecorationNode" xmi:id="_pOKdoxNdEeaeH5SlvwGOyg" type="19003">
<layoutConstraint xmi:type="notation:Location" xmi:id="_pOKdpBNdEeaeH5SlvwGOyg" x="40"/>
</children>
<children xmi:type="notation:DecorationNode" xmi:id="_pOLEsBNdEeaeH5SlvwGOyg" type="6002">
<layoutConstraint xmi:type="notation:Bounds" xmi:id="_pOLEsRNdEeaeH5SlvwGOyg" y="-1" width="55"/>
</children>
<element xmi:type="uml:State" href="forkjoin-entryexit2.uml#_pOB6wBNdEeaeH5SlvwGOyg"/>
<layoutConstraint xmi:type="notation:Bounds" xmi:id="_pOKdoRNdEeaeH5SlvwGOyg" x="93" y="175" width="55"/>
</children>
<children xmi:type="notation:Shape" xmi:id="_qS_-wBNdEeaeH5SlvwGOyg" type="8000">
<children xmi:type="notation:DecorationNode" xmi:id="_qS_-whNdEeaeH5SlvwGOyg" type="8001">
<layoutConstraint xmi:type="notation:Location" xmi:id="_qS_-wxNdEeaeH5SlvwGOyg" x="25" y="3"/>
</children>
<children xmi:type="notation:DecorationNode" xmi:id="_qTAl0BNdEeaeH5SlvwGOyg" type="8002">
<layoutConstraint xmi:type="notation:Location" xmi:id="_qTAl0RNdEeaeH5SlvwGOyg" x="25" y="-10"/>
</children>
<element xmi:type="uml:Pseudostate" href="forkjoin-entryexit2.uml#_qS6fMBNdEeaeH5SlvwGOyg"/>
<layoutConstraint xmi:type="notation:Bounds" xmi:id="_qS_-wRNdEeaeH5SlvwGOyg" x="27" y="189"/>
</children>
<children xmi:type="notation:Shape" xmi:id="_sIpRwBNdEeaeH5SlvwGOyg" type="6000">
<children xmi:type="notation:DecorationNode" xmi:id="_sIpRwhNdEeaeH5SlvwGOyg" type="6001">
<layoutConstraint xmi:type="notation:Bounds" xmi:id="_uNGc1hNdEeaeH5SlvwGOyg" width="368" height="23"/>
</children>
<children xmi:type="notation:DecorationNode" xmi:id="_sIpRwxNdEeaeH5SlvwGOyg" type="19003">
<layoutConstraint xmi:type="notation:Location" xmi:id="_sIpRxBNdEeaeH5SlvwGOyg" x="40"/>
</children>
<children xmi:type="notation:DecorationNode" xmi:id="_sIp40BNdEeaeH5SlvwGOyg" type="6002">
<eAnnotations xmi:type="ecore:EAnnotation" xmi:id="_uNEnoBNdEeaeH5SlvwGOyg" source="PapyrusCSSForceValue">
<details xmi:type="ecore:EStringToStringMapEntry" xmi:id="_uNEnoRNdEeaeH5SlvwGOyg" key="visible" value="true"/>
</eAnnotations>
<children xmi:type="notation:Shape" xmi:id="_uNGc0BNdEeaeH5SlvwGOyg" type="3000">
<eAnnotations xmi:type="ecore:EAnnotation" xmi:id="_uNGc1BNdEeaeH5SlvwGOyg" source="RegionAnnotationKey">
<details xmi:type="ecore:EStringToStringMapEntry" xmi:id="_uNGc1RNdEeaeH5SlvwGOyg" key="RegionZoneKey" value="B"/>
</eAnnotations>
<children xmi:type="notation:DecorationNode" xmi:id="_uNGc0hNdEeaeH5SlvwGOyg" type="3002">
<children xmi:type="notation:Shape" xmi:id="_PHD8cBNeEeaeH5SlvwGOyg" type="6000">
<children xmi:type="notation:DecorationNode" xmi:id="_PHD8chNeEeaeH5SlvwGOyg" type="6001">
<layoutConstraint xmi:type="notation:Bounds" xmi:id="_VS6asRNeEeaeH5SlvwGOyg" width="55"/>
</children>
<children xmi:type="notation:DecorationNode" xmi:id="_PHD8cxNeEeaeH5SlvwGOyg" type="19003">
<layoutConstraint xmi:type="notation:Location" xmi:id="_PHD8dBNeEeaeH5SlvwGOyg" x="40"/>
</children>
<children xmi:type="notation:DecorationNode" xmi:id="_PHD8dRNeEeaeH5SlvwGOyg" type="6002">
<layoutConstraint xmi:type="notation:Bounds" xmi:id="_PHD8dhNeEeaeH5SlvwGOyg" y="-1" width="55"/>
</children>
<element xmi:type="uml:State" href="forkjoin-entryexit2.uml#_PG5kYBNeEeaeH5SlvwGOyg"/>
<layoutConstraint xmi:type="notation:Bounds" xmi:id="_PHD8cRNeEeaeH5SlvwGOyg" x="82" y="57" width="55"/>
</children>
<children xmi:type="notation:Shape" xmi:id="_TbXqQBNeEeaeH5SlvwGOyg" type="6000">
<children xmi:type="notation:DecorationNode" xmi:id="_TbXqQhNeEeaeH5SlvwGOyg" type="6001">
<layoutConstraint xmi:type="notation:Bounds" xmi:id="_VS6asBNeEeaeH5SlvwGOyg" width="55"/>
</children>
<children xmi:type="notation:DecorationNode" xmi:id="_TbXqQxNeEeaeH5SlvwGOyg" type="19003">
<layoutConstraint xmi:type="notation:Location" xmi:id="_TbXqRBNeEeaeH5SlvwGOyg" x="40"/>
</children>
<children xmi:type="notation:DecorationNode" xmi:id="_TbXqRRNeEeaeH5SlvwGOyg" type="6002">
<layoutConstraint xmi:type="notation:Bounds" xmi:id="_TbXqRhNeEeaeH5SlvwGOyg" y="-1" width="55"/>
</children>
<element xmi:type="uml:State" href="forkjoin-entryexit2.uml#_TbMEEBNeEeaeH5SlvwGOyg"/>
<layoutConstraint xmi:type="notation:Bounds" xmi:id="_TbXqQRNeEeaeH5SlvwGOyg" x="220" y="57" width="55"/>
</children>
<children xmi:type="notation:Shape" xmi:id="_ctQFUBNeEeaeH5SlvwGOyg" type="8000">
<children xmi:type="notation:DecorationNode" xmi:id="_ctQFUhNeEeaeH5SlvwGOyg" type="8001">
<layoutConstraint xmi:type="notation:Location" xmi:id="_ctQFUxNeEeaeH5SlvwGOyg" x="25" y="3"/>
</children>
<children xmi:type="notation:DecorationNode" xmi:id="_ctQFVBNeEeaeH5SlvwGOyg" type="8002">
<layoutConstraint xmi:type="notation:Location" xmi:id="_ctQFVRNeEeaeH5SlvwGOyg" x="25" y="-10"/>
</children>
<element xmi:type="uml:Pseudostate" href="forkjoin-entryexit2.uml#_ctFGMBNeEeaeH5SlvwGOyg"/>
<layoutConstraint xmi:type="notation:Bounds" xmi:id="_ctQFURNeEeaeH5SlvwGOyg" x="18" y="84"/>
</children>
<layoutConstraint xmi:type="notation:Bounds" xmi:id="_uNGc0xNdEeaeH5SlvwGOyg"/>
</children>
<element xmi:type="uml:Region" href="forkjoin-entryexit2.uml#_uNFOsBNdEeaeH5SlvwGOyg"/>
<layoutConstraint xmi:type="notation:Bounds" xmi:id="_uNGc0RNdEeaeH5SlvwGOyg" y="135" width="368" height="135"/>
</children>
<children xmi:type="notation:Shape" xmi:id="_usQeABNdEeaeH5SlvwGOyg" type="3000">
<eAnnotations xmi:type="ecore:EAnnotation" xmi:id="_usRFEhNdEeaeH5SlvwGOyg" source="RegionAnnotationKey">
<details xmi:type="ecore:EStringToStringMapEntry" xmi:id="_usRFExNdEeaeH5SlvwGOyg" key="RegionZoneKey" value="T"/>
</eAnnotations>
<children xmi:type="notation:DecorationNode" xmi:id="_usRFEBNdEeaeH5SlvwGOyg" type="3002">
<children xmi:type="notation:Shape" xmi:id="_JHV1sBNeEeaeH5SlvwGOyg" type="6000">
<children xmi:type="notation:DecorationNode" xmi:id="_JHV1shNeEeaeH5SlvwGOyg" type="6001">
<layoutConstraint xmi:type="notation:Bounds" xmi:id="_MiFeQBNeEeaeH5SlvwGOyg" width="55"/>
</children>
<children xmi:type="notation:DecorationNode" xmi:id="_JHV1sxNeEeaeH5SlvwGOyg" type="19003">
<layoutConstraint xmi:type="notation:Location" xmi:id="_JHV1tBNeEeaeH5SlvwGOyg" x="40"/>
</children>
<children xmi:type="notation:DecorationNode" xmi:id="_JHV1tRNeEeaeH5SlvwGOyg" type="6002">
<layoutConstraint xmi:type="notation:Bounds" xmi:id="_JHV1thNeEeaeH5SlvwGOyg" y="-1" width="55"/>
</children>
<element xmi:type="uml:State" href="forkjoin-entryexit2.uml#_JHMrwBNeEeaeH5SlvwGOyg"/>
<layoutConstraint xmi:type="notation:Bounds" xmi:id="_JHV1sRNeEeaeH5SlvwGOyg" x="82" y="43" width="55"/>
</children>
<children xmi:type="notation:Shape" xmi:id="_SOZg0BNeEeaeH5SlvwGOyg" type="6000">
<children xmi:type="notation:DecorationNode" xmi:id="_SOaH4BNeEeaeH5SlvwGOyg" type="6001">
<layoutConstraint xmi:type="notation:Bounds" xmi:id="_VS6ashNeEeaeH5SlvwGOyg" width="55"/>
</children>
<children xmi:type="notation:DecorationNode" xmi:id="_SOaH4RNeEeaeH5SlvwGOyg" type="19003">
<layoutConstraint xmi:type="notation:Location" xmi:id="_SOaH4hNeEeaeH5SlvwGOyg" x="40"/>
</children>
<children xmi:type="notation:DecorationNode" xmi:id="_SOaH4xNeEeaeH5SlvwGOyg" type="6002">
<layoutConstraint xmi:type="notation:Bounds" xmi:id="_SOaH5BNeEeaeH5SlvwGOyg" y="-1" width="55"/>
</children>
<element xmi:type="uml:State" href="forkjoin-entryexit2.uml#_SOOhsBNeEeaeH5SlvwGOyg"/>
<layoutConstraint xmi:type="notation:Bounds" xmi:id="_SOZg0RNeEeaeH5SlvwGOyg" x="220" y="43" width="55"/>
</children>
<children xmi:type="notation:Shape" xmi:id="_bzdWkBNeEeaeH5SlvwGOyg" type="8000">
<children xmi:type="notation:DecorationNode" xmi:id="_bzdWkhNeEeaeH5SlvwGOyg" type="8001">
<layoutConstraint xmi:type="notation:Location" xmi:id="_bzdWkxNeEeaeH5SlvwGOyg" x="25" y="3"/>
</children>
<children xmi:type="notation:DecorationNode" xmi:id="_bzdWlBNeEeaeH5SlvwGOyg" type="8002">
<layoutConstraint xmi:type="notation:Location" xmi:id="_bzd9oBNeEeaeH5SlvwGOyg" x="25" y="-10"/>
</children>
<element xmi:type="uml:Pseudostate" href="forkjoin-entryexit2.uml#_bzP7MBNeEeaeH5SlvwGOyg"/>
<layoutConstraint xmi:type="notation:Bounds" xmi:id="_bzdWkRNeEeaeH5SlvwGOyg" x="17" y="36"/>
</children>
<layoutConstraint xmi:type="notation:Bounds" xmi:id="_usRFERNdEeaeH5SlvwGOyg"/>
</children>
<element xmi:type="uml:Region" href="forkjoin-entryexit2.uml#_usPP4BNdEeaeH5SlvwGOyg"/>
<layoutConstraint xmi:type="notation:Bounds" xmi:id="_usQeARNdEeaeH5SlvwGOyg" width="368" height="135"/>
</children>
<layoutConstraint xmi:type="notation:Bounds" xmi:id="_sIp40RNdEeaeH5SlvwGOyg" y="23" width="368" height="271"/>
</children>
<element xmi:type="uml:State" href="forkjoin-entryexit2.uml#_sIjyMBNdEeaeH5SlvwGOyg"/>
<layoutConstraint xmi:type="notation:Bounds" xmi:id="_sIpRwRNdEeaeH5SlvwGOyg" x="380" y="38" width="368" height="294"/>
</children>
<children xmi:type="notation:Shape" xmi:id="_vsl5oBNdEeaeH5SlvwGOyg" type="6000">
<children xmi:type="notation:DecorationNode" xmi:id="_vsl5ohNdEeaeH5SlvwGOyg" type="6001">
<layoutConstraint xmi:type="notation:Bounds" xmi:id="_Ne6S4BNeEeaeH5SlvwGOyg" width="55"/>
</children>
<children xmi:type="notation:DecorationNode" xmi:id="_vsl5oxNdEeaeH5SlvwGOyg" type="19003">
<layoutConstraint xmi:type="notation:Location" xmi:id="_vsl5pBNdEeaeH5SlvwGOyg" x="40"/>
</children>
<children xmi:type="notation:DecorationNode" xmi:id="_vsl5pRNdEeaeH5SlvwGOyg" type="6002">
<layoutConstraint xmi:type="notation:Bounds" xmi:id="_vsl5phNdEeaeH5SlvwGOyg" y="-1" width="55"/>
</children>
<element xmi:type="uml:State" href="forkjoin-entryexit2.uml#_vsfL8BNdEeaeH5SlvwGOyg"/>
<layoutConstraint xmi:type="notation:Bounds" xmi:id="_vsl5oRNdEeaeH5SlvwGOyg" x="985" y="175" width="55"/>
</children>
<children xmi:type="notation:Shape" xmi:id="_1bEfYBNdEeaeH5SlvwGOyg" type="10000">
<children xmi:type="notation:DecorationNode" xmi:id="_1bEfYhNdEeaeH5SlvwGOyg" type="10001">
<layoutConstraint xmi:type="notation:Location" xmi:id="_1bEfYxNdEeaeH5SlvwGOyg" x="-28" y="-25"/>
</children>
<children xmi:type="notation:DecorationNode" xmi:id="_1bEfZBNdEeaeH5SlvwGOyg" type="10002">
<layoutConstraint xmi:type="notation:Location" xmi:id="_1bEfZRNdEeaeH5SlvwGOyg" x="25" y="-10"/>
</children>
<element xmi:type="uml:Pseudostate" href="forkjoin-entryexit2.uml#_1a9xsBNdEeaeH5SlvwGOyg"/>
<layoutConstraint xmi:type="notation:Bounds" xmi:id="_1bEfYRNdEeaeH5SlvwGOyg" x="305" y="183"/>
</children>
<children xmi:type="notation:Shape" xmi:id="_2gLtUBNdEeaeH5SlvwGOyg" type="9000">
<children xmi:type="notation:DecorationNode" xmi:id="_2gLtUhNdEeaeH5SlvwGOyg" type="9001">
<layoutConstraint xmi:type="notation:Location" xmi:id="_2gLtUxNdEeaeH5SlvwGOyg" x="-9" y="-23"/>
</children>
<children xmi:type="notation:DecorationNode" xmi:id="_2gLtVBNdEeaeH5SlvwGOyg" type="9002">
<layoutConstraint xmi:type="notation:Location" xmi:id="_2gLtVRNdEeaeH5SlvwGOyg" x="25" y="-10"/>
</children>
<element xmi:type="uml:Pseudostate" href="forkjoin-entryexit2.uml#_2gEYkBNdEeaeH5SlvwGOyg"/>
<layoutConstraint xmi:type="notation:Bounds" xmi:id="_2gLtURNdEeaeH5SlvwGOyg" x="808" y="187"/>
</children>
<children xmi:type="notation:Shape" xmi:id="_MRHcsBOjEeaeH5SlvwGOyg" type="11000">
<children xmi:type="notation:DecorationNode" xmi:id="_MRHcshOjEeaeH5SlvwGOyg" type="11001">
<layoutConstraint xmi:type="notation:Location" xmi:id="_MRHcsxOjEeaeH5SlvwGOyg" x="-1" y="-24"/>
</children>
<children xmi:type="notation:DecorationNode" xmi:id="_MRIDwBOjEeaeH5SlvwGOyg" type="11002">
<layoutConstraint xmi:type="notation:Location" xmi:id="_MRIDwROjEeaeH5SlvwGOyg" x="25" y="-10"/>
</children>
<element xmi:type="uml:Pseudostate" href="forkjoin-entryexit2.uml#_MQ2W8BOjEeaeH5SlvwGOyg"/>
<layoutConstraint xmi:type="notation:Bounds" xmi:id="_MRHcsROjEeaeH5SlvwGOyg" x="199" y="192"/>
</children>
<children xmi:type="notation:Shape" xmi:id="_N59CwBOjEeaeH5SlvwGOyg" type="11000">
<children xmi:type="notation:DecorationNode" xmi:id="_N59CwhOjEeaeH5SlvwGOyg" type="11001">
<layoutConstraint xmi:type="notation:Location" xmi:id="_N59CwxOjEeaeH5SlvwGOyg" x="-6" y="-23"/>
</children>
<children xmi:type="notation:DecorationNode" xmi:id="_N59CxBOjEeaeH5SlvwGOyg" type="11002">
<layoutConstraint xmi:type="notation:Location" xmi:id="_N59p0BOjEeaeH5SlvwGOyg" x="25" y="-10"/>
</children>
<element xmi:type="uml:Pseudostate" href="forkjoin-entryexit2.uml#_N5qu4BOjEeaeH5SlvwGOyg"/>
<layoutConstraint xmi:type="notation:Bounds" xmi:id="_N59CwROjEeaeH5SlvwGOyg" x="874" y="192"/>
</children>
<layoutConstraint xmi:type="notation:Bounds" xmi:id="_flEceRNdEeaeH5SlvwGOyg"/>
</children>
<element xmi:type="uml:Region" href="forkjoin-entryexit2.uml#_flDOUBNdEeaeH5SlvwGOyg"/>
<layoutConstraint xmi:type="notation:Bounds" xmi:id="_flEcehNdEeaeH5SlvwGOyg" width="1068" height="535"/>
</children>
<layoutConstraint xmi:type="notation:Bounds" xmi:id="_flEcexNdEeaeH5SlvwGOyg" y="23" width="1068" height="535"/>
</children>
<element xmi:type="uml:StateMachine" href="forkjoin-entryexit2.uml#_fk9HsBNdEeaeH5SlvwGOyg"/>
<layoutConstraint xmi:type="notation:Bounds" xmi:id="_flEcfBNdEeaeH5SlvwGOyg" x="30" y="30" width="1068" height="558"/>
</children>
<styles xmi:type="notation:StringValueStyle" xmi:id="_flEcfRNdEeaeH5SlvwGOyg" name="diagram_compatibility_version" stringValue="1.1.0"/>
<styles xmi:type="notation:DiagramStyle" xmi:id="_flEcfhNdEeaeH5SlvwGOyg"/>
<styles xmi:type="style:PapyrusViewStyle" xmi:id="_flEcfxNdEeaeH5SlvwGOyg">
<owner xmi:type="uml:Model" href="forkjoin-entryexit2.uml#_fkueMBNdEeaeH5SlvwGOyg"/>
</styles>
<element xmi:type="uml:StateMachine" href="forkjoin-entryexit2.uml#_fk9HsBNdEeaeH5SlvwGOyg"/>
<edges xmi:type="notation:Connector" xmi:id="_57rj0BNdEeaeH5SlvwGOyg" type="7000" source="_qS_-wBNdEeaeH5SlvwGOyg" target="_pOKdoBNdEeaeH5SlvwGOyg">
<children xmi:type="notation:DecorationNode" xmi:id="_57rj0xNdEeaeH5SlvwGOyg" type="7001">
<layoutConstraint xmi:type="notation:Location" xmi:id="_57rj1BNdEeaeH5SlvwGOyg"/>
</children>
<children xmi:type="notation:DecorationNode" xmi:id="_57rj1RNdEeaeH5SlvwGOyg" type="7002">
<layoutConstraint xmi:type="notation:Location" xmi:id="_57rj1hNdEeaeH5SlvwGOyg"/>
</children>
<children xmi:type="notation:DecorationNode" xmi:id="_57rj1xNdEeaeH5SlvwGOyg" type="7003">
<layoutConstraint xmi:type="notation:Location" xmi:id="_57rj2BNdEeaeH5SlvwGOyg" y="60"/>
</children>
<styles xmi:type="notation:FontStyle" xmi:id="_57rj0RNdEeaeH5SlvwGOyg"/>
<element xmi:type="uml:Transition" href="forkjoin-entryexit2.uml#_57dhYBNdEeaeH5SlvwGOyg"/>
<bendpoints xmi:type="notation:RelativeBendpoints" xmi:id="_57rj0hNdEeaeH5SlvwGOyg" points="[8, 0, -77, 0]$[78, 0, -7, 0]"/>
<sourceAnchor xmi:type="notation:IdentityAnchor" xmi:id="_58FMcBNdEeaeH5SlvwGOyg" id="(1.0,0.4)"/>
<targetAnchor xmi:type="notation:IdentityAnchor" xmi:id="_58FzgBNdEeaeH5SlvwGOyg" id="(0.0,0.48936170212765956)"/>
</edges>
<edges xmi:type="notation:Connector" xmi:id="_CmHkYBNeEeaeH5SlvwGOyg" type="7000" source="_pOKdoBNdEeaeH5SlvwGOyg" target="_MRHcsBOjEeaeH5SlvwGOyg">
<children xmi:type="notation:DecorationNode" xmi:id="_CmHkYxNeEeaeH5SlvwGOyg" type="7001">
<layoutConstraint xmi:type="notation:Location" xmi:id="_CmHkZBNeEeaeH5SlvwGOyg"/>
</children>
<children xmi:type="notation:DecorationNode" xmi:id="_CmHkZRNeEeaeH5SlvwGOyg" type="7002">
<layoutConstraint xmi:type="notation:Location" xmi:id="_CmHkZhNeEeaeH5SlvwGOyg" x="-6" y="-14"/>
</children>
<children xmi:type="notation:DecorationNode" xmi:id="_CmHkZxNeEeaeH5SlvwGOyg" type="7003">
<layoutConstraint xmi:type="notation:Location" xmi:id="_CmHkaBNeEeaeH5SlvwGOyg" y="60"/>
</children>
<styles xmi:type="notation:FontStyle" xmi:id="_CmHkYRNeEeaeH5SlvwGOyg"/>
<element xmi:type="uml:Transition" href="forkjoin-entryexit2.uml#_Cl9MUBNeEeaeH5SlvwGOyg"/>
<bendpoints xmi:type="notation:RelativeBendpoints" xmi:id="_CmHkYhNeEeaeH5SlvwGOyg" points="[7, 0, -56, 12]$[63, -12, 0, 0]"/>
<sourceAnchor xmi:type="notation:IdentityAnchor" xmi:id="_CmfX0BNeEeaeH5SlvwGOyg" id="(1.0,0.5531914893617021)"/>
<targetAnchor xmi:type="notation:IdentityAnchor" xmi:id="_Cmf-4BNeEeaeH5SlvwGOyg" id="(0.0,0.35)"/>
</edges>
<edges xmi:type="notation:Connector" xmi:id="_FYF8wBNeEeaeH5SlvwGOyg" type="7000" source="_2gLtUBNdEeaeH5SlvwGOyg" target="_N59CwBOjEeaeH5SlvwGOyg">
<children xmi:type="notation:DecorationNode" xmi:id="_FYGj0BNeEeaeH5SlvwGOyg" type="7001">
<layoutConstraint xmi:type="notation:Location" xmi:id="_FYGj0RNeEeaeH5SlvwGOyg"/>
</children>
<children xmi:type="notation:DecorationNode" xmi:id="_FYGj0hNeEeaeH5SlvwGOyg" type="7002">
<layoutConstraint xmi:type="notation:Location" xmi:id="_FYGj0xNeEeaeH5SlvwGOyg"/>
</children>
<children xmi:type="notation:DecorationNode" xmi:id="_FYGj1BNeEeaeH5SlvwGOyg" type="7003">
<layoutConstraint xmi:type="notation:Location" xmi:id="_FYGj1RNeEeaeH5SlvwGOyg" y="60"/>
</children>
<styles xmi:type="notation:FontStyle" xmi:id="_FYF8wRNeEeaeH5SlvwGOyg"/>
<element xmi:type="uml:Transition" href="forkjoin-entryexit2.uml#_FX-A8BNeEeaeH5SlvwGOyg"/>
<bendpoints xmi:type="notation:RelativeBendpoints" xmi:id="_FYF8whNeEeaeH5SlvwGOyg" points="[10, 1, -101, 13]$[112, -8, 1, 4]"/>
<sourceAnchor xmi:type="notation:IdentityAnchor" xmi:id="_FYeXQBNeEeaeH5SlvwGOyg" id="(1.0,0.35)"/>
<targetAnchor xmi:type="notation:IdentityAnchor" xmi:id="_FYeXQRNeEeaeH5SlvwGOyg" id="(0.0,0.4)"/>
</edges>
<edges xmi:type="notation:Connector" xmi:id="_emzA4BNeEeaeH5SlvwGOyg" type="7000" source="_ctQFUBNeEeaeH5SlvwGOyg" target="_PHD8cBNeEeaeH5SlvwGOyg">
<children xmi:type="notation:DecorationNode" xmi:id="_emzn8BNeEeaeH5SlvwGOyg" type="7001">
<layoutConstraint xmi:type="notation:Location" xmi:id="_emzn8RNeEeaeH5SlvwGOyg"/>
</children>
<children xmi:type="notation:DecorationNode" xmi:id="_emzn8hNeEeaeH5SlvwGOyg" type="7002">
<layoutConstraint xmi:type="notation:Location" xmi:id="_emzn8xNeEeaeH5SlvwGOyg"/>
</children>
<children xmi:type="notation:DecorationNode" xmi:id="_emzn9BNeEeaeH5SlvwGOyg" type="7003">
<layoutConstraint xmi:type="notation:Location" xmi:id="_emzn9RNeEeaeH5SlvwGOyg" y="60"/>
</children>
<styles xmi:type="notation:FontStyle" xmi:id="_emzA4RNeEeaeH5SlvwGOyg"/>
<element xmi:type="uml:Transition" href="forkjoin-entryexit2.uml#_emjwUBNeEeaeH5SlvwGOyg"/>
<bendpoints xmi:type="notation:RelativeBendpoints" xmi:id="_emzA4hNeEeaeH5SlvwGOyg" points="[8, -3, -57, 0]$[54, 3, -11, 6]"/>
<sourceAnchor xmi:type="notation:IdentityAnchor" xmi:id="_enaE4BNeEeaeH5SlvwGOyg" id="(1.0,0.35)"/>
<targetAnchor xmi:type="notation:IdentityAnchor" xmi:id="_enaE4RNeEeaeH5SlvwGOyg" id="(0.0,0.723404255319149)"/>
</edges>
<edges xmi:type="notation:Connector" xmi:id="_fLBvUBNeEeaeH5SlvwGOyg" type="7000" source="_bzdWkBNeEeaeH5SlvwGOyg" target="_JHV1sBNeEeaeH5SlvwGOyg">
<children xmi:type="notation:DecorationNode" xmi:id="_fLBvUxNeEeaeH5SlvwGOyg" type="7001">
<layoutConstraint xmi:type="notation:Location" xmi:id="_fLBvVBNeEeaeH5SlvwGOyg"/>
</children>
<children xmi:type="notation:DecorationNode" xmi:id="_fLBvVRNeEeaeH5SlvwGOyg" type="7002">
<layoutConstraint xmi:type="notation:Location" xmi:id="_fLBvVhNeEeaeH5SlvwGOyg"/>
</children>
<children xmi:type="notation:DecorationNode" xmi:id="_fLBvVxNeEeaeH5SlvwGOyg" type="7003">
<layoutConstraint xmi:type="notation:Location" xmi:id="_fLBvWBNeEeaeH5SlvwGOyg" y="60"/>
</children>
<styles xmi:type="notation:FontStyle" xmi:id="_fLBvURNeEeaeH5SlvwGOyg"/>
<element xmi:type="uml:Transition" href="forkjoin-entryexit2.uml#_fKxQoBNeEeaeH5SlvwGOyg"/>
<bendpoints xmi:type="notation:RelativeBendpoints" xmi:id="_fLBvUhNeEeaeH5SlvwGOyg" points="[8, 3, -49, 0]$[56, 2, -1, -1]"/>
<sourceAnchor xmi:type="notation:IdentityAnchor" xmi:id="_fLpaYBNeEeaeH5SlvwGOyg" id="(1.0,0.5)"/>
<targetAnchor xmi:type="notation:IdentityAnchor" xmi:id="_fLpaYRNeEeaeH5SlvwGOyg" id="(0.0,0.10638297872340426)"/>
</edges>
<edges xmi:type="notation:Connector" xmi:id="_fxt74BNeEeaeH5SlvwGOyg" type="7000" source="_JHV1sBNeEeaeH5SlvwGOyg" target="_SOZg0BNeEeaeH5SlvwGOyg">
<children xmi:type="notation:DecorationNode" xmi:id="_fxt74xNeEeaeH5SlvwGOyg" type="7001">
<layoutConstraint xmi:type="notation:Location" xmi:id="_fxt75BNeEeaeH5SlvwGOyg"/>
</children>
<children xmi:type="notation:DecorationNode" xmi:id="_fxui8BNeEeaeH5SlvwGOyg" type="7002">
<layoutConstraint xmi:type="notation:Location" xmi:id="_fxui8RNeEeaeH5SlvwGOyg" x="-4" y="-14"/>
</children>
<children xmi:type="notation:DecorationNode" xmi:id="_fxui8hNeEeaeH5SlvwGOyg" type="7003">
<layoutConstraint xmi:type="notation:Location" xmi:id="_fxui8xNeEeaeH5SlvwGOyg" y="60"/>
</children>
<styles xmi:type="notation:FontStyle" xmi:id="_fxt74RNeEeaeH5SlvwGOyg"/>
<element xmi:type="uml:Transition" href="forkjoin-entryexit2.uml#_fxerUBNeEeaeH5SlvwGOyg"/>
<bendpoints xmi:type="notation:RelativeBendpoints" xmi:id="_fxt74hNeEeaeH5SlvwGOyg" points="[54, 8, -84, 8]$[191, 41, 53, 41]"/>
<sourceAnchor xmi:type="notation:IdentityAnchor" xmi:id="_fyYDMBNeEeaeH5SlvwGOyg" id="(1.0,0.46808510638297873)"/>
<targetAnchor xmi:type="notation:IdentityAnchor" xmi:id="_fyYDMRNeEeaeH5SlvwGOyg" id="(0.0,0.5106382978723404)"/>
</edges>
<edges xmi:type="notation:Connector" xmi:id="_gc0HUBNeEeaeH5SlvwGOyg" type="7000" source="_PHD8cBNeEeaeH5SlvwGOyg" target="_TbXqQBNeEeaeH5SlvwGOyg">
<children xmi:type="notation:DecorationNode" xmi:id="_gc0HUxNeEeaeH5SlvwGOyg" type="7001">
<layoutConstraint xmi:type="notation:Location" xmi:id="_gc0HVBNeEeaeH5SlvwGOyg"/>
</children>
<children xmi:type="notation:DecorationNode" xmi:id="_gc0HVRNeEeaeH5SlvwGOyg" type="7002">
<layoutConstraint xmi:type="notation:Location" xmi:id="_gc0HVhNeEeaeH5SlvwGOyg" x="-2" y="-14"/>
</children>
<children xmi:type="notation:DecorationNode" xmi:id="_gc0HVxNeEeaeH5SlvwGOyg" type="7003">
<layoutConstraint xmi:type="notation:Location" xmi:id="_gc0HWBNeEeaeH5SlvwGOyg" y="60"/>
</children>
<styles xmi:type="notation:FontStyle" xmi:id="_gc0HURNeEeaeH5SlvwGOyg"/>
<element xmi:type="uml:Transition" href="forkjoin-entryexit2.uml#_gck2wBNeEeaeH5SlvwGOyg"/>
<bendpoints xmi:type="notation:RelativeBendpoints" xmi:id="_gc0HUhNeEeaeH5SlvwGOyg" points="[55, 11, -118, -25]$[179, 47, 6, 11]"/>
<sourceAnchor xmi:type="notation:IdentityAnchor" xmi:id="_gddnkBNeEeaeH5SlvwGOyg" id="(1.0,0.5319148936170213)"/>
<targetAnchor xmi:type="notation:IdentityAnchor" xmi:id="_gddnkRNeEeaeH5SlvwGOyg" id="(0.0,0.48936170212765956)"/>
</edges>
<edges xmi:type="notation:Connector" xmi:id="_ijQPYBNeEeaeH5SlvwGOyg" type="7000" source="_1bEfYBNdEeaeH5SlvwGOyg" target="_JHV1sBNeEeaeH5SlvwGOyg">
<children xmi:type="notation:DecorationNode" xmi:id="_ijQPYxNeEeaeH5SlvwGOyg" type="7001">
<layoutConstraint xmi:type="notation:Location" xmi:id="_ijQPZBNeEeaeH5SlvwGOyg"/>
</children>
<children xmi:type="notation:DecorationNode" xmi:id="_ijQPZRNeEeaeH5SlvwGOyg" type="7002">
<layoutConstraint xmi:type="notation:Location" xmi:id="_ijQPZhNeEeaeH5SlvwGOyg"/>
</children>
<children xmi:type="notation:DecorationNode" xmi:id="_ijQPZxNeEeaeH5SlvwGOyg" type="7003">
<layoutConstraint xmi:type="notation:Location" xmi:id="_ijQPaBNeEeaeH5SlvwGOyg" y="60"/>
</children>
<styles xmi:type="notation:FontStyle" xmi:id="_ijQPYRNeEeaeH5SlvwGOyg"/>
<element xmi:type="uml:Transition" href="forkjoin-entryexit2.uml#_ijAXwBNeEeaeH5SlvwGOyg"/>
<bendpoints xmi:type="notation:RelativeBendpoints" xmi:id="_ijQPYhNeEeaeH5SlvwGOyg" points="[0, 0, -157, 79]$[177, -32, 20, 47]"/>
<sourceAnchor xmi:type="notation:IdentityAnchor" xmi:id="_ij7k0BNeEeaeH5SlvwGOyg" id="(1.0,0.425)"/>
<targetAnchor xmi:type="notation:IdentityAnchor" xmi:id="_ij7k0RNeEeaeH5SlvwGOyg" id="(0.0,0.8297872340425532)"/>
</edges>
<edges xmi:type="notation:Connector" xmi:id="_jHbTcBNeEeaeH5SlvwGOyg" type="7000" source="_1bEfYBNdEeaeH5SlvwGOyg" target="_PHD8cBNeEeaeH5SlvwGOyg">
<children xmi:type="notation:DecorationNode" xmi:id="_jHbTcxNeEeaeH5SlvwGOyg" type="7001">
<layoutConstraint xmi:type="notation:Location" xmi:id="_jHbTdBNeEeaeH5SlvwGOyg"/>
</children>
<children xmi:type="notation:DecorationNode" xmi:id="_jHbTdRNeEeaeH5SlvwGOyg" type="7002">
<layoutConstraint xmi:type="notation:Location" xmi:id="_jHbTdhNeEeaeH5SlvwGOyg"/>
</children>
<children xmi:type="notation:DecorationNode" xmi:id="_jHbTdxNeEeaeH5SlvwGOyg" type="7003">
<layoutConstraint xmi:type="notation:Location" xmi:id="_jHbTeBNeEeaeH5SlvwGOyg" y="60"/>
</children>
<styles xmi:type="notation:FontStyle" xmi:id="_jHbTcRNeEeaeH5SlvwGOyg"/>
<element xmi:type="uml:Transition" href="forkjoin-entryexit2.uml#_jHI_kBNeEeaeH5SlvwGOyg"/>
<bendpoints xmi:type="notation:RelativeBendpoints" xmi:id="_jHbTchNeEeaeH5SlvwGOyg" points="[10, 4, -147, -66]$[160, 72, 3, 2]"/>
<sourceAnchor xmi:type="notation:IdentityAnchor" xmi:id="_jIGB0BNeEeaeH5SlvwGOyg" id="(1.0,0.675)"/>
<targetAnchor xmi:type="notation:IdentityAnchor" xmi:id="_jIGB0RNeEeaeH5SlvwGOyg" id="(0.0,0.2127659574468085)"/>
</edges>
<edges xmi:type="notation:Connector" xmi:id="_jzE4gBNeEeaeH5SlvwGOyg" type="7000" source="_SOZg0BNeEeaeH5SlvwGOyg" target="_2gLtUBNdEeaeH5SlvwGOyg">
<children xmi:type="notation:DecorationNode" xmi:id="_jzE4gxNeEeaeH5SlvwGOyg" type="7001">
<layoutConstraint xmi:type="notation:Location" xmi:id="_jzE4hBNeEeaeH5SlvwGOyg"/>
</children>
<children xmi:type="notation:DecorationNode" xmi:id="_jzE4hRNeEeaeH5SlvwGOyg" type="7002">
<layoutConstraint xmi:type="notation:Location" xmi:id="_jzE4hhNeEeaeH5SlvwGOyg"/>
</children>
<children xmi:type="notation:DecorationNode" xmi:id="_jzE4hxNeEeaeH5SlvwGOyg" type="7003">
<layoutConstraint xmi:type="notation:Location" xmi:id="_jzE4iBNeEeaeH5SlvwGOyg" y="60"/>
</children>
<styles xmi:type="notation:FontStyle" xmi:id="_jzE4gRNeEeaeH5SlvwGOyg"/>
<element xmi:type="uml:Transition" href="forkjoin-entryexit2.uml#_jy1A4BNeEeaeH5SlvwGOyg"/>
<bendpoints xmi:type="notation:RelativeBendpoints" xmi:id="_jzE4ghNeEeaeH5SlvwGOyg" points="[13, 5, -154, -70]$[166, 74, -1, -1]"/>
<sourceAnchor xmi:type="notation:IdentityAnchor" xmi:id="_jzu_0BNeEeaeH5SlvwGOyg" id="(1.0,0.6382978723404256)"/>
<targetAnchor xmi:type="notation:IdentityAnchor" xmi:id="_jzu_0RNeEeaeH5SlvwGOyg" id="(0.0,0.4)"/>
</edges>
<edges xmi:type="notation:Connector" xmi:id="_kZoiMBNeEeaeH5SlvwGOyg" type="7000" source="_TbXqQBNeEeaeH5SlvwGOyg" target="_2gLtUBNdEeaeH5SlvwGOyg">
<children xmi:type="notation:DecorationNode" xmi:id="_kZoiMxNeEeaeH5SlvwGOyg" type="7001">
<layoutConstraint xmi:type="notation:Location" xmi:id="_kZoiNBNeEeaeH5SlvwGOyg"/>
</children>
<children xmi:type="notation:DecorationNode" xmi:id="_kZoiNRNeEeaeH5SlvwGOyg" type="7002">
<layoutConstraint xmi:type="notation:Location" xmi:id="_kZoiNhNeEeaeH5SlvwGOyg"/>
</children>
<children xmi:type="notation:DecorationNode" xmi:id="_kZoiNxNeEeaeH5SlvwGOyg" type="7003">
<layoutConstraint xmi:type="notation:Location" xmi:id="_kZoiOBNeEeaeH5SlvwGOyg" y="60"/>
</children>
<styles xmi:type="notation:FontStyle" xmi:id="_kZoiMRNeEeaeH5SlvwGOyg"/>
<element xmi:type="uml:Transition" href="forkjoin-entryexit2.uml#_kZYDgBNeEeaeH5SlvwGOyg"/>
<bendpoints xmi:type="notation:RelativeBendpoints" xmi:id="_kZoiMhNeEeaeH5SlvwGOyg" points="[55, 14, -155, 52]$[208, -33, -2, 5]"/>
<sourceAnchor xmi:type="notation:IdentityAnchor" xmi:id="_kaTQkBNeEeaeH5SlvwGOyg" id="(1.0,0.46808510638297873)"/>
<targetAnchor xmi:type="notation:IdentityAnchor" xmi:id="_kaTQkRNeEeaeH5SlvwGOyg" id="(0.0,0.7)"/>
</edges>
<edges xmi:type="notation:Connector" xmi:id="_VGbQgBOjEeaeH5SlvwGOyg" type="7000" source="_MRHcsBOjEeaeH5SlvwGOyg" target="_1bEfYBNdEeaeH5SlvwGOyg">
<children xmi:type="notation:DecorationNode" xmi:id="_VGbQgxOjEeaeH5SlvwGOyg" type="7001">
<layoutConstraint xmi:type="notation:Location" xmi:id="_VGbQhBOjEeaeH5SlvwGOyg"/>
</children>
<children xmi:type="notation:DecorationNode" xmi:id="_VGbQhROjEeaeH5SlvwGOyg" type="7002">
<layoutConstraint xmi:type="notation:Location" xmi:id="_VGbQhhOjEeaeH5SlvwGOyg"/>
</children>
<children xmi:type="notation:DecorationNode" xmi:id="_VGbQhxOjEeaeH5SlvwGOyg" type="7003">
<layoutConstraint xmi:type="notation:Location" xmi:id="_VGbQiBOjEeaeH5SlvwGOyg" y="60"/>
</children>
<styles xmi:type="notation:FontStyle" xmi:id="_VGbQgROjEeaeH5SlvwGOyg"/>
<element xmi:type="uml:Transition" href="forkjoin-entryexit2.uml#_VGKKwBOjEeaeH5SlvwGOyg"/>
<bendpoints xmi:type="notation:RelativeBendpoints" xmi:id="_VGbQghOjEeaeH5SlvwGOyg" points="[24, 2, -53, 0]$[76, 2, -1, 0]"/>
<sourceAnchor xmi:type="notation:IdentityAnchor" xmi:id="_VHJpQBOjEeaeH5SlvwGOyg" id="(1.0,0.5)"/>
<targetAnchor xmi:type="notation:IdentityAnchor" xmi:id="_VHJpQROjEeaeH5SlvwGOyg" id="(0.0,0.5)"/>
</edges>
<edges xmi:type="notation:Connector" xmi:id="_X9FUkBOjEeaeH5SlvwGOyg" type="7000" source="_N59CwBOjEeaeH5SlvwGOyg" target="_vsl5oBNdEeaeH5SlvwGOyg">
<children xmi:type="notation:DecorationNode" xmi:id="_X9FUkxOjEeaeH5SlvwGOyg" type="7001">
<layoutConstraint xmi:type="notation:Location" xmi:id="_X9FUlBOjEeaeH5SlvwGOyg"/>
</children>
<children xmi:type="notation:DecorationNode" xmi:id="_X9FUlROjEeaeH5SlvwGOyg" type="7002">
<layoutConstraint xmi:type="notation:Location" xmi:id="_X9FUlhOjEeaeH5SlvwGOyg"/>
</children>
<children xmi:type="notation:DecorationNode" xmi:id="_X9FUlxOjEeaeH5SlvwGOyg" type="7003">
<layoutConstraint xmi:type="notation:Location" xmi:id="_X9FUmBOjEeaeH5SlvwGOyg" y="60"/>
</children>
<styles xmi:type="notation:FontStyle" xmi:id="_X9FUkROjEeaeH5SlvwGOyg"/>
<element xmi:type="uml:Transition" href="forkjoin-entryexit2.uml#_X8014BOjEeaeH5SlvwGOyg"/>
<bendpoints xmi:type="notation:RelativeBendpoints" xmi:id="_X9FUkhOjEeaeH5SlvwGOyg" points="[24, -2, -57, 25]$[132, 17, 51, 44]"/>
<sourceAnchor xmi:type="notation:IdentityAnchor" xmi:id="_X9ztUBOjEeaeH5SlvwGOyg" id="(1.0,0.4)"/>
<targetAnchor xmi:type="notation:IdentityAnchor" xmi:id="_X9ztUROjEeaeH5SlvwGOyg" id="(0.0,0.5319148936170213)"/>
</edges>
</notation:Diagram>

View File

@@ -0,0 +1,51 @@
<?xml version="1.0" encoding="UTF-8"?>
<uml:Model xmi:version="20131001" xmlns:xmi="http://www.omg.org/spec/XMI/20131001" xmlns:uml="http://www.eclipse.org/uml2/5.0.0/UML" xmi:id="_fkueMBNdEeaeH5SlvwGOyg" name="RootElement">
<packagedElement xmi:type="uml:StateMachine" xmi:id="_fk9HsBNdEeaeH5SlvwGOyg" name="StateMachine">
<region xmi:type="uml:Region" xmi:id="_flDOUBNdEeaeH5SlvwGOyg" name="Region1">
<transition xmi:type="uml:Transition" xmi:id="_57dhYBNdEeaeH5SlvwGOyg" source="_qS6fMBNdEeaeH5SlvwGOyg" target="_pOB6wBNdEeaeH5SlvwGOyg"/>
<transition xmi:type="uml:Transition" xmi:id="_Cl9MUBNeEeaeH5SlvwGOyg" source="_pOB6wBNdEeaeH5SlvwGOyg" target="_MQ2W8BOjEeaeH5SlvwGOyg">
<trigger xmi:type="uml:Trigger" xmi:id="_G08VQBNeEeaeH5SlvwGOyg" event="_APOlgBNeEeaeH5SlvwGOyg"/>
</transition>
<transition xmi:type="uml:Transition" xmi:id="_FX-A8BNeEeaeH5SlvwGOyg" source="_2gEYkBNdEeaeH5SlvwGOyg" target="_N5qu4BOjEeaeH5SlvwGOyg"/>
<transition xmi:type="uml:Transition" xmi:id="_ijAXwBNeEeaeH5SlvwGOyg" source="_1a9xsBNdEeaeH5SlvwGOyg" target="_JHMrwBNeEeaeH5SlvwGOyg"/>
<transition xmi:type="uml:Transition" xmi:id="_jHI_kBNeEeaeH5SlvwGOyg" source="_1a9xsBNdEeaeH5SlvwGOyg" target="_PG5kYBNeEeaeH5SlvwGOyg"/>
<transition xmi:type="uml:Transition" xmi:id="_VGKKwBOjEeaeH5SlvwGOyg" source="_MQ2W8BOjEeaeH5SlvwGOyg" target="_1a9xsBNdEeaeH5SlvwGOyg"/>
<transition xmi:type="uml:Transition" xmi:id="_X8014BOjEeaeH5SlvwGOyg" source="_N5qu4BOjEeaeH5SlvwGOyg" target="_vsfL8BNdEeaeH5SlvwGOyg"/>
<subvertex xmi:type="uml:State" xmi:id="_pOB6wBNdEeaeH5SlvwGOyg" name="S1"/>
<subvertex xmi:type="uml:Pseudostate" xmi:id="_qS6fMBNdEeaeH5SlvwGOyg" name=""/>
<subvertex xmi:type="uml:State" xmi:id="_sIjyMBNdEeaeH5SlvwGOyg" name="S2">
<region xmi:type="uml:Region" xmi:id="_uNFOsBNdEeaeH5SlvwGOyg" name="Region1">
<transition xmi:type="uml:Transition" xmi:id="_emjwUBNeEeaeH5SlvwGOyg" source="_ctFGMBNeEeaeH5SlvwGOyg" target="_PG5kYBNeEeaeH5SlvwGOyg"/>
<transition xmi:type="uml:Transition" xmi:id="_gck2wBNeEeaeH5SlvwGOyg" source="_PG5kYBNeEeaeH5SlvwGOyg" target="_TbMEEBNeEeaeH5SlvwGOyg">
<trigger xmi:type="uml:Trigger" xmi:id="_4PAKIBNeEeaeH5SlvwGOyg" event="_szcFwBNeEeaeH5SlvwGOyg"/>
</transition>
<transition xmi:type="uml:Transition" xmi:id="_kZYDgBNeEeaeH5SlvwGOyg" source="_TbMEEBNeEeaeH5SlvwGOyg" target="_2gEYkBNdEeaeH5SlvwGOyg"/>
<subvertex xmi:type="uml:State" xmi:id="_PG5kYBNeEeaeH5SlvwGOyg" name="S220"/>
<subvertex xmi:type="uml:State" xmi:id="_TbMEEBNeEeaeH5SlvwGOyg" name="S221"/>
<subvertex xmi:type="uml:Pseudostate" xmi:id="_ctFGMBNeEeaeH5SlvwGOyg" name=""/>
</region>
<region xmi:type="uml:Region" xmi:id="_usPP4BNdEeaeH5SlvwGOyg" name="Region2">
<transition xmi:type="uml:Transition" xmi:id="_fKxQoBNeEeaeH5SlvwGOyg" source="_bzP7MBNeEeaeH5SlvwGOyg" target="_JHMrwBNeEeaeH5SlvwGOyg"/>
<transition xmi:type="uml:Transition" xmi:id="_fxerUBNeEeaeH5SlvwGOyg" source="_JHMrwBNeEeaeH5SlvwGOyg" target="_SOOhsBNeEeaeH5SlvwGOyg">
<trigger xmi:type="uml:Trigger" xmi:id="_2hlmEBNeEeaeH5SlvwGOyg" event="_qgxfkBNeEeaeH5SlvwGOyg"/>
</transition>
<transition xmi:type="uml:Transition" xmi:id="_jy1A4BNeEeaeH5SlvwGOyg" source="_SOOhsBNeEeaeH5SlvwGOyg" target="_2gEYkBNdEeaeH5SlvwGOyg"/>
<subvertex xmi:type="uml:State" xmi:id="_JHMrwBNeEeaeH5SlvwGOyg" name="S210"/>
<subvertex xmi:type="uml:State" xmi:id="_SOOhsBNeEeaeH5SlvwGOyg" name="S211"/>
<subvertex xmi:type="uml:Pseudostate" xmi:id="_bzP7MBNeEeaeH5SlvwGOyg" name=""/>
</region>
</subvertex>
<subvertex xmi:type="uml:State" xmi:id="_vsfL8BNdEeaeH5SlvwGOyg" name="S3"/>
<subvertex xmi:type="uml:Pseudostate" xmi:id="_1a9xsBNdEeaeH5SlvwGOyg" name="FORK" kind="fork"/>
<subvertex xmi:type="uml:Pseudostate" xmi:id="_2gEYkBNdEeaeH5SlvwGOyg" name="JOIN" kind="join"/>
<subvertex xmi:type="uml:Pseudostate" xmi:id="_MQ2W8BOjEeaeH5SlvwGOyg" name="CHOICE1" kind="choice"/>
<subvertex xmi:type="uml:Pseudostate" xmi:id="_N5qu4BOjEeaeH5SlvwGOyg" name="CHOICE2" kind="choice"/>
</region>
</packagedElement>
<packagedElement xmi:type="uml:Signal" xmi:id="_-93rUBNdEeaeH5SlvwGOyg" name="E1"/>
<packagedElement xmi:type="uml:SignalEvent" xmi:id="_APOlgBNeEeaeH5SlvwGOyg" name="SignalEventE1" signal="_-93rUBNdEeaeH5SlvwGOyg"/>
<packagedElement xmi:type="uml:Signal" xmi:id="_nen9MBNeEeaeH5SlvwGOyg" name="E2"/>
<packagedElement xmi:type="uml:Signal" xmi:id="_otrKQBNeEeaeH5SlvwGOyg" name="E3"/>
<packagedElement xmi:type="uml:SignalEvent" xmi:id="_qgxfkBNeEeaeH5SlvwGOyg" name="SignalEventE2" signal="_nen9MBNeEeaeH5SlvwGOyg"/>
<packagedElement xmi:type="uml:SignalEvent" xmi:id="_szcFwBNeEeaeH5SlvwGOyg" name="SignalEventE3" signal="_otrKQBNeEeaeH5SlvwGOyg"/>
</uml:Model>

View File

@@ -1,5 +1,5 @@
/*
* Copyright 2015 the original author or authors.
* Copyright 2015-2016 the original author or authors.
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
@@ -15,6 +15,8 @@
*/
package org.springframework.statemachine;
import java.util.Collection;
import org.springframework.messaging.Message;
import org.springframework.messaging.MessageHeaders;
import org.springframework.statemachine.action.Action;
@@ -104,7 +106,17 @@ public interface StateContext<S, E> {
*
* @return the source state
*/
State<S,E> getSource();
State<S, E> getSource();
/**
* Gets the source states of this context. Multiple sources are
* only valid during a context when machine is joining from multiple
* orthogonal regions.
*
* @return the source state
* @see #getSource()
*/
Collection<State<S, E>> getSources();
/**
* Gets the target state of this context. Generally target
@@ -113,7 +125,17 @@ public interface StateContext<S, E> {
*
* @return the target state
*/
State<S,E> getTarget();
State<S, E> getTarget();
/**
* Gets the target states of this context. Multiple targets are
* only valid during a context when machine is forking into multiple
* orthogonal regions.
*
* @return the target states
* @see #getTarget()
*/
Collection<State<S, E>> getTargets();
/**
* Gets the exception associated with a context.
@@ -138,5 +160,4 @@ public interface StateContext<S, E> {
TRANSITION_START,
TRANSITION_END;
}
}

View File

@@ -1,5 +1,5 @@
/*
* Copyright 2015 the original author or authors.
* Copyright 2015-2016 the original author or authors.
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
@@ -17,7 +17,6 @@ package org.springframework.statemachine.state;
import java.util.ArrayList;
import java.util.Collection;
import java.util.List;
import org.springframework.messaging.Message;
import org.springframework.statemachine.StateContext;
@@ -159,14 +158,8 @@ public class RegionState<S, E> extends AbstractState<S, E> {
if (getPseudoState() != null && getPseudoState().getKind() == PseudoStateKind.INITIAL) {
for (Region<S, E> region : getRegions()) {
boolean start = true;
PseudoState<S, E> ps = context.getTransition().getTarget().getPseudoState();
if (ps != null && ps.getKind() == PseudoStateKind.FORK) {
List<State<S, E>> forks = ((ForkPseudoState<S, E>)ps).getForks();
if (StateMachineUtils.containsAtleastOne(region.getStates(), forks)) {
// it looks like fork will take directly into a state so don't start
// as we want to bypass initial entry logic.
start = false;
}
if (StateMachineUtils.containsAtleastOne(region.getStates(), context.getTargets())) {
start = false;
}
if (start) {
region.start();

View File

@@ -735,7 +735,7 @@ public abstract class AbstractStateMachine<S, E> extends StateMachineObjectSuppo
ForkPseudoState<S, E> fps = (ForkPseudoState<S, E>) toState.getPseudoState();
for (State<S, E> ss : fps.getForks()) {
callPreStateChangeInterceptors(ss, message, transition, stateMachine);
setCurrentState(ss, message, transition, false, stateMachine);
setCurrentState(ss, message, transition, false, stateMachine, null, fps.getForks());
}
} else {
setCurrentState(toState, message, transition, true, stateMachine);
@@ -811,6 +811,12 @@ public abstract class AbstractStateMachine<S, E> extends StateMachineObjectSuppo
return new DefaultStateContext<S, E>(stage, message, messageHeaders, extendedState, transition, stateMachine, source, target, null);
}
private StateContext<S, E> buildStateContext(Stage stage, Message<E> message, Transition<S,E> transition, StateMachine<S, E> stateMachine, Collection<State<S, E>> sources, Collection<State<S, E>> targets) {
MessageHeaders messageHeaders = message != null ? message.getHeaders() : new MessageHeaders(
new HashMap<String, Object>());
return new DefaultStateContext<S, E>(stage, message, messageHeaders, extendedState, transition, stateMachine, null, null, sources, targets, null);
}
private State<S, E> findDeepParent(State<S, E> state) {
for (State<S, E> s : states) {
if (s.getStates().contains(state)) {
@@ -821,6 +827,11 @@ public abstract class AbstractStateMachine<S, E> extends StateMachineObjectSuppo
}
synchronized void setCurrentState(State<S, E> state, Message<E> message, Transition<S, E> transition, boolean exit, StateMachine<S, E> stateMachine) {
setCurrentState(state, message, transition, exit, stateMachine, null, null);
}
synchronized void setCurrentState(State<S, E> state, Message<E> message, Transition<S, E> transition, boolean exit,
StateMachine<S, E> stateMachine, Collection<State<S, E>> sources, Collection<State<S, E>> targets) {
State<S, E> findDeep = findDeepParent(state);
boolean isTargetSubOf = false;
@@ -901,7 +912,7 @@ public abstract class AbstractStateMachine<S, E> extends StateMachineObjectSuppo
}
currentState = findDeep;
if (shouldTryEntry) {
entryToState(currentState, message, transition, stateMachine);
entryToState(currentState, message, transition, stateMachine, sources, targets);
}
if (currentState.isSubmachineState()) {
@@ -985,11 +996,16 @@ public abstract class AbstractStateMachine<S, E> extends StateMachineObjectSuppo
}
private void entryToState(State<S, E> state, Message<E> message, Transition<S, E> transition, StateMachine<S, E> stateMachine) {
entryToState(state, message, transition, stateMachine, null, null);
}
private void entryToState(State<S, E> state, Message<E> message, Transition<S, E> transition, StateMachine<S, E> stateMachine,
Collection<State<S, E>> sources, Collection<State<S, E>> targets) {
if (state == null) {
return;
}
log.trace("Trying Enter state=[" + state + "]");
StateContext<S, E> stateContext = buildStateContext(Stage.STATE_ENTRY, message, transition, stateMachine);
StateContext<S, E> stateContext = buildStateContext(Stage.STATE_ENTRY, message, transition, stateMachine, sources, targets);
if (transition != null) {
State<S, E> findDeep1 = findDeepParent(transition.getTarget());
@@ -1026,5 +1042,4 @@ public abstract class AbstractStateMachine<S, E> extends StateMachineObjectSuppo
return false;
}
}
}

View File

@@ -1,5 +1,5 @@
/*
* Copyright 2015 the original author or authors.
* Copyright 2015-2016 the original author or authors.
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
@@ -15,6 +15,8 @@
*/
package org.springframework.statemachine.support;
import java.util.Collection;
import org.springframework.messaging.Message;
import org.springframework.messaging.MessageHeaders;
import org.springframework.statemachine.ExtendedState;
@@ -41,6 +43,8 @@ public class DefaultStateContext<S, E> implements StateContext<S, E> {
private final StateMachine<S, E> stateMachine;
private final State<S, E> source;
private final State<S, E> target;
private final Collection<State<S, E>> sources;
private final Collection<State<S, E>> targets;
private final Exception exception;
/**
@@ -67,6 +71,39 @@ public class DefaultStateContext<S, E> implements StateContext<S, E> {
this.source = source;
this.target = target;
this.exception = exception;
this.sources = null;
this.targets = null;
}
/**
* Instantiates a new default state context.
*
* @param stage the stage
* @param message the message
* @param messageHeaders the message headers
* @param extendedState the extended state
* @param transition the transition
* @param stateMachine the state machine
* @param source the source
* @param target the target
* @param sources the sources
* @param targets the targets
* @param exception the exception
*/
public DefaultStateContext(Stage stage, Message<E> message, MessageHeaders messageHeaders, ExtendedState extendedState,
Transition<S, E> transition, StateMachine<S, E> stateMachine, State<S, E> source, State<S, E> target,
Collection<State<S, E>> sources, Collection<State<S, E>> targets, Exception exception) {
this.stage = stage;
this.message = message;
this.messageHeaders = messageHeaders;
this.extendedState = extendedState;
this.transition = transition;
this.stateMachine = stateMachine;
this.source = source;
this.target = target;
this.sources = sources;
this.targets = targets;
this.exception = exception;
}
@Override
@@ -119,11 +156,21 @@ public class DefaultStateContext<S, E> implements StateContext<S, E> {
return source != null ? source : (transition != null ? transition.getSource() : null);
}
@Override
public Collection<State<S, E>> getSources() {
return sources;
}
@Override
public State<S, E> getTarget() {
return target != null ? target : (transition != null ? transition.getTarget() : null);
}
@Override
public Collection<State<S, E>> getTargets() {
return targets;
}
@Override
public Exception getException() {
return exception;
@@ -133,7 +180,6 @@ public class DefaultStateContext<S, E> implements StateContext<S, E> {
public String toString() {
return "DefaultStateContext [stage=" + stage + ", message=" + message + ", messageHeaders=" + messageHeaders + ", extendedState="
+ extendedState + ", transition=" + transition + ", stateMachine=" + stateMachine + ", source=" + source + ", target="
+ target + ", exception=" + exception + "]";
+ target + ", sources=" + sources + ", targets=" + targets + ", exception=" + exception + "]";
}
}