001 //$HeadURL: https://svn.wald.intevation.org/svn/deegree/base/branches/2.3_testing/src/org/deegree/ogcwebservices/csw/XMLFactory_2_0_0.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.csw;
037
038 import java.io.IOException;
039 import java.net.URI;
040 import java.util.HashSet;
041 import java.util.List;
042 import java.util.Map;
043 import java.util.Set;
044
045 import org.deegree.framework.xml.XMLParsingException;
046 import org.deegree.framework.xml.XMLTools;
047 import org.deegree.io.JDBCConnection;
048 import org.deegree.model.filterencoding.capabilities.FilterCapabilities;
049 import org.deegree.model.metadata.iso19115.OnlineResource;
050 import org.deegree.ogcbase.CommonNamespaces;
051 import org.deegree.ogcwebservices.csw.capabilities.CSWFeature;
052 import org.deegree.ogcwebservices.csw.capabilities.CatalogueCapabilities;
053 import org.deegree.ogcwebservices.csw.capabilities.CatalogueCapabilitiesDocument;
054 import org.deegree.ogcwebservices.csw.capabilities.EBRIMCapabilities;
055 import org.deegree.ogcwebservices.csw.configuration.CatalogueConfiguration;
056 import org.deegree.ogcwebservices.csw.configuration.CatalogueConfigurationDocument;
057 import org.deegree.ogcwebservices.csw.configuration.CatalogueDeegreeParams;
058 import org.deegree.ogcwebservices.csw.configuration.CatalogueOutputSchemaParameter;
059 import org.deegree.ogcwebservices.csw.configuration.CatalogueOutputSchemaValue;
060 import org.deegree.ogcwebservices.csw.configuration.CatalogueTypeNameSchemaParameter;
061 import org.deegree.ogcwebservices.csw.configuration.CatalogueTypeNameSchemaValue;
062 import org.deegree.ogcwebservices.getcapabilities.Contents;
063 import org.deegree.ogcwebservices.getcapabilities.DCPType;
064 import org.deegree.ogcwebservices.getcapabilities.Operation;
065 import org.deegree.ogcwebservices.getcapabilities.OperationsMetadata;
066 import org.deegree.ogcwebservices.getcapabilities.ServiceIdentification;
067 import org.deegree.ogcwebservices.getcapabilities.ServiceProvider;
068 import org.deegree.owscommon.OWSCommonCapabilitiesDocument;
069 import org.deegree.owscommon.OWSDomainType;
070 import org.w3c.dom.Element;
071 import org.xml.sax.SAXException;
072
073 /**
074 * @author <a href="mailto:poth@lat-lon.de">Andreas Poth </a>
075 * @author <a href="mailto:mschneider@lat-lon.de">Markus Schneider </a>
076 * @author last edited by: $Author: mschneider $
077 *
078 * @version $Revision: 18195 $, $Date: 2009-06-18 17:55:39 +0200 (Do, 18. Jun 2009) $
079 *
080 */
081 public class XMLFactory_2_0_0 extends org.deegree.owscommon.XMLFactory {
082
083 protected static final URI DEEGREECSW = CommonNamespaces.DEEGREECSW;
084
085 /**
086 * Exports a <code>CatalogConfiguration</code> instance to an <code>XmlDocument</code>.
087 *
088 * @param configuration
089 * @return DOM representation of the <code>CatalogConfiguration</code>
090 */
091 public static CatalogueConfigurationDocument export( CatalogueConfiguration configuration ) {
092 CatalogueConfigurationDocument configurationDocument = new CatalogueConfigurationDocument();
093 try {
094 configurationDocument.createEmptyDocument();
095 Element root = configurationDocument.getRootElement();
096
097 // 'deegreeParams'-section
098 CatalogueDeegreeParams deegreeParams = configuration.getDeegreeParams();
099 if ( deegreeParams != null ) {
100 appendDeegreeParams( root, configuration.getDeegreeParams() );
101 }
102
103 // 'ServiceIdentification'-section
104 ServiceIdentification serviceIdentification = configuration.getServiceIdentification();
105 if ( serviceIdentification != null ) {
106 appendServiceIdentification( root, serviceIdentification );
107 }
108
109 // 'ServiceProvider'-section
110 ServiceProvider serviceProvider = configuration.getServiceProvider();
111 if ( serviceProvider != null ) {
112 appendServiceProvider( root, configuration.getServiceProvider() );
113 }
114
115 // 'OperationsMetadata'-section
116 OperationsMetadata operationsMetadata = configuration.getOperationsMetadata();
117 if ( operationsMetadata != null ) {
118 appendOperationsMetadata( root, operationsMetadata );
119 }
120
121 // 'Contents'-section
122 Contents contents = configuration.getContents();
123 if ( contents != null ) {
124 // appendContents(root, contents);
125 }
126
127 // 'Filter_Capabilities'-section
128 FilterCapabilities filterCapabilities = configuration.getFilterCapabilities();
129 if ( filterCapabilities != null ) {
130 org.deegree.model.filterencoding.XMLFactory.appendFilterCapabilities100( root, filterCapabilities );
131 }
132
133 EBRIMCapabilities ebrimming = configuration.getEbrimCaps();
134 if ( ebrimming != null ) {
135 appendEBRimCapabilities( root, ebrimming );
136 }
137 } catch ( SAXException e ) {
138 LOG.logError( e.getMessage(), e );
139 } catch ( XMLParsingException e ) {
140 LOG.logError( e.getMessage(), e );
141 } catch ( Exception e ) {
142 LOG.logError( e.getMessage(), e );
143 }
144 return configurationDocument;
145 }
146
147 /**
148 * @param root
149 * @param ebrimming
150 */
151 private static void appendEBRimCapabilities( Element root, EBRIMCapabilities ebrimming ) {
152 Element serviceFeatures = XMLTools.appendElement( root, CommonNamespaces.WRS_EBRIMNS,
153 CommonNamespaces.WRS_EBRIM_PREFIX + ":ServiceFeatures" );
154 Map<URI, CSWFeature> features = ebrimming.getServiceFeatures();
155 Set<URI> keys = features.keySet();
156 for ( URI key : keys ) {
157 Element feature = XMLTools.appendElement( serviceFeatures, CommonNamespaces.WRS_EBRIMNS,
158 CommonNamespaces.WRS_EBRIM_PREFIX + ":feature" );
159 feature.setAttribute( "name", key.toString() );
160 CSWFeature featureBean = features.get( key );
161 appendProperties( feature, featureBean.getAllProperties() );
162 }
163 Element serviceProperties = XMLTools.appendElement( root, CommonNamespaces.WRS_EBRIMNS,
164 CommonNamespaces.WRS_EBRIM_PREFIX + ":ServiceProperties" );
165 appendProperties( serviceProperties, ebrimming.getServiceProperties() );
166 Element wsdl_services = XMLTools.appendElement( root, CommonNamespaces.WRS_EBRIMNS,
167 CommonNamespaces.WRS_EBRIM_PREFIX + ":WSDL-services" );
168 appendSimpleLinkAttributes( wsdl_services, ebrimming.getWsdl_services() );
169
170 }
171
172 private static void appendProperties( Element theElement, Map<URI, List<String>> properties ) {
173 Set<URI> keys = properties.keySet();
174 for ( URI key : keys ) {
175 Element property = XMLTools.appendElement( theElement, CommonNamespaces.WRS_EBRIMNS,
176 CommonNamespaces.WRS_EBRIM_PREFIX + ":property" );
177 property.setAttribute( "name", key.toString() );
178 List<String> values = properties.get( key );
179 for ( String value : values ) {
180 XMLTools.appendElement( property, CommonNamespaces.WRS_EBRIMNS, CommonNamespaces.WRS_EBRIM_PREFIX
181 + ":value", value );
182 }
183 }
184 }
185
186 /**
187 * Exports a <code>CatalogCapabilities</code> instance as an <code>XmlDocument</code>.
188 *
189 * @param capabilities
190 * @param sections
191 * names of sections to be exported, may contain 'All'
192 * @return DOM representation of the <code>CatalogCapabilities</code>
193 * @throws IOException
194 * if XML template could not be loaded
195 */
196 public static CatalogueCapabilitiesDocument export( CatalogueCapabilities capabilities, String[] sections )
197 throws IOException {
198
199 // no sections specified? => return all sections
200 if ( sections == null || sections.length == 0 ) {
201 sections = new String[] { OWSCommonCapabilitiesDocument.ALL_NAME };
202 }
203
204 // build HashSet with the names of the sections to be exported
205 Set<String> sectionSet = new HashSet<String>();
206 for ( int i = 0; i < sections.length; i++ ) {
207 sectionSet.add( sections[i] );
208 }
209
210 CatalogueCapabilitiesDocument doc = new CatalogueCapabilitiesDocument();
211 try {
212 doc.createEmptyDocument();
213 Element root = doc.getRootElement();
214
215 // 'ServiceIdentification'-section
216 if ( sectionSet.contains( OWSCommonCapabilitiesDocument.ALL_NAME )
217 || sectionSet.contains( OWSCommonCapabilitiesDocument.SERVICE_IDENTIFICATION_NAME ) ) {
218 ServiceIdentification serviceIdentification = capabilities.getServiceIdentification();
219 if ( serviceIdentification != null ) {
220 appendServiceIdentification( root, serviceIdentification );
221 }
222 }
223
224 // 'ServiceProvider'-section
225 if ( sectionSet.contains( OWSCommonCapabilitiesDocument.ALL_NAME )
226 || sectionSet.contains( OWSCommonCapabilitiesDocument.SERVICE_PROVIDER_NAME ) ) {
227 ServiceProvider serviceProvider = capabilities.getServiceProvider();
228 if ( serviceProvider != null ) {
229 appendServiceProvider( root, capabilities.getServiceProvider() );
230 }
231 }
232
233 // 'OperationsMetadata'-section
234 if ( sectionSet.contains( OWSCommonCapabilitiesDocument.ALL_NAME )
235 || sectionSet.contains( OWSCommonCapabilitiesDocument.OPERATIONS_METADATA_NAME ) ) {
236 OperationsMetadata operationsMetadata = capabilities.getOperationsMetadata();
237 if ( operationsMetadata != null ) {
238 appendOperationsMetadata( root, operationsMetadata, true );
239 }
240 }
241
242 // 'Contents'-section
243 if ( sectionSet.contains( OWSCommonCapabilitiesDocument.ALL_NAME )
244 || sectionSet.contains( OWSCommonCapabilitiesDocument.CONTENTS_NAME ) ) {
245 Contents contents = capabilities.getContents();
246 if ( contents != null ) {
247 // appendContents(root, contents);
248 }
249 }
250
251 // 'Filter_Capabilities'-section
252 if ( sectionSet.contains( OWSCommonCapabilitiesDocument.ALL_NAME )
253 || sectionSet.contains( CatalogueCapabilitiesDocument.FILTER_CAPABILITIES_NAME ) ) {
254 FilterCapabilities filterCapabilities = capabilities.getFilterCapabilities();
255 if ( filterCapabilities != null ) {
256 org.deegree.model.filterencoding.XMLFactory.appendFilterCapabilities100( root, filterCapabilities );
257 }
258 }
259 // 'EBRIM_Capabilities'-section
260 if ( sectionSet.contains( OWSCommonCapabilitiesDocument.ALL_NAME )
261 || sectionSet.contains( CatalogueCapabilitiesDocument.EBRIM_CAPABILITIES_NAME ) ) {
262 EBRIMCapabilities ebrimming = capabilities.getEbrimCaps();
263 if ( ebrimming != null ) {
264 appendEBRimCapabilities( root, ebrimming );
265 }
266 }
267 } catch ( SAXException e ) {
268 LOG.logError( e.getMessage(), e );
269 }
270 return doc;
271 }
272
273 /**
274 * Appends the DOM representation of the <code>deegreeParams</code>- section to the passed
275 * <code>Element</code>.
276 *
277 * @param root
278 * @param deegreeParams
279 * @throws XMLParsingException
280 */
281 private static void appendDeegreeParams( Element root, CatalogueDeegreeParams deegreeParams )
282 throws XMLParsingException {
283
284 Element deegreeParamsNode = XMLTools.getRequiredChildElement( "deegreeParams", DEEGREECSW, root );
285
286 // 'DefaultOnlineResource'-element
287 appendOnlineResource( deegreeParamsNode, "deegree:DefaultOnlineResource",
288 deegreeParams.getDefaultOnlineResource(), DEEGREECSW );
289
290 // 'CacheSize'-element
291 XMLTools.appendElement( deegreeParamsNode, DEEGREECSW, "deegree:CacheSize", "" + deegreeParams.getCacheSize() );
292
293 // 'RequestTimeLimit'-element
294 XMLTools.appendElement( deegreeParamsNode, DEEGREECSW, "deegree:RequestTimeLimit",
295 "" + deegreeParams.getRequestTimeLimit() );
296
297 // 'Encoding'-element
298 XMLTools.appendElement( deegreeParamsNode, DEEGREECSW, "deegree:Encoding", deegreeParams.getCharacterSet() );
299
300 // 'WFSResource'-element
301 Element wfsResourceElement = XMLTools.appendElement( deegreeParamsNode, DEEGREECSW, "deegree:WFSResource" );
302
303 appendSimpleLinkAttributes( wfsResourceElement, deegreeParams.getWfsResource() );
304
305 // 'CatalogAddresses'-element
306 OnlineResource[] catalogAddresses = deegreeParams.getCatalogAddresses();
307 if ( catalogAddresses.length > 0 ) {
308 Element catalogAddressesNode = XMLTools.appendElement( deegreeParamsNode, DEEGREECSW,
309 "deegree:CatalogAddresses" );
310 for ( int i = 0; i < catalogAddresses.length; i++ ) {
311 appendOnlineResource( catalogAddressesNode, "deegree:CatalogAddress", catalogAddresses[i], DEEGREECSW );
312 }
313 }
314
315 // 'HarvestRepository'-element
316 if ( deegreeParams.getHarvestRepository() != null ) {
317 JDBCConnection connection = deegreeParams.getHarvestRepository();
318 Element harvestRepositoryNode = XMLTools.appendElement( deegreeParamsNode, DEEGREECSW,
319 "deegree:HarvestRepository" );
320 // 'Connection'-element
321 Element connectionNode = XMLTools.appendElement( harvestRepositoryNode, DEEGREECSW, "deegree:Connection" );
322 // 'Driver'-element
323 XMLTools.appendElement( connectionNode, DEEGREECSW, "deegree:Driver", connection.getDriver() );
324 // 'Logon'-element
325 XMLTools.appendElement( connectionNode, DEEGREECSW, "deegree:Logon", connection.getURL() );
326 // 'User'-element
327 XMLTools.appendElement( connectionNode, DEEGREECSW, "deegree:User", connection.getUser() );
328 // 'Password'-element
329 XMLTools.appendElement( connectionNode, DEEGREECSW, "deegree:Password", connection.getPassword() );
330 }
331 }
332
333 /**
334 * Appends the DOM representation of the <code>OperationsMetadata</code>- section to the
335 * passed <code>Element</code>.
336 *
337 * @param root
338 */
339 protected static void appendOperationsMetadata( Element root, OperationsMetadata operationsMetadata,
340 boolean capabilities ) {
341
342 // 'ows:OperationsMetadata'-element
343 Element operationsMetadataNode = XMLTools.appendElement( root, OWSNS, "ows:OperationsMetadata" );
344
345 // append all Operations
346 Operation[] operations = operationsMetadata.getOperations();
347 for ( int i = 0; i < operations.length; i++ ) {
348 Operation operation = operations[i];
349
350 // 'ows:Operation'-element
351 Element operationElement = XMLTools.appendElement( operationsMetadataNode, OWSNS, "ows:Operation" );
352
353 operationElement.setAttribute( "name", operation.getName() );
354
355 // 'ows:DCP'-elements
356 DCPType[] dcps = operation.getDCPs();
357 for ( int j = 0; j < dcps.length; j++ ) {
358 appendDCP( operationElement, dcps[j] );
359 }
360
361 // 'ows:Parameter'-elements
362 OWSDomainType[] parameters = operation.getParameters();
363 for ( int j = 0; j < parameters.length; j++ ) {
364 if ( parameters[j] instanceof CatalogueOutputSchemaParameter ) {
365 appendParameter( operationElement, (CatalogueOutputSchemaParameter) parameters[j], "ows:Parameter",
366 capabilities );
367 } else if ( parameters[j] instanceof CatalogueTypeNameSchemaParameter ) {
368 appendParameter( operationElement, (CatalogueTypeNameSchemaParameter) parameters[j],
369 "ows:Parameter", capabilities );
370 } else {
371 appendParameter( operationElement, parameters[j], "ows:Parameter" );
372 }
373 }
374
375 // 'ows:Metadata'-elements
376 Object[] metadata = operation.getMetadata();
377 if ( metadata != null ) {
378 for ( int j = 0; j < metadata.length; j++ ) {
379 appendMetadata( operationElement, metadata[j] );
380 }
381 }
382 }
383
384 // append general parameters
385 OWSDomainType[] parameters = operationsMetadata.getParameter();
386 for ( int i = 0; i < parameters.length; i++ ) {
387 appendParameter( operationsMetadataNode, parameters[i], "ows:Parameter" );
388 }
389
390 // append constraints
391 OWSDomainType[] constraints = operationsMetadata.getConstraints();
392 for ( int i = 0; i < constraints.length; i++ ) {
393 appendParameter( operationsMetadataNode, constraints[i], "ows:Constraint" );
394 }
395 }
396
397 /**
398 * Appends the DOM representation of a <code>OWSDomainType</code> instance to the passed
399 * <code>Element</code>.
400 *
401 * @param root
402 * @param parameter
403 */
404 protected static void appendParameter( Element root, CatalogueOutputSchemaParameter parameter, String elementName,
405 boolean capabilities ) {
406
407 // 'ows:Parameter'-element
408 Element parameterNode = XMLTools.appendElement( root, OWSNS, elementName );
409 parameterNode.setAttribute( "name", parameter.getName() );
410
411 // 'ows:Value'-elements
412 CatalogueOutputSchemaValue[] values = parameter.getSpecializedValues();
413 for ( int i = 0; i < values.length; i++ ) {
414 Element elem = XMLTools.appendElement( parameterNode, OWSNS, "ows:Value", values[i].getValue() );
415 if ( !capabilities ) {
416 elem.setAttribute( "deegree:input", values[i].getInXsl() );
417 elem.setAttribute( "deegree:ouput", values[i].getOutXsl() );
418 }
419 }
420 }
421
422 /**
423 * Appends the DOM representation of a <code>OWSDomainType</code> instance to the passed
424 * <code>Element</code>.
425 *
426 * @param root
427 * @param parameter
428 */
429 protected static void appendParameter( Element root, CatalogueTypeNameSchemaParameter parameter,
430 String elementName, boolean capabilities ) {
431
432 // 'ows:Parameter'-element
433 Element parameterNode = XMLTools.appendElement( root, OWSNS, elementName );
434 parameterNode.setAttribute( "name", parameter.getName() );
435
436 // 'ows:Value'-elements
437 CatalogueTypeNameSchemaValue[] values = parameter.getSpecializedValues();
438 for ( int i = 0; i < values.length; i++ ) {
439 Element elem = XMLTools.appendElement( parameterNode, OWSNS, "ows:Value", values[i].getValue() );
440 if ( !capabilities ) {
441 elem.setAttribute( "deegree:schema", values[i].getSchema() );
442 }
443 }
444 }
445
446 }