SLING-9320 - Allow precompiled units to access objects from the same bundle through the Use API
* the UseFunction should override the javax.script.filename in the context with the
dependency it's executing
diff --git a/src/main/java/org/apache/sling/scripting/sightly/js/impl/JsEnvironment.java b/src/main/java/org/apache/sling/scripting/sightly/js/impl/JsEnvironment.java
index d0fd050..31623f1 100644
--- a/src/main/java/org/apache/sling/scripting/sightly/js/impl/JsEnvironment.java
+++ b/src/main/java/org/apache/sling/scripting/sightly/js/impl/JsEnvironment.java
@@ -79,7 +79,6 @@
CommonJsModule module = new CommonJsModule();
Bindings scriptBindings = buildBindings(reader, globalBindings, arguments, module);
scriptContext.setBindings(scriptBindings, ScriptContext.ENGINE_SCOPE);
- scriptContext.setAttribute(ScriptEngine.FILENAME, reader.getScriptName(), ScriptContext.ENGINE_SCOPE);
runScript(reader, scriptContext, callback, module);
}
@@ -92,6 +91,7 @@
private Bindings buildBindings(ScriptNameAwareReader reader, Bindings globalBindings, Bindings arguments, CommonJsModule commonJsModule) {
Bindings bindings = new LazyBindings();
bindings.putAll(engineBindings);
+ bindings.put(ScriptEngine.FILENAME, reader.getScriptName());
UseFunction useFunction = new UseFunction(this, dependencyResolver, globalBindings, arguments);
bindings.put(Variables.JS_USE, useFunction);
bindings.put(Variables.MODULE, commonJsModule);
diff --git a/src/main/java/org/apache/sling/scripting/sightly/js/impl/JsUseProvider.java b/src/main/java/org/apache/sling/scripting/sightly/js/impl/JsUseProvider.java
index 7cc1902..1d5c3d6 100644
--- a/src/main/java/org/apache/sling/scripting/sightly/js/impl/JsUseProvider.java
+++ b/src/main/java/org/apache/sling/scripting/sightly/js/impl/JsUseProvider.java
@@ -100,7 +100,6 @@
environment.initialize();
ScriptNameAwareReader reader = dependencyResolver.resolve(globalBindings, identifier);
if (reader != null) {
- globalBindings.put(ScriptEngine.FILENAME, reader.getScriptName());
proxyAsyncScriptableFactory.registerProxies(slingScriptingResolver, environment, globalBindings);
AsyncContainer asyncContainer = environment.runScript(reader, globalBindings, arguments);
return ProviderOutcome.success(jsValueAdapter.adapt(asyncContainer));
diff --git a/src/main/java/org/apache/sling/scripting/sightly/js/impl/use/UseFunction.java b/src/main/java/org/apache/sling/scripting/sightly/js/impl/use/UseFunction.java
index 094e9fb..a936978 100644
--- a/src/main/java/org/apache/sling/scripting/sightly/js/impl/use/UseFunction.java
+++ b/src/main/java/org/apache/sling/scripting/sightly/js/impl/use/UseFunction.java
@@ -28,6 +28,7 @@
import javax.script.ScriptEngine;
import org.apache.commons.lang3.StringUtils;
+import org.apache.sling.api.scripting.LazyBindings;
import org.apache.sling.scripting.core.ScriptNameAwareReader;
import org.apache.sling.scripting.sightly.SightlyException;
import org.apache.sling.scripting.sightly.js.impl.JsEnvironment;
@@ -88,15 +89,12 @@
String dependency = depNames.get(i);
ScriptNameAwareReader dependencyReader = dependencyResolver.resolve(globalBindings, dependency);
if (dependencyReader == null) {
- String caller = (String) globalBindings.get(ScriptEngine.FILENAME);
- if (StringUtils.isNotEmpty(caller)) {
- throw new SightlyException(String.format("Cannot locate use-function dependency %s from caller %s.", dependency,
- caller));
- } else {
- throw new SightlyException(String.format("Cannot locate use-function dependency %s.", dependencies));
- }
+ throw new SightlyException("Cannot locate script " + dependency);
}
- jsEnvironment.runScript(dependencyReader, globalBindings, Utils.EMPTY_BINDINGS, arg -> {
+ Bindings bindings = new LazyBindings();
+ bindings.putAll(globalBindings);
+ bindings.put(ScriptEngine.FILENAME, dependencyReader.getScriptName());
+ jsEnvironment.runScript(dependencyReader, bindings, Utils.EMPTY_BINDINGS, arg -> {
counter[0]--;
dependencies[dependencyPos] = arg;
if (counter[0] == 0) {