001: /*
002: * Copyright 2001-2004 The Apache Software Foundation
003: *
004: * Licensed under the Apache License, Version 2.0 (the "License");
005: * you may not use this file except in compliance with the License.
006: * You may obtain a copy of the License at
007: *
008: * http://www.apache.org/licenses/LICENSE-2.0
009: *
010: * Unless required by applicable law or agreed to in writing, software
011: * distributed under the License is distributed on an "AS IS" BASIS,
012: * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
013: * See the License for the specific language governing permissions and
014: * limitations under the License.
015: */
016: package org.apache.commons.collections.functors;
017:
018: import java.io.Serializable;
019:
020: import org.apache.commons.collections.Predicate;
021: import org.apache.commons.collections.Transformer;
022:
023: /**
024: * Predicate implementation that transforms the given object before invoking
025: * another <code>Predicate</code>.
026: *
027: * @since Commons Collections 3.1
028: * @version $Revision: 348444 $ $Date: 2005-11-23 14:06:56 +0000 (Wed, 23 Nov 2005) $
029: * @author Alban Peignier
030: * @author Stephen Colebourne
031: */
032: public final class TransformedPredicate implements Predicate,
033: PredicateDecorator, Serializable {
034:
035: /** Serial version UID */
036: private static final long serialVersionUID = -5596090919668315834L;
037:
038: /** The transformer to call */
039: private final Transformer iTransformer;
040: /** The predicate to call */
041: private final Predicate iPredicate;
042:
043: /**
044: * Factory to create the predicate.
045: *
046: * @param transformer the transformer to call
047: * @param predicate the predicate to call with the result of the transform
048: * @return the predicate
049: * @throws IllegalArgumentException if the transformer or the predicate is null
050: */
051: public static Predicate getInstance(Transformer transformer,
052: Predicate predicate) {
053: if (transformer == null) {
054: throw new IllegalArgumentException(
055: "The transformer to call must not be null");
056: }
057: if (predicate == null) {
058: throw new IllegalArgumentException(
059: "The predicate to call must not be null");
060: }
061: return new TransformedPredicate(transformer, predicate);
062: }
063:
064: /**
065: * Constructor that performs no validation.
066: * Use <code>getInstance</code> if you want that.
067: *
068: * @param transformer the transformer to use
069: * @param predicate the predicate to decorate
070: */
071: public TransformedPredicate(Transformer transformer,
072: Predicate predicate) {
073: iTransformer = transformer;
074: iPredicate = predicate;
075: }
076:
077: /**
078: * Evaluates the predicate returning the result of the decorated predicate
079: * once the input has been transformed
080: *
081: * @param object the input object which will be transformed
082: * @return true if decorated predicate returns true
083: */
084: public boolean evaluate(Object object) {
085: Object result = iTransformer.transform(object);
086: return iPredicate.evaluate(result);
087: }
088:
089: /**
090: * Gets the predicate being decorated.
091: *
092: * @return the predicate as the only element in an array
093: * @since Commons Collections 3.1
094: */
095: public Predicate[] getPredicates() {
096: return new Predicate[] { iPredicate };
097: }
098:
099: /**
100: * Gets the transformer in use.
101: *
102: * @return the transformer
103: */
104: public Transformer getTransformer() {
105: return iTransformer;
106: }
107:
108: }
|