Add initial action to repository config
- Now RepositoryState can have initial action if it is an initial state. - Implement all needed tests. - Fixes #281
This commit is contained in:
@@ -62,6 +62,14 @@ public abstract class RepositoryState extends BaseRepositoryEntity {
|
||||
*/
|
||||
public abstract boolean isInitial();
|
||||
|
||||
/**
|
||||
* Gets the initial action. This is any meaningful if
|
||||
* state is initial state.
|
||||
*
|
||||
* @return the initial action
|
||||
*/
|
||||
public abstract RepositoryAction getInitialAction();
|
||||
|
||||
/**
|
||||
* Gets the state actions.
|
||||
*
|
||||
|
||||
@@ -153,6 +153,18 @@ public class RepositoryStateMachineModelFactory extends AbstractStateMachineMode
|
||||
Object region = s.getRegion();
|
||||
StateData<String, String> stateData = new StateData<String, String>(parentState != null ? parentState.getState() : null, region,
|
||||
s.getState(), s.isInitial());
|
||||
Action<String, String> initialAction = null;
|
||||
if (s.getInitialAction() != null) {
|
||||
if (StringUtils.hasText(s.getInitialAction().getName())) {
|
||||
initialAction = resolveAction(s.getInitialAction().getName());
|
||||
} else if (StringUtils.hasText(s.getInitialAction().getSpel())) {
|
||||
SpelExpressionParser parser = new SpelExpressionParser(
|
||||
new SpelParserConfiguration(SpelCompilerMode.MIXED, null));
|
||||
|
||||
initialAction = new SpelExpressionAction<String, String>(parser.parseExpression(s.getInitialAction().getSpel()));
|
||||
}
|
||||
}
|
||||
stateData.setInitialAction(initialAction);
|
||||
stateData.setStateActions(stateActions);
|
||||
stateData.setEntryActions(entryActions);
|
||||
stateData.setExitActions(exitActions);
|
||||
@@ -170,7 +182,7 @@ public class RepositoryStateMachineModelFactory extends AbstractStateMachineMode
|
||||
Collection<StateData<String, String>> submachineStateDataOrig = subStateMachineModel.getStatesData().getStateData();
|
||||
for (StateData<String, String> sd : submachineStateDataOrig) {
|
||||
submachineStateData.add(new StateData<String, String>(s.getState(), sd.getRegion(), sd.getState(),
|
||||
sd.getDeferred(), sd.getEntryActions(), sd.getExitActions(), sd.isInitial()));
|
||||
sd.getDeferred(), sd.getEntryActions(), sd.getExitActions(), sd.isInitial(), sd.getInitialAction()));
|
||||
}
|
||||
stateData.setSubmachineStateData(submachineStateData);
|
||||
}
|
||||
|
||||
@@ -412,6 +412,24 @@ public abstract class AbstractRepositoryTests {
|
||||
plan.test();
|
||||
}
|
||||
|
||||
@SuppressWarnings("unchecked")
|
||||
@Test
|
||||
public void testMachine14() throws Exception {
|
||||
context.register(getRegisteredClasses());
|
||||
context.register(Config14.class, FactoryConfig.class);
|
||||
context.refresh();
|
||||
StateMachineFactory<String, String> stateMachineFactory = context.getBean(StateMachineFactory.class);
|
||||
StateMachine<String, String> stateMachine = stateMachineFactory.getStateMachine();
|
||||
|
||||
StateMachineTestPlan<String, String> plan =
|
||||
StateMachineTestPlanBuilder.<String, String>builder()
|
||||
.stateMachine(stateMachine)
|
||||
.step().expectStates("S1").expectVariable("foo", 0).and()
|
||||
.step().sendEvent("E1").expectStates("S2").and()
|
||||
.build();
|
||||
plan.test();
|
||||
}
|
||||
|
||||
@Configuration
|
||||
public static class Config2 {
|
||||
|
||||
@@ -576,6 +594,17 @@ public abstract class AbstractRepositoryTests {
|
||||
}
|
||||
}
|
||||
|
||||
@Configuration
|
||||
public static class Config14 {
|
||||
|
||||
@Bean
|
||||
public StateMachineJackson2RepositoryPopulatorFactoryBean jackson2RepositoryPopulatorFactoryBean() {
|
||||
StateMachineJackson2RepositoryPopulatorFactoryBean factoryBean = new StateMachineJackson2RepositoryPopulatorFactoryBean();
|
||||
factoryBean.setResources(new Resource[]{new ClassPathResource("data14.json")});
|
||||
return factoryBean;
|
||||
}
|
||||
}
|
||||
|
||||
@Configuration
|
||||
@EnableStateMachineFactory
|
||||
public static class FactoryConfig extends StateMachineConfigurerAdapter<String, String> {
|
||||
|
||||
Reference in New Issue
Block a user