diff --git a/spring-statemachine-data/jpa/src/main/java/org/springframework/statemachine/data/jpa/JpaRepositoryState.java b/spring-statemachine-data/jpa/src/main/java/org/springframework/statemachine/data/jpa/JpaRepositoryState.java index 45d44784..c3216ad0 100644 --- a/spring-statemachine-data/jpa/src/main/java/org/springframework/statemachine/data/jpa/JpaRepositoryState.java +++ b/spring-statemachine-data/jpa/src/main/java/org/springframework/statemachine/data/jpa/JpaRepositoryState.java @@ -17,6 +17,7 @@ package org.springframework.statemachine.data.jpa; import java.util.Set; +import javax.persistence.ElementCollection; import javax.persistence.Entity; import javax.persistence.FetchType; import javax.persistence.GeneratedValue; @@ -63,6 +64,9 @@ public class JpaRepositoryState extends RepositoryState { @OneToMany(fetch = FetchType.EAGER) private Set exitActions; + @ElementCollection(fetch = FetchType.EAGER, targetClass = String.class) + private Set deferredEvents; + /** * Instantiates a new jpa repository state. */ @@ -214,10 +218,20 @@ public class JpaRepositoryState extends RepositoryState { this.exitActions = exitActions; } + @Override + public Set getDeferredEvents() { + return deferredEvents; + } + + public void setDeferredEvents(Set deferredEvents) { + this.deferredEvents = deferredEvents; + } + @Override public String toString() { - return "JpaRepositoryState [id=" + id + ", machineId=" + machineId + ", parentState=" + parentState + ", state=" + state - + ", initial=" + initial + ", stateActions=" + stateActions + ", entryActions=" + entryActions + ", exitActions=" - + exitActions + "]"; + return "JpaRepositoryState [id=" + id + ", machineId=" + machineId + ", state=" + state + ", region=" + region + + ", initial=" + initial + ", kind=" + kind + ", parentState=" + parentState + ", stateActions=" + + stateActions + ", entryActions=" + entryActions + ", exitActions=" + exitActions + ", deferredEvents=" + + deferredEvents + "]"; } } 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 03964b57..3d36bbe7 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 @@ -496,6 +496,25 @@ public class JpaRepositoryTests extends AbstractJpaRepositoryTests { plan.test(); } + @SuppressWarnings("unchecked") + @Test + public void testMachine12() throws Exception { + context.register(Config12.class, FactoryConfig.class); + context.refresh(); + StateMachineFactory stateMachineFactory = context.getBean(StateMachineFactory.class); + StateMachine stateMachine = stateMachineFactory.getStateMachine(); + + StateMachineTestPlan plan = + StateMachineTestPlanBuilder.builder() + .stateMachine(stateMachine) + .step().expectStates("READY").and() + .step().sendEvent("E3").expectStates("S3").and() + .step().sendEvent("E1").expectStates("S3").and() + .step().sendEvent("E6").expectStates("S1").and() + .build(); + plan.test(); + } + @Test public void testPopulate1() { context.register(Config2.class); @@ -699,6 +718,17 @@ public class JpaRepositoryTests extends AbstractJpaRepositoryTests { } } + @EnableAutoConfiguration + static class Config12 { + + @Bean + public StateMachineJackson2RepositoryPopulatorFactoryBean jackson2RepositoryPopulatorFactoryBean() { + StateMachineJackson2RepositoryPopulatorFactoryBean factoryBean = new StateMachineJackson2RepositoryPopulatorFactoryBean(); + factoryBean.setResources(new Resource[]{new ClassPathResource("data12.json")}); + return factoryBean; + } + } + @Configuration @EnableStateMachineFactory public static class FactoryConfig extends StateMachineConfigurerAdapter { diff --git a/spring-statemachine-data/jpa/src/test/resources/data12.json b/spring-statemachine-data/jpa/src/test/resources/data12.json new file mode 100644 index 00000000..ac83d0c6 --- /dev/null +++ b/spring-statemachine-data/jpa/src/test/resources/data12.json @@ -0,0 +1,60 @@ +[ + { + "@id": "1", + "_class": "org.springframework.statemachine.data.jpa.JpaRepositoryState", + "initial": true, + "state": "READY" + }, + { + "@id": "2", + "_class": "org.springframework.statemachine.data.jpa.JpaRepositoryState", + "state": "S1" + }, + { + "@id": "3", + "_class": "org.springframework.statemachine.data.jpa.JpaRepositoryState", + "state": "S2" + }, + { + "@id": "4", + "_class": "org.springframework.statemachine.data.jpa.JpaRepositoryState", + "state": "S3", + "deferredEvents": ["E1", "E2"] + }, + { + "_class": "org.springframework.statemachine.data.jpa.JpaRepositoryTransition", + "source": "1", + "target": "2", + "event": "E1" + }, + { + "_class": "org.springframework.statemachine.data.jpa.JpaRepositoryTransition", + "source": "1", + "target": "3", + "event": "E2" + }, + { + "_class": "org.springframework.statemachine.data.jpa.JpaRepositoryTransition", + "source": "1", + "target": "4", + "event": "E3" + }, + { + "_class": "org.springframework.statemachine.data.jpa.JpaRepositoryTransition", + "source": "4", + "target": "2", + "event": "E4" + }, + { + "_class": "org.springframework.statemachine.data.jpa.JpaRepositoryTransition", + "source": "4", + "target": "3", + "event": "E5" + }, + { + "_class": "org.springframework.statemachine.data.jpa.JpaRepositoryTransition", + "source": "4", + "target": "1", + "event": "E6" + } +] diff --git a/spring-statemachine-data/src/main/java/org/springframework/statemachine/data/RepositoryState.java b/spring-statemachine-data/src/main/java/org/springframework/statemachine/data/RepositoryState.java index 62942331..0ddba17f 100644 --- a/spring-statemachine-data/src/main/java/org/springframework/statemachine/data/RepositoryState.java +++ b/spring-statemachine-data/src/main/java/org/springframework/statemachine/data/RepositoryState.java @@ -89,4 +89,11 @@ public abstract class RepositoryState extends BaseRepositoryEntity { * @return the pseudo state kind */ public abstract PseudoStateKind getKind(); + + /** + * Gets the deferred events. + * + * @return the deferred events + */ + public abstract Set getDeferredEvents(); } 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 a8de94af..e514f1b7 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 @@ -155,6 +155,7 @@ public class RepositoryStateMachineModelFactory extends AbstractStateMachineMode stateData.setEnd(true); } } + stateData.setDeferred(s.getDeferredEvents()); stateDatas.add(stateData); } StatesData statesData = new StatesData<>(stateDatas);