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    }