Commons Collections developers,

In looking at the 3.1-dev source I see that some implementations of the Predicate objects have:
Predicate getPredicate()
or
Predicate[] getPredicates()
methods. This is a good thing for me, as I am developing a search interface and would like to be able to use predicates in the search/filter process, and be able to do a display of the predicate expression structure.


I observe that there are basic types of predicates. Ones which operate on Objects, ones that operate on a single (sub)Predicate and ones which operate on more than one Predicate. I propose that the single and multiple cases be tagged using an interface so that the appropriate getPredicate() or getPredicates() method can be found.

I have attached a patch and 2 new interfaces (WrapperPredicate.java and CompositePredicate.java) which provide the functionality I propose. WrapperPredicate declares Predicate getPredicate(). CompositePredicate declares Iterator predicates(), shielding the CompositePredicate from modification (the Iterator returned is Unmodifiable) that the Predicate[] getPredicates[] implementation would allow unless a defensive copy was made before the return took place.

If you have any questions or concerns about my implementation please let me know. This is my first patch on a Jakarta project, so I hope I have done everything correctly (cvs diff -u).

Thank you for your work and for providing such a useful library of collections to the community.

-Brian

Brian S. Lloyd-Newberry
Software Engineer
RBS, Inc
http://www.rbs2000.com
/*
 *  Copyright 2001-2004 The Apache Software Foundation
 *
 *  Licensed 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.functors;

import org.apache.commons.collections.Predicate;

/**
 * Defines a functor interface implemented by classes that perform a predicate
 * test on an object.
 * <p>
 * A <code>WrapperPredicate</code> extends the <code>Predicate</code> interface to 
support the notion that one <code>Predicate</code> can wrap another.
 *
 * Examples of <code>WrapperPredicates</code> include: not, nullisexception, 
nullisfalse, nullistrue.
 *
 * <p>
 * @since Commons Collections 3.1
 * @version $Revision:$ $Date:$
 * 
 * @author Brian S. Lloyd-Newberry
 */
public interface WrapperPredicate extends Predicate {

    /**
     * Retrieves the <code>Predicate</code> that this <code>Predicate</code> is 
wrapping.
     *
     * @return the <code>Predicate</code>.
     */
    public Predicate getPredicate( );
}
/*
 *  Copyright 2001-2004 The Apache Software Foundation
 *
 *  Licensed 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.functors;

import java.util.Iterator;

import org.apache.commons.collections.Predicate;

/**
 * Defines a functor interface implemented by classes that perform a predicate
 * test on an object.
 *
 * <p>
 * A <code>CompoundPredicate</code> extends the <code>Predicate</code> interface to 
support the notion that one <code>Predicate</code> can wrap a collection of other 
predicates.
 *
 * Examples of <code>CompoundPredicates</code> include: and, or, all, any, none.
 *
 * <p>
 * @since Commons Collections 3.1
 * @version $Revision:$ $Date:$
 * 
 * @author Brian S. Lloyd-Newberry
 */
public interface CompoundPredicate extends Predicate
{
    /**
     * Retrieves an <code>Iterator</code> over the <code>Predicates</code> that this 
<code>Predicate</code> contains.
     *
     * @return an <code>Iterator</code> over the <code>Predicates</code>.
     */
    public Iterator predicates( );
}
? java/org/apache/commons/collections/functors/CompoundPredicate.java
? java/org/apache/commons/collections/functors/WrapperPredicate.java
Index: java/org/apache/commons/collections/functors/AllPredicate.java
===================================================================
RCS file: 
/home/cvspublic/jakarta-commons/collections/src/java/org/apache/commons/collections/functors/AllPredicate.java,v
retrieving revision 1.4
diff -u -r1.4 AllPredicate.java
--- java/org/apache/commons/collections/functors/AllPredicate.java      13 Mar 2004 
17:17:03 -0000      1.4
+++ java/org/apache/commons/collections/functors/AllPredicate.java      14 May 2004 
17:36:58 -0000
@@ -17,8 +17,11 @@
 
 import java.io.Serializable;
 import java.util.Collection;
+import java.util.Iterator;
 
 import org.apache.commons.collections.Predicate;
+import org.apache.commons.collections.iterators.ObjectArrayIterator;
+import org.apache.commons.collections.iterators.UnmodifiableIterator;
 
 /**
  * Predicate implementation that returns true if all the predicates return true.
@@ -27,8 +30,9 @@
  * @version $Revision: 1.4 $ $Date: 2004/03/13 17:17:03 $
  *
  * @author Stephen Colebourne
+ * @author Brian S. Lloyd-Newberry
  */
-public final class AllPredicate implements Predicate, Serializable {
+public final class AllPredicate implements CompoundPredicate, Serializable {
 
     /** Serial version UID */
     static final long serialVersionUID = -3094696765038308799L;
@@ -97,4 +101,12 @@
         return iPredicates;
     }
 
+    /**
+     * <code>Iterator</code> over predicates. Not modifiable.
+     * @return an <code>Iterator</code> over the predicates.
+     * @since Commons Collection 3.1
+     */
+    public Iterator predicates() {
+        return UnmodifiableIterator.decorate(new ObjectArrayIterator(iPredicates));
+    }
 }
