001 // $HeadURL: svn+ssh://jwilden@svn.wald.intevation.org/deegree/base/branches/2.5_testing/src/org/deegree/ogcwebservices/wcs/getcapabilities/WCSCapabilitiesDocument.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.ogcwebservices.wcs.getcapabilities; 037 038 import java.io.IOException; 039 import java.net.URI; 040 import java.net.URL; 041 042 import org.deegree.datatypes.CodeList; 043 import org.deegree.framework.util.StringTools; 044 import org.deegree.framework.xml.ElementList; 045 import org.deegree.framework.xml.XMLParsingException; 046 import org.deegree.framework.xml.XMLTools; 047 import org.deegree.model.metadata.iso19115.Address; 048 import org.deegree.model.metadata.iso19115.CitedResponsibleParty; 049 import org.deegree.model.metadata.iso19115.ContactInfo; 050 import org.deegree.model.metadata.iso19115.Keywords; 051 import org.deegree.model.metadata.iso19115.OnlineResource; 052 import org.deegree.model.metadata.iso19115.Phone; 053 import org.deegree.ogcbase.CommonNamespaces; 054 import org.deegree.ogcbase.OGCException; 055 import org.deegree.ogcwebservices.LonLatEnvelope; 056 import org.deegree.ogcwebservices.MetadataLink; 057 import org.deegree.ogcwebservices.OGCWebServiceException; 058 import org.deegree.ogcwebservices.getcapabilities.Capability; 059 import org.deegree.ogcwebservices.getcapabilities.DCPType; 060 import org.deegree.ogcwebservices.getcapabilities.InvalidCapabilitiesException; 061 import org.deegree.ogcwebservices.getcapabilities.OGCCapabilities; 062 import org.deegree.ogcwebservices.getcapabilities.OGCStandardCapabilitiesDocument; 063 import org.deegree.ogcwebservices.getcapabilities.Operation; 064 import org.deegree.ogcwebservices.getcapabilities.OperationsMetadata; 065 import org.deegree.ogcwebservices.getcapabilities.Service; 066 import org.deegree.ogcwebservices.wcs.CoverageOfferingBrief; 067 import org.w3c.dom.DOMException; 068 import org.w3c.dom.Element; 069 import org.xml.sax.SAXException; 070 071 /** 072 * 073 * 074 * @version $Revision: 18195 $ 075 * @author <a href="mailto:poth@lat-lon.de">Andreas Poth </a> 076 * @author last edited by: $Author: mschneider $ 077 * 078 * @version 1.0. $Revision: 18195 $, $Date: 2009-06-18 17:55:39 +0200 (Do, 18 Jun 2009) $ 079 * 080 * @since 2.0 081 */ 082 public class WCSCapabilitiesDocument extends OGCStandardCapabilitiesDocument { 083 084 /** 085 * 086 */ 087 private static final long serialVersionUID = -8934399061168275172L; 088 089 /** 090 * the WCSCapabilities xml template filename 091 */ 092 public static final String XML_TEMPLATE = "WCSCapabilitiesTemplate.xml"; 093 094 /** 095 * WCS namespace 096 */ 097 protected static URI WCSNS = CommonNamespaces.WCSNS; 098 099 /** 100 * deegree WCS namespace 101 */ 102 protected static URI DGRNS = CommonNamespaces.DEEGREEWCS; 103 104 /** 105 * @throws IOException 106 * @throws SAXException 107 */ 108 public void createEmptyDocument() 109 throws IOException, SAXException { 110 URL url = WCSCapabilitiesDocument.class.getResource( XML_TEMPLATE ); 111 if ( url == null ) { 112 throw new IOException( "The resource '" + XML_TEMPLATE + " could not be found." ); 113 } 114 load( url ); 115 } 116 117 /* (non-Javadoc) 118 * @see org.deegree.ogcwebservices.getcapabilities.OGCCapabilitiesDocument#parseCapabilities() 119 */ 120 @Override 121 public OGCCapabilities parseCapabilities() 122 throws InvalidCapabilitiesException { 123 String version = parseVersion(); 124 String updateSeq = parseUpdateSequence(); 125 Service service = parseServiceSection(); 126 Capability capabilitiy = getCapabilitySection( WCSNS ); 127 ContentMetadata contentMetadata = parseContentMetadataSection(); 128 return new WCSCapabilities( version, updateSeq, service, capabilitiy, contentMetadata ); 129 } 130 131 /** 132 * returns the service section of the WCS configuration/capabilities 133 * 134 * @return created <tt>CapabilitiesService</tt> 135 * @throws InvalidCapabilitiesException 136 */ 137 public Service parseServiceSection() 138 throws InvalidCapabilitiesException { 139 try { 140 Element element = XMLTools.getRequiredChildElement( "Service", WCSNS, getRootElement() ); 141 Element elem = XMLTools.getChildElement( "metadataLink", WCSNS, element ); 142 MetadataLink mLink = parseMetadataLink( elem ); 143 String desc = XMLTools.getStringValue( "description", WCSNS, element, null ); 144 String name = XMLTools.getRequiredStringValue( "name", WCSNS, element ); 145 String label = XMLTools.getRequiredStringValue( "label", WCSNS, element ); 146 ElementList el = XMLTools.getChildElements( "keywords", WCSNS, element ); 147 Keywords[] keywords = parseKeywords( el, WCSNS ); 148 elem = XMLTools.getChildElement( "responsibleParty", WCSNS, element ); 149 CitedResponsibleParty crp = parseResponsibleParty( elem ); 150 elem = XMLTools.getChildElement( "fees", WCSNS, element ); 151 CodeList fees = parseCodeList( elem ); 152 el = XMLTools.getChildElements( "accessConstraints", WCSNS, element ); 153 CodeList[] accessConstraints = parseCodeListArray( el ); 154 155 String version = element.getAttribute( "version" ); 156 if ( version == null || version.equals( "" ) ) { 157 version = this.parseVersion(); 158 } 159 String updateSequence = element.getAttribute( "updateSequence" ); 160 if ( updateSequence == null || updateSequence.equals( "" ) ) { 161 updateSequence = this.getRootElement().getAttribute( "updateSequence" ); 162 } 163 164 Service service = new Service( desc, name, mLink, label, keywords, crp, fees, accessConstraints, version, 165 updateSequence ); 166 return service; 167 } catch ( XMLParsingException e ) { 168 String s = e.getMessage(); 169 throw new InvalidCapabilitiesException( "Error while parsing the Service Section " 170 + "of the WCS capabilities\n" + s 171 + StringTools.stackTraceToString( e ) ); 172 } catch ( DOMException e ) { 173 String s = e.getMessage(); 174 throw new InvalidCapabilitiesException( "Error handling the DOM object of the " 175 + "Service Section of the WCS capabilities\n" + s 176 + StringTools.stackTraceToString( e ) ); 177 } catch ( OGCException e ) { 178 String s = e.getMessage(); 179 throw new InvalidCapabilitiesException( "Error initializing the Service object from " 180 + "the Service Section of the WCS capabilities\n" + s 181 + StringTools.stackTraceToString( e ) ); 182 } 183 } 184 185 /** 186 * returns the contentMetadata section of the WCS configuration/capabilities 187 * 188 * @return the content metadata 189 * @throws InvalidCapabilitiesException 190 */ 191 public ContentMetadata parseContentMetadataSection() 192 throws InvalidCapabilitiesException { 193 try { 194 Element element = XMLTools.getRequiredChildElement( "ContentMetadata", WCSNS, getRootElement() ); 195 ElementList el = XMLTools.getChildElements( "CoverageOfferingBrief", WCSNS, element ); 196 CoverageOfferingBrief[] cob = parseCoverageOfferingBrief( el ); 197 198 String version = element.getAttribute( "version" ); 199 if ( version == null || version.equals( "" ) ) { 200 version = this.parseVersion(); 201 } 202 String updateSequence = element.getAttribute( "updateSequence" ); 203 if ( updateSequence == null || updateSequence.equals( "" ) ) { 204 updateSequence = this.getRootElement().getAttribute( "updateSequence" ); 205 } 206 207 return new ContentMetadata( version, updateSequence, cob ); 208 } catch ( XMLParsingException e ) { 209 String s = e.getMessage(); 210 throw new InvalidCapabilitiesException( "Error while parsing the ContentMetadata " 211 + "Section of the WCS capabilities\n" + s 212 + StringTools.stackTraceToString( e ) ); 213 } catch ( OGCException e ) { 214 String s = e.getMessage(); 215 throw new InvalidCapabilitiesException( "Error while parsing the ContentMetadata " 216 + "Section of the WCS capabilities\n" + s 217 + StringTools.stackTraceToString( e ) ); 218 } 219 } 220 221 /** 222 * creates a <tt>CitedResponsibleParty</tt> object from the passed element 223 * 224 * @param element 225 * @return the cited responsible party 226 * @throws XMLParsingException 227 */ 228 private CitedResponsibleParty parseResponsibleParty( Element element ) 229 throws XMLParsingException { 230 if ( element == null ) 231 return null; 232 String indName = XMLTools.getStringValue( "individualName", WCSNS, element, null ); 233 String orgName = XMLTools.getStringValue( "organisationName", WCSNS, element, null ); 234 String posName = XMLTools.getStringValue( "positionName", WCSNS, element, null ); 235 Element elem = XMLTools.getChildElement( "contactInfo", WCSNS, element ); 236 ContactInfo contactInfo = parseContactInfo( elem ); 237 return new CitedResponsibleParty( new ContactInfo[] { contactInfo }, new String[] { indName }, 238 new String[] { orgName }, new String[] { posName }, null ); 239 } 240 241 /** 242 * creates a <tt>ContactInfo</tt> object from the passed element 243 * 244 * @param element 245 * @return the contact information 246 * @throws XMLParsingException 247 */ 248 private ContactInfo parseContactInfo( Element element ) 249 throws XMLParsingException { 250 if ( element == null ) 251 return null; 252 Element elem = XMLTools.getChildElement( "phone", WCSNS, element ); 253 Phone phone = parsePhone( elem ); 254 elem = XMLTools.getChildElement( "address", WCSNS, element ); 255 Address addr = parseAddress( elem, WCSNS ); 256 elem = XMLTools.getChildElement( "onlineResource", WCSNS, element ); 257 OnlineResource olr = parseOnLineResource( elem ); 258 return new ContactInfo( addr, null, null, olr, phone ); 259 } 260 261 /** 262 * Creates an <code>Address</code> instance from the passed element. 263 * 264 * @param element 265 * Address-element 266 * @param namespaceURI 267 * namespace-prefix of all elements 268 * @return the parsed Address 269 */ 270 @Override 271 protected Address parseAddress( Element element, URI namespaceURI ) { 272 ElementList el = XMLTools.getChildElements( "deliveryPoint", namespaceURI, element ); 273 String[] deliveryPoint = new String[el.getLength()]; 274 for ( int i = 0; i < deliveryPoint.length; i++ ) { 275 deliveryPoint[i] = XMLTools.getStringValue( el.item( i ) ); 276 } 277 String city = XMLTools.getStringValue( "city", namespaceURI, element, null ); 278 String adminArea = XMLTools.getStringValue( "administrativeArea", namespaceURI, element, null ); 279 String postalCode = XMLTools.getStringValue( "postalCode", namespaceURI, element, null ); 280 String country = XMLTools.getStringValue( "country", namespaceURI, element, null ); 281 el = XMLTools.getChildElements( "electronicMailAddress", namespaceURI, element ); 282 String[] eMailAddresses = new String[el.getLength()]; 283 for ( int i = 0; i < eMailAddresses.length; i++ ) { 284 eMailAddresses[i] = XMLTools.getStringValue( el.item( i ) ); 285 } 286 return new Address( adminArea, city, country, deliveryPoint, eMailAddresses, postalCode ); 287 } 288 289 /** 290 * creates a <tt>Phone</tt> object from the passed element 291 * 292 * @param element 293 * @return the phone 294 */ 295 private Phone parsePhone( Element element ) { 296 if ( element == null ) 297 return null; 298 ElementList el = XMLTools.getChildElements( "voice", WCSNS, element ); 299 String[] voice = new String[el.getLength()]; 300 for ( int i = 0; i < voice.length; i++ ) { 301 voice[i] = XMLTools.getStringValue( el.item( i ) ); 302 } 303 el = XMLTools.getChildElements( "facsimile", WCSNS, element ); 304 String[] facsimile = new String[el.getLength()]; 305 for ( int i = 0; i < facsimile.length; i++ ) { 306 facsimile[i] = XMLTools.getStringValue( el.item( i ) ); 307 } 308 return new Phone( facsimile, null, null, voice ); 309 } 310 311 /** 312 * creates a <tt>Request</tt> object (instance of WCSCapabilityRequest) from the passed 313 * element encapsulating the Request part of the WCS Capabiliy section 314 * 315 * @param element 316 * @return created <tt>Request</tt> 317 * @throws XMLParsingException 318 */ 319 @Override 320 protected OperationsMetadata parseOperations( Element element, URI namespaceURI ) 321 throws XMLParsingException { 322 323 Element gCapa = XMLTools.getRequiredChildElement( "GetCapabilities", WCSNS, element ); 324 ElementList el = XMLTools.getChildElements( "DCPType", WCSNS, gCapa ); 325 DCPType[] dcp = getDCPTypes( el, WCSNS ); 326 Operation getCapaOperation = new Operation( "GetCapabilities", dcp ); 327 328 Element dCover = XMLTools.getRequiredChildElement( "DescribeCoverage", WCSNS, element ); 329 el = XMLTools.getChildElements( "DCPType", WCSNS, dCover ); 330 dcp = getDCPTypes( el, WCSNS ); 331 Operation descCoverOperation = new Operation( "DescribeCoverage", dcp ); 332 333 Element gCover = XMLTools.getRequiredChildElement( "GetCoverage", WCSNS, element ); 334 el = XMLTools.getChildElements( "DCPType", WCSNS, gCover ); 335 dcp = getDCPTypes( el, WCSNS ); 336 Operation getCoverOperation = new Operation( "GetCoverage", dcp ); 337 338 return new WCSCapabilityOperations( getCapaOperation, descCoverOperation, getCoverOperation ); 339 340 } 341 342 /** 343 * creates an array of <tt>CoverageOfferingBrief</tt> objects from the passed element list 344 * encapsulating all CoverageOfferingBrief parts of the WCS ContentMetadata section 345 * 346 * @param el 347 * @return creates array of <tt>CoverageOfferingBrief</tt> 348 * @throws XMLParsingException 349 * @throws OGCWebServiceException 350 * @throws OGCException 351 */ 352 private CoverageOfferingBrief[] parseCoverageOfferingBrief( ElementList el ) 353 throws XMLParsingException, OGCWebServiceException, OGCException { 354 if ( el == null ) 355 return null; 356 CoverageOfferingBrief[] cob = new CoverageOfferingBrief[el.getLength()]; 357 for ( int i = 0; i < cob.length; i++ ) { 358 cob[i] = parseCoverageOfferingBrief( el.item( i ) ); 359 } 360 return cob; 361 } 362 363 /** 364 * creates a <tt>CoverageOfferingBrief</tt> object from the passed element encapsulating one 365 * CoverageOfferingBrief part of the WCS ContentMetadata section 366 * 367 * @param element 368 * @return created <tt>CoverageOfferingBrief</tt> 369 * @throws XMLParsingException 370 * @throws OGCWebServiceException 371 * @throws OGCException 372 */ 373 protected CoverageOfferingBrief parseCoverageOfferingBrief( Element element ) 374 throws XMLParsingException, OGCWebServiceException, OGCException { 375 Element elem = XMLTools.getChildElement( "metadataLink", WCSNS, element ); 376 MetadataLink mLink = parseMetadataLink( elem ); 377 String desc = XMLTools.getStringValue( "description", WCSNS, element, null ); 378 String name = XMLTools.getRequiredStringValue( "name", WCSNS, element ); 379 String label = XMLTools.getRequiredStringValue( "label", WCSNS, element ); 380 elem = XMLTools.getChildElement( "lonLatEnvelope", WCSNS, element ); 381 LonLatEnvelope llEnv = parseLonLatEnvelope( elem ); 382 ElementList el = XMLTools.getChildElements( "keywords", WCSNS, element ); 383 Keywords[] keywords = parseKeywords( el, WCSNS ); 384 385 return new CoverageOfferingBrief( name, label, desc, mLink, llEnv, keywords, null ); 386 } 387 388 }