001    /*
002     * Licensed to the Apache Software Foundation (ASF) under one or more
003     * contributor license agreements.  See the NOTICE file distributed with
004     * this work for additional information regarding copyright ownership.
005     * The ASF licenses this file to You under the Apache License, Version 2.0
006     * (the "License"); you may not use this file except in compliance with
007     * the License.  You may obtain a copy of the License at
008     *
009     *      http://www.apache.org/licenses/LICENSE-2.0
010     *
011     * Unless required by applicable law or agreed to in writing, software
012     * distributed under the License is distributed on an "AS IS" BASIS,
013     * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
014     * See the License for the specific language governing permissions and
015     * limitations under the License.
016     */
017    package org.apache.commons.functor.adapter;
018    
019    import java.io.Serializable;
020    
021    import org.apache.commons.functor.UnaryFunction;
022    import org.apache.commons.functor.UnaryPredicate;
023    
024    /**
025     * Adapts a
026     * {@link UnaryPredicate UnaryPredicate}
027     * to the
028     * {@link UnaryFunction UnaryFunction} interface.
029     * <p/>
030     * Note that although this class implements
031     * {@link Serializable}, a given instance will
032     * only be truly <code>Serializable</code> if the
033     * underlying predicate is.  Attempts to serialize
034     * an instance whose delegate is not
035     * <code>Serializable</code> will result in an exception.
036     *
037     * @param <A> the argument type.
038     * @version $Revision: 1157655 $ $Date: 2011-08-14 22:25:24 +0200 (Sun, 14 Aug 2011) $
039     * @author Rodney Waldhoff
040     */
041    public final class UnaryPredicateUnaryFunction<A> implements UnaryFunction<A, Boolean>, Serializable {
042        /**
043         * serialVersionUID declaration.
044         */
045        private static final long serialVersionUID = 5660724725036398625L;
046        /** The {@link UnaryPredicate UnaryPredicate} I'm wrapping. */
047        private final UnaryPredicate<? super A> predicate;
048    
049        /**
050         * Create a new UnaryPredicateUnaryFunction.
051         * @param predicate to adapt
052         */
053        public UnaryPredicateUnaryFunction(UnaryPredicate<? super A> predicate) {
054            if (predicate == null) {
055                throw new IllegalArgumentException("UnaryPredicate argument was null");
056            }
057            this.predicate = predicate;
058        }
059    
060        /**
061         * {@inheritDoc}
062         * Returns <code>Boolean.TRUE</code> (<code>Boolean.FALSE</code>)
063         * when the {@link UnaryPredicate#test test} method of my underlying
064         * predicate returns <code>true</code> (<code>false</code>).
065         *
066         * @return a non-<code>null</code> <code>Boolean</code> instance
067         */
068        public Boolean evaluate(A obj) {
069            return predicate.test(obj);
070        }
071    
072        /**
073         * {@inheritDoc}
074         */
075        public boolean equals(Object that) {
076            return that == this
077                    || (that instanceof UnaryPredicateUnaryFunction<?> && equals((UnaryPredicateUnaryFunction<?>) that));
078        }
079    
080        /**
081         * Learn whether another UnaryPredicateUnaryFunction is equal to this.
082         * @param that UnaryPredicateUnaryFunction to test
083         * @return boolean
084         */
085        public boolean equals(UnaryPredicateUnaryFunction<?> that) {
086            return null != that && (null == predicate ? null == that.predicate : predicate.equals(that.predicate));
087        }
088    
089        /**
090         * {@inheritDoc}
091         */
092        public int hashCode() {
093            int hash = "UnaryPredicateUnaryFunction".hashCode();
094            if (null != predicate) {
095                hash ^= predicate.hashCode();
096            }
097            return hash;
098        }
099    
100        /**
101         * {@inheritDoc}
102         */
103        public String toString() {
104            return "UnaryPredicateUnaryFunction<" + predicate + ">";
105        }
106    
107        /**
108         * Adapt a UnaryPredicate to the UnaryFunction interface.
109         * @param <A> the argument type.
110         * @param predicate to adapt
111         * @return UnaryPredicateUnaryFunction
112         */
113        public static <A> UnaryPredicateUnaryFunction<A> adapt(UnaryPredicate<? super A> predicate) {
114            return null == predicate ? null : new UnaryPredicateUnaryFunction<A>(predicate);
115        }
116    
117    }