From 49bae38eb3847d04096c72597a15716e03736361 Mon Sep 17 00:00:00 2001 From: Janne Valkealahti Date: Sun, 25 Sep 2016 10:08:57 +0100 Subject: [PATCH] Hook StateMachineModelFactory and StateMachineFactory together - Change so that machine id used in StateMachineFactory can use same id in StateMachineModelFactory which now extended with method build(String machineId). - Polish repo and jpa classes. - Fixes #255 --- .../config/AbstractStateMachineFactory.java | 6 +-- .../AbstractStateMachineModelFactory.java | 11 +++++- .../model/StateMachineModelFactory.java | 11 ++++++ .../model/StateMachineModelFactoryTests.java | 5 +++ .../docs/DocsConfigurationSampleTests8.java | 5 +++ .../data/jpa/JpaRepositoryState.java | 34 ++++++++++++++--- .../data/jpa/JpaRepositoryTransition.java | 27 +++++++++++-- .../data/jpa/JpaRepositoryTests.java | 38 +++++++++++++++++++ .../statemachine/data/RepositoryState.java | 21 ++++++++-- .../RepositoryStateMachineModelFactory.java | 9 ++++- .../data/RepositoryTransition.java | 28 +++++++++++--- .../statemachine/data/StateRepository.java | 10 +++++ .../data/TransitionRepository.java | 10 +++++ 13 files changed, 191 insertions(+), 24 deletions(-) diff --git a/spring-statemachine-core/src/main/java/org/springframework/statemachine/config/AbstractStateMachineFactory.java b/spring-statemachine-core/src/main/java/org/springframework/statemachine/config/AbstractStateMachineFactory.java index fcb9101a..bdbcea66 100644 --- a/spring-statemachine-core/src/main/java/org/springframework/statemachine/config/AbstractStateMachineFactory.java +++ b/spring-statemachine-core/src/main/java/org/springframework/statemachine/config/AbstractStateMachineFactory.java @@ -152,7 +152,7 @@ public abstract class AbstractStateMachineFactory extends LifecycleObjectS */ @SuppressWarnings("unchecked") public StateMachine getStateMachine(UUID uuid, String machineId) { - StateMachineModel stateMachineModel = resolveStateMachineModel(); + StateMachineModel stateMachineModel = resolveStateMachineModel(machineId); if (stateMachineModel.getConfigurationData().isVerifierEnabled()) { StateMachineModelVerifier verifier = stateMachineModel.getConfigurationData().getVerifier(); if (verifier == null) { @@ -355,11 +355,11 @@ public abstract class AbstractStateMachineFactory extends LifecycleObjectS } } - protected StateMachineModel resolveStateMachineModel() { + protected StateMachineModel resolveStateMachineModel(String machineId) { if (stateMachineModelFactory == null) { return defaultStateMachineModel; } else { - StateMachineModel m = stateMachineModelFactory.build(); + StateMachineModel m = stateMachineModelFactory.build(machineId); if (m.getConfigurationData() == null) { // if model doesn't have explicit configuration data, // get it from default model diff --git a/spring-statemachine-core/src/main/java/org/springframework/statemachine/config/model/AbstractStateMachineModelFactory.java b/spring-statemachine-core/src/main/java/org/springframework/statemachine/config/model/AbstractStateMachineModelFactory.java index 453712f2..fd025314 100644 --- a/spring-statemachine-core/src/main/java/org/springframework/statemachine/config/model/AbstractStateMachineModelFactory.java +++ b/spring-statemachine-core/src/main/java/org/springframework/statemachine/config/model/AbstractStateMachineModelFactory.java @@ -39,7 +39,8 @@ import org.springframework.util.Assert; * @param the type of state * @param the type of event */ -public abstract class AbstractStateMachineModelFactory implements StateMachineComponentResolver, BeanFactoryAware, ResourceLoaderAware { +public abstract class AbstractStateMachineModelFactory + implements StateMachineComponentResolver, StateMachineModelFactory, BeanFactoryAware, ResourceLoaderAware { private BeanFactory beanFactory; private ResourceLoader resourceLoader = new DefaultResourceLoader(); @@ -76,6 +77,14 @@ public abstract class AbstractStateMachineModelFactory implements StateMac this.resourceLoader = resourceLoader; } + @Override + public StateMachineModel build(String machineId) { + return build(); + } + + @Override + public abstract StateMachineModel build(); + /** * Sets the state machine component resolver. * diff --git a/spring-statemachine-core/src/main/java/org/springframework/statemachine/config/model/StateMachineModelFactory.java b/spring-statemachine-core/src/main/java/org/springframework/statemachine/config/model/StateMachineModelFactory.java index eff7f9ca..7997745c 100644 --- a/spring-statemachine-core/src/main/java/org/springframework/statemachine/config/model/StateMachineModelFactory.java +++ b/spring-statemachine-core/src/main/java/org/springframework/statemachine/config/model/StateMachineModelFactory.java @@ -31,4 +31,15 @@ public interface StateMachineModelFactory { * @return the state machine model */ StateMachineModel build(); + + /** + * Builds the state machine model with a given {@code machineId}. + * Implementation is free to choose what to do with a given {@code machineId} + * but usually it might map to a different configurations supported + * by storage or repository in a factory. + * + * @param machineId the machine id + * @return the state machine model + */ + StateMachineModel build(String machineId); } diff --git a/spring-statemachine-core/src/test/java/org/springframework/statemachine/config/model/StateMachineModelFactoryTests.java b/spring-statemachine-core/src/test/java/org/springframework/statemachine/config/model/StateMachineModelFactoryTests.java index 1492e03d..ee3c0e13 100644 --- a/spring-statemachine-core/src/test/java/org/springframework/statemachine/config/model/StateMachineModelFactoryTests.java +++ b/spring-statemachine-core/src/test/java/org/springframework/statemachine/config/model/StateMachineModelFactoryTests.java @@ -194,6 +194,11 @@ public class StateMachineModelFactoryTests extends AbstractStateMachineTests { public void setBeanFactory(BeanFactory beanFactory) throws BeansException { this.beanFactory = beanFactory; } + + @Override + public StateMachineModel build(String machineId) { + return build(); + } } @Override diff --git a/spring-statemachine-core/src/test/java/org/springframework/statemachine/docs/DocsConfigurationSampleTests8.java b/spring-statemachine-core/src/test/java/org/springframework/statemachine/docs/DocsConfigurationSampleTests8.java index 8440f4aa..edf7b919 100644 --- a/spring-statemachine-core/src/test/java/org/springframework/statemachine/docs/DocsConfigurationSampleTests8.java +++ b/spring-statemachine-core/src/test/java/org/springframework/statemachine/docs/DocsConfigurationSampleTests8.java @@ -70,6 +70,11 @@ public class DocsConfigurationSampleTests8 { statesData, transitionsData); return stateMachineModel; } + + @Override + public StateMachineModel build(String machineId) { + return build(); + } } // end::snippetB[] } 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 43bdb152..b9d83c62 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 @@ -35,8 +35,9 @@ public class JpaRepositoryState implements RepositoryState { @GeneratedValue(strategy = GenerationType.AUTO) private long id; - protected String state; - protected boolean initial; + private String machineId; + private String state; + private boolean initial; /** * Instantiates a new jpa repository state. @@ -44,6 +45,11 @@ public class JpaRepositoryState implements RepositoryState { public JpaRepositoryState() { } + /** + * Instantiates a new jpa repository state. + * + * @param state the state + */ public JpaRepositoryState(String state) { this.state = state; } @@ -55,17 +61,36 @@ public class JpaRepositoryState implements RepositoryState { * @param initial the initial */ public JpaRepositoryState(String state, boolean initial) { - super(); + this(null, state, initial); + } + + /** + * Instantiates a new jpa repository state. + * + * @param machineId the machine id + * @param state the state + * @param initial the initial + */ + public JpaRepositoryState(String machineId, String state, boolean initial) { + this.machineId = machineId; this.state = state; this.initial = initial; } + @Override + public String getMachineId() { + return machineId; + } + + public void setMachineId(String machineId) { + this.machineId = machineId; + } + @Override public String getState() { return state; } - @Override public void setState(String state) { this.state = state; } @@ -75,7 +100,6 @@ public class JpaRepositoryState implements RepositoryState { return initial; } - @Override public void setInitial(boolean initial) { this.initial = initial; } diff --git a/spring-statemachine-data/jpa/src/main/java/org/springframework/statemachine/data/jpa/JpaRepositoryTransition.java b/spring-statemachine-data/jpa/src/main/java/org/springframework/statemachine/data/jpa/JpaRepositoryTransition.java index e9998147..a2ab5b5f 100644 --- a/spring-statemachine-data/jpa/src/main/java/org/springframework/statemachine/data/jpa/JpaRepositoryTransition.java +++ b/spring-statemachine-data/jpa/src/main/java/org/springframework/statemachine/data/jpa/JpaRepositoryTransition.java @@ -35,6 +35,7 @@ public class JpaRepositoryTransition implements RepositoryTransition { @GeneratedValue(strategy = GenerationType.AUTO) private long id; + private String machineId; private String source; private String target; private String event; @@ -43,6 +44,7 @@ public class JpaRepositoryTransition implements RepositoryTransition { * Instantiates a new jpa repository transition. */ public JpaRepositoryTransition() { + this(null, null, null); } /** @@ -53,17 +55,38 @@ public class JpaRepositoryTransition implements RepositoryTransition { * @param event the event */ public JpaRepositoryTransition(String source, String target, String event) { + this(null, source, target, event); + } + + /** + * Instantiates a new jpa repository transition. + * + * @param machineId the machine id + * @param source the source + * @param target the target + * @param event the event + */ + public JpaRepositoryTransition(String machineId, String source, String target, String event) { + this.machineId = machineId; this.source = source; this.target = target; this.event = event; } + @Override + public String getMachineId() { + return machineId; + } + + public void setMachineId(String machineId) { + this.machineId = machineId; + } + @Override public String getSource() { return source; } - @Override public void setSource(String source) { this.source = source; } @@ -73,7 +96,6 @@ public class JpaRepositoryTransition implements RepositoryTransition { return target; } - @Override public void setTarget(String target) { this.target = target; } @@ -83,7 +105,6 @@ public class JpaRepositoryTransition implements RepositoryTransition { return event; } - @Override public void setEvent(String event) { this.event = event; } 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 a662e4b0..b2ce05af 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 @@ -18,6 +18,8 @@ package org.springframework.statemachine.data.jpa; import static org.hamcrest.CoreMatchers.is; import static org.junit.Assert.assertThat; +import java.util.List; + import org.junit.Test; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.boot.autoconfigure.EnableAutoConfiguration; @@ -80,6 +82,42 @@ public class JpaRepositoryTests { context.close(); } + @Test + public void testRepository3() { + AnnotationConfigApplicationContext context = new AnnotationConfigApplicationContext(); + context.register(Config.class); + context.refresh(); + + JpaStateRepository statesRepository = context.getBean(JpaStateRepository.class); + JpaRepositoryState state1 = new JpaRepositoryState("machine1", "S1", true); + statesRepository.save(state1); + JpaRepositoryState state2 = new JpaRepositoryState("machine2", "S2", false); + statesRepository.save(state2); + + List findByMachineId1 = statesRepository.findByMachineId("machine1"); + List findByMachineId2 = statesRepository.findByMachineId("machine2"); + assertThat(findByMachineId1.size(), is(1)); + assertThat(findByMachineId2.size(), is(1)); + assertThat(findByMachineId1.get(0).getMachineId(), is("machine1")); + assertThat(findByMachineId2.get(0).getMachineId(), is("machine2")); + + + JpaTransitionRepository transitionsRepository = context.getBean(JpaTransitionRepository.class); + JpaRepositoryTransition transition1 = new JpaRepositoryTransition("machine1", "S1", "S2", "E1"); + JpaRepositoryTransition transition2 = new JpaRepositoryTransition("machine2", "S3", "S4", "E2"); + transitionsRepository.save(transition1); + transitionsRepository.save(transition2); + List findByMachineId3 = transitionsRepository.findByMachineId("machine1"); + List findByMachineId4 = transitionsRepository.findByMachineId("machine2"); + + assertThat(findByMachineId3.size(), is(1)); + assertThat(findByMachineId4.size(), is(1)); + assertThat(findByMachineId3.get(0).getMachineId(), is("machine1")); + assertThat(findByMachineId4.get(0).getMachineId(), is("machine2")); + + context.close(); + } + @Test public void testAutowire() { AnnotationConfigApplicationContext context = new AnnotationConfigApplicationContext(); 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 8610f2f0..1f5c1342 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 @@ -23,11 +23,24 @@ package org.springframework.statemachine.data; */ public interface RepositoryState { + /** + * Gets the machine id. + * + * @return the machine id + */ + String getMachineId(); + + /** + * Gets the state. + * + * @return the state + */ String getState(); - void setState(String state); - + /** + * Checks if is initial. + * + * @return true, if is initial + */ boolean isInitial(); - - void setInitial(boolean initial); } 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 0030ba45..a6dabdb3 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 @@ -53,16 +53,21 @@ public class RepositoryStateMachineModelFactory implements StateMachineModelFact @Override public StateMachineModel build() { + return build(null); + } + + @Override + public StateMachineModel build(String machineId) { ConfigurationData configurationData = new ConfigurationData<>(); Collection> stateData = new ArrayList<>(); - for (RepositoryState s : stateRepository.findAll()) { + for (RepositoryState s : stateRepository.findByMachineId(machineId)) { stateData.add(new StateData(s.getState(), s.isInitial())); } StatesData statesData = new StatesData<>(stateData); Collection> transitionData = new ArrayList<>(); - for (RepositoryTransition t : transitionRepository.findAll()) { + for (RepositoryTransition t : transitionRepository.findByMachineId(machineId)) { transitionData.add(new TransitionData(t.getSource(), t.getTarget(), t.getEvent())); } TransitionsData transitionsData = new TransitionsData<>(transitionData); diff --git a/spring-statemachine-data/src/main/java/org/springframework/statemachine/data/RepositoryTransition.java b/spring-statemachine-data/src/main/java/org/springframework/statemachine/data/RepositoryTransition.java index 6da1c17f..743fafb3 100644 --- a/spring-statemachine-data/src/main/java/org/springframework/statemachine/data/RepositoryTransition.java +++ b/spring-statemachine-data/src/main/java/org/springframework/statemachine/data/RepositoryTransition.java @@ -23,15 +23,31 @@ package org.springframework.statemachine.data; */ public interface RepositoryTransition { + /** + * Gets the machine id. + * + * @return the machine id + */ + String getMachineId(); + + /** + * Gets the source. + * + * @return the source + */ String getSource(); - void setSource(String source); - + /** + * Gets the target. + * + * @return the target + */ String getTarget(); - void setTarget(String target); - + /** + * Gets the event. + * + * @return the event + */ String getEvent(); - - void setEvent(String event); } diff --git a/spring-statemachine-data/src/main/java/org/springframework/statemachine/data/StateRepository.java b/spring-statemachine-data/src/main/java/org/springframework/statemachine/data/StateRepository.java index 0c95780e..4ef926bc 100644 --- a/spring-statemachine-data/src/main/java/org/springframework/statemachine/data/StateRepository.java +++ b/spring-statemachine-data/src/main/java/org/springframework/statemachine/data/StateRepository.java @@ -15,6 +15,8 @@ */ package org.springframework.statemachine.data; +import java.util.List; + import org.springframework.data.repository.CrudRepository; import org.springframework.data.repository.NoRepositoryBean; import org.springframework.data.repository.Repository; @@ -28,4 +30,12 @@ import org.springframework.data.repository.Repository; */ @NoRepositoryBean public interface StateRepository extends CrudRepository { + + /** + * Find states by machine id. + * + * @param machineId the machine id + * @return the list of transitions + */ + List findByMachineId(String machineId); } diff --git a/spring-statemachine-data/src/main/java/org/springframework/statemachine/data/TransitionRepository.java b/spring-statemachine-data/src/main/java/org/springframework/statemachine/data/TransitionRepository.java index c1efdc26..e8ca32dc 100644 --- a/spring-statemachine-data/src/main/java/org/springframework/statemachine/data/TransitionRepository.java +++ b/spring-statemachine-data/src/main/java/org/springframework/statemachine/data/TransitionRepository.java @@ -15,6 +15,8 @@ */ package org.springframework.statemachine.data; +import java.util.List; + import org.springframework.data.repository.CrudRepository; import org.springframework.data.repository.NoRepositoryBean; import org.springframework.data.repository.Repository; @@ -28,4 +30,12 @@ import org.springframework.data.repository.Repository; */ @NoRepositoryBean public interface TransitionRepository extends CrudRepository { + + /** + * Find transitions by machine id. + * + * @param machineId the machine id + * @return the list of transitions + */ + List findByMachineId(String machineId); }