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 6e65feff650..660a0c165d3 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 @@ -208,4 +208,26 @@ public static T get(Iterator iterator, int index) { Objects.requireNonNull(iterator, "Iterator must not be null"); return org.apache.commons.collections4.IteratorUtils.get(iterator, index); } + + /** + * Returns the last element in the given iterator. + *

+ * This method consumes the entire iterator to find the last element. + *

+ * + * @param the type of elements in the iterator + * @param iterator the iterator to get the last element from, must not be null + * @return the last element in the iterator + * @throws NullPointerException if the iterator is null + * @throws NoSuchElementException if the iterator is empty + */ + public static T getLast(Iterator iterator) { + Objects.requireNonNull(iterator, "Iterator must not be null"); + while (true) { + T currentElement = iterator.next(); + if (!iterator.hasNext()) { + return currentElement; + } + } + } } 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 4fb8ad3a838..df21b5d1155 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 @@ -365,4 +365,53 @@ public String toString() { TestObject result = IteratorUtils.get(data.iterator(), 1); Assert.assertEquals("obj2", result.toString()); } + + @Test + public void testGetLastWithMultipleElements() { + Iterator iterator = Arrays.asList("one", "two", "three").iterator(); + Assert.assertEquals("three", IteratorUtils.getLast(iterator)); + Assert.assertFalse(iterator.hasNext()); + } + + @Test + public void testGetLastWithSingleElement() { + Iterator intIterator = List.of(1).iterator(); + Assert.assertEquals(Integer.valueOf(1), IteratorUtils.getLast(intIterator)); + Assert.assertFalse(intIterator.hasNext()); + } + + @Test(expected = NullPointerException.class) + public void testGetLastWithNullIterator() { + IteratorUtils.getLast(null); + } + + @Test(expected = NoSuchElementException.class) + public void testGetLastWithEmptyIterator() { + IteratorUtils.getLast(Collections.emptyIterator()); + } + + @Test + public void testGetLastWithDifferentTypes() { + class TestObject { + private final String value; + + TestObject(String value) { + this.value = value; + } + + @Override + public boolean equals(Object o) { + if (this == o) return true; + if (o == null || getClass() != o.getClass()) return false; + TestObject that = (TestObject) o; + return value.equals(that.value); + } + } + + TestObject obj1 = new TestObject("first"); + TestObject obj2 = new TestObject("last"); + Iterator objectIterator = Arrays.asList(obj1, obj2).iterator(); + Assert.assertEquals(obj2, IteratorUtils.getLast(objectIterator)); + Assert.assertFalse(objectIterator.hasNext()); + } }