blob: 12fd283c5eccb2f0903406885a1297887302767d [file] [log] [blame]
/*
* 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 java.io.Serializable;
import org.eclipse.persistence.jpa.jpql.utility.filter.Filter;
/**
* This filter provides a simple framework for combining the behavior of a pair of filters.
*
* @version 2.3
* @since 2.3
*/
@SuppressWarnings("nls")
public abstract class CompoundFilter<T> implements Filter<T>,
Cloneable,
Serializable {
/**
* The first {@link Filter} used to accept the value.
*/
protected final Filter<T> filter1;
/**
* The second {@link Filter} used to accept the value.
*/
protected final Filter<T> filter2;
/**
* 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>CompoundFilter</code> that will "accept" any object that is accept by both
* of the specified wrapped filters.
*
* @param filter1 The first <code>Filter</code> used to accept the value
* @param filter2 The second <code>Filter</code> used to accept the value
*/
protected CompoundFilter(Filter<T> filter1, Filter<T> filter2) {
super();
checkFilter1(filter1);
checkFilter2(filter2);
this.filter1 = filter1;
this.filter2 = filter2;
}
private void checkFilter1(Filter<T> filter) {
if (filter == null) {
throw new IllegalArgumentException("The first Filter cannot be null");
}
}
private void checkFilter2(Filter<T> filter) {
if (filter == null) {
throw new IllegalArgumentException("The second Filter cannot be null");
}
}
@Override
@SuppressWarnings("unchecked")
public CompoundFilter<T> clone() {
try {
return (CompoundFilter<T>) super.clone();
}
catch (CloneNotSupportedException e) {
throw new RuntimeException("The cloning of this " + getClass().getSimpleName() + " was not successful.", e);
}
}
@Override
public boolean equals(Object object) {
if (!(object instanceof CompoundFilter<?>)) {
return false;
}
CompoundFilter<?> other = (CompoundFilter<?>) object;
return (filter1.equals(other.filter1) && filter2.equals(other.filter2)) ||
(filter1.equals(other.filter2) && filter2.equals(other.filter1));
}
/**
* Returns the left <code>Filter</code> of this compound filter.
*
* @return The first <code>Filter</code>
*/
public Filter<T> getFilter1() {
return filter1;
}
/**
* Returns the second <code>Filter</code> of this compound filter.
*
* @return The second <code>Filter</code>
*/
public Filter<T> getFilter2() {
return filter2;
}
@Override
public int hashCode() {
return filter1.hashCode() ^ filter2.hashCode();
}
/**
* Returns a string representation of the filter's operator.
*
* @return The string value of the operator
*/
protected abstract String operatorString();
@Override
public String toString() {
StringBuilder sb = new StringBuilder();
sb.append(getClass().getSimpleName());
sb.append(" (filter1=");
sb.append(filter1);
sb.append(", filter2=");
sb.append(filter2);
sb.append(")");
return sb.toString();
}
}