Index: java/org/apache/commons/collections/functors/AndPredicate.java
===================================================================
RCS file: 
/home/cvspublic/jakarta-commons/collections/src/java/org/apache/commons/collections/functors/AndPredicate.java,v
retrieving revision 1.4
diff -u -r1.4 AndPredicate.java
--- java/org/apache/commons/collections/functors/AndPredicate.java      13 Mar 2004 
17:17:03 -0000      1.4
+++ java/org/apache/commons/collections/functors/AndPredicate.java      14 May 2004 
17:36:58 -0000
@@ -16,8 +16,11 @@
 package org.apache.commons.collections.functors;
 
 import java.io.Serializable;
+import java.util.Iterator;
 
 import org.apache.commons.collections.Predicate;
+import org.apache.commons.collections.iterators.ObjectArrayIterator;
+import org.apache.commons.collections.iterators.UnmodifiableIterator;
 
 /**
  * Predicate implementation that returns true if both the predicates return true.
@@ -26,8 +29,9 @@
  * @version $Revision: 1.4 $ $Date: 2004/03/13 17:17:03 $
  *
  * @author Stephen Colebourne
+ * @author Brian S. Lloyd-Newberry
  */
-public final class AndPredicate implements Predicate, Serializable {
+public final class AndPredicate implements CompoundPredicate, Serializable {
 
     /** Serial version UID */
     static final long serialVersionUID = 4189014213763186912L;
@@ -90,4 +94,12 @@
         return iPredicate2;
     }
 
+    /**
+     * <code>Iterator</code> over predicates. Not modifiable.
+     * @return an <code>Iterator</code> over the predicates.
+     * @since Commons Collection 3.1
+     */
+    public Iterator predicates() {
+        return UnmodifiableIterator.decorate(new ObjectArrayIterator(new Object[] 
{iPredicate1, iPredicate2}));
+    }
 }
Index: java/org/apache/commons/collections/functors/AnyPredicate.java
===================================================================
RCS file: 
/home/cvspublic/jakarta-commons/collections/src/java/org/apache/commons/collections/functors/AnyPredicate.java,v
retrieving revision 1.4
diff -u -r1.4 AnyPredicate.java
--- java/org/apache/commons/collections/functors/AnyPredicate.java      13 Mar 2004 
17:17:03 -0000      1.4
+++ java/org/apache/commons/collections/functors/AnyPredicate.java      14 May 2004 
17:36:58 -0000
@@ -17,8 +17,11 @@
 
 import java.io.Serializable;
 import java.util.Collection;
+import java.util.Iterator;
 
 import org.apache.commons.collections.Predicate;
+import org.apache.commons.collections.iterators.ObjectArrayIterator;
+import org.apache.commons.collections.iterators.UnmodifiableIterator;
 
 /**
  * Predicate implementation that returns true if any of the predicates return true.
@@ -27,8 +30,9 @@
  * @version $Revision: 1.4 $ $Date: 2004/03/13 17:17:03 $
  *
  * @author Stephen Colebourne
+ * @author Brian S. Lloyd-Newberry
  */
-public final class AnyPredicate implements Predicate, Serializable {
+public final class AnyPredicate implements CompoundPredicate, Serializable {
 
     /** Serial version UID */
     static final long serialVersionUID = 7429999530934647542L;
@@ -97,4 +101,12 @@
         return iPredicates;
     }
 
+    /**
+     * <code>Iterator</code> over predicates. Not modifiable.
+     * @return an <code>Iterator</code> over the predicates.
+     * @since Commons Collection 3.1
+     */
+    public Iterator predicates() {
+        return UnmodifiableIterator.decorate(new ObjectArrayIterator(iPredicates));
+    }
 }
Index: java/org/apache/commons/collections/functors/NonePredicate.java
===================================================================
RCS file: 
/home/cvspublic/jakarta-commons/collections/src/java/org/apache/commons/collections/functors/NonePredicate.java,v
retrieving revision 1.4
diff -u -r1.4 NonePredicate.java
--- java/org/apache/commons/collections/functors/NonePredicate.java     13 Mar 2004 
17:17:03 -0000      1.4
+++ java/org/apache/commons/collections/functors/NonePredicate.java     14 May 2004 
17:36:58 -0000
@@ -17,8 +17,11 @@
 
 import java.io.Serializable;
 import java.util.Collection;
+import java.util.Iterator;
 
 import org.apache.commons.collections.Predicate;
