From 087da55cbbdf9b4948e01a96bfaadcb829b9e15e Mon Sep 17 00:00:00 2001 From: Janne Valkealahti Date: Sat, 11 Jul 2015 09:34:45 +0100 Subject: [PATCH] Add autostart flag for top-level machine - take2 - Add actual start calls - Rename autoStart to autoStartup in config methods. - Tweak so that this works in factory and builder --- .../config/AbstractStateMachineFactory.java | 16 +++++++- .../config/StateMachineBuilder.java | 2 +- .../StateMachineConfiguration.java | 39 ++++++++++++++++++- .../configurers/ConfigurationConfigurer.java | 4 +- .../DefaultConfigurationConfigurer.java | 2 +- .../config/ConfigurationTests.java | 3 +- .../config/ManualBuilderTests.java | 28 +++++++++++++ 7 files changed, 86 insertions(+), 8 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 0092dc99..d69402c9 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 @@ -25,6 +25,7 @@ import java.util.Map.Entry; import java.util.Stack; import org.springframework.beans.factory.BeanFactory; +import org.springframework.context.SmartLifecycle; import org.springframework.core.task.TaskExecutor; import org.springframework.messaging.Message; import org.springframework.scheduling.TaskScheduler; @@ -85,6 +86,8 @@ public abstract class AbstractStateMachineFactory extends LifecycleObjectS private Boolean contextEvents; + private boolean handleAutostartup = false; + /** * Instantiates a new enum state machine factory. * @@ -213,13 +216,24 @@ public abstract class AbstractStateMachineFactory extends LifecycleObjectS machine = distributedStateMachine; } - return machine; + return delegateAutoStartup(machine); + } + + public void setHandleAutostartup(boolean handleAutostartup) { + this.handleAutostartup = handleAutostartup; } public void setContextEventsEnabled(Boolean contextEvents) { this.contextEvents = contextEvents; } + private StateMachine delegateAutoStartup(StateMachine delegate) { + if (handleAutostartup && delegate instanceof SmartLifecycle && ((SmartLifecycle) delegate).isAutoStartup()) { + ((SmartLifecycle)delegate).start(); + } + return delegate; + } + private BeanFactory resolveBeanFactory() { if (stateMachineConfigurationConfig.getBeanFactory() != null) { return stateMachineConfigurationConfig.getBeanFactory(); 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 9733edff..55bdbebf 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 @@ -114,6 +114,7 @@ public class StateMachineBuilder { StateMachineConfigurationConfig stateMachineConfigurationConfig = stateMachineConfig.getStateMachineConfigurationConfig(); ObjectStateMachineFactory stateMachineFactory = new ObjectStateMachineFactory( stateMachineConfigurationConfig, stateMachineTransitions, stateMachineStates); + stateMachineFactory.setHandleAutostartup(stateMachineConfigurationConfig.isAutoStart()); if (stateMachineConfigurationConfig.getBeanFactory() != null) { stateMachineFactory.setBeanFactory(stateMachineConfigurationConfig.getBeanFactory()); @@ -124,7 +125,6 @@ public class StateMachineBuilder { if (stateMachineConfigurationConfig.getTaskScheduler() != null) { stateMachineFactory.setTaskScheduler(stateMachineConfigurationConfig.getTaskScheduler()); } - return stateMachineFactory.getStateMachine(); } catch (Exception e) { throw new StateMachineException("Error building state machine", e); 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 d7420a39..8b77f755 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 @@ -21,6 +21,7 @@ import java.util.List; import org.springframework.beans.factory.config.BeanDefinition; import org.springframework.beans.factory.support.BeanDefinitionBuilder; +import org.springframework.context.SmartLifecycle; import org.springframework.context.annotation.Configuration; import org.springframework.core.annotation.AnnotationAttributes; import org.springframework.core.type.AnnotationMetadata; @@ -66,10 +67,12 @@ public class StateMachineConfiguration, E extends Enum> ext } private static class StateMachineDelegatingFactoryBean, E extends Enum> - extends BeanDelegatingFactoryBean,StateMachineConfigBuilder,StateMachineConfig> { + extends BeanDelegatingFactoryBean,StateMachineConfigBuilder,StateMachineConfig> + implements SmartLifecycle { private String clazzName; private Boolean contextEvents; + private SmartLifecycle lifecycle; public StateMachineDelegatingFactoryBean(StateMachineConfigBuilder builder, Class> clazz, String clazzName, Boolean contextEvents) { @@ -94,7 +97,39 @@ public class StateMachineConfiguration, E extends Enum> ext stateMachineConfigurationConfig, stateMachineTransitions, stateMachineStates); stateMachineFactory.setBeanFactory(getBeanFactory()); stateMachineFactory.setContextEventsEnabled(contextEvents); - setObject(stateMachineFactory.getStateMachine()); + StateMachine stateMachine = stateMachineFactory.getStateMachine(); + this.lifecycle = (SmartLifecycle) stateMachine; + setObject(stateMachine); + } + + @Override + public void start() { + lifecycle.start(); + } + + @Override + public void stop() { + lifecycle.stop(); + } + + @Override + public boolean isRunning() { + return lifecycle.isRunning(); + } + + @Override + public int getPhase() { + return 0; + } + + @Override + public boolean isAutoStartup() { + return lifecycle.isAutoStartup(); + } + + @Override + public void stop(Runnable callback) { + lifecycle.stop(callback); } } 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 4f4948ef..1ede9cbb 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 @@ -60,9 +60,9 @@ public interface ConfigurationConfigurer extends * Specify if state machine should be started automatically. * On default state machine is not started automatically. * - * @param autoStart the autostart flag + * @param autoStartup the autoStartup flag * @return configurer for chaining */ - ConfigurationConfigurer autoStart(boolean autoStart); + ConfigurationConfigurer autoStartup(boolean autoStartup); } 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 a5058a7d..2be7639a 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 @@ -67,7 +67,7 @@ public class DefaultConfigurationConfigurer } @Override - public ConfigurationConfigurer autoStart(boolean autoStart) { + public ConfigurationConfigurer autoStartup(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 833b876d..7a4bf302 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 @@ -119,6 +119,7 @@ public class ConfigurationTests extends AbstractStateMachineTests { ObjectStateMachine machine = context.getBean(StateMachineSystemConstants.DEFAULT_ID_STATEMACHINE, ObjectStateMachine.class); assertThat(machine.isAutoStartup(), is(true)); + assertThat(machine.isRunning(), is(true)); } @Configuration @@ -450,7 +451,7 @@ public class ConfigurationTests extends AbstractStateMachineTests { public void configure(StateMachineConfigurationConfigurer config) throws Exception { config .withConfiguration() - .autoStart(true); + .autoStartup(true); } @Override diff --git a/spring-statemachine-core/src/test/java/org/springframework/statemachine/config/ManualBuilderTests.java b/spring-statemachine-core/src/test/java/org/springframework/statemachine/config/ManualBuilderTests.java index d4245da5..a57208b3 100644 --- a/spring-statemachine-core/src/test/java/org/springframework/statemachine/config/ManualBuilderTests.java +++ b/spring-statemachine-core/src/test/java/org/springframework/statemachine/config/ManualBuilderTests.java @@ -25,6 +25,7 @@ import java.util.concurrent.TimeUnit; import org.junit.Test; import org.springframework.beans.factory.support.StaticListableBeanFactory; +import org.springframework.context.SmartLifecycle; import org.springframework.core.task.SyncTaskExecutor; import org.springframework.scheduling.concurrent.ConcurrentTaskScheduler; import org.springframework.statemachine.StateMachine; @@ -137,6 +138,33 @@ public class ManualBuilderTests { assertThat(stateMachine.getState().getIds(), containsInAnyOrder("S1")); } + @Test + public void testAutoStartFlagOn() throws Exception { + Builder builder = StateMachineBuilder.builder(); + + builder.configureConfiguration() + .withConfiguration() + .autoStartup(true) + .taskExecutor(new SyncTaskExecutor()) + .taskScheduler(new ConcurrentTaskScheduler()); + + builder.configureStates() + .withStates() + .initial("S1").state("S2"); + + builder.configureTransitions() + .withExternal() + .source("S1").target("S2").event("E1") + .and() + .withExternal() + .source("S2").target("S1").event("E2"); + + StateMachine stateMachine = builder.build(); + + assertThat(((SmartLifecycle)stateMachine).isAutoStartup(), is(true)); + assertThat(((SmartLifecycle)stateMachine).isRunning(), is(true)); + } + static class Config extends StateMachineConfigurerAdapter { @Override