You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@commons.apache.org by tn...@apache.org on 2013/11/27 23:54:05 UTC
svn commit: r1546220 - in /commons/proper/collections/trunk: ./ src/changes/
src/main/java/org/apache/commons/collections4/
src/main/java/org/apache/commons/collections4/iterators/
src/test/java/org/apache/commons/collections4/iterators/
Author: tn
Date: Wed Nov 27 22:54:05 2013
New Revision: 1546220
URL: http://svn.apache.org/r1546220
Log:
[COLLECTIONS-471] Added BoundedIterator.
Added:
commons/proper/collections/trunk/src/main/java/org/apache/commons/collections4/iterators/BoundedIterator.java (with props)
commons/proper/collections/trunk/src/test/java/org/apache/commons/collections4/iterators/BoundedIteratorTest.java (with props)
Modified:
commons/proper/collections/trunk/pom.xml
commons/proper/collections/trunk/src/changes/changes.xml
commons/proper/collections/trunk/src/main/java/org/apache/commons/collections4/IteratorUtils.java
Modified: commons/proper/collections/trunk/pom.xml
URL: http://svn.apache.org/viewvc/commons/proper/collections/trunk/pom.xml?rev=1546220&r1=1546219&r2=1546220&view=diff
==============================================================================
--- commons/proper/collections/trunk/pom.xml (original)
+++ commons/proper/collections/trunk/pom.xml Wed Nov 27 22:54:05 2013
@@ -385,6 +385,9 @@
<name>Leo Sutic</name>
</contributor>
<contributor>
+ <name>Radford Tam</name>
+ </contributor>
+ <contributor>
<name>Chris Tilden</name>
</contributor>
<contributor>
Modified: commons/proper/collections/trunk/src/changes/changes.xml
URL: http://svn.apache.org/viewvc/commons/proper/collections/trunk/src/changes/changes.xml?rev=1546220&r1=1546219&r2=1546220&view=diff
==============================================================================
--- commons/proper/collections/trunk/src/changes/changes.xml (original)
+++ commons/proper/collections/trunk/src/changes/changes.xml Wed Nov 27 22:54:05 2013
@@ -22,8 +22,9 @@
<body>
<release version="4.0.1" date="TBD" description="">
-<!-- <action issue="COLLECTIONS-XXX" dev="XXX" type="XXX">
- </action> -->
+ <action issue="COLLECTIONS-471" dev="tn" type="add" due-to="Radford Tam">
+ Added new decorator "BoundedIterator".
+ </action>
</release>
<release version="4.0" date="2013-11-27" description="
This is a major release: It combines bug fixes, new features and
Modified: commons/proper/collections/trunk/src/main/java/org/apache/commons/collections4/IteratorUtils.java
URL: http://svn.apache.org/viewvc/commons/proper/collections/trunk/src/main/java/org/apache/commons/collections4/IteratorUtils.java?rev=1546220&r1=1546219&r2=1546220&view=diff
==============================================================================
--- commons/proper/collections/trunk/src/main/java/org/apache/commons/collections4/IteratorUtils.java (original)
+++ commons/proper/collections/trunk/src/main/java/org/apache/commons/collections4/IteratorUtils.java Wed Nov 27 22:54:05 2013
@@ -31,6 +31,7 @@ import java.util.Map;
import org.apache.commons.collections4.iterators.ArrayIterator;
import org.apache.commons.collections4.iterators.ArrayListIterator;
+import org.apache.commons.collections4.iterators.BoundedIterator;
import org.apache.commons.collections4.iterators.CollatingIterator;
import org.apache.commons.collections4.iterators.EmptyIterator;
import org.apache.commons.collections4.iterators.EmptyListIterator;
@@ -432,6 +433,44 @@ public class IteratorUtils {
return new ArrayListIterator<E>(array, start, end);
}
+ // Bounded
+ //-----------------------------------------------------------------------
+ /**
+ * Decorates the specified iterator to return at most the given number
+ * of elements.
+ *
+ * @param <E> the element type
+ * @param iterator the iterator to decorate
+ * @param max the maximum number of elements returned by this iterator
+ * @return a new bounded iterator
+ * @throws IllegalArgumentException if the iterator is null or either offset or max is negative
+ * @since 4.0.1
+ */
+ public static <E> BoundedIterator<E> boundedIterator(final Iterator<? extends E> iterator, long max) {
+ return BoundedIterator.boundedIterator(iterator, max);
+ }
+
+ /**
+ * Decorates the specified iterator to return at most the given number
+ * of elements, skipping all elements until the iterator reaches the
+ * position at {@code offset}.
+ * <p>
+ * The iterator is immediately advanced until it reaches the position at
+ * {@code offset}, incurring O(n) time.
+ *
+ * @param <E> the element type
+ * @param iterator the iterator to decorate
+ * @param offset the index of the first element of the decorated iterator to return
+ * @param max the maximum number of elements returned by this iterator
+ * @return a new bounded iterator
+ * @throws IllegalArgumentException if the iterator is null or either offset or max is negative
+ * @since 4.0.1
+ */
+ public static <E> BoundedIterator<E> boundedIterator(final Iterator<? extends E> iterator,
+ long offset, long max) {
+ return BoundedIterator.boundedIterator(iterator, offset, max);
+ }
+
// Unmodifiable
//-----------------------------------------------------------------------
/**
Added: commons/proper/collections/trunk/src/main/java/org/apache/commons/collections4/iterators/BoundedIterator.java
URL: http://svn.apache.org/viewvc/commons/proper/collections/trunk/src/main/java/org/apache/commons/collections4/iterators/BoundedIterator.java?rev=1546220&view=auto
==============================================================================
--- commons/proper/collections/trunk/src/main/java/org/apache/commons/collections4/iterators/BoundedIterator.java (added)
+++ commons/proper/collections/trunk/src/main/java/org/apache/commons/collections4/iterators/BoundedIterator.java Wed Nov 27 22:54:05 2013
@@ -0,0 +1,170 @@
+/*
+ * 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.commons.collections4.iterators;
+
+import java.util.Iterator;
+import java.util.NoSuchElementException;
+
+/**
+ * Decorates another iterator to return elements in a specific range.
+ * <p>
+ * The decorated iterator is bounded in the range [offset, offset+max).
+ * The {@code offset} corresponds to the position of the first element to
+ * be returned from the decorated iterator, and {@code max} is the maximum
+ * number of elements to be returned at most.
+ * <p>
+ * In case an offset parameter other than 0 is provided, the decorated
+ * iterator is immediately advanced to this position, skipping all elements
+ * before that position.
+ *
+ * @since 4.0.1
+ * @version $Id$
+ */
+public class BoundedIterator<E> implements Iterator<E> {
+
+ /** The iterator being decorated. */
+ private final Iterator<? extends E> iterator;
+
+ /** The offset to bound the first element return */
+ private final long offset;
+
+ /** The max number of elements to return */
+ private final long max;
+
+ /** The position of the current element */
+ private long pos;
+
+ //-----------------------------------------------------------------------
+
+ /**
+ * Decorates the specified iterator to return at most the given number
+ * of elements.
+ *
+ * @param <E> the element type
+ * @param iterator the iterator to decorate
+ * @param max the maximum number of elements returned by this iterator
+ * @return a new bounded iterator
+ * @throws IllegalArgumentException if the iterator is null or max is negative
+ */
+ public static <E> BoundedIterator<E> boundedIterator(final Iterator<? extends E> iterator,
+ final long max) {
+ return boundedIterator(iterator, 0, max);
+ }
+
+ /**
+ * Decorates the specified iterator to return at most the given number
+ * of elements, skipping all elements until the iterator reaches the position
+ * at {@code offset}.
+ * <p>
+ * The iterator is immediately advanced until it reaches the position at {@code offset},
+ * incurring O(n) time.
+ *
+ * @param <E> the element type
+ * @param iterator the iterator to decorate
+ * @param offset the index of the first element of the decorated iterator to return
+ * @param max the maximum number of elements returned by this iterator
+ * @return a new bounded iterator
+ * @throws IllegalArgumentException if the iterator is null or either offset or max is negative
+ */
+ public static <E> BoundedIterator<E> boundedIterator(final Iterator<? extends E> iterator,
+ final long offset, final long max) {
+ return new BoundedIterator<E>(iterator, 0, max);
+ }
+
+ //-----------------------------------------------------------------------
+
+ /**
+ * Decorates the specified iterator to return at most the given number of elements,
+ * skipping all elements until the iterator reaches the position at {@code offset}.
+ * <p>
+ * The iterator is immediately advanced until it reaches the position at {@code offset},
+ * incurring O(n) time.
+ *
+ * @param iterator the iterator to be decorated
+ * @param offset the index of the first element of the decorated iterator to return
+ * @param max the maximum number of elements of the decorated iterator to return
+ * @throws IllegalArgumentException if iterator is null, or either offset or max is negative
+ */
+ public BoundedIterator(final Iterator<? extends E> iterator, final long offset, final long max) {
+ if (iterator == null) {
+ throw new IllegalArgumentException("Iterator must not be null");
+ }
+ if (offset < 0) {
+ throw new IllegalArgumentException("Offset parameter must not be negative.");
+ }
+ if (max < 0) {
+ throw new IllegalArgumentException("Max parameter must not be negative.");
+ }
+
+ this.iterator = iterator;
+ this.offset = offset;
+ this.max = max;
+ pos = 0;
+ init();
+ }
+
+ /**
+ * Advances the underlying iterator to the beginning of the bounded range.
+ */
+ private void init() {
+ while (pos < offset && iterator.hasNext()) {
+ iterator.next();
+ pos++;
+ }
+ }
+
+ //-----------------------------------------------------------------------
+
+ public boolean hasNext() {
+ if (!checkBounds()) {
+ return false;
+ }
+ return iterator.hasNext();
+ }
+
+ /**
+ * Checks whether the iterator is still within its bounded range.
+ * @return {@code true} if the iterator is within its bounds, {@code false} otherwise
+ */
+ private boolean checkBounds() {
+ if (pos - offset + 1 > max) {
+ return false;
+ }
+ return true;
+ }
+
+ public E next() {
+ if (!checkBounds()) {
+ throw new NoSuchElementException();
+ }
+ final E next = iterator.next();
+ pos++;
+ return next;
+ }
+
+ /**
+ * {@inheritDoc}
+ * <p>
+ * In case an offset other than 0 was specified, the underlying iterator will be advanced
+ * to this position upon creation. A call to {@link #remove()} will still result in an
+ * {@link IllegalStateException} if no explicit call to {@link #next()} has been made prior
+ * to calling {@link #remove()}.
+ */
+ public void remove() {
+ if (pos <= offset) {
+ throw new IllegalStateException("remove() can not be called before calling next()");
+ }
+ iterator.remove();
+ }
+}
Propchange: commons/proper/collections/trunk/src/main/java/org/apache/commons/collections4/iterators/BoundedIterator.java
------------------------------------------------------------------------------
svn:eol-style = native
Propchange: commons/proper/collections/trunk/src/main/java/org/apache/commons/collections4/iterators/BoundedIterator.java
------------------------------------------------------------------------------
svn:keywords = Id Revision HeadURL
Propchange: commons/proper/collections/trunk/src/main/java/org/apache/commons/collections4/iterators/BoundedIterator.java
------------------------------------------------------------------------------
svn:mime-type = text/plain
Added: commons/proper/collections/trunk/src/test/java/org/apache/commons/collections4/iterators/BoundedIteratorTest.java
URL: http://svn.apache.org/viewvc/commons/proper/collections/trunk/src/test/java/org/apache/commons/collections4/iterators/BoundedIteratorTest.java?rev=1546220&view=auto
==============================================================================
--- commons/proper/collections/trunk/src/test/java/org/apache/commons/collections4/iterators/BoundedIteratorTest.java (added)
+++ commons/proper/collections/trunk/src/test/java/org/apache/commons/collections4/iterators/BoundedIteratorTest.java Wed Nov 27 22:54:05 2013
@@ -0,0 +1,370 @@
+/*
+ * 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.commons.collections4.iterators;
+
+import java.util.ArrayList;
+import java.util.Arrays;
+import java.util.Collections;
+import java.util.Iterator;
+import java.util.List;
+import java.util.NoSuchElementException;
+
+import org.junit.Test;
+
+/**
+ * A unit test to test the basic functions of {@link BoundedIterator}.
+ *
+ * @version $Id$
+ */
+public class BoundedIteratorTest<E> extends AbstractIteratorTest<E> {
+
+ /** Test array of size 7 */
+ private String[] testArray = {
+ "a", "b", "c", "d", "e", "f", "g"
+ };
+
+ private List<E> testList;
+
+ public BoundedIteratorTest(final String testName) {
+ super(testName);
+ }
+
+ @SuppressWarnings("unchecked")
+ @Override
+ public void setUp()
+ throws Exception {
+ super.setUp();
+ testList = Arrays.asList((E[]) testArray);
+ }
+
+ @Override
+ public Iterator<E> makeEmptyIterator() {
+ return BoundedIterator.boundedIterator(Collections.<E>emptyList().iterator(), 10);
+ }
+
+ @Override
+ public Iterator<E> makeObject() {
+ return BoundedIterator.boundedIterator(new ArrayList<E>(testList).iterator(), 1, testList.size() - 1);
+ }
+
+ // ---------------- Tests ---------------------
+
+ /**
+ * Test a decorated iterator bounded such that the first element returned is
+ * at an index greater its first element, and the last element returned is
+ * at an index less than its last element.
+ */
+ @Test
+ public void testBounded() {
+ Iterator<E> iter = new BoundedIterator<E>(testList.iterator(), 2, 4);
+
+ assertTrue(iter.hasNext());
+ assertEquals("c", iter.next());
+ assertTrue(iter.hasNext());
+ assertEquals("d", iter.next());
+ assertTrue(iter.hasNext());
+ assertEquals("e", iter.next());
+ assertTrue(iter.hasNext());
+ assertEquals("f", iter.next());
+
+ assertFalse(iter.hasNext());
+ try {
+ iter.next();
+ fail("Expected NoSuchElementException.");
+ } catch (NoSuchElementException nsee) { /* Success case */
+ }
+ }
+
+ /**
+ * Test a decorated iterator bounded such that the <code>offset</code> is
+ * zero and the <code>max</code> is its size, in that the BoundedIterator
+ * should return all the same elements as its decorated iterator.
+ */
+ @Test
+ public void testSameAsDecorated() {
+ Iterator<E> iter = new BoundedIterator<E>(testList.iterator(), 0,
+ testList.size());
+
+ assertTrue(iter.hasNext());
+ assertEquals("a", iter.next());
+ assertTrue(iter.hasNext());
+ assertEquals("b", iter.next());
+ assertTrue(iter.hasNext());
+ assertEquals("c", iter.next());
+ assertTrue(iter.hasNext());
+ assertEquals("d", iter.next());
+ assertTrue(iter.hasNext());
+ assertEquals("e", iter.next());
+ assertTrue(iter.hasNext());
+ assertEquals("f", iter.next());
+ assertTrue(iter.hasNext());
+ assertEquals("g", iter.next());
+
+ assertFalse(iter.hasNext());
+ try {
+ iter.next();
+ fail("Expected NoSuchElementException.");
+ } catch (NoSuchElementException nsee) { /* Success case */
+ }
+ }
+
+ /**
+ * Test a decorated iterator bounded to a <code>max</code> of 0. The
+ * BoundedIterator should behave as if there are no more elements to return,
+ * since it is technically an empty iterator.
+ */
+ @Test
+ public void testEmptyBounded() {
+ Iterator<E> iter = new BoundedIterator<E>(testList.iterator(), 3, 0);
+ assertFalse(iter.hasNext());
+ try {
+ iter.next();
+ fail("Expected NoSuchElementException.");
+ } catch (NoSuchElementException nsee) { /* Success case */
+ }
+ }
+
+ /**
+ * Test the case if a negative <code>offset</code> is passed to the
+ * constructor. {@link IllegalArgumentException} is expected.
+ */
+ @Test
+ public void testNegativeOffset() {
+ try {
+ new BoundedIterator<E>(testList.iterator(), -1, 4);
+ fail("Expected IllegalArgumentException.");
+ } catch (IllegalArgumentException iae) { /* Success case */
+ }
+ }
+
+ /**
+ * Test the case if a negative <code>max</code> is passed to the
+ * constructor. {@link IllegalArgumentException} is expected.
+ */
+ @Test
+ public void testNegativeMax() {
+ try {
+ new BoundedIterator<E>(testList.iterator(), 3, -1);
+ fail("Expected IllegalArgumentException.");
+ } catch (IllegalArgumentException iae) { /* Success case */
+ }
+ }
+
+ /**
+ * Test the case if the <code>offset</code> passed to the constructor is
+ * greater than the decorated iterator's size. The BoundedIterator should
+ * behave as if there are no more elements to return.
+ */
+ @Test
+ public void testOffsetGreaterThanSize() {
+ Iterator<E> iter = new BoundedIterator<E>(testList.iterator(), 10, 4);
+ assertFalse(iter.hasNext());
+ try {
+ iter.next();
+ fail("Expected NoSuchElementException.");
+ } catch (NoSuchElementException nsee) { /* Success case */
+ }
+ }
+
+ /**
+ * Test the case if the <code>max</code> passed to the constructor is
+ * greater than the size of the decorated iterator. The last element
+ * returned should be the same as the last element of the decorated
+ * iterator.
+ */
+ @Test
+ public void testMaxGreaterThanSize() {
+ Iterator<E> iter = new BoundedIterator<E>(testList.iterator(), 1, 10);
+
+ assertTrue(iter.hasNext());
+ assertEquals("b", iter.next());
+ assertTrue(iter.hasNext());
+ assertEquals("c", iter.next());
+ assertTrue(iter.hasNext());
+ assertEquals("d", iter.next());
+ assertTrue(iter.hasNext());
+ assertEquals("e", iter.next());
+ assertTrue(iter.hasNext());
+ assertEquals("f", iter.next());
+ assertTrue(iter.hasNext());
+ assertEquals("g", iter.next());
+
+ assertFalse(iter.hasNext());
+ try {
+ iter.next();
+ fail("Expected NoSuchElementException.");
+ } catch (NoSuchElementException nsee) { /* Success case */
+ }
+ }
+
+ /**
+ * Test the <code>remove()</code> method being called without
+ * <code>next()</code> being called first.
+ */
+ @Test
+ public void testRemoveWithoutCallingNext() {
+ List<E> testListCopy = new ArrayList<E>(testList);
+ Iterator<E> iter = new BoundedIterator<E>(testListCopy.iterator(), 1, 5);
+
+ try {
+ iter.remove();
+ fail("Expected IllegalStateException.");
+ } catch (IllegalStateException ise) { /* Success case */
+ }
+ }
+
+ /**
+ * Test the <code>remove()</code> method being called twice without calling
+ * <code>next()</code> in between.
+ */
+ @Test
+ public void testRemoveCalledTwice() {
+ List<E> testListCopy = new ArrayList<E>(testList);
+ Iterator<E> iter = new BoundedIterator<E>(testListCopy.iterator(), 1, 5);
+
+ assertTrue(iter.hasNext());
+ assertEquals("b", iter.next());
+ iter.remove();
+
+ try {
+ iter.remove();
+ fail("Expected IllegalStateException.");
+ } catch (IllegalStateException ise) { /* Success case */
+ }
+ }
+
+ /**
+ * Test removing the first element. Verify that the element is removed from
+ * the underlying collection.
+ */
+ @Test
+ public void testRemoveFirst() {
+ List<E> testListCopy = new ArrayList<E>(testList);
+ Iterator<E> iter = new BoundedIterator<E>(testListCopy.iterator(), 1, 5);
+
+ assertTrue(iter.hasNext());
+ assertEquals("b", iter.next());
+
+ iter.remove();
+ assertFalse(testListCopy.contains("b"));
+
+ assertTrue(iter.hasNext());
+ assertEquals("c", iter.next());
+ assertTrue(iter.hasNext());
+ assertEquals("d", iter.next());
+ assertTrue(iter.hasNext());
+ assertEquals("e", iter.next());
+ assertTrue(iter.hasNext());
+ assertEquals("f", iter.next());
+
+ assertFalse(iter.hasNext());
+ try {
+ iter.next();
+ fail("Expected NoSuchElementException.");
+ } catch (NoSuchElementException nsee) { /* Success case */
+ }
+ }
+
+ /**
+ * Test removing an element in the middle of the iterator. Verify that the
+ * element is removed from the underlying collection.
+ */
+ @Test
+ public void testRemoveMiddle() {
+ List<E> testListCopy = new ArrayList<E>(testList);
+ Iterator<E> iter = new BoundedIterator<E>(testListCopy.iterator(), 1, 5);
+
+ assertTrue(iter.hasNext());
+ assertEquals("b", iter.next());
+ assertTrue(iter.hasNext());
+ assertEquals("c", iter.next());
+ assertTrue(iter.hasNext());
+ assertEquals("d", iter.next());
+
+ iter.remove();
+ assertFalse(testListCopy.contains("d"));
+
+ assertTrue(iter.hasNext());
+ assertEquals("e", iter.next());
+ assertTrue(iter.hasNext());
+ assertEquals("f", iter.next());
+
+ assertFalse(iter.hasNext());
+ try {
+ iter.next();
+ fail("Expected NoSuchElementException.");
+ } catch (NoSuchElementException nsee) { /* Success case */
+ }
+ }
+
+ /**
+ * Test removing the last element. Verify that the element is removed from
+ * the underlying collection.
+ */
+ @Test
+ public void testRemoveLast() {
+ List<E> testListCopy = new ArrayList<E>(testList);
+ Iterator<E> iter = new BoundedIterator<E>(testListCopy.iterator(), 1, 5);
+
+ assertTrue(iter.hasNext());
+ assertEquals("b", iter.next());
+ assertTrue(iter.hasNext());
+ assertEquals("c", iter.next());
+ assertTrue(iter.hasNext());
+ assertEquals("d", iter.next());
+ assertTrue(iter.hasNext());
+ assertEquals("e", iter.next());
+ assertTrue(iter.hasNext());
+ assertEquals("f", iter.next());
+
+ assertFalse(iter.hasNext());
+ try {
+ iter.next();
+ fail("Expected NoSuchElementException.");
+ } catch (NoSuchElementException nsee) { /* Success case */
+ }
+
+ iter.remove();
+ assertFalse(testListCopy.contains("f"));
+
+ assertFalse(iter.hasNext());
+ try {
+ iter.next();
+ fail("Expected NoSuchElementException.");
+ } catch (NoSuchElementException nsee) { /* Success case */
+ }
+ }
+
+ /**
+ * Test the case if the decorated iterator does not support the
+ * <code>remove()</code> method and throws an {@link UnsupportedOperationException}.
+ */
+ @Test
+ public void testRemoveUnsupported() {
+ Iterator<E> mockIterator = new AbstractIteratorDecorator<E>(testList.iterator()) {
+ public void remove() {
+ throw new UnsupportedOperationException();
+ }
+ };
+
+ Iterator<E> iter = new BoundedIterator<E>(mockIterator, 1, 5);
+ assertTrue(iter.hasNext());
+ assertEquals("b", iter.next());
+ try {
+ iter.remove();
+ fail("Expected UnsupportedOperationException.");
+ } catch (UnsupportedOperationException usoe) { /* Success case */
+ }
+ }
+}
Propchange: commons/proper/collections/trunk/src/test/java/org/apache/commons/collections4/iterators/BoundedIteratorTest.java
------------------------------------------------------------------------------
svn:eol-style = native
Propchange: commons/proper/collections/trunk/src/test/java/org/apache/commons/collections4/iterators/BoundedIteratorTest.java
------------------------------------------------------------------------------
svn:keywords = Id Revision HeadURL
Propchange: commons/proper/collections/trunk/src/test/java/org/apache/commons/collections4/iterators/BoundedIteratorTest.java
------------------------------------------------------------------------------
svn:mime-type = text/plain