/* (c) 2014 Open Source Geospatial Foundation - all rights reserved * (c) 2001 - 2013 OpenPlans * This code is licensed under the GPL 2.0 license, available at the root * application directory. */ package org.geoserver.wfs.xml.v1_1_0; import java.net.URI; import java.util.Iterator; import java.util.List; import javax.xml.namespace.QName; import net.opengis.wfs.QueryType; import net.opengis.wfs.WfsFactory; import org.geoserver.wfs.WFSException; import org.geotools.gml2.bindings.GML2ParsingUtils; import org.geotools.xml.AbstractComplexBinding; import org.geotools.xml.ElementInstance; import org.geotools.xml.Node; import org.opengis.filter.Filter; import org.opengis.filter.expression.PropertyName; import org.opengis.filter.sort.SortBy; import org.opengis.referencing.crs.CoordinateReferenceSystem; import org.picocontainer.MutablePicoContainer; /** * Binding object for the type http://www.opengis.net/wfs:QueryType. * * <p> * <pre> * <code> * <xsd:complexType name="QueryType"> * <xsd:annotation> * <xsd:documentation> * The Query element is of type QueryType. * </xsd:documentation> * </xsd:annotation> * <xsd:sequence> * <xsd:choice maxOccurs="unbounded" minOccurs="0"> * <xsd:element ref="wfs:PropertyName"> * <xsd:annotation> * <xsd:documentation> * The Property element is used to specify one or more * properties of a feature whose values are to be retrieved * by a Web Feature Service. * * While a Web Feature Service should endeavour to satisfy * the exact request specified, in some instance this may * not be possible. Specifically, a Web Feature Service * must generate a valid GML3 response to a Query operation. * The schema used to generate the output may include * properties that are mandatory. In order that the output * validates, these mandatory properties must be specified * in the request. If they are not, a Web Feature Service * may add them automatically to the Query before processing * it. Thus a client application should, in general, be * prepared to receive more properties than it requested. * * Of course, using the DescribeFeatureType request, a client * application can determine which properties are mandatory * and request them in the first place. * </xsd:documentation> * </xsd:annotation> * </xsd:element> * <xsd:element ref="ogc:Function"> * <xsd:annotation> * <xsd:documentation> * A function may be used as a select item in a query. * However, if a function is used, care must be taken * to ensure that the result type matches the type in the * * </xsd:documentation> * </xsd:annotation> * </xsd:element> * </xsd:choice> * <xsd:element maxOccurs="1" minOccurs="0" ref="ogc:Filter"> * <xsd:annotation> * <xsd:documentation> * The Filter element is used to define spatial and/or non-spatial * constraints on query. Spatial constrains use GML3 to specify * the constraining geometry. A full description of the Filter * element can be found in the Filter Encoding Implementation * Specification. * </xsd:documentation> * </xsd:annotation> * </xsd:element> * <xsd:element maxOccurs="1" minOccurs="0" ref="ogc:SortBy"> * <xsd:annotation> * <xsd:documentation> * The SortBy element is used specify property names whose * values should be used to order (upon presentation) the * set of feature instances that satisfy the query. * </xsd:documentation> * </xsd:annotation> * </xsd:element> * </xsd:sequence> * <xsd:attribute name="handle" type="xsd:string" use="optional"> * <xsd:annotation> * <xsd:documentation> * The handle attribute allows a client application * to assign a client-generated identifier for the * Query. The handle is included to facilitate error * reporting. If one Query in a GetFeature request * causes an exception, a WFS may report the handle * to indicate which query element failed. If the a * handle is not present, the WFS may use other means * to localize the error (e.g. line numbers). * </xsd:documentation> * </xsd:annotation> * </xsd:attribute> * <xsd:attribute name="typeName" type="wfs:TypeNameListType" use="required"> * <xsd:annotation> * <xsd:documentation> * The typeName attribute is a list of one or more * feature type names that indicate which types * of feature instances should be included in the * reponse set. Specifying more than one typename * indicates that a join operation is being performed. * All the names in the typeName list must be valid * types that belong to this query's feature content * as defined by the GML Application Schema. * </xsd:documentation> * </xsd:annotation> * </xsd:attribute> * <xsd:attribute name="featureVersion" type="xsd:string" use="optional"> * <xsd:annotation> * <xsd:documentation> * For systems that implement versioning, the featureVersion * attribute is used to specify which version of a particular * feature instance is to be retrieved. A value of ALL means * that all versions should be retrieved. An integer value * 'i', means that the ith version should be retrieve if it * exists or the most recent version otherwise. * </xsd:documentation> * </xsd:annotation> * </xsd:attribute> * <xsd:attribute name="srsName" type="xsd:anyURI" use="optional"> * <xsd:annotation> * <xsd:documentation> * This attribute is used to specify a specific WFS-supported SRS * that should be used for returned feature geometries. The value * may be the WFS StorageSRS value, DefaultRetrievalSRS value, or * one of AdditionalSRS values. If no srsName value is supplied, * then the features will be returned using either the * DefaultRetrievalSRS, if specified, and StorageSRS otherwise. * For feature types with no spatial properties, this attribute * must not be specified or ignored if it is specified. * </xsd:documentation> * </xsd:annotation> * </xsd:attribute> * </xsd:complexType> * * </code> * </pre> * @generated */ public class QueryTypeBinding extends AbstractComplexBinding { WfsFactory wfsfactory; public QueryTypeBinding(WfsFactory wfsfactory) { this.wfsfactory = wfsfactory; } /** * @generated */ public QName getTarget() { return WFS.QUERYTYPE; } /** * <!-- begin-user-doc --> * <!-- end-user-doc --> * * @generated modifiable */ public Class getType() { return QueryType.class; } public void initializeChildContext(ElementInstance childInstance, Node node, MutablePicoContainer context) { //if an srsName is set for this geometry, put it in the context for // children, so they can use it as well if ( node.hasAttribute("srsName") ) { try { CoordinateReferenceSystem crs = GML2ParsingUtils.crs(node); if ( crs != null ) { context.registerComponentInstance(CoordinateReferenceSystem.class, crs); } } catch(Exception e) { throw new WFSException(e, "InvalidParameterValue"); } } } /** * <!-- begin-user-doc --> * <!-- end-user-doc --> * * @generated modifiable */ public Object parse(ElementInstance instance, Node node, Object value) throws Exception { QueryType query = wfsfactory.createQueryType(); //<xsd:choice maxOccurs="unbounded" minOccurs="0"> //<xsd:element ref="wfs:PropertyName"> if (node.hasChild("PropertyName")) { //HACK, stripping of namespace prefix for (Iterator p = node.getChildValues("PropertyName").iterator(); p.hasNext();) { Object property = p.next(); String propertyName; if(property instanceof String) propertyName = (String) property; else propertyName = (String) ((PropertyName) property).getPropertyName(); query.getPropertyName().add(propertyName); } } //<xsd:element ref="ogc:Function"> if (node.hasChild("Function")) { query.getFunction().add(node.getChildValues("Function")); } //</xsd:choice> //<xsd:element maxOccurs="1" minOccurs="0" ref="ogc:Filter"> if (node.hasChild(Filter.class)) { query.setFilter((Filter) node.getChildValue(Filter.class)); } //<xsd:element maxOccurs="1" minOccurs="0" ref="ogc:SortBy"> if (node.hasChild(SortBy[].class)) { SortBy[] sortBy = (SortBy[]) node.getChildValue(SortBy[].class); for (int i = 0; i < sortBy.length; i++) query.getSortBy().add(sortBy[i]); } //<xsd:attribute name="handle" type="xsd:string" use="optional"> if (node.hasAttribute("handle")) { query.setHandle((String) node.getAttributeValue("handle")); } //<xsd:attribute name="typeName" type="wfs:TypeNameListType" use="required"> query.setTypeName((List) node.getAttributeValue("typeName")); //<xsd:attribute name="featureVersion" type="xsd:string" use="optional"> if (node.hasAttribute("featureVersion")) { query.setFeatureVersion((String) node.getAttributeValue("featureVersion")); } //<xsd:attribute name="srsName" type="xsd:anyURI" use="optional"> if (node.hasAttribute("srsName")) { query.setSrsName((URI) node.getAttributeValue("srsName")); } if ( node.hasChild( "XlinkPropertyName" ) ) { query.getXlinkPropertyName().addAll( node.getChildValues( "XlinkPropertyName" )); } return query; } }