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 */
017package org.apache.commons.collections4.functors;
018
019import java.io.Serializable;
020
021import org.apache.commons.collections4.Predicate;
022
023/**
024 * Predicate implementation that returns true if either of the predicates return true.
025 *
026 * @since 3.0
027 * @version $Id: OrPredicate.html 972421 2015-11-14 20:00:04Z tn $
028 */
029public final class OrPredicate<T> implements PredicateDecorator<T>, Serializable {
030
031    /** Serial version UID */
032    private static final long serialVersionUID = -8791518325735182855L;
033
034    /** The array of predicates to call */
035    private final Predicate<? super T> iPredicate1;
036    /** The array of predicates to call */
037    private final Predicate<? super T> iPredicate2;
038
039    /**
040     * Factory to create the predicate.
041     *
042     * @param <T> the type that the predicate queries
043     * @param predicate1  the first predicate to check, not null
044     * @param predicate2  the second predicate to check, not null
045     * @return the <code>and</code> predicate
046     * @throws IllegalArgumentException if either predicate is null
047     */
048    public static <T> Predicate<T> orPredicate(final Predicate<? super T> predicate1,
049                                               final Predicate<? super T> predicate2) {
050        if (predicate1 == null || predicate2 == null) {
051            throw new IllegalArgumentException("Predicate must not be null");
052        }
053        return new OrPredicate<T>(predicate1, predicate2);
054    }
055
056    /**
057     * Constructor that performs no validation.
058     * Use <code>orPredicate</code> if you want that.
059     *
060     * @param predicate1  the first predicate to check, not null
061     * @param predicate2  the second predicate to check, not null
062     */
063    public OrPredicate(final Predicate<? super T> predicate1, final Predicate<? super T> predicate2) {
064        super();
065        iPredicate1 = predicate1;
066        iPredicate2 = predicate2;
067    }
068
069    /**
070     * Evaluates the predicate returning true if either predicate returns true.
071     *
072     * @param object  the input object
073     * @return true if either decorated predicate returns true
074     */
075    public boolean evaluate(final T object) {
076       return iPredicate1.evaluate(object) || iPredicate2.evaluate(object);
077    }
078
079    /**
080     * Gets the two predicates being decorated as an array.
081     *
082     * @return the predicates
083     * @since 3.1
084     */
085    @SuppressWarnings("unchecked")
086    public Predicate<? super T>[] getPredicates() {
087        return new Predicate[] {iPredicate1, iPredicate2};
088    }
089
090}