001 // $HeadURL:
002 // /cvsroot/deegree/src/org/deegree/ogcwebservices/getcapabilities/CapabilitiesDocument.java,v
003 // 1.7 2004/06/22 13:25:14 ap 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.ogcwebservices.getcapabilities;
039
040 import java.net.MalformedURLException;
041 import java.net.URI;
042 import java.net.URISyntaxException;
043 import java.net.URL;
044
045 import org.deegree.framework.util.StringTools;
046 import org.deegree.framework.xml.ElementList;
047 import org.deegree.framework.xml.XMLParsingException;
048 import org.deegree.framework.xml.XMLTools;
049 import org.deegree.ogcbase.CommonNamespaces;
050 import org.deegree.ogcwebservices.ExceptionFormat;
051 import org.deegree.ogcwebservices.MetadataLink;
052 import org.deegree.ogcwebservices.MetadataType;
053 import org.w3c.dom.Element;
054 import org.w3c.dom.Node;
055
056 /**
057 *
058 * @author <a href="mailto:poth@lat-lon.de">Andreas Poth </a>
059 *
060 * @author last edited by: $Author: mschneider $
061 *
062 * @version 1.0. $Revision: 18195 $, $Date: 2009-06-18 17:55:39 +0200 (Do, 18 Jun 2009) $
063 *
064 * @since 2.0
065 */
066 public abstract class OGCStandardCapabilitiesDocument extends OGCCapabilitiesDocument {
067
068 protected static final URI OGCNS = CommonNamespaces.OGCNS;
069
070 protected static final URI GMLNS = CommonNamespaces.GMLNS;
071
072 /**
073 * returns the value of the version attribute of the capabilities document
074 *
075 * @return the value of the version attribute of the capabilities document
076 */
077 @Override
078 public String parseVersion() {
079 return this.getRootElement().getAttribute( "version" );
080 }
081
082 /**
083 * returns the service section of the configuration/capabilities. vendorspecific capabilities
084 * are not supported yet
085 *
086 * @param namespaceURI
087 *
088 * @return the service section of the configuration/capabilities. vendorspecific capabilities
089 * are not supported yet
090 * @throws InvalidCapabilitiesException
091 */
092 public Capability getCapabilitySection( URI namespaceURI )
093 throws InvalidCapabilitiesException {
094 try {
095 Node root = this.getRootElement();
096
097 Element element = XMLTools.getRequiredChildElement( "Capability", namespaceURI, root );
098 Element elem = XMLTools.getRequiredChildElement( "Request", namespaceURI, element );
099 OperationsMetadata request = parseOperations( elem, namespaceURI );
100
101 elem = XMLTools.getRequiredChildElement( "Exception", namespaceURI, element );
102 ExceptionFormat eFormat = getExceptionFormat( elem, namespaceURI );
103
104 // vendorspecific capabilities are not supported yet
105 // elem = XMLTools.getRequiredChildByName(
106 // "VendorSpecificCapabilities", WCSNS, element);
107
108 String version = element.getAttribute( "version" );
109 if ( version == null || version.equals( "" ) ) {
110 version = this.parseVersion();
111 }
112 String updateSequence = element.getAttribute( "updateSequence" );
113 if ( updateSequence == null || updateSequence.equals( "" ) ) {
114 updateSequence = this.getRootElement().getAttribute( "updateSequence" );
115 }
116
117 return new Capability( version, updateSequence, request, eFormat, null );
118
119 } catch ( XMLParsingException e ) {
120 String s = e.getMessage();
121 throw new InvalidCapabilitiesException( "Error while parsing the Capability "
122 + "Section of the capabilities\n" + s
123 + StringTools.stackTraceToString( e ) );
124 }
125 }
126
127 /**
128 * creates a <tt>Request</tt> object (instance of WCSCapabilityRequest) from the passed
129 * element encapsulating the Request part of the WCS Capabiliy section
130 *
131 * @param element
132 * @return created <tt>Request</tt>
133 * @throws XMLParsingException
134 */
135 protected abstract OperationsMetadata parseOperations( Element element, URI namespaceURI )
136 throws XMLParsingException;
137
138 /**
139 * creates a <tt>MetadataLink</tt> object from the passed element.
140 *
141 * @param element
142 * @return created <tt>MetadataLink</tt>
143 * @throws XMLParsingException
144 */
145 @Override
146 protected MetadataLink parseMetadataLink( Element element )
147 throws XMLParsingException {
148 if ( element == null )
149 return null;
150
151 try {
152 URL reference = new URL( XMLTools.getAttrValue( element, "xlink:href" ) );
153 String title = XMLTools.getAttrValue( element, "xlink:title" );
154 URI about = new URI( XMLTools.getAttrValue( element, null, "about", null ) );
155 String tmp = XMLTools.getAttrValue( element, null, "metadataType", null );
156 MetadataType metadataType = new MetadataType( tmp );
157 return new MetadataLink( reference, title, about, metadataType );
158 } catch ( MalformedURLException e ) {
159 throw new XMLParsingException( "Couldn't parse metadataLink reference\n"
160 + StringTools.stackTraceToString( e ) );
161 } catch ( URISyntaxException e ) {
162 throw new XMLParsingException( "Couldn't parse metadataLink about\n" + StringTools.stackTraceToString( e ) );
163 }
164 }
165
166 /**
167 * Creates an <tt>ExceptionFormat</tt> instance from the passed element.
168 *
169 * @param element
170 * @return the new instance
171 */
172 protected ExceptionFormat getExceptionFormat( Element element, URI namespaceURI ) {
173 ElementList el = XMLTools.getChildElements( "Format", namespaceURI, element );
174 String[] formats = new String[el.getLength()];
175 for ( int i = 0; i < formats.length; i++ ) {
176 formats[i] = XMLTools.getStringValue( el.item( i ) );
177 }
178 return new ExceptionFormat( formats );
179 }
180
181 /**
182 * Creates a <code>DCPType</code> object from the passed <code>DCPType</code> element.
183 * <p>
184 * NOTE: Currently the <code>OnlineResources</code> included in the <code>DCPType</code> are
185 * just stored as simple <code>URLs</code> (not as <code>OnLineResource</code> instances)!
186 * <p>
187 * NOTE: In an <code>OGCStandardCapabilitiesDocument</code> the <code>XLinks</code> (the
188 * <code>URLs</code>) are stored in separate elements (<code>OnlineResource</code>), in
189 * an <code>OGCCommonCapabilitiesDocument</code> they are the
190 * <code>Get<code>/<code>Post</code> elements themselves.
191 *
192 * @param element
193 * @param namespaceURI
194 * @return created <code>DCPType</code>
195 * @throws XMLParsingException
196 * @see org.deegree.owscommon.OWSCommonCapabilities
197 */
198 protected DCPType getDCPType( Element element, URI namespaceURI )
199 throws XMLParsingException {
200 try {
201 Element elem = XMLTools.getRequiredChildElement( "HTTP", namespaceURI, element );
202 ElementList el = XMLTools.getChildElements( "Get", namespaceURI, elem );
203
204 URL[] get = new URL[el.getLength()];
205 for ( int i = 0; i < get.length; i++ ) {
206 Element ell = XMLTools.getRequiredChildElement( "OnlineResource", namespaceURI, el.item( i ) );
207 String s = XMLTools.getRequiredAttrValue( "href", XLNNS, ell );
208 get[i] = new URL( s );
209 }
210 el = XMLTools.getChildElements( "Post", namespaceURI, elem );
211
212 URL[] post = new URL[el.getLength()];
213 for ( int i = 0; i < post.length; i++ ) {
214 Element ell = XMLTools.getRequiredChildElement( "OnlineResource", namespaceURI, el.item( i ) );
215 String s = XMLTools.getRequiredAttrValue( "href", XLNNS, ell );
216 post[i] = new URL( s );
217 }
218 Protocol protocol = new HTTP( get, post );
219 return new DCPType( protocol );
220 } catch ( MalformedURLException e ) {
221 throw new XMLParsingException( "Couldn't parse DCPType onlineresoure URL about\n"
222 + StringTools.stackTraceToString( e ) );
223 }
224 }
225
226 /**
227 * Creates an array of <code>DCPType</code> objects from the passed element list.
228 *
229 * NOTE: Currently the <code>OnlineResources</code> included in the <code>DCPType</code> are
230 * just stored as simple <code>URLs</code> (not as <code>OnLineResource</code> instances)!
231 *
232 * @param el
233 * @param namespaceURI
234 * @return the dcp types
235 * @throws XMLParsingException
236 */
237 protected DCPType[] getDCPTypes( ElementList el, URI namespaceURI )
238 throws XMLParsingException {
239 DCPType[] dcpTypes = new DCPType[el.getLength()];
240 for ( int i = 0; i < dcpTypes.length; i++ ) {
241 dcpTypes[i] = getDCPType( el.item( i ), namespaceURI );
242 }
243 return dcpTypes;
244 }
245 }