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;
+    }
+
 }