use of com.infiniteautomation.mango.util.script.ScriptUtility in project ma-core-public by MangoAutomation.
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);
}
}
use of com.infiniteautomation.mango.util.script.ScriptUtility in project ma-core-public by MangoAutomation.
the class MangoJavaScriptService method execute.
/**
* Reset result and execute script for any type of result
*/
public void execute(CompiledMangoJavaScript script, long runtime, long timestamp) throws ScriptError, ScriptPermissionsException {
try {
runAs.runAsCallable(script.getPermissionHolder(), () -> {
script.getResult().reset();
// Setup the wrapper context
Bindings engineScope = script.getEngine().getBindings(ScriptContext.ENGINE_SCOPE);
engineScope.put(MangoJavaScriptService.WRAPPER_CONTEXT_KEY, new WrapperContext(runtime, timestamp));
// Ensure the result is available to the utilities
for (ScriptUtility util : script.getUtilities()) {
util.setResult(script.getResult());
}
// Initialize additional utilities
for (ScriptUtility util : script.getAdditionalUtilities()) util.setResult(script.getResult());
Object resultObject = script.getCompiledScript().eval();
script.getResult().setResult(resultObject);
return null;
});
} 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
throw new ShouldNeverHappenException(e);
} catch (Exception e) {
throw new ShouldNeverHappenException(e);
}
}
use of com.infiniteautomation.mango.util.script.ScriptUtility in project ma-core-public by MangoAutomation.
the class MangoJavascriptContextObjectDefinition method initializeContextObject.
public ScriptUtility initializeContextObject(CompiledMangoJavaScript script) {
Class<? extends ScriptUtility> utilityClass = script.isTestRun() ? getTestUtilityClass() : getUtilityClass();
// Auto wire this guy
ScriptUtility utility = Common.getRuntimeContext().getAutowireCapableBeanFactory().createBean(utilityClass);
utility.setPermissions(script.getPermissionHolder());
utility.setScriptEngine(script.getEngine());
return utility;
}
use of com.infiniteautomation.mango.util.script.ScriptUtility 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);
}
}
use of com.infiniteautomation.mango.util.script.ScriptUtility in project ma-core-public by infiniteautomation.
the class MangoJavascriptContextObjectDefinition method initializeContextObject.
public ScriptUtility initializeContextObject(CompiledMangoJavaScript script) {
Class<? extends ScriptUtility> utilityClass = script.isTestRun() ? getTestUtilityClass() : getUtilityClass();
// Auto wire this guy
ScriptUtility utility = Common.getRuntimeContext().getAutowireCapableBeanFactory().createBean(utilityClass);
utility.setPermissions(script.getPermissionHolder());
utility.setScriptEngine(script.getEngine());
return utility;
}
Aggregations