in src/main/java/org/apache/commons/scxml2/semantics/SCXMLSemanticsImpl.java [420:457]
public void exitStates(final SCXMLExecutionContext exctx, final Step step,
final Set<TransitionalState> statesToInvoke)
throws ModelException {
if (step.getExitSet().isEmpty()) {
return;
}
final ArrayList<EnterableState> exitList = new ArrayList<>(step.getExitSet());
exitList.sort(DocumentOrder.reverseDocumentOrderComparator);
for (final EnterableState es : exitList) {
if (es instanceof TransitionalState && ((TransitionalState)es).hasHistory()) {
// persist the new history configurations for this state to exit
for (final History h : ((TransitionalState)es).getHistory()) {
exctx.getScInstance().setLastConfiguration(h, step.getNewHistoryConfigurations().get(h));
}
}
boolean onexitEventRaised = false;
for (final OnExit onexit : es.getOnExits()) {
executeContent(exctx, onexit);
if (!onexitEventRaised && onexit.isRaiseEvent()) {
onexitEventRaised = true;
exctx.getInternalIOProcessor().addEvent(new EventBuilder("exit.state."+es.getId(), TriggerEvent.CHANGE_EVENT).build());
}
}
exctx.getNotificationRegistry().fireOnExit(es, es);
exctx.getNotificationRegistry().fireOnExit(exctx.getStateMachine(), es);
if (es instanceof TransitionalState && !statesToInvoke.remove(es)) {
// check if invokers are active in this state
for (final Invoke inv : ((TransitionalState)es).getInvokes()) {
exctx.cancelInvoker(inv);
}
}
exctx.getScInstance().getStateConfiguration().exitState(es);
}
}