From 2c0c79a537858f02bd7aa082ea718b2e2460877a Mon Sep 17 00:00:00 2001 From: Janne Valkealahti Date: Fri, 10 Jul 2015 18:37:16 +0100 Subject: [PATCH] Add autostart flag for top-level machine - Fixes #82 - Now have configure method ConfigurationConfigurer.autoStart(boolean) which can be used to enable autostart feature for top-level state machine. We keep this feature disabled as default because most of the cases it is easier to enable it than disable it. --- .../config/AbstractStateMachineFactory.java | 5 +++ .../StateMachineConfigurationBuilder.java | 12 ++++++- .../StateMachineConfigurationConfig.java | 13 +++++++- .../configurers/ConfigurationConfigurer.java | 9 +++++ .../DefaultConfigurationConfigurer.java | 8 +++++ .../config/ConfigurationTests.java | 33 +++++++++++++++++++ 6 files changed, 78 insertions(+), 2 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 c8f1de10..0092dc99 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 @@ -188,6 +188,11 @@ public abstract class AbstractStateMachineFactory extends LifecycleObjectS stateStack.push(stateData); } + // setup autostart for top-level machine + if (machine instanceof LifecycleObjectSupport) { + ((LifecycleObjectSupport)machine).setAutoStartup(stateMachineConfigurationConfig.isAutoStart()); + } + // set top-level machine as relay final StateMachine fmachine = machine; fmachine.getStateMachineAccessor().doWithAllRegions(new StateMachineFunction>() { diff --git a/spring-statemachine-core/src/main/java/org/springframework/statemachine/config/builders/StateMachineConfigurationBuilder.java b/spring-statemachine-core/src/main/java/org/springframework/statemachine/config/builders/StateMachineConfigurationBuilder.java index e25038c7..5ea05462 100644 --- a/spring-statemachine-core/src/main/java/org/springframework/statemachine/config/builders/StateMachineConfigurationBuilder.java +++ b/spring-statemachine-core/src/main/java/org/springframework/statemachine/config/builders/StateMachineConfigurationBuilder.java @@ -42,6 +42,7 @@ public class StateMachineConfigurationBuilder private BeanFactory beanFactory; private TaskExecutor taskExecutor; private TaskScheduler taskScheculer; + private boolean autoStart = false; private StateMachineEnsemble ensemble; /** @@ -83,7 +84,7 @@ public class StateMachineConfigurationBuilder @Override protected StateMachineConfigurationConfig performBuild() throws Exception { - return new StateMachineConfigurationConfig<>(beanFactory, taskExecutor, taskScheculer, ensemble); + return new StateMachineConfigurationConfig<>(beanFactory, taskExecutor, taskScheculer, autoStart, ensemble); } /** @@ -122,4 +123,13 @@ public class StateMachineConfigurationBuilder this.ensemble = ensemble; } + /** + * Sets the auto start. + * + * @param autoStart the new autostart flag + */ + public void setAutoStart(boolean autoStart) { + this.autoStart = autoStart; + } + } diff --git a/spring-statemachine-core/src/main/java/org/springframework/statemachine/config/builders/StateMachineConfigurationConfig.java b/spring-statemachine-core/src/main/java/org/springframework/statemachine/config/builders/StateMachineConfigurationConfig.java index 077145f7..443c21ea 100644 --- a/spring-statemachine-core/src/main/java/org/springframework/statemachine/config/builders/StateMachineConfigurationConfig.java +++ b/spring-statemachine-core/src/main/java/org/springframework/statemachine/config/builders/StateMachineConfigurationConfig.java @@ -33,6 +33,7 @@ public class StateMachineConfigurationConfig { private final BeanFactory beanFactory; private final TaskExecutor taskExecutor; private final TaskScheduler taskScheduler; + private final boolean autoStart; private final StateMachineEnsemble ensemble; /** @@ -41,13 +42,15 @@ public class StateMachineConfigurationConfig { * @param beanFactory the bean factory * @param taskExecutor the task executor * @param taskScheduler the task scheduler + * @param autoStart the autostart flag * @param ensemble the state machine ensemble */ public StateMachineConfigurationConfig(BeanFactory beanFactory, TaskExecutor taskExecutor, - TaskScheduler taskScheduler, StateMachineEnsemble ensemble) { + TaskScheduler taskScheduler, boolean autoStart, StateMachineEnsemble ensemble) { this.beanFactory = beanFactory; this.taskExecutor = taskExecutor; this.taskScheduler = taskScheduler; + this.autoStart = autoStart; this.ensemble = ensemble; } @@ -87,4 +90,12 @@ public class StateMachineConfigurationConfig { return ensemble; } + /** + * Returns autostart flag. + * + * @return true, if is autostart is enabled. + */ + public boolean isAutoStart() { + return autoStart; + } } diff --git a/spring-statemachine-core/src/main/java/org/springframework/statemachine/config/configurers/ConfigurationConfigurer.java b/spring-statemachine-core/src/main/java/org/springframework/statemachine/config/configurers/ConfigurationConfigurer.java index 82e8c976..4f4948ef 100644 --- a/spring-statemachine-core/src/main/java/org/springframework/statemachine/config/configurers/ConfigurationConfigurer.java +++ b/spring-statemachine-core/src/main/java/org/springframework/statemachine/config/configurers/ConfigurationConfigurer.java @@ -56,4 +56,13 @@ public interface ConfigurationConfigurer extends */ ConfigurationConfigurer taskScheduler(TaskScheduler taskScheduler); + /** + * Specify if state machine should be started automatically. + * On default state machine is not started automatically. + * + * @param autoStart the autostart flag + * @return configurer for chaining + */ + ConfigurationConfigurer autoStart(boolean autoStart); + } diff --git a/spring-statemachine-core/src/main/java/org/springframework/statemachine/config/configurers/DefaultConfigurationConfigurer.java b/spring-statemachine-core/src/main/java/org/springframework/statemachine/config/configurers/DefaultConfigurationConfigurer.java index a4d11094..a5058a7d 100644 --- a/spring-statemachine-core/src/main/java/org/springframework/statemachine/config/configurers/DefaultConfigurationConfigurer.java +++ b/spring-statemachine-core/src/main/java/org/springframework/statemachine/config/configurers/DefaultConfigurationConfigurer.java @@ -38,12 +38,14 @@ public class DefaultConfigurationConfigurer private BeanFactory beanFactory; private TaskExecutor taskExecutor; private TaskScheduler taskScheculer; + private boolean autoStart = false; @Override public void configure(StateMachineConfigurationBuilder builder) throws Exception { builder.setBeanFactory(beanFactory); builder.setTaskExecutor(taskExecutor); builder.setTaskScheculer(taskScheculer); + builder.setAutoStart(autoStart); } @Override @@ -64,4 +66,10 @@ public class DefaultConfigurationConfigurer return this; } + @Override + public ConfigurationConfigurer autoStart(boolean autoStart) { + this.autoStart = autoStart; + return this; + } + } diff --git a/spring-statemachine-core/src/test/java/org/springframework/statemachine/config/ConfigurationTests.java b/spring-statemachine-core/src/test/java/org/springframework/statemachine/config/ConfigurationTests.java index 6e1413fe..833b876d 100644 --- a/spring-statemachine-core/src/test/java/org/springframework/statemachine/config/ConfigurationTests.java +++ b/spring-statemachine-core/src/test/java/org/springframework/statemachine/config/ConfigurationTests.java @@ -16,6 +16,7 @@ package org.springframework.statemachine.config; import static org.hamcrest.Matchers.notNullValue; +import static org.hamcrest.Matchers.is; import static org.junit.Assert.assertThat; import static org.junit.Assert.assertTrue; @@ -34,6 +35,7 @@ import org.springframework.statemachine.AbstractStateMachineTests; import org.springframework.statemachine.ObjectStateMachine; import org.springframework.statemachine.StateMachineSystemConstants; import org.springframework.statemachine.action.Action; +import org.springframework.statemachine.config.builders.StateMachineConfigurationConfigurer; import org.springframework.statemachine.config.builders.StateMachineStateConfigurer; import org.springframework.statemachine.config.builders.StateMachineTransitionConfigurer; @@ -109,6 +111,16 @@ public class ConfigurationTests extends AbstractStateMachineTests { assertThat(machine, notNullValue()); } + @SuppressWarnings({ "unchecked" }) + @Test + public void testAutoStartFlagOn() throws Exception { + context.register(Config9.class); + context.refresh(); + ObjectStateMachine machine = + context.getBean(StateMachineSystemConstants.DEFAULT_ID_STATEMACHINE, ObjectStateMachine.class); + assertThat(machine.isAutoStartup(), is(true)); + } + @Configuration @EnableStateMachine public static class Config1 extends EnumStateMachineConfigurerAdapter { @@ -430,4 +442,25 @@ public class ConfigurationTests extends AbstractStateMachineTests { } + @Configuration + @EnableStateMachine + public static class Config9 extends EnumStateMachineConfigurerAdapter { + + @Override + public void configure(StateMachineConfigurationConfigurer config) throws Exception { + config + .withConfiguration() + .autoStart(true); + } + + @Override + public void configure(StateMachineStateConfigurer states) throws Exception { + states + .withStates() + .initial(TestStates.S1) + .states(EnumSet.allOf(TestStates.class)); + } + + } + }