Index: src/test/org/apache/commons/collections/TestCollectionUtils.java
===================================================================
--- src/test/org/apache/commons/collections/TestCollectionUtils.java	(revision 657732)
+++ src/test/org/apache/commons/collections/TestCollectionUtils.java	(working copy)
@@ -52,6 +52,7 @@
  * @author Steven Melzer
  * @author Neil O'Toole
  * @author Stephen Smith
+ * @author Dusan Chromy
  * 
  * @version $Revision$ $Date$
  */
@@ -128,6 +129,20 @@
         assertEquals(2, CollectionUtils.cardinality("d", collectionB));
         assertEquals(1, CollectionUtils.cardinality("e", collectionB));
 
+        assertEquals(1, CollectionUtils.cardinality("a", collectionA.iterator()));
+        assertEquals(2, CollectionUtils.cardinality("b", collectionA.iterator()));
+        assertEquals(3, CollectionUtils.cardinality("c", collectionA.iterator()));
+        assertEquals(4, CollectionUtils.cardinality("d", collectionA.iterator()));
+        assertEquals(0, CollectionUtils.cardinality("e", collectionA.iterator()));
+        assertEquals(0, CollectionUtils.cardinality("a", (Collection)null));
+        
+        assertEquals(0, CollectionUtils.cardinality("a", collectionB.iterator()));
+        assertEquals(4, CollectionUtils.cardinality("b", collectionB.iterator()));
+        assertEquals(3, CollectionUtils.cardinality("c", collectionB.iterator()));
+        assertEquals(2, CollectionUtils.cardinality("d", collectionB.iterator()));
+        assertEquals(1, CollectionUtils.cardinality("e", collectionB.iterator()));
+        assertEquals(0, CollectionUtils.cardinality("a", (Iterator)null));
+        
         Set set = new HashSet();
         set.add("A");
         set.add("C");
@@ -154,42 +169,49 @@
     public void testCardinalityOfNull() {
         List list = new ArrayList();
         assertEquals(0,CollectionUtils.cardinality(null,list));
+        assertEquals(0,CollectionUtils.cardinality(null,list.iterator()));
         {
             Map freq = CollectionUtils.getCardinalityMap(list);
             assertNull(freq.get(null));
         }
         list.add("A");
         assertEquals(0,CollectionUtils.cardinality(null,list));
+        assertEquals(0,CollectionUtils.cardinality(null,list.iterator()));
         {
             Map freq = CollectionUtils.getCardinalityMap(list);
             assertNull(freq.get(null));
         }
         list.add(null);
         assertEquals(1,CollectionUtils.cardinality(null,list));
+        assertEquals(1,CollectionUtils.cardinality(null,list.iterator()));
         {
             Map freq = CollectionUtils.getCardinalityMap(list);
             assertEquals(new Integer(1),freq.get(null));
         }
         list.add("B");
         assertEquals(1,CollectionUtils.cardinality(null,list));
+        assertEquals(1,CollectionUtils.cardinality(null,list.iterator()));
         {
             Map freq = CollectionUtils.getCardinalityMap(list);
             assertEquals(new Integer(1),freq.get(null));
         }
         list.add(null);
         assertEquals(2,CollectionUtils.cardinality(null,list));
+        assertEquals(2,CollectionUtils.cardinality(null,list.iterator()));
         {
             Map freq = CollectionUtils.getCardinalityMap(list);
             assertEquals(new Integer(2),freq.get(null));
         }
         list.add("B");
         assertEquals(2,CollectionUtils.cardinality(null,list));
+        assertEquals(2,CollectionUtils.cardinality(null,list.iterator()));
         {
             Map freq = CollectionUtils.getCardinalityMap(list);
             assertEquals(new Integer(2),freq.get(null));
         }
         list.add(null);
         assertEquals(3,CollectionUtils.cardinality(null,list));
+        assertEquals(3,CollectionUtils.cardinality(null,list.iterator()));
         {
             Map freq = CollectionUtils.getCardinalityMap(list);
             assertEquals(new Integer(3),freq.get(null));
@@ -435,11 +457,17 @@
         Predicate testPredicate = PredicateUtils.equalPredicate("d");
         Object test = CollectionUtils.find(collectionA, testPredicate);
         assertTrue(test.equals("d"));
+
+        test = CollectionUtils.find(collectionA.iterator(), testPredicate);
+        assertTrue(test.equals("d"));
         testPredicate = PredicateUtils.equalPredicate("de");
-        test = CollectionUtils.find(collectionA, testPredicate);
-        assertTrue(test == null);
-        assertNull(CollectionUtils.find(null,testPredicate));
+
+        assertNull(CollectionUtils.find(collectionA, testPredicate));
+        assertNull(CollectionUtils.find(collectionA.iterator(), testPredicate));
+        assertNull(CollectionUtils.find( (Collection)null,testPredicate));
+        assertNull(CollectionUtils.find( (Iterator)null,testPredicate));
         assertNull(CollectionUtils.find(collectionA, null));
+        assertNull(CollectionUtils.find(collectionA.iterator(), null));
     }
     
     public void testForAllDo() {
@@ -451,7 +479,7 @@
         assertTrue(collectionA.isEmpty() && collectionB.isEmpty());
         CollectionUtils.forAllDo(col, null);
         assertTrue(collectionA.isEmpty() && collectionB.isEmpty());
-        CollectionUtils.forAllDo(null, testClosure);
+        CollectionUtils.forAllDo((Collection)null, testClosure);
         col.add(null);
         // null should be OK
         CollectionUtils.forAllDo(col, testClosure);
@@ -465,6 +493,29 @@
         }
     }
 
