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

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

commit 73b29eab231c1df581fe0a6a0e88b982687c26e8
Author: Rishabh Kumar <[email protected]>
AuthorDate: Tue Apr 22 14:35:52 2025 +0530

    OAK-11670 : added Iterators.singletonIterator replacement in oak-commons
---
 .../oak/commons/collections/IteratorUtils.java     | 18 +++++++
 .../oak/commons/collections/IteratorUtilsTest.java | 56 ++++++++++++++++++++++
 2 files changed, 74 insertions(+)

diff --git 
a/oak-commons/src/main/java/org/apache/jackrabbit/oak/commons/collections/IteratorUtils.java
 
b/oak-commons/src/main/java/org/apache/jackrabbit/oak/commons/collections/IteratorUtils.java
index b48e109a61..8ac55f3614 100644
--- 
a/oak-commons/src/main/java/org/apache/jackrabbit/oak/commons/collections/IteratorUtils.java
+++ 
b/oak-commons/src/main/java/org/apache/jackrabbit/oak/commons/collections/IteratorUtils.java
@@ -20,7 +20,9 @@ package org.apache.jackrabbit.oak.commons.collections;
 
 import org.apache.commons.collections4.iterators.IteratorChain;
 import org.apache.commons.collections4.iterators.PeekingIterator;
+import org.apache.commons.collections4.iterators.SingletonIterator;
 import org.jetbrains.annotations.NotNull;
+import org.jetbrains.annotations.Nullable;
 
 import java.util.Collection;
 import java.util.Comparator;
@@ -369,4 +371,20 @@ public class IteratorUtils {
         iterators.forEachRemaining(eIteratorChain::addIterator);
         return eIteratorChain;
     }
+
+    /**
+     * Creates an unmodifiable iterator containing a single object.
+     * <p>
+     * This method returns a {@link SingletonIterator} that will yield the 
specified
+     * object exactly once. The returned iterator does not support the
+     * {@link Iterator#remove()} operation.
+     * <p>
+     *
+     * @param <T> the type of object in the iterator
+     * @param value the object to return from the iterator, may be null
+     * @return an unmodifiable iterator containing only the specified object
+     */
+    public static <T> Iterator<T> singletonIterator(@Nullable T value) {
+        return new SingletonIterator<>(value, false);
+    }
 }
diff --git 
a/oak-commons/src/test/java/org/apache/jackrabbit/oak/commons/collections/IteratorUtilsTest.java
 
b/oak-commons/src/test/java/org/apache/jackrabbit/oak/commons/collections/IteratorUtilsTest.java
index 47a4393823..c29cd463e8 100644
--- 
a/oak-commons/src/test/java/org/apache/jackrabbit/oak/commons/collections/IteratorUtilsTest.java
+++ 
b/oak-commons/src/test/java/org/apache/jackrabbit/oak/commons/collections/IteratorUtilsTest.java
@@ -817,4 +817,60 @@ public class IteratorUtilsTest {
 
         Assert.assertThrows(NullPointerException.class, () -> 
IteratorUtils.chainedIterator(new ArrayList<>(Arrays.asList(iterator1, 
iterator2, null)).iterator()));
     }
+
+    @Test
+    public void testSingletonIteratorWithNonNullValue() {
+        String value = "test";
+        Iterator<String> iterator = IteratorUtils.singletonIterator(value);
+
+        Assert.assertTrue(iterator.hasNext());
+        Assert.assertEquals(value, iterator.next());
+        Assert.assertFalse(iterator.hasNext());
+    }
+
+    @Test
+    public void testSingletonIteratorWithNullValue() {
+        Iterator<String> iterator = IteratorUtils.singletonIterator(null);
+
+        Assert.assertTrue(iterator.hasNext());
+        Assert.assertNull(iterator.next());
+        Assert.assertFalse(iterator.hasNext());
+    }
+
+    @Test
+    public void testSingletonIteratorRemoveNotSupported() {
+        Iterator<String> iterator = IteratorUtils.singletonIterator("value");
+        Assert.assertTrue(iterator.hasNext());
+        Assert.assertThrows(UnsupportedOperationException.class, 
iterator::remove); // Should throw UnsupportedOperationException
+    }
+
+    @Test
+    public void testSingletonIteratorNoSuchElement() {
+        Iterator<String> iterator = IteratorUtils.singletonIterator("value");
+        iterator.next(); // First call is fine
+        Assert.assertThrows(NoSuchElementException.class, iterator::next); // 
Should throw NoSuchElementException
+    }
+
+    @Test
+    public void testSingletonIteratorWithCustomObject() {
+        class CustomObject {
+            private final String value;
+
+            CustomObject(String value) {
+                this.value = value;
+            }
+
+            @Override
+            public String toString() {
+                return value;
+            }
+        }
+
+        CustomObject obj = new CustomObject("test-object");
+        Iterator<CustomObject> iterator = IteratorUtils.singletonIterator(obj);
+
+        Assert.assertTrue(iterator.hasNext());
+        Assert.assertSame(obj, iterator.next());
+        Assert.assertFalse(iterator.hasNext());
+    }
 }

Reply via email to