From 5165221d84436763d1db18564c8ae420428f94e2 Mon Sep 17 00:00:00 2001 From: Janne Valkealahti Date: Sat, 16 Apr 2016 15:36:26 +0100 Subject: [PATCH] Add history state support for uml model - Relates to #193 --- .../statemachine/uml/UmlModelParser.java | 8 + .../uml/UmlStateMachineModelFactoryTests.java | 72 +++++ .../statemachine/uml/simple-history-deep.di | 2 + .../uml/simple-history-deep.notation | 285 ++++++++++++++++++ .../statemachine/uml/simple-history-deep.uml | 46 +++ .../uml/simple-history-shallow.di | 2 + .../uml/simple-history-shallow.notation | 216 +++++++++++++ .../uml/simple-history-shallow.uml | 39 +++ 8 files changed, 670 insertions(+) create mode 100644 spring-statemachine-uml/src/test/resources/org/springframework/statemachine/uml/simple-history-deep.di create mode 100644 spring-statemachine-uml/src/test/resources/org/springframework/statemachine/uml/simple-history-deep.notation create mode 100644 spring-statemachine-uml/src/test/resources/org/springframework/statemachine/uml/simple-history-deep.uml create mode 100644 spring-statemachine-uml/src/test/resources/org/springframework/statemachine/uml/simple-history-shallow.di create mode 100644 spring-statemachine-uml/src/test/resources/org/springframework/statemachine/uml/simple-history-shallow.notation create mode 100644 spring-statemachine-uml/src/test/resources/org/springframework/statemachine/uml/simple-history-shallow.uml diff --git a/spring-statemachine-uml/src/main/java/org/springframework/statemachine/uml/UmlModelParser.java b/spring-statemachine-uml/src/main/java/org/springframework/statemachine/uml/UmlModelParser.java index a5b63aea..ac8b374b 100644 --- a/spring-statemachine-uml/src/main/java/org/springframework/statemachine/uml/UmlModelParser.java +++ b/spring-statemachine-uml/src/main/java/org/springframework/statemachine/uml/UmlModelParser.java @@ -174,6 +174,14 @@ public class UmlModelParser { StateData cpStateData = new StateData<>(parent, regionId, state.getName(), false); cpStateData.setPseudoStateKind(PseudoStateKind.JOIN); stateDatas.add(cpStateData); + } else if (state.getKind() == PseudostateKind.SHALLOW_HISTORY_LITERAL) { + StateData cpStateData = new StateData<>(parent, regionId, state.getName(), false); + cpStateData.setPseudoStateKind(PseudoStateKind.HISTORY_SHALLOW); + stateDatas.add(cpStateData); + } else if (state.getKind() == PseudostateKind.DEEP_HISTORY_LITERAL) { + StateData cpStateData = new StateData<>(parent, regionId, state.getName(), false); + cpStateData.setPseudoStateKind(PseudoStateKind.HISTORY_DEEP); + stateDatas.add(cpStateData); } } } diff --git a/spring-statemachine-uml/src/test/java/org/springframework/statemachine/uml/UmlStateMachineModelFactoryTests.java b/spring-statemachine-uml/src/test/java/org/springframework/statemachine/uml/UmlStateMachineModelFactoryTests.java index 4e05d09f..c2795454 100644 --- a/spring-statemachine-uml/src/test/java/org/springframework/statemachine/uml/UmlStateMachineModelFactoryTests.java +++ b/spring-statemachine-uml/src/test/java/org/springframework/statemachine/uml/UmlStateMachineModelFactoryTests.java @@ -312,6 +312,42 @@ public class UmlStateMachineModelFactoryTests extends AbstractUmlTests { assertThat(stateMachine.getState().getIds(), containsInAnyOrder("SF")); } + @Test + @SuppressWarnings("unchecked") + public void testSimpleHistoryShallow() { + context.register(Config8.class); + context.refresh(); + StateMachine stateMachine = context.getBean(StateMachine.class); + stateMachine.start(); + assertThat(stateMachine.getState().getIds(), containsInAnyOrder("S1")); + stateMachine.sendEvent("E1"); + assertThat(stateMachine.getState().getIds(), containsInAnyOrder("S2", "S20")); + stateMachine.sendEvent("E2"); + assertThat(stateMachine.getState().getIds(), containsInAnyOrder("S2", "S21")); + stateMachine.sendEvent("E3"); + assertThat(stateMachine.getState().getIds(), containsInAnyOrder("S1")); + stateMachine.sendEvent("E4"); + assertThat(stateMachine.getState().getIds(), containsInAnyOrder("S2", "S21")); + } + + @Test + @SuppressWarnings("unchecked") + public void testSimpleHistoryDeep() { + context.register(Config9.class); + context.refresh(); + StateMachine stateMachine = context.getBean(StateMachine.class); + stateMachine.start(); + assertThat(stateMachine.getState().getIds(), containsInAnyOrder("S1")); + stateMachine.sendEvent("E1"); + assertThat(stateMachine.getState().getIds(), containsInAnyOrder("S2", "S21", "S211")); + stateMachine.sendEvent("E2"); + assertThat(stateMachine.getState().getIds(), containsInAnyOrder("S2", "S21", "S212")); + stateMachine.sendEvent("E3"); + assertThat(stateMachine.getState().getIds(), containsInAnyOrder("S1")); + stateMachine.sendEvent("E4"); + assertThat(stateMachine.getState().getIds(), containsInAnyOrder("S2", "S21", "S212")); + } + @Configuration @EnableStateMachine public static class Config2 extends StateMachineConfigurerAdapter { @@ -435,6 +471,42 @@ public class UmlStateMachineModelFactoryTests extends AbstractUmlTests { } } + @Configuration + @EnableStateMachine + public static class Config8 extends StateMachineConfigurerAdapter { + + @Override + public void configure(StateMachineModelConfigurer model) throws Exception { + model + .withModel() + .factory(modelFactory()); + } + + @Bean + public StateMachineModelFactory modelFactory() { + Resource model = new ClassPathResource("org/springframework/statemachine/uml/simple-history-shallow.uml"); + return new UmlStateMachineModelFactory(model); + } + } + + @Configuration + @EnableStateMachine + public static class Config9 extends StateMachineConfigurerAdapter { + + @Override + public void configure(StateMachineModelConfigurer model) throws Exception { + model + .withModel() + .factory(modelFactory()); + } + + @Bean + public StateMachineModelFactory modelFactory() { + Resource model = new ClassPathResource("org/springframework/statemachine/uml/simple-history-deep.uml"); + return new UmlStateMachineModelFactory(model); + } + } + public static class LatchAction implements Action { CountDownLatch latch = new CountDownLatch(1); @Override diff --git a/spring-statemachine-uml/src/test/resources/org/springframework/statemachine/uml/simple-history-deep.di b/spring-statemachine-uml/src/test/resources/org/springframework/statemachine/uml/simple-history-deep.di new file mode 100644 index 00000000..bf9abab3 --- /dev/null +++ b/spring-statemachine-uml/src/test/resources/org/springframework/statemachine/uml/simple-history-deep.di @@ -0,0 +1,2 @@ + + diff --git a/spring-statemachine-uml/src/test/resources/org/springframework/statemachine/uml/simple-history-deep.notation b/spring-statemachine-uml/src/test/resources/org/springframework/statemachine/uml/simple-history-deep.notation new file mode 100644 index 00000000..2be85279 --- /dev/null +++ b/spring-statemachine-uml/src/test/resources/org/springframework/statemachine/uml/simple-history-deep.notation @@ -0,0 +1,285 @@ + + + + + + + + + +
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ + + +
+ + + + + + + + + + + + + + + + + + + + + + + + +
+ + + +
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/spring-statemachine-uml/src/test/resources/org/springframework/statemachine/uml/simple-history-deep.uml b/spring-statemachine-uml/src/test/resources/org/springframework/statemachine/uml/simple-history-deep.uml new file mode 100644 index 00000000..2a949102 --- /dev/null +++ b/spring-statemachine-uml/src/test/resources/org/springframework/statemachine/uml/simple-history-deep.uml @@ -0,0 +1,46 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/spring-statemachine-uml/src/test/resources/org/springframework/statemachine/uml/simple-history-shallow.di b/spring-statemachine-uml/src/test/resources/org/springframework/statemachine/uml/simple-history-shallow.di new file mode 100644 index 00000000..bf9abab3 --- /dev/null +++ b/spring-statemachine-uml/src/test/resources/org/springframework/statemachine/uml/simple-history-shallow.di @@ -0,0 +1,2 @@ + + diff --git a/spring-statemachine-uml/src/test/resources/org/springframework/statemachine/uml/simple-history-shallow.notation b/spring-statemachine-uml/src/test/resources/org/springframework/statemachine/uml/simple-history-shallow.notation new file mode 100644 index 00000000..b555137a --- /dev/null +++ b/spring-statemachine-uml/src/test/resources/org/springframework/statemachine/uml/simple-history-shallow.notation @@ -0,0 +1,216 @@ + + + + + + + + + +
+ + + + + + + + + + + + + + + + + + + + + + + + +
+ + + +
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/spring-statemachine-uml/src/test/resources/org/springframework/statemachine/uml/simple-history-shallow.uml b/spring-statemachine-uml/src/test/resources/org/springframework/statemachine/uml/simple-history-shallow.uml new file mode 100644 index 00000000..663ad2af --- /dev/null +++ b/spring-statemachine-uml/src/test/resources/org/springframework/statemachine/uml/simple-history-shallow.uml @@ -0,0 +1,39 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +