in src/main/java/org/apache/commons/scxml2/SCInstance.java [308:378]
protected void cloneDatamodel(final Datamodel datamodel, final Context ctx, final Evaluator evaluator,
final ErrorReporter errorReporter) {
if (datamodel == null || Evaluator.NULL_DATA_MODEL.equals(evaluator.getSupportedDatamodel())) {
return;
}
final List<Data> data = datamodel.getData();
if (data == null) {
return;
}
for (final Data datum : data) {
if (getGlobalContext() == ctx && ctx.has(datum.getId())) {
// earlier/externally defined 'initial' value found: do not overwrite
continue;
}
Object value = null;
boolean setValue = false;
// prefer "src" over "expr" over "inline"
if (datum.getSrc() != null) {
String resolvedSrc = datum.getSrc();
final PathResolver pr = getStateMachine().getPathResolver();
if (pr != null) {
resolvedSrc = pr.resolvePath(resolvedSrc);
}
try {
datum.setParsedValue(ContentParser.DEFAULT_PARSER.parseResource(resolvedSrc));
value = evaluator.cloneData(datum.getParsedValue().getValue());
setValue = true;
} catch (final IOException e) {
if (internalIOProcessor != null) {
internalIOProcessor.addEvent(new EventBuilder(TriggerEvent.ERROR_EXECUTION, TriggerEvent.ERROR_EVENT).build());
}
errorReporter.onError(ErrorConstants.EXECUTION_ERROR, e.getMessage(), datum);
}
}
else if (datum.getExpr() != null) {
try {
value = evaluator.eval(ctx, datum.getExpr());
setValue = true;
} catch (final SCXMLExpressionException see) {
if (internalIOProcessor != null) {
internalIOProcessor.addEvent(new EventBuilder(TriggerEvent.ERROR_EXECUTION, TriggerEvent.ERROR_EVENT).build());
}
errorReporter.onError(ErrorConstants.EXPRESSION_ERROR, see.getMessage(), datum);
}
}
else if (datum.getParsedValue() != null) {
value = evaluator.cloneData(datum.getParsedValue().getValue());
setValue = true;
}
else {
// initialize data value with null
setValue = true;
}
if (setValue) {
if (evaluator instanceof JSEvaluator) {
// the Javascript engine (Nashorn) may require special handling/wrapping of data objects which
// directly injecting them in the context.
try {
((JSEvaluator)evaluator).injectData(ctx, datum.getId(), value);
} catch (final SCXMLExpressionException e) {
if (internalIOProcessor != null) {
internalIOProcessor.addEvent(new EventBuilder(TriggerEvent.ERROR_EXECUTION, TriggerEvent.ERROR_EVENT).build());
}
errorReporter.onError(ErrorConstants.EXPRESSION_ERROR, e.getMessage(), datum);
}
} else {
ctx.setLocal(datum.getId(), value);
}
}
}
}