You are viewing a plain text version of this content. The canonical link for it is here.
Posted to dev@commons.apache.org by Ralph Wagner <ra...@web.de> on 2003/01/30 09:28:15 UTC

[Collections][PATCH] Enable remove in FilterIterator

> At the moment the commons.collections.iterators.FilterIterator does not
implement the "remove" method.
> The comment says:
>      * Always throws UnsupportedOperationException as this class
>      * does look-ahead with its internal iterator.
>
> This is only a problem if the "hasNext" method was already called, for the
other cases the remove operation could be implemented.
>
> Ralph

Index: FilterIterator.java
===================================================================
RCS file: /home/cvspublic/jakarta-commons/collections/src/java/org/apache/commons/collections/iterators/FilterIterator.java,v
retrieving revision 1.2
diff -u -r1.2 FilterIterator.java
--- FilterIterator.java	2003/01/15 21:45:23	1.2
+++ FilterIterator.java	2003/01/30 07:04:53
@@ -69,10 +69,11 @@
  * returned.
  *
  * @since Commons Collections 1.0
- * @version $Revision: 1.1.1.1 $ $Date: 2003/01/29 13:40:37 $
+ * @version $Revision: 1.2 $ $Date: 2003/01/15 21:45:23 $
  * 
  * @author <a href="mailto:jstrachan@apache.org">James Strachan</a>
  * @author Jan Sorensen
+ * @author Ralph Wagner
  */
 public class FilterIterator extends ProxyIterator {
     
@@ -150,13 +151,20 @@
     }
 
     /**
-     * Always throws UnsupportedOperationException as this class 
-     * does look-ahead with its internal iterator.
-     *
-     * @throws UnsupportedOperationException  always
+     * Removes from the underlying collection of the base iterator the last
+     * element returned by this iterator.
+     * This method can only be called,
+     * if <code>next()</code> was called, but not after
+     * <code>hasNext()</code>, because the <code>hasNext()</code> call
+     * changes the base iterator.
+     * @throws IllegalStateException if <code>hasNext()</code> has already
+     * been called.
      */
     public void remove() {
-        throw new UnsupportedOperationException();
+        if (nextObjectSet){
+            throw new IllegalStateException();
+        }
+        getIterator().remove();
     }
         

Index: TestFilterIterator.java
===================================================================
RCS file: /home/cvspublic/jakarta-commons/collections/src/test/org/apache/commons/collections/iterators/TestFilterIterator.java,v
retrieving revision 1.4
diff -u -r1.4 TestFilterIterator.java
--- TestFilterIterator.java	2002/12/13 12:03:06	1.4
+++ TestFilterIterator.java	2003/01/30 08:00:33
@@ -65,13 +65,17 @@
 
 import junit.framework.TestSuite;
 import junit.framework.Test;
+import java.util.ArrayList;
+import java.util.Arrays;
 import java.util.Iterator;
+import java.util.List;
 import java.util.NoSuchElementException;
 import org.apache.commons.collections.Predicate;
 
 /**
  *
  * @author  Jan Sorensen
+ * @author Ralph Wagner
  */
 public class TestFilterIterator extends TestIterator {
 
@@ -81,6 +85,7 @@
     }
 
     private String[] array;
+    private List list;
     private FilterIterator iterator;
     /**
      * Set up instance variables required by this test case.
@@ -121,7 +126,9 @@
      * @return 
      */
     public Iterator makeFullIterator() {
-        return makePassThroughFilter(new ArrayIterator(array));
+        array = new String[] { "a", "b", "c" };
+        list = new ArrayList(Arrays.asList(array));
+        return makePassThroughFilter(list.iterator());
     }
 
     public Object makeObject() {
@@ -129,7 +136,7 @@
     }
 
     public boolean supportsRemove() {
-        return false;
+        return true;
     }
 
 
@@ -184,10 +191,20 @@
             assertTrue(i == elements.length - 1 ? !iterator.hasNext() : iterator.hasNext());
         }
         verifyNoMoreElements();
+
+        // test removal
+        initIterator();
+        iterator.setPredicate(pred);
+        if (iterator.hasNext()){
+            Object last = iterator.next();
+            iterator.remove();
+            assertTrue("Base of FilterIterator still contains removed element.",
+                !list.contains(last));
+        }
     }
 
     private void initIterator() {
-        iterator = makePassThroughFilter(new ArrayIterator(array));
+        iterator = (FilterIterator) makeFullIterator();
     }
 
     /**

______________________________________________________________________________
Schon wieder Viren-Alarm? Bei WEB.DE FreeMail ist das kein Problem,
hier ist der Virencheck inklusive! http://freemail.web.de/features/?mc=021158


---------------------------------------------------------------------
To unsubscribe, e-mail: commons-dev-unsubscribe@jakarta.apache.org
For additional commands, e-mail: commons-dev-help@jakarta.apache.org