/* * 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.ArrayList; import java.util.List; import org.picocontainer.MutablePicoContainer; import javax.xml.namespace.QName; import com.vividsolutions.jts.geom.GeometryFactory; import org.opengis.filter.FilterFactory2; import org.opengis.filter.expression.Function; import org.opengis.filter.spatial.BinarySpatialOperator; import org.geotools.xml.AbstractComplexBinding; import org.geotools.xml.ElementInstance; import org.geotools.xml.Node; /** * Binding object for the type http://www.opengis.net/ogc:BinarySpatialOpType. * * <p> * <pre> * <code> * <xsd:complexType name="BinarySpatialOpType"> * <xsd:complexContent> * <xsd:extension base="ogc:SpatialOpsType"> * <xsd:sequence> * <xsd:element ref="ogc:PropertyName"/> * <xsd:choice> * <xsd:element ref="gml:_Geometry"/> * <xsd:element ref="gml:Box"/> * </xsd:choice> * </xsd:sequence> * </xsd:extension> * </xsd:complexContent> * </xsd:complexType> * * </code> * </pre> * </p> * * @generated * * * @source $URL$ */ public class OGCBinarySpatialOpTypeBinding extends AbstractComplexBinding { private FilterFactory2 factory; private GeometryFactory gFactory; public OGCBinarySpatialOpTypeBinding(FilterFactory2 factory, GeometryFactory gFactory) { this.factory = factory; this.gFactory = gFactory; } /** * @generated */ public QName getTarget() { return OGC.BinarySpatialOpType; } /** * <!-- begin-user-doc --> * <!-- end-user-doc --> * * @generated modifiable */ public int getExecutionMode() { return AFTER; } /** * <!-- begin-user-doc --> * <!-- end-user-doc --> * * @generated modifiable */ public Class getType() { return BinarySpatialOperator.class; } /** * <!-- begin-user-doc --> * We check out the instance for the <code>op</code> so we can fail early. * <!-- end-user-doc --> * * @generated modifiable */ public void initialize(ElementInstance instance, Node node, MutablePicoContainer context) { } /** * <!-- begin-user-doc --> * <!-- end-user-doc --> * * @generated modifiable */ public Object parse(ElementInstance instance, Node node, Object value) throws Exception { //implemented by element bindings return null; // //TODO: replace with element bindings // PropertyName e1 = (PropertyName) node.getChildValue(PropertyName.class); // Expression e2 = null; // // if (node.hasChild(Geometry.class)) { // e2 = factory.literal(node.getChildValue(Geometry.class)); // } else { // //turn bounding box into geometry // //TODO: not sure if this should be done here but I am pretty sure filter // // implementation expect this to be a geometry // Envelope bbox = (Envelope) node.getChildValue(Envelope.class); // e2 = factory.literal(gFactory.createPolygon(gFactory.createLinearRing( // new Coordinate[] { // new Coordinate(bbox.getMinX(), bbox.getMinY()), // new Coordinate(bbox.getMinX(), bbox.getMaxY()), // new Coordinate(bbox.getMaxX(), bbox.getMaxY()), // new Coordinate(bbox.getMaxX(), bbox.getMinY()), // new Coordinate(bbox.getMinX(), bbox.getMinY()) // }), null)); // } // // String name = instance.getName(); // // //<xsd:element name="Equals" substitutionGroup="ogc:spatialOps" type="ogc:BinarySpatialOpType"/> // if ("Equals".equals(name)) { // return factory.equal(e1, e2); // } // //<xsd:element name="Disjoint" substitutionGroup="ogc:spatialOps" type="ogc:BinarySpatialOpType"/> // else if ("Disjoint".equals(name)) { // return factory.disjoint(e1, e2); // } // //<xsd:element name="Touches" substitutionGroup="ogc:spatialOps" type="ogc:BinarySpatialOpType"/> // else if ("Touches".equals(name)) { // return factory.touches(e1, e2); // } // //<xsd:element name="Within" substitutionGroup="ogc:spatialOps" type="ogc:BinarySpatialOpType"/> // else if ("Within".equals(name)) { // //TODO: within method on FilterFactory2 needs to take two expressoins // return factory.within(e1, e2); // } // //<xsd:element name="Overlaps" substitutionGroup="ogc:spatialOps" type="ogc:BinarySpatialOpType"/> // else if ("Overlaps".equals(name)) { // return factory.overlaps(e1, e2); // } // //<xsd:element name="Crosses" substitutionGroup="ogc:spatialOps" type="ogc:BinarySpatialOpType"/> // else if ("Crosses".equals(name)) { // return factory.crosses(e1, e2); // } // //<xsd:element name="Intersects" substitutionGroup="ogc:spatialOps" type="ogc:BinarySpatialOpType"/> // else if ("Intersects".equals(name)) { // return factory.intersects(e1, e2); // } // //<xsd:element name="Contains" substitutionGroup="ogc:spatialOps" type="ogc:BinarySpatialOpType"/> // else if ("Contains".equals(name)) { // return factory.contains(e1, e2); // } else { // throw new IllegalStateException("Unknown - " + name); // } } public Object getProperty(Object object, QName name) throws Exception { BinarySpatialOperator operator = (BinarySpatialOperator) object; return OGCUtils.property(operator.getExpression1(), operator.getExpression2(), name); } public List getProperties(Object object) throws Exception { //special hack for Functions, while not mandated by the spec we handle it // here BinarySpatialOperator operator = (BinarySpatialOperator) object; if ( operator.getExpression2() instanceof Function ) { ArrayList props = new ArrayList(); props.add( new Object[]{ OGC.Function, operator.getExpression2() } ); return props; } return super.getProperties(object); } }