/*
* GeoTools - The Open Source Java GIS Toolkit
* http://geotools.org
*
* (C) 2002-2008, Open Source Geospatial Foundation (OSGeo)
*
* This library is free software; you can redistribute it and/or
* modify it under the terms of the GNU Lesser General Public
* License as published by the Free Software Foundation;
* version 2.1 of the License.
*
* This library is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
* Lesser General Public License for more details.
*/
package org.geotools.filter;
import org.geotools.factory.CommonFactoryFinder;
import org.opengis.filter.FilterVisitor;
import org.opengis.filter.PropertyIsNull;
/**
* Defines a null filter, which checks to see if an attribute is null.
*
* @author Rob Hranac, Vision for New York
* @source $URL$
* @version $Id$
*/
public class NullFilterImpl extends AbstractFilterImpl implements NullFilter {
/** The null check value, which must be an attribute expression. */
private org.opengis.filter.expression.Expression nullCheck = null;
/**
* Constructor which sets the type as null check.
*/
protected NullFilterImpl() {
super(CommonFactoryFinder.getFilterFactory(null));
filterType = NULL;
}
/**
* Determines whether or not a given feature is 'inside' this filter.
*
* @param nullCheck The attribute expression to null check.
*
* @throws IllegalFilterException If attempting to add a non-attribute
* expression.
*
* @task REVISIT: change arg to AttributeExpression?
* @task REVISIT: change name to setNullCheckValue.
*
* @deprecated use {@link PropertyIsNull#setExpression(Expression)}
*/
public final void nullCheckValue(Expression nullCheck)
throws IllegalFilterException {
setExpression(nullCheck);
}
/**
* Returns the expression being checked for null.
*
* @return the Expression to null check.
*
* @deprecated use {@link #getExpression()}.
*/
public final Expression getNullCheckValue() {
return (Expression) getExpression();
}
/**
* Returns the expression which represents the null check.
*/
public org.opengis.filter.expression.Expression getExpression() {
return nullCheck;
}
/**
* Sets the expression which represents the null check.
*/
public void setExpression(org.opengis.filter.expression.Expression nullCheck) {
if (nullCheck instanceof AttributeExpression) {
this.nullCheck = nullCheck;
} else {
throw new IllegalFilterException(
"Attempted to add non-attribute expression to a null filter.");
}
}
/**
* Determines whether or not a given feature is 'inside' this filter.
*
* @param feature Specified feature to examine.
*
* @return Flag confirming whether or not this feature is inside the
* filter.
*/
public boolean evaluate(Object feature) {
if (nullCheck == null) {
return false;
} else {
return (nullCheck.evaluate(feature) == null);
}
}
/**
* Returns a string representation of this filter.
*
* @return String representation of the null filter.
*/
public String toString() {
return "[ " + nullCheck.toString() + " is null ]";
}
/**
* Compares this filter to the specified object. Returns true if the
* passed in object is the same as this filter. Checks to make sure the
* filter types, and the NullCheckValue are the same.
*
* @param obj - the object to compare this LikeFilter against.
*
* @return true if specified object is equal to this filter; false
* otherwise.
*/
public boolean equals(Object obj) {
if (obj!=null && obj.getClass() == this.getClass()) {
NullFilterImpl nullFilter = (NullFilterImpl) obj;
return ((nullFilter.getFilterType() == this.filterType)
&& nullFilter.getNullCheckValue().equals(this.nullCheck));
} else {
return false;
}
}
/**
* Override of hashCode method.
*
* @return a hash code value for this geometry filter.
*/
public int hashCode() {
int result = 17;
result = (37 * result)
+ ((nullCheck == null) ? 0 : nullCheck.hashCode());
return result;
}
/**
* Used by FilterVisitors to perform some action on this filter instance.
* Typicaly used by Filter decoders, but may also be used by any thing
* which needs infomration from filter structure. Implementations should
* always call: visitor.visit(this); It is importatant that this is not
* left to a parent class unless the parents API is identical.
*
* @param visitor The visitor which requires access to this filter, the
* method must call visitor.visit(this);
*/
public Object accept(FilterVisitor visitor, Object extraData) {
return visitor.visit(this,extraData);
}
}