001 //$HeadURL: svn+ssh://jwilden@svn.wald.intevation.org/deegree/base/branches/2.5_testing/src/org/deegree/ogcwebservices/wmps/XMLFactory.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.wmps; 037 038 import java.io.IOException; 039 import java.net.URL; 040 import java.util.Date; 041 import java.util.List; 042 043 import org.deegree.datatypes.xlink.SimpleLink; 044 import org.deegree.framework.log.ILogger; 045 import org.deegree.framework.log.LoggerFactory; 046 import org.deegree.framework.util.Pair; 047 import org.deegree.framework.xml.NamespaceContext; 048 import org.deegree.framework.xml.XMLParsingException; 049 import org.deegree.framework.xml.XMLTools; 050 import org.deegree.model.metadata.iso19115.Address; 051 import org.deegree.model.metadata.iso19115.Keywords; 052 import org.deegree.model.metadata.iso19115.Phone; 053 import org.deegree.model.spatialschema.Envelope; 054 import org.deegree.ogcbase.CommonNamespaces; 055 import org.deegree.ogcwebservices.getcapabilities.DCPType; 056 import org.deegree.ogcwebservices.getcapabilities.HTTP; 057 import org.deegree.ogcwebservices.getcapabilities.MetadataURL; 058 import org.deegree.ogcwebservices.getcapabilities.Operation; 059 import org.deegree.ogcwebservices.getcapabilities.ServiceIdentification; 060 import org.deegree.ogcwebservices.getcapabilities.ServiceProvider; 061 import org.deegree.ogcwebservices.wmps.capabilities.WMPSCapabilities; 062 import org.deegree.ogcwebservices.wmps.capabilities.WMPSCapabilitiesDocument; 063 import org.deegree.ogcwebservices.wmps.capabilities.WMPSOperationsMetadata; 064 import org.deegree.ogcwebservices.wmps.operation.DescribeTemplateResponse; 065 import org.deegree.ogcwebservices.wmps.operation.DescribeTemplateResponseDocument; 066 import org.deegree.ogcwebservices.wmps.operation.GetAvailableTemplatesResponse; 067 import org.deegree.ogcwebservices.wmps.operation.GetAvailableTemplatesResponseDocument; 068 import org.deegree.ogcwebservices.wmps.operation.PrintMapResponse; 069 import org.deegree.ogcwebservices.wmps.operation.PrintMapResponseDocument; 070 import org.deegree.ogcwebservices.wms.capabilities.Attribution; 071 import org.deegree.ogcwebservices.wms.capabilities.AuthorityURL; 072 import org.deegree.ogcwebservices.wms.capabilities.DataURL; 073 import org.deegree.ogcwebservices.wms.capabilities.Dimension; 074 import org.deegree.ogcwebservices.wms.capabilities.Extent; 075 import org.deegree.ogcwebservices.wms.capabilities.FeatureListURL; 076 import org.deegree.ogcwebservices.wms.capabilities.Identifier; 077 import org.deegree.ogcwebservices.wms.capabilities.Layer; 078 import org.deegree.ogcwebservices.wms.capabilities.LayerBoundingBox; 079 import org.deegree.ogcwebservices.wms.capabilities.LegendURL; 080 import org.deegree.ogcwebservices.wms.capabilities.LogoURL; 081 import org.deegree.ogcwebservices.wms.capabilities.ScaleHint; 082 import org.deegree.ogcwebservices.wms.capabilities.Style; 083 import org.deegree.ogcwebservices.wms.capabilities.StyleSheetURL; 084 import org.deegree.ogcwebservices.wms.capabilities.StyleURL; 085 import org.deegree.ogcwebservices.wms.capabilities.UserDefinedSymbolization; 086 import org.deegree.owscommon.OWSDomainType; 087 import org.w3c.dom.Element; 088 import org.w3c.dom.Node; 089 import org.xml.sax.SAXException; 090 091 /** 092 * Helper class to create WMPS responses. 093 * 094 * @author <a href="mailto:deshmukh@lat-lon.de">Anup Deshmukh</a> 095 * @version 2.0 096 * 097 */ 098 public class XMLFactory extends org.deegree.owscommon.XMLFactory { 099 100 private static final ILogger LOG = LoggerFactory.getLogger( XMLFactory.class ); 101 102 private static NamespaceContext nsContext = CommonNamespaces.getNamespaceContext(); 103 104 /** 105 * Exports a <code>WMPSCapabilities</code> instance to a <code>WMPSCapabilitiesDocument</code>. 106 * 107 * @param capabilities 108 * @return DOM representation of the <code>WMPSCapabilities</code> 109 * @throws IOException 110 * if XML template could not be loaded 111 */ 112 public static WMPSCapabilitiesDocument export( WMPSCapabilities capabilities ) 113 throws IOException { 114 115 WMPSCapabilitiesDocument capabilitiesDocument = new WMPSCapabilitiesDocument(); 116 try { 117 capabilitiesDocument.createEmptyDocument(); 118 Element root = capabilitiesDocument.getRootElement(); 119 root.setAttribute( "version", capabilities.getVersion() ); 120 121 appendService( root, capabilities.getServiceIdentification(), capabilities.getServiceProvider() ); 122 123 String xPath = "./Capability"; 124 appendUserDefinedSymbolization( (Element) XMLTools.getNode( root, xPath, nsContext ), 125 capabilities.getUserDefinedSymbolization() ); 126 127 appendCapabilityRequests( root, (WMPSOperationsMetadata) capabilities.getOperationMetadata() ); 128 129 appendCapabilityLayer( (Element) XMLTools.getNode( root, "./Capability", nsContext ), 130 capabilities.getLayer() ); 131 132 } catch ( SAXException e ) { 133 LOG.logError( e.getMessage(), e ); 134 } catch ( XMLParsingException e ) { 135 LOG.logError( e.getMessage(), e ); 136 } 137 138 return capabilitiesDocument; 139 } 140 141 /** 142 * Append User defined symbolization. 143 * 144 * @param root 145 * @param uds 146 */ 147 protected static void appendUserDefinedSymbolization( Element root, UserDefinedSymbolization uds ) { 148 149 Element elem = XMLTools.appendElement( root, null, "UserDefinedSymbolization" ); 150 elem.setAttribute( "SupportSLD", Boolean.toString( uds.isSldSupported() ) ); 151 elem.setAttribute( "UserLayer", Boolean.toString( uds.isUserLayerSupported() ) ); 152 elem.setAttribute( "UserStyle", Boolean.toString( uds.isUserStyleSupported() ) ); 153 elem.setAttribute( "RemoteWFS", Boolean.toString( uds.isRemoteWFSSupported() ) ); 154 155 } 156 157 /** 158 * Append service element 159 * 160 * @param root 161 * @param identification 162 * @param provider 163 * @throws XMLParsingException 164 */ 165 protected static void appendService( Element root, ServiceIdentification identification, ServiceProvider provider ) 166 throws XMLParsingException { 167 168 root = (Element) XMLTools.getRequiredNode( root, "./Service", nsContext ); 169 170 Node node = XMLTools.getRequiredNode( root, "./Name", nsContext ); 171 XMLTools.setNodeValue( (Element) node, identification.getTitle() ); 172 173 node = XMLTools.getRequiredNode( root, "./Title", nsContext ); 174 XMLTools.setNodeValue( (Element) node, identification.getTitle() ); 175 176 String serviceAbstract = identification.getAbstract(); 177 if ( serviceAbstract != null ) { 178 XMLTools.appendElement( root, null, "Abstract", serviceAbstract ); 179 } 180 181 Keywords[] keywords = identification.getKeywords(); 182 if ( keywords.length > 0 ) { 183 String[] kw = keywords[0].getKeywords(); 184 Element kwl = XMLTools.appendElement( root, null, "KeywordList" ); 185 for ( int i = 0; i < kw.length; i++ ) { 186 XMLTools.appendElement( kwl, null, "Keyword", kw[i] ); 187 } 188 } 189 190 node = XMLTools.getRequiredNode( root, "./OnlineResource", nsContext ); 191 SimpleLink sLink = provider.getProviderSite(); 192 ( (Element) node ).setAttribute( "xlink:href", sLink.getHref().toASCIIString() ); 193 194 appendContactInformation( root, provider ); 195 196 if ( identification.getFees() != null ) { 197 XMLTools.appendElement( root, null, "Fees", identification.getFees() ); 198 } else { 199 XMLTools.appendElement( root, null, "Fees", "none" ); 200 } 201 202 if ( identification.getAccessConstraints().length > 0 ) { 203 XMLTools.appendElement( root, null, "AccessConstraints", identification.getAccessConstraints()[0] ); 204 } else { 205 XMLTools.appendElement( root, null, "AccessConstraints", "none" ); 206 } 207 208 } 209 210 /** 211 * Append contact information 212 * 213 * @param root 214 * @param provider 215 */ 216 protected static void appendContactInformation( Element root, ServiceProvider provider ) { 217 218 Element ciNode = XMLTools.appendElement( root, null, "ContactInformation" ); 219 Element cppNode = XMLTools.appendElement( ciNode, null, "ContactPersonPrimary" ); 220 if ( provider.getIndividualName() != null ) { 221 XMLTools.appendElement( cppNode, null, "ContactPerson", provider.getIndividualName() ); 222 } 223 if ( provider.getProviderName() != null ) { 224 XMLTools.appendElement( cppNode, null, "ContactOrganization", provider.getProviderName() ); 225 } 226 if ( provider.getPositionName() != null ) { 227 XMLTools.appendElement( ciNode, null, "ContactPosition", provider.getPositionName() ); 228 } 229 Element caNode = XMLTools.appendElement( ciNode, null, "ContactAddress" ); 230 231 XMLTools.appendElement( caNode, null, "AddressType", "postal" ); 232 233 Address addr = provider.getContactInfo().getAddress(); 234 String[] dp = addr.getDeliveryPoint(); 235 if ( dp.length > 0 ) { 236 XMLTools.appendElement( caNode, null, "Address", dp[0] ); 237 } 238 if ( addr.getCity() != null ) { 239 XMLTools.appendElement( caNode, null, "City", addr.getCity() ); 240 } 241 if ( addr.getAdministrativeArea() != null ) { 242 XMLTools.appendElement( caNode, null, "StateOrProvince", addr.getAdministrativeArea() ); 243 } 244 if ( addr.getPostalCode() != null ) { 245 XMLTools.appendElement( caNode, null, "PostCode", addr.getPostalCode() ); 246 } 247 if ( addr.getCountry() != null ) { 248 XMLTools.appendElement( caNode, null, "Country", addr.getCountry() ); 249 } 250 Phone phone = provider.getContactInfo().getPhone(); 251 if ( phone.getVoice().length > 0 ) { 252 XMLTools.appendElement( ciNode, null, "ContactVoiceTelephone", phone.getVoice()[0] ); 253 } 254 if ( phone.getFacsimile().length > 0 ) { 255 XMLTools.appendElement( ciNode, null, "ContactFacsimileTelephone", phone.getFacsimile()[0] ); 256 } 257 if ( addr.getElectronicMailAddress().length > 0 ) { 258 XMLTools.appendElement( ciNode, null, "ContactElectronicMailAddress", addr.getElectronicMailAddress()[0] ); 259 } 260 261 } 262 263 /** 264 * Append capability element. 265 * 266 * @param root 267 * @param operationsMetadata 268 * @throws XMLParsingException 269 */ 270 protected static void appendCapabilityRequests( Element root, WMPSOperationsMetadata operationsMetadata ) 271 throws XMLParsingException { 272 273 root = (Element) XMLTools.getRequiredNode( root, "./Capability/Request", nsContext ); 274 275 Operation[] ops = operationsMetadata.getOperations(); 276 for ( int i = 0; i < ops.length; i++ ) { 277 if ( ops[i] != null ) { 278 appendOperation( root, ops[i] ); 279 } 280 } 281 282 } 283 284 /** 285 * Append Operations. 286 * 287 * @param root 288 * @param operation 289 */ 290 protected static void appendOperation( Element root, Operation operation ) { 291 292 String name = operation.getName(); 293 root = XMLTools.appendElement( root, null, name ); 294 295 OWSDomainType odt = operation.getParameter( "Format" ); 296 String[] values = odt.getValues(); 297 for ( int i = 0; i < values.length; i++ ) { 298 XMLTools.appendElement( root, null, "Format", values[i] ); 299 } 300 301 DCPType[] dcps = operation.getDCPs(); 302 for ( int i = 0; i < dcps.length; i++ ) { 303 Element http = XMLTools.appendElement( root, null, "DCPType" ); 304 http = XMLTools.appendElement( http, null, "HTTP" ); 305 HTTP ht = (HTTP) dcps[i].getProtocol(); 306 URL[] urls = ht.getGetOnlineResources(); 307 appendURLs( http, urls, "Get" ); 308 urls = ht.getPostOnlineResources(); 309 appendURLs( http, urls, "Post" ); 310 } 311 312 } 313 314 /** 315 * Append URLs 316 * 317 * @param http 318 * @param urls 319 * @param type 320 */ 321 protected static void appendURLs( Element http, URL[] urls, String type ) { 322 for ( int j = 0; j < urls.length; j++ ) { 323 Element olr = XMLTools.appendElement( http, null, type ); 324 appendOnlineResource( olr, urls[j] ); 325 } 326 } 327 328 /** 329 * Append capability layer 330 * 331 * @param root 332 * @param layer 333 * @throws XMLParsingException 334 */ 335 protected static void appendCapabilityLayer( Element root, Layer layer ) 336 throws XMLParsingException { 337 338 root = XMLTools.appendElement( root, null, "Layer" ); 339 root.setAttribute( "queryable", Boolean.toString( layer.isQueryable() ) ); 340 root.setAttribute( "cascaded", Integer.toString( layer.getCascaded() ) ); 341 root.setAttribute( "opaque", Boolean.toString( layer.isOpaque() ) ); 342 root.setAttribute( "noSubsets", Boolean.toString( layer.hasNoSubsets() ) ); 343 if ( layer.getFixedWidth() > 0 ) { 344 root.setAttribute( "fixedWidth", Integer.toString( layer.getFixedWidth() ) ); 345 } 346 if ( layer.getFixedHeight() > 0 ) { 347 root.setAttribute( "fixedHeight", Integer.toString( layer.getFixedHeight() ) ); 348 } 349 350 if ( layer.getName() != null ) { 351 XMLTools.appendElement( root, null, "Name", layer.getName() ); 352 } 353 XMLTools.appendElement( root, null, "Title", layer.getTitle() ); 354 355 if ( layer.getAbstract() != null ) { 356 XMLTools.appendElement( root, null, "Abstract", layer.getAbstract() ); 357 } 358 359 String[] keywords = layer.getKeywordList(); 360 if ( keywords.length > 0 ) { 361 Element elem = XMLTools.appendElement( root, null, "KeywordList" ); 362 for ( int i = 0; i < keywords.length; i++ ) { 363 XMLTools.appendElement( elem, null, "Keyword", keywords[i] ); 364 } 365 } 366 367 String[] srs = layer.getSrs(); 368 for ( int i = 0; i < srs.length; i++ ) { 369 XMLTools.appendElement( root, null, "SRS", srs[i] ); 370 } 371 372 Envelope llBox = layer.getLatLonBoundingBox(); 373 appendLatLonBoundingBox( root, llBox ); 374 375 LayerBoundingBox[] lBoxes = layer.getBoundingBoxes(); 376 for ( int i = 0; i < lBoxes.length; i++ ) { 377 appendLayerBoundingBox( root, lBoxes[i] ); 378 } 379 380 Dimension[] dims = layer.getDimension(); 381 for ( int i = 0; i < dims.length; i++ ) { 382 appendDimension( root, dims[i] ); 383 } 384 385 Extent[] extents = layer.getExtent(); 386 for ( int i = 0; i < extents.length; i++ ) { 387 appendExtent( root, extents[i] ); 388 } 389 390 Attribution attr = layer.getAttribution(); 391 if ( attr != null ) { 392 appendAttribution( root, attr ); 393 } 394 395 AuthorityURL[] authorityURLs = layer.getAuthorityURL(); 396 for ( int i = 0; i < authorityURLs.length; i++ ) { 397 appendAuthorityURL( root, authorityURLs[i] ); 398 } 399 400 Identifier[] identifiers = layer.getIdentifier(); 401 for ( int i = 0; i < identifiers.length; i++ ) { 402 appendIdentifier( root, identifiers[i] ); 403 } 404 405 MetadataURL[] metadataURLs = layer.getMetadataURL(); 406 for ( int i = 0; i < metadataURLs.length; i++ ) { 407 appendMetadataURL( root, metadataURLs[i] ); 408 } 409 410 DataURL[] dataURLs = layer.getDataURL(); 411 for ( int i = 0; i < dataURLs.length; i++ ) { 412 appendDataURL( root, dataURLs[i] ); 413 } 414 415 FeatureListURL[] featureListURLs = layer.getFeatureListURL(); 416 for ( int i = 0; i < featureListURLs.length; i++ ) { 417 appendFeatureListURL( root, featureListURLs[i] ); 418 } 419 420 Style[] styles = layer.getStyles(); 421 for ( int i = 0; i < styles.length; i++ ) { 422 appendStyle( root, styles[i] ); 423 } 424 425 ScaleHint scaleHint = layer.getScaleHint(); 426 Element elem = XMLTools.appendElement( root, null, "ScaleHint" ); 427 elem.setAttribute( "min", "" + scaleHint.getMin() ); 428 elem.setAttribute( "max", "" + scaleHint.getMax() ); 429 430 Layer[] layers = layer.getLayer(); 431 for ( int i = 0; i < layers.length; i++ ) { 432 appendCapabilityLayer( root, layers[i] ); 433 } 434 435 } 436 437 /** 438 * Append style 439 * 440 * @param root 441 * @param style 442 */ 443 protected static void appendStyle( Element root, Style style ) { 444 445 root = XMLTools.appendElement( root, null, "Style" ); 446 XMLTools.appendElement( root, null, "Name", style.getName() ); 447 if ( style.getTitle() != null ) { 448 XMLTools.appendElement( root, null, "Title", style.getTitle() ); 449 } 450 if ( style.getAbstract() != null ) { 451 XMLTools.appendElement( root, null, "Abstract", style.getAbstract() ); 452 } 453 LegendURL[] legendURLs = style.getLegendURL(); 454 for ( int i = 0; i < legendURLs.length; i++ ) { 455 appendLegendURL( root, legendURLs[i] ); 456 } 457 458 StyleSheetURL styleSheetURL = style.getStyleSheetURL(); 459 if ( styleSheetURL != null ) { 460 appendStyleSheetURL( root, styleSheetURL ); 461 } 462 463 StyleURL styleURL = style.getStyleURL(); 464 if ( styleURL != null ) { 465 appendStyleURL( root, styleURL ); 466 } 467 468 } 469 470 /** 471 * Append Style URL 472 * 473 * @param root 474 * @param styleURL 475 * 476 */ 477 protected static void appendStyleURL( Element root, StyleURL styleURL ) { 478 Element elem = XMLTools.appendElement( root, null, "StyleURL" ); 479 XMLTools.appendElement( elem, null, "Format", styleURL.getFormat() ); 480 appendOnlineResource( elem, styleURL.getOnlineResource() ); 481 } 482 483 /** 484 * Append Style sheet. 485 * 486 * @param root 487 * @param styleSheetURL 488 */ 489 protected static void appendStyleSheetURL( Element root, StyleSheetURL styleSheetURL ) { 490 Element elem = XMLTools.appendElement( root, null, "StyleSheetURL" ); 491 XMLTools.appendElement( elem, null, "Format", styleSheetURL.getFormat() ); 492 appendOnlineResource( elem, styleSheetURL.getOnlineResource() ); 493 } 494 495 /** 496 * Append legend url. 497 * 498 * @param root 499 * @param legendURL 500 */ 501 protected static void appendLegendURL( Element root, LegendURL legendURL ) { 502 Element elem = XMLTools.appendElement( root, null, "LegendURL" ); 503 elem.setAttribute( "width", "" + legendURL.getWidth() ); 504 elem.setAttribute( "height", "" + legendURL.getWidth() ); 505 XMLTools.appendElement( elem, null, "Format", legendURL.getFormat() ); 506 507 appendOnlineResource( elem, legendURL.getOnlineResource() ); 508 } 509 510 /** 511 * Append feature list url. 512 * 513 * @param root 514 * @param featureListURL 515 */ 516 protected static void appendFeatureListURL( Element root, FeatureListURL featureListURL ) { 517 Element elem = XMLTools.appendElement( root, null, "FeatureListURL" ); 518 XMLTools.appendElement( elem, null, "Format", featureListURL.getFormat() ); 519 appendOnlineResource( elem, featureListURL.getOnlineResource() ); 520 } 521 522 /** 523 * Append data url. 524 * 525 * @param root 526 * @param dataURL 527 */ 528 protected static void appendDataURL( Element root, DataURL dataURL ) { 529 Element elem = XMLTools.appendElement( root, null, "DataURL" ); 530 XMLTools.appendElement( elem, null, "Format", dataURL.getFormat() ); 531 appendOnlineResource( elem, dataURL.getOnlineResource() ); 532 } 533 534 /** 535 * Append metadata url. 536 * 537 * @param root 538 * @param metadataURL 539 */ 540 protected static void appendMetadataURL( Element root, MetadataURL metadataURL ) { 541 Element elem = XMLTools.appendElement( root, null, "MetadataURL" ); 542 elem.setAttribute( "type", metadataURL.getType() ); 543 XMLTools.appendElement( elem, null, "Format", metadataURL.getFormat() ); 544 appendOnlineResource( elem, metadataURL.getOnlineResource() ); 545 } 546 547 /** 548 * Append identifiers. 549 * 550 * @param root 551 * @param identifier 552 */ 553 protected static void appendIdentifier( Element root, Identifier identifier ) { 554 Element elem = XMLTools.appendElement( root, null, "Identifier" ); 555 elem.setAttribute( "authority", identifier.getAuthority() ); 556 XMLTools.setNodeValue( elem, identifier.getValue() ); 557 } 558 559 /** 560 * Append authority url. 561 * 562 * @param root 563 * @param authorityURL 564 */ 565 protected static void appendAuthorityURL( Element root, AuthorityURL authorityURL ) { 566 Element elem = XMLTools.appendElement( root, null, "AuthorityURL" ); 567 elem.setAttribute( "name", authorityURL.getName() ); 568 appendOnlineResource( elem, authorityURL.getOnlineResource() ); 569 } 570 571 /** 572 * Append attribution url. 573 * 574 * @param root 575 * @param attr 576 */ 577 protected static void appendAttribution( Element root, Attribution attr ) { 578 Element elem = XMLTools.appendElement( root, null, "Attribution" ); 579 XMLTools.appendElement( elem, null, "Title", attr.getTitle() ); 580 appendOnlineResource( elem, attr.getOnlineResource() ); 581 LogoURL logoURL = attr.getLogoURL(); 582 if ( logoURL != null ) { 583 elem = XMLTools.appendElement( elem, null, "LogoURL" ); 584 elem.setAttribute( "width", "" + logoURL.getWidth() ); 585 elem.setAttribute( "height", "" + logoURL.getHeight() ); 586 XMLTools.appendElement( elem, null, "Format", logoURL.getFormat() ); 587 appendOnlineResource( elem, logoURL.getOnlineResource() ); 588 } 589 } 590 591 /** 592 * Append online resource. 593 * 594 * @param root 595 * @param url 596 */ 597 protected static void appendOnlineResource( Element root, URL url ) { 598 Element olr = XMLTools.appendElement( root, null, "OnlineResource" ); 599 olr.setAttribute( "xlink:type", "simple" ); 600 olr.setAttribute( "xlink:href", url.toExternalForm() ); 601 } 602 603 /** 604 * Apppend extent. 605 * 606 * @param root 607 * @param extent 608 */ 609 protected static void appendExtent( Element root, Extent extent ) { 610 Element exNode = XMLTools.appendElement( root, null, "Extent" ); 611 exNode.setAttribute( "name", extent.getName() ); 612 exNode.setAttribute( "default", extent.getDefault() ); 613 exNode.setAttribute( "nearestValue", Boolean.toString( extent.useNearestValue() ) ); 614 XMLTools.setNodeValue( exNode, extent.getValue() ); 615 } 616 617 /** 618 * Append dimension. 619 * 620 * @param root 621 * @param dim 622 */ 623 protected static void appendDimension( Element root, Dimension dim ) { 624 Element dimNode = XMLTools.appendElement( root, null, "Dimension" ); 625 dimNode.setAttribute( "name", dim.getName() ); 626 dimNode.setAttribute( "units", dim.getUnits() ); 627 dimNode.setAttribute( "unitSymbol", dim.getUnitSymbol() ); 628 } 629 630 /** 631 * Append layer bounding box. 632 * 633 * @param root 634 * @param lBox 635 */ 636 protected static void appendLayerBoundingBox( Element root, LayerBoundingBox lBox ) { 637 Element bbNode = XMLTools.appendElement( root, null, "BoundingBox" ); 638 bbNode.setAttribute( "minx", "" + lBox.getMin().getX() ); 639 bbNode.setAttribute( "miny", "" + lBox.getMin().getY() ); 640 bbNode.setAttribute( "maxx", "" + lBox.getMax().getX() ); 641 bbNode.setAttribute( "maxy", "" + lBox.getMax().getY() ); 642 bbNode.setAttribute( "resx", "" + lBox.getResx() ); 643 bbNode.setAttribute( "resy", "" + lBox.getResy() ); 644 bbNode.setAttribute( "SRS", "" + lBox.getSRS() ); 645 } 646 647 /** 648 * Append lat-lon bounding box. 649 * 650 * @param root 651 * @param llBox 652 */ 653 protected static void appendLatLonBoundingBox( Element root, Envelope llBox ) { 654 Element bbNode = XMLTools.appendElement( root, null, "LatLonBoundingBox" ); 655 bbNode.setAttribute( "minx", "" + llBox.getMin().getX() ); 656 bbNode.setAttribute( "miny", "" + llBox.getMin().getY() ); 657 bbNode.setAttribute( "maxx", "" + llBox.getMax().getX() ); 658 bbNode.setAttribute( "maxy", "" + llBox.getMax().getY() ); 659 } 660 661 /** 662 * Export the print map initial response document. 663 * 664 * @param response 665 * @return PrintMapResponseDocument 666 * @throws XMLParsingException 667 * 668 */ 669 public static PrintMapResponseDocument export( PrintMapResponse response ) 670 throws XMLParsingException { 671 672 PrintMapResponseDocument document = new PrintMapResponseDocument( null ); 673 try { 674 document.createEmptyDocument(); 675 Element root = document.getRootElement(); 676 root.setAttribute( "id", response.getId() ); 677 appendEmailAddress( root, response.getEmailAddress() ); 678 appendTimeStamp( root, response.getTimeStamp() ); 679 String exception = response.getException(); 680 String message = response.getMessage(); 681 if ( exception != null ) { 682 message = message + " " + exception; 683 } 684 appendMessage( root, message ); 685 appendExpectedTime( root, response.getExpectedTime() ); 686 } catch ( SAXException e ) { 687 LOG.logError( e.getMessage(), e ); 688 } catch ( IOException e ) { 689 LOG.logError( e.getMessage(), e ); 690 } 691 692 return document; 693 694 } 695 696 /** 697 * Export the print map initial response document. 698 * 699 * @param response 700 * @return GetAvailableTemplatesResponseDocument 701 * @throws XMLParsingException 702 * 703 */ 704 public static GetAvailableTemplatesResponseDocument export( GetAvailableTemplatesResponse response ) 705 throws XMLParsingException { 706 707 GetAvailableTemplatesResponseDocument document = new GetAvailableTemplatesResponseDocument( null ); 708 try { 709 document.createEmptyDocument(); 710 Element root = document.getRootElement(); 711 712 List<String> list = response.getTemplates(); 713 for ( String template : list ) { 714 Element tmplNode = XMLTools.appendElement( root, CommonNamespaces.DEEGREEWMPS, "Template" ); 715 XMLTools.setNodeValue( tmplNode, template ); 716 } 717 718 } catch ( SAXException e ) { 719 LOG.logError( e.getMessage(), e ); 720 } catch ( IOException e ) { 721 LOG.logError( e.getMessage(), e ); 722 } 723 724 return document; 725 726 } 727 728 /** 729 * @param response 730 * @return DescribeTemplateResponse as XML document 731 */ 732 public static Object export( DescribeTemplateResponse response ) { 733 DescribeTemplateResponseDocument document = new DescribeTemplateResponseDocument( null ); 734 try { 735 document.createEmptyDocument(); 736 Element root = document.getRootElement(); 737 738 List<Pair<String, String>> list = response.getParamter(); 739 for ( Pair<String, String> pair : list ) { 740 Element tmplNode = XMLTools.appendElement( root, CommonNamespaces.DEEGREEWMPS, "Parameter" ); 741 tmplNode.setAttribute( "name", pair.first ); 742 tmplNode.setAttribute( "type", pair.second ); 743 } 744 745 } catch ( SAXException e ) { 746 LOG.logError( e.getMessage(), e ); 747 } catch ( IOException e ) { 748 LOG.logError( e.getMessage(), e ); 749 } 750 751 return document; 752 753 } 754 755 /** 756 * Append email address. 757 * 758 * @param root 759 * @param emailAddress 760 * @throws XMLParsingException 761 */ 762 private static void appendEmailAddress( Element root, String emailAddress ) 763 throws XMLParsingException { 764 765 Node node; 766 try { 767 node = XMLTools.getRequiredNode( root, "deegreewmps:EmailAddress", nsContext ); 768 } catch ( XMLParsingException e ) { 769 throw new XMLParsingException( "Error getting node 'deegreewmps:EmailAddress'. " 770 + "Please check the WMPSInitialResponseTemplate " 771 + "to confirm its presence." ); 772 } 773 XMLTools.setNodeValue( (Element) node, emailAddress ); 774 775 } 776 777 /** 778 * Append expected processing time. 779 * 780 * @param root 781 * @param expectedTime 782 * @throws XMLParsingException 783 */ 784 private static void appendExpectedTime( Element root, Date expectedTime ) 785 throws XMLParsingException { 786 787 Node node; 788 try { 789 node = XMLTools.getRequiredNode( root, "deegreewmps:ExpectedProcessingTime", nsContext ); 790 } catch ( XMLParsingException e ) { 791 throw new XMLParsingException( "Error getting node " + "'deegreewmps:expectedProcessingTime'. " 792 + "Please check the WMPSInitialResponseTemplate " 793 + "to confirm its presence." ); 794 795 } 796 XMLTools.setNodeValue( (Element) node, expectedTime.toString() ); 797 798 } 799 800 /** 801 * Append message to be displayed to the user. 802 * 803 * @param root 804 * @param message 805 * @throws XMLParsingException 806 */ 807 private static void appendMessage( Element root, String message ) 808 throws XMLParsingException { 809 810 Node node; 811 try { 812 node = XMLTools.getRequiredNode( root, "deegreewmps:Message", nsContext ); 813 } catch ( XMLParsingException e ) { 814 throw new XMLParsingException( "Error getting node 'deegreewmps:message'. " 815 + "Please check the WMPSInitialResponseTemplate " 816 + "to confirm its presence." ); 817 818 } 819 XMLTools.setNodeValue( (Element) node, message ); 820 821 } 822 823 /** 824 * Append time stamp. 825 * 826 * @param root 827 * @param timeStamp 828 * @throws XMLParsingException 829 */ 830 private static void appendTimeStamp( Element root, Date timeStamp ) 831 throws XMLParsingException { 832 833 Node node; 834 try { 835 node = XMLTools.getRequiredNode( root, "deegreewmps:Timestamp", nsContext ); 836 } catch ( XMLParsingException e ) { 837 throw new XMLParsingException( "Error getting node 'deegreewmps:timestamp'. " 838 + "Please check the WMPSInitialResponseTemplate " 839 + "to confirm its presence." ); 840 } 841 XMLTools.setNodeValue( (Element) node, timeStamp.toString() ); 842 843 } 844 845 846 }