001 // $HeadURL:
002 // /cvsroot/deegree/src/org/deegree/ogcwebservices/csw/capabilities/CatalogCapabilitiesDocument.java,v
003 // 1.22 2004/08/05 15:40:08 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.wass.common;
039
040 import java.io.IOException;
041 import java.net.MalformedURLException;
042 import java.net.URI;
043 import java.net.URISyntaxException;
044 import java.net.URL;
045 import java.util.ArrayList;
046 import java.util.List;
047
048 import org.deegree.datatypes.Code;
049 import org.deegree.datatypes.xlink.SimpleLink;
050 import org.deegree.framework.xml.XMLParsingException;
051 import org.deegree.framework.xml.XMLTools;
052 import org.deegree.i18n.Messages;
053 import org.deegree.model.metadata.iso19115.Keywords;
054 import org.deegree.ogcbase.CommonNamespaces;
055 import org.deegree.ogcwebservices.getcapabilities.DCPType;
056 import org.deegree.ogcwebservices.getcapabilities.InvalidCapabilitiesException;
057 import org.deegree.ogcwebservices.getcapabilities.ServiceIdentification;
058 import org.deegree.ogcwebservices.getcapabilities.ServiceProvider;
059 import org.deegree.owscommon.OWSCommonCapabilitiesDocument;
060 import org.deegree.owscommon.OWSDomainType;
061 import org.deegree.owscommon.OWSMetadata;
062 import org.w3c.dom.Element;
063 import org.w3c.dom.Node;
064 import org.xml.sax.SAXException;
065
066 /**
067 * The owscapabilities 1.0 specification parser. This class is able to parse the changes made in the
068 * ows capabilites specifications 1.0.
069 *
070 *
071 * @author <a href="mailto:bezema@lat-lon.de">Rutger Bezema</a>
072 * @author last edited by: $Author: mschneider $
073 *
074 * @version $Revision: 18195 $, $Date: 2009-06-18 17:55:39 +0200 (Do, 18 Jun 2009) $
075 */
076 public abstract class OWSCapabilitiesBaseDocument_1_0 extends OWSCommonCapabilitiesDocument {
077
078 private static final long serialVersionUID = -3518136831402464466L;
079
080 private static final String PRE = CommonNamespaces.OWS_PREFIX + ":";
081
082 /**
083 * Creates an empty document loaded from the template given.
084 *
085 * @param template
086 * the location/name of the template
087 * @throws IOException
088 * @throws SAXException
089 */
090 public void createEmptyDocument( String template )
091 throws IOException, SAXException {
092 URL url = OWSCapabilitiesBaseDocument_1_0.class.getResource( template );
093 if ( url == null ) {
094 throw new IOException( Messages.getMessage( "WASS_ERROR_RESOURCE_NOT_FOUND", template ) );
095 }
096 load( url );
097 }
098
099 /**
100 * Returns the class representation for the <code>ServiceIdentification</code> section of the
101 * document, according to the ows 1.0 spec.
102 *
103 * @return class representation for the <code>ServiceIdentification</code> section
104 * @throws XMLParsingException
105 */
106 public ServiceIdentification parseServiceIdentification()
107 throws XMLParsingException {
108
109 Element element = (Element) XMLTools.getRequiredNode( getRootElement(), PRE + "ServiceIdentification",
110 nsContext );
111
112 // 'ServiceType' element (mandatory)
113 Element serviceTypeElement = (Element) XMLTools.getRequiredNode( element, PRE + "ServiceType", nsContext );
114 Code serviceType = null;
115 try {
116 String codeSpace = XMLTools.getAttrValue( serviceTypeElement, null, "codeSpace", null );
117 URI uri = codeSpace != null ? new URI( codeSpace ) : null;
118 serviceType = new Code( XMLTools.getStringValue( serviceTypeElement ), uri );
119 } catch ( URISyntaxException e ) {
120 String s = XMLTools.getAttrValue( serviceTypeElement, null, "codeSpace", null );
121 throw new XMLParsingException( Messages.getMessage( "WASS_ERROR_CODESPACE_NOT_URI",
122 new Object[] { s, OWSNS.toString() } ) );
123 }
124
125 // 'ServiceTypeVersion' elements (mandatory)
126 String[] serviceTypeVersions = XMLTools.getRequiredNodeAsStrings( element, PRE + "ServiceTypeVersion",
127 nsContext, ",;" );
128
129 // 'Title' element (optional)
130 String title = XMLTools.getNodeAsString( element, PRE + "Title", nsContext,
131 Messages.getMessage( "WASS_NO_TITLE" ) );
132
133 // 'Abstract' element (optional)
134 String serviceAbstract = XMLTools.getNodeAsString(
135 element,
136 PRE + "Abstract",
137 nsContext,
138 Messages.getMessage( "WASS_NO_ABSTRACT_DOCUMENTATION" ) );
139
140 // 'Keywords' elements (optional)
141 List<Node> keywordsList = XMLTools.getNodes( element, PRE + "Keywords", nsContext );
142 Keywords[] keywords = getKeywords( keywordsList );
143
144 // 'Fees' element (optional)
145 String fees = XMLTools.getNodeAsString( element, PRE + "Fees", nsContext, null );
146
147 // 'AccessConstraints' elements (optional)
148 String[] accessConstraints = XMLTools.getNodesAsStrings( element, PRE + "AccessConstraints", nsContext );
149
150 ServiceIdentification serviceIdentification = new ServiceIdentification( serviceType, serviceTypeVersions,
151 title, serviceAbstract, keywords,
152 fees, accessConstraints );
153 return serviceIdentification;
154 }
155
156 /**
157 * Wrapper to make it consistent.
158 *
159 * @return the ServiceProvider representation
160 * @throws XMLParsingException
161 */
162 public ServiceProvider parseServiceProvider()
163 throws XMLParsingException {
164 return getServiceProvider();
165 }
166
167 /**
168 * @return the OperationsMetada representation
169 * @throws XMLParsingException
170 * @throws InvalidCapabilitiesException
171 * @throws URISyntaxException
172 */
173 public OperationsMetadata_1_0 parseOperationsMetadata()
174 throws XMLParsingException, InvalidCapabilitiesException, URISyntaxException {
175
176 Element root = (Element) XMLTools.getRequiredNode( getRootElement(), PRE + "OperationsMetadata", nsContext );
177
178 ArrayList<Operation_1_0> operations = new ArrayList<Operation_1_0>();
179
180 List<Node> nl = XMLTools.getRequiredNodes( root, PRE + "Operation", nsContext );
181
182 for ( int i = 0; i < nl.size(); ++i ) {
183 operations.add( parseOperation( (Element) nl.get( i ) ) );
184 }
185
186 List<Node> parameterList = XMLTools.getNodes( root, PRE + "Parameter", nsContext );
187 OWSDomainType[] parameters = new OWSDomainType[parameterList.size()];
188 for ( int i = 0; i < parameters.length; i++ ) {
189 parameters[i] = parseOWSDomainType_1_0( (Element) parameterList.get( i ) );
190 }
191
192 List<Node> constraintList = XMLTools.getNodes( root, PRE + "Constraint", nsContext );
193 OWSDomainType[] constraints = new OWSDomainType[constraintList.size()];
194 for ( int i = 0; i < constraints.length; i++ ) {
195 constraints[i] = parseOWSDomainType_1_0( (Element) constraintList.get( i ) );
196 }
197
198 String extendedCapabilities = XMLTools.getNodeAsString( root, PRE + "ExtendedCapabilities", nsContext, null );
199
200 // find the !not specified in the gdinrw! describeuser
201 Operation_1_0 describeUser = null;
202 // and find the GetCapabilities operation too.
203 Operation_1_0 getCapa = null;
204 for ( int i = 0; i < operations.size(); ++i ) {
205 if ( operations.get( i ).getName().equalsIgnoreCase( "describeUser" ) ) {
206 describeUser = operations.get( i );
207 }
208 if ( operations.get( i ).getName().equalsIgnoreCase( "GetCapabilities" ) ) {
209 getCapa = operations.get( i );
210 }
211 }
212
213 if ( getCapa == null ) {
214 throw new InvalidCapabilitiesException(
215 Messages.getMessage(
216 "WASS_ERROR_CAPABILITIES_MISSING_REQUIRED_OPERATION",
217 "GetCapabilities" ) );
218 }
219 if ( describeUser == null ) {
220 throw new InvalidCapabilitiesException(
221 Messages.getMessage(
222 "WASS_ERROR_CAPABILITIES_MISSING_REQUIRED_OPERATION",
223 "DescribeUser" ) );
224 }
225
226 OperationsMetadata_1_0 om = new OperationsMetadata_1_0(
227 operations.toArray( new Operation_1_0[operations.size()] ),
228 parameters, constraints, extendedCapabilities,
229 describeUser, getCapa );
230
231
232
233 return om;
234 }
235
236 /**
237 * @param root
238 * the root node of the Operation xml fragment.
239 * @return The operation representation 1.0 conform
240 * @throws XMLParsingException
241 * @throws URISyntaxException
242 */
243 @SuppressWarnings("unchecked")
244 public Operation_1_0 parseOperation( Element root )
245 throws XMLParsingException, URISyntaxException {
246
247 DCPType[] dcps = getDCPs( XMLTools.getRequiredElements( root, PRE + "DCP", nsContext ) );
248
249 String name = XMLTools.getAttrValue( root, null, "name", null );
250
251 List parameterList = XMLTools.getNodes( root, PRE + "Parameter", nsContext );
252 OWSDomainType[] parameters = new OWSDomainType[parameterList.size()];
253 for ( int i = 0; i < parameters.length; i++ ) {
254 parameters[i] = parseOWSDomainType_1_0( (Element) parameterList.get( i ) );
255 }
256
257 List constraintList = XMLTools.getNodes( root, PRE + "Constraint", nsContext );
258 OWSDomainType[] constraints = new OWSDomainType[constraintList.size()];
259 for ( int i = 0; i < constraints.length; i++ ) {
260 constraints[i] = parseOWSDomainType_1_0( (Element) constraintList.get( i ) );
261 }
262
263 List metadata = XMLTools.getNodes( root, PRE + "Metadata", nsContext );
264
265 ArrayList<OWSMetadata> metadatas = new ArrayList<OWSMetadata>();
266
267 for ( int i = 0; i < metadata.size(); ++i ) {
268 metadatas.add( parseOWSMetadata( (Element) metadata.get( i ), name ) );
269 }
270
271 Operation_1_0 operation = new Operation_1_0(
272 name,
273 dcps,
274 parameters,
275 constraints,
276 (OWSMetadata[]) metadata.toArray( new OWSMetadata[metadata.size()] ) );
277
278
279 return operation;
280 }
281
282 private OWSMetadata parseOWSMetadata( Element root, String name )
283 throws XMLParsingException, URISyntaxException {
284
285 SimpleLink link = parseSimpleLink( root );
286 URI about = new URI( XMLTools.getAttrValue( root, null, "about", null ) );
287
288 // TODO: find out real name
289 OWSMetadata md = new OWSMetadata( about, link, name );
290
291 return md;
292 }
293
294 /**
295 * @param element
296 * The element to get the Domaintype from.
297 * @return the OWSDomainType representation.
298 * @throws XMLParsingException
299 *
300 */
301 private OWSDomainType parseOWSDomainType_1_0( Element element )
302 throws XMLParsingException {
303 return getOWSDomainType( null, element );
304 }
305
306 /**
307 * @param nameSpace
308 * The namespace of the supportedauthenticationlist should be wss or was
309 * @return ArrayList<SupportedAuthenticationMethod>
310 * @throws XMLParsingException
311 * @throws MalformedURLException
312 */
313 public ArrayList<SupportedAuthenticationMethod> parseSupportedAuthenticationMethods( String nameSpace )
314 throws XMLParsingException, MalformedURLException {
315 Element capability = (Element) XMLTools.getRequiredNode( getRootElement(), nameSpace + ":Capability", nsContext );
316 Element methodList = (Element) XMLTools.getRequiredNode( capability, nameSpace
317 + ":SupportedAuthenticationMethodList",
318 nsContext );
319 ArrayList<SupportedAuthenticationMethod> result = new AuthenticationDocument().parseSupportedAuthenticationMethodList( methodList );
320
321 return result;
322 }
323
324 }