+import org.apache.commons.collections.iterators.ObjectArrayIterator;
+import org.apache.commons.collections.iterators.UnmodifiableIterator;
 
 /**
  * Predicate implementation that returns true if none of the predicates return true.
@@ -27,8 +30,9 @@
  * @version $Revision: 1.4 $ $Date: 2004/03/13 17:17:03 $
  *
  * @author Stephen Colebourne
+ * @author Brian S. Lloyd-Newberry
  */
-public final class NonePredicate implements Predicate, Serializable {
+public final class NonePredicate implements CompoundPredicate, Serializable {
 
     /** Serial version UID */
     static final long serialVersionUID = 2007613066565892961L;
@@ -97,4 +101,12 @@
         return iPredicates;
     }
 
+    /**
+     * <code>Iterator</code> over predicates. Not modifiable.
+     * @return an <code>Iterator</code> over the predicates.
+     * @since Commons Collection 3.1
+     */
+    public Iterator predicates() {
+        return UnmodifiableIterator.decorate(new ObjectArrayIterator(iPredicates));
+    }
 }
Index: java/org/apache/commons/collections/functors/NotPredicate.java
===================================================================
RCS file: 
/home/cvspublic/jakarta-commons/collections/src/java/org/apache/commons/collections/functors/NotPredicate.java,v
retrieving revision 1.4
diff -u -r1.4 NotPredicate.java
--- java/org/apache/commons/collections/functors/NotPredicate.java      13 Mar 2004 
17:17:03 -0000      1.4
+++ java/org/apache/commons/collections/functors/NotPredicate.java      14 May 2004 
17:36:58 -0000
@@ -26,8 +26,9 @@
  * @version $Revision: 1.4 $ $Date: 2004/03/13 17:17:03 $
  *
  * @author Stephen Colebourne
+ * @author Brian S. Lloyd-Newberry
  */
