protected void cloneDatamodel()

in src/main/java/org/apache/commons/scxml2/SCInstance.java [156:223]


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