SLING-9619 - The JavaScript Use Provider does not allow loading scripts relative to search paths any more
* check first if the dependency can be obtained as a resource relative to the
search paths;
* if the dependency was not found, check the resource type hierarchy which drives the rendering
* if the dependency was not found, check the script as a relative path to the current script
diff --git a/src/main/java/org/apache/sling/scripting/sightly/js/impl/use/DependencyResolver.java b/src/main/java/org/apache/sling/scripting/sightly/js/impl/use/DependencyResolver.java
index fb97c12..121ff77 100644
--- a/src/main/java/org/apache/sling/scripting/sightly/js/impl/use/DependencyResolver.java
+++ b/src/main/java/org/apache/sling/scripting/sightly/js/impl/use/DependencyResolver.java
@@ -58,37 +58,13 @@
ScriptNameAwareReader reader = null;
IOException ioException = null;
try {
- Resource caller = null;
- Resource scriptResource = null;
- if (dependency.startsWith("/")) {
- scriptResource = scriptingResourceResolver.getResource(dependency);
- }
- if (scriptResource == null) {
- String callerName = (String) bindings.get(ScriptEngine.FILENAME);
- if (StringUtils.isNotEmpty(callerName)) {
- caller = scriptingResourceResolver.getResource(callerName);
- }
- if (caller == null) {
- SlingScriptHelper scriptHelper = Utils.getHelper(bindings);
- if (scriptHelper != null) {
- caller = scriptHelper.getScript().getScriptResource();
- }
- }
- }
- if (caller != null && Utils.isJsScript(caller.getName())) {
- if (dependency.startsWith("..")) {
- scriptResource = caller.getChild(dependency);
- } else {
- caller = caller.getParent();
- if (caller != null) {
- scriptResource = caller.getChild(dependency);
- }
- }
- }
-
- if (caller != null && scriptResource == null) {
+ // attempt to retrieve the dependency directly (as an absolute path or relative to the search paths)
+ Resource scriptResource = scriptingResourceResolver.getResource(dependency);
+ Resource caller = getCaller(bindings);
+ if (scriptResource == null && caller != null) {
Resource requestResource = (Resource) bindings.get(SlingBindings.RESOURCE);
String type = requestResource.getResourceType();
+ // look at the resource type hierarchy; a dependency closer to the current resource type has priority
while (scriptResource == null && type != null) {
Resource servletResource = null;
if (!type.startsWith("/")) {
@@ -103,22 +79,31 @@
servletResource = resolveResource(type);
}
if (servletResource != null) {
- if (dependency.startsWith("..")) {
- // relative path
- String absolutePath = ResourceUtil.normalize(caller.getPath() + "/" + dependency);
- if (StringUtils.isNotEmpty(absolutePath)) {
- scriptResource = resolveResource(absolutePath);
- }
- } else {
- scriptResource = servletResource.getChild(dependency);
- }
+ scriptResource = servletResource.getChild(dependency);
type = servletResource.getResourceSuperType();
} else {
type = null;
}
}
+ // cannot find a dependency relative to the resource type; locate it solely based on the caller
+ if (scriptResource == null) {
+ if (dependency.startsWith("..")) {
+ // relative path
+ String absolutePath = ResourceUtil.normalize(caller.getPath() + "/" + dependency);
+ if (StringUtils.isNotEmpty(absolutePath)) {
+ scriptResource = resolveResource(absolutePath);
+ }
+ if (scriptResource == null) {
+ scriptResource = caller.getChild(dependency);
+ }
+ } else {
+ Resource callerParent = caller.getParent();
+ if (callerParent != null) {
+ scriptResource = callerParent.getChild(dependency);
+ }
+ }
+ }
}
-
if (scriptResource == null) {
throw new SightlyException(String.format("Unable to load script dependency %s.", dependency));
}
@@ -138,7 +123,7 @@
return reader;
}
- Resource resolveResource(String type) {
+ private Resource resolveResource(String type) {
Resource servletResource = scriptingResourceResolver.resolve(type);
if (ResourceUtil.isNonExistingResource(servletResource)) {
servletResource = scriptingResourceResolver.getResource(type);
@@ -146,4 +131,19 @@
return servletResource;
}
+ private Resource getCaller(Bindings bindings) {
+ Resource caller = null;
+ String callerName = (String) bindings.get(ScriptEngine.FILENAME);
+ if (StringUtils.isNotEmpty(callerName)) {
+ caller = scriptingResourceResolver.getResource(callerName);
+ }
+ if (caller == null) {
+ SlingScriptHelper scriptHelper = Utils.getHelper(bindings);
+ if (scriptHelper != null) {
+ caller = scriptHelper.getScript().getScriptResource();
+ }
+ }
+ return caller;
+ }
+
}