//$Header: /home/deegree/jail/deegreerepository/deegree/src/org/deegree/ogcwebservices/wfs/operation/GetFeatureDocument.java,v 1.5 2006/11/16 08:53:21 mschneider Exp $ /*---------------- FILE HEADER ------------------------------------------ This file is part of deegree. Copyright (C) 2001-2006 by: Department of Geography, University of Bonn http://www.giub.uni-bonn.de/deegree/ lat/lon GmbH http://www.lat-lon.de 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; either version 2.1 of the License, or (at your option) any later version. 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. You should have received a copy of the GNU Lesser General Public License along with this library; if not, write to the Free Software Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA Contact: Andreas Poth lat/lon GmbH Aennchenstraße 19 53177 Bonn Germany E-Mail: poth@lat-lon.de Prof. Dr. Klaus Greve Department of Geography University of Bonn Meckenheimer Allee 166 53115 Bonn Germany E-Mail: greve@giub.uni-bonn.de ---------------------------------------------------------------------------*/ package org.deegree.ogcwebservices.wfs.operation; import java.util.List; import java.util.Map; import org.deegree.datatypes.QualifiedName; import org.deegree.framework.util.StringTools; import org.deegree.framework.xml.XMLParsingException; import org.deegree.framework.xml.XMLTools; import org.deegree.i18n.Messages; import org.deegree.model.filterencoding.AbstractFilter; import org.deegree.model.filterencoding.Filter; import org.deegree.model.filterencoding.Function; import org.deegree.ogcbase.OGCDocument; import org.deegree.ogcbase.PropertyPath; import org.deegree.ogcbase.SortProperty; import org.deegree.ogcwebservices.wfs.operation.GetFeature.RESULT_TYPE; import org.w3c.dom.Element; import org.w3c.dom.Text; /** * Parser for "wfs:GetFeature" requests. * * @author <a href="mailto:schneider@lat-lon.de">Markus Schneider</a> * @author last edited by: $Author: mschneider $ * * @version $Revision: 1.5 $, $Date: 2006/11/16 08:53:21 $ */ public class GetFeatureDocument extends AbstractWFSRequestDocument { private static final long serialVersionUID = -3411186861123355322L; /** * Parses the underlying document into a <code>GetFeature</code> request object. * * @param id * @return corresponding <code>GetFeature</code> object * @throws XMLParsingException */ public GetFeature parse( String id ) throws XMLParsingException { checkServiceAttribute(); String version = checkVersionAttribute(); Element root = this.getRootElement(); String handle = XMLTools.getNodeAsString( root, "@handle", nsContext, null ); String outputFormat = XMLTools.getNodeAsString( root, "@outputFormat", nsContext, AbstractWFSRequest.FORMAT_GML3 ); int maxFeatures = XMLTools.getNodeAsInt( root, "@maxFeatures", nsContext, -1 ); int startPosition = XMLTools.getNodeAsInt( root, "@startPosition", nsContext, 1 ); if ( startPosition < 1 ) { String msg = org.deegree.i18n.Messages.getMessage( "WFS_INVALID_STARTPOSITION", startPosition ); throw new XMLParsingException( msg ); } int traverseXLinkDepth = XMLTools.getNodeAsInt( root, "@traverseXLinkDepth", nsContext, -1 ); int traverseXLinkExpiry = XMLTools.getNodeAsInt( root, "@traverseXLinkExpiry", nsContext, -1 ); String resultTypeString = XMLTools.getNodeAsString( root, "@resultType", nsContext, "results" ); RESULT_TYPE resultType; if ( "results".equals( resultTypeString ) ) { resultType = RESULT_TYPE.RESULTS; } else if ( "hits".equals( resultTypeString ) ) { resultType = RESULT_TYPE.HITS; } else { String msg = Messages.getMessage( "WFS_INVALID_RESULT_TYPE", resultTypeString ); throw new XMLParsingException( msg ); } List nl = XMLTools.getRequiredNodes( root, "wfs:Query", nsContext ); Query[] queries = new Query[nl.size()]; for ( int i = 0; i < queries.length; i++ ) { queries[i] = parseQuery( (Element) nl.get( i ) ); } // vendorspecific attributes; required by deegree rights management Map<String, String> vendorSpecificParams = parseDRMParams( root ); GetFeature req = new GetFeature( version, id, handle, resultType, outputFormat, maxFeatures, startPosition, traverseXLinkDepth, traverseXLinkExpiry, queries, vendorSpecificParams ); return req; } /** * Parses the given query element into a <code>Query</code> object. * <p> * Note that the following attributes from the surrounding element are also considered (if * it present): * <ul> * <li>resultType</li> * <li>maxFeatures</li> * <li>startPosition</li> * </ul> * * @param element * query element * @return corresponding <code>Query</code> object * @throws XMLParsingException */ Query parseQuery( Element element ) throws XMLParsingException { String handle = XMLTools.getNodeAsString( element, "@handle", nsContext, null ); // TODO clean this up String tmp = XMLTools.getRequiredNodeAsString( element, "@typeName", nsContext ); String[] values = StringTools.toArray( tmp, ",", false ); QualifiedName[] typeNames = transformToQualifiedNames( values, element ); String featureVersion = XMLTools.getNodeAsString( element, "@featureVersion", nsContext, null ); String srsName = XMLTools.getNodeAsString( element, "@srsName", nsContext, null ); List nl = XMLTools.getNodes( element, "wfs:PropertyName/text()", nsContext ); PropertyPath[] propertyNames = new PropertyPath[nl.size()]; for ( int i = 0; i < propertyNames.length; i++ ) { propertyNames[i] = OGCDocument.parsePropertyPath( (Text) nl.get( i ) ); } nl = XMLTools.getNodes( element, "ogc:Function", nsContext ); Function[] functions = new Function[nl.size()]; for ( int i = 0; i < functions.length; i++ ) { functions[i] = (Function) Function.buildFromDOM( (Element) nl.get( i ) ); } Filter filter = null; Element filterElement = (Element) XMLTools.getNode( element, "ogc:Filter", nsContext ); if ( filterElement != null ) { filter = AbstractFilter.buildFromDOM( filterElement ); } SortProperty[] sortProps = null; Element sortByElement = (Element) XMLTools.getNode( element, "ogc:SortBy", nsContext ); if ( sortByElement != null ) { sortProps = parseSortBy( sortByElement ); } //---------------------------------------------------------------------------------------- // parse "inherited" attributes from GetFeature element (but very kindly) //---------------------------------------------------------------------------------------- String resultTypeString = "results"; RESULT_TYPE resultType; try { resultTypeString = XMLTools.getNodeAsString( element, "../@resultType", nsContext, "results" ); } catch ( XMLParsingException doNothing ) { // it's o.k. - let's be really kind here } if ( "results".equals( resultTypeString ) ) { resultType = RESULT_TYPE.RESULTS; } else if ( "hits".equals( resultTypeString ) ) { resultType = RESULT_TYPE.HITS; } else { String msg = Messages.getMessage( "WFS_INVALID_RESULT_TYPE", resultTypeString ); throw new XMLParsingException( msg ); } int maxFeatures = -1; try { maxFeatures = XMLTools.getNodeAsInt( element, "../@maxFeatures", nsContext, -1 ); } catch ( XMLParsingException doNothing ) { // it's o.k. - let's be really kind here } int startPosition = -1; try { startPosition = XMLTools.getNodeAsInt( element, "../@startPosition", nsContext, 0 ); } catch ( XMLParsingException doNothing ) { // it's o.k. - let's be really kind here } return new Query( propertyNames, functions, sortProps, handle, featureVersion, typeNames, srsName, filter, resultType, maxFeatures, startPosition ); } /** * Parses the given "ogc:SortBy" element. * * @param root * "ogc:SortBy" element * @return corresponding <code>SortProperty</code> instances (in original order) */ private SortProperty[] parseSortBy( Element root ) throws XMLParsingException { List nl = XMLTools.getRequiredNodes( root, "ogc:SortProperty", nsContext ); SortProperty[] sortProps = new SortProperty[nl.size()]; for ( int i = 0; i < nl.size(); i++ ) { sortProps[i] = SortProperty.create( (Element) nl.get( i ) ); } return sortProps; } } /* ******************************************************************** Changes to this class. What the people have been up to: $Log: GetFeatureDocument.java,v $ Revision 1.5 2006/11/16 08:53:21 mschneider Merged messages from org.deegree.ogcwebservices.wfs and its subpackages. Revision 1.4 2006/11/07 11:09:36 mschneider Added exceptions in case anything other than the 1.1.0 format is requested. Revision 1.3 2006/10/10 15:53:59 mschneider Added handling of startPosition. Revision 1.2 2006/08/14 16:48:30 mschneider Cleanup. Javadoc fixes. Revision 1.1 2006/06/07 17:17:56 mschneider Moved XML parsing functionality from GetFeature here. Revision 1.1 2006/06/06 17:05:50 mschneider Initial version. Outfactored parser. ********************************************************************** */