From 543c906c354b2b2c2d3b7af66f15422b48bbcc03 Mon Sep 17 00:00:00 2001 From: Janne Valkealahti Date: Tue, 11 Oct 2016 15:43:02 +0100 Subject: [PATCH] Add support for entry/exit states - Adding entry/exit state construction - Relates to #262 --- .../data/jpa/JpaRepositoryTests.java | 29 ++++ .../jpa/src/test/resources/data9.json | 131 ++++++++++++++++++ .../RepositoryStateMachineModelFactory.java | 13 +- 3 files changed, 171 insertions(+), 2 deletions(-) create mode 100644 spring-statemachine-data/jpa/src/test/resources/data9.json diff --git a/spring-statemachine-data/jpa/src/test/java/org/springframework/statemachine/data/jpa/JpaRepositoryTests.java b/spring-statemachine-data/jpa/src/test/java/org/springframework/statemachine/data/jpa/JpaRepositoryTests.java index 15ff6baa..beb8c929 100644 --- a/spring-statemachine-data/jpa/src/test/java/org/springframework/statemachine/data/jpa/JpaRepositoryTests.java +++ b/spring-statemachine-data/jpa/src/test/java/org/springframework/statemachine/data/jpa/JpaRepositoryTests.java @@ -425,6 +425,24 @@ public class JpaRepositoryTests extends AbstractJpaRepositoryTests { plan.test(); } + @SuppressWarnings("unchecked") + @Test + public void testMachine9() throws Exception { + context.register(Config9.class, FactoryConfig.class); + context.refresh(); + StateMachineFactory stateMachineFactory = context.getBean(StateMachineFactory.class); + StateMachine stateMachine = stateMachineFactory.getStateMachine(); + + StateMachineTestPlan plan = + StateMachineTestPlanBuilder.builder() + .stateMachine(stateMachine) + .step().expectStates("S1").and() + .step().sendEvent("ENTRY1").expectStates("S2", "S22").and() + .step().sendEvent("EXIT1").expectStates("S4").and() + .build(); + plan.test(); + } + @Test public void testPopulate1() { context.register(Config2.class); @@ -595,6 +613,17 @@ public class JpaRepositoryTests extends AbstractJpaRepositoryTests { } + @EnableAutoConfiguration + static class Config9 { + + @Bean + public StateMachineJackson2RepositoryPopulatorFactoryBean jackson2RepositoryPopulatorFactoryBean() { + StateMachineJackson2RepositoryPopulatorFactoryBean factoryBean = new StateMachineJackson2RepositoryPopulatorFactoryBean(); + factoryBean.setResources(new Resource[]{new ClassPathResource("data9.json")}); + return factoryBean; + } + } + @Configuration @EnableStateMachineFactory public static class FactoryConfig extends StateMachineConfigurerAdapter { diff --git a/spring-statemachine-data/jpa/src/test/resources/data9.json b/spring-statemachine-data/jpa/src/test/resources/data9.json new file mode 100644 index 00000000..0a53d365 --- /dev/null +++ b/spring-statemachine-data/jpa/src/test/resources/data9.json @@ -0,0 +1,131 @@ +[ + { + "@id": "1", + "_class": "org.springframework.statemachine.data.jpa.JpaRepositoryState", + "initial": true, + "state": "S1" + }, + { + "@id": "2", + "_class": "org.springframework.statemachine.data.jpa.JpaRepositoryState", + "state": "S2" + }, + { + "@id": "3", + "_class": "org.springframework.statemachine.data.jpa.JpaRepositoryState", + "state": "S3" + }, + { + "@id": "4", + "_class": "org.springframework.statemachine.data.jpa.JpaRepositoryState", + "state": "S4" + }, + { + "@id": "5", + "_class": "org.springframework.statemachine.data.jpa.JpaRepositoryState", + "state": "S5" + }, + { + "@id": "6", + "_class": "org.springframework.statemachine.data.jpa.JpaRepositoryState", + "initial": true, + "state": "S21", + "parentState": "2" + }, + { + "@id": "7", + "_class": "org.springframework.statemachine.data.jpa.JpaRepositoryState", + "state": "S22", + "parentState": "2" + }, + { + "@id": "8", + "_class": "org.springframework.statemachine.data.jpa.JpaRepositoryState", + "state": "S23", + "parentState": "2" + }, + { + "@id": "9", + "_class": "org.springframework.statemachine.data.jpa.JpaRepositoryState", + "state": "S2ENTRY1", + "parentState": "2", + "kind": "ENTRY" + }, + { + "@id": "10", + "_class": "org.springframework.statemachine.data.jpa.JpaRepositoryState", + "state": "S2ENTRY2", + "parentState": "2", + "kind": "ENTRY" + }, + { + "@id": "11", + "_class": "org.springframework.statemachine.data.jpa.JpaRepositoryState", + "state": "S2EXIT1", + "parentState": "2", + "kind": "EXIT" + }, + { + "@id": "12", + "_class": "org.springframework.statemachine.data.jpa.JpaRepositoryState", + "state": "S2EXIT2", + "parentState": "2", + "kind": "EXIT" + }, + { + "_class": "org.springframework.statemachine.data.jpa.JpaRepositoryTransition", + "source": "1", + "target": "2", + "event": "E1" + }, + { + "_class": "org.springframework.statemachine.data.jpa.JpaRepositoryTransition", + "source": "2", + "target": "3", + "event": "E2" + }, + { + "_class": "org.springframework.statemachine.data.jpa.JpaRepositoryTransition", + "source": "1", + "target": "9", + "event": "ENTRY1" + }, + { + "_class": "org.springframework.statemachine.data.jpa.JpaRepositoryTransition", + "source": "1", + "target": "10", + "event": "ENTRY2" + }, + { + "_class": "org.springframework.statemachine.data.jpa.JpaRepositoryTransition", + "source": "7", + "target": "11", + "event": "EXIT1" + }, + { + "_class": "org.springframework.statemachine.data.jpa.JpaRepositoryTransition", + "source": "7", + "target": "12", + "event": "EXIT2" + }, + { + "_class": "org.springframework.statemachine.data.jpa.JpaRepositoryTransition", + "source": "9", + "target": "7" + }, + { + "_class": "org.springframework.statemachine.data.jpa.JpaRepositoryTransition", + "source": "10", + "target": "9" + }, + { + "_class": "org.springframework.statemachine.data.jpa.JpaRepositoryTransition", + "source": "11", + "target": "4" + }, + { + "_class": "org.springframework.statemachine.data.jpa.JpaRepositoryTransition", + "source": "12", + "target": "5" + } +] diff --git a/spring-statemachine-data/src/main/java/org/springframework/statemachine/data/RepositoryStateMachineModelFactory.java b/spring-statemachine-data/src/main/java/org/springframework/statemachine/data/RepositoryStateMachineModelFactory.java index 8f0e2964..02df20af 100644 --- a/spring-statemachine-data/src/main/java/org/springframework/statemachine/data/RepositoryStateMachineModelFactory.java +++ b/spring-statemachine-data/src/main/java/org/springframework/statemachine/data/RepositoryStateMachineModelFactory.java @@ -32,6 +32,8 @@ import org.springframework.statemachine.config.model.AbstractStateMachineModelFa import org.springframework.statemachine.config.model.ChoiceData; import org.springframework.statemachine.config.model.ConfigurationData; import org.springframework.statemachine.config.model.DefaultStateMachineModel; +import org.springframework.statemachine.config.model.EntryData; +import org.springframework.statemachine.config.model.ExitData; import org.springframework.statemachine.config.model.HistoryData; import org.springframework.statemachine.config.model.JunctionData; import org.springframework.statemachine.config.model.StateData; @@ -154,6 +156,8 @@ public class RepositoryStateMachineModelFactory extends AbstractStateMachineMode } StatesData statesData = new StatesData<>(stateDatas); Collection> transitionData = new ArrayList<>(); + Collection> entrys = new ArrayList>(); + Collection> exits = new ArrayList>(); Collection> historys = new ArrayList>(); Map>> choices = new HashMap>>(); Map>> junctions = new HashMap>>(); @@ -183,7 +187,11 @@ public class RepositoryStateMachineModelFactory extends AbstractStateMachineMode Guard guard = resolveGuard(t); transitionData.add(new TransitionData<>(t.getSource().getState(), t.getTarget().getState(), t.getEvent(), actions, guard, kind != null ? kind : TransitionKind.EXTERNAL)); - if (t.getSource().getKind() == PseudoStateKind.CHOICE) { + if (t.getSource().getKind() == PseudoStateKind.ENTRY) { + entrys.add(new EntryData(t.getSource().getState(), t.getTarget().getState())); + } else if (t.getSource().getKind() == PseudoStateKind.EXIT) { + exits.add(new ExitData(t.getSource().getState(), t.getTarget().getState())); + } else if (t.getSource().getKind() == PseudoStateKind.CHOICE) { LinkedList> list = choices.get(t.getSource().getState()); if (list == null) { list = new LinkedList>(); @@ -221,7 +229,8 @@ public class RepositoryStateMachineModelFactory extends AbstractStateMachineMode HashMap>> junctionsCopy = new HashMap>>(); junctionsCopy.putAll(junctions); - TransitionsData transitionsData = new TransitionsData<>(transitionData, choicesCopy, junctionsCopy, null, null, null, null, historys); + TransitionsData transitionsData = new TransitionsData<>(transitionData, choicesCopy, junctionsCopy, null, null, + entrys, exits, historys); StateMachineModel stateMachineModel = new DefaultStateMachineModel<>(configurationData, statesData, transitionsData); return stateMachineModel;