Example usage for org.springframework.statemachine.state EnumState EnumState

List of usage examples for org.springframework.statemachine.state EnumState EnumState

Introduction

In this page you can find the example usage for org.springframework.statemachine.state EnumState EnumState.

Prototype

public EnumState(S id, Collection<E> deferred,
        Collection<Function<StateContext<S, E>, Mono<Void>>> entryActions,
        Collection<Function<StateContext<S, E>, Mono<Void>>> exitActions, PseudoState<S, E> pseudoState) 

Source Link

Document

Instantiates a new enum state.

Usage

From source file:org.springframework.statemachine.EnumStateMachineTests.java

@Test
public void testDeferredEvents() {
    PseudoState<TestStates, TestEvents> pseudoState = new DefaultPseudoState<TestStates, TestEvents>(
            PseudoStateKind.INITIAL);//from   w  w  w .  ja va  2  s.  c  om

    Collection<TestEvents> deferred = new ArrayList<TestEvents>();
    deferred.add(TestEvents.E2);
    deferred.add(TestEvents.E3);

    // states
    State<TestStates, TestEvents> stateSI = new EnumState<TestStates, TestEvents>(TestStates.SI, deferred, null,
            null, pseudoState);
    State<TestStates, TestEvents> stateS1 = new EnumState<TestStates, TestEvents>(TestStates.S1);
    State<TestStates, TestEvents> stateS2 = new EnumState<TestStates, TestEvents>(TestStates.S2);
    State<TestStates, TestEvents> stateS3 = new EnumState<TestStates, TestEvents>(TestStates.S3);

    Collection<State<TestStates, TestEvents>> states = new ArrayList<State<TestStates, TestEvents>>();
    states.add(stateSI);
    states.add(stateS1);
    states.add(stateS2);
    states.add(stateS3);

    // transitions
    Collection<Transition<TestStates, TestEvents>> transitions = new ArrayList<Transition<TestStates, TestEvents>>();

    Collection<Action<TestStates, TestEvents>> actionsFromSIToS1 = new ArrayList<Action<TestStates, TestEvents>>();
    actionsFromSIToS1.add(new LoggingAction("actionsFromSIToS1"));
    DefaultExternalTransition<TestStates, TestEvents> transitionFromSIToS1 = new DefaultExternalTransition<TestStates, TestEvents>(
            stateSI, stateS1, actionsFromSIToS1, TestEvents.E1, null,
            new EventTrigger<TestStates, TestEvents>(TestEvents.E1));

    Collection<Action<TestStates, TestEvents>> actionsFromS1ToS2 = new ArrayList<Action<TestStates, TestEvents>>();
    actionsFromS1ToS2.add(new LoggingAction("actionsFromS1ToS2"));
    DefaultExternalTransition<TestStates, TestEvents> transitionFromS1ToS2 = new DefaultExternalTransition<TestStates, TestEvents>(
            stateS1, stateS2, actionsFromS1ToS2, TestEvents.E2, null,
            new EventTrigger<TestStates, TestEvents>(TestEvents.E2));

    Collection<Action<TestStates, TestEvents>> actionsFromS2ToS3 = new ArrayList<Action<TestStates, TestEvents>>();
    actionsFromS1ToS2.add(new LoggingAction("actionsFromS2ToS3"));
    DefaultExternalTransition<TestStates, TestEvents> transitionFromS2ToS3 = new DefaultExternalTransition<TestStates, TestEvents>(
            stateS2, stateS3, actionsFromS2ToS3, TestEvents.E3, null,
            new EventTrigger<TestStates, TestEvents>(TestEvents.E3));

    transitions.add(transitionFromSIToS1);
    transitions.add(transitionFromS1ToS2);
    transitions.add(transitionFromS2ToS3);

    // create machine
    SyncTaskExecutor taskExecutor = new SyncTaskExecutor();
    BeanFactory beanFactory = new DefaultListableBeanFactory();
    ObjectStateMachine<TestStates, TestEvents> machine = new ObjectStateMachine<TestStates, TestEvents>(states,
            transitions, stateSI);
    machine.setTaskExecutor(taskExecutor);
    machine.setBeanFactory(beanFactory);
    machine.afterPropertiesSet();
    machine.start();

    State<TestStates, TestEvents> initialState = machine.getInitialState();
    assertThat(initialState, is(stateSI));

    State<TestStates, TestEvents> state = machine.getState();
    assertThat(state, is(stateSI));

    machine.sendEvent(MessageBuilder.withPayload(TestEvents.E2).build());
    machine.sendEvent(MessageBuilder.withPayload(TestEvents.E3).build());
    state = machine.getState();
    assertThat(state, is(stateSI));

    machine.sendEvent(MessageBuilder.withPayload(TestEvents.E1).build());
    state = machine.getState();
    assertThat(state, is(stateS3));
}