/*
 * Copyright (c) 2006, 2021 Oracle and/or its affiliates. All rights reserved.
 *
 * This program and the accompanying materials are made available under the
 * terms of the Eclipse Public License v. 2.0 which is available at
 * http://www.eclipse.org/legal/epl-2.0,
 * or the Eclipse Distribution License v. 1.0 which is available at
 * http://www.eclipse.org/org/documents/edl-v10.php.
 *
 * SPDX-License-Identifier: EPL-2.0 OR BSD-3-Clause
 */

// Contributors:
//     Oracle - initial API and implementation
//
package org.eclipse.persistence.jpa.jpql.tools.utility.filter;

import org.eclipse.persistence.jpa.jpql.utility.filter.Filter;
import org.eclipse.persistence.jpa.jpql.utility.filter.NullFilter;

/**
 * This filter will "accept" any object that is accept by both of the specified wrapped filters. The
 * first filter will always be evaluated, while the second will only be evaluated if necessary.
 *
 * @version 2.4
 * @since 2.3
 */
@SuppressWarnings("nls")
public class AndFilter<T> extends CompoundFilter<T> {

    /**
     * The version number of this class which is used during deserialization to verify that the
     * sender and receiver of a serialized object have loaded classes for that object that are
     * compatible with respect to serialization.
     */
    private static final long serialVersionUID = 1L;

    /**
     * Creates a new <code>AndFilter</code> that will "accept" any object that is accept by both of
     * the specified wrapped filters.
     *
     * @param filter1 The first <code>Filter</code> that might "accept" any object
     * @param filter2 The second <code>Filter</code> that might "accept" any object
     */
    public AndFilter(Filter<T> filter1, Filter<T> filter2) {
        super(filter1, filter2);
    }

    /**
     * Creates a new <code>ANDFilter</code> that will "accept" any object that is accept by all of
     * the specified filters.
     *
     * @param filters The list of {@link Filter filters} encapsulated by a chain of {@link AndFilter
     * AndFilters}
     * @return A new chain of {@link AndFilter AndFilters} that will "accept" any object when all
     * {@link Filter filters} accepts the object
     */
    @SafeVarargs
    public static <T> Filter<T> and(Filter<T>... filters) {

        int length = filters.length;

        if (length == 0) {
            return NullFilter.instance();
        }

        if (length == 1) {
            return filters[0];
        }

        AndFilter<T> filter = new AndFilter<>(filters[0], filters[1]);

        for (int index = 2; index < length; index++) {
            filter = new AndFilter<>(filter, filters[index]);
        }

        return filter;
    }

    @Override
    public boolean accept(T value) {
        return filter1.accept(value) && filter2.accept(value);
    }

    @Override
    public AndFilter<T> clone() {
        return (AndFilter<T>) super.clone();
    }

    @Override
    protected String operatorString() {
        return "AND";
    }
}
