Example usage for org.springframework.statemachine.state State getId

List of usage examples for org.springframework.statemachine.state State getId

Introduction

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

Prototype

S getId();

Source Link

Document

Gets the state identifier.

Usage

From source file:ru.asmsoft.p2p.fsm.NodeStateMachineListener.java

@Override
public void stateChanged(State<NodeStates, NodeEvents> from, State<NodeStates, NodeEvents> to) {
    logger.info("State changed from [{}] to [{}]", (from != null ? from.getId() : "null"),
            (to != null ? to.getId() : "null"));
}

From source file:demo.web.StateMachineController.java

@PostConstruct
public void setup() {

    stateMachine.addStateListener(new StateMachineListenerAdapter<States, Events>() {
        @Override//from  w  ww . j  av  a2 s .  co  m
        public void stateEntered(State<States, Events> state) {
            StateMachineMessage message = new StateMachineMessage();
            message.setMessage("Enter state " + state.getId().toString());
            simpMessagingTemplate.convertAndSend("/topic/sm.message", message);
        }

        @Override
        public void stateExited(State<States, Events> state) {
            StateMachineMessage message = new StateMachineMessage();
            message.setMessage("Exit state " + state.getId().toString());
            simpMessagingTemplate.convertAndSend("/topic/sm.message", message);
        }

        @Override
        public void stateChanged(State<States, Events> from, State<States, Events> to) {
            Map<Object, Object> variables = stateMachine.getExtendedState().getVariables();
            ArrayList<StateMachineEvent> list = new ArrayList<StateMachineEvent>();
            for (States state : stateMachine.getState().getIds()) {
                list.add(new StateMachineEvent(state.toString()));
            }
            simpMessagingTemplate.convertAndSend("/topic/sm.states", list);
            simpMessagingTemplate.convertAndSend("/topic/sm.variables", variables);
        }

        @Override
        public void transitionEnded(Transition<States, Events> transition) {
            if (transition != null && transition.getKind() == TransitionKind.INTERNAL) {
                Map<Object, Object> variables = stateMachine.getExtendedState().getVariables();
                simpMessagingTemplate.convertAndSend("/topic/sm.variables", variables);
            }
        }

        @Override
        public void stateMachineError(StateMachine<States, Events> stateMachine, Exception exception) {
            handleStateMachineError(new StateMachineException("Received error from machine", exception));
        }

    });

    stateMachineEnsemble.addEnsembleListener(new EnsembleListenerAdapter<States, Events>() {

        @Override
        public void ensembleLeaderGranted(StateMachine<States, Events> stateMachine) {
            StateMachineMessage message = new StateMachineMessage();
            message.setMessage("Leader granted " + stateMachine.getUuid().toString());
            simpMessagingTemplate.convertAndSend("/topic/sm.message", message);
        }

        @Override
        public void ensembleLeaderRevoked(StateMachine<States, Events> stateMachine) {
            StateMachineMessage message = new StateMachineMessage();
            message.setMessage("Leader revoked " + stateMachine.getUuid().toString());
            simpMessagingTemplate.convertAndSend("/topic/sm.message", message);
        }
    });
}

From source file:com.netflix.genie.agent.execution.statemachine.StateMachineAutoConfigurationTest.java

private void cancelJobAfterEnteringState(final States targetState) {
    this.sm.getStateMachineAccessor().doWithAllRegions(function -> function
            .addStateMachineInterceptor(new StateMachineInterceptorAdapter<States, Events>() {
                @Override/*ww  w  .j a  v a2s .  c om*/
                public void postStateChange(final State<States, Events> state, final Message<Events> message,
                        final Transition<States, Events> transition,
                        final StateMachine<States, Events> stateMachine) {
                    log.info("Sending event {} after transitioning to state: {}", Events.CANCEL_JOB_LAUNCH,
                            targetState);
                    if (state.getId() == targetState) {
                        stateMachine.sendEvent(Events.CANCEL_JOB_LAUNCH);
                    }
                }
            }));
}

From source file:com.netflix.genie.agent.execution.statemachine.StateMachineAutoConfigurationTest.java

