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