private static void readTransitionalStateSrc()

in src/main/java/org/apache/commons/scxml2/io/SCXMLReader.java [2664:2750]


    private static void readTransitionalStateSrc(final Configuration configuration, final String src,
                                                 final TransitionalState ts)
            throws ModelException {

        // Check for URI fragment
        final String[] fragments = src.split("#", 2);
        final String location = fragments[0];
        String fragment = null;
        if (fragments.length > 1) {
            fragment = fragments[1];
        }

        // Parse external document
        SCXML externalSCXML;
        try {
            externalSCXML = SCXMLReader.readInternal(configuration, new URL(location), null, null, null, null);
        } catch (final Exception e) {
            final MessageFormat msgFormat = new MessageFormat(ERR_STATE_SRC);
            final String errMsg = msgFormat.format(new Object[] {src});
            throw new ModelException(errMsg + " : " + e.getMessage(), e);
        }

        // Pull in the parts of the external document as needed
        if (fragment == null) {
            // All targets pulled in since its not a src fragment
            if (ts instanceof State) {
                final State s = (State) ts;
                final Initial ini = new Initial();
                final SimpleTransition t = new SimpleTransition();
                t.setNext(externalSCXML.getInitial());
                ini.setTransition(t);
                s.setInitial(ini);
                for (final EnterableState child : externalSCXML.getChildren()) {
                    s.addChild(child);
                }
                s.setDatamodel(externalSCXML.getDatamodel());
            } else if (ts instanceof Parallel) {
                // TODO src attribute for <parallel>
            }
        } else {
            // Need to pull in only descendant targets
            final Object source = externalSCXML.getTargets().get(fragment);
            if (source == null) {
                final MessageFormat msgFormat = new MessageFormat(ERR_STATE_SRC_FRAGMENT);
                final String errMsg = msgFormat.format(new Object[] {src});
                throw new ModelException(errMsg);
            }
            if (source instanceof State && ts instanceof State) {
                final State s = (State) ts;
                final State include = (State) source;
                for (final OnEntry onentry : include.getOnEntries()) {
                    s.addOnEntry(onentry);
                }
                for (final OnExit onexit : include.getOnExits()) {
                    s.addOnExit(onexit);
                }
                s.setDatamodel(include.getDatamodel());
                final List<History> histories = include.getHistory();
                for (final History h : histories) {
                    s.addHistory(h);
                    configuration.parent.addTarget(h);
                }
                for (final EnterableState child : include.getChildren()) {
                    s.addChild(child);
                    configuration.parent.addTarget(child);
                    readInExternalTargets(configuration.parent, child);
                }
                for (final Invoke invoke : include.getInvokes()) {
                    s.addInvoke(invoke);
                }
                if (include.getInitial() != null) {
                    s.setInitial(include.getInitial());
                }
                final List<Transition> transitions = include.getTransitionsList();
                for (final Transition t : transitions) {
                    s.addTransition(t);
                }
            } else if (ts instanceof Parallel && source instanceof Parallel) {
                // TODO src attribute for <parallel>
            } else {
                final MessageFormat msgFormat =
                        new MessageFormat(ERR_STATE_SRC_FRAGMENT_TARGET);
                final String errMsg = msgFormat.format(new Object[] {src});
                throw new ModelException(errMsg);
            }
        }
    }