SLING-9657 - Same-name JS Use dependencies are not always correctly resolved
* make sure overlays are handled
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 2a916e8..b150c1e 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
@@ -69,7 +69,7 @@
String driverType = request.getResource().getResourceType();
Resource driver = resolveResource(driverType);
if (driver != null) {
- Resource hierarchyResource = getChildResource(callerType, driver);
+ Resource hierarchyResource = getHierarchyResource(callerType, driver);
while (hierarchyResource != null && scriptResource == null) {
if (dependency.startsWith("..")) {
// relative path
@@ -162,36 +162,58 @@
return caller;
}
- private Resource getChildResource(@NotNull Resource callerType, @NotNull Resource driverType) {
- if (callerType.getPath().equals(driverType.getPath())) {
- return callerType;
+ private Resource getHierarchyResource(@NotNull Resource caller, @NotNull Resource driver) {
+ if (caller.getPath().equals(driver.getPath())) {
+ return caller;
}
- if (isResourceType(callerType, driverType.getPath())) {
- return callerType;
+ if (isResourceType(caller, driver)) {
+ return caller;
}
- if (isResourceType(driverType, callerType.getPath())) {
- return driverType;
+ if (isResourceType(driver, caller)) {
+ return driver;
+ }
+ int callerOverlayIndex = 0;
+ int driverOverlayIndex = 0;
+ String callerRelativePath = null;
+ String driverRelativePath = null;
+ int spIndex = 0;
+ for (String sp : scriptingResourceResolver.getSearchPath()) {
+ if (caller.getPath().startsWith(sp)) {
+ callerRelativePath = caller.getPath().substring(sp.length());
+ callerOverlayIndex = spIndex;
+ }
+ if (driver.getPath().startsWith(sp)) {
+ driverRelativePath = driver.getPath().substring(sp.length());
+ driverOverlayIndex = spIndex;
+ }
+ if (callerRelativePath != null && driverRelativePath != null) {
+ break;
+ }
+ spIndex++;
+ }
+ if (callerRelativePath != null && callerRelativePath.equals(driverRelativePath)) {
+ if (callerOverlayIndex < driverOverlayIndex) {
+ return caller;
+ }
+ return driver;
}
return null;
}
- private boolean isResourceType(@NotNull Resource resource, String type) {
- Resource typeResource = resolveResource(type);
- if (typeResource != null) {
- if (typeResource.getPath().equals(resource.getPath())) {
- return true;
- }
- String resourceSuperType = resource.getResourceSuperType();
- while (resourceSuperType != null) {
- Resource intermediateType = resolveResource(resourceSuperType);
- if (intermediateType != null) {
- if (intermediateType.getPath().equals(typeResource.getPath())) {
- return true;
- }
- resourceSuperType = intermediateType.getResourceSuperType();
- } else {
- return false;
+ private boolean isResourceType(@NotNull Resource resource, @NotNull Resource parent) {
+ if (parent.getPath().equals(resource.getPath())) {
+ return true;
+ }
+ String resourceSuperType = resource.getResourceSuperType();
+ while (resourceSuperType != null) {
+ Resource intermediateType = resolveResource(resourceSuperType);
+ if (intermediateType != null) {
+ if (intermediateType.getPath().equals(parent.getPath())) {
+ return true;
}
+ resourceSuperType = intermediateType.getResourceSuperType();
+ } else {
+ return false;
}
}
return false;