Example usage for org.springframework.statemachine.trigger Trigger getEvent

List of usage examples for org.springframework.statemachine.trigger Trigger getEvent

Introduction

In this page you can find the example usage for org.springframework.statemachine.trigger Trigger getEvent.

Prototype

E getEvent();

Source Link

Document

Gets the event associated with this trigger.

Usage

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

private void processTriggerQueue() {
    if (!isRunning()) {
        return;//from   w ww  . ja  v  a2  s.  c  om
    }
    if (!initialHandled.getAndSet(true)) {
        ArrayList<Transition<S, E>> trans = new ArrayList<Transition<S, E>>();
        trans.add(initialTransition);
        // TODO: should we merge if initial event is actually used?
        if (initialEvent != null) {
            handleInitialTrans(initialTransition, initialEvent);
        } else {
            handleInitialTrans(initialTransition, forwardedInitialEvent);
        }
        return;
    }
    if (log.isDebugEnabled()) {
        log.debug("Process trigger queue, size=" + triggerQueue.size() + " " + this);
    }
    TriggerQueueItem queueItem = triggerQueue.poll();
    // keep message here so that we can
    // pass it to triggerless transitions
    State<S, E> currentState = stateMachine.getState();
    if (queueItem != null && currentState != null) {
        if (log.isDebugEnabled()) {
            log.debug("Process trigger item " + queueItem + " " + this);
        }
        // queued message is kept on a class level order to let
        // triggerless transition to receive this message if it doesn't
        // kick in in this poll loop.
        queuedMessage = queueItem.message;
        E event = queuedMessage != null ? queuedMessage.getPayload() : null;

        // need all transitions trigger could match, event trigger may match
        // multiple
        // need to go up from substates and ask if trigger transit, if not
        // check super
        ArrayList<Transition<S, E>> trans = new ArrayList<Transition<S, E>>();

        if (event != null) {
            ArrayList<S> ids = new ArrayList<S>(currentState.getIds());
            Collections.reverse(ids);
            for (S id : ids) {
                for (Entry<Trigger<S, E>, Transition<S, E>> e : triggerToTransitionMap.entrySet()) {
                    Trigger<S, E> tri = e.getKey();
                    E ee = tri.getEvent();
                    Transition<S, E> tra = e.getValue();
                    if (event.equals(ee)) {
                        if (tra.getSource().getId().equals(id) && !trans.contains(tra)) {
                            trans.add(tra);
                            continue;
                        }
                    }
                }
            }
        }

        // most likely timer
        if (trans.isEmpty()) {
            trans.add(triggerToTransitionMap.get(queueItem.trigger));
        }

        // go through candidates and transit max one
        handleTriggerTrans(trans, queuedMessage);
    }
    if (stateMachine.getState() != null) {
        // loop triggerless transitions here so that
        // all "chained" transitions will get queue message
        boolean transit = false;
        do {
            transit = handleTriggerTrans(triggerlessTransitions, queuedMessage);
        } while (transit);
    }
}