public Transition getNextTransition()

in jbatch/src/main/java/org/apache/batchee/container/navigator/AbstractNavigator.java [75:125]


    public Transition getNextTransition(ExecutionElement currentElem, List<ExecutionElement> peerExecutionElements, ExecutionStatus currentStatus)
        throws IllegalTransitionException {
        Transition returnTransition = new Transition();

        ExecutionElement nextExecutionElement = null;

        List<TransitionElement> transitionElements = currentElem.getTransitionElements();

        // Check the transition elements first.
        if (!transitionElements.isEmpty()) {
            for (final TransitionElement t : transitionElements) {
                boolean isMatched = matchExitStatusAgainstOnAttribute(currentStatus.getExitStatus(), t);
                if (isMatched) {
                    if (t instanceof Next) {
                        Next next = (Next) t;
                        nextExecutionElement = getExecutionElementFromId(peerExecutionElements, next.getTo());
                        returnTransition.setNextExecutionElement(nextExecutionElement);
                        break;
                    } else {
                        returnTransition.setTransitionElement(t);
                    }
                    return returnTransition;
                }
            }
        }

        // We've returned already if we matched a Stop, End or Fail
        if (nextExecutionElement == null) {
            if (currentStatus.getExtendedBatchStatus().equals(ExtendedBatchStatus.EXCEPTION_THROWN)) {
                returnTransition.setNoTransitionElementMatchAfterException();
                return returnTransition;
            } else {
                nextExecutionElement = getNextExecutionElemFromAttribute(peerExecutionElements, currentElem);
                returnTransition.setNextExecutionElement(nextExecutionElement);
            }
        }

        if (nextExecutionElement != null) {
            if (alreadyExecutedElements.containsKey(nextExecutionElement.getId())) {
                throw new IllegalTransitionException("Execution loop detected !!!  Trying to re-execute execution element: " + nextExecutionElement.getId());
            }

            // We allow repeating a decision
            if (!(nextExecutionElement instanceof Decision)) {
                alreadyExecutedElements.put(nextExecutionElement.getId(), nextExecutionElement);
            }
        } else {
            returnTransition.setFinishedTransitioning();
        }
        return returnTransition;
    }