in src/main/java/org/apache/commons/scxml2/io/SCXMLReader.java [915:1001]
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 descendent 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);
}
}
}