use of com.serotonin.m2m2.rt.script.AbstractPointWrapper in project ma-core-public by infiniteautomation.
the class MangoJavaScriptService method addToContext.
/**
* Add a data point to the engine scope bindings.
*
* Only to be called while script is not executing.
*/
@SuppressWarnings("unchecked")
public void addToContext(ScriptEngine engine, String varName, DataPointRT dprt, ScriptPointValueSetter setCallback) {
Bindings engineBindings = engine.getBindings(ScriptContext.ENGINE_SCOPE);
AbstractPointWrapper wrapper = wrapPoint(engine, dprt, setCallback);
engineBindings.put(varName, wrapper);
Map<String, IDataPointValueSource> context = (Map<String, IDataPointValueSource>) engineBindings.get(POINTS_MAP_KEY);
context.put(varName, dprt);
Set<String> points = (Set<String>) engineBindings.get(POINTS_CONTEXT_KEY);
if (points != null) {
points.remove(varName);
points.add(varName);
}
String selfPointXid = (String) engineBindings.get(SELF_POINT_XID_KEY);
Map<String, AbstractPointWrapper> external = (Map<String, AbstractPointWrapper>) engineBindings.get(EXTERNAL_POINTS_KEY);
if (!dprt.getVO().getXid().equals(selfPointXid)) {
external.put(varName, wrapper);
}
}
use of com.serotonin.m2m2.rt.script.AbstractPointWrapper in project ma-core-public by infiniteautomation.
the class MangoJavaScriptService method coerce.
/**
* Coerce an object into a DataValue
*/
public DataValue coerce(Object input, DataType toDataType) throws ResultTypeException {
DataValue value;
if (input instanceof DataValue)
return (DataValue) input;
else if (input instanceof PointValueTime)
return ((PointValueTime) input).getValue();
if (input == null) {
if (toDataType == DataType.BINARY)
value = new BinaryValue(false);
else if (toDataType == DataType.MULTISTATE)
value = new MultistateValue(0);
else if (toDataType == DataType.NUMERIC)
value = new NumericValue(0);
else if (toDataType == DataType.ALPHANUMERIC)
value = new AlphanumericValue("");
else
value = null;
} else if (input instanceof AbstractPointWrapper) {
value = ((AbstractPointWrapper) input).getValueImpl();
if ((value != null) && (value.getDataType() != toDataType))
throw new ResultTypeException(new TranslatableMessage("event.script.convertError", input, toDataType.getDescription()));
} else // See if the type matches.
if (toDataType == DataType.BINARY && input instanceof Boolean)
value = new BinaryValue((Boolean) input);
else if (toDataType == DataType.MULTISTATE) {
if (input instanceof Number)
value = new MultistateValue(((Number) input).intValue());
else if (input instanceof String) {
try {
value = new MultistateValue(Integer.parseInt((String) input));
} catch (NumberFormatException e) {
throw new ResultTypeException(new TranslatableMessage("event.script.convertError", input, toDataType.getDescription()));
}
} else
throw new ResultTypeException(new TranslatableMessage("event.script.convertError", input, toDataType.getDescription()));
} else if (toDataType == DataType.NUMERIC) {
if (input instanceof Number)
value = new NumericValue(((Number) input).doubleValue());
else if (input instanceof String) {
try {
value = new NumericValue(Double.parseDouble((String) input));
} catch (NumberFormatException e) {
throw new ResultTypeException(new TranslatableMessage("event.script.convertError", input, toDataType.getDescription()));
}
} else
throw new ResultTypeException(new TranslatableMessage("event.script.convertError", input, toDataType.getDescription()));
} else if (toDataType == DataType.ALPHANUMERIC)
value = new AlphanumericValue(input.toString());
else
// If not, ditch it.
throw new ResultTypeException(new TranslatableMessage("event.script.convertError", input, toDataType.getDescription()));
return value;
}
use of com.serotonin.m2m2.rt.script.AbstractPointWrapper in project ma-core-public by infiniteautomation.
the class MangoJavaScriptService method removeFromContext.
/**
* Remove a data point from the engine scope bindings.
*
* Only to be called while the script is not executing.
*/
@SuppressWarnings("unchecked")
public void removeFromContext(ScriptEngine engine, String varName) {
Bindings engineBindings = engine.getBindings(ScriptContext.ENGINE_SCOPE);
Map<String, IDataPointValueSource> context = (Map<String, IDataPointValueSource>) engineBindings.get(POINTS_MAP_KEY);
context.remove(varName);
Set<String> points = (Set<String>) engineBindings.get(POINTS_CONTEXT_KEY);
if (points != null) {
points.remove(varName);
}
engineBindings.remove(varName);
Map<String, AbstractPointWrapper> external = (Map<String, AbstractPointWrapper>) engineBindings.get(EXTERNAL_POINTS_KEY);
external.remove(varName);
}
use of com.serotonin.m2m2.rt.script.AbstractPointWrapper 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.serotonin.m2m2.rt.script.AbstractPointWrapper in project ma-core-public by infiniteautomation.
the class DataSourceQuery method getPointsForSource.
/**
* Helper to extract points for a source
*/
private List<DataPointWrapper> getPointsForSource(DataSourceVO ds) {
List<DataPointWrapper> points = new ArrayList<DataPointWrapper>();
List<DataPointVO> dataPoints = DataPointDao.getInstance().getDataPoints(ds.getId());
for (DataPointVO vo : dataPoints) {
DataPointRT rt = Common.runtimeManager.getDataPoint(vo.getId());
AbstractPointWrapper wrapper = null;
if (rt != null)
wrapper = service.wrapPoint(engine, rt, setter);
points.add(new DataPointWrapper(vo, wrapper));
}
return points;
}
Aggregations