diff --git a/spring-statemachine-core/src/main/java/org/springframework/statemachine/config/StateMachineBuilder.java b/spring-statemachine-core/src/main/java/org/springframework/statemachine/config/StateMachineBuilder.java index bbd609f1..a146a10d 100644 --- a/spring-statemachine-core/src/main/java/org/springframework/statemachine/config/StateMachineBuilder.java +++ b/spring-statemachine-core/src/main/java/org/springframework/statemachine/config/StateMachineBuilder.java @@ -29,10 +29,7 @@ import org.springframework.statemachine.config.builders.StateMachineTransitionBu import org.springframework.statemachine.config.builders.StateMachineTransitionConfigurer; import org.springframework.statemachine.config.common.annotation.AnnotationBuilder; import org.springframework.statemachine.config.common.annotation.ObjectPostProcessor; -import org.springframework.statemachine.config.model.DefaultStateMachineModel; import org.springframework.statemachine.config.model.ConfigurationData; -import org.springframework.statemachine.config.model.StatesData; -import org.springframework.statemachine.config.model.TransitionsData; /** * {@code StateMachineBuilder} provides a builder pattern for @@ -112,40 +109,40 @@ public class StateMachineBuilder { } /** - * Builds a {@link StateMachine}. + * Creates a {@link StateMachineFactory} from builder * - * @return the state machine + * @return the factory to create a state machine */ - public StateMachine build() { + public StateMachineFactory createFactory() { try { builder.apply(adapter); - StateMachineConfig stateMachineConfig = builder.getOrBuild(); - TransitionsData stateMachineTransitions = stateMachineConfig.getTransitions(); - StatesData stateMachineStates = stateMachineConfig.getStates(); - ConfigurationData stateMachineConfigurationConfig = stateMachineConfig.getStateMachineConfigurationConfig(); - - ObjectStateMachineFactory stateMachineFactory = null; - if (stateMachineConfig.getModel() != null && stateMachineConfig.getModel().getFactory() != null) { - stateMachineFactory = new ObjectStateMachineFactory( - new DefaultStateMachineModel(stateMachineConfigurationConfig, null, null), - stateMachineConfig.getModel().getFactory()); - } else { - stateMachineFactory = new ObjectStateMachineFactory(new DefaultStateMachineModel( - stateMachineConfigurationConfig, stateMachineStates, stateMachineTransitions), null); - } + ObjectStateMachineFactory stateMachineFactory = StateMachineFactory.create(builder); + ConfigurationData stateMachineConfigurationConfig = builder.getOrBuild().stateMachineConfigurationConfig; stateMachineFactory.setHandleAutostartup(stateMachineConfigurationConfig.isAutoStart()); if (stateMachineConfigurationConfig.getBeanFactory() != null) { stateMachineFactory.setBeanFactory(stateMachineConfigurationConfig.getBeanFactory()); } - return stateMachineFactory.getStateMachine(); + return stateMachineFactory; + } catch (Exception e) { + throw new StateMachineException("Error creating state machine factory", e); + } + } + + /** + * Builds a {@link StateMachine}. + * + * @return the state machine + */ + public StateMachine build() { + try { + return createFactory().getStateMachine(); } catch (Exception e) { throw new StateMachineException("Error building state machine", e); } } - } private static class BuilderStateMachineConfigurerAdapter diff --git a/spring-statemachine-core/src/main/java/org/springframework/statemachine/config/StateMachineFactory.java b/spring-statemachine-core/src/main/java/org/springframework/statemachine/config/StateMachineFactory.java index b92e0835..37ff63c9 100644 --- a/spring-statemachine-core/src/main/java/org/springframework/statemachine/config/StateMachineFactory.java +++ b/spring-statemachine-core/src/main/java/org/springframework/statemachine/config/StateMachineFactory.java @@ -16,6 +16,11 @@ package org.springframework.statemachine.config; import org.springframework.statemachine.StateMachine; +import org.springframework.statemachine.config.builders.StateMachineConfigBuilder; +import org.springframework.statemachine.config.model.ConfigurationData; +import org.springframework.statemachine.config.model.DefaultStateMachineModel; +import org.springframework.statemachine.config.model.StatesData; +import org.springframework.statemachine.config.model.TransitionsData; import java.util.UUID; @@ -53,4 +58,23 @@ public interface StateMachineFactory { * @return a new state machine instance. */ StateMachine getStateMachine(UUID uuid); + + static ObjectStateMachineFactory create(StateMachineConfigBuilder builder) { + StateMachineConfig stateMachineConfig = builder.getOrBuild(); + + TransitionsData stateMachineTransitions = stateMachineConfig.getTransitions(); + StatesData stateMachineStates = stateMachineConfig.getStates(); + ConfigurationData stateMachineConfigurationConfig = stateMachineConfig.getStateMachineConfigurationConfig(); + + ObjectStateMachineFactory stateMachineFactory = null; + if (stateMachineConfig.getModel() != null && stateMachineConfig.getModel().getFactory() != null) { + stateMachineFactory = new ObjectStateMachineFactory( + new DefaultStateMachineModel(stateMachineConfigurationConfig, null, null), + stateMachineConfig.getModel().getFactory()); + } else { + stateMachineFactory = new ObjectStateMachineFactory(new DefaultStateMachineModel( + stateMachineConfigurationConfig, stateMachineStates, stateMachineTransitions), null); + } + return stateMachineFactory; + } } diff --git a/spring-statemachine-core/src/main/java/org/springframework/statemachine/config/configuration/StateMachineConfiguration.java b/spring-statemachine-core/src/main/java/org/springframework/statemachine/config/configuration/StateMachineConfiguration.java index 3a14c628..7735fed0 100644 --- a/spring-statemachine-core/src/main/java/org/springframework/statemachine/config/configuration/StateMachineConfiguration.java +++ b/spring-statemachine-core/src/main/java/org/springframework/statemachine/config/configuration/StateMachineConfiguration.java @@ -38,14 +38,11 @@ import org.springframework.statemachine.config.EnableStateMachine; import org.springframework.statemachine.config.ObjectStateMachineFactory; import org.springframework.statemachine.config.StateMachineConfig; import org.springframework.statemachine.config.StateMachineConfigurerAdapter; +import org.springframework.statemachine.config.StateMachineFactory; import org.springframework.statemachine.config.builders.StateMachineConfigBuilder; import org.springframework.statemachine.config.builders.StateMachineConfigurer; import org.springframework.statemachine.config.common.annotation.AbstractImportingAnnotationConfiguration; import org.springframework.statemachine.config.common.annotation.AnnotationConfigurer; -import org.springframework.statemachine.config.model.ConfigurationData; -import org.springframework.statemachine.config.model.DefaultStateMachineModel; -import org.springframework.statemachine.config.model.StatesData; -import org.springframework.statemachine.config.model.TransitionsData; import org.springframework.statemachine.monitor.StateMachineMonitor; import org.springframework.util.ClassUtils; import org.springframework.util.StringUtils; @@ -165,27 +162,15 @@ public class StateMachineConfiguration extends AnnotationConfigurer, StateMachineConfigBuilder> configurer = (AnnotationConfigurer, StateMachineConfigBuilder>) getBeanFactory() .getBean(ClassUtils.forName(clazzName, classLoader)); - getBuilder().apply(configurer); + StateMachineConfigBuilder builder = getBuilder(); + builder.apply(configurer); - StateMachineConfig stateMachineConfig = getBuilder().getOrBuild(); - TransitionsData stateMachineTransitions = stateMachineConfig.getTransitions(); - StatesData stateMachineStates = stateMachineConfig.getStates(); - ConfigurationData stateMachineConfigurationConfig = stateMachineConfig.getStateMachineConfigurationConfig(); - - ObjectStateMachineFactory stateMachineFactory = null; - if (stateMachineConfig.getModel() != null && stateMachineConfig.getModel().getFactory() != null) { - stateMachineFactory = new ObjectStateMachineFactory( - new DefaultStateMachineModel(stateMachineConfigurationConfig, null, null), - stateMachineConfig.getModel().getFactory()); - } else { - stateMachineFactory = new ObjectStateMachineFactory(new DefaultStateMachineModel( - stateMachineConfigurationConfig, stateMachineStates, stateMachineTransitions), null); - } + ObjectStateMachineFactory stateMachineFactory = StateMachineFactory.create(builder); stateMachineFactory.setBeanFactory(getBeanFactory()); stateMachineFactory.setContextEventsEnabled(contextEvents); stateMachineFactory.setBeanName(beanName); - stateMachineFactory.setHandleAutostartup(stateMachineConfigurationConfig.isAutoStart()); + stateMachineFactory.setHandleAutostartup(builder.getOrBuild().stateMachineConfigurationConfig.isAutoStart()); if (stateMachineMonitor != null) { stateMachineFactory.setStateMachineMonitor(stateMachineMonitor); } diff --git a/spring-statemachine-core/src/main/java/org/springframework/statemachine/config/configuration/StateMachineFactoryConfiguration.java b/spring-statemachine-core/src/main/java/org/springframework/statemachine/config/configuration/StateMachineFactoryConfiguration.java index 2aed50cf..8539f0ea 100644 --- a/spring-statemachine-core/src/main/java/org/springframework/statemachine/config/configuration/StateMachineFactoryConfiguration.java +++ b/spring-statemachine-core/src/main/java/org/springframework/statemachine/config/configuration/StateMachineFactoryConfiguration.java @@ -41,10 +41,6 @@ import org.springframework.statemachine.config.StateMachineFactory; import org.springframework.statemachine.config.builders.StateMachineConfigBuilder; import org.springframework.statemachine.config.common.annotation.AbstractImportingAnnotationConfiguration; import org.springframework.statemachine.config.common.annotation.AnnotationConfigurer; -import org.springframework.statemachine.config.model.ConfigurationData; -import org.springframework.statemachine.config.model.DefaultStateMachineModel; -import org.springframework.statemachine.config.model.StatesData; -import org.springframework.statemachine.config.model.TransitionsData; import org.springframework.util.ClassUtils; /** @@ -156,21 +152,7 @@ public class StateMachineFactoryConfiguration extends .getBean(ClassUtils.forName(clazzName, classLoader)); builder.apply(configurer); - StateMachineConfig stateMachineConfig = builder.getOrBuild(); - TransitionsData stateMachineTransitions = stateMachineConfig.getTransitions(); - StatesData stateMachineStates = stateMachineConfig.getStates(); - ConfigurationData stateMachineConfigurationConfig = stateMachineConfig - .getStateMachineConfigurationConfig(); - - ObjectStateMachineFactory objectStateMachineFactory = null; - if (stateMachineConfig.getModel() != null && stateMachineConfig.getModel().getFactory() != null) { - objectStateMachineFactory = new ObjectStateMachineFactory( - new DefaultStateMachineModel(stateMachineConfigurationConfig, null, null), - stateMachineConfig.getModel().getFactory()); - } else { - objectStateMachineFactory = new ObjectStateMachineFactory(new DefaultStateMachineModel( - stateMachineConfigurationConfig, stateMachineStates, stateMachineTransitions), null); - } + ObjectStateMachineFactory objectStateMachineFactory = StateMachineFactory.create(builder); objectStateMachineFactory.setBeanFactory(beanFactory); objectStateMachineFactory.setContextEventsEnabled(contextEvents); diff --git a/spring-statemachine-core/src/test/java/org/springframework/statemachine/StateMachineFactoryTests.java b/spring-statemachine-core/src/test/java/org/springframework/statemachine/StateMachineFactoryTests.java index 9fc6f88e..57142788 100644 --- a/spring-statemachine-core/src/test/java/org/springframework/statemachine/StateMachineFactoryTests.java +++ b/spring-statemachine-core/src/test/java/org/springframework/statemachine/StateMachineFactoryTests.java @@ -18,6 +18,7 @@ package org.springframework.statemachine; import static org.hamcrest.MatcherAssert.assertThat; import static org.hamcrest.Matchers.contains; import static org.hamcrest.Matchers.is; +import static org.hamcrest.Matchers.notNullValue; import static org.springframework.statemachine.TestUtils.doSendEventAndConsumeAll; import static org.springframework.statemachine.TestUtils.doStartAndAssert; import static org.springframework.statemachine.TestUtils.resolveFactory; @@ -33,6 +34,7 @@ import org.springframework.context.annotation.Configuration; import org.springframework.statemachine.config.EnableStateMachineFactory; import org.springframework.statemachine.config.EnumStateMachineConfigurerAdapter; import org.springframework.statemachine.config.StateMachineFactory; +import org.springframework.statemachine.config.builders.StateMachineConfigBuilder; import org.springframework.statemachine.config.builders.StateMachineConfigurationConfigurer; import org.springframework.statemachine.config.builders.StateMachineStateConfigurer; import org.springframework.statemachine.config.builders.StateMachineTransitionConfigurer; @@ -46,6 +48,23 @@ public class StateMachineFactoryTests extends AbstractStateMachineTests { return new AnnotationConfigApplicationContext(); } + /** + * {@link org.springframework.statemachine.config.ManualBuilderTests#testManualBuildConcept()} + */ + @Test + public void testCreate() throws Exception{ + StateMachineConfigBuilder builder = new StateMachineConfigBuilder<>(); + Config1 config = new Config1(); + builder.apply(config); + + StateMachineFactory factory = StateMachineFactory.create(builder); + StateMachine machine = factory.getStateMachine(); + doStartAndAssert(machine); + + assertThat(machine, notNullValue()); + assertThat(machine.getState().getId(), is(TestStates.S1)); + } + @Test public void testMachineFromFactory() { context.register(Config1.class);