Search in sources :

Example 1 with MangoJavascriptContextObjectDefinition

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);
    }
}
Also used : MangoJavascriptContextObjectDefinition(com.serotonin.m2m2.module.MangoJavascriptContextObjectDefinition) HashMap(java.util.HashMap) SimpleBindings(javax.script.SimpleBindings) Bindings(javax.script.Bindings) ScriptException(javax.script.ScriptException) Entry(java.util.Map.Entry) ScriptPermissionsException(com.serotonin.m2m2.rt.script.ScriptPermissionsException) IDataPointValueSource(com.serotonin.m2m2.rt.dataImage.IDataPointValueSource) ShouldNeverHappenException(com.serotonin.ShouldNeverHappenException) AbstractPointWrapper(com.serotonin.m2m2.rt.script.AbstractPointWrapper) ScriptUtility(com.infiniteautomation.mango.util.script.ScriptUtility) HashSet(java.util.HashSet)

Aggregations

ScriptUtility (com.infiniteautomation.mango.util.script.ScriptUtility)1 ShouldNeverHappenException (com.serotonin.ShouldNeverHappenException)1 MangoJavascriptContextObjectDefinition (com.serotonin.m2m2.module.MangoJavascriptContextObjectDefinition)1 IDataPointValueSource (com.serotonin.m2m2.rt.dataImage.IDataPointValueSource)1 AbstractPointWrapper (com.serotonin.m2m2.rt.script.AbstractPointWrapper)1 ScriptPermissionsException (com.serotonin.m2m2.rt.script.ScriptPermissionsException)1 HashMap (java.util.HashMap)1 HashSet (java.util.HashSet)1 Entry (java.util.Map.Entry)1 Bindings (javax.script.Bindings)1 ScriptException (javax.script.ScriptException)1 SimpleBindings (javax.script.SimpleBindings)1