You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@commons.apache.org by br...@apache.org on 2011/05/24 04:46:03 UTC
svn commit: r1126836 - in /commons/proper/collections/trunk/src:
java/org/apache/commons/collections/
java/org/apache/commons/collections/iterators/
test/org/apache/commons/collections/
test/org/apache/commons/collections/iterators/
Author: brentworden
Date: Tue May 24 02:46:02 2011
New Revision: 1126836
URL: http://svn.apache.org/viewvc?rev=1126836&view=rev
Log:
COLLECTIONS-213. Added IteratorIterable adaptor class.
Added:
commons/proper/collections/trunk/src/java/org/apache/commons/collections/iterators/IteratorIterable.java (with props)
commons/proper/collections/trunk/src/test/org/apache/commons/collections/iterators/TestIteratorIterable.java (with props)
Modified:
commons/proper/collections/trunk/src/java/org/apache/commons/collections/IteratorUtils.java
commons/proper/collections/trunk/src/test/org/apache/commons/collections/TestIteratorUtils.java
Modified: commons/proper/collections/trunk/src/java/org/apache/commons/collections/IteratorUtils.java
URL: http://svn.apache.org/viewvc/commons/proper/collections/trunk/src/java/org/apache/commons/collections/IteratorUtils.java?rev=1126836&r1=1126835&r2=1126836&view=diff
==============================================================================
--- commons/proper/collections/trunk/src/java/org/apache/commons/collections/IteratorUtils.java (original)
+++ commons/proper/collections/trunk/src/java/org/apache/commons/collections/IteratorUtils.java Tue May 24 02:46:02 2011
@@ -41,6 +41,7 @@ import org.apache.commons.collections.it
import org.apache.commons.collections.iterators.FilterListIterator;
import org.apache.commons.collections.iterators.IteratorChain;
import org.apache.commons.collections.iterators.IteratorEnumeration;
+import org.apache.commons.collections.iterators.IteratorIterable;
import org.apache.commons.collections.iterators.ListIteratorWrapper;
import org.apache.commons.collections.iterators.LoopingIterator;
import org.apache.commons.collections.iterators.LoopingListIterator;
@@ -758,6 +759,20 @@ public class IteratorUtils {
}
/**
+ * Gets an iterable that wraps an iterator.
+ *
+ * @param iterator the iterator to use, not null
+ * @return a new, single use iterable
+ * @throws NullPointerException if iterator is null
+ */
+ public static <E> Iterable<E> asIterable(Iterator<? extends E> iterator) {
+ if (iterator == null) {
+ throw new NullPointerException("Iterator must not be null");
+ }
+ return new IteratorIterable<E>(iterator);
+ }
+
+ /**
* Gets a list iterator based on a simple iterator.
* <p>
* As the wrapped Iterator is traversed, a LinkedList of its values is
Added: commons/proper/collections/trunk/src/java/org/apache/commons/collections/iterators/IteratorIterable.java
URL: http://svn.apache.org/viewvc/commons/proper/collections/trunk/src/java/org/apache/commons/collections/iterators/IteratorIterable.java?rev=1126836&view=auto
==============================================================================
--- commons/proper/collections/trunk/src/java/org/apache/commons/collections/iterators/IteratorIterable.java (added)
+++ commons/proper/collections/trunk/src/java/org/apache/commons/collections/iterators/IteratorIterable.java Tue May 24 02:46:02 2011
@@ -0,0 +1,72 @@
+/*
+ * 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.collections.iterators;
+
+import java.util.Iterator;
+
+/**
+ * Adapter to make an {@link Iterator Iterator} instance appear to be an
+ * {@link Iterable Iterable} instance. Unlike normal iterable instance, the
+ * {@link #iterator()} method always returns the same iterator instance. This
+ * prohibits this iterator to be only usable for one iterative operation.
+ *
+ * @since Commons Collections 4.0
+ * @version $Revision: $ $Date: $
+ */
+public class IteratorIterable<E> implements Iterable<E> {
+
+ /**
+ * Factory method to create an {@link Iterator Iterator} from another
+ * iterator over objects of a different subtype.
+ */
+ private static <E> Iterator<E> createTypesafeIterator(
+ final Iterator<? extends E> iterator) {
+ return new Iterator<E>() {
+ public boolean hasNext() {
+ return iterator.hasNext();
+ }
+
+ public E next() {
+ return iterator.next();
+ }
+
+ public void remove() {
+ iterator.remove();
+ }
+ };
+ }
+
+ /** the iterator being used. */
+ private final Iterator<E> iterator;
+
+ /**
+ * Constructs a new <code>IteratorIterable</code> that will use the given
+ * iterator.
+ *
+ * @param iterator the iterator to use.
+ */
+ public IteratorIterable(Iterator<? extends E> iterator) {
+ super();
+ this.iterator = createTypesafeIterator(iterator);
+ }
+
+ /**
+ * Gets the iterator wrapped by this iterable.
+ *
+ * @return the iterator
+ */
+ public Iterator<E> iterator() {
+ return iterator;
+ }
+}
Propchange: commons/proper/collections/trunk/src/java/org/apache/commons/collections/iterators/IteratorIterable.java
------------------------------------------------------------------------------
svn:eol-style = native
Propchange: commons/proper/collections/trunk/src/java/org/apache/commons/collections/iterators/IteratorIterable.java
------------------------------------------------------------------------------
svn:mime-type = text/plain
Modified: commons/proper/collections/trunk/src/test/org/apache/commons/collections/TestIteratorUtils.java
URL: http://svn.apache.org/viewvc/commons/proper/collections/trunk/src/test/org/apache/commons/collections/TestIteratorUtils.java?rev=1126836&r1=1126835&r2=1126836&view=diff
==============================================================================
--- commons/proper/collections/trunk/src/test/org/apache/commons/collections/TestIteratorUtils.java (original)
+++ commons/proper/collections/trunk/src/test/org/apache/commons/collections/TestIteratorUtils.java Tue May 24 02:46:02 2011
@@ -48,6 +48,35 @@ public class TestIteratorUtils extends B
return BulkTest.makeSuite(TestIteratorUtils.class);
}
+ public void testAsIterable() {
+ List<Integer> list = new ArrayList<Integer>();
+ list.add(Integer.valueOf(0));
+ list.add(Integer.valueOf(1));
+ list.add(Integer.valueOf(2));
+ Iterator<Integer> iterator = list.iterator();
+
+ Iterable<Integer> iterable = IteratorUtils.asIterable(iterator);
+ int expected = 0;
+ for(Integer actual : iterable) {
+ assertEquals(expected, actual.intValue());
+ ++expected;
+ }
+
+ // single use iterator
+ for(Integer actual : iterable) {
+ fail("should not be able to iterate twice");
+ }
+ }
+
+ public void testAsIterableNull() {
+ try {
+ IteratorUtils.asIterable(null);
+ fail("Expecting NullPointerException");
+ } catch (NullPointerException ex) {
+ // success
+ }
+ }
+
public void testToList() {
List<Object> list = new ArrayList<Object>();
list.add(new Integer(1));
Added: commons/proper/collections/trunk/src/test/org/apache/commons/collections/iterators/TestIteratorIterable.java
URL: http://svn.apache.org/viewvc/commons/proper/collections/trunk/src/test/org/apache/commons/collections/iterators/TestIteratorIterable.java?rev=1126836&view=auto
==============================================================================
--- commons/proper/collections/trunk/src/test/org/apache/commons/collections/iterators/TestIteratorIterable.java (added)
+++ commons/proper/collections/trunk/src/test/org/apache/commons/collections/iterators/TestIteratorIterable.java Tue May 24 02:46:02 2011
@@ -0,0 +1,54 @@
+/*
+ * 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.collections.iterators;
+
+import java.util.ArrayList;
+import java.util.Iterator;
+import java.util.List;
+
+import junit.framework.Test;
+
+import org.apache.commons.collections.BulkTest;
+
+/**
+ * Tests for IteratorIterable.
+ *
+ * @version $Revision: $ $Date: $
+ */
+public class TestIteratorIterable extends BulkTest {
+
+ public static Test suite() {
+ return BulkTest.makeSuite(TestIteratorIterable.class);
+ }
+
+ public TestIteratorIterable(String name) {
+ super(name);
+ }
+
+ public void testIterator() {
+ List<Integer> list = new ArrayList<Integer>();
+ list.add(Integer.valueOf(0));
+ list.add(Integer.valueOf(1));
+ list.add(Integer.valueOf(2));
+ Iterator<Integer> iter = list.iterator();
+
+ Iterable<Number> iterable = new IteratorIterable<Number>(iter);
+ int expected = 0;
+ for (Number actual : iterable) {
+ assertEquals(expected, actual.intValue());
+ ++expected;
+ }
+ }
+}
+
Propchange: commons/proper/collections/trunk/src/test/org/apache/commons/collections/iterators/TestIteratorIterable.java
------------------------------------------------------------------------------
svn:eol-style = native
Propchange: commons/proper/collections/trunk/src/test/org/apache/commons/collections/iterators/TestIteratorIterable.java
------------------------------------------------------------------------------
svn:mime-type = text/plain