001 //$HeadURL: svn+ssh://rbezema@svn.wald.intevation.org/deegree/base/branches/2.2_testing/src/org/deegree/ogcwebservices/csw/XMLFactory_2_0_0.java $ 002 /*---------------- FILE HEADER ------------------------------------------ 003 004 This file is part of deegree. 005 Copyright (C) 2001-2008 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: 9384 $, $Date: 2008-01-03 14:30:39 +0100 (Do, 03 Jan 2008) $ 086 * 087 */ 088 public class XMLFactory_2_0_0 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 LOG.logError( e.getMessage(), e ); 146 } catch ( XMLParsingException e ) { 147 LOG.logError( e.getMessage(), e ); 148 } catch ( Exception e ) { 149 LOG.logError( e.getMessage(), e ); 150 } 151 return configurationDocument; 152 } 153 154 /** 155 * @param root 156 * @param ebrimming 157 */ 158 private static void appendEBRimCapabilities( Element root, EBRIMCapabilities ebrimming ) { 159 Element serviceFeatures = XMLTools.appendElement( root, CommonNamespaces.WRS_EBRIMNS, 160 CommonNamespaces.WRS_EBRIM_PREFIX + ":ServiceFeatures" ); 161 Map<URI, CSWFeature> features = ebrimming.getServiceFeatures(); 162 Set<URI> keys = features.keySet(); 163 for ( URI key : keys ) { 164 Element feature = XMLTools.appendElement( serviceFeatures, CommonNamespaces.WRS_EBRIMNS, 165 CommonNamespaces.WRS_EBRIM_PREFIX + ":feature" ); 166 feature.setAttribute( "name", key.toString() ); 167 CSWFeature featureBean = features.get( key ); 168 appendProperties( feature, featureBean.getAllProperties() ); 169 } 170 Element serviceProperties = XMLTools.appendElement( root, CommonNamespaces.WRS_EBRIMNS, 171 CommonNamespaces.WRS_EBRIM_PREFIX + ":ServiceProperties" ); 172 appendProperties( serviceProperties, ebrimming.getServiceProperties() ); 173 Element wsdl_services = XMLTools.appendElement( root, CommonNamespaces.WRS_EBRIMNS, 174 CommonNamespaces.WRS_EBRIM_PREFIX + ":WSDL-services" ); 175 appendSimpleLinkAttributes( wsdl_services, ebrimming.getWsdl_services() ); 176 177 } 178 179 private static void appendProperties( Element theElement, Map<URI, List<String>> properties ) { 180 Set<URI> keys = properties.keySet(); 181 for ( URI key : keys ) { 182 Element property = XMLTools.appendElement( theElement, CommonNamespaces.WRS_EBRIMNS, 183 CommonNamespaces.WRS_EBRIM_PREFIX + ":property" ); 184 property.setAttribute( "name", key.toString() ); 185 List<String> values = properties.get( key ); 186 for ( String value : values ) { 187 XMLTools.appendElement( property, CommonNamespaces.WRS_EBRIMNS, CommonNamespaces.WRS_EBRIM_PREFIX 188 + ":value", value ); 189 } 190 } 191 } 192 193 /** 194 * Exports a <code>CatalogCapabilities</code> instance as an <code>XmlDocument</code>. 195 * 196 * @param capabilities 197 * @param sections 198 * names of sections to be exported, may contain 'All' 199 * @return DOM representation of the <code>CatalogCapabilities</code> 200 * @throws IOException 201 * if XML template could not be loaded 202 */ 203 public static CatalogueCapabilitiesDocument export( CatalogueCapabilities capabilities, String[] sections ) 204 throws IOException { 205 206 // no sections specified? => return all sections 207 if ( sections == null || sections.length == 0 ) { 208 sections = new String[] { OWSCommonCapabilitiesDocument.ALL_NAME }; 209 } 210 211 // build HashSet with the names of the sections to be exported 212 Set<String> sectionSet = new HashSet<String>(); 213 for ( int i = 0; i < sections.length; i++ ) { 214 sectionSet.add( sections[i] ); 215 } 216 217 CatalogueCapabilitiesDocument doc = new CatalogueCapabilitiesDocument(); 218 try { 219 doc.createEmptyDocument(); 220 Element root = doc.getRootElement(); 221 222 // 'ServiceIdentification'-section 223 if ( sectionSet.contains( OWSCommonCapabilitiesDocument.ALL_NAME ) 224 || sectionSet.contains( OWSCommonCapabilitiesDocument.SERVICE_IDENTIFICATION_NAME ) ) { 225 ServiceIdentification serviceIdentification = capabilities.getServiceIdentification(); 226 if ( serviceIdentification != null ) { 227 appendServiceIdentification( root, serviceIdentification ); 228 } 229 } 230 231 // 'ServiceProvider'-section 232 if ( sectionSet.contains( OWSCommonCapabilitiesDocument.ALL_NAME ) 233 || sectionSet.contains( OWSCommonCapabilitiesDocument.SERVICE_PROVIDER_NAME ) ) { 234 ServiceProvider serviceProvider = capabilities.getServiceProvider(); 235 if ( serviceProvider != null ) { 236 appendServiceProvider( root, capabilities.getServiceProvider() ); 237 } 238 } 239 240 // 'OperationsMetadata'-section 241 if ( sectionSet.contains( OWSCommonCapabilitiesDocument.ALL_NAME ) 242 || sectionSet.contains( OWSCommonCapabilitiesDocument.OPERATIONS_METADATA_NAME ) ) { 243 OperationsMetadata operationsMetadata = capabilities.getOperationsMetadata(); 244 if ( operationsMetadata != null ) { 245 appendOperationsMetadata( root, operationsMetadata, true ); 246 } 247 } 248 249 // 'Contents'-section 250 if ( sectionSet.contains( OWSCommonCapabilitiesDocument.ALL_NAME ) 251 || sectionSet.contains( OWSCommonCapabilitiesDocument.CONTENTS_NAME ) ) { 252 Contents contents = capabilities.getContents(); 253 if ( contents != null ) { 254 // appendContents(root, contents); 255 } 256 } 257 258 // 'Filter_Capabilities'-section 259 if ( sectionSet.contains( OWSCommonCapabilitiesDocument.ALL_NAME ) 260 || sectionSet.contains( CatalogueCapabilitiesDocument.FILTER_CAPABILITIES_NAME ) ) { 261 FilterCapabilities filterCapabilities = capabilities.getFilterCapabilities(); 262 if ( filterCapabilities != null ) { 263 org.deegree.model.filterencoding.XMLFactory.appendFilterCapabilities100( root, filterCapabilities ); 264 } 265 } 266 // 'EBRIM_Capabilities'-section 267 if ( sectionSet.contains( OWSCommonCapabilitiesDocument.ALL_NAME ) 268 || sectionSet.contains( CatalogueCapabilitiesDocument.EBRIM_CAPABILITIES_NAME ) ) { 269 EBRIMCapabilities ebrimming = capabilities.getEbrimCaps(); 270 if ( ebrimming != null ) { 271 appendEBRimCapabilities( root, ebrimming ); 272 } 273 } 274 } catch ( SAXException e ) { 275 LOG.logError( e.getMessage(), e ); 276 } 277 return doc; 278 } 279 280 /** 281 * Appends the DOM representation of the <code>deegreeParams</code>- section to the passed 282 * <code>Element</code>. 283 * 284 * @param root 285 * @param deegreeParams 286 * @throws XMLParsingException 287 */ 288 private static void appendDeegreeParams( Element root, CatalogueDeegreeParams deegreeParams ) 289 throws XMLParsingException { 290 291 Element deegreeParamsNode = XMLTools.getRequiredChildElement( "deegreeParams", DEEGREECSW, root ); 292 293 // 'DefaultOnlineResource'-element 294 appendOnlineResource( deegreeParamsNode, "deegree:DefaultOnlineResource", 295 deegreeParams.getDefaultOnlineResource(), DEEGREECSW ); 296 297 // 'CacheSize'-element 298 XMLTools.appendElement( deegreeParamsNode, DEEGREECSW, "deegree:CacheSize", "" + deegreeParams.getCacheSize() ); 299 300 // 'RequestTimeLimit'-element 301 XMLTools.appendElement( deegreeParamsNode, DEEGREECSW, "deegree:RequestTimeLimit", 302 "" + deegreeParams.getRequestTimeLimit() ); 303 304 // 'Encoding'-element 305 XMLTools.appendElement( deegreeParamsNode, DEEGREECSW, "deegree:Encoding", deegreeParams.getCharacterSet() ); 306 307 // 'WFSResource'-element 308 Element wfsResourceElement = XMLTools.appendElement( deegreeParamsNode, DEEGREECSW, "deegree:WFSResource" ); 309 310 appendSimpleLinkAttributes( wfsResourceElement, deegreeParams.getWfsResource() ); 311 312 // 'CatalogAddresses'-element 313 OnlineResource[] catalogAddresses = deegreeParams.getCatalogAddresses(); 314 if ( catalogAddresses.length > 0 ) { 315 Element catalogAddressesNode = XMLTools.appendElement( deegreeParamsNode, DEEGREECSW, 316 "deegree:CatalogAddresses" ); 317 for ( int i = 0; i < catalogAddresses.length; i++ ) { 318 appendOnlineResource( catalogAddressesNode, "deegree:CatalogAddress", catalogAddresses[i], DEEGREECSW ); 319 } 320 } 321 322 // 'HarvestRepository'-element 323 if ( deegreeParams.getHarvestRepository() != null ) { 324 JDBCConnection connection = deegreeParams.getHarvestRepository(); 325 Element harvestRepositoryNode = XMLTools.appendElement( deegreeParamsNode, DEEGREECSW, 326 "deegree:HarvestRepository" ); 327 // 'Connection'-element 328 Element connectionNode = XMLTools.appendElement( harvestRepositoryNode, DEEGREECSW, "deegree:Connection" ); 329 // 'Driver'-element 330 XMLTools.appendElement( connectionNode, DEEGREECSW, "deegree:Driver", connection.getDriver() ); 331 // 'Logon'-element 332 XMLTools.appendElement( connectionNode, DEEGREECSW, "deegree:Logon", connection.getURL() ); 333 // 'User'-element 334 XMLTools.appendElement( connectionNode, DEEGREECSW, "deegree:User", connection.getUser() ); 335 // 'Password'-element 336 XMLTools.appendElement( connectionNode, DEEGREECSW, "deegree:Password", connection.getPassword() ); 337 } 338 } 339 340 /** 341 * Appends the DOM representation of the <code>OperationsMetadata</code>- section to the 342 * passed <code>Element</code>. 343 * 344 * @param root 345 */ 346 protected static void appendOperationsMetadata( Element root, OperationsMetadata operationsMetadata, 347 boolean capabilities ) { 348 349 // 'ows:OperationsMetadata'-element 350 Element operationsMetadataNode = XMLTools.appendElement( root, OWSNS, "ows:OperationsMetadata" ); 351 352 // append all Operations 353 Operation[] operations = operationsMetadata.getOperations(); 354 for ( int i = 0; i < operations.length; i++ ) { 355 Operation operation = operations[i]; 356 357 // 'ows:Operation'-element 358 Element operationElement = XMLTools.appendElement( operationsMetadataNode, OWSNS, "ows:Operation" ); 359 360 operationElement.setAttribute( "name", operation.getName() ); 361 362 // 'ows:DCP'-elements 363 DCPType[] dcps = operation.getDCPs(); 364 for ( int j = 0; j < dcps.length; j++ ) { 365 appendDCP( operationElement, dcps[j] ); 366 } 367 368 // 'ows:Parameter'-elements 369 OWSDomainType[] parameters = operation.getParameters(); 370 for ( int j = 0; j < parameters.length; j++ ) { 371 if ( parameters[j] instanceof CatalogueOutputSchemaParameter ) { 372 appendParameter( operationElement, (CatalogueOutputSchemaParameter) parameters[j], "ows:Parameter", 373 capabilities ); 374 } else if ( parameters[j] instanceof CatalogueTypeNameSchemaParameter ) { 375 appendParameter( operationElement, (CatalogueTypeNameSchemaParameter) parameters[j], 376 "ows:Parameter", capabilities ); 377 } else { 378 appendParameter( operationElement, parameters[j], "ows:Parameter" ); 379 } 380 } 381 382 // 'ows:Metadata'-elements 383 Object[] metadata = operation.getMetadata(); 384 if ( metadata != null ) { 385 for ( int j = 0; j < metadata.length; j++ ) { 386 appendMetadata( operationElement, metadata[j] ); 387 } 388 } 389 } 390 391 // append general parameters 392 OWSDomainType[] parameters = operationsMetadata.getParameter(); 393 for ( int i = 0; i < parameters.length; i++ ) { 394 appendParameter( operationsMetadataNode, parameters[i], "ows:Parameter" ); 395 } 396 397 // append constraints 398 OWSDomainType[] constraints = operationsMetadata.getConstraints(); 399 for ( int i = 0; i < constraints.length; i++ ) { 400 appendParameter( operationsMetadataNode, constraints[i], "ows:Constraint" ); 401 } 402 } 403 404 /** 405 * Appends the DOM representation of a <code>OWSDomainType</code> instance to the passed 406 * <code>Element</code>. 407 * 408 * @param root 409 * @param parameter 410 */ 411 protected static void appendParameter( Element root, CatalogueOutputSchemaParameter parameter, String elementName, 412 boolean capabilities ) { 413 414 // 'ows:Parameter'-element 415 Element parameterNode = XMLTools.appendElement( root, OWSNS, elementName ); 416 parameterNode.setAttribute( "name", parameter.getName() ); 417 418 // 'ows:Value'-elements 419 CatalogueOutputSchemaValue[] values = parameter.getSpecializedValues(); 420 for ( int i = 0; i < values.length; i++ ) { 421 Element elem = XMLTools.appendElement( parameterNode, OWSNS, "ows:Value", values[i].getValue() ); 422 if ( !capabilities ) { 423 elem.setAttribute( "deegree:input", values[i].getInXsl() ); 424 elem.setAttribute( "deegree:ouput", values[i].getOutXsl() ); 425 } 426 } 427 } 428 429 /** 430 * Appends the DOM representation of a <code>OWSDomainType</code> instance to the passed 431 * <code>Element</code>. 432 * 433 * @param root 434 * @param parameter 435 */ 436 protected static void appendParameter( Element root, CatalogueTypeNameSchemaParameter parameter, 437 String elementName, boolean capabilities ) { 438 439 // 'ows:Parameter'-element 440 Element parameterNode = XMLTools.appendElement( root, OWSNS, elementName ); 441 parameterNode.setAttribute( "name", parameter.getName() ); 442 443 // 'ows:Value'-elements 444 CatalogueTypeNameSchemaValue[] values = parameter.getSpecializedValues(); 445 for ( int i = 0; i < values.length; i++ ) { 446 Element elem = XMLTools.appendElement( parameterNode, OWSNS, "ows:Value", values[i].getValue() ); 447 if ( !capabilities ) { 448 elem.setAttribute( "deegree:schema", values[i].getSchema() ); 449 } 450 } 451 } 452 453 }