001 //$HeadURL: $ 002 /*---------------- FILE HEADER ------------------------------------------ 003 This file is part of deegree. 004 Copyright (C) 2001-2008 by: 005 Department of Geography, University of Bonn 006 http://www.giub.uni-bonn.de/deegree/ 007 lat/lon GmbH 008 http://www.lat-lon.de 009 010 This library is free software; you can redistribute it and/or 011 modify it under the terms of the GNU Lesser General Public 012 License as published by the Free Software Foundation; either 013 version 2.1 of the License, or (at your option) any later version. 014 This library is distributed in the hope that it will be useful, 015 but WITHOUT ANY WARRANTY; without even the implied warranty of 016 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU 017 Lesser General Public License for more details. 018 You should have received a copy of the GNU Lesser General Public 019 License along with this library; if not, write to the Free Software 020 Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA 021 Contact: 022 023 Andreas Poth 024 lat/lon GmbH 025 Aennchenstr. 19 026 53177 Bonn 027 Germany 028 E-Mail: poth@lat-lon.de 029 030 Prof. Dr. Klaus Greve 031 Department of Geography 032 University of Bonn 033 Meckenheimer Allee 166 034 53115 Bonn 035 Germany 036 E-Mail: greve@giub.uni-bonn.de 037 ---------------------------------------------------------------------------*/ 038 039 package org.deegree.owscommon_1_1_0; 040 041 import static org.deegree.ogcbase.CommonNamespaces.*; 042 import static org.deegree.framework.xml.XMLTools.*; 043 044 import java.util.List; 045 046 import org.deegree.framework.util.Pair; 047 import org.w3c.dom.Element; 048 import org.w3c.dom.Node; 049 050 /** 051 * The <code>XMLFactory</code> is a convenience class, which exports ows-common 1.1.0 beans to their xml 052 * representation. representation. 053 * 054 * @author <a href="mailto:bezema@lat-lon.de">Rutger Bezema</a> 055 * 056 * @author last edited by: $Author:$ 057 * 058 * @version $Revision:$, $Date:$ 059 * 060 */ 061 062 public class XMLFactory extends org.deegree.ogcbase.XMLFactory { 063 064 private static String PRE = OWS_1_1_0PREFIX + ":"; 065 066 /** 067 * make an xml representation of given capabilities bean. 068 * 069 * @param root 070 * to export to. 071 * @param capabilities 072 * to export 073 */ 074 public void exportCapabilities( Element root, OWSCommonCapabilities capabilities ) { 075 if ( root != null && capabilities != null ) { 076 root.setAttribute( "version", capabilities.getVersion() ); 077 root.setAttribute( "updateSequence", capabilities.getUpdateSequence() ); 078 appendServiceIdentification( root, capabilities.getServiceIdentification() ); 079 appendServiceProvider( root, capabilities.getServiceProvider() ); 080 appendOperationsMetadata( root, capabilities.getOperationsMetadata() ); 081 } 082 } 083 084 /** 085 * @param capabilitiesElement 086 * to export to if <code>null</code> nothing will be done. 087 * @param serviceIdentification 088 * to append if <code>null</code> nothing will be done (optional). 089 */ 090 protected void appendServiceIdentification( Element capabilitiesElement, ServiceIdentification serviceIdentification ) { 091 if ( capabilitiesElement == null || serviceIdentification == null ) { 092 return; 093 } 094 Element sid = appendElement( capabilitiesElement, OWSNS_1_1_0, PRE + "ServiceIdentification" ); 095 List<String> strings = serviceIdentification.getTitles(); 096 if ( strings != null ) { 097 for ( String title : strings ) { 098 if ( title != null && !"".equals( title.trim() ) ) { 099 appendElement( sid, OWSNS_1_1_0, PRE + "Title", title ); 100 } 101 } 102 } 103 104 strings = serviceIdentification.getAbstracts(); 105 if ( strings != null ) { 106 for ( String s : strings ) { 107 if ( s != null && !"".equals( s.trim() ) ) { 108 appendElement( sid, OWSNS_1_1_0, PRE + "Abstract", s ); 109 } 110 } 111 } 112 113 List<Keywords> keywords = serviceIdentification.getKeywords(); 114 if ( keywords != null ) { 115 for ( Keywords kw : keywords ) { 116 if ( kw != null ) { 117 Element keywordsElement = appendElement( sid, OWSNS_1_1_0, PRE + "Keywords" ); 118 List<String> kws = kw.getkeywords(); 119 if ( kws != null ) { 120 for ( String s : kws ) { 121 appendElement( keywordsElement, OWSNS_1_1_0, PRE + "Keyword", s ); 122 } 123 } 124 Pair<String, String> type = kw.getType(); 125 if ( type != null ) { 126 Element t = appendElement( keywordsElement, OWSNS_1_1_0, PRE + "Type", type.first ); 127 if( type.second != null){ 128 t.setAttribute( "codeSpace", type.second ); 129 } 130 } 131 } 132 } 133 } 134 135 // ServiceType mandatory 136 Pair<String, String> serviceType = serviceIdentification.getServicetype(); 137 Element ste = appendElement( sid, OWSNS_1_1_0, PRE + "ServiceType", serviceType.first ); 138 if( serviceType.second != null ){ 139 ste.setAttribute( "codeSpace", serviceType.second ); 140 } 141 142 // ServiceTypeVersion(s) mandatory. 143 List<String> serviceTypeVersions = serviceIdentification.getServiceTypeVersions(); 144 for ( String serviceTypeVersion : serviceTypeVersions ) { 145 appendElement( sid, OWSNS_1_1_0, PRE + "ServiceTypeVersion", serviceTypeVersion ); 146 } 147 148 List<String> profiles = serviceIdentification.getProfiles(); 149 for ( String profile : profiles ) { 150 appendElement( sid, OWSNS_1_1_0, PRE + "Profile", profile ); 151 } 152 153 String fee = serviceIdentification.getFees(); 154 if ( fee != null && !"".equals( fee.trim() ) ) { 155 appendElement( sid, OWSNS_1_1_0, PRE + "Fees", fee ); 156 } 157 158 List<String> accessConst = serviceIdentification.getAccessConstraints(); 159 if ( accessConst != null ) { 160 for ( String constraint : accessConst ) { 161 appendElement( sid, OWSNS_1_1_0, PRE + "AccessConstraints", constraint ); 162 } 163 } 164 165 } 166 167 /** 168 * 169 * @param capabilitiesElement 170 * to export to if <code>null</code> nothing will be done. 171 * @param serviceProvider 172 * to append if <code>null</code> nothing will be done (optional). 173 */ 174 protected void appendServiceProvider( Element capabilitiesElement, ServiceProvider serviceProvider ) { 175 if ( capabilitiesElement == null || serviceProvider == null ) { 176 return; 177 } 178 Element sp = appendElement( capabilitiesElement, OWSNS_1_1_0, PRE + "ServiceProvider" ); 179 appendElement( sp, OWSNS_1_1_0, PRE + "ProviderName", serviceProvider.getProviderName() ); 180 if ( serviceProvider.getProviderSite() != null && !"".equals( serviceProvider.getProviderSite() ) ) { 181 Element provSite = appendElement( sp, OWSNS_1_1_0, PRE + "ProviderSite"); 182 provSite.setAttributeNS( XLNNS.toASCIIString(), XLINK_PREFIX +":href", serviceProvider.getProviderSite() ); 183 } 184 185 appendServiceContact( sp, serviceProvider.getServiceContact() ); 186 187 } 188 189 /** 190 * @param root 191 * to export to if <code>null</code> nothing will be done. 192 * @param serviceContact 193 * to append if <code>null</code> nothing will be done (optional). 194 */ 195 protected void appendServiceContact( Element root, ServiceContact serviceContact ) { 196 if ( root == null || serviceContact == null ) { 197 return; 198 } 199 Element sc = appendElement( root, OWSNS_1_1_0, PRE + "ServiceContact" ); 200 // optional IndividualName 201 if ( serviceContact.getIndividualName() != null && !"".equals( serviceContact.getIndividualName() ) ) { 202 appendElement( sc, OWSNS_1_1_0, PRE + "IndividualName", serviceContact.getIndividualName() ); 203 } 204 // optional PositionName 205 if ( serviceContact.getPositionName() != null && !"".equals( serviceContact.getPositionName() ) ) { 206 appendElement( sc, OWSNS_1_1_0, PRE + "PositionName", serviceContact.getPositionName() ); 207 } 208 // optional ContactInfo 209 appendContactInfo( sc, serviceContact.getContactInfo() ); 210 211 // optional Role. 212 if ( serviceContact.getRole() != null ) { 213 Element r = appendElement( sc, OWSNS_1_1_0, PRE + "Role", serviceContact.getRole().first ); 214 if( serviceContact.getRole().second != null ){ 215 r.setAttribute( "codeSpace", serviceContact.getRole().second ); 216 } 217 } 218 219 } 220 221 /** 222 * @param root 223 * (usually a serviceContact) to export to if <code>null</code> nothing will be done. 224 * @param contactInfo 225 * to append if <code>null</code> nothing will be done (optional). 226 */ 227 protected void appendContactInfo( Element root, ContactInfo contactInfo ) { 228 if ( root == null || contactInfo == null ) { 229 return; 230 } 231 Element ci = appendElement( root, OWSNS_1_1_0, PRE + "ContactInfo" ); 232 if ( contactInfo.getPhone() != null ) { 233 Pair<List<String>, List<String>> phone = contactInfo.getPhone(); 234 Element phoneE = appendElement( ci, OWSNS_1_1_0, PRE + "Phone" ); 235 if ( phone.first != null && phone.first.size() != 0 ) { 236 for ( String t : phone.first ) { 237 appendElement( phoneE, OWSNS_1_1_0, PRE + "Voice", t ); 238 } 239 } 240 if ( phone.second != null && phone.second.size() != 0 ) { 241 for ( String t : phone.second ) { 242 appendElement( phoneE, OWSNS_1_1_0, PRE + "Facsimile", t ); 243 } 244 } 245 } 246 247 if ( contactInfo.hasAdress() ) { 248 Element addr = appendElement( ci, OWSNS_1_1_0, PRE + "Address" ); 249 if ( contactInfo.getDeliveryPoint() != null ) { 250 for ( String s : contactInfo.getDeliveryPoint() ) { 251 appendElement( addr, OWSNS_1_1_0, PRE + "DeliveryPoint", s ); 252 } 253 } 254 if ( contactInfo.getCity() != null && !"".equals( contactInfo.getCity().trim() ) ) { 255 appendElement( addr, OWSNS_1_1_0, PRE + "City", contactInfo.getCity().trim() ); 256 } 257 if ( contactInfo.getAdministrativeArea() != null && !"".equals( contactInfo.getAdministrativeArea().trim() ) ) { 258 appendElement( addr, OWSNS_1_1_0, PRE + "AdministrativeArea", contactInfo.getAdministrativeArea() 259 .trim() ); 260 } 261 if ( contactInfo.getPostalCode() != null && !"".equals( contactInfo.getPostalCode().trim() ) ) { 262 appendElement( addr, OWSNS_1_1_0, PRE + "PostalCode", contactInfo.getPostalCode().trim() ); 263 } 264 if ( contactInfo.getCountry() != null && !"".equals( contactInfo.getCountry().trim() ) ) { 265 appendElement( addr, OWSNS_1_1_0, PRE + "Country", contactInfo.getCountry().trim() ); 266 } 267 if ( contactInfo.getElectronicMailAddress() != null ) { 268 for ( String s : contactInfo.getElectronicMailAddress() ) { 269 appendElement( addr, OWSNS_1_1_0, PRE + "ElectronicMailAddress", s ); 270 } 271 } 272 } 273 if ( contactInfo.getOnlineResource() != null && !"".equals( contactInfo.getOnlineResource().trim() ) ) { 274 Element onlineResource = appendElement( ci, OWSNS_1_1_0, PRE + "OnlineResource" ); 275 onlineResource.setAttributeNS( XLNNS.toASCIIString() , XLINK_PREFIX + ":href", contactInfo.getOnlineResource().trim() ); 276 } 277 278 if ( contactInfo.getHoursOfService() != null && !"".equals( contactInfo.getHoursOfService().trim() ) ) { 279 appendElement( ci, OWSNS_1_1_0, PRE + "HoursOfService", contactInfo.getHoursOfService().trim() ); 280 } 281 282 if ( contactInfo.getContactInstructions() != null && !"".equals( contactInfo.getContactInstructions().trim() ) ) { 283 appendElement( ci, OWSNS_1_1_0, PRE + "ContactInstructions", contactInfo.getContactInstructions().trim() ); 284 } 285 } 286 287 /** 288 * @param capabilitiesElement 289 * to export to if <code>null</code> nothing will be done. 290 * @param operationsMetadata 291 * to append if <code>null</code> nothing will be done (optional). 292 */ 293 protected void appendOperationsMetadata( Element capabilitiesElement, OperationsMetadata operationsMetadata ) { 294 if ( capabilitiesElement == null || operationsMetadata == null ) { 295 return; 296 } 297 Element omd = appendElement( capabilitiesElement, OWSNS_1_1_0, PRE + "OperationsMetadata" ); 298 appendOperations( omd, operationsMetadata.getOperations() ); 299 if ( operationsMetadata.getParameters() != null ) { 300 for ( DomainType domainType : operationsMetadata.getParameters() ) { 301 Element parameter = appendElement( omd, OWSNS_1_1_0, PRE + "Parameter" ); 302 appendDomainType( parameter, domainType ); 303 } 304 } 305 306 if ( operationsMetadata.getConstraints() != null ) { 307 for ( DomainType domainType : operationsMetadata.getConstraints() ) { 308 Element constraint = appendElement( omd, OWSNS_1_1_0, PRE + "Constraint" ); 309 appendDomainType( constraint, domainType ); 310 } 311 } 312 if ( operationsMetadata.getExtendedCapabilities() != null ) { 313 Node tmp = omd.getOwnerDocument().importNode( operationsMetadata.getExtendedCapabilities(), true ); 314 omd.appendChild( tmp ); 315 } 316 } 317 318 /** 319 * @param root 320 * to append to. 321 * @param operations 322 * may not be <code>null</code> 323 * @throws IllegalArgumentException 324 * if the list of operations < 2 or <code>null</code>. 325 */ 326 protected void appendOperations( Element root, List<Operation> operations ) { 327 if ( root == null ) { 328 return; 329 } 330 if ( operations == null || operations.size() < 2 ) { 331 throw new IllegalArgumentException( "The list of operations must at least contain 2 operations." ); 332 } 333 for ( Operation operation : operations ) { 334 Element opElement = appendElement( root, OWSNS_1_1_0, PRE + "Operation" ); 335 List<Pair<String, List<DomainType>>> getURLs = operation.getGetURLs(); 336 List<Pair<String, List<DomainType>>> postURLs = operation.getPostURLs(); 337 Element dcp = appendElement( opElement, OWSNS_1_1_0, PRE + "DCP" ); 338 Element httpElement = appendElement( dcp, OWSNS_1_1_0, PRE + "HTTP" ); 339 if ( getURLs != null ) { 340 for ( Pair<String, List<DomainType>> getURL : getURLs ) { 341 Element get = appendElement( httpElement, OWSNS_1_1_0, PRE + "Get" ); 342 if( getURL.first != null ){ 343 get.setAttributeNS( XLNNS.toASCIIString() , XLINK_PREFIX + ":href", getURL.first ); 344 } 345 if ( getURL.second != null && getURL.second.size() > 0 ) { 346 Element constraint = appendElement( get, OWSNS_1_1_0, PRE + "Constraint" ); 347 for ( DomainType domainType : getURL.second ) { 348 appendDomainType( constraint, domainType ); 349 } 350 } 351 } 352 } 353 if ( postURLs != null ) { 354 for ( Pair<String, List<DomainType>> postURL : postURLs ) { 355 Element post = appendElement( httpElement, OWSNS_1_1_0, PRE + "Post" ); 356 if( postURL.first != null ){ 357 post.setAttributeNS( XLNNS.toASCIIString() , XLINK_PREFIX + ":href", postURL.first ); 358 } 359 if ( postURL.second != null && postURL.second.size() > 0 ) { 360 Element constraint = appendElement( post, OWSNS_1_1_0, PRE + "Constraint" ); 361 for ( DomainType domainType : postURL.second ) { 362 appendDomainType( constraint, domainType ); 363 } 364 } 365 } 366 } 367 368 if ( operation.getParameters() != null ) { 369 for ( DomainType domainType : operation.getParameters() ) { 370 Element parameter = appendElement( opElement, OWSNS_1_1_0, PRE + "Parameter" ); 371 appendDomainType( parameter, domainType ); 372 } 373 } 374 375 if ( operation.getConstraints() != null ) { 376 for ( DomainType domainType : operation.getConstraints() ) { 377 Element constraint = appendElement( opElement, OWSNS_1_1_0, PRE + "Constraint" ); 378 appendDomainType( constraint, domainType ); 379 } 380 } 381 if ( operation.getMetadataAttribs() != null && operation.getMetadataAttribs().size() > 0 ) { 382 for ( Pair<String, String> attrib : operation.getMetadataAttribs() ) { 383 if ( attrib != null ) { 384 Element metadata = appendElement( opElement, OWSNS_1_1_0, PRE + "Metadata" ); 385 if( attrib.first != null ){ 386 metadata.setAttributeNS( XLNNS.toASCIIString() , XLINK_PREFIX + ":href", attrib.first ); 387 } 388 if( attrib.second != null ){ 389 metadata.setAttribute( "about", attrib.second ); 390 } 391 } 392 } 393 } 394 opElement.setAttribute( "name", operation.getName() ); 395 } 396 397 } 398 399 /** 400 * @param domainTypeElement 401 * to append the domainttype element to. 402 * @param domainType 403 * to append. 404 */ 405 protected void appendDomainType( Element domainTypeElement, DomainType domainType ) { 406 if ( domainTypeElement == null || domainType == null ) { 407 return; 408 } 409 domainTypeElement.setAttribute( "name", domainType.getName() ); 410 if ( domainType.hasAllowedValues() ) { 411 Element allowedValuesElem = appendElement( domainTypeElement, OWSNS_1_1_0, PRE + "AllowedValues" ); 412 List<String> values = domainType.getValues(); 413 if ( values != null ) { 414 for ( String value : values ) { 415 appendElement( allowedValuesElem, OWSNS_1_1_0, PRE + "Value", value ); 416 } 417 } 418 List<Range> ranges = domainType.getRanges(); 419 if ( ranges != null ) { 420 for ( Range r : ranges ) { 421 Element re = appendElement( allowedValuesElem, OWSNS_1_1_0, PRE + "Range" ); 422 if ( r.getMinimumValue() != null && !"".equals( r.getMinimumValue().trim() ) ) { 423 appendElement( re, OWSNS_1_1_0, PRE + "MinimumValue", r.getMinimumValue() ); 424 } 425 if ( r.getMaximumValue() != null && !"".equals( r.getMaximumValue().trim() ) ) { 426 appendElement( re, OWSNS_1_1_0, PRE + "MaximumValue", r.getMaximumValue() ); 427 } 428 if ( r.getSpacing() != null && !"".equals( r.getSpacing().trim() ) ) { 429 appendElement( re, OWSNS_1_1_0, PRE + "Spacing", r.getSpacing() ); 430 } 431 re.setAttribute( "rangeClosure", r.getRangeClosure() ); 432 } 433 } 434 } else if ( domainType.hasAnyValue() ) { 435 appendElement( domainTypeElement, OWSNS_1_1_0, PRE + "AnyValue" ); 436 } else if ( domainType.hasNoValues() ) { 437 appendElement( domainTypeElement, OWSNS_1_1_0, PRE + "NoValues" ); 438 } else { // a choice therefore this must be. 439 Element vref = appendElement( domainTypeElement, 440 OWSNS_1_1_0, 441 PRE + "ValuesReference", 442 domainType.getValuesReference().first ); 443 if ( domainType.getValuesReference().second != null ) { 444 vref.setAttribute( "reference", domainType.getValuesReference().second ); 445 } 446 } 447 if ( domainType.getDefaultValue() != null && !"".equals( domainType.getDefaultValue() ) ) { 448 appendElement( domainTypeElement, OWSNS_1_1_0, PRE + "DefaultValue", domainType.getDefaultValue().trim() ); 449 } 450 if ( domainType.getMeaning() != null ) { 451 Element tmp = appendElement( domainTypeElement, OWSNS_1_1_0, PRE + "Meaning", domainType.getMeaning().first ); 452 if( domainType.getMeaning().second != null ){ 453 tmp.setAttribute( "reference", domainType.getMeaning().second ); 454 } 455 } 456 if ( domainType.getDataType() != null ) { 457 Element tmp = appendElement( domainTypeElement, 458 OWSNS_1_1_0, 459 PRE + "DataType", 460 domainType.getDataType().first ); 461 if( domainType.getDataType().second != null ){ 462 tmp.setAttribute( "reference", domainType.getDataType().second ); 463 } 464 } 465 if ( domainType.hasValuesUnit() ) { 466 Element valuesUnit = appendElement( domainTypeElement, OWSNS_1_1_0, PRE + "ValuesUnit" ); 467 if ( domainType.getUom() != null ) { 468 Element tmp = appendElement( valuesUnit, OWSNS_1_1_0, PRE + "UOM", domainType.getUom().first ); 469 if( domainType.getUom().second != null ){ 470 tmp.setAttribute( "reference", domainType.getUom().second ); 471 } 472 } else { 473 Element tmp = appendElement( valuesUnit, 474 OWSNS_1_1_0, 475 PRE + "ReferenceSystem", 476 domainType.getReferenceSystem().first ); 477 if( domainType.getReferenceSystem().second != null ){ 478 tmp.setAttribute( "reference", domainType.getReferenceSystem().second ); 479 } 480 } 481 } 482 if ( domainType.getMetadataAttribs() != null && domainType.getMetadataAttribs().size() > 0 ) { 483 for ( Pair<String, String> attrib : domainType.getMetadataAttribs() ) { 484 if ( attrib != null ) { 485 Element metadata = appendElement( domainTypeElement, OWSNS_1_1_0, PRE + "Metadata" ); 486 if( attrib.first != null ){ 487 metadata.setAttributeNS( XLNNS.toASCIIString() , XLINK_PREFIX + ":href", attrib.first ); 488 } 489 if( attrib.second != null ){ 490 metadata.setAttribute( "about", attrib.second ); 491 } 492 } 493 } 494 } 495 } 496 497 }