public void enterStates()

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());
                    }
                }
            }
        }
    }