This is an automated email from the ASF dual-hosted git repository.

daim pushed a commit to branch trunk
in repository https://gitbox.apache.org/repos/asf/jackrabbit-oak.git


The following commit(s) were added to refs/heads/trunk by this push:
     new 44851487c5 OAK-11747 : removed usage of Guava's ComparisonChain with 
JDK comparator (#2319)
44851487c5 is described below

commit 44851487c5e4d0f9b9b46a40da79d9c78a3c83b9
Author: Rishabh Kumar <[email protected]>
AuthorDate: Thu Jun 5 21:41:45 2025 +0530

    OAK-11747 : removed usage of Guava's ComparisonChain with JDK comparator 
(#2319)
    
    Co-authored-by: Rishabh Kumar <[email protected]>
---
 .../index/lucene/LucenePropertyIndexTest.java      |  11 +--
 .../jackrabbit/oak/plugins/tika/BinaryStats.java   |  17 ++--
 .../oak/plugins/tika/BinaryStatsTest.java          |  78 +++++++++++++++
 .../apache/jackrabbit/oak/segment/MapEntry.java    |  10 +-
 .../apache/jackrabbit/oak/segment/MapRecord.java   |   9 +-
 .../jackrabbit/oak/segment/PropertyTemplate.java   |  11 +--
 .../oak/segment/PropertyTemplateTest.java          | 107 +++++++++++++++++++++
 .../oak/plugins/document/FormatVersion.java        |  12 +--
 8 files changed, 217 insertions(+), 38 deletions(-)

diff --git 
a/oak-lucene/src/test/java/org/apache/jackrabbit/oak/plugins/index/lucene/LucenePropertyIndexTest.java
 
b/oak-lucene/src/test/java/org/apache/jackrabbit/oak/plugins/index/lucene/LucenePropertyIndexTest.java
index 65bbbce892..bc7edbb592 100644
--- 
a/oak-lucene/src/test/java/org/apache/jackrabbit/oak/plugins/index/lucene/LucenePropertyIndexTest.java
+++ 
b/oak-lucene/src/test/java/org/apache/jackrabbit/oak/plugins/index/lucene/LucenePropertyIndexTest.java
@@ -31,6 +31,7 @@ import java.util.ArrayList;
 import java.util.Calendar;
 import java.util.Collection;
 import java.util.Collections;
+import java.util.Comparator;
 import java.util.HashMap;
 import java.util.Iterator;
 import java.util.LinkedList;
@@ -44,7 +45,6 @@ import java.util.concurrent.Executors;
 import javax.jcr.PropertyType;
 
 import org.apache.commons.io.input.CountingInputStream;
-import org.apache.jackrabbit.guava.common.collect.ComparisonChain;
 import org.apache.commons.io.FileUtils;
 import org.apache.commons.io.IOUtils;
 import org.apache.jackrabbit.JcrConstants;
@@ -3264,11 +3264,10 @@ public class LucenePropertyIndexTest extends 
AbstractQueryTest {
         }
 
         @Override
-        public int compareTo(Tuple2 o) {
-            return ComparisonChain.start()
-                    .compare(value, o.value)
-                    .compare(value2, o.value2, Collections.reverseOrder())
-                    .result();
+        public int compareTo(@NotNull Tuple2 o) {
+            return Comparator.comparing((Tuple2 t) -> t.value)
+                    .thenComparing( t -> ((Tuple2) t).value2, 
Comparator.reverseOrder())
+                    .compare(this, o);
         }
 
         @Override
diff --git 
a/oak-run/src/main/java/org/apache/jackrabbit/oak/plugins/tika/BinaryStats.java 
b/oak-run/src/main/java/org/apache/jackrabbit/oak/plugins/tika/BinaryStats.java
index 2d00e4d4c1..ed91303318 100644
--- 
a/oak-run/src/main/java/org/apache/jackrabbit/oak/plugins/tika/BinaryStats.java
+++ 
b/oak-run/src/main/java/org/apache/jackrabbit/oak/plugins/tika/BinaryStats.java
@@ -24,12 +24,13 @@ import java.io.PrintWriter;
 import java.io.StringWriter;
 import java.util.ArrayList;
 import java.util.Collections;
+import java.util.Comparator;
 import java.util.HashMap;
 import java.util.List;
 import java.util.Map;
 
-import org.apache.jackrabbit.guava.common.collect.ComparisonChain;
 import org.codehaus.groovy.runtime.StringGroovyMethods;
+import org.jetbrains.annotations.NotNull;
 
 import static org.apache.jackrabbit.oak.commons.IOUtils.humanReadableByteCount;
 
@@ -131,7 +132,7 @@ class BinaryStats {
         return sw.toString();
     }
 
-    private MimeTypeStats createStat(String mimeType) {
+    MimeTypeStats createStat(String mimeType) {
         MimeTypeStats stats = new MimeTypeStats(mimeType);
         stats.setIndexed(tika.isIndexed(mimeType));
         stats.setSupported(tika.isSupportedMediaType(mimeType));
@@ -142,7 +143,7 @@ class BinaryStats {
         return StringGroovyMethods.center(s, width);
     }
 
-    private static class MimeTypeStats implements Comparable<MimeTypeStats> {
+    static class MimeTypeStats implements Comparable<MimeTypeStats> {
         private final String mimeType;
         private int count;
         private long totalSize;
@@ -187,11 +188,11 @@ class BinaryStats {
         }
 
         @Override
-        public int compareTo(MimeTypeStats o) {
-            return ComparisonChain.start()
-                    .compareFalseFirst(indexed, o.indexed)
-                    .compare(totalSize, o.totalSize)
-                    .result();
+        public int compareTo(@NotNull MimeTypeStats o) {
+            return Comparator
+                    .comparing(MimeTypeStats::isIndexed)  // false comes 
before true by default
+                    .thenComparingLong(MimeTypeStats::getTotalSize)        // 
then compare by totalSize
+                    .compare(this, o);
         }
     }
 }
diff --git 
a/oak-run/src/test/java/org/apache/jackrabbit/oak/plugins/tika/BinaryStatsTest.java
 
b/oak-run/src/test/java/org/apache/jackrabbit/oak/plugins/tika/BinaryStatsTest.java
new file mode 100644
index 0000000000..83a34bd6e0
--- /dev/null
+++ 
b/oak-run/src/test/java/org/apache/jackrabbit/oak/plugins/tika/BinaryStatsTest.java
@@ -0,0 +1,78 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements.  See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership.  The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License.  You may obtain a copy of the License at
+ *
+ *   http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied.  See the License for the
+ * specific language governing permissions and limitations
+ * under the License.
+ */
+package org.apache.jackrabbit.oak.plugins.tika;
+
+import org.apache.jackrabbit.guava.common.collect.FluentIterable;
+import org.apache.jackrabbit.oak.plugins.tika.BinaryStats.MimeTypeStats;
+import org.junit.Assert;
+import org.junit.Test;
+
+import java.io.IOException;
+import java.util.ArrayList;
+import java.util.Collections;
+import java.util.List;
+
+public class BinaryStatsTest {
+
+    @Test
+    public void testMimeTypeStatsComparison() throws IOException {
+        // Create BinaryStats instance with a minimal implementation of 
BinaryResourceProvider
+        BinaryStats stats = new BinaryStats(null, path -> FluentIterable.of());
+
+        // Create test MimeTypeStats instances
+        MimeTypeStats indexedLargeSize = stats.createStat("application/pdf");
+        indexedLargeSize.setIndexed(true);
+        indexedLargeSize.addSize(1000);
+
+        MimeTypeStats indexedSmallSize = stats.createStat("text/plain");
+        indexedSmallSize.setIndexed(true);
+        indexedSmallSize.addSize(100);
+
+        MimeTypeStats notIndexedLargeSize = stats.createStat("image/png");
+        notIndexedLargeSize.setIndexed(false);
+        notIndexedLargeSize.addSize(2000);
+
+        MimeTypeStats notIndexedSmallSize = stats.createStat("audio/mp3");
+        notIndexedSmallSize.setIndexed(false);
+        notIndexedSmallSize.addSize(500);
+
+        // Test case 1: Compare by indexed status (false first, then true)
+        Assert.assertTrue(notIndexedLargeSize.compareTo(indexedLargeSize) < 0);
+        Assert.assertTrue(indexedLargeSize.compareTo(notIndexedLargeSize) > 0);
+
+        // Test case 2: Same indexed status, compare by size (larger comes 
first)
+        Assert.assertTrue(indexedLargeSize.compareTo(indexedSmallSize) > 0);
+        Assert.assertTrue(notIndexedLargeSize.compareTo(notIndexedSmallSize) > 
0);
+
+        // Test case 3: Sort a list and verify ordering
+        List<MimeTypeStats> statsList = new ArrayList<>();
+        statsList.add(indexedLargeSize);
+        statsList.add(notIndexedSmallSize);
+        statsList.add(indexedSmallSize);
+        statsList.add(notIndexedLargeSize);
+
+        Collections.sort(statsList);
+
+        // Verify sort order: not indexed first (larger to smaller), then 
indexed (larger to smaller)
+        Assert.assertSame(notIndexedSmallSize, statsList.get(0));
+        Assert.assertSame(notIndexedLargeSize, statsList.get(1));
+        Assert.assertSame(indexedSmallSize, statsList.get(2));
+        Assert.assertSame(indexedLargeSize, statsList.get(3));
+    }
+}
\ No newline at end of file
diff --git 
a/oak-segment-tar/src/main/java/org/apache/jackrabbit/oak/segment/MapEntry.java 
b/oak-segment-tar/src/main/java/org/apache/jackrabbit/oak/segment/MapEntry.java
index 033d8b2108..e797a6d7ad 100644
--- 
a/oak-segment-tar/src/main/java/org/apache/jackrabbit/oak/segment/MapEntry.java
+++ 
b/oak-segment-tar/src/main/java/org/apache/jackrabbit/oak/segment/MapEntry.java
@@ -24,7 +24,6 @@ import static 
org.apache.jackrabbit.oak.segment.MapRecord.HASH_MASK;
 import java.util.Comparator;
 import java.util.Map;
 
-import org.apache.jackrabbit.guava.common.collect.ComparisonChain;
 import org.apache.jackrabbit.oak.commons.conditions.Validate;
 import org.apache.jackrabbit.oak.spi.state.AbstractChildNodeEntry;
 import org.jetbrains.annotations.NotNull;
@@ -149,11 +148,10 @@ class MapEntry extends AbstractChildNodeEntry
 
     @Override
     public int compareTo(@NotNull MapEntry that) {
-        return ComparisonChain.start()
-                .compare(getHash() & HASH_MASK, that.getHash() & HASH_MASK)
-                .compare(name, that.name)
-                .compare(value, that.value, 
Comparator.nullsLast(Comparator.naturalOrder()))
-                .result();
+        return Comparator.comparingLong((MapEntry me) -> me.getHash() & 
HASH_MASK)
+                .thenComparing(MapEntry::getName)
+                .thenComparing(MapEntry::getValue, 
Comparator.nullsLast(Comparator.naturalOrder()))
+                .compare(this, that);
     }
 
 }
diff --git 
a/oak-segment-tar/src/main/java/org/apache/jackrabbit/oak/segment/MapRecord.java
 
b/oak-segment-tar/src/main/java/org/apache/jackrabbit/oak/segment/MapRecord.java
index 80006efc17..5e2b0b5da6 100644
--- 
a/oak-segment-tar/src/main/java/org/apache/jackrabbit/oak/segment/MapRecord.java
+++ 
b/oak-segment-tar/src/main/java/org/apache/jackrabbit/oak/segment/MapRecord.java
@@ -27,11 +27,11 @@ import static 
org.apache.jackrabbit.oak.segment.MapEntry.newMapEntry;
 import java.util.ArrayList;
 import java.util.Arrays;
 import java.util.Collections;
+import java.util.Comparator;
 import java.util.Iterator;
 import java.util.List;
 import java.util.Objects;
 
-import org.apache.jackrabbit.guava.common.collect.ComparisonChain;
 import org.apache.jackrabbit.oak.commons.collections.IterableUtils;
 import org.apache.jackrabbit.oak.spi.state.DefaultNodeStateDiff;
 import org.apache.jackrabbit.oak.spi.state.NodeState;
@@ -631,10 +631,9 @@ public class MapRecord extends Record {
         } else if (after == null) {
             return -1;  // see above
         } else {
-            return ComparisonChain.start()
-                    .compare(before.getHash() & HASH_MASK, after.getHash() & 
HASH_MASK)
-                    .compare(before.getName(), after.getName())
-                    .result();
+            return Comparator.comparingLong((MapEntry me) -> me.getHash() & 
HASH_MASK)
+                    .thenComparing(MapEntry::getName)
+                    .compare(before, after);
         }
     }
 
diff --git 
a/oak-segment-tar/src/main/java/org/apache/jackrabbit/oak/segment/PropertyTemplate.java
 
b/oak-segment-tar/src/main/java/org/apache/jackrabbit/oak/segment/PropertyTemplate.java
index 73c958436d..6e5ab706d8 100644
--- 
a/oak-segment-tar/src/main/java/org/apache/jackrabbit/oak/segment/PropertyTemplate.java
+++ 
b/oak-segment-tar/src/main/java/org/apache/jackrabbit/oak/segment/PropertyTemplate.java
@@ -26,7 +26,7 @@ import org.apache.jackrabbit.oak.api.Type;
 import org.apache.jackrabbit.oak.commons.StringUtils;
 import org.jetbrains.annotations.NotNull;
 
-import org.apache.jackrabbit.guava.common.collect.ComparisonChain;
+import java.util.Comparator;
 
 /**
  * A property definition within a template (the property name, the type, and 
the
@@ -74,11 +74,10 @@ public class PropertyTemplate implements 
Comparable<PropertyTemplate> {
     @Override
     public int compareTo(@NotNull PropertyTemplate template) {
         requireNonNull(template);
-        return ComparisonChain.start()
-                .compare(hashCode(), template.hashCode()) // important
-                .compare(name, template.name)
-                .compare(type, template.type)
-                .result();
+        return Comparator.comparingInt(PropertyTemplate::hashCode)
+                .thenComparing(PropertyTemplate::getName)
+                .thenComparing(PropertyTemplate::getType)
+                .compare(this, template);
     }
 
     //------------------------------------------------------------< Object >--
diff --git 
a/oak-segment-tar/src/test/java/org/apache/jackrabbit/oak/segment/PropertyTemplateTest.java
 
b/oak-segment-tar/src/test/java/org/apache/jackrabbit/oak/segment/PropertyTemplateTest.java
new file mode 100644
index 0000000000..481c1c86d9
--- /dev/null
+++ 
b/oak-segment-tar/src/test/java/org/apache/jackrabbit/oak/segment/PropertyTemplateTest.java
@@ -0,0 +1,107 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements.  See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership.  The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License.  You may obtain a copy of the License at
+ *
+ *   http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied.  See the License for the
+ * specific language governing permissions and limitations
+ * under the License.
+ */
+package org.apache.jackrabbit.oak.segment;
+
+import org.apache.jackrabbit.oak.api.Type;
+import org.junit.Assert;
+import org.junit.Test;
+
+import java.util.ArrayList;
+import java.util.Collections;
+import java.util.List;
+
+public class PropertyTemplateTest {
+
+    @Test
+    public void testCompareToWithDifferentNames() {
+        PropertyTemplate p1 = new PropertyTemplate(0, "aName", Type.STRING);
+        PropertyTemplate p2 = new PropertyTemplate(1, "bName", Type.STRING);
+
+        // Since hashCode is used for primary comparison and hashCode uses 
only name,
+        // templates with different names should be ordered by name's hashCode
+        Assert.assertTrue(p1.hashCode() < p2.hashCode());
+        Assert.assertTrue(p1.compareTo(p2) < 0);
+        Assert.assertTrue(p2.compareTo(p1) > 0);
+    }
+
+    @Test
+    public void testCompareToWithSameNamesDifferentTypes() {
+        PropertyTemplate p1 = new PropertyTemplate(0, "sameName", Type.STRING);
+        PropertyTemplate p2 = new PropertyTemplate(0, "sameName", 
Type.BOOLEAN);
+
+        // Same name (so same hashCode), different types
+        Assert.assertEquals(p1.hashCode(), p2.hashCode());
+        // Type comparison is determined by the Type enum's natural order
+        Assert.assertNotEquals(0, p1.compareTo(p2));
+    }
+
+    @Test
+    public void testCompareToWithSameNamesSameTypesDifferentIndices() {
+        PropertyTemplate p1 = new PropertyTemplate(0, "sameName", Type.STRING);
+        PropertyTemplate p2 = new PropertyTemplate(1, "sameName", Type.STRING);
+
+        // Same name and type, different indices
+        Assert.assertEquals(p1.hashCode(), p2.hashCode());
+        Assert.assertEquals(0, p1.compareTo(p2)); // Index is not used in 
comparison
+        Assert.assertEquals(p1, p2); // Index is not used in equals either
+    }
+
+    @Test
+    public void testConsistencyBetweenEqualsAndCompareTo() {
+        PropertyTemplate p1 = new PropertyTemplate(0, "name", Type.STRING);
+        PropertyTemplate p2 = new PropertyTemplate(0, "name", Type.STRING);
+        PropertyTemplate p3 = new PropertyTemplate(0, "name", Type.BOOLEAN);
+
+        // Basic equality check
+        Assert.assertEquals(p1, p1); // Reflexivity
+        Assert.assertEquals(p1, p2); // Symmetry
+        Assert.assertEquals(0, p1.compareTo(p2));
+
+        // Different type
+        Assert.assertNotEquals(p1, p3);
+        Assert.assertNotEquals(0, p1.compareTo(p3));
+
+        // Not a PropertyTemplate
+        Assert.assertNotEquals("not a template", p1);
+    }
+
+    @Test
+    public void testSortingBehavior() {
+        List<PropertyTemplate> templates = new ArrayList<>();
+
+        // Create templates with varying names and types
+        templates.add(new PropertyTemplate(0, "c", Type.STRING));
+        templates.add(new PropertyTemplate(1, "a", Type.STRING));
+        templates.add(new PropertyTemplate(2, "b", Type.STRING));
+        templates.add(new PropertyTemplate(3, "a", Type.BOOLEAN));
+
+        Collections.sort(templates);
+
+        // Check the expected sort order based on hashCode, then name, then 
type
+        Assert.assertEquals("a", templates.get(0).getName()); // 'a' has 
lowest hashCode
+        // BOOLEAN comes after STRING for same name 'a'
+        // since they are compared by Type enum tag value 
(javax.jcr.PropertyType) which is higher for BOOLEAN
+        Assert.assertEquals(Type.STRING, templates.get(0).getType());
+        Assert.assertEquals("a", templates.get(1).getName());
+        Assert.assertEquals(Type.BOOLEAN, templates.get(1).getType());
+        Assert.assertEquals("b", templates.get(2).getName());
+        Assert.assertEquals("c", templates.get(3).getName());
+    }
+
+}
\ No newline at end of file
diff --git 
a/oak-store-document/src/main/java/org/apache/jackrabbit/oak/plugins/document/FormatVersion.java
 
b/oak-store-document/src/main/java/org/apache/jackrabbit/oak/plugins/document/FormatVersion.java
index 43cede1b15..ad1cbd065a 100644
--- 
a/oak-store-document/src/main/java/org/apache/jackrabbit/oak/plugins/document/FormatVersion.java
+++ 
b/oak-store-document/src/main/java/org/apache/jackrabbit/oak/plugins/document/FormatVersion.java
@@ -17,10 +17,9 @@
 package org.apache.jackrabbit.oak.plugins.document;
 
 import java.util.ArrayList;
+import java.util.Comparator;
 import java.util.List;
 
-import org.apache.jackrabbit.guava.common.collect.ComparisonChain;
-
 import static java.util.Objects.requireNonNull;
 import static org.apache.jackrabbit.oak.plugins.document.Collection.SETTINGS;
 
@@ -259,11 +258,10 @@ public final class FormatVersion implements 
Comparable<FormatVersion> {
     @Override
     public int compareTo(@NotNull FormatVersion other) {
         requireNonNull(other);
-        return ComparisonChain.start()
-                .compare(major, other.major)
-                .compare(minor, other.minor)
-                .compare(micro, other.micro)
-                .result();
+        return Comparator.comparingInt((FormatVersion fv) -> fv.major)
+                .thenComparingInt(fv -> fv.minor)
+                .thenComparingInt(fv -> fv.micro)
+                .compare(this, other);
     }
 
     private static DocumentStoreException concurrentUpdate() {

Reply via email to