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:
Janne Valkealahti
2016-11-23 13:55:52 +00:00
parent ea511b8ed8
commit 0c3ea7fb2d
10 changed files with 188 additions and 1 deletions

View File

@@ -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.
*

View File

@@ -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);
}

View File

@@ -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> {