SLING-9580 - Make the dependency resolution more resource-type centric
* simplified the DependencyResolver implementation
* removed unused methods from Utils
* removed HTL engine dependency, since it's not required any more
diff --git a/pom.xml b/pom.xml
index 6dc3832..1ac1e48 100644
--- a/pom.xml
+++ b/pom.xml
@@ -119,12 +119,6 @@
<version>1.2.3-1.4.0-SNAPSHOT</version>
<scope>provided</scope>
</dependency>
- <dependency>
- <groupId>org.apache.sling</groupId>
- <artifactId>org.apache.sling.scripting.sightly</artifactId>
- <version>1.4.1-1.4.0-SNAPSHOT</version>
- <scope>provided</scope>
- </dependency>
<!-- Logging -->
<dependency>
diff --git a/src/main/java/org/apache/sling/scripting/sightly/js/impl/Utils.java b/src/main/java/org/apache/sling/scripting/sightly/js/impl/Utils.java
index 01d5521..612713c 100644
--- a/src/main/java/org/apache/sling/scripting/sightly/js/impl/Utils.java
+++ b/src/main/java/org/apache/sling/scripting/sightly/js/impl/Utils.java
@@ -22,14 +22,8 @@
import javax.script.SimpleBindings;
import org.apache.commons.lang3.StringUtils;
-import org.apache.sling.api.SlingHttpServletRequest;
-import org.apache.sling.api.resource.Resource;
-import org.apache.sling.api.resource.ResourceResolver;
-import org.apache.sling.api.resource.ResourceUtil;
import org.apache.sling.api.scripting.SlingBindings;
import org.apache.sling.api.scripting.SlingScriptHelper;
-import org.apache.sling.scripting.sightly.SightlyException;
-import org.apache.sling.scripting.sightly.engine.ResourceResolution;
/**
* Utilities for script evaluation
@@ -47,53 +41,4 @@
String extension = StringUtils.substringAfterLast(identifier, ".");
return JS_EXTENSION.equalsIgnoreCase(extension);
}
-
- public static Resource getScriptResource(Resource caller, String path, Bindings bindings) {
- Resource scriptResource = caller.getChild(path);
- if (scriptResource == null) {
- Resource componentCaller = ResourceResolution
- .getResourceForRequest(caller.getResourceResolver(), (SlingHttpServletRequest) bindings.get(SlingBindings.REQUEST));
- if (isResourceOverlay(caller, componentCaller)) {
- scriptResource = ResourceResolution.getResourceFromSearchPath(componentCaller, path);
- } else {
- scriptResource = ResourceResolution.getResourceFromSearchPath(caller, path);
- }
- }
- if (scriptResource == null) {
- throw new SightlyException("Required script resource could not be located: " + path + ". The caller is " + caller.getPath());
- }
- return scriptResource;
- }
-
- /**
- * Using the inheritance chain created with the help of {@code sling:resourceSuperType} this method checks if {@code resourceB} inherits
- * from {@code resourceA}. In case {@code resourceA} is a {@code nt:file}, its parent will be used for the inheritance check.
- *
- * @param resourceA the base resource
- * @param resourceB the potentially overlaid resource
- * @return {@code true} if {@code resourceB} overlays {@code resourceB}, {@code false} otherwise
- */
- private static boolean isResourceOverlay(Resource resourceA, Resource resourceB) {
- String resourceBSuperType = resourceB.getResourceSuperType();
- if (StringUtils.isNotEmpty(resourceBSuperType)) {
- ResourceResolver resolver = resourceA.getResourceResolver();
- String parentResourceType = resourceA.getResourceType();
- if ("nt:file".equals(parentResourceType)) {
- parentResourceType = ResourceUtil.getParent(resourceA.getPath());
- if (parentResourceType.equals(resourceB.getPath())) {
- return true;
- }
- }
- Resource parentB = resolver.getResource(resourceBSuperType);
- while (parentB != null && !"/".equals(parentB.getPath()) && StringUtils.isNotEmpty(resourceBSuperType)) {
- if (parentB.getPath().equals(parentResourceType)) {
- return true;
- }
- resourceBSuperType = parentB.getResourceSuperType();
- parentB = resolver.getResource(resourceBSuperType);
- }
- }
- return false;
- }
-
}
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 d9422ec..f3f502a 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
@@ -29,10 +29,11 @@
import org.apache.commons.io.IOUtils;
import org.apache.commons.lang3.StringUtils;
+import org.apache.sling.api.resource.NonExistingResource;
import org.apache.sling.api.resource.Resource;
import org.apache.sling.api.resource.ResourceResolver;
+import org.apache.sling.api.resource.ResourceUtil;
import org.apache.sling.api.scripting.SlingBindings;
-import org.apache.sling.api.scripting.SlingScript;
import org.apache.sling.api.scripting.SlingScriptHelper;
import org.apache.sling.scripting.core.ScriptNameAwareReader;
import org.apache.sling.scripting.sightly.SightlyException;
@@ -58,49 +59,69 @@
ScriptNameAwareReader reader = null;
IOException ioException = null;
try {
- if (reader == null) {
- Resource scriptResource = null;
- if (dependency.startsWith("/")) {
- scriptResource = scriptingResourceResolver.getResource(dependency);
+ Resource scriptResource = null;
+ if (dependency.startsWith("/")) {
+ scriptResource = scriptingResourceResolver.getResource(dependency);
+ }
+ if (scriptResource == null) {
+ String callerName = (String) bindings.get(ScriptEngine.FILENAME);
+ Resource caller = null;
+ if (StringUtils.isNotEmpty(callerName)) {
+ caller = scriptingResourceResolver.getResource(callerName);
}
- if (scriptResource == null) {
+ if (caller == null) {
SlingScriptHelper scriptHelper = Utils.getHelper(bindings);
if (scriptHelper != null) {
- String callerName = (String) bindings.get(ScriptEngine.FILENAME);
- Resource caller = null;
- if (StringUtils.isNotEmpty(callerName)) {
- caller = scriptingResourceResolver.getResource(callerName);
- }
- SlingScript slingScript = scriptHelper.getScript();
- if (caller == null && slingScript != null) {
- caller = scriptingResourceResolver.getResource(slingScript.getScriptResource().getPath());
- }
- if (caller == null) {
- Resource resource = (Resource) bindings.get(SlingBindings.RESOURCE);
- if (resource != null) {
- String type = resource.getResourceType();
- caller = scriptingResourceResolver.getResource(type);
- if (caller != null) {
- scriptResource = Utils.getScriptResource(caller, dependency, bindings);
+ caller = scriptHelper.getScript().getScriptResource();
+ }
+ }
+ if (caller != null && Utils.isJsScript(caller.getName()) &&
+ ("sling/bundle/resource".equals(caller.getResourceType()) || "nt:file".equals(caller.getResourceType()))) {
+ caller = caller.getParent();
+ if (caller != null) {
+ scriptResource = caller.getChild(dependency);
+ }
+ }
+
+ }
+ if (scriptResource == null) {
+ Resource requestResource = (Resource) bindings.get(SlingBindings.RESOURCE);
+ String type = requestResource.getResourceType();
+ while (scriptResource == null && type != null) {
+ Resource servletResource = null;
+ if (!type.startsWith("/")) {
+ for (String searchPath : scriptingResourceResolver.getSearchPath()) {
+ String normalizedPath = ResourceUtil.normalize(searchPath + "/" + type);
+ if (normalizedPath != null) {
+ servletResource =
+ scriptingResourceResolver.resolve(normalizedPath);
+ if (!(servletResource instanceof NonExistingResource)) {
+ break;
}
}
}
- if (caller != null) {
- scriptResource = Utils.getScriptResource(caller, dependency, bindings);
- }
+ } else {
+ servletResource = scriptingResourceResolver.resolve(type);
+ }
+ if (servletResource != null) {
+ scriptResource = servletResource.getChild(dependency);
+ type = servletResource.getResourceSuperType();
+ } else {
+ type = null;
}
}
- if (scriptResource != null) {
- reader = new ScriptNameAwareReader(new StringReader(IOUtils.toString(scriptResource.adaptTo(InputStream.class),
- StandardCharsets.UTF_8)), scriptResource.getPath());
- }
}
+
+ if (scriptResource == null) {
+ throw new SightlyException(String.format("Unable to load script dependency %s.", dependency));
+ }
+ reader = new ScriptNameAwareReader(new StringReader(IOUtils.toString(scriptResource.adaptTo(InputStream.class),
+ StandardCharsets.UTF_8)), scriptResource.getPath());
} catch (IOException e) {
ioException = e;
}
if (ioException != null) {
- throw new SightlyException(String.format("Unable to load script dependency %s.",
- dependency), ioException);
+ throw new SightlyException(String.format("Unable to load script dependency %s.", dependency), ioException);
}
return reader;
}