use of org.eclipse.smarthome.model.script.engine.ScriptEngine in project smarthome by eclipse.
the class ScriptExecution method callScript.
/**
* Calls a script which must be located in the configurations/scripts folder.
*
* @param scriptName the name of the script (if the name does not end with
* the .script file extension it is added)
*
* @return the return value of the script
* @throws ScriptExecutionException if an error occurs during the execution
*/
public static Object callScript(String scriptName) throws ScriptExecutionException {
ModelRepository repo = ScriptServiceUtil.getModelRepository();
if (repo != null) {
String scriptNameWithExt = scriptName;
if (!StringUtils.endsWith(scriptName, Script.SCRIPT_FILEEXT)) {
scriptNameWithExt = scriptName + "." + Script.SCRIPT_FILEEXT;
}
XExpression expr = (XExpression) repo.getModel(scriptNameWithExt);
if (expr != null) {
ScriptEngine scriptEngine = ScriptServiceUtil.getScriptEngine();
if (scriptEngine != null) {
Script script = scriptEngine.newScriptFromXExpression(expr);
return script.execute();
} else {
throw new ScriptExecutionException("Script engine is not available.");
}
} else {
throw new ScriptExecutionException("Script '" + scriptName + "' cannot be found.");
}
} else {
throw new ScriptExecutionException("Model repository is not available.");
}
}
use of org.eclipse.smarthome.model.script.engine.ScriptEngine in project smarthome by eclipse.
the class RuleContextHelper method getContext.
/**
* Retrieves the evaluation context (= set of variables) for a rule. The context is shared with all rules in the
* same model (= rule file).
*
* @param rule the rule to get the context for
* @return the evaluation context
*/
public static synchronized IEvaluationContext getContext(Rule rule, Injector injector) {
Logger logger = LoggerFactory.getLogger(RuleContextHelper.class);
RuleModel ruleModel = (RuleModel) rule.eContainer();
// check if a context already exists on the resource
for (Adapter adapter : ruleModel.eAdapters()) {
if (adapter instanceof RuleContextAdapter) {
return ((RuleContextAdapter) adapter).getContext();
}
}
Provider<IEvaluationContext> contextProvider = injector.getProvider(IEvaluationContext.class);
// no evaluation context found, so create a new one
ScriptEngine scriptEngine = injector.getInstance(ScriptEngine.class);
if (scriptEngine != null) {
IEvaluationContext evaluationContext = contextProvider.get();
for (VariableDeclaration var : ruleModel.getVariables()) {
try {
Object initialValue = var.getRight() == null ? null : scriptEngine.newScriptFromXExpression(var.getRight()).execute();
evaluationContext.newValue(QualifiedName.create(var.getName()), initialValue);
} catch (ScriptExecutionException e) {
logger.warn("Variable '{}' on rule file '{}' cannot be initialized with value '{}': {}", new Object[] { var.getName(), ruleModel.eResource().getURI().path(), var.getRight().toString(), e.getMessage() });
}
}
ruleModel.eAdapters().add(new RuleContextAdapter(evaluationContext));
return evaluationContext;
} else {
logger.debug("Rule variables of rule {} cannot be evaluated as no scriptengine is available!", ruleModel.eResource().getURI().path());
return contextProvider.get();
}
}
use of org.eclipse.smarthome.model.script.engine.ScriptEngine in project smarthome by eclipse.
the class ServiceModule method configure.
@Override
public void configure(Binder binder) {
binder.bind(ItemRegistry.class).toInstance(scriptServiceUtil.getItemRegistryInstance());
binder.bind(ThingRegistry.class).toInstance(scriptServiceUtil.getThingRegistryInstance());
binder.bind(ModelRepository.class).toInstance(scriptServiceUtil.getModelRepositoryInstance());
binder.bind(ScriptEngine.class).toInstance(scriptEngine);
binder.bind(IActionServiceProvider.class).toInstance(new ServiceTrackerActionServiceProvider(scriptServiceUtil));
binder.bind(Script.class).to(ScriptImpl.class);
}
Aggregations