001 // $HeadURL:
002 // /deegreerepository/deegree/src/org/deegree/model/filterencoding/capabilities/FilterCapabilities110Factory.java,v
003 // 1.1 2005/03/04 16:33:28 mschneider Exp $
004 /*----------------------------------------------------------------------------
005 This file is part of deegree, http://deegree.org/
006 Copyright (C) 2001-2009 by:
007 Department of Geography, University of Bonn
008 and
009 lat/lon GmbH
010
011 This library is free software; you can redistribute it and/or modify it under
012 the terms of the GNU Lesser General Public License as published by the Free
013 Software Foundation; either version 2.1 of the License, or (at your option)
014 any later version.
015 This library is distributed in the hope that it will be useful, but WITHOUT
016 ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS
017 FOR A PARTICULAR PURPOSE. See the GNU Lesser General Public License for more
018 details.
019 You should have received a copy of the GNU Lesser General Public License
020 along with this library; if not, write to the Free Software Foundation, Inc.,
021 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
022
023 Contact information:
024
025 lat/lon GmbH
026 Aennchenstr. 19, 53177 Bonn
027 Germany
028 http://lat-lon.de/
029
030 Department of Geography, University of Bonn
031 Prof. Dr. Klaus Greve
032 Postfach 1147, 53001 Bonn
033 Germany
034 http://www.geographie.uni-bonn.de/deegree/
035
036 e-mail: info@deegree.org
037 ----------------------------------------------------------------------------*/
038 package org.deegree.model.filterencoding.capabilities;
039
040 import java.io.IOException;
041 import java.net.URL;
042 import java.util.List;
043
044 import org.deegree.datatypes.QualifiedName;
045 import org.deegree.framework.xml.XMLFragment;
046 import org.deegree.framework.xml.XMLParsingException;
047 import org.deegree.framework.xml.XMLTools;
048 import org.deegree.ogcwebservices.getcapabilities.UnknownOperatorNameException;
049 import org.w3c.dom.Element;
050 import org.w3c.dom.Node;
051 import org.xml.sax.SAXException;
052
053 /**
054 *
055 *
056 *
057 * @version $Revision: 18195 $
058 * @author <a href="mailto:poth@lat-lon.de">Andreas Poth</a>
059 * @author last edited by: $Author: mschneider $
060 *
061 * @version 1.0. $Revision: 18195 $, $Date: 2009-06-18 17:55:39 +0200 (Do, 18. Jun 2009) $
062 *
063 * @since 2.0
064 */
065 public class FilterCapabilities110Fragment extends XMLFragment {
066
067 private static final long serialVersionUID = -5371910986551767458L;
068
069 /**
070 * Creates a new <code>FilterCapabilities110Fragment</code> from the given parameters.
071 *
072 * @param url
073 * @throws SAXException
074 * @throws IOException
075 */
076 public FilterCapabilities110Fragment( URL url ) throws IOException, SAXException {
077 super( url );
078 }
079
080 /**
081 * Creates a new <code>FilterCapabilities110Fragment</code> from the given parameters.
082 *
083 * @param element
084 * @param systemId
085 */
086 public FilterCapabilities110Fragment( Element element, URL systemId ) {
087 super( element );
088 setSystemId( systemId );
089 }
090
091 /**
092 * Returns the object representation for the <code>ogc:Filter_Capabilities</code> root
093 * element.
094 *
095 * @return object representation for the given <code>ogc:Filter_Capabilities</code> element
096 * @throws XMLParsingException
097 */
098 public FilterCapabilities parseFilterCapabilities()
099 throws XMLParsingException {
100 return new FilterCapabilities(
101 parseScalarCapabilities( (Element) XMLTools.getRequiredNode(
102 getRootElement(),
103 "ogc:Scalar_Capabilities",
104 nsContext ) ),
105 parseSpatialCapabilities( (Element) XMLTools.getRequiredNode(
106 getRootElement(),
107 "ogc:Spatial_Capabilities",
108 nsContext ) ),
109 parseIdCapabilities( (Element) XMLTools.getRequiredNode( getRootElement(),
110 "ogc:Id_Capabilities",
111 nsContext ) ) );
112 }
113
114 /**
115 * Returns the object representation for an <code>ogc:Spatial_Capabilities</code> element that
116 * is compliant to the <code>OpenGIS Filter Encoding Specification 1.1.0</code>.
117 *
118 * @return object representation for the given <code>ogc:Spatial_Capabilities</code> element
119 * @throws XMLParsingException
120 */
121 private SpatialCapabilities parseSpatialCapabilities( Element spatialElement )
122 throws XMLParsingException {
123
124 List<Node> geometryOperandList = XMLTools.getNodes( spatialElement,
125 "ogc:GeometryOperands/ogc:GeometryOperand/text()",
126 nsContext );
127 QualifiedName[] geometryOperands = new QualifiedName[geometryOperandList.size()];
128 for ( int i = 0; i < geometryOperands.length; i++ ) {
129 geometryOperands[i] = XMLFragment.parseQualifiedName( geometryOperandList.get( i ) );
130 }
131 String[] operatorNames = XMLTools.getNodesAsStrings( spatialElement,
132 "ogc:SpatialOperators/ogc:SpatialOperator/@name",
133 nsContext );
134 SpatialOperator[] spatialOperators = new SpatialOperator[operatorNames.length];
135 for ( int i = 0; i < operatorNames.length; i++ ) {
136 try {
137 spatialOperators[i] = OperatorFactory110.createSpatialOperator( operatorNames[i] );
138 } catch ( UnknownOperatorNameException e ) {
139 throw new XMLParsingException( "Invalid operator name '" + operatorNames[i]
140 + "' for spatial operator: " + e.getMessage(), e );
141 }
142 }
143 return new SpatialCapabilities( spatialOperators, geometryOperands );
144 }
145
146 /**
147 * Returns the object representation for an <code>ogc:Scalar_Capabilities</code> element that
148 * is compliant to the <code>OpenGIS Filter Encoding Specification 1.1.0</code>.
149 *
150 * @return object representation for the given <code>ogc:Scalar_Capabilities</code> element
151 * @throws XMLParsingException
152 */
153 private ScalarCapabilities parseScalarCapabilities( Element element )
154 throws XMLParsingException {
155
156 boolean supportsLogicalOperators = XMLTools.getNode( element, "ogc:LogicalOperators", nsContext ) != null ? true
157 : false;
158 Operator[] comparisonOperators = null;
159 Operator[] arithmeticOperators = null;
160
161 Element comparisonOperatorsElement = (Element) XMLTools.getNode( element, "ogc:ComparisonOperators", nsContext );
162 if ( comparisonOperatorsElement != null ) {
163 String[] operatorNames = XMLTools.getNodesAsStrings( comparisonOperatorsElement,
164 "ogc:ComparisonOperator/text()", nsContext );
165 comparisonOperators = new Operator[operatorNames.length];
166 for ( int i = 0; i < operatorNames.length; i++ ) {
167 try {
168 comparisonOperators[i] = OperatorFactory110.createComparisonOperator( operatorNames[i] );
169 } catch ( UnknownOperatorNameException e ) {
170 throw new XMLParsingException( "Invalid operator name '" + operatorNames[i]
171 + "' for comparison operator: " + e.getMessage(), e );
172 }
173 }
174 }
175
176 Element arithmeticOperatorsElement = (Element) XMLTools.getNode( element, "ogc:ArithmeticOperators", nsContext );
177 if ( arithmeticOperatorsElement != null ) {
178 XMLTools.getRequiredNode( arithmeticOperatorsElement, "ogc:SimpleArithmetic", nsContext );
179 List<Element> functionNameElementList = XMLTools.getElements(
180 arithmeticOperatorsElement,
181 "ogc:Functions/ogc:FunctionNames/ogc:FunctionName",
182 nsContext );
183 arithmeticOperators = new Function[functionNameElementList.size()];
184 for ( int i = 0; i < arithmeticOperators.length; i++ ) {
185 arithmeticOperators[i] = parseFunction( functionNameElementList.get( i ) );
186 }
187 }
188 return new ScalarCapabilities( supportsLogicalOperators, comparisonOperators, arithmeticOperators );
189 }
190
191 /**
192 * Returns the object representation for an <code>ogc:Id_Capabilities</code> element that is
193 * compliant to the <code>OpenGIS Filter Encoding Specification 1.1.0</code>.
194 *
195 * @return object representation for the given <code>ogc:Id_Capabilities</code> element
196 * @throws XMLParsingException
197 */
198 private IdCapabilities parseIdCapabilities( Element element )
199 throws XMLParsingException {
200 List<Element> eidList = XMLTools.getElements( element, "ogc:EID", nsContext );
201 Element[] eidElements = new Element[eidList.size()];
202 for ( int i = 0; i < eidElements.length; i++ ) {
203 eidElements[i] = eidList.get( i );
204 }
205 List<Element> fidList = XMLTools.getElements( element, "ogc:FID", nsContext );
206 Element[] fidElements = new Element[fidList.size()];
207 for ( int i = 0; i < fidElements.length; i++ ) {
208 fidElements[i] = fidList.get( i );
209 }
210 return new IdCapabilities( eidElements, fidElements );
211 }
212
213 private Function parseFunction( Element element )
214 throws XMLParsingException {
215 String name = XMLTools.getRequiredNodeAsString( element, "text()", nsContext );
216 int nArgs = XMLTools.getRequiredNodeAsInt( element, "@nArgs", nsContext );
217 return new Function( name, nArgs );
218 }
219 /*
220 * private Operator parseSpatialOperator( Element element ) throws XMLParsingException { String
221 * name = XMLTools.getRequiredNodeAsString( element, "@name", nsContext ); List
222 * geometryOperandList = XMLTools.getNodes( element, "GeometryOperand/text()", nsContext );
223 * QualifiedName[] operands = new QualifiedName[geometryOperandList.size()]; for ( int i = 0; i <
224 * operands.length; i++ ) { operands[i] = XMLFragment.parseQualifiedName( (Node)
225 * geometryOperandList.get( i ) ); } return new SpatialOperator( name, operands ); }
226 */
227 }