in src/main/java/org/apache/commons/scxml2/semantics/SCXMLSemanticsImpl.java [289:341]
public void enterStates(final SCXMLExecutionContext exctx, final Step step,
final Set<TransitionalState> statesToInvoke)
throws ModelException {
if (step.getEntrySet().isEmpty()) {
return;
}
final ArrayList<EnterableState> entryList = new ArrayList<>(step.getEntrySet());
entryList.sort(DocumentOrder.documentOrderComparator);
for (final EnterableState es : entryList) {
exctx.getScInstance().getStateConfiguration().enterState(es);
// ensure state context creation and datamodel cloned
exctx.getScInstance().getContext(es);
if (es instanceof TransitionalState && !((TransitionalState)es).getInvokes().isEmpty()) {
statesToInvoke.add((TransitionalState) es);
}
boolean onentryEventRaised = false;
for (final OnEntry onentry : es.getOnEntries()) {
executeContent(exctx, onentry);
if (!onentryEventRaised && onentry.isRaiseEvent()) {
onentryEventRaised = true;
exctx.getInternalIOProcessor().addEvent(new EventBuilder("entry.state."+es.getId(), TriggerEvent.CHANGE_EVENT).build());
}
}
exctx.getNotificationRegistry().fireOnEntry(es, es);
exctx.getNotificationRegistry().fireOnEntry(exctx.getStateMachine(), es);
if (es instanceof State && step.getDefaultEntrySet().contains(es) && ((State)es).getInitial() != null) {
executeContent(exctx, ((State)es).getInitial().getTransition());
}
if (es instanceof TransitionalState) {
final SimpleTransition hTransition = step.getDefaultHistoryTransitions().get(es);
if (hTransition != null) {
executeContent(exctx, hTransition);
}
}
if (es instanceof Final) {
final State parent = (State)es.getParent();
if (parent == null) {
exctx.stop();
}
else {
final Object donedata = ((Final)es).processDoneData(exctx);
exctx.getInternalIOProcessor().addEvent(new EventBuilder("done.state."+parent.getId(),TriggerEvent.CHANGE_EVENT).data(donedata).build());
if (parent.isRegion() && isInFinalState(parent.getParent(), exctx.getScInstance().getStateConfiguration().getActiveStates())) {
exctx.getInternalIOProcessor().addEvent(new EventBuilder("done.state."+parent.getParent().getId()
, TriggerEvent.CHANGE_EVENT).build());
}
}
}
}
}