SS refactor (#1555)

This commit is contained in:
Grzegorz Piwowarek 2017-04-01 11:00:44 +02:00 committed by GitHub
parent 09d4c6f873
commit 2c50b4f1b7
6 changed files with 91 additions and 54 deletions

View File

@ -1,9 +1,5 @@
package com.baeldung.spring.statemachine.config; package com.baeldung.spring.statemachine.config;
import java.util.Arrays;
import java.util.HashSet;
import java.util.logging.Logger;
import org.springframework.context.annotation.Bean; import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration; import org.springframework.context.annotation.Configuration;
import org.springframework.statemachine.action.Action; import org.springframework.statemachine.action.Action;
@ -14,6 +10,10 @@ import org.springframework.statemachine.config.builders.StateMachineStateConfigu
import org.springframework.statemachine.config.builders.StateMachineTransitionConfigurer; import org.springframework.statemachine.config.builders.StateMachineTransitionConfigurer;
import org.springframework.statemachine.guard.Guard; import org.springframework.statemachine.guard.Guard;
import java.util.Arrays;
import java.util.HashSet;
import java.util.logging.Logger;
@Configuration @Configuration
@EnableStateMachine @EnableStateMachine
public class SimpleStateMachineConfiguration extends StateMachineConfigurerAdapter<String, String> { public class SimpleStateMachineConfiguration extends StateMachineConfigurerAdapter<String, String> {
@ -21,94 +21,126 @@ public class SimpleStateMachineConfiguration extends StateMachineConfigurerAdapt
public static final Logger LOGGER = Logger.getLogger(SimpleStateMachineConfiguration.class.getName()); public static final Logger LOGGER = Logger.getLogger(SimpleStateMachineConfiguration.class.getName());
@Override @Override
public void configure(StateMachineConfigurationConfigurer<String, String> config) public void configure(StateMachineConfigurationConfigurer<String, String> config) throws Exception {
throws Exception {
config config
.withConfiguration() .withConfiguration()
.autoStartup(true) .autoStartup(true)
.listener(new StateMachineListener()); .listener(new StateMachineListener());
} }
@Override @Override
public void configure(StateMachineStateConfigurer<String, String> states) throws Exception { public void configure(StateMachineStateConfigurer<String, String> states) throws Exception {
states states
.withStates() .withStates()
.initial("SI") .initial("SI")
.end("SF") .end("SF")
.states(new HashSet<>(Arrays.asList("S1", "S2"))) .states(new HashSet<>(Arrays.asList("S1", "S2")))
.stateEntry("S3", entryAction()) .stateEntry("S3", entryAction())
.stateExit("S3", exitAction()) .stateExit("S3", exitAction())
.state("S4", executeAction(), errorAction()) .state("S4", executeAction(), errorAction())
.stateDo("S5", executeAction()); .stateDo("S5", executeAction());
} }
@Override @Override
public void configure(StateMachineTransitionConfigurer<String, String> transitions) throws Exception { public void configure(StateMachineTransitionConfigurer<String, String> transitions) throws Exception {
transitions.withExternal() transitions
.source("SI").target("S1").event("E1").action(initAction()) .withExternal()
.and().withExternal() .source("SI")
.source("S1").target("S2").event("E2") .target("S1")
.and().withExternal() .event("E1")
.source("SI").target("S3").event("E3") .action(initAction())
.and().withExternal() .and()
.source("S3").target("S4").event("E4") .withExternal()
.and().withExternal() .source("S1")
.source("S4").target("S5").event("E5") .target("S2")
.and().withExternal() .event("E2")
.source("S5").target("SF").event("end").guard(simpleGuard()); .and()
.withExternal()
.source("SI")
.target("S3")
.event("E3")
.and()
.withExternal()
.source("S3")
.target("S4")
.event("E4")
.and()
.withExternal()
.source("S4")
.target("S5")
.event("E5")
.and()
.withExternal()
.source("S5")
.target("SF")
.event("end")
.guard(simpleGuard());
} }
@Bean @Bean
public Guard<String, String> simpleGuard() { public Guard<String, String> simpleGuard() {
return (ctx) -> { return (ctx) -> {
int approvalCount = (int) ctx.getExtendedState().getVariables().getOrDefault("approvalCount", 0); int approvalCount = (int) ctx
.getExtendedState()
.getVariables()
.getOrDefault("approvalCount", 0);
return approvalCount > 0; return approvalCount > 0;
}; };
} }
@Bean @Bean
public Action<String, String> entryAction() { public Action<String, String> entryAction() {
return (ctx) -> { return ctx -> LOGGER.info("Entry " + ctx
LOGGER.info("Entry " + ctx.getTarget().getId()); .getTarget()
}; .getId());
} }
@Bean @Bean
public Action<String, String> doAction() { public Action<String, String> doAction() {
return (ctx) -> { return ctx -> LOGGER.info("Do " + ctx
LOGGER.info("Do " + ctx.getTarget().getId()); .getTarget()
}; .getId());
} }
@Bean @Bean
public Action<String, String> executeAction() { public Action<String, String> executeAction() {
return (ctx) -> { return ctx -> {
LOGGER.info("Execute " + ctx.getTarget().getId()); LOGGER.info("Execute " + ctx
int approvals = (int) ctx.getExtendedState().getVariables().getOrDefault("approvalCount", 0); .getTarget()
.getId());
int approvals = (int) ctx
.getExtendedState()
.getVariables()
.getOrDefault("approvalCount", 0);
approvals++; approvals++;
ctx.getExtendedState().getVariables().put("approvalCount", approvals); ctx
.getExtendedState()
.getVariables()
.put("approvalCount", approvals);
}; };
} }
@Bean @Bean
public Action<String, String> exitAction() { public Action<String, String> exitAction() {
return (ctx) -> { return ctx -> LOGGER.info("Exit " + ctx
LOGGER.info("Exit " + ctx.getSource().getId() + " -> " + ctx.getTarget().getId()); .getSource()
}; .getId() + " -> " + ctx
.getTarget()
.getId());
} }
@Bean @Bean
public Action<String, String> errorAction() { public Action<String, String> errorAction() {
return (ctx) -> { return ctx -> LOGGER.info("Error " + ctx
LOGGER.info("Error " + ctx.getSource().getId() + ctx.getException()); .getSource()
}; .getId() + ctx.getException());
} }
@Bean @Bean
public Action<String, String> initAction() { public Action<String, String> initAction() {
return (ctx) -> { return ctx -> LOGGER.info(ctx
LOGGER.info(ctx.getTarget().getId()); .getTarget()
}; .getId());
} }
} }

View File

@ -6,6 +6,7 @@ import org.junit.After;
import org.junit.Before; import org.junit.Before;
import org.junit.Test; import org.junit.Test;
import org.junit.runner.RunWith; import org.junit.runner.RunWith;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.context.annotation.AnnotationConfigApplicationContext; import org.springframework.context.annotation.AnnotationConfigApplicationContext;
import org.springframework.statemachine.StateMachine; import org.springframework.statemachine.StateMachine;
import org.springframework.test.context.ContextConfiguration; import org.springframework.test.context.ContextConfiguration;
@ -21,7 +22,7 @@ import static org.junit.Assert.assertTrue;
@ContextConfiguration(classes = ForkJoinStateMachineConfiguration.class) @ContextConfiguration(classes = ForkJoinStateMachineConfiguration.class)
public class ForkJoinStateMachineTest { public class ForkJoinStateMachineTest {
@Resource @Autowired
private StateMachine<String, String> stateMachine; private StateMachine<String, String> stateMachine;
@Before @Before

View File

@ -6,6 +6,7 @@ import org.junit.After;
import org.junit.Before; import org.junit.Before;
import org.junit.Test; import org.junit.Test;
import org.junit.runner.RunWith; import org.junit.runner.RunWith;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.context.annotation.AnnotationConfigApplicationContext; import org.springframework.context.annotation.AnnotationConfigApplicationContext;
import org.springframework.statemachine.StateMachine; import org.springframework.statemachine.StateMachine;
import org.springframework.test.context.ContextConfiguration; import org.springframework.test.context.ContextConfiguration;
@ -20,7 +21,7 @@ import static org.junit.Assert.assertEquals;
@ContextConfiguration(classes = HierarchicalStateMachineConfiguration.class) @ContextConfiguration(classes = HierarchicalStateMachineConfiguration.class)
public class HierarchicalStateMachineTest { public class HierarchicalStateMachineTest {
@Resource @Autowired
private StateMachine<String, String> stateMachine; private StateMachine<String, String> stateMachine;
@Before @Before

View File

@ -7,6 +7,7 @@ import org.junit.Assert;
import org.junit.Before; import org.junit.Before;
import org.junit.Test; import org.junit.Test;
import org.junit.runner.RunWith; import org.junit.runner.RunWith;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.context.annotation.AnnotationConfigApplicationContext; import org.springframework.context.annotation.AnnotationConfigApplicationContext;
import org.springframework.statemachine.StateMachine; import org.springframework.statemachine.StateMachine;
import org.springframework.test.context.ContextConfiguration; import org.springframework.test.context.ContextConfiguration;
@ -18,7 +19,7 @@ import javax.annotation.Resource;
@ContextConfiguration(classes = JunctionStateMachineConfiguration.class) @ContextConfiguration(classes = JunctionStateMachineConfiguration.class)
public class JunctionStateMachineTest { public class JunctionStateMachineTest {
@Resource @Autowired
private StateMachine<String, String> stateMachine; private StateMachine<String, String> stateMachine;
@Before @Before

View File

@ -8,6 +8,7 @@ import org.junit.After;
import org.junit.Before; import org.junit.Before;
import org.junit.Test; import org.junit.Test;
import org.junit.runner.RunWith; import org.junit.runner.RunWith;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.context.annotation.AnnotationConfigApplicationContext; import org.springframework.context.annotation.AnnotationConfigApplicationContext;
import org.springframework.statemachine.StateMachine; import org.springframework.statemachine.StateMachine;
import org.springframework.test.context.ContextConfiguration; import org.springframework.test.context.ContextConfiguration;
@ -22,7 +23,7 @@ import static org.junit.Assert.assertTrue;
@ContextConfiguration(classes = SimpleEnumStateMachineConfiguration.class) @ContextConfiguration(classes = SimpleEnumStateMachineConfiguration.class)
public class StateEnumMachineTest { public class StateEnumMachineTest {
@Resource @Autowired
private StateMachine<ApplicationReviewStates, ApplicationReviewEvents> stateMachine; private StateMachine<ApplicationReviewStates, ApplicationReviewEvents> stateMachine;
@Before @Before

View File

@ -7,6 +7,7 @@ import org.junit.After;
import org.junit.Before; import org.junit.Before;
import org.junit.Test; import org.junit.Test;
import org.junit.runner.RunWith; import org.junit.runner.RunWith;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.context.annotation.AnnotationConfigApplicationContext; import org.springframework.context.annotation.AnnotationConfigApplicationContext;
import org.springframework.statemachine.StateMachine; import org.springframework.statemachine.StateMachine;
@ -21,7 +22,7 @@ import javax.annotation.Resource;
@ContextConfiguration(classes = SimpleStateMachineConfiguration.class) @ContextConfiguration(classes = SimpleStateMachineConfiguration.class)
public class StateMachineIntegrationTest { public class StateMachineIntegrationTest {
@Resource @Autowired
private StateMachine<String, String> stateMachine; private StateMachine<String, String> stateMachine;
@Before @Before