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