/*
* 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 java.util.Iterator;
import javax.xml.namespace.QName;
import com.vividsolutions.jts.geom.Coordinate;
import com.vividsolutions.jts.geom.Envelope;
import com.vividsolutions.jts.geom.Geometry;
import com.vividsolutions.jts.geom.GeometryFactory;
import com.vividsolutions.jts.geom.Polygon;
import org.opengis.filter.FilterFactory2;
import org.opengis.filter.expression.Expression;
import org.opengis.filter.expression.Function;
import org.opengis.filter.expression.Literal;
import org.opengis.filter.expression.PropertyName;
import org.geotools.geometry.jts.ReferencedEnvelope;
import org.geotools.gml2.GML;
import org.geotools.xml.Node;
/**
* Filter parsing / encoding utility class.
*
* @author Justin Deoliveira, The Open Planning Project
*
*
*
* @source $URL$
*/
public class OGCUtils {
/**
* Implementation of getProperty for {@link BinarySpatialOpTypeBinding} and
* {@link DistanceBufferTypeBinding}
*
* @param e1 First expression
* @param e2 Second expression
* @param name name of property
*
* @return the object for the property, or null
*/
static Object property(Expression e1, Expression e2, QName name) {
if (OGC.PropertyName.equals(name)) {
if (e1 instanceof PropertyName) {
return e1;
} else if (e2 instanceof PropertyName) {
return e2;
}
}
if (new QName(GML.NAMESPACE, "_Geometry").equals(name)) {
if (e1 instanceof Literal) {
Literal literal = (Literal) e1;
if (literal.getValue() instanceof Geometry) {
return literal.getValue();
}
} else if (e2 instanceof Literal) {
Literal literal = (Literal) e2;
if (literal.getValue() instanceof Geometry) {
return literal.getValue();
}
}
}
if (new QName(GML.NAMESPACE, "Box").equals(name) /*filter 1.0*/
|| new QName(GML.NAMESPACE, "Envelope").equals(name) /*filter 1.1*/) {
if (e1 instanceof Literal) {
Literal literal = (Literal) e1;
if (literal.getValue() instanceof Envelope) {
return literal.getValue();
}
} else if (e2 instanceof Literal) {
Literal literal = (Literal) e2;
if (literal.getValue() instanceof Envelope) {
return literal.getValue();
}
}
}
return null;
}
/**
* Returns a two element array of PropertyName, Literal ( Geometry )
*
* @param node The parse tree.
*
* @return A two element array of expressions for a BinarySpatialOp type.
*/
static Expression[] spatial(Node node, FilterFactory2 ff, GeometryFactory gf) {
PropertyName name = (PropertyName) node.getChildValue(PropertyName.class);
Expression spatial = null;
if (node.hasChild(Geometry.class)) {
spatial = ff.literal(node.getChildValue(Geometry.class));
} else if (node.hasChild(Envelope.class)) {
//JD: creating an envelope here would break a lot of our code, for instance alot of
// code that encodes a filter into sql will choke on this
Envelope envelope = (Envelope) node.getChildValue(Envelope.class);
Polygon polygon = gf.createPolygon(gf.createLinearRing(
new Coordinate[] {
new Coordinate(envelope.getMinX(), envelope.getMinY()),
new Coordinate(envelope.getMaxX(), envelope.getMinY()),
new Coordinate(envelope.getMaxX(), envelope.getMaxY()),
new Coordinate(envelope.getMinX(), envelope.getMaxY()),
new Coordinate(envelope.getMinX(), envelope.getMinY())
}), null);
if (envelope instanceof ReferencedEnvelope) {
polygon.setUserData(((ReferencedEnvelope) envelope).getCoordinateReferenceSystem());
}
spatial = ff.literal(polygon);
}
else {
//look for an expression that is not a property name
for (Iterator c = node.getChildren().iterator(); c.hasNext(); ) {
Node child = (Node) c.next();
//if property name, skip
if ( child.getValue() instanceof PropertyName ) {
continue;
}
//if expression, use it
if ( child.getValue() instanceof Expression ) {
spatial = (Expression) child.getValue();
break;
}
}
}
return new Expression[] { name, spatial };
}
}