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