001 //$HeadURL: svn+ssh://jwilden@svn.wald.intevation.org/deegree/base/branches/2.5_testing/src/org/deegree/owscommon_new/OWSCommonCapabilitiesDocument.java $
002 /*----------------------------------------------------------------------------
003 This file is part of deegree, http://deegree.org/
004 Copyright (C) 2001-2009 by:
005 Department of Geography, University of Bonn
006 and
007 lat/lon GmbH
008
009 This library is free software; you can redistribute it and/or modify it under
010 the terms of the GNU Lesser General Public License as published by the Free
011 Software Foundation; either version 2.1 of the License, or (at your option)
012 any later version.
013 This library is distributed in the hope that it will be useful, but WITHOUT
014 ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS
015 FOR A PARTICULAR PURPOSE. See the GNU Lesser General Public License for more
016 details.
017 You should have received a copy of the GNU Lesser General Public License
018 along with this library; if not, write to the Free Software Foundation, Inc.,
019 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
020
021 Contact information:
022
023 lat/lon GmbH
024 Aennchenstr. 19, 53177 Bonn
025 Germany
026 http://lat-lon.de/
027
028 Department of Geography, University of Bonn
029 Prof. Dr. Klaus Greve
030 Postfach 1147, 53001 Bonn
031 Germany
032 http://www.geographie.uni-bonn.de/deegree/
033
034 e-mail: info@deegree.org
035 ----------------------------------------------------------------------------*/
036 package org.deegree.owscommon_new;
037
038 import java.net.URI;
039 import java.net.URISyntaxException;
040 import java.util.ArrayList;
041 import java.util.Arrays;
042 import java.util.Date;
043 import java.util.List;
044 import java.util.Map;
045
046 import org.deegree.datatypes.Code;
047 import org.deegree.datatypes.QualifiedName;
048 import org.deegree.datatypes.values.TypedLiteral;
049 import org.deegree.datatypes.xlink.SimpleLink;
050 import org.deegree.framework.xml.XMLFragment;
051 import org.deegree.framework.xml.XMLParsingException;
052 import org.deegree.framework.xml.XMLTools;
053 import org.deegree.model.metadata.iso19115.CitedResponsibleParty;
054 import org.deegree.model.metadata.iso19115.Constraints;
055 import org.deegree.model.metadata.iso19115.ISO19115Document;
056 import org.deegree.model.metadata.iso19115.Keywords;
057 import org.deegree.model.metadata.iso19115.OnlineResource;
058 import org.deegree.ogcbase.CommonNamespaces;
059 import org.w3c.dom.Element;
060
061 /**
062 * <code>OWSCommonCapabilitiesDocument</code> is the parser class for the
063 * <code>OWSCommonCapabilities</code> data class.
064 *
065 * @author <a href="mailto:schmitz@lat-lon.de">Andreas Schmitz</a>
066 * @author last edited by: $Author: mschneider $
067 *
068 * @version 2.0, $Revision: 18195 $, $Date: 2009-06-18 17:55:39 +0200 (Do, 18 Jun 2009) $
069 *
070 * @since 2.0
071 */
072
073 public class OWSCommonCapabilitiesDocument extends XMLFragment {
074
075 private static final long serialVersionUID = 5069379023892304513L;
076
077 private static final String POWS = CommonNamespaces.OWS_PREFIX + ":";
078
079 private ISO19115Document iso = new ISO19115Document();
080
081 /**
082 * @param contents
083 * the service specific contents
084 * @return the data object containing all parsed information.
085 * @throws XMLParsingException
086 */
087 public OWSCommonCapabilities parseCapabilities( Map<String, Content> contents )
088 throws XMLParsingException {
089 Element root = getRootElement();
090
091 String version = XMLTools.getRequiredNodeAsString( root, "@version", nsContext );
092 String updateSequence = XMLTools.getNodeAsString( root, "@updateSequence", nsContext, null );
093
094 Element elem = (Element) XMLTools.getNode( root, POWS + "ServiceIdentification", nsContext );
095 ServiceIdentification serviceIdentification = null;
096 if ( elem != null )
097 serviceIdentification = parseServiceIdentification( elem );
098
099 elem = (Element) XMLTools.getNode( root, POWS + "ServiceProvider", nsContext );
100 ServiceProvider serviceProvider = null;
101 if ( elem != null )
102 serviceProvider = parseServiceProvider( elem );
103
104 OperationsMetadata operationsMetadata = null;
105 elem = (Element) XMLTools.getNode( root, POWS + "OperationsMetadata", nsContext );
106 if ( elem != null )
107 operationsMetadata = parseOperationsMetadata( elem );
108
109 OWSCommonCapabilities capabilities = new OWSCommonCapabilities( version, updateSequence, serviceIdentification,
110 serviceProvider, operationsMetadata, contents );
111 return capabilities;
112 }
113
114 private OperationsMetadata parseOperationsMetadata( Element root )
115 throws XMLParsingException {
116 List<Element> operationElements = XMLTools.getRequiredElements( root, POWS + "Operation", nsContext );
117 if ( operationElements.size() < 2 ) {
118 throw new XMLParsingException( "Too few operations defined in the Operations" + "Metadata element." );
119 }
120
121 List<Operation> operations = new ArrayList<Operation>();
122 for ( Element element : operationElements ) {
123 operations.add( parseOperation( element ) );
124 }
125
126 List<Element> parameterElements = XMLTools.getElements( root, POWS + "Parameter", nsContext );
127 List<Parameter> parameters = new ArrayList<Parameter>();
128
129 for ( Element parameter : parameterElements ) {
130 parameters.add( parseDomainType( parameter, true, true, false, false ) );
131 }
132
133 List<Element> constraintElements = XMLTools.getElements( root, POWS + "Constraint", nsContext );
134 List<DomainType> constraints = new ArrayList<DomainType>();
135
136 for ( Element constraint : constraintElements ) {
137 constraints.add( parseDomainType( constraint, true, true, false, false ) );
138 }
139
140 // extended capabilities are ignored for now
141
142 OperationsMetadata result = new OperationsMetadata( parameters, constraints, operations, null );
143 return result;
144 }
145
146 private Operation parseOperation( Element root )
147 throws XMLParsingException {
148 QualifiedName name = XMLTools.getRequiredNodeAsQualifiedName( root, "@name", nsContext );
149
150 List<DCP> dcps = parseDCPs( root );
151
152 List<Element> parameterElements = XMLTools.getElements( root, POWS + "Parameter", nsContext );
153 List<Parameter> parameters = new ArrayList<Parameter>();
154
155 for ( Element parameter : parameterElements )
156 parameters.add( parseDomainType( parameter, true, true, false, false ) );
157
158 List<Element> constraintElements = XMLTools.getElements( root, POWS + "Constraint", nsContext );
159 List<DomainType> constraints = new ArrayList<DomainType>();
160
161 for ( Element constraint : constraintElements )
162 constraints.add( parseDomainType( constraint, true, true, false, false ) );
163
164 List<Element> metadataElements = XMLTools.getElements( root, POWS + "Metadata", nsContext );
165 List<Metadata> metadatas = new ArrayList<Metadata>();
166
167 for ( Element metadata : metadataElements )
168 metadatas.add( parseMetadata( metadata ) );
169
170 Operation result = new Operation( name, dcps, parameters, constraints, metadatas, "n/a" );
171 return result;
172 }
173
174 // parameter should be the element containing the DCP element
175 private List<DCP> parseDCPs( Element root )
176 throws XMLParsingException {
177 List<DCP> result = new ArrayList<DCP>();
178 List<Element> dcps = XMLTools.getElements( root, POWS + "DCP", nsContext );
179
180 for ( Element dcp : dcps )
181 result.add( parseHTTP( dcp ) );
182
183 return result;
184 }
185
186 private HTTP parseHTTP( Element root )
187 throws XMLParsingException {
188
189 List<Element> get = XMLTools.getElements( root, POWS + "HTTP/" + POWS + "Get", nsContext );
190 List<Element> post = XMLTools.getElements( root, POWS + "HTTP/" + POWS + "Post", nsContext );
191
192 if ( ( get.size() + post.size() ) == 0 )
193 throw new XMLParsingException( "At least one of Get or Post " + "must be specified under DCP/HTTP." );
194
195 List<HTTP.Type> types = new ArrayList<HTTP.Type>();
196 List<OnlineResource> links = new ArrayList<OnlineResource>();
197 List<List<DomainType>> constraints = new ArrayList<List<DomainType>>();
198
199 for ( Element elem : get ) {
200 OnlineResource link = iso.parseOnlineResource( elem );
201 List<Element> constraintElements = XMLTools.getElements( elem, POWS + "Constraint", nsContext );
202 List<DomainType> myConstr = new ArrayList<DomainType>();
203 for ( Element constraint : constraintElements )
204 myConstr.add( parseDomainType( constraint, true, true, false, false ) );
205
206 types.add( HTTP.Type.Get );
207 constraints.add( myConstr );
208 links.add( link );
209 }
210
211 for ( Element elem : post ) {
212 OnlineResource link = iso.parseOnlineResource( elem );
213 List<Element> constraintElements = XMLTools.getElements( elem, POWS + "Constraint", nsContext );
214 List<DomainType> myConstr = new ArrayList<DomainType>();
215 for ( Element constraint : constraintElements )
216 myConstr.add( parseDomainType( constraint, true, true, false, false ) );
217
218 types.add( HTTP.Type.Post );
219 constraints.add( myConstr );
220 links.add( link );
221 }
222
223 return new HTTP( links, constraints, types );
224 }
225
226 private Metadata parseMetadata( Element root )
227 throws XMLParsingException {
228 SimpleLink link = parseSimpleLink( root );
229 URI about = XMLTools.getNodeAsURI( root, "@about", nsContext, null );
230 return new Metadata( link, about, null );
231 }
232
233 private DomainType parseDomainType( Element root, boolean optional, boolean repeatable, boolean noValuesAllowed,
234 boolean anyValueAllowed )
235 throws XMLParsingException {
236 String[] valueArray = XMLTools.getRequiredNodesAsStrings( root, POWS + "Value", nsContext );
237 List<TypedLiteral> values = new ArrayList<TypedLiteral>();
238 URI stringURI = null;
239 try {
240 stringURI = new URI( null, "String", null );
241 } catch ( URISyntaxException e ) {
242 // cannot happen, why do I have to catch this?
243 }
244 for ( String value : valueArray )
245 values.add( new TypedLiteral( value, stringURI ) );
246
247 List<Element> metadataElements = XMLTools.getElements( root, POWS + "Metadata", nsContext );
248 List<Metadata> metadata = new ArrayList<Metadata>();
249
250 for ( Element element : metadataElements )
251 metadata.add( parseMetadata( element ) );
252
253 QualifiedName name = XMLTools.getRequiredNodeAsQualifiedName( root, "@name", nsContext );
254
255 DomainType result = new DomainType( optional, repeatable, "n/a", 0, name, values, null, null, anyValueAllowed,
256 null, noValuesAllowed, null, null, null, metadata );
257 return result;
258 }
259
260 private ServiceProvider parseServiceProvider( Element root )
261 throws XMLParsingException {
262 String providerName = XMLTools.getRequiredNodeAsString( root, POWS + "ProviderName", nsContext );
263
264 OnlineResource providerSite = null;
265 Element siteElement = (Element) XMLTools.getNode( root, POWS + "ProviderSite", nsContext );
266 if ( siteElement != null )
267 providerSite = iso.parseOnlineResource( siteElement );
268
269 Element partyElement = (Element) XMLTools.getRequiredNode( root, POWS + "ServiceContact", nsContext );
270 CitedResponsibleParty party = iso.parseCitedResponsibleParty( partyElement );
271
272 ServiceProvider result = new ServiceProvider( providerName, providerSite, party );
273 return result;
274 }
275
276 private ServiceIdentification parseServiceIdentification( Element root )
277 throws XMLParsingException {
278 Element elem = (Element) XMLTools.getRequiredNode( root, POWS + "ServiceType", nsContext );
279 Code serviceType = iso.parseCode( elem );
280
281 List<String> versions = Arrays.asList( XMLTools.getRequiredNodesAsStrings( root, POWS + "ServiceTypeVersion",
282 nsContext ) );
283
284 String fee = XMLTools.getNodeAsString( root, POWS + "Fees", nsContext, null );
285
286 List<Element> constraintElements = XMLTools.getElements( root, POWS + "AccessConstraints", nsContext );
287 List<Constraints> constraints = new ArrayList<Constraints>();
288
289 for ( Element constraint : constraintElements )
290 constraints.add( iso.parseConstraint( constraint, fee ) );
291
292 String title = XMLTools.getNodeAsString( root, POWS + "Title", nsContext, null );
293 String abstractString = XMLTools.getNodeAsString( root, POWS + "Abstract", nsContext, null );
294
295 List<Element> keywordsElements = XMLTools.getElements( root, POWS + "Keywords", nsContext );
296 List<Keywords> keywords = new ArrayList<Keywords>();
297 for ( Element keyword : keywordsElements )
298 keywords.add( iso.parseKeywords( keyword ) );
299
300 // the next one is an extension
301 List<String> alternativeTitles = Arrays.asList( XMLTools.getNodesAsStrings( root, POWS + "AlternateTitle",
302 nsContext ) );
303
304 Date date = new Date( System.currentTimeMillis() );
305
306 String identification = title;
307
308 ServiceIdentification result = new ServiceIdentification( serviceType, versions, title, alternativeTitles,
309 date, identification, abstractString, keywords,
310 constraints );
311 return result;
312 }
313
314 }