+    public void testForAllDoWithIterator() {
+        Closure testClosure = ClosureUtils.invokerClosure("clear");
+        Collection col = new ArrayList();
+        col.add(collectionA);
+        col.add(collectionB);
+        CollectionUtils.forAllDo(col.iterator(), testClosure);
+        assertTrue(collectionA.isEmpty() && collectionB.isEmpty());
+        CollectionUtils.forAllDo(col.iterator(), null);
+        assertTrue(collectionA.isEmpty() && collectionB.isEmpty());
+        CollectionUtils.forAllDo((Iterator)null, testClosure);
+        col.add(null);
+        // null should be OK
+        CollectionUtils.forAllDo(col.iterator(), testClosure);
+        col.add("x");
+        // This will lead to FunctorException
+        try {
+            CollectionUtils.forAllDo(col.iterator(), testClosure);
+            fail("Expecting FunctorException");
+        } catch (FunctorException ex) {
+            // expected from invoker -- method not found
+        }
+    }
+    
     public void testIndex() {     
         // normal map behavior when index is an Integer and a key
         Map map = new HashMap();
@@ -937,15 +988,21 @@
         assertEquals(4, list.size());
         assertEquals(1, count);
         assertEquals(0, CollectionUtils.countMatches(list, null));
-        assertEquals(0, CollectionUtils.countMatches(null, EQUALS_TWO));
-        assertEquals(0, CollectionUtils.countMatches(null, null));
+        assertEquals(0, CollectionUtils.countMatches((Collection)null, EQUALS_TWO));
+        assertEquals(0, CollectionUtils.countMatches((Collection)null, null));
+        count = CollectionUtils.countMatches(list.iterator(), EQUALS_TWO);
+        assertEquals(4, list.size());
+        assertEquals(1, count);
+        assertEquals(0, CollectionUtils.countMatches(list.iterator(), null));
+        assertEquals(0, CollectionUtils.countMatches((Iterator)null, EQUALS_TWO));
+        assertEquals(0, CollectionUtils.countMatches((Iterator)null, null));
     }
 
     public void testExists() {
         List list = new ArrayList();
-        assertEquals(false, CollectionUtils.exists(null, null));
+        assertEquals(false, CollectionUtils.exists( (Collection) null, null));
         assertEquals(false, CollectionUtils.exists(list, null));
-        assertEquals(false, CollectionUtils.exists(null, EQUALS_TWO));
+        assertEquals(false, CollectionUtils.exists( (Collection) null, EQUALS_TWO));
         assertEquals(false, CollectionUtils.exists(list, EQUALS_TWO));
         list.add("One");
         list.add("Three");
@@ -954,6 +1011,19 @@
 
         list.add("Two");
         assertEquals(true, CollectionUtils.exists(list, EQUALS_TWO));
+        
+        list.clear();
+        assertEquals(false, CollectionUtils.exists((Iterator)null, null));
+        assertEquals(false, CollectionUtils.exists(list.iterator(), null));
+        assertEquals(false, CollectionUtils.exists((Iterator)null, EQUALS_TWO));
+        assertEquals(false, CollectionUtils.exists(list.iterator(), EQUALS_TWO));
+        list.add("One");
+        list.add("Three");
+        list.add("Four");
+        assertEquals(false, CollectionUtils.exists(list.iterator(), EQUALS_TWO));
+
+        list.add("Two");
+        assertEquals(true, CollectionUtils.exists(list.iterator(), EQUALS_TWO));
     }
     
     public void testSelect() {
Index: src/java/org/apache/commons/collections/CollectionUtils.java
===================================================================
--- src/java/org/apache/commons/collections/CollectionUtils.java	(revision 657732)
+++ src/java/org/apache/commons/collections/CollectionUtils.java	(working copy)
@@ -326,10 +326,13 @@
      * Returns the number of occurrences of <i>obj</i> in <i>coll</i>.
      *
      * @param obj  the object to find the cardinality of
-     * @param coll  the collection to search
+     * @param coll  the collection to search, may be null
      * @return the the number of occurrences of obj in coll
      */
     public static int cardinality(Object obj, final Collection coll) {
+      	if (coll == null) {
+            return 0;
+        }
         if (coll instanceof Set) {
             return (coll.contains(obj) ? 1 : 0);
         }
@@ -353,6 +356,32 @@
         return count;
     }
 
+    /**
+     * Returns the number of occurrences of <i>obj</i> in elements from the <i>iterator</i>.
+     *
+     * @param obj  the object to find the cardinality of
+     * @param iterator  the iterator to use, may be null
+     * @return the the number of occurrences of obj in iterator
+     */    
+    public static int cardinality(Object obj, final Iterator iterator) {
+    	if (iterator == null) return 0;
+    	int count = 0;
+    	if (obj == null) {
+    		while (iterator.hasNext()) {
+    			if (iterator.next() == null) {
+    				++count;
+    			}
+    		}    		
+    	} else {
+    		while (iterator.hasNext()) {
+    			if (obj.equals(iterator.next())) {
+    				++count;
+    			}
+    		}
+    	}
+    	return count;
+    }
+    
     /** 
      * Finds the first element in the given collection which matches the given predicate.
      * <p>
@@ -374,6 +403,28 @@
         }
         return null;
     }
+
+    /** 
+     * Finds the first element in the elements of the given iterator which matches the given predicate.
+     * <p>
+     * If the input iterator or predicate is null, or no element of the collection 
+     * matches the predicate, null is returned.
+     *
+     * @param iterator  the iterator to use, may be null
+     * @param predicate  the predicate to use, may be null
+     * @return the first element of the collection which matches the predicate or null if none could be found
+     */
+    public static Object find(Iterator iterator, Predicate predicate) {
+        if (iterator != null && predicate != null) {
+            while (iterator.hasNext()) {
+                Object item = iterator.next();
+                if (predicate.evaluate(item)) {
+                    return item;
+                }
+            }
+        }
+        return null;
+    }
     
     /** 
      * Executes the given closure on each element in the collection.
@@ -392,6 +443,22 @@
     }
 
     /** 
+     * Executes the given closure on each element from the iterator.
+     * <p>
+     * If the input iterator or closure is null, there is no change made.
+     * 
+     * @param iterator  the iterator to get the input from, may be null
+     * @param closure  the closure to perform, may be null
+     */
+    public static void forAllDo(Iterator iterator, Closure closure) {
+        if (iterator != null && closure != null) {
+            while (iterator.hasNext()) {
+                closure.execute(iterator.next());
+            }
+        }
+    }
+        
+    /** 
      * Filter the collection by applying a Predicate to each element. If the
      * predicate returns false, remove the element.
      * <p>
@@ -463,6 +530,27 @@
     }
 
     /** 
+     * Counts the number of elements from the input iterator that match the predicate.
+     * <p>
+     * A <code>null</code> iterator or predicate matches no elements.
+     * 
+     * @param iterator  the iterator to get the input from, may be null
+     * @param predicate  the predicate to use, may be null
+     * @return the number of matches for the predicate in the iterator
+     */
+    public static int countMatches(Iterator iterator, Predicate predicate) {
+        int count = 0;
+        if (iterator != null && predicate != null) {
+            while (iterator.hasNext()) {
+                if (predicate.evaluate(iterator.next())) {
+                    ++count;
+                }
+            }
+        }
+        return count;
+    }
+
+    /** 
      * Answers true if a predicate is true for at least one element of a collection.
      * <p>
      * A <code>null</code> collection or predicate returns false.
@@ -483,6 +571,26 @@
     }
 
     /** 
+     * Answers true if a predicate is true for at least one element from an iterator.
+     * <p>
+     * A <code>null</code> iterator or predicate returns false.
+     * 
+     * @param iterator the iterator to get the input from, may be null
+     * @param predicate the predicate to use, may be null
+     * @return true if at least one element from the iterator matches the predicate
+     */
+    public static boolean exists(Iterator iterator, Predicate predicate) {
+        if (iterator != null && predicate != null) {
+            while (iterator.hasNext()) {
+                if (predicate.evaluate(iterator.next())) {
+                    return true;
+                }
+            }
+        }
+        return false;
+    }
+         
+    /** 
      * Selects all elements from input collection which match the given predicate
      * into an output collection.
      * <p>
