in src/main/java/org/apache/commons/scxml2/semantics/SCXMLSemanticsImpl.java [564:601]
public void selectTransitions(final SCXMLExecutionContext exctx, final Step step) throws ModelException {
step.getTransitList().clear();
final ArrayList<Transition> enabledTransitions = new ArrayList<>();
final ArrayList<EnterableState> configuration = new ArrayList<>(exctx.getScInstance().getStateConfiguration().getActiveStates());
configuration.sort(DocumentOrder.documentOrderComparator);
final HashSet<EnterableState> visited = new HashSet<>();
final String eventName = step.getEvent() != null ? step.getEvent().getName() : null;
for (EnterableState es : configuration) {
if (es.isAtomicState()) {
if (es instanceof Final) {
// Final states don't have transitions, skip to parent
if (es.getParent() == null) {
// should not happen: a top level active Final state should have stopped the state machine
throw new ModelException("Illegal state machine configuration: encountered top level <final> "
+ "state while processing an event");
}
es = es.getParent();
}
final TransitionalState state = (TransitionalState)es;
TransitionalState current = state;
int ancestorIndex = state.getNumberOfAncestors()-1;
boolean transitionMatched = false;
do {
for (final Transition transition : current.getTransitionsList()) {
if (transitionMatched = matchTransition(exctx, transition, eventName)) {
enabledTransitions.add(transition);
break;
}
}
current = (!transitionMatched && ancestorIndex > -1) ? state.getAncestor(ancestorIndex--) : null;
} while (!transitionMatched && current != null && visited.add(current));
}
}
removeConflictingTransitions(exctx, step, enabledTransitions);
}