private void cancelJobBeforeEnteringState(final States targetState) {
    this.sm.getStateMachineAccessor().doWithAllRegions(function -> function
            .addStateMachineInterceptor(new StateMachineInterceptorAdapter<States, Events>() {
                @Override/* w w  w.  j  av a  2 s .  com*/
                public void preStateChange(final State<States, Events> state, final Message<Events> message,
                        final Transition<States, Events> transition,
                        final StateMachine<States, Events> stateMachine) {
                    log.info("Sending event {} before transitioning to state: {}", Events.CANCEL_JOB_LAUNCH,
                            targetState);
                    if (state.getId() == targetState) {
                        stateMachine.sendEvent(Events.CANCEL_JOB_LAUNCH);
                    }
                }
            }));
}

From source file:org.springframework.statemachine.support.AbstractStateMachine.java

@Override
public String toString() {
    ArrayList<State<S, E>> all = new ArrayList<State<S, E>>();
    for (State<S, E> s : states) {
        all.addAll(s.getStates());/*from   w ww .j a v  a2s  . c  om*/
    }
    StringBuilder buf = new StringBuilder();
    for (State<S, E> s : all) {
        buf.append(s.getId() + " ");
    }
    buf.append(" / ");
    if (currentState != null) {
        buf.append(StringUtils.collectionToCommaDelimitedString(currentState.getIds()));
    }
    buf.append(" / uuid=");
    buf.append(uuid);
    buf.append(" / id=");
    buf.append(id);
    return buf.toString();
}

From source file:org.springframework.statemachine.support.AbstractStateMachine.java

@Override
public void resetStateMachine(StateMachineContext<S, E> stateMachineContext) {
    // TODO: this function needs a serious rewrite
    if (stateMachineContext == null) {
        log.info("Got null context, resetting to initial state and clearing extended state");
        currentState = initialState;/*www  . j  ava 2  s  . c o m*/
        extendedState.getVariables().clear();
        return;
    }
    if (log.isDebugEnabled()) {
        log.debug("Request to reset state machine: stateMachine=[" + this + "] stateMachineContext=["
                + stateMachineContext + "]");
    }
    setId(stateMachineContext.getId());
    S state = stateMachineContext.getState();
    boolean stateSet = false;
    // handle state reset
    for (State<S, E> s : getStates()) {
        for (State<S, E> ss : s.getStates()) {
            if (state != null && ss.getIds().contains(state)) {
                currentState = s;
                // setting lastState here is needed for restore
                lastState = currentState;
                // TODO: not sure about starting submachine/regions here, though
                //       needed if we only transit to super state or reset regions
                if (s.isSubmachineState()) {
                    StateMachine<S, E> submachine = ((AbstractState<S, E>) s).getSubmachine();
                    for (final StateMachineContext<S, E> child : stateMachineContext.getChilds()) {
                        submachine.getStateMachineAccessor()
                                .doWithRegion(new StateMachineFunction<StateMachineAccess<S, E>>() {

                                    @Override
                                    public void apply(StateMachineAccess<S, E> function) {
                                        function.resetStateMachine(child);
                                    }
                                });
                    }
                    submachine.start();
                } else if (s.isOrthogonal() && stateMachineContext.getChilds() != null) {
                    Collection<Region<S, E>> regions = ((AbstractState<S, E>) s).getRegions();
                    for (Region<S, E> region : regions) {
                        for (final StateMachineContext<S, E> child : stateMachineContext.getChilds()) {
                            ((StateMachine<S, E>) region).getStateMachineAccessor()
                                    .doWithRegion(new StateMachineFunction<StateMachineAccess<S, E>>() {

                                        @Override
                                        public void apply(StateMachineAccess<S, E> function) {
                                            function.resetStateMachine(child);
                                        }
                                    });
                        }
                    }
                    for (Region<S, E> region : regions) {
                        region.start();
                    }
                }

                if (log.isDebugEnabled()) {
                    log.debug("State reseted: stateMachine=[" + this + "] stateMachineContext=["
                            + stateMachineContext + "]");
                }
                stateSet = true;
                break;
            } else if (!stateMachineContext.getChilds().isEmpty()) {
                // we're here because root machine only have regions
                if (s.isOrthogonal()) {
                    Collection<Region<S, E>> regions = ((AbstractState<S, E>) s).getRegions();
                    for (Region<S, E> region : regions) {
                        for (final StateMachineContext<S, E> child : stateMachineContext.getChilds()) {
                            ((StateMachine<S, E>) region).getStateMachineAccessor()
                                    .doWithRegion(new StateMachineFunction<StateMachineAccess<S, E>>() {

                                        @Override
                                        public void apply(StateMachineAccess<S, E> function) {
                                            function.resetStateMachine(child);
                                        }
                                    });
                        }
                    }
                    for (Region<S, E> region : regions) {
                        region.start();
                    }
                }
            }
        }
        if (stateSet) {
            break;
        }
    }

    // handle history reset here as above state reset loop breaks out
    if (history != null && stateMachineContext.getHistoryStates() != null) {
        // setting history for 'this' machine
        State<S, E> h = null;
        for (State<S, E> hh : getStates()) {
            if (hh.getId().equals(stateMachineContext.getHistoryStates().get(null))) {
                h = hh;
                break;
            }
        }
        if (h != null) {
            ((HistoryPseudoState<S, E>) history).setState(h);
        }
    }
    for (State<S, E> s : getStates()) {
        // setting history for 'submachines'
        if (s.isSubmachineState()) {
            StateMachine<S, E> submachine = ((AbstractState<S, E>) s).getSubmachine();
            PseudoState<S, E> submachineHistory = ((AbstractStateMachine<S, E>) submachine).getHistoryState();
            if (submachineHistory != null) {
                State<S, E> h = null;
                for (State<S, E> hh : submachine.getStates()) {
                    if (hh.getId().equals(stateMachineContext.getHistoryStates().get(s.getId()))) {
                        h = hh;
                        break;
                    }
                }
                if (h != null) {
                    ((HistoryPseudoState<S, E>) submachineHistory).setState(h);
                }
            }

        }
    }
    if (stateSet && stateMachineContext.getExtendedState() != null) {
        this.extendedState = stateMachineContext.getExtendedState();
    }
}

