use of org.csstudio.display.builder.runtime.script.internal.Script in project org.csstudio.display.builder by kasemir.
the class WidgetRuntime method stop.
/**
* Stop: Disconnect PVs, ...
*/
public void stop() {
awaitStartup();
widget.propClass().removePropertyListener(update_widget_class);
final List<RuntimePV> safe_pvs = writable_pvs;
if (safe_pvs != null) {
for (final RuntimePV pv : safe_pvs) {
removePV(pv);
PVFactory.releasePV(pv);
}
writable_pvs = null;
}
final PVNameToValueBinding binding = pv_name_binding.getAndSet(null);
if (binding != null)
binding.dispose();
final Map<ExecuteScriptActionInfo, Script> actions = action_scripts;
if (actions != null) {
actions.clear();
action_scripts = null;
}
final List<RuntimeScriptHandler> handlers = script_handlers;
if (handlers != null) {
for (final RuntimeScriptHandler handler : handlers) handler.shutdown();
script_handlers = null;
}
if (runtime_pvs != null) {
final Collection<RuntimePV> pvs = runtime_pvs.getPVs();
if (!pvs.isEmpty())
logger.log(Level.SEVERE, widget + " has unreleased PVs: " + pvs);
}
// Close script support that might have been created
// by RuntimeScriptHandlers or action-invoked scripts
final ScriptSupport scripting = widget.getUserData(Widget.USER_DATA_SCRIPT_SUPPORT);
if (scripting != null)
scripting.close();
// Prepare for another start()
started = new CountDownLatch(1);
}
use of org.csstudio.display.builder.runtime.script.internal.Script in project org.csstudio.display.builder by kasemir.
the class JythonScriptTest method testJythonScript.
@Test
public void testJythonScript() throws Exception {
System.setProperty("python.import.site", "false");
final DisplayModel display = ModelLoader.resolveAndLoadModel("../org.csstudio.display.builder.runtime.test/examples/dummy.opi", "script_test.opi");
final Widget widget = display.getChildren().parallelStream().filter(w -> w.getName().equals("Label 100")).findFirst().get();
System.out.println(widget);
// Set widget variable in script
final ScriptSupport scripting = new ScriptSupport();
final Script script = scripting.compile(".", "updateText.py", new FileInputStream("../org.csstudio.display.builder.runtime.test/examples/updateText.py"));
for (int run = 0; run < 10; ++run) {
widget.setPropertyValue("text", "Initial");
assertThat(widget.getPropertyValue("text"), equalTo("Initial"));
script.submit(widget).get();
assertThat(widget.getPropertyValue("text"), equalTo("Hello"));
}
scripting.close();
}
use of org.csstudio.display.builder.runtime.script.internal.Script in project org.csstudio.display.builder by kasemir.
the class PythonScriptTest method testPythonScript.
@Test
public void testPythonScript() throws Exception {
if (!PythonGatewaySupport.isConnect2jInstalled()) {
System.err.println("Skipping PythonScriptTest because there is no python with connect2j");
return;
}
final DisplayModel display = ModelLoader.resolveAndLoadModel("../org.csstudio.display.builder.runtime.test/examples/dummy.opi", "script_test.opi");
final Widget widget = display.getChildren().parallelStream().filter(w -> w.getName().equals("Label 100")).findFirst().get();
System.out.println(widget);
// Set widget variable in script
final ScriptSupport scripting = new ScriptSupport();
final Script script = scripting.compile("../org.csstudio.display.builder.runtime.test/examples", "updateText_python.py", null);
for (int run = 0; run < 10; ++run) {
widget.setPropertyValue("text", "Initial");
assertThat(widget.getPropertyValue("text"), equalTo("Initial"));
script.submit(widget).get();
assertThat(widget.getPropertyValue("text"), equalTo("Hello"));
}
scripting.close();
}
use of org.csstudio.display.builder.runtime.script.internal.Script in project org.csstudio.display.builder by kasemir.
the class WidgetRuntime method startScripts.
/**
* Start Scripts
*/
private void startScripts() {
// Start scripts triggered by PVs
final List<ScriptInfo> script_infos = widget.propScripts().getValue();
final List<RuleInfo> rule_infos = widget.propRules().getValue();
if ((script_infos.size() > 0) || (rule_infos.size() > 0)) {
final List<RuntimeScriptHandler> handlers = new ArrayList<>(script_infos.size() + rule_infos.size());
for (final ScriptInfo script_info : script_infos) {
try {
handlers.add(new RuntimeScriptHandler(widget, script_info));
} catch (final Exception ex) {
final StringBuilder buf = new StringBuilder();
buf.append("Script failed to compile\n");
try {
final DisplayModel model = widget.getDisplayModel();
buf.append("Display '").append(model.getDisplayName()).append("', ");
} catch (Exception ignore) {
// Skip display model
}
buf.append(widget).append(", ").append(script_info.getPath());
logger.log(Level.WARNING, buf.toString(), ex);
}
}
for (final RuleInfo rule_info : rule_infos) {
try {
handlers.add(new RuntimeScriptHandler(widget, rule_info));
} catch (final Exception ex) {
final StringBuilder buf = new StringBuilder();
buf.append("Rule failed to compile\n");
try {
final DisplayModel model = widget.getDisplayModel();
buf.append("Display '").append(model.getDisplayName()).append("', ");
} catch (Exception ignore) {
// Skip display model
}
buf.append(widget).append(", ").append(rule_info.getName());
logger.log(Level.WARNING, buf.toString(), ex);
}
}
script_handlers = handlers;
}
// Compile scripts invoked by actions
final List<ActionInfo> actions = widget.propActions().getValue().getActions();
if (actions.size() > 0) {
final Map<ExecuteScriptActionInfo, Script> scripts = new HashMap<>();
for (ActionInfo action_info : actions) {
if (!(action_info instanceof ExecuteScriptActionInfo))
continue;
final ExecuteScriptActionInfo script_action = (ExecuteScriptActionInfo) action_info;
try {
final MacroValueProvider macros = widget.getMacrosOrProperties();
final Script script = RuntimeScriptHandler.compileScript(widget, macros, script_action.getInfo());
scripts.put(script_action, script);
} catch (final Exception ex) {
final StringBuilder buf = new StringBuilder();
buf.append("Script for action failed to compile\n");
try {
final DisplayModel model = widget.getDisplayModel();
buf.append("Display '").append(model.getDisplayName()).append("', ");
} catch (Exception ignore) {
// Skip display model
}
buf.append(widget).append(", ").append(script_action);
logger.log(Level.WARNING, buf.toString(), ex);
}
}
if (scripts.size() > 0)
action_scripts = scripts;
}
// Signal that start() has completed
started.countDown();
}
use of org.csstudio.display.builder.runtime.script.internal.Script in project org.csstudio.display.builder by kasemir.
the class WidgetRuntime method executeScriptAction.
/**
* Execute script
* @param action_info Which script-based action to execute
* @throws NullPointerException if action_info is not valid, runtime not initialized
*/
public void executeScriptAction(final ExecuteScriptActionInfo action_info) throws NullPointerException {
awaitStartup();
final Map<ExecuteScriptActionInfo, Script> actions = Objects.requireNonNull(action_scripts);
final Script script = Objects.requireNonNull(actions.get(action_info));
script.submit(widget);
}
Aggregations