use of com.serotonin.m2m2.module.MangoJavascriptContextObjectDefinition in project ma-core-public by infiniteautomation.
the class MangoJavaScriptService method initialize.
/**
* Reset the engine scope of a script and initialize for running
* @param context - if provided points will be wrapped with script's setter (alternatively use script.addToContext()
*/
public void initialize(CompiledMangoJavaScript script, Map<String, IDataPointValueSource> context) throws ScriptError {
if (context == null) {
context = new HashMap<>();
}
Bindings engineScope = script.getEngine().getBindings(ScriptContext.ENGINE_SCOPE);
// TODO Clear engine scope completely?
engineScope.put(MangoJavaScriptService.UNCHANGED_KEY, MangoJavaScriptService.UNCHANGED);
Set<String> points = new HashSet<>();
engineScope.put(MangoJavaScriptService.POINTS_CONTEXT_KEY, points);
// Holder for modifying timestamps of meta points, in Engine Scope so it can be modified by all
engineScope.put(MangoJavaScriptService.TIMESTAMP_CONTEXT_KEY, null);
if (script.getPermissionHolder() != null) {
script.getUtilities().clear();
for (MangoJavascriptContextObjectDefinition def : ModuleRegistry.getMangoJavascriptContextObjectDefinitions()) {
ScriptUtility util = def.initializeContextObject(script);
util.setScriptLog(script.getLog());
util.setResult(script.getResult());
util.takeContext(script.getEngine(), engineScope, script.getSetter(), script.getImportExclusions(), script.isTestRun());
engineScope.put(util.getContextKey(), util);
script.getUtilities().add(util);
}
// Initialize additional utilities
for (ScriptUtility util : script.getAdditionalUtilities()) {
util.setScriptLog(script.getLog());
util.setResult(script.getResult());
util.takeContext(script.getEngine(), engineScope, script.getSetter(), script.getImportExclusions(), script.isTestRun());
engineScope.put(util.getContextKey(), util);
}
}
Set<Entry<String, Object>> entries = script.getAdditionalContext().entrySet();
for (Entry<String, Object> entry : entries) engineScope.put(entry.getKey(), entry.getValue());
String selfPointXid = (String) script.getAdditionalContext().get(SELF_POINT_XID_KEY);
Map<String, AbstractPointWrapper> external = new HashMap<>();
for (String varName : context.keySet()) {
IDataPointValueSource point = context.get(varName);
AbstractPointWrapper wrapped = wrapPoint(script.getEngine(), point, script.getSetter());
engineScope.put(varName, wrapped);
points.add(varName);
if (!point.getVO().getXid().equals(selfPointXid)) {
external.put(varName, wrapped);
}
}
engineScope.put(EXTERNAL_POINTS_KEY, external);
engineScope.put(EXTERNAL_POINTS_ARRAY_KEY, external.values());
engineScope.put(POINTS_MAP_KEY, context);
// Set the print writer and log
script.getEngine().getContext().setWriter(script.getLog().getStdOutWriter());
engineScope.put(ScriptLog.CONTEXT_KEY, script.getLog());
try {
script.getEngine().eval(getGlobalFunctions());
} catch (ScriptException e) {
throw ScriptError.create(e, script.isWrapInFunction());
} catch (RuntimeException e) {
// Nashorn seems to like to wrap exceptions in RuntimeException
if (e.getCause() instanceof ScriptPermissionsException)
throw (ScriptPermissionsException) e.getCause();
else if (e.getCause() != null)
throw ScriptError.createFromThrowable(e.getCause());
else
throw new ShouldNeverHappenException(e);
}
}
Aggregations