From source file:org.springframework.statemachine.test.StateMachineTestPlan.java

/**
 * Run test plan.//from  w w w  .j  a v  a2  s .c o  m
 *
 * @throws Exception the exception
 */
public void test() throws Exception {

    Map<StateMachine<S, E>, LatchStateMachineListener<S, E>> listeners = new HashMap<StateMachine<S, E>, LatchStateMachineListener<S, E>>();
    for (StateMachine<S, E> stateMachine : stateMachines.values()) {
        LatchStateMachineListener<S, E> listener = new LatchStateMachineListener<S, E>();
        listeners.put(stateMachine, listener);
        stateMachine.addStateListener(listener);
    }
    log.info("Running test plan for machines "
            + StringUtils.collectionToCommaDelimitedString(stateMachines.values()));

    int stepCounter = 0;
    for (StateMachineTestPlanStep<S, E> step : steps) {
        log.info("Running test plan step " + stepCounter++);
        for (LatchStateMachineListener<S, E> listener : listeners.values()) {
            listener.reset(step.expectStateChanged != null ? step.expectStateChanged : 0,
                    step.expectStateEntered != null ? step.expectStateEntered : 0,
                    step.expectStateExited != null ? step.expectStateExited : 0,
                    step.expectEventNotAccepted != null ? step.expectEventNotAccepted : 0,
                    step.expectTransition != null ? step.expectTransition : 0,
                    step.expectTransitionStarted != null ? step.expectTransitionStarted : 0,
                    step.expectTransitionEnded != null ? step.expectTransitionEnded : 0,
                    step.expectStateMachineStarted != null ? step.expectStateMachineStarted : 0,
                    step.expectStateMachineStopped != null ? step.expectStateMachineStopped : 0,
                    step.expectExtendedStateChanged != null ? step.expectExtendedStateChanged : 0);
        }

        // need to call start here, ok to call from all steps
        for (StateMachine<S, E> stateMachine : stateMachines.values()) {
            stateMachine.start();
        }

        if (step.expectStateMachineStarted != null) {
            for (Entry<StateMachine<S, E>, LatchStateMachineListener<S, E>> entry : listeners.entrySet()) {
                assertThat(
                        "StateMachineStarted Await not matched for machine " + entry.getKey(), entry.getValue()
                                .getStateMachineStartedLatch().await(defaultAwaitTime, TimeUnit.SECONDS),
                        is(true));
                assertThat("StateMachineStarted count not matched for machine " + entry.getKey(),
                        entry.getValue().getStateMachineStarted().size(), is(step.expectStateMachineStarted));
            }
        }

        if (!step.sendEvent.isEmpty()) {
            ArrayList<StateMachine<S, E>> sendVia = new ArrayList<StateMachine<S, E>>();
            if (step.sendEventMachineId != null) {
                sendVia.add(stateMachines.get(step.sendEventMachineId));
            } else if (step.sendEventToAll) {
                sendVia.addAll(stateMachines.values());
            } else {
                sendVia.add(stateMachines.values().iterator().next());
            }
            assertThat("Error finding machine to send via", sendVia, not(empty()));
            if (!step.sendEventParallel) {
                for (StateMachine<S, E> machine : sendVia) {
                    for (E event : step.sendEvent) {
                        log.info("Sending test event " + event + " via machine " + machine);
                        machine.sendEvent(event);
                    }
                }
            } else {
                for (E event : step.sendEvent) {
                    sendEventParallel(sendVia, event);
                }
            }
        } else if (!step.sendMessage.isEmpty()) {
            ArrayList<StateMachine<S, E>> sendVia = new ArrayList<StateMachine<S, E>>();
            if (step.sendEventMachineId != null) {
                sendVia.add(stateMachines.get(step.sendEventMachineId));
            } else if (step.sendEventToAll) {
                sendVia.addAll(stateMachines.values());
            } else {
                sendVia.add(stateMachines.values().iterator().next());
            }
            assertThat("Error finding machine to send via", sendVia, not(empty()));
            for (StateMachine<S, E> machine : sendVia) {
                for (Message<E> event : step.sendMessage) {
                    log.info("Sending test event " + event + " via machine " + machine);
                    machine.sendEvent(event);
                }
            }
        }

        if (step.expectStateChanged != null) {
            for (Entry<StateMachine<S, E>, LatchStateMachineListener<S, E>> entry : listeners.entrySet()) {
                assertThat("StateChanged Await not matched for machine " + entry.getKey(),
                        entry.getValue().getStateChangedLatch().await(defaultAwaitTime, TimeUnit.SECONDS),
                        is(true));
                assertThat("StateChanged count not matched for machine " + entry.getKey(),
                        entry.getValue().getStateChanged().size(), is(step.expectStateChanged));
            }
        }

        if (step.expectStateEntered != null) {
            for (LatchStateMachineListener<S, E> listener : listeners.values()) {
                assertThat(listener.getStateEnteredLatch().await(defaultAwaitTime, TimeUnit.SECONDS), is(true));
                assertThat(listener.getStateEntered().size(), is(step.expectStateEntered));
            }
        }

        if (step.expectStateExited != null) {
            for (LatchStateMachineListener<S, E> listener : listeners.values()) {
                assertThat(listener.getStateExitedLatch().await(defaultAwaitTime, TimeUnit.SECONDS), is(true));
                assertThat(listener.getStateExited().size(), is(step.expectStateExited));
            }
        }

        if (step.expectEventNotAccepted != null) {
            for (LatchStateMachineListener<S, E> listener : listeners.values()) {
                assertThat(listener.getEventNotAcceptedLatch().await(defaultAwaitTime, TimeUnit.SECONDS),
                        is(true));
                assertThat(listener.getEventNotAccepted().size(), is(step.expectEventNotAccepted));
            }
        }

        if (step.expectTransition != null) {
            for (LatchStateMachineListener<S, E> listener : listeners.values()) {
                assertThat(listener.getTransitionLatch().await(defaultAwaitTime, TimeUnit.SECONDS), is(true));
                assertThat(listener.getTransition().size(), is(step.expectTransition));
            }
        }

        if (step.expectTransitionStarted != null) {
            for (LatchStateMachineListener<S, E> listener : listeners.values()) {
                assertThat(listener.getTransitionStartedLatch().await(defaultAwaitTime, TimeUnit.SECONDS),
                        is(true));
                assertThat(listener.getTransitionStarted().size(), is(step.expectTransitionStarted));
            }
        }

        if (step.expectTransitionEnded != null) {
            for (LatchStateMachineListener<S, E> listener : listeners.values()) {
                assertThat(listener.getTransitionEndedLatch().await(defaultAwaitTime, TimeUnit.SECONDS),
                        is(true));
                assertThat(listener.getTransitionEnded().size(), is(step.expectTransitionEnded));
            }
        }

        if (step.expectStateMachineStopped != null) {
            for (LatchStateMachineListener<S, E> listener : listeners.values()) {
                assertThat(listener.getStateMachineStoppedLatch().await(defaultAwaitTime, TimeUnit.SECONDS),
                        is(true));
                assertThat(listener.getStateMachineStopped().size(), is(step.expectStateMachineStopped));
            }
        }

        if (!step.expectStates.isEmpty()) {
            for (StateMachine<S, E> stateMachine : stateMachines.values()) {
                assertThat(stateMachine.getState(), notNullValue());
                Collection<Matcher<? super S>> itemMatchers = new ArrayList<Matcher<? super S>>();
                for (S expectState : step.expectStates) {
                    itemMatchers.add(is(expectState));
                }
                assertThat(stateMachine.getState().getIds(), containsInAnyOrder(itemMatchers));
            }
        }

        if (!step.expectStatesEntrered.isEmpty()) {
            for (LatchStateMachineListener<S, E> listener : listeners.values()) {
                Collection<S> states = new ArrayList<S>();
                for (State<S, E> s : listener.getStateEntered()) {
                    states.add(s.getId());
                }
                assertThat(step.expectStatesEntrered, contains(states.toArray()));
            }
        }

        if (!step.expectStatesExited.isEmpty()) {
            for (LatchStateMachineListener<S, E> listener : listeners.values()) {
                Collection<S> states = new ArrayList<S>();
                for (State<S, E> s : listener.getStateExited()) {
                    states.add(s.getId());
                }
                assertThat(step.expectStatesExited, contains(states.toArray()));
            }
        }

        if (step.expectExtendedStateChanged != null) {
            for (LatchStateMachineListener<S, E> listener : listeners.values()) {
                assertThat(listener.getExtendedStateChangedLatch().await(defaultAwaitTime, TimeUnit.SECONDS),
                        is(true));
                assertThat(listener.getExtendedStateChanged().size(), is(step.expectExtendedStateChanged));
            }
        }

        if (!step.expectVariableKeys.isEmpty()) {
            for (StateMachine<S, E> stateMachine : stateMachines.values()) {
                Map<Object, Object> variables = stateMachine.getExtendedState().getVariables();
                for (Object key : step.expectVariableKeys) {
                    assertThat("Key " + key + " doesn't exist in extended state variables",
                            variables.containsKey(key), is(true));
                }
            }
        }

        if (!step.expectVariables.isEmpty()) {
            for (StateMachine<S, E> stateMachine : stateMachines.values()) {
                Map<Object, Object> variables = stateMachine.getExtendedState().getVariables();
                for (Entry<Object, Object> entry : step.expectVariables.entrySet()) {
                    assertThat("Key " + entry.getKey() + " doesn't exist in extended state variables",
                            variables.containsKey(entry.getKey()), is(true));
                    assertThat("Variable " + entry.getKey() + " doesn't match in extended state variables",
                            variables.get(entry.getKey()), is(entry.getValue()));
                }
            }
        }
    }
}