diff --git a/bundles/org.openhab.core.model.script.runtime/src/org/openhab/core/model/script/runtime/internal/engine/DSLScriptEngine.java b/bundles/org.openhab.core.model.script.runtime/src/org/openhab/core/model/script/runtime/internal/engine/DSLScriptEngine.java index 06459a197..7456c0916 100644 --- a/bundles/org.openhab.core.model.script.runtime/src/org/openhab/core/model/script/runtime/internal/engine/DSLScriptEngine.java +++ b/bundles/org.openhab.core.model.script.runtime/src/org/openhab/core/model/script/runtime/internal/engine/DSLScriptEngine.java @@ -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 entry : implicitVars.entrySet()) { Object value = context.getAttribute(entry.getKey()); if (value != null) {