-public final class NotPredicate implements Predicate, Serializable {
+public final class NotPredicate implements WrapperPredicate, Serializable {
 
     /** Serial version UID */
     static final long serialVersionUID = -2654603322338049674L;
Index: java/org/apache/commons/collections/functors/NullIsExceptionPredicate.java
===================================================================
RCS file: 
/home/cvspublic/jakarta-commons/collections/src/java/org/apache/commons/collections/functors/NullIsExceptionPredicate.java,v
retrieving revision 1.5
diff -u -r1.5 NullIsExceptionPredicate.java
--- java/org/apache/commons/collections/functors/NullIsExceptionPredicate.java  13 Mar 
2004 17:17:03 -0000      1.5
+++ java/org/apache/commons/collections/functors/NullIsExceptionPredicate.java  14 May 
2004 17:36:59 -0000
@@ -27,8 +27,9 @@
  * @version $Revision: 1.5 $ $Date: 2004/03/13 17:17:03 $
  *
  * @author Stephen Colebourne
+ * @author Brian S. Lloyd-Newberry
  */
-public final class NullIsExceptionPredicate implements Predicate, Serializable {
+public final class NullIsExceptionPredicate implements WrapperPredicate, Serializable 
{
 
     /** Serial version UID */
     static final long serialVersionUID = 3243449850504576071L;
Index: java/org/apache/commons/collections/functors/NullIsFalsePredicate.java
===================================================================
RCS file: 
/home/cvspublic/jakarta-commons/collections/src/java/org/apache/commons/collections/functors/NullIsFalsePredicate.java,v
retrieving revision 1.4
diff -u -r1.4 NullIsFalsePredicate.java
--- java/org/apache/commons/collections/functors/NullIsFalsePredicate.java      13 Mar 
2004 17:17:03 -0000      1.4
+++ java/org/apache/commons/collections/functors/NullIsFalsePredicate.java      14 May 
2004 17:36:59 -0000
@@ -26,8 +26,9 @@
  * @version $Revision: 1.4 $ $Date: 2004/03/13 17:17:03 $
  *
  * @author Stephen Colebourne
+ * @author Brian S. Lloyd-Newberry
  */
-public final class NullIsFalsePredicate implements Predicate, Serializable {
+public final class NullIsFalsePredicate implements WrapperPredicate, Serializable {
 
     /** Serial version UID */
     static final long serialVersionUID = -2997501534564735525L;
Index: java/org/apache/commons/collections/functors/NullIsTruePredicate.java
===================================================================
RCS file: 
/home/cvspublic/jakarta-commons/collections/src/java/org/apache/commons/collections/functors/NullIsTruePredicate.java,v
retrieving revision 1.4
diff -u -r1.4 NullIsTruePredicate.java
--- java/org/apache/commons/collections/functors/NullIsTruePredicate.java       13 Mar 
2004 17:17:03 -0000      1.4
+++ java/org/apache/commons/collections/functors/NullIsTruePredicate.java       14 May 
2004 17:36:59 -0000
@@ -27,7 +27,7 @@
  *
  * @author Stephen Colebourne
  */
-public final class NullIsTruePredicate implements Predicate, Serializable {
+public final class NullIsTruePredicate implements WrapperPredicate, Serializable {
 
     /** Serial version UID */
     static final long serialVersionUID = -7625133768987126273L;
Index: java/org/apache/commons/collections/functors/OnePredicate.java
===================================================================
RCS file: 
/home/cvspublic/jakarta-commons/collections/src/java/org/apache/commons/collections/functors/OnePredicate.java,v
retrieving revision 1.4
diff -u -r1.4 OnePredicate.java
--- java/org/apache/commons/collections/functors/OnePredicate.java      13 Mar 2004 
17:17:03 -0000      1.4
+++ java/org/apache/commons/collections/functors/OnePredicate.java      14 May 2004 
17:36:59 -0000
@@ -17,8 +17,11 @@
 
 import java.io.Serializable;
 import java.util.Collection;
+import java.util.Iterator;
 
 import org.apache.commons.collections.Predicate;
+import org.apache.commons.collections.iterators.ObjectArrayIterator;
+import org.apache.commons.collections.iterators.UnmodifiableIterator;
 
 /**
  * Predicate implementation that returns true if only one of the predicates return 
true.
@@ -27,8 +30,9 @@
  * @version $Revision: 1.4 $ $Date: 2004/03/13 17:17:03 $
  *
  * @author Stephen Colebourne
+ * @author Brian S. Lloyd-Newberry
  */
-public final class OnePredicate implements Predicate, Serializable {
+public final class OnePredicate implements CompoundPredicate, Serializable {
 
     /** Serial version UID */
     static final long serialVersionUID = -8125389089924745785L;
@@ -101,4 +105,12 @@
         return iPredicates;
     }
 
+    /**
+     * <code>Iterator</code> over predicates. Not modifiable.
+     * @return an <code>Iterator</code> over the predicates.
+     * @since Commons Collection 3.1
+     */
+    public Iterator predicates() {
+        return UnmodifiableIterator.decorate(new ObjectArrayIterator(iPredicates));
+    }
 }
Index: java/org/apache/commons/collections/functors/OrPredicate.java
===================================================================
RCS file: 
/home/cvspublic/jakarta-commons/collections/src/java/org/apache/commons/collections/functors/OrPredicate.java,v
retrieving revision 1.4
diff -u -r1.4 OrPredicate.java
--- java/org/apache/commons/collections/functors/OrPredicate.java       13 Mar 2004 
17:17:03 -0000      1.4
+++ java/org/apache/commons/collections/functors/OrPredicate.java       14 May 2004 
17:36:59 -0000
@@ -16,8 +16,11 @@
 package org.apache.commons.collections.functors;
 
 import java.io.Serializable;
+import java.util.Iterator;
 
 import org.apache.commons.collections.Predicate;
+import org.apache.commons.collections.iterators.ObjectArrayIterator;
+import org.apache.commons.collections.iterators.UnmodifiableIterator;
 
 /**
  * Predicate implementation that returns true if either of the predicates return true.
@@ -26,8 +29,9 @@
  * @version $Revision: 1.4 $ $Date: 2004/03/13 17:17:03 $
  *
  * @author Stephen Colebourne
+ * @author Brian S. Lloyd-Newberry
  */
-public final class OrPredicate implements Predicate, Serializable {
+public final class OrPredicate implements CompoundPredicate, Serializable {
 
     /** Serial version UID */
     static final long serialVersionUID = -8791518325735182855L;
@@ -90,4 +94,12 @@
         return iPredicate2;
     }
 
+    /**
+     * <code>Iterator</code> over predicates. Not modifiable.
+     * @return an <code>Iterator</code> over the predicates.
+     * @since Commons Collection 3.1
+     */
+    public Iterator predicates() {
+        return UnmodifiableIterator.decorate(new ObjectArrayIterator(new Object[] 
{iPredicate1, iPredicate2}));
+    }
 }
Index: java/org/apache/commons/collections/functors/TransformedPredicate.java
===================================================================
RCS file: 
/home/cvspublic/jakarta-commons/collections/src/java/org/apache/commons/collections/functors/TransformedPredicate.java,v
retrieving revision 1.2
diff -u -r1.2 TransformedPredicate.java
--- java/org/apache/commons/collections/functors/TransformedPredicate.java      13 Mar 
2004 17:15:17 -0000      1.2
+++ java/org/apache/commons/collections/functors/TransformedPredicate.java      14 May 
2004 17:36:59 -0000
@@ -29,7 +29,7 @@
  * @author Alban Peignier
  * @author Stephen Colebourne
  */
-public final class TransformedPredicate implements Predicate, Serializable {
+public final class TransformedPredicate implements WrapperPredicate, Serializable {
 
     /** Serial version UID */
     static final long serialVersionUID = -5596090919668315834L;
Index: test/org/apache/commons/collections/TestPredicateUtils.java
===================================================================
RCS file: 
/home/cvspublic/jakarta-commons/collections/src/test/org/apache/commons/collections/TestPredicateUtils.java,v
retrieving revision 1.8
diff -u -r1.8 TestPredicateUtils.java
--- test/org/apache/commons/collections/TestPredicateUtils.java 13 Mar 2004 16:34:46 
-0000      1.8
+++ test/org/apache/commons/collections/TestPredicateUtils.java 14 May 2004 17:37:00 
-0000
@@ -19,6 +19,7 @@
 import java.util.Collection;
 import java.util.Collections;
 import java.util.HashMap;
+import java.util.Iterator;
 import java.util.List;
 import java.util.Map;
 
@@ -27,6 +28,9 @@
 import junit.framework.TestSuite;
 import junit.textui.TestRunner;
 
+import org.apache.commons.collections.functors.CompoundPredicate;
+import org.apache.commons.collections.functors.WrapperPredicate;
+
 /**
  * Tests the org.apache.commons.collections.PredicateUtils class.
  * 
@@ -34,6 +38,7 @@
  * @version $Revision: 1.8 $ $Date: 2004/03/13 16:34:46 $
  *
  * @author Stephen Colebourne
+ * @author Brian S. Lloyd-Newberry
  */
 public class TestPredicateUtils extends junit.framework.TestCase {
 
@@ -175,6 +180,9 @@
         assertEquals(false, 
PredicateUtils.notPredicate(PredicateUtils.truePredicate()).evaluate(cObject));
         assertEquals(false, 
PredicateUtils.notPredicate(PredicateUtils.truePredicate()).evaluate(cString));
         assertEquals(false, 
PredicateUtils.notPredicate(PredicateUtils.truePredicate()).evaluate(cInteger));
+
+        Predicate true_predicate = PredicateUtils.truePredicate();
+        assertEquals(true_predicate, ((WrapperPredicate) 
PredicateUtils.notPredicate(true_predicate)).getPredicate());
     }
     
     public void testNotPredicateEx() {
@@ -194,6 +202,13 @@
         assertEquals(false, 
PredicateUtils.andPredicate(PredicateUtils.truePredicate(), 
PredicateUtils.falsePredicate()).evaluate(null));
         assertEquals(false, 
PredicateUtils.andPredicate(PredicateUtils.falsePredicate(), 
PredicateUtils.truePredicate()).evaluate(null));
         assertEquals(false, 
PredicateUtils.andPredicate(PredicateUtils.falsePredicate(), 
PredicateUtils.falsePredicate()).evaluate(null));
+        Predicate predicate_one = PredicateUtils.truePredicate();
+        Predicate predicate_two = PredicateUtils.falsePredicate();
+        Predicate and_predicate = 
PredicateUtils.andPredicate(predicate_one,predicate_two);
+        Iterator and_predicate_i = ((CompoundPredicate) and_predicate).predicates();
+        assertEquals(predicate_one, and_predicate_i.next());
+        assertEquals(predicate_two, and_predicate_i.next());
+        assertEquals(false, and_predicate_i.hasNext());
     }
 
     public void testAndPredicateEx() {
@@ -205,6 +220,21 @@
         fail();
     }
     
+    public void testAndPredicateEx2() {
+        Predicate predicate_one = PredicateUtils.truePredicate();
+        Predicate predicate_two = PredicateUtils.falsePredicate();
+        Predicate and_predicate = 
PredicateUtils.andPredicate(predicate_one,predicate_two);
+        Iterator and_predicate_i = ((CompoundPredicate) and_predicate).predicates();
+
+        try {
+            and_predicate_i.next( );
+            and_predicate_i.remove( );
+            fail("CompoundPredicate.predicates() should not return a modifiable 
Iterator." );
+        } catch(UnsupportedOperationException uoe) {
+        }
+
+    }
+
     // allPredicate
     //------------------------------------------------------------------
 
@@ -237,6 +267,19 @@
         coll.add(PredicateUtils.falsePredicate());
         coll.add(PredicateUtils.falsePredicate());
         assertEquals(false, PredicateUtils.allPredicate(coll).evaluate(null));
+        Predicate predicate_one = PredicateUtils.truePredicate();
+        Predicate predicate_two = PredicateUtils.falsePredicate();
+        Predicate predicate_three = PredicateUtils.truePredicate();
+        coll.clear();
+        coll.add(predicate_one);
+        coll.add(predicate_two);
+        coll.add(predicate_three);
+        Predicate all_predicate = PredicateUtils.allPredicate(coll);
+        Iterator all_predicate_i = ((CompoundPredicate) all_predicate).predicates();
+        assertEquals(predicate_one, all_predicate_i.next());
+        assertEquals(predicate_two, all_predicate_i.next());
+        assertEquals(predicate_three, all_predicate_i.next());
+        assertEquals(false, all_predicate_i.hasNext());
     }
 
     public void testAllPredicateEx1() {
@@ -295,6 +338,26 @@
         }
         fail();
     }
+
+
+    public void testAllPredicateEx7() {
+        Predicate predicate_one = PredicateUtils.truePredicate();
+        Predicate predicate_two = PredicateUtils.falsePredicate();
+        Collection coll = new ArrayList();
+        coll.add( predicate_one );
+        coll.add( predicate_two );
+        Predicate all_predicate = PredicateUtils.allPredicate(coll);
+        Iterator all_predicate_i = ((CompoundPredicate) all_predicate).predicates();
+
+        try {
+            all_predicate_i.next( );
+            all_predicate_i.remove( );
+            fail("CompoundPredicate.predicates() should not return a modifiable 
Iterator." );
+        } catch(UnsupportedOperationException uoe) {
+        }
+
+    }
+
     
     // orPredicate
     //------------------------------------------------------------------
@@ -304,6 +367,13 @@
         assertEquals(true, PredicateUtils.orPredicate(PredicateUtils.truePredicate(), 
PredicateUtils.falsePredicate()).evaluate(null));
         assertEquals(true, 
PredicateUtils.orPredicate(PredicateUtils.falsePredicate(), 
PredicateUtils.truePredicate()).evaluate(null));
         assertEquals(false, 
PredicateUtils.orPredicate(PredicateUtils.falsePredicate(), 
PredicateUtils.falsePredicate()).evaluate(null));
+        Predicate predicate_one = PredicateUtils.truePredicate();
+        Predicate predicate_two = PredicateUtils.falsePredicate();
+        Predicate or_predicate = 
PredicateUtils.orPredicate(predicate_one,predicate_two);
+        Iterator or_predicate_i = ((CompoundPredicate) or_predicate).predicates();
+        assertEquals(predicate_one, or_predicate_i.next());
+        assertEquals(predicate_two, or_predicate_i.next());
+        assertEquals(false, or_predicate_i.hasNext());
     }
     
     public void testOrPredicateEx() {
@@ -314,6 +384,22 @@
         }
         fail();
     }
+
+    public void testOrPredicateEx2() {
+        Predicate predicate_one = PredicateUtils.truePredicate();
+        Predicate predicate_two = PredicateUtils.falsePredicate();
+        Predicate or_predicate = 
PredicateUtils.orPredicate(predicate_one,predicate_two);
+        Iterator or_predicate_i = ((CompoundPredicate) or_predicate).predicates();
+
+        try {
+            or_predicate_i.next( );
+            or_predicate_i.remove( );
+            fail("CompoundPredicate.predicates() should not return a modifiable 
Iterator." );
+        } catch(UnsupportedOperationException uoe) {
+        }
+
+    }
+
     
     // anyPredicate
     //------------------------------------------------------------------
@@ -347,6 +433,19 @@
         coll.add(PredicateUtils.falsePredicate());
         coll.add(PredicateUtils.falsePredicate());
         assertEquals(false, PredicateUtils.anyPredicate(coll).evaluate(null));
+        Predicate predicate_one = PredicateUtils.truePredicate();
+        Predicate predicate_two = PredicateUtils.falsePredicate();
+        Predicate predicate_three = PredicateUtils.truePredicate();
+        coll.clear();
+        coll.add(predicate_one);
+        coll.add(predicate_two);
+        coll.add(predicate_three);
+        Predicate any_predicate = PredicateUtils.anyPredicate(coll);
+        Iterator any_predicate_i = ((CompoundPredicate) any_predicate).predicates();
+        assertEquals(predicate_one, any_predicate_i.next());
+        assertEquals(predicate_two, any_predicate_i.next());
+        assertEquals(predicate_three, any_predicate_i.next());
+        assertEquals(false, any_predicate_i.hasNext());
     }
 
     public void testAnyPredicateEx1() {
@@ -405,7 +504,26 @@
         }
         fail();
     }
-    
+
+    public void testAnyPredicateEx7() {
+        Predicate predicate_one = PredicateUtils.truePredicate();
+        Predicate predicate_two = PredicateUtils.falsePredicate();
+        Collection coll = new ArrayList();
+        coll.add( predicate_one );
+        coll.add( predicate_two );
+        Predicate any_predicate = PredicateUtils.anyPredicate(coll);
+        Iterator any_predicate_i = ((CompoundPredicate) any_predicate).predicates();
+
+        try {
+            any_predicate_i.next( );
+            any_predicate_i.remove( );
+            fail("CompoundPredicate.predicates() should not return a modifiable 
Iterator." );
+        } catch(UnsupportedOperationException uoe) {
+        }
+
+    }
+
+
     // eitherPredicate
     //------------------------------------------------------------------
 
@@ -414,6 +532,13 @@
         assertEquals(true, 
PredicateUtils.eitherPredicate(PredicateUtils.truePredicate(), 
PredicateUtils.falsePredicate()).evaluate(null));
         assertEquals(true, 
PredicateUtils.eitherPredicate(PredicateUtils.falsePredicate(), 
PredicateUtils.truePredicate()).evaluate(null));
         assertEquals(false, 
PredicateUtils.eitherPredicate(PredicateUtils.falsePredicate(), 
PredicateUtils.falsePredicate()).evaluate(null));
+        Predicate predicate_one = PredicateUtils.truePredicate();
+        Predicate predicate_two = PredicateUtils.falsePredicate();
+        Predicate either_predicate = 
PredicateUtils.eitherPredicate(predicate_one,predicate_two);
+        Iterator either_predicate_i = ((CompoundPredicate) 
either_predicate).predicates();
+        assertEquals(predicate_one, either_predicate_i.next());
+        assertEquals(predicate_two, either_predicate_i.next());
+        assertEquals(false, either_predicate_i.hasNext());
     }
 
     public void testEitherPredicateEx() {
@@ -425,6 +550,22 @@
         fail();
     }
     
+    public void testEitherPredicateEx2() {
+        Predicate predicate_one = PredicateUtils.truePredicate();
+        Predicate predicate_two = PredicateUtils.falsePredicate();
+        Predicate either_predicate = 
PredicateUtils.eitherPredicate(predicate_one,predicate_two);
+        Iterator either_predicate_i = ((CompoundPredicate) 
either_predicate).predicates();
+
+        try {
+            either_predicate_i.next( );
+            either_predicate_i.remove( );
+            fail("CompoundPredicate.predicates() should not return a modifiable 
Iterator." );
+        } catch(UnsupportedOperationException uoe) {
+        }
+
+    }
+
+
     // onePredicate
     //------------------------------------------------------------------
 
@@ -461,6 +602,19 @@
         coll.add(PredicateUtils.falsePredicate());
         coll.add(PredicateUtils.falsePredicate());
         assertEquals(false, PredicateUtils.onePredicate(coll).evaluate(null));
+        Predicate predicate_one = PredicateUtils.truePredicate();
+        Predicate predicate_two = PredicateUtils.falsePredicate();
+        Predicate predicate_three = PredicateUtils.truePredicate();
+        coll.clear();
+        coll.add(predicate_one);
+        coll.add(predicate_two);
+        coll.add(predicate_three);
+        Predicate one_predicate = PredicateUtils.onePredicate(coll);
+        Iterator one_predicate_i = ((CompoundPredicate) one_predicate).predicates();
+        assertEquals(predicate_one, one_predicate_i.next());
+        assertEquals(predicate_two, one_predicate_i.next());
+        assertEquals(predicate_three, one_predicate_i.next());
+        assertEquals(false, one_predicate_i.hasNext());
     }
 
     public void testOnePredicateEx1() {
@@ -519,6 +673,25 @@
         }
         fail();
     }
+
+    public void testOnePredicateEx7() {
+        Predicate predicate_one = PredicateUtils.truePredicate();
+        Predicate predicate_two = PredicateUtils.falsePredicate();
+        Collection coll = new ArrayList();
+        coll.add( predicate_one );
+        coll.add( predicate_two );
+        Predicate one_predicate = PredicateUtils.onePredicate(coll);
+        Iterator one_predicate_i = ((CompoundPredicate) one_predicate).predicates();
+
+        try {
+            one_predicate_i.next( );
+            one_predicate_i.remove( );
+            fail("CompoundPredicate.predicates() should not return a modifiable 
Iterator." );
+        } catch(UnsupportedOperationException uoe) {
+        }
+
+    }
+
     
     // neitherPredicate
     //------------------------------------------------------------------
@@ -528,6 +701,13 @@
         assertEquals(false, 
PredicateUtils.neitherPredicate(PredicateUtils.truePredicate(), 
PredicateUtils.falsePredicate()).evaluate(null));
         assertEquals(false, 
PredicateUtils.neitherPredicate(PredicateUtils.falsePredicate(), 
PredicateUtils.truePredicate()).evaluate(null));
         assertEquals(true, 
PredicateUtils.neitherPredicate(PredicateUtils.falsePredicate(), 
PredicateUtils.falsePredicate()).evaluate(null));
+        Predicate predicate_one = PredicateUtils.truePredicate();
+        Predicate predicate_two = PredicateUtils.falsePredicate();
+        Predicate neither_predicate = 
PredicateUtils.neitherPredicate(predicate_one,predicate_two);
+        Iterator neither_predicate_i = ((CompoundPredicate) 
neither_predicate).predicates();
+        assertEquals(predicate_one, neither_predicate_i.next());
+        assertEquals(predicate_two, neither_predicate_i.next());
+        assertEquals(false, neither_predicate_i.hasNext());
     }
 
     public void testNeitherPredicateEx() {
@@ -538,6 +718,22 @@
         }
         fail();
     }
+
+    public void testNeitherPredicateEx2() {
+        Predicate predicate_one = PredicateUtils.truePredicate();
+        Predicate predicate_two = PredicateUtils.falsePredicate();
+        Predicate neither_predicate = 
PredicateUtils.neitherPredicate(predicate_one,predicate_two);
+        Iterator neither_predicate_i = ((CompoundPredicate) 
neither_predicate).predicates();
+
+        try {
+            neither_predicate_i.next( );
+            neither_predicate_i.remove( );
+            fail("CompoundPredicate.predicates() should not return a modifiable 
Iterator." );
+        } catch(UnsupportedOperationException uoe) {
+        }
+
+    }
+
     
     // nonePredicate
     //------------------------------------------------------------------
@@ -571,6 +767,19 @@
         coll.add(PredicateUtils.falsePredicate());
         coll.add(PredicateUtils.falsePredicate());
         assertEquals(true, PredicateUtils.nonePredicate(coll).evaluate(null));
+        Predicate predicate_one = PredicateUtils.truePredicate();
+        Predicate predicate_two = PredicateUtils.falsePredicate();
+        Predicate predicate_three = PredicateUtils.truePredicate();
+        coll.clear();
+        coll.add(predicate_one);
+        coll.add(predicate_two);
+        coll.add(predicate_three);
+        Predicate none_predicate = PredicateUtils.nonePredicate(coll);
+        Iterator none_predicate_i = ((CompoundPredicate) none_predicate).predicates();
+        assertEquals(predicate_one, none_predicate_i.next());
+        assertEquals(predicate_two, none_predicate_i.next());
+        assertEquals(predicate_three, none_predicate_i.next());
+        assertEquals(false, none_predicate_i.hasNext());
     }
 
     public void testNonePredicateEx1() {
@@ -629,6 +838,25 @@
         }
         fail();
     }
+
+    public void testNonePredicateEx7() {
+        Predicate predicate_one = PredicateUtils.truePredicate();
+        Predicate predicate_two = PredicateUtils.falsePredicate();
+        Collection coll = new ArrayList();
+        coll.add( predicate_one );
+        coll.add( predicate_two );
+        Predicate none_predicate = PredicateUtils.nonePredicate(coll);
+        Iterator none_predicate_i = ((CompoundPredicate) none_predicate).predicates();
+
+        try {
+            none_predicate_i.next( );
+            none_predicate_i.remove( );
+            fail("CompoundPredicate.predicates() should not return a modifiable 
Iterator." );
+        } catch(UnsupportedOperationException uoe) {
+        }
+
+    }
+
     
     // instanceofPredicate
     //------------------------------------------------------------------
@@ -762,6 +990,9 @@
 
     public void testNullIsExceptionPredicate() {
         assertEquals(true, 
PredicateUtils.nullIsExceptionPredicate(PredicateUtils.truePredicate()).evaluate(new 
Object()));
+        Predicate true_predicate = PredicateUtils.truePredicate();
+        assertEquals(true_predicate, ((WrapperPredicate) 
PredicateUtils.nullIsExceptionPredicate(true_predicate)).getPredicate());
+
         try {
             
PredicateUtils.nullIsExceptionPredicate(PredicateUtils.truePredicate()).evaluate(null);
         } catch (FunctorException ex) {
@@ -786,6 +1017,9 @@
         assertEquals(true, 
PredicateUtils.nullIsTruePredicate(PredicateUtils.truePredicate()).evaluate(null));
         assertEquals(true, 
PredicateUtils.nullIsTruePredicate(PredicateUtils.truePredicate()).evaluate(new 
Object()));
         assertEquals(false, 
PredicateUtils.nullIsTruePredicate(PredicateUtils.falsePredicate()).evaluate(new 
Object()));
+        Predicate true_predicate = PredicateUtils.truePredicate();
+        assertEquals(true_predicate, ((WrapperPredicate) 
PredicateUtils.nullIsTruePredicate(true_predicate)).getPredicate());
+
     }
 
     public void testNullIsTruePredicateEx1() {
@@ -804,6 +1038,9 @@
         assertEquals(false, 
PredicateUtils.nullIsFalsePredicate(PredicateUtils.truePredicate()).evaluate(null));
         assertEquals(true, 
PredicateUtils.nullIsFalsePredicate(PredicateUtils.truePredicate()).evaluate(new 
Object()));
         assertEquals(false, 
PredicateUtils.nullIsFalsePredicate(PredicateUtils.falsePredicate()).evaluate(new 
Object()));
+        Predicate true_predicate = PredicateUtils.truePredicate();
+        assertEquals(true_predicate, ((WrapperPredicate) 
PredicateUtils.nullIsFalsePredicate(true_predicate)).getPredicate());
+
     }
 
     public void testNullIsFalsePredicateEx1() {
@@ -833,6 +1070,10 @@
             PredicateUtils.transformedPredicate(null, null);
             fail();
         } catch (IllegalArgumentException ex) {}
+
+        Predicate transformed_predicate = PredicateUtils.transformedPredicate(t, p);
+        assertEquals(p, ((WrapperPredicate) transformed_predicate).getPredicate());
+
     }
 
 }

---------------------------------------------------------------------
To unsubscribe, e-mail: [EMAIL PROTECTED]
For additional commands, e-mail: [EMAIL PROTECTED]

Reply via email to