Merge pull request #2 from apache/issue/SLING-7134
SLING-7134 - Script execution order is not deterministic on Java 9
diff --git a/src/main/java/org/apache/sling/servlets/resolver/internal/helper/AbstractResourceCollector.java b/src/main/java/org/apache/sling/servlets/resolver/internal/helper/AbstractResourceCollector.java
index 7a15896..10d2cad 100644
--- a/src/main/java/org/apache/sling/servlets/resolver/internal/helper/AbstractResourceCollector.java
+++ b/src/main/java/org/apache/sling/servlets/resolver/internal/helper/AbstractResourceCollector.java
@@ -75,25 +75,19 @@
final SortedSet<WeightedResource> resources = new TreeSet<>(new Comparator<WeightedResource>() {
@Override
public int compare(WeightedResource o1, WeightedResource o2) {
- if (o1.equals(o2)) {
- return 0;
- }
- int comparisonResult = o1.compareTo(o2);
- if (comparisonResult == 0) {
- String o1Extension = getScriptExtension(o1.getName());
- String o2Extension = getScriptExtension(o2.getName());
- if (StringUtils.isNotEmpty(o1Extension) && StringUtils.isNotEmpty(o2Extension)) {
- int o1ExtensionIndex = scriptExtensions.indexOf(o1Extension);
- int o2ExtensionIndex = scriptExtensions.indexOf(o2Extension);
- if (o1ExtensionIndex > o2ExtensionIndex) {
- return -1;
- } else if (o1ExtensionIndex == o2ExtensionIndex) {
- return 0;
- }
- return 1;
+ String o1Extension = getScriptExtension(o1.getName());
+ String o2Extension = getScriptExtension(o2.getName());
+ if (StringUtils.isNotEmpty(o1Extension) && StringUtils.isNotEmpty(o2Extension)) {
+ int o1ExtensionIndex = scriptExtensions.indexOf(o1Extension);
+ int o2ExtensionIndex = scriptExtensions.indexOf(o2Extension);
+ if (o1ExtensionIndex > o2ExtensionIndex) {
+ return -1;
+ } else if (o1ExtensionIndex == o2ExtensionIndex) {
+ return o1.compareTo(o2);
}
+ return 1;
}
- return comparisonResult;
+ return o1.compareTo(o2);
}
});
final Iterator<String> locations = new LocationIterator(resourceType, resourceSuperType,
diff --git a/src/main/java/org/apache/sling/servlets/resolver/internal/helper/WeightedResource.java b/src/main/java/org/apache/sling/servlets/resolver/internal/helper/WeightedResource.java
index ad6244e..470593f 100644
--- a/src/main/java/org/apache/sling/servlets/resolver/internal/helper/WeightedResource.java
+++ b/src/main/java/org/apache/sling/servlets/resolver/internal/helper/WeightedResource.java
@@ -131,6 +131,7 @@
return 1;
}
- return 0;
+ // extensions are equal, compare ordinal (lower ordinal wins)
+ return (ordinal < o.ordinal) ? -1 : 1;
}
}
diff --git a/src/test/java/org/apache/sling/servlets/resolver/internal/helper/WeightedResourceTest.java b/src/test/java/org/apache/sling/servlets/resolver/internal/helper/WeightedResourceTest.java
index 85ae4e7..db50e84 100644
--- a/src/test/java/org/apache/sling/servlets/resolver/internal/helper/WeightedResourceTest.java
+++ b/src/test/java/org/apache/sling/servlets/resolver/internal/helper/WeightedResourceTest.java
@@ -71,5 +71,17 @@
assertTrue(lr1.compareTo(lr2) < 0);
assertTrue(lr2.compareTo(lr1) > 0);
}
+
+ public void testCompareToOrdinal() {
+ WeightedResource lr1 = new WeightedResource(0, null, 0, WeightedResource.WEIGHT_NONE);
+ WeightedResource lr2 = new WeightedResource(1, null, 0, WeightedResource.WEIGHT_NONE);
+
+ // expect the same objects to compare equal
+ assertEquals(0, lr1.compareTo(lr1));
+ assertEquals(0, lr2.compareTo(lr2));
+
+ assertTrue(lr1.compareTo(lr2) < 0);
+ assertTrue(lr2.compareTo(lr1) > 0);
+ }
}