/*
* 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.v1_0;
import org.w3c.dom.Document;
import org.w3c.dom.Element;
import org.w3c.dom.Node;
import javax.xml.namespace.QName;
import com.vividsolutions.jts.geom.Coordinate;
import com.vividsolutions.jts.geom.Geometry;
import com.vividsolutions.jts.geom.GeometryFactory;
import org.opengis.filter.And;
import org.opengis.filter.FilterFactory2;
import org.opengis.filter.Not;
import org.opengis.filter.Or;
import org.opengis.filter.PropertyIsBetween;
import org.opengis.filter.PropertyIsEqualTo;
import org.opengis.filter.PropertyIsGreaterThan;
import org.opengis.filter.PropertyIsGreaterThanOrEqualTo;
import org.opengis.filter.PropertyIsLessThan;
import org.opengis.filter.PropertyIsLessThanOrEqualTo;
import org.opengis.filter.PropertyIsLike;
import org.opengis.filter.PropertyIsNotEqualTo;
import org.opengis.filter.PropertyIsNull;
import org.opengis.filter.expression.Add;
import org.opengis.filter.expression.Divide;
import org.opengis.filter.expression.Function;
import org.opengis.filter.expression.Literal;
import org.opengis.filter.expression.Multiply;
import org.opengis.filter.expression.PropertyName;
import org.opengis.filter.expression.Subtract;
import org.opengis.filter.identity.FeatureId;
import org.opengis.filter.spatial.BBOX;
import org.opengis.filter.spatial.Beyond;
import org.opengis.filter.spatial.Contains;
import org.opengis.filter.spatial.Crosses;
import org.opengis.filter.spatial.DWithin;
import org.opengis.filter.spatial.Disjoint;
import org.opengis.filter.spatial.Equals;
import org.opengis.filter.spatial.Intersects;
import org.opengis.filter.spatial.Overlaps;
import org.opengis.filter.spatial.Touches;
import org.opengis.filter.spatial.Within;
import org.geotools.factory.CommonFactoryFinder;
import org.geotools.gml2.GML;
/**
* Mock data class used for filter binding tests.
*
* @author Justin Deoliveira, The Open Planning Project
*
*
* @source $URL$
*/
public class FilterMockData {
static FilterFactory2 f = (FilterFactory2) CommonFactoryFinder.getFilterFactory(null);
static Element propertyName(Document document, Node parent) {
return propertyName("foo", document, parent);
}
static Element propertyName(String property, Document document, Node parent) {
Element propertyName = element(document, parent, OGC.PropertyName);
propertyName.appendChild(document.createTextNode(property));
return propertyName;
}
static PropertyName propertyName() {
return propertyName("foo");
}
static PropertyName propertyName(String property) {
return f.property(property);
}
static Element literal(Document document, Node parent) {
return literal("foo", document, parent);
}
static Element literal(String value, Document document, Node parent) {
Element literal = element(document, parent, OGC.Literal);
literal.appendChild(document.createTextNode(value));
return literal;
}
static Literal literal() {
return literal("foo");
}
static Literal literal(Object value) {
return f.literal(value);
}
static Element propertyIsEqualTo(Document document, Node parent) {
return binaryComparisonOp(document, parent, OGC.PropertyIsEqualTo);
}
static PropertyIsEqualTo propertyIsEqualTo() {
return f.equals(propertyName(), literal());
}
static Element propertyIsNotEqualTo(Document document, Node parent) {
return binaryComparisonOp(document, parent, OGC.PropertyIsNotEqualTo);
}
static PropertyIsNotEqualTo propertyIsNotEqualTo() {
return f.notEqual(propertyName(), literal(), false);
}
static Element propertyIsLessThan(Document document, Node parent) {
return binaryComparisonOp(document, parent, OGC.PropertyIsLessThan);
}
static PropertyIsLessThan propertyIsLessThan() {
return f.less(propertyName(), literal());
}
static Element propertyIsLessThanOrEqualTo(Document document, Node parent) {
return binaryComparisonOp(document, parent, OGC.PropertyIsLessThanOrEqualTo);
}
static PropertyIsLessThanOrEqualTo propertyIsLessThanOrEqualTo() {
return f.lessOrEqual(propertyName(), literal());
}
static Element propertyIsGreaterThan(Document document, Node parent) {
return binaryComparisonOp(document, parent, OGC.PropertyIsGreaterThan);
}
static PropertyIsGreaterThan propertyIsGreaterThan() {
return f.greater(propertyName(), literal());
}
static Element propertyIsGreaterThanOrEqualTo(Document document, Node parent) {
return binaryComparisonOp(document, parent, OGC.PropertyIsGreaterThanOrEqualTo);
}
static PropertyIsGreaterThanOrEqualTo propertyIsGreaterThanOrEqualTo() {
return f.greaterOrEqual(propertyName(), literal());
}
static Element binaryComparisonOp(Document document, Node parent, QName name) {
Element binaryComparisonOp = element(document, parent, name);
propertyName(document, binaryComparisonOp);
literal(document, binaryComparisonOp);
return binaryComparisonOp;
}
static PropertyIsBetween propertyIsBetween() {
return f.between(f.property("foo"), f.literal(1), f.literal(2));
}
static Element propertyIsBetween(Document document, Node parent) {
Element between = element(document, parent, OGC.PropertyIsBetween);
propertyName(document, between);
Element lower = element(document, between, new QName(OGC.NAMESPACE, "LowerBoundary"));
literal(document, lower);
Element upper = element(document, between, new QName(OGC.NAMESPACE, "UpperBoundary"));
literal(document, upper);
return between;
}
static PropertyIsNull propertyIsNull() {
return f.isNull(propertyName());
}
static Element propertyisNull(Document document, Node parent) {
Element isNull = element(document, parent, OGC.PropertyIsNull);
propertyName(document, isNull);
return isNull;
}
static PropertyIsLike propertyIsLike() {
return f.like(propertyName(), "foo", "x", "y", "z");
}
static Element propertyIsLike(Document document, Node parent) {
Element isLike = element(document, parent, OGC.PropertyIsLike);
propertyName(document, isLike);
literal(document, isLike);
isLike.setAttribute("wildCard", "x");
isLike.setAttribute("singleChar", "y");
isLike.setAttribute("escape", "z");
return isLike;
}
static Element and(Document document, Node parent) {
return and(document,parent,false);
}
static Element and(Document document, Node parent, boolean empty) {
Element and = element(document, parent, OGC.And);
if( !empty ) {
propertyIsEqualTo(document, and);
propertyIsNotEqualTo(document, and);
}
return and;
}
static And and() {
return f.and(propertyIsEqualTo(), propertyIsNotEqualTo());
}
static Element or(Document document, Node parent) {
Element or = element(document, parent, OGC.Or);
propertyIsEqualTo(document, or);
propertyIsNotEqualTo(document, or);
return or;
}
static Or or() {
return f.or(propertyIsEqualTo(), propertyIsNotEqualTo());
}
static Not not() {
return f.not(propertyIsEqualTo());
}
static Element not(Document document, Node parent) {
Element not = element(document, parent, OGC.Not);
propertyIsEqualTo(document, not);
return not;
}
static Beyond beyond() {
return f.beyond(f.property("the_geom"), f.literal(geometry()), 1.0d, "m");
}
static DWithin dwithin() {
return f.dwithin(f.property("the_geom"), f.literal(geometry()), 1.0d, "m");
}
static Element beyond(Document document, Node parent) {
return distanceBufferOperator(document, parent, OGC.Beyond);
}
static Element dwithin(Document document, Node parent) {
return distanceBufferOperator(document, parent, OGC.DWithin);
}
static Element distanceBufferOperator(Document document, Node parent, QName name) {
Element doperator = binarySpatialOperator(document, parent, name);
Element distance = element(document, doperator, new QName(OGC.NAMESPACE, "Distance"));
distance.appendChild(document.createTextNode("1.0"));
distance.setAttribute( "units", "m" );
return doperator;
}
static Element contains(Document document, Node parent) {
return binarySpatialOperator(document, parent, OGC.Contains);
}
static Contains contains() {
return f.contains(f.property("the_geom"), f.literal(geometry()));
}
static Element crosses(Document document, Node parent) {
return binarySpatialOperator(document, parent, OGC.Crosses);
}
static Crosses crosses() {
return f.crosses(f.property("the_geom"), f.literal(geometry()));
}
static Element disjoint(Document document, Node parent) {
return binarySpatialOperator(document, parent, OGC.Disjoint);
}
static Disjoint disjoint() {
return f.disjoint(f.property("the_geom"), f.literal(geometry()));
}
static Element equals(Document document, Node parent) {
return binarySpatialOperator(document, parent, OGC.Equals);
}
static Equals equals() {
return f.equal(f.property("the_geom"), f.literal(geometry()));
}
static Element intersects(Document document, Node parent) {
return binarySpatialOperator(document, parent, OGC.Intersects);
}
static Intersects intersects() {
return f.intersects(f.property("the_geom"), f.literal(geometry()));
}
static Element overlaps(Document document, Node parent) {
return binarySpatialOperator(document, parent, OGC.Overlaps);
}
static Overlaps overlaps() {
return f.overlaps(f.property("the_geom"), f.literal(geometry()));
}
static Element touches(Document document, Node parent) {
return binarySpatialOperator(document, parent, OGC.Touches);
}
static Touches touches() {
return f.touches(f.property("the_geom"), f.literal(geometry()));
}
static Element within(Document document, Node parent) {
return binarySpatialOperator(document, parent, OGC.Within);
}
static Within within() {
return f.within(f.property("the_geom"), f.literal(geometry()));
}
static Within withinWithFunction() {
return f.within( f.property( "the_geom"), function() );
}
static Element withinWithFunction(Document document, Node parent) {
Element within = element(document, parent, OGC.Within);
propertyName(document, within);
function(document, within);
return within;
}
static Element binarySpatialOperator(Document document, Node parent, QName name) {
Element spatial = element(document, parent, name);
propertyName(document, spatial);
geometry(document, spatial);
return spatial;
}
static Geometry geometry() {
return new GeometryFactory().createPoint(new Coordinate(1, 1));
}
static Element geometry(Document document, Node parent) {
Element geometry = element(document, parent, GML.Point);
Element pos = element(document, geometry, GML.coord);
Element x = element(document, pos, new QName(GML.NAMESPACE, "X"));
x.appendChild(document.createTextNode("1"));
Element y = element(document, pos, new QName(GML.NAMESPACE, "Y"));
y.appendChild(document.createTextNode("1"));
return geometry;
}
static Element envelope(Document document, Node parent) {
Element envelope = element(document, parent, GML.Box);
Element lower = element(document, envelope, GML.coord);
Element x = element(document, lower, new QName(GML.NAMESPACE, "X"));
x.appendChild(document.createTextNode("0"));
Element y = element(document, lower, new QName(GML.NAMESPACE, "Y"));
y.appendChild(document.createTextNode("0"));
Element upper = element(document, envelope, GML.coord);
x = element(document, upper, new QName(GML.NAMESPACE, "X"));
x.appendChild(document.createTextNode("1"));
y = element(document, upper, new QName(GML.NAMESPACE, "Y"));
y.appendChild(document.createTextNode("1"));
envelope.setAttribute("srsName", "EPSG:4326");
return envelope;
}
static Element add(Document document, Node parent) {
return binaryExpression(document, parent, OGC.Add);
}
static Add add() {
return f.add(f.literal(1), f.literal(2));
}
static Element sub(Document document, Node parent) {
return binaryExpression(document, parent, OGC.Sub);
}
static Subtract sub() {
return f.subtract(f.literal(1), f.literal(2));
}
static Element mul(Document document, Node parent) {
return binaryExpression(document, parent, OGC.Mul);
}
static Multiply mul() {
return f.multiply(f.literal(1), f.literal(2));
}
static Element div(Document document, Node parent) {
return binaryExpression(document, parent, OGC.Div);
}
static Divide div() {
return f.divide(f.literal(1), f.literal(2));
}
static Element binaryExpression(Document document, Node parent, QName name) {
Element binaryExpression = element(document, parent, name);
literal(document, binaryExpression);
literal(document, binaryExpression);
return binaryExpression;
}
static FeatureId featureId() {
return f.featureId("foo");
}
static Element featureId(Document document, Node parent) {
Element featureId = element(document, parent, OGC.FeatureId);
featureId.setAttribute("fid", "foo");
return featureId;
}
static Function function() {
return f.function("min", f.property("arg1"), f.literal(2));
}
static Element function(Document document, Node parent) {
Element function = element(document, parent, OGC.Function);
function.setAttributeNS("", "name", "min");
propertyName(document, function);
literal(document, function);
return function;
}
static BBOX bbox() {
return f.bbox("foo", 0, 0, 1, 1, "EPSG:4326");
}
static Element bbox(Document document, Node parent) {
Element bbox = element(document, parent, OGC.BBOX);
propertyName(document, bbox);
envelope(document, bbox);
return bbox;
}
static Element element(Document document, Node parent, QName name) {
Element element = document.createElementNS(name.getNamespaceURI(), name.getLocalPart());
if (parent != null) {
parent.appendChild(element);
}
return element;
}
}