001 //$HeadURL: svn+ssh://jwilden@svn.wald.intevation.org/deegree/base/branches/2.5_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 }