private static void updateState()

in src/main/java/org/apache/commons/scxml2/io/ModelUpdater.java [228:278]


    private static void updateState(final State state, final Map<String, TransitionTarget> targets)
            throws ModelException {
        final List<EnterableState> children = state.getChildren();
        if (state.isComposite()) {
            //initialize next / initial
            Initial ini = state.getInitial();
            if (ini == null) {
                state.setFirst(children.get(0).getId());
                ini = state.getInitial();
            }
            final SimpleTransition initialTransition = ini.getTransition();
            updateTransition(initialTransition, targets);
            final Set<TransitionTarget> initialStates = initialTransition.getTargets();
            // we have to allow for an indirect descendant initial (targets)
            //check that initialState is a descendant of s
            if (initialStates.isEmpty()) {
                logAndThrowModelError(ERR_STATE_BAD_INIT,
                        new Object[] {getName(state)});
            } else {
                for (final TransitionTarget initialState : initialStates) {
                    if (!initialState.isDescendantOf(state)) {
                        logAndThrowModelError(ERR_STATE_BAD_INIT,
                                new Object[] {getName(state)});
                    }
                }
            }
        }
        else if (state.getInitial() != null) {
            logAndThrowModelError(ERR_UNSUPPORTED_INIT, new Object[] {getName(state)});
        }

        final List<History> histories = state.getHistory();
        if (!histories.isEmpty() && state.isSimple()) {
            logAndThrowModelError(ERR_HISTORY_SIMPLE_STATE,
                    new Object[] {getName(state)});
        }
        for (final History history : histories) {
            updateHistory(history, targets, state);
        }
        for (final Transition transition : state.getTransitionsList()) {
            updateTransition(transition, targets);
        }

        for (final Invoke inv : state.getInvokes()) {
            if (inv.getSrc() != null && inv.getSrcexpr() != null) {
                logAndThrowModelError(ERR_INVOKE_AMBIGUOUS_SRC, new Object[] {getName(state)});
            }
        }

        updateEnterableStates(children, targets);
    }