You are viewing a plain text version of this content. The canonical link for it is here.
Posted to dev@commons.apache.org by sc...@apache.org on 2002/12/08 16:42:35 UTC

cvs commit: jakarta-commons/collections/src/java/org/apache/commons/collections IteratorUtils.java

scolebourne    2002/12/08 07:42:35

  Modified:    collections/src/test/org/apache/commons/collections
                        TestIteratorUtils.java
               collections/src/java/org/apache/commons/collections
                        IteratorUtils.java
  Log:
  Add IteratorUtils unmodifiable iterators, from Rich Dougherty
  
  Revision  Changes    Path
  1.3       +190 -3    jakarta-commons/collections/src/test/org/apache/commons/collections/TestIteratorUtils.java
  
  Index: TestIteratorUtils.java
  ===================================================================
  RCS file: /home/cvs/jakarta-commons/collections/src/test/org/apache/commons/collections/TestIteratorUtils.java,v
  retrieving revision 1.2
  retrieving revision 1.3
  diff -u -r1.2 -r1.3
  --- TestIteratorUtils.java	12 Oct 2002 22:36:21 -0000	1.2
  +++ TestIteratorUtils.java	8 Dec 2002 15:42:35 -0000	1.3
  @@ -62,7 +62,9 @@
   
   import java.util.ArrayList;
   import java.util.Arrays;
  +import java.util.Iterator;
   import java.util.List;
  +import java.util.ListIterator;
   
   import junit.framework.Test;
   /**
  @@ -74,6 +76,9 @@
           super(name);
       }
   
  +    public static void main(String args[]) {
  +        junit.textui.TestRunner.run(suite());
  +    }
   
       public static Test suite() {
           return BulkTest.makeSuite(TestIteratorUtils.class);
  @@ -106,4 +111,186 @@
           assertEquals(list, Arrays.asList(result));
       }
   
  +    /**
  +     * Gets an immutable Iterator operating on the elements ["a", "b", "c", "d"].
  +     */
  +    private Iterator getImmutableIterator() {
  +        List list = new ArrayList();
  +        list.add("a");
  +        list.add("b");
  +        list.add("c");
  +        list.add("d");
  +        return IteratorUtils.unmodifiableIterator(list.iterator());
  +    }
  +
  +    /**
  +     * Gets an immutable ListIterator operating on the elements ["a", "b", "c", "d"].
  +     */
  +    private ListIterator getImmutableListIterator() {
  +        List list = new ArrayList();
  +        list.add("a");
  +        list.add("b");
  +        list.add("c");
  +        list.add("d");
  +        return IteratorUtils.unmodifiableListIterator(list.listIterator());
  +    }
  +
  +	/**
  +	 * Test next() and hasNext() for an immutable Iterator.
  +	 */
  +    public void testUnmodifiableIteratorIteration() {
  +        Iterator iterator = getImmutableIterator();
  +
  +        assertTrue(iterator.hasNext());
  +
  +        assertEquals("a", iterator.next());
  +
  +        assertTrue(iterator.hasNext());
  +
  +        assertEquals("b", iterator.next());
  +
  +        assertTrue(iterator.hasNext());
  +
  +        assertEquals("c", iterator.next());
  +
  +        assertTrue(iterator.hasNext());
  +
  +        assertEquals("d", iterator.next());
  +
  +        assertTrue(!iterator.hasNext());
  +    }
  +
  +    /**
  +     * Test next(), hasNext(), previous() and hasPrevious() for an immutable
  +     * ListIterator.
  +     */
  +    public void testUnmodifiableListIteratorIteration() {
  +        ListIterator listIterator = getImmutableListIterator();
  +
  +        assertTrue(!listIterator.hasPrevious());
  +        assertTrue(listIterator.hasNext());
  +
  +        assertEquals("a", listIterator.next());
  +
  +        assertTrue(listIterator.hasPrevious());
  +        assertTrue(listIterator.hasNext());
  +
  +        assertEquals("b", listIterator.next());
  +
  +        assertTrue(listIterator.hasPrevious());
  +        assertTrue(listIterator.hasNext());
  +
  +        assertEquals("c", listIterator.next());
  +
  +        assertTrue(listIterator.hasPrevious());
  +        assertTrue(listIterator.hasNext());
  +
  +        assertEquals("d", listIterator.next());
  +
  +        assertTrue(listIterator.hasPrevious());
  +        assertTrue(!listIterator.hasNext());
  +
  +        assertEquals("d", listIterator.previous());
  +
  +        assertTrue(listIterator.hasPrevious());
  +        assertTrue(listIterator.hasNext());
  +
  +        assertEquals("c", listIterator.previous());
  +
  +        assertTrue(listIterator.hasPrevious());
  +        assertTrue(listIterator.hasNext());
  +
  +        assertEquals("b", listIterator.previous());
  +
  +        assertTrue(listIterator.hasPrevious());
  +        assertTrue(listIterator.hasNext());
  +
  +        assertEquals("a", listIterator.previous());
  +
  +        assertTrue(!listIterator.hasPrevious());
  +        assertTrue(listIterator.hasNext());
  +    }
  +
  +    /**
  +     * Test remove() for an immutable Iterator.
  +     */
  +    public void testUnmodifiableIteratorImmutability() {
  +        Iterator iterator = getImmutableIterator();
  +
  +        try {
  +            iterator.remove();
  +            // We shouldn't get to here.
  +            fail("remove() should throw an UnsupportedOperationException");
  +        } catch (UnsupportedOperationException e) {
  +            // This is correct; ignore the exception.
  +        }
  +
  +        iterator.next();
  +
  +        try {
  +            iterator.remove();
  +            // We shouldn't get to here.
  +            fail("remove() should throw an UnsupportedOperationException");
  +        } catch (UnsupportedOperationException e) {
  +            // This is correct; ignore the exception.
  +        }
  +
  +    }
  +
  +    /**
  +     * Test remove() for an immutable ListIterator.
  +     */
  +    public void testUnmodifiableListIteratorImmutability() {
  +    	ListIterator listIterator = getImmutableListIterator();
  +
  +        try {
  +            listIterator.remove();
  +            // We shouldn't get to here.
  +            fail("remove() should throw an UnsupportedOperationException");
  +        } catch (UnsupportedOperationException e) {
  +            // This is correct; ignore the exception.
  +        }
  +
  +        try {
  +            listIterator.set("a");
  +            // We shouldn't get to here.
  +            fail("set(Object) should throw an UnsupportedOperationException");
  +        } catch (UnsupportedOperationException e) {
  +            // This is correct; ignore the exception.
  +        }
  +
  +        try {
  +            listIterator.add("a");
  +            // We shouldn't get to here.
  +            fail("add(Object) should throw an UnsupportedOperationException");
  +        } catch (UnsupportedOperationException e) {
  +            // This is correct; ignore the exception.
  +        }
  +
  +        listIterator.next();
  +
  +        try {
  +            listIterator.remove();
  +            // We shouldn't get to here.
  +            fail("remove() should throw an UnsupportedOperationException");
  +        } catch (UnsupportedOperationException e) {
  +            // This is correct; ignore the exception.
  +        }
  +
  +        try {
  +            listIterator.set("a");
  +            // We shouldn't get to here.
  +            fail("set(Object) should throw an UnsupportedOperationException");
  +        } catch (UnsupportedOperationException e) {
  +            // This is correct; ignore the exception.
  +        }
  +
  +        try {
  +            listIterator.add("a");
  +            // We shouldn't get to here.
  +            fail("add(Object) should throw an UnsupportedOperationException");
  +        } catch (UnsupportedOperationException e) {
  +            // This is correct; ignore the exception.
  +        }
  +    }
   }
  
  
  
  1.6       +135 -5    jakarta-commons/collections/src/java/org/apache/commons/collections/IteratorUtils.java
  
  Index: IteratorUtils.java
  ===================================================================
  RCS file: /home/cvs/jakarta-commons/collections/src/java/org/apache/commons/collections/IteratorUtils.java,v
  retrieving revision 1.5
  retrieving revision 1.6
  diff -u -r1.5 -r1.6
  --- IteratorUtils.java	21 Nov 2002 23:08:27 -0000	1.5
  +++ IteratorUtils.java	8 Dec 2002 15:42:35 -0000	1.6
  @@ -60,6 +60,7 @@
    */
   package org.apache.commons.collections;
   
  +import java.io.Serializable;
   import java.lang.reflect.Array;
   import java.lang.reflect.Method;
   import java.util.ArrayList;
  @@ -113,6 +114,9 @@
       private IteratorUtils() {
       }
   
  +    // Iterator creators
  +    //----------------------------------------------------------------------
  +    
       /**
        * Gets an empty iterator.
        * <p>
  @@ -238,6 +242,34 @@
   //    public static ListIterator arrayListIterator(Object[] array, int start, int end) {
   //        return new ArrayListIterator(array, start, end);
   //    }
  +    
  +    // Iterator wrappers
  +    //----------------------------------------------------------------------
  +    
  +    /**
  +     * Gets an immutable version of an {@link Iterator}. The returned object
  +     * will always throw an {@link java.lang.UnsupportedOperationException} for
  +     * the {@link Iterator#remove()} method.
  +     *
  +     * @param iterator The iterator to make immutable.
  +     * @return An immutable version of the iterator.
  +     */
  +    public static Iterator unmodifiableIterator(Iterator iterator) {
  +        return new UnmodifiableIterator(iterator);
  +    }
  +    
  +    /**
  +     * Gets an immutable version of a {@link ListIterator}.The returned object
  +     * will always throw an {@link java.lang.UnsupportedOperationException} for
  +     * the {@link Iterator#remove()}, {@link ListIterator#add()} and
  +     * {@link ListIterator#set(Object)} methods.
  +     *
  +     * @param listIterator The iterator to make immutable.
  +     * @return An immutable version of the iterator.
  +     */
  +    public static ListIterator unmodifiableListIterator(ListIterator listIterator) {
  +        return new UnmodifiableListIterator(listIterator);
  +    }
   
       /**
        * Gets an iterator that iterates through two {@link Iterator}s 
  @@ -685,5 +717,103 @@
           }
   
       }
  -    
  +
  +    /**
  +     * A wrapper for an {@link java.util.Iterator} which makes it immutable. All
  +     * calls are passed through to the delegate. The {@link #remove()} method
  +     * always throws an {@link java.lang.UnsupportedOperationException}.
  +     *
  +     * @author <a href="mailto:rich@rd.gen.nz">Rich Dougherty</a>
  +     */
  +    static class UnmodifiableIterator implements Iterator, Serializable {
  +
  +        /**
  +         * All calls to this iterator are passed to the delegate.
  +         */
  +        protected Iterator delegate;
  +
  +        /**
  +         * Create an UnmodifiableIterator.
  +         *
  +         * @param delegate The delegate to pass all calls to.
  +         */
  +        public UnmodifiableIterator(Iterator delegate) {
  +            this.delegate = delegate;
  +        }
  +
  +        public boolean hasNext() {
  +            return delegate.hasNext();
  +        }
  +
  +        public Object next() {
  +            return delegate.next();
  +        }
  +
  +        public void remove() {
  +            throw new UnsupportedOperationException("This iterator is immutable");
  +        }
  +
  +    }
  +
  +    /**
  +     * A wrapper for an {@link java.util.ListIterator} which makes it immutable.
  +     * All calls are passed through to the delegate. The {@link #remove()},
  +     * {@link #add(Object)} and (@link #set(Object)} methods always throw an
  +     * {@link java.lang.UnsupportedOperationException}.
  +     *
  +     * @author <a href="mailto:rich@rd.gen.nz">Rich Dougherty</a>
  +     */
  +    static class UnmodifiableListIterator
  +        implements ListIterator, Serializable {
  +
  +        /**
  +         * All calls to this iterator are passed to the delegate.
  +         */
  +        protected ListIterator delegate;
  +
  +        /**
  +         * Create an UnmodifiableListIterator.
  +         *
  +         * @param delegate The delegate to pass all calls to.
  +         */
  +        public UnmodifiableListIterator(ListIterator delegate) {
  +            this.delegate = delegate;
  +        }
  +
  +        public boolean hasNext() {
  +            return delegate.hasNext();
  +        }
  +
  +        public Object next() {
  +            return delegate.next();
  +        }
  +
  +        public boolean hasPrevious() {
  +            return delegate.hasPrevious();
  +        }
  +
  +        public Object previous() {
  +            return delegate.previous();
  +        }
  +
  +        public int nextIndex() {
  +            return delegate.nextIndex();
  +        }
  +
  +        public int previousIndex() {
  +            return delegate.previousIndex();
  +        }
  +
  +        public void remove() {
  +            throw new UnsupportedOperationException("This iterator is immutable");
  +        }
  +
  +        public void set(Object o) {
  +            throw new UnsupportedOperationException("This iterator is immutable");
  +        }
  +
  +        public void add(Object o) {
  +            throw new UnsupportedOperationException("This iterator is immutable");
  +        }
  +    }
   }
  
  
  

--
To unsubscribe, e-mail:   <ma...@jakarta.apache.org>
For additional commands, e-mail: <ma...@jakarta.apache.org>