Fixed missing item resolution of DSL scripts created through the UI (#1720)

Signed-off-by: Kai Kreuzer <kai@openhab.org>
This commit is contained in:
Kai Kreuzer
2020-10-15 23:04:30 +02:00
committed by GitHub
parent 70fed5a9c2
commit 5d830d64f0
@@ -23,11 +23,15 @@ import javax.script.ScriptEngineFactory;
import javax.script.ScriptException;
import javax.script.SimpleScriptContext;
import org.eclipse.emf.ecore.resource.Resource;
import org.eclipse.jdt.annotation.Nullable;
import org.eclipse.xtext.naming.QualifiedName;
import org.eclipse.xtext.resource.IResourceServiceProvider;
import org.eclipse.xtext.resource.XtextResource;
import org.eclipse.xtext.xbase.XExpression;
import org.eclipse.xtext.xbase.interpreter.IEvaluationContext;
import org.eclipse.xtext.xbase.interpreter.impl.DefaultEvaluationContext;
import org.openhab.core.model.script.engine.Script;
import org.openhab.core.model.script.engine.ScriptExecutionException;
import org.openhab.core.model.script.engine.ScriptParsingException;
import org.openhab.core.model.script.runtime.DSLScriptContextProvider;
@@ -110,7 +114,7 @@ public class DSLScriptEngine implements javax.script.ScriptEngine {
} else {
s = scriptEngine.newScriptFromString(script);
}
IEvaluationContext evalContext = createEvaluationContext(specificContext);
IEvaluationContext evalContext = createEvaluationContext(s, specificContext);
s.execute(evalContext);
} catch (ScriptExecutionException | ScriptParsingException e) {
throw new ScriptException(e.getMessage(), modelName, -1);
@@ -118,8 +122,20 @@ public class DSLScriptEngine implements javax.script.ScriptEngine {
return null;
}
private DefaultEvaluationContext createEvaluationContext(IEvaluationContext specificContext) {
DefaultEvaluationContext evalContext = new DefaultEvaluationContext(specificContext);
private DefaultEvaluationContext createEvaluationContext(Script script, IEvaluationContext specificContext) {
IEvaluationContext parentContext = specificContext;
if (specificContext == null && script instanceof ScriptImpl) {
XExpression xExpression = ((ScriptImpl) script).getXExpression();
if (xExpression != null) {
Resource resource = xExpression.eResource();
IEvaluationContext evaluationContext = null;
if (resource instanceof XtextResource) {
IResourceServiceProvider provider = ((XtextResource) resource).getResourceServiceProvider();
parentContext = provider.get(IEvaluationContext.class);
}
}
}
DefaultEvaluationContext evalContext = new DefaultEvaluationContext(parentContext);
for (Map.Entry<String, String> entry : implicitVars.entrySet()) {
Object value = context.getAttribute(entry.getKey());
if (value != null) {