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