001 //$HeadURL: svn+ssh://jwilden@svn.wald.intevation.org/deegree/base/branches/2.5_testing/src/org/deegree/portal/context/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 037 package org.deegree.portal.context; 038 039 import java.awt.Rectangle; 040 import java.net.MalformedURLException; 041 import java.net.URI; 042 import java.net.URISyntaxException; 043 import java.net.URL; 044 import java.util.List; 045 046 import javax.xml.parsers.ParserConfigurationException; 047 048 import org.deegree.framework.util.Parameter; 049 import org.deegree.framework.util.ParameterList; 050 import org.deegree.framework.xml.XMLFragment; 051 import org.deegree.framework.xml.XMLTools; 052 import org.deegree.model.metadata.iso19115.CitedResponsibleParty; 053 import org.deegree.model.metadata.iso19115.ContactInfo; 054 import org.deegree.model.spatialschema.Point; 055 import org.deegree.ogcbase.BaseURL; 056 import org.deegree.ogcbase.CommonNamespaces; 057 import org.deegree.ogcbase.ImageURL; 058 import org.deegree.ogcwebservices.OWSUtils; 059 import org.w3c.dom.Attr; 060 import org.w3c.dom.DOMException; 061 import org.w3c.dom.Document; 062 import org.w3c.dom.Element; 063 import org.w3c.dom.Node; 064 import org.w3c.dom.Text; 065 066 /** 067 * This is a factory class to export a <code>ViewContext</code> and a <code>ViewContextCollection</code> as an xml 068 * <code>org.w3c.dom.Document</code>. 069 * 070 * 071 * @version $Revision: 23790 $ 072 * @author <a href="mailto:poth@lat-lon.de">Andreas Poth</a> 073 * @author last edited by: $Author: jmays $ 074 * 075 * @version $Revision: 23790 $, $Date: 2010-04-23 14:22:04 +0200 (Fr, 23 Apr 2010) $ 076 */ 077 public class XMLFactory { 078 079 // Import and define constants 080 private static URI OGC_CONTEXT_NS = CommonNamespaces.CNTXTNS; 081 082 private static URI D_CONTEXT_NS = CommonNamespaces.DGCNTXTNS; 083 084 private static URI SLD_NS = CommonNamespaces.SLDNS; 085 086 private static URI XSI_NS = CommonNamespaces.buildNSURI( "http://www.w3.org/2001/XMLSchema-instance" ); 087 088 private static URI XLINK_NS = CommonNamespaces.buildNSURI( "http://www.w3.org/1999/xlink" ); 089 090 // Common objects 091 protected static javax.xml.parsers.DocumentBuilderFactory factory = null; 092 093 protected static javax.xml.parsers.DocumentBuilder builder = null; 094 095 protected static Document document = null; 096 097 private XMLFactory() { 098 // Forbid instantiation 099 } 100 101 /** 102 * Convenience method for creating a common document builder. Implementation copied from XmlDocument (by tf and ap). 103 * 104 * @throws ParserConfigurationException 105 */ 106 protected static void initDocBuilder() 107 throws ParserConfigurationException { 108 109 if ( builder == null ) { 110 if ( factory == null ) { 111 factory = javax.xml.parsers.DocumentBuilderFactory.newInstance(); 112 factory.setIgnoringElementContentWhitespace( true ); 113 factory.setNamespaceAware( false ); 114 factory.setExpandEntityReferences( false ); 115 } 116 builder = factory.newDocumentBuilder(); 117 } 118 119 } 120 121 /** 122 * Creates a new <code>org.w3c.dom.Document</code> using the internal document builder. 123 * 124 * @return new <code>Document</code> instance 125 * @throws ParserConfigurationException 126 */ 127 protected static Document createDocument() 128 throws ParserConfigurationException { 129 130 initDocBuilder(); 131 132 return builder.newDocument(); 133 } 134 135 /** 136 * Creates a new <code>org.w3c.dom.Element</code>. 137 * 138 * @param namespace 139 * the element namespace 140 * @param elemName 141 * the element name 142 * @return new <code>Element</code> instance 143 */ 144 private static Element createElement( URI namespace, String elemName ) { 145 146 return document.createElementNS( namespace == null ? null : namespace.toString(), elemName ); 147 } 148 149 /** 150 * Creates a new <code>org.w3c.dom.Attr</code>. 151 * 152 * @param attName 153 * the attribute name 154 * @param value 155 * the attribute value 156 * @return new <code>Attr</code> instance 157 */ 158 private static Attr createAttribute( String attName, String value ) { 159 160 Attr attr = document.createAttribute( attName ); 161 attr.setValue( value ); 162 163 return attr; 164 } 165 166 /** 167 * Creates a new <code>org.w3c.dom.Text</code>. This is the textual content of an element. 168 * 169 * @param text 170 * the attribute name (if <code>null</code>, then context stays empty) 171 * @return new <code>Text</code> instance 172 */ 173 private static Text createTextNode( String text ) { 174 175 String t = ""; 176 if ( text != null ) { 177 t = text; 178 } 179 180 return document.createTextNode( t ); 181 } 182 183 /** 184 * Creates a new <code>org.w3c.dom.Document</code> describing a <code>ViewContext</code>. 185 * 186 * @param viewContext 187 * the <code>ViewContext</code> to be exported 188 * @return the xml dom-representation of the given viewContext. 189 * @throws ParserConfigurationException 190 * if an XML parser couldn't be found 191 */ 192 public static XMLFragment export( ViewContext viewContext ) 193 throws ParserConfigurationException { 194 195 document = createDocument(); 196 // start appending nodes... 197 try { 198 appendViewContext( document, viewContext ); 199 } catch ( Exception e ) { 200 e.printStackTrace(); 201 throw new ParserConfigurationException( e.getMessage() ); 202 } 203 204 XMLFragment xml = null; 205 try { 206 xml = new XMLFragment( document, XMLFragment.DEFAULT_URL ); 207 } catch ( MalformedURLException neverHappens ) { 208 neverHappens.printStackTrace(); 209 } 210 211 return xml; 212 } 213 214 /** 215 * Creates a new <code>org.w3c.dom.Document</code> describing a <code>ViewContextCollection</code>. 216 * 217 * @param viewContCollec 218 * the <code>ViewContextCollection</code> to be exported 219 * @return the xml dom-representation of the given viewContextCollection. 220 * @throws ParserConfigurationException 221 * if an XML parser couldn't be found 222 * 223 */ 224 public static Document export( ViewContextCollection viewContCollec ) 225 throws ParserConfigurationException { 226 227 document = createDocument(); 228 // start appending nodes... 229 appendViewContextCollection( document, viewContCollec ); 230 231 return document; 232 } 233 234 /** 235 * Appends the XML representation of a <code>ViewContext</code> to a <code>Node</code> using the 236 * <code>namespace</code>. 237 * 238 * @param toNode 239 * the <code>Node</code> to append the new element to 240 * @param viewContxt 241 * the <code>ViewContext</code> to be appended as new element 242 * @throws URISyntaxException 243 * @throws DOMException 244 * 245 * 246 */ 247 protected static void appendViewContext( Node toNode, ViewContext viewContxt ) 248 throws DOMException, URISyntaxException { 249 250 if ( viewContxt != null ) { 251 Element e = createElement( OGC_CONTEXT_NS, "ViewContext" ); 252 Element rootNode = (Element) toNode.appendChild( e ); 253 XMLTools.appendNSBinding( rootNode, "sld", SLD_NS ); 254 XMLTools.appendNSBinding( rootNode, "xlink", XLINK_NS ); 255 XMLTools.appendNSBinding( rootNode, "deegree", D_CONTEXT_NS ); 256 XMLTools.appendNSBinding( rootNode, "xsi", XSI_NS ); 257 // XMLTools.appendNSBinding( rootNode, "", OGC_CONTEXT_NS ); 258 XMLTools.appendNSDefaultBinding( rootNode, OGC_CONTEXT_NS ); 259 260 // e.setAttributeNode( createAttribute( "xmlns", OGC_CONTEXT_NS.toString() ) ); 261 // e.setAttributeNode( createAttribute( "xmlns:sld", ) ); 262 // e.setAttributeNode( createAttribute( "xmlns:xlink", .toString() ) ); 263 // e.setAttributeNode( createAttribute( "xmlns:deegree", D_CONTEXT_NS.toString() ) ); 264 // e.setAttributeNode( createAttribute( "xmlns:", XSI_NS.toString() ) ); 265 rootNode.setAttribute( "version", "1.0.0" ); 266 rootNode.setAttribute( "id", "viewContext_id" ); 267 268 appendGeneral( rootNode, viewContxt.getGeneral() ); 269 appendLayerList( rootNode, viewContxt.getLayerList() ); 270 271 // toNode.appendChild( e ); 272 } 273 274 } 275 276 /** 277 * Appends the XML representation of a <code>General</code> to a <code>Node</code> using the <code>namespace</code>. 278 * 279 * @param toNode 280 * the <code>Node</code> to append the new element to 281 * @param gen 282 * the <code>General</code> to be appended as new element 283 * 284 * contains illegal characters 285 * @throws URISyntaxException 286 * @throws DOMException 287 */ 288 protected static void appendGeneral( Node toNode, General gen ) 289 throws DOMException, URISyntaxException { 290 291 if ( gen != null ) { 292 Element e = createElement( OGC_CONTEXT_NS, "General" ); 293 appendWindow( e, gen.getWindow() ); 294 appendBoundingBox( e, gen.getBoundingBox() ); 295 appendTitle( e, gen.getTitle() ); 296 appendAbstract( e, gen.getAbstract() ); 297 appendKeywords( e, gen.getKeywords() ); 298 appendDescriptionURL( e, gen.getDescriptionURL() ); 299 appendLogoURL( e, gen.getLogoURL() ); 300 appendContactInformation( e, gen.getContactInformation() ); 301 // append deegree-specific extension 302 appendGeneralExtension( e, gen.getExtension() ); 303 304 toNode.appendChild( e ); 305 } 306 307 } 308 309 /** 310 * Appends the XML representation of a <code>Rectangle</code> to a <code>Node</code> using the 311 * <code>namespace</code>. 312 * <p/> 313 * Note that the XML representation of a <code>Rectangle</code> is given by a <code><Window></code> element. 314 * 315 * @param toNode 316 * the <code>Node</code> to append the new element to 317 * @param r 318 * the <code>Rectangle</code> to be appended as new element 319 * 320 * contains illegal characters 321 */ 322 protected static void appendWindow( Node toNode, Rectangle r ) { 323 324 if ( r != null ) { 325 Element window = createElement( OGC_CONTEXT_NS, "Window" ); 326 327 window.setAttribute( "width", String.valueOf( r.width ) ); 328 window.setAttribute( "height", String.valueOf( r.height ) ); 329 330 toNode.appendChild( window ); 331 } 332 333 } 334 335 /** 336 * Appends the XML representation of a <code>GM_Point[]</code> to a <code>Node</code> using the 337 * <code>namespace</code>. 338 * <p/> 339 * Note that the XML representation of a <code>GM_Point[]</code> is given by a <code><BoundingBox></code> 340 * element. 341 * 342 * @param toNode 343 * the <code>Node</code> to append the new element to 344 * @param points 345 * the <code>GM_Point[]</code> to be appended as new element 346 * 347 * contains illegal characters 348 */ 349 protected static void appendBoundingBox( Node toNode, Point[] points ) { 350 351 if ( points != null && points.length == 2 ) { 352 Element bbox = createElement( OGC_CONTEXT_NS, "BoundingBox" ); 353 String srs = "UNKNOWN_SRS"; 354 try { 355 srs = points[0].getCoordinateSystem().getIdentifier(); 356 } catch ( Exception e ) { 357 e.printStackTrace(); 358 } 359 360 bbox.setAttributeNode( createAttribute( "SRS", srs ) ); 361 362 bbox.setAttribute( "minx", String.valueOf( points[0].getX() ) ); 363 bbox.setAttribute( "miny", String.valueOf( points[0].getY() ) ); 364 bbox.setAttribute( "maxx", String.valueOf( points[1].getX() ) ); 365 bbox.setAttribute( "maxy", String.valueOf( points[1].getY() ) ); 366 367 toNode.appendChild( bbox ); 368 369 } 370 371 } 372 373 /** 374 * Appends the XML representation of a <code>Title</code> to a <code>Node</code> using the <code>namespace</code>. 375 * 376 * @param toNode 377 * the <code>Node</code> to append the new element to 378 * @param title 379 * the <code>String</code> to be appended as new element 380 * 381 * contains illegal characters 382 */ 383 protected static void appendTitle( Node toNode, String title ) { 384 385 String t = ""; 386 if ( title != null ) { 387 t = title; 388 } 389 Element te = createElement( OGC_CONTEXT_NS, "Title" ); 390 te.appendChild( createTextNode( t ) ); 391 toNode.appendChild( te ); 392 393 } 394 395 /** 396 * Appends the XML representation of an <code>Abstract</code> to a <code>Node</code> using the 397 * <code>namespace</code>. 398 * 399 * @param toNode 400 * the <code>Node</code> to append the new element to 401 * @param abstr 402 * the <code>String</code> to be appended as new element 403 * 404 */ 405 protected static void appendAbstract( Node toNode, String abstr ) { 406 407 if ( abstr != null ) { 408 Element te = createElement( OGC_CONTEXT_NS, "Abstract" ); 409 te.appendChild( createTextNode( abstr ) ); 410 toNode.appendChild( te ); 411 } 412 413 } 414 415 /** 416 * Appends the XML representation of an <code>ImageURL</code> to a <code>Node</code> using the 417 * <code>namespace</code>. 418 * 419 * @param toNode 420 * the <code>Node</code> to append the new element to 421 * @param logoURL 422 * the <code>ImageURL</code> to be appended as new element 423 * 424 * contains illegal characters 425 */ 426 protected static void appendLogoURL( Node toNode, ImageURL logoURL ) { 427 428 if ( logoURL != null && logoURL.getOnlineResource() != null ) { 429 Element e = createElement( OGC_CONTEXT_NS, "LogoURL" ); 430 appendOnlineResource( e, logoURL.getOnlineResource() ); 431 toNode.appendChild( e ); 432 } 433 434 } 435 436 /** 437 * Appends the XML representation of a keyword list as a <code>String[]</code> to a <code>Node</code> using the 438 * <code>namespace</code>. 439 * <p/> 440 * Note that the keywords are appended to a <code><KeywordList></code> element. 441 * 442 * @param toNode 443 * the <code>Node</code> to append the new element to 444 * @param keywords 445 * the <code>ImageURL</code> to be appended as new element 446 * 447 * contains illegal characters 448 */ 449 protected static void appendKeywords( Node toNode, String[] keywords ) { 450 451 if ( keywords != null ) { 452 Element kWordList = createElement( OGC_CONTEXT_NS, "KeywordList" ); 453 for ( int i = 0; i < keywords.length; i++ ) { 454 Element kw = createElement( OGC_CONTEXT_NS, "Keyword" ); 455 kw.appendChild( createTextNode( keywords[i] ) ); 456 kWordList.appendChild( kw ); 457 } 458 toNode.appendChild( kWordList ); 459 } 460 461 } 462 463 /** 464 * Appends the XML representation of a <code>BaseURL</code>, the <code>DescriptionURL</code>, to a <code>Node</code> 465 * using the <code>namespace</code>. 466 * 467 * @param toNode 468 * the <code>Node</code> to append the new element to 469 * @param bURL 470 * the <code>BaseURL</code> to be appended as new element 471 * 472 * contains illegal characters 473 */ 474 protected static void appendDescriptionURL( Node toNode, BaseURL bURL ) { 475 476 if ( bURL != null ) { 477 Element du = createElement( OGC_CONTEXT_NS, "DescriptionURL" ); 478 String f = bURL.getFormat(); 479 if ( f != null ) { 480 du.setAttribute( "format", f ); 481 } 482 483 URL onlineRes = bURL.getOnlineResource(); 484 appendOnlineResource( du, onlineRes ); 485 486 toNode.appendChild( du ); 487 } 488 489 } 490 491 /** 492 * Appends the XML representation of a <code>URL</code> to a <code>Node</code> as a 493 * <code><OnlineResource></code> using the <code>namespace</code>. 494 * 495 * @param toNode 496 * the <code>Node</code> to append the new element to 497 * @param onlineRes 498 * the <code>URL</code> to be appended as new element 499 * 500 * contains illegal characters 501 */ 502 protected static void appendOnlineResource( Node toNode, URL onlineRes ) { 503 504 if ( onlineRes != null ) { 505 Element or = createElement( OGC_CONTEXT_NS, "OnlineResource" ); 506 or.setAttributeNS( XLINK_NS.toASCIIString(), "xlink:type", "simple" ); 507 508 String href = onlineRes.toExternalForm(); 509 if ( href != null ) { 510 // according to OGC WMS 1.3 Testsuite a URL to a service operation 511 // via HTTPGet must end with '?' or '&' 512 if ( href.indexOf( '.' ) < 0 ) { 513 href = OWSUtils.validateHTTPGetBaseURL( href ); 514 } 515 or.setAttributeNS( XLINK_NS.toASCIIString(), "xlink:href", href ); 516 } 517 toNode.appendChild( or ); 518 } 519 520 } 521 522 /** 523 * Appends the XML representation of a <code>ContactInformation</code> to a <code>Node</code> using the 524 * <code>namespace</code>. 525 * 526 * @param toNode 527 * the <code>Node</code> to append the new element to 528 * @param respParty 529 */ 530 protected static void appendContactInformation( Node toNode, CitedResponsibleParty respParty ) { 531 532 if ( respParty != null ) { 533 Element ci = createElement( OGC_CONTEXT_NS, "ContactInformation" ); 534 535 appendContactPersonPrimary( ci, respParty ); 536 537 Element pos = createElement( OGC_CONTEXT_NS, "ContactPosition" ); 538 pos.appendChild( createTextNode( respParty.getPositionName()[0] ) ); 539 ci.appendChild( pos ); 540 ContactInfo[] conInf = respParty.getContactInfo(); 541 542 if ( conInf != null && conInf.length > 0 ) { 543 appendContactAddress( ci, conInf[0] ); 544 if ( conInf[0].getPhone().getVoice() != null && conInf[0].getPhone().getVoice().length > 0 ) { 545 Element e = createElement( OGC_CONTEXT_NS, "ContactVoiceTelephone" ); 546 e.appendChild( createTextNode( conInf[0].getPhone().getVoice()[0] ) ); 547 ci.appendChild( e ); 548 } 549 if ( conInf[0].getAddress().getElectronicMailAddress() != null 550 && conInf[0].getAddress().getElectronicMailAddress().length > 0 ) { 551 Element e = createElement( OGC_CONTEXT_NS, "ContactElectronicMailAddress" ); 552 e.appendChild( createTextNode( conInf[0].getAddress().getElectronicMailAddress()[0] ) ); 553 ci.appendChild( e ); 554 } 555 } 556 557 toNode.appendChild( ci ); 558 } 559 560 } 561 562 /** 563 * Appends the XML representation of a <code>ContactPersonPrimary</code> to a <code>Node</code> using the 564 * <code>namespace</code>. 565 * 566 * @param toNode 567 * the <code>Node</code> to append the new element to 568 * @param respParty 569 */ 570 protected static void appendContactPersonPrimary( Node toNode, CitedResponsibleParty respParty ) { 571 572 if ( respParty.getIndividualName() != null && respParty.getIndividualName().length > 0 ) { 573 Element cpp = createElement( OGC_CONTEXT_NS, "ContactPersonPrimary" ); 574 575 Element p = createElement( OGC_CONTEXT_NS, "ContactPerson" ); 576 577 p.appendChild( createTextNode( respParty.getIndividualName()[0] ) ); 578 cpp.appendChild( p ); 579 580 Element org = createElement( OGC_CONTEXT_NS, "ContactOrganization" ); 581 org.appendChild( createTextNode( respParty.getOrganisationName()[0] ) ); 582 cpp.appendChild( org ); 583 584 toNode.appendChild( cpp ); 585 } 586 587 } 588 589 /** 590 * Appends the XML representation of a <code>ContactAddress</code> to a <code>Node</code> using the 591 * <code>namespace</code>. 592 * 593 * @param toNode 594 * the <code>Node</code> to append the new element to 595 * @param ci 596 * the <code>ContactAddress</code> to be appended as new element 597 * 598 */ 599 protected static void appendContactAddress( Node toNode, ContactInfo ci ) { 600 601 if ( ci != null ) { 602 Element ca = createElement( OGC_CONTEXT_NS, "ContactAddress" ); 603 604 Element e = createElement( OGC_CONTEXT_NS, "AddressType" ); 605 e.appendChild( createTextNode( "postal" ) ); 606 ca.appendChild( e ); 607 608 e = createElement( OGC_CONTEXT_NS, "Address" ); 609 e.appendChild( createTextNode( ci.getAddress().getDeliveryPoint()[0] ) ); 610 ca.appendChild( e ); 611 612 e = createElement( OGC_CONTEXT_NS, "City" ); 613 e.appendChild( createTextNode( ci.getAddress().getCity() ) ); 614 ca.appendChild( e ); 615 616 e = createElement( OGC_CONTEXT_NS, "StateOrProvince" ); 617 e.appendChild( createTextNode( ci.getAddress().getAdministrativeArea() ) ); 618 ca.appendChild( e ); 619 620 e = createElement( OGC_CONTEXT_NS, "PostCode" ); 621 e.appendChild( createTextNode( ci.getAddress().getPostalCode() ) ); 622 ca.appendChild( e ); 623 624 e = createElement( OGC_CONTEXT_NS, "Country" ); 625 e.appendChild( createTextNode( ci.getAddress().getCountry() ) ); 626 ca.appendChild( e ); 627 628 toNode.appendChild( ca ); 629 } 630 631 } 632 633 /** 634 * Appends the XML representation of a <code>LayerList</code> to a <code>Node</code> using the 635 * <code>namespace</code>. 636 * 637 * @param toNode 638 * the <code>Node</code> to append the new element to 639 * @param lList 640 * the <code>LayerList</code> to be appended as new element 641 * 642 */ 643 protected static void appendLayerList( Node toNode, LayerList lList ) { 644 645 if ( lList != null ) { 646 Element list = createElement( OGC_CONTEXT_NS, "LayerList" ); 647 648 Layer[] ls = lList.getLayers(); 649 if ( ls != null ) { 650 for ( int i = 0; i < ls.length; i++ ) { 651 appendLayer( list, ls[i] ); 652 } 653 } 654 toNode.appendChild( list ); 655 } 656 657 } 658 659 /** 660 * Appends the XML representation of a <code>Layer</code> to a <code>Node</code> using the <code>namespace</code>. 661 * 662 * @param toNode 663 * the <code>Node</code> to append the new element to 664 * @param layer 665 * the <code>Layer</code> to be appended as new element 666 * 667 */ 668 protected static void appendLayer( Node toNode, Layer layer ) { 669 670 if ( layer != null ) { 671 Element le = createElement( OGC_CONTEXT_NS, "Layer" ); 672 673 le.setAttribute( "queryable", stringValue01( layer.isQueryable() ) ); 674 le.setAttribute( "hidden", stringValue01( layer.isHidden() ) ); 675 676 appendServer( le, layer.getServer() ); 677 678 Element n = createElement( OGC_CONTEXT_NS, "Name" ); 679 n.appendChild( createTextNode( layer.getName() ) ); 680 le.appendChild( n ); 681 682 if ( layer.getAbstract() != null ) { 683 n = createElement( OGC_CONTEXT_NS, "Abstract" ); 684 n.appendChild( createTextNode( layer.getAbstract() ) ); 685 le.appendChild( n ); 686 } 687 688 n = createElement( OGC_CONTEXT_NS, "Title" ); 689 n.appendChild( createTextNode( layer.getTitle() ) ); 690 le.appendChild( n ); 691 692 if ( layer.getMetadataURL() != null ) { 693 n = createElement( OGC_CONTEXT_NS, "MetadataURL" ); 694 le.appendChild( n ); 695 appendOnlineResource( n, layer.getMetadataURL().getOnlineResource() ); 696 } 697 698 appendSrs( le, layer.getSrs() ); 699 appendFormatList( le, layer.getFormatList() ); 700 appendStyleList( le, layer.getStyleList() ); 701 702 appendLayerExtension( le, layer.getExtension() ); 703 704 toNode.appendChild( le ); 705 } 706 707 } 708 709 /** 710 * Appends the XML representation of a <code>Server</code> to a <code>Node</code> using the <code>namespace</code>. 711 * 712 * @param toNode 713 * the <code>Node</code> to append the new element to 714 * @param server 715 * the <code>Server</code> to be appended as new element 716 * 717 */ 718 protected static void appendServer( Node toNode, Server server ) { 719 720 if ( server != null ) { 721 Element serv = createElement( OGC_CONTEXT_NS, "Server" ); 722 723 if ( server.getService() != null ) { 724 serv.setAttribute( "service", server.getService() ); 725 } 726 if ( server.getService() != null ) { 727 serv.setAttribute( "version", server.getVersion() ); 728 } 729 if ( server.getService() != null ) { 730 serv.setAttribute( "title", server.getTitle() ); 731 } 732 733 appendOnlineResource( serv, server.getOnlineResource() ); 734 735 toNode.appendChild( serv ); 736 } 737 738 } 739 740 /** 741 * Appends the XML representation of a list of SRSs as a <code>String[]</code> to a <code>Node</code> using the 742 * <code>namespace</code>. 743 * 744 * @param toNode 745 * the <code>Node</code> to append the new element to 746 * @param srsList 747 * the <code>String[]</code> to be appended as new element 748 * 749 */ 750 protected static void appendSrs( Node toNode, String[] srsList ) { 751 752 if ( srsList != null ) { 753 StringBuffer sBuf = new StringBuffer( 100 ); 754 for ( int i = 0; i < srsList.length; i++ ) { 755 sBuf.append( srsList[i] ); 756 if ( i < srsList.length - 1 ) 757 sBuf.append( ";" ); 758 759 } 760 Element e = createElement( OGC_CONTEXT_NS, "SRS" ); 761 e.appendChild( createTextNode( sBuf.toString() ) ); 762 toNode.appendChild( e ); 763 } 764 765 } 766 767 /** 768 * Appends the XML representation of a list of a <code>FormatList</code> to a <code>Node</code> using the 769 * <code>namespace</code>. 770 * 771 * @param toNode 772 * the <code>Node</code> to append the new element to 773 * @param formatList 774 * the <code>FormatList</code> to be appended as new element 775 * 776 * contains illegal characters 777 */ 778 protected static void appendFormatList( Node toNode, FormatList formatList ) { 779 780 if ( formatList != null ) { 781 782 Format[] formats = formatList.getFormats(); 783 if ( formats != null ) { 784 Element e = createElement( OGC_CONTEXT_NS, "FormatList" ); 785 786 for ( int i = 0; i < formats.length; i++ ) { 787 if ( formats[i] != null ) { 788 Element f = createElement( OGC_CONTEXT_NS, "Format" ); 789 f.setAttribute( "current", stringValue01( formats[i].isCurrent() ) ); 790 if ( formats[i].getName() != null ) 791 f.appendChild( createTextNode( formats[i].getName() ) ); 792 e.appendChild( f ); 793 } 794 } 795 toNode.appendChild( e ); 796 } 797 } 798 799 } 800 801 /** 802 * Appends the XML representation of a list of a <code>StyleList</code> to a <code>Node</code> using the 803 * <code>namespace</code>. 804 * 805 * @param toNode 806 * the <code>Node</code> to append the new element to 807 * @param styleList 808 * the <code>StyleList</code> to be appended as new element 809 * 810 */ 811 protected static void appendStyleList( Node toNode, StyleList styleList ) { 812 813 if ( styleList != null ) { 814 815 Style[] styles = styleList.getStyles(); 816 if ( styles != null ) { 817 Element e = createElement( OGC_CONTEXT_NS, "StyleList" ); 818 819 for ( int i = 0; i < styles.length; i++ ) { 820 if ( styles[i] != null ) { 821 Element s = createElement( OGC_CONTEXT_NS, "Style" ); 822 s.setAttribute( "current", stringValue01( styles[i].isCurrent() ) ); 823 824 if ( styles[i].getName() != null ) { 825 Element ne = createElement( OGC_CONTEXT_NS, "Name" ); 826 ne.appendChild( createTextNode( styles[i].getName() ) ); 827 s.appendChild( ne ); 828 } 829 if ( styles[i].getTitle() != null ) { 830 Element ne = createElement( OGC_CONTEXT_NS, "Title" ); 831 ne.appendChild( createTextNode( styles[i].getTitle() ) ); 832 s.appendChild( ne ); 833 } 834 if ( styles[i].getAbstract() != null ) { 835 Element ne = createElement( OGC_CONTEXT_NS, "Abstract" ); 836 ne.appendChild( createTextNode( styles[i].getAbstract() ) ); 837 s.appendChild( ne ); 838 } 839 if ( styles[i].getLegendURL() != null && styles[i].getLegendURL().getOnlineResource() != null ) { 840 Element ne = createElement( OGC_CONTEXT_NS, "LegendURL" ); 841 ne.setAttribute( "width", String.valueOf( styles[i].getLegendURL().getWidth() ) ); 842 ne.setAttribute( "height", String.valueOf( styles[i].getLegendURL().getHeight() ) ); 843 ne.setAttribute( "width", String.valueOf( styles[i].getLegendURL().getWidth() ) ); 844 appendOnlineResource( ne, styles[i].getLegendURL().getOnlineResource() ); 845 s.appendChild( ne ); 846 } 847 e.appendChild( s ); 848 849 } 850 } 851 toNode.appendChild( e ); 852 } 853 } 854 855 } 856 857 /** 858 * Appends the XML representation of a list of a <code>ViewContextCollection</code> to a <code>Node</code> using the 859 * <code>namespace</code>. 860 * 861 * @param toNode 862 * the <code>Node</code> to append the new element to 863 * @param vcc 864 * the <code>ViewContextCollection</code> to be appended as new element 865 * 866 */ 867 protected static void appendViewContextCollection( Node toNode, ViewContextCollection vcc ) { 868 869 if ( vcc != null ) { 870 Element e = createElement( OGC_CONTEXT_NS, "ViewContextCollection" ); 871 e.setAttributeNode( createAttribute( "xmlns", OGC_CONTEXT_NS.toString() ) ); 872 e.setAttributeNode( createAttribute( "xmlns:sld", SLD_NS.toString() ) ); 873 e.setAttributeNode( createAttribute( "xmlns:xlink", XLINK_NS.toString() ) ); 874 e.setAttributeNode( createAttribute( "xmlns:deegree", D_CONTEXT_NS.toString() ) ); 875 e.setAttributeNode( createAttribute( "xmlns:xsi", XSI_NS.toString() ) ); 876 e.setAttributeNode( createAttribute( "version", "1.0.0" ) ); 877 878 ViewContextReference[] vcrs = vcc.getViewContextReferences(); 879 if ( vcrs != null && vcrs.length > 0 ) { 880 for ( int i = 0; i < vcrs.length; i++ ) { 881 if ( vcrs[i] != null ) { 882 appendContextReference( e, vcrs[i] ); 883 } 884 } 885 } 886 toNode.appendChild( e ); 887 } 888 889 } 890 891 /** 892 * Appends the XML representation of a list of a <code>ViewContextReference</code> to a <code>Node</code> using the 893 * <code>namespace</code>. 894 * <p/> 895 * // TODO implement ID in VCR 896 * 897 * @param toNode 898 * the <code>Node</code> to append the new element to 899 * @param vcr 900 * the <code>ViewContextReference</code> to be appended as new element 901 */ 902 protected static void appendContextReference( Node toNode, ViewContextReference vcr ) { 903 904 if ( vcr != null ) { 905 Element e = createElement( OGC_CONTEXT_NS, "ViewContextReference" ); 906 907 e.setAttributeNode( createAttribute( "version", "1.0.0" ) ); 908 909 String id = vcr.getTitle().replace( ' ', '_' ).toLowerCase(); 910 e.setAttributeNode( createAttribute( "id", id ) ); 911 912 Element t = createElement( OGC_CONTEXT_NS, "Title" ); 913 t.appendChild( createTextNode( vcr.getTitle() ) ); 914 e.appendChild( t ); 915 916 if ( vcr.getContextURL() != null ) { 917 Element c = createElement( OGC_CONTEXT_NS, "ViewContextURL" ); 918 appendOnlineResource( c, vcr.getContextURL() ); 919 e.appendChild( c ); 920 } 921 toNode.appendChild( e ); 922 } 923 924 } 925 926 /** 927 * Creates a String representation ("0" or "1") of a boolean value. 928 * 929 * @param value 930 * the input value 931 * @return "0" or "1" if value is true or false, respectively 932 */ 933 private static final String stringValue01( boolean value ) { 934 return value ? "1" : "0"; 935 } 936 937 // *********************************************************************** 938 // BEGIN Deegree specific methods 939 // *********************************************************************** 940 941 /** 942 * Appends the XML representation of a list of a <code>GeneralExtension</code> to a <code>Node</code> using the 943 * <code>namespace</code>. 944 * 945 * @param toNode 946 * the <code>Node</code> to append the new element to 947 * @param genExt 948 * the <code>GeneralExtension</code> to be appended as new element 949 * @throws URISyntaxException 950 * @throws DOMException 951 * 952 */ 953 protected static void appendGeneralExtension( Node toNode, GeneralExtension genExt ) 954 throws DOMException, URISyntaxException { 955 956 if ( genExt != null ) { 957 Element e = createElement( OGC_CONTEXT_NS, "Extension" ); 958 Element a = createElement( D_CONTEXT_NS, "deegree:Mode" ); 959 a.appendChild( createTextNode( genExt.getMode() ) ); 960 e.appendChild( a ); 961 962 appendAuthentificationSettings( e, genExt.getAuthentificationSettings() ); 963 appendIOSettings( e, genExt.getIOSettings() ); 964 appendFrontend( e, genExt.getFrontend() ); 965 appendMapParameter( e, genExt.getMapParameter() ); 966 967 appendLayerTree( e, genExt.getLayerTreeRoot() ); 968 969 appendMapModel( e, genExt.getMapModel() ); 970 971 a = createElement( D_CONTEXT_NS, "deegree:XSLT" ); 972 // TODO 973 // we should evaluate if it would be a better solution just to store local file name ... 974 a.appendChild( createTextNode( genExt.getXslt().toURI().toASCIIString() ) ); 975 e.appendChild( a ); 976 977 toNode.appendChild( e ); 978 } 979 980 } 981 982 /** 983 * @param e 984 * @param mapModel 985 */ 986 private static void appendMapModel( Element e, MapModel mapModel ) { 987 if ( mapModel != null ) { 988 Element mm = createElement( D_CONTEXT_NS, "deegree:MapModel" ); 989 e.appendChild( mm ); 990 List<LayerGroup> layerGroups = mapModel.getLayerGroups(); 991 for ( LayerGroup layerGroup : layerGroups ) { 992 appendLayerGroup( mm, layerGroup ); 993 } 994 } 995 } 996 997 /** 998 * @param mm 999 * @param layerGroup 1000 */ 1001 private static void appendLayerGroup( Element mm, LayerGroup layerGroup ) { 1002 Element lg = createElement( D_CONTEXT_NS, "deegree:LayerGroup" ); 1003 mm.appendChild( lg ); 1004 lg.setAttribute( "title", layerGroup.getTitle() ); 1005 lg.setAttribute( "identifier", layerGroup.getTitle() ); 1006 lg.setAttribute( "hidden", Boolean.toString( layerGroup.isHidden() ) ); 1007 lg.setAttribute( "expanded", Boolean.toString( layerGroup.isExpanded() ) ); 1008 List<MapModelEntry> mmes = layerGroup.getMapModelEntries(); 1009 for ( MapModelEntry mapModelEntry : mmes ) { 1010 if ( mapModelEntry instanceof LayerGroup ) { 1011 appendLayerGroup( lg, (LayerGroup) mapModelEntry ); 1012 } else { 1013 appendLayer( lg, (MMLayer) mapModelEntry ); 1014 } 1015 } 1016 } 1017 1018 /** 1019 * @param lg 1020 * @param layer 1021 */ 1022 private static void appendLayer( Element lg, MMLayer layer ) { 1023 Element lay = createElement( D_CONTEXT_NS, "deegree:Layer" ); 1024 lg.appendChild( lay ); 1025 lay.setAttribute( "layerId", layer.getIdentifier() ); 1026 } 1027 1028 /** 1029 * Appends the XML representation of a <code>LayerTree</code>. 1030 * 1031 * @param e 1032 * the <code>Element</code> to append the new element to 1033 * @param layerTreeRoot 1034 * the root <code>Node</code> of the LayerTree 1035 * 1036 */ 1037 protected static void appendLayerTree( Element e, org.deegree.portal.context.Node layerTreeRoot ) { 1038 Element layerTree = createElement( D_CONTEXT_NS, "deegree:LayerTree" ); 1039 layerTree.appendChild( getLayerTreeNode( layerTreeRoot ) ); 1040 e.appendChild( layerTree ); 1041 } 1042 1043 // create LayerTree elements 1044 private static Element getLayerTreeNode( org.deegree.portal.context.Node node ) { 1045 Element n = createElement( D_CONTEXT_NS, "deegree:Node" ); 1046 n.setAttributeNode( createAttribute( "id", String.valueOf( node.getId() ) ) ); 1047 n.setAttributeNode( createAttribute( "title", node.getTitle() ) ); 1048 1049 org.deegree.portal.context.Node[] nodes = node.getNodes(); 1050 for ( org.deegree.portal.context.Node childNode : nodes ) { 1051 // ( tree -> recursion ) 1052 n.appendChild( getLayerTreeNode( childNode ) ); 1053 } 1054 return n; 1055 } 1056 1057 /** 1058 * @param toNode 1059 * @param settings 1060 */ 1061 protected static void appendAuthentificationSettings( Node toNode, AuthentificationSettings settings ) { 1062 1063 if ( settings != null ) { 1064 Element e = createElement( D_CONTEXT_NS, "deegree:AuthentificationSettings" ); 1065 Element ee = createElement( D_CONTEXT_NS, "deegree:AuthentificationService" ); 1066 appendOnlineResource( ee, settings.getAuthentificationURL().getOnlineResource() ); 1067 e.appendChild( ee ); 1068 toNode.appendChild( e ); 1069 } 1070 1071 } 1072 1073 /** 1074 * Appends the XML representation of a list of a <code>IOSettings</code> to a <code>Node</code> using the 1075 * <code>namespace</code>. 1076 * 1077 * @param toNode 1078 * the <code>Node</code> to append the new element to 1079 * @param ioSetts 1080 * the <code>IOSettings</code> to be appended as new element 1081 */ 1082 protected static void appendIOSettings( Node toNode, IOSettings ioSetts ) { 1083 1084 if ( ioSetts != null ) { 1085 Element e = createElement( D_CONTEXT_NS, "deegree:IOSettings" ); 1086 1087 // TODO: ioSetts.getTempDirectory() , inexistent till now 1088 /* 1089 * if(ioSetts.getRootDirectory() != null ){ Element rd = createElement(namespace,"deegree:TempDirectory"); 1090 * rd.appendChild( createTextNode( ioSetts.getRootDirectory() + "temp")); e.appendChild(rd); } 1091 */ 1092 1093 appendDirectoryAccess( e, ioSetts.getTempDirectory(), "deegree:TempDirectory" ); 1094 // appendDirectoryAccess( e, ioSetts.getDownloadDirectory(), "deegree:TempDirectory" ); 1095 appendDirectoryAccess( e, ioSetts.getDownloadDirectory(), "deegree:DownloadDirectory" ); 1096 appendDirectoryAccess( e, ioSetts.getSLDDirectory(), "deegree:SLDDirectory" ); 1097 appendDirectoryAccess( e, ioSetts.getPrintDirectory(), "deegree:PrintDirectory" ); 1098 1099 toNode.appendChild( e ); 1100 } 1101 1102 } 1103 1104 /** 1105 * Appends the XML representation of a list of a <code>DirectoryAccess</code> to a <code>Node</code> using the 1106 * <code>namespace</code>. 1107 * 1108 * @param toNode 1109 * the <code>Node</code> to append the new element to 1110 * @param dirAcc 1111 * the <code>DirectoryAccess</code> to be appended as new element 1112 * @param dirName 1113 * 1114 */ 1115 protected static void appendDirectoryAccess( Node toNode, DirectoryAccess dirAcc, String dirName ) { 1116 1117 if ( dirAcc != null ) { 1118 Element d = createElement( D_CONTEXT_NS, dirName ); 1119 if ( dirAcc.getDirectoryName() != null ) { 1120 Element a = createElement( D_CONTEXT_NS, "deegree:Name" ); 1121 a.appendChild( createTextNode( dirAcc.getDirectoryName() ) ); 1122 d.appendChild( a ); 1123 1124 } 1125 if ( dirAcc.getOnlineResource() != null ) { 1126 Element a = createElement( D_CONTEXT_NS, "deegree:Access" ); 1127 appendOnlineResource( a, dirAcc.getOnlineResource() ); 1128 d.appendChild( a ); 1129 } 1130 toNode.appendChild( d ); 1131 } 1132 1133 } 1134 1135 /** 1136 * Appends the XML representation of a list of a <code>Frontend</code> to a <code>Node</code> using the 1137 * <code>namespace</code>. 1138 * 1139 * @param toNode 1140 * the <code>Node</code> to append the new element to 1141 * @param fEnd 1142 * the <code>Frontend</code> to be appended as new element 1143 * 1144 */ 1145 protected static void appendFrontend( Node toNode, Frontend fEnd ) { 1146 1147 if ( fEnd != null ) { 1148 Element e = createElement( D_CONTEXT_NS, "deegree:Frontend" ); 1149 1150 e.setAttribute( "scope", "JSP" ); 1151 if ( fEnd.getController() != null ) { 1152 Element c = createElement( D_CONTEXT_NS, "deegree:Controller" ); 1153 c.appendChild( createTextNode( fEnd.getController() ) ); 1154 e.appendChild( c ); 1155 } 1156 if ( ( (JSPFrontend) fEnd ).getStyle() != null ) { 1157 Element c = createElement( D_CONTEXT_NS, "deegree:Style" ); 1158 c.appendChild( createTextNode( ( (JSPFrontend) fEnd ).getStyle() ) ); 1159 e.appendChild( c ); 1160 } 1161 if ( ( (JSPFrontend) fEnd ).getHeader() != null ) { 1162 Element c = createElement( D_CONTEXT_NS, "deegree:Header" ); 1163 c.appendChild( createTextNode( ( (JSPFrontend) fEnd ).getHeader() ) ); 1164 e.appendChild( c ); 1165 } 1166 if ( ( (JSPFrontend) fEnd ).getFooter() != null ) { 1167 Element c = createElement( D_CONTEXT_NS, "deegree:Footer" ); 1168 c.appendChild( createTextNode( ( (JSPFrontend) fEnd ).getFooter() ) ); 1169 e.appendChild( c ); 1170 } 1171 1172 appendCommonJS( e, ( (JSPFrontend) fEnd ).getCommonJS() ); 1173 1174 appendButtons( e, ( (JSPFrontend) fEnd ).getButtons() ); 1175 1176 appendGUIArea( e, fEnd.getNorth(), "deegree:North" ); 1177 appendGUIArea( e, fEnd.getWest(), "deegree:West" ); 1178 appendGUIArea( e, fEnd.getCenter(), "deegree:Center" ); 1179 appendGUIArea( e, fEnd.getEast(), "deegree:East" ); 1180 appendGUIArea( e, fEnd.getSouth(), "deegree:South" ); 1181 1182 toNode.appendChild( e ); 1183 } 1184 1185 } 1186 1187 /** 1188 * Appends the XML representation of a list of a <code>String[]</code> to a <code>Node</code> using the 1189 * <code>namespace</code>. 1190 * 1191 * @param toNode 1192 * the <code>Node</code> to append the new element to 1193 * @param commonJS 1194 * the <code>String[]</code> to be appended as new element 1195 * 1196 */ 1197 protected static void appendCommonJS( Node toNode, String[] commonJS ) { 1198 1199 if ( commonJS != null ) { 1200 Element c = createElement( D_CONTEXT_NS, "deegree:CommonJS" ); 1201 1202 for ( int i = 0; i < commonJS.length; i++ ) { 1203 if ( commonJS[i] != null ) { 1204 Element n = createElement( D_CONTEXT_NS, "deegree:Name" ); 1205 n.appendChild( createTextNode( commonJS[i] ) ); 1206 c.appendChild( n ); 1207 } 1208 } 1209 toNode.appendChild( c ); 1210 } 1211 1212 } 1213 1214 /** 1215 * Appends the XML representation of a list of a <code>String</code> to a <code>Node</code> using the 1216 * <code>namespace</code>. // TODO 1217 * 1218 * @param toNode 1219 * the <code>Node</code> to append the new element to 1220 * @param buttons 1221 * the <code>String</code> to be appended as new element 1222 * 1223 */ 1224 protected static void appendButtons( Node toNode, String buttons ) { 1225 1226 if ( buttons != null ) { 1227 Element b = createElement( D_CONTEXT_NS, "deegree:Buttons" ); 1228 b.appendChild( createTextNode( buttons ) ); 1229 1230 toNode.appendChild( b ); 1231 } 1232 1233 } 1234 1235 /** 1236 * Appends the XML representation of a list of a <code>GUIArea</code> to a <code>Node</code> using the 1237 * <code>namespace</code>. 1238 * 1239 * @param toNode 1240 * the <code>Node</code> to append the new element to 1241 * @param guiArea 1242 * the <code>GUIArea</code> to be appended as new element 1243 * @param name 1244 * 1245 */ 1246 protected static void appendGUIArea( Node toNode, GUIArea guiArea, String name ) { 1247 1248 if ( guiArea != null ) { 1249 Element e = createElement( D_CONTEXT_NS, name ); 1250 e.setAttribute( "hidden", String.valueOf( guiArea.isHidden() ) ); 1251 if ( guiArea.getWidth() > 0 ) { 1252 e.setAttribute( "width", String.valueOf( guiArea.getWidth() ) ); 1253 } 1254 if ( guiArea.getHeight() > 0 ) { 1255 e.setAttribute( "height", String.valueOf( guiArea.getHeight() ) ); 1256 } 1257 if ( guiArea.getTop() > -1 ) { 1258 e.setAttribute( "top", String.valueOf( guiArea.getTop() ) ); 1259 } 1260 if ( guiArea.getRight() > 0 ) { 1261 e.setAttribute( "right", String.valueOf( guiArea.getRight() ) ); 1262 } 1263 if ( guiArea.getLeft() > -1 ) { 1264 e.setAttribute( "left", String.valueOf( guiArea.getLeft() ) ); 1265 } 1266 if ( guiArea.getBottom() > 0 ) { 1267 e.setAttribute( "bottom", String.valueOf( guiArea.getBottom() ) ); 1268 } 1269 e.setAttribute( "closable", String.valueOf( guiArea.isClosable() ).toLowerCase() ); 1270 e.setAttribute( "header", String.valueOf( guiArea.hasHeader() ).toLowerCase() ); 1271 e.setAttribute( "overlay", String.valueOf( guiArea.isOverlay() ).toLowerCase() ); 1272 1273 Module[] mods = guiArea.getModules(); 1274 if ( mods != null ) { 1275 for ( int i = 0; i < mods.length; i++ ) { 1276 if ( mods[i] != null ) { 1277 appendModule( e, mods[i] ); 1278 } 1279 } 1280 } 1281 1282 toNode.appendChild( e ); 1283 } 1284 1285 } 1286 1287 /** 1288 * Appends the XML representation of a list of a <code>GUIArea</code> to a <code>Node</code> using the 1289 * <code>namespace</code>. 1290 * 1291 * @param toNode 1292 * the <code>Node</code> to append the new element to 1293 * @param mod 1294 * 1295 */ 1296 protected static void appendModule( Node toNode, Module mod ) { 1297 1298 if ( mod != null ) { 1299 Element m = createElement( D_CONTEXT_NS, "deegree:Module" ); 1300 m.setAttribute( "hidden", String.valueOf( mod.isHidden() ) ); 1301 1302 m.setAttribute( "type", mod.getType() ); 1303 m.setAttribute( "scrolling", String.valueOf( mod.getScrolling() ) ); 1304 if ( mod.getWidth() > 0 ) { 1305 m.setAttribute( "width", String.valueOf( mod.getWidth() ) ); 1306 } 1307 if ( mod.getHeight() > 0 ) { 1308 m.setAttribute( "height", String.valueOf( mod.getHeight() ) ); 1309 } 1310 if ( mod.getTop() > -1 ) { 1311 m.setAttribute( "top", String.valueOf( mod.getTop() ) ); 1312 } 1313 if ( mod.getRight() > 0 ) { 1314 m.setAttribute( "right", String.valueOf( mod.getRight() ) ); 1315 } 1316 if ( mod.getLeft() > -1 ) { 1317 m.setAttribute( "left", String.valueOf( mod.getLeft() ) ); 1318 } 1319 if ( mod.getBottom() > 0 ) { 1320 m.setAttribute( "bottom", String.valueOf( mod.getBottom() ) ); 1321 } 1322 m.setAttribute( "closeable", String.valueOf( mod.isClosable() ).toLowerCase() ); 1323 m.setAttribute( "header", String.valueOf( mod.hasHeader() ).toLowerCase() ); 1324 m.setAttribute( "overlay", String.valueOf( mod.isOverlay() ).toLowerCase() ); 1325 m.setAttribute( "collapsed", String.valueOf( mod.isCollapsed() ).toLowerCase() ); 1326 1327 Element n = createElement( D_CONTEXT_NS, "deegree:Name" ); 1328 n.appendChild( createTextNode( mod.getName() ) ); 1329 m.appendChild( n ); 1330 1331 n = createElement( D_CONTEXT_NS, "deegree:Title" ); 1332 n.appendChild( createTextNode( mod.getTitle() ) ); 1333 m.appendChild( n ); 1334 1335 n = createElement( D_CONTEXT_NS, "deegree:Content" ); 1336 n.appendChild( createTextNode( mod.getContent() ) ); 1337 m.appendChild( n ); 1338 1339 appendModuleJSList( m, mod.getModuleJSList() ); 1340 appendModuleConfiguration( m, mod.getModuleConfiguration() ); 1341 appendParameterList( m, mod.getParameter() ); 1342 1343 toNode.appendChild( m ); 1344 } 1345 1346 } 1347 1348 /** 1349 * Appends the XML representation of a list of a <code>ModuleConfiguration</code> to a <code>Node</code> using the 1350 * <code>namespace</code>. 1351 * 1352 * @param toNode 1353 * the <code>Node</code> to append the new element to 1354 * @param modConf 1355 * the <code>ModuleConfiguration</code> to be appended as new element 1356 * 1357 */ 1358 protected static void appendModuleConfiguration( Node toNode, ModuleConfiguration modConf ) { 1359 1360 if ( modConf != null && modConf.getOnlineResource() != null ) { 1361 Element e = createElement( D_CONTEXT_NS, "deegree:ModuleConfiguration" ); 1362 appendOnlineResource( e, modConf.getOnlineResource() ); 1363 toNode.appendChild( e ); 1364 } 1365 1366 } 1367 1368 /** 1369 * Appends the XML representation of a list of a <code>ParameterList</code> to a <code>Node</code> using the 1370 * <code>namespace</code>. 1371 * 1372 * @param toNode 1373 * the <code>Node</code> to append the new element to 1374 * @param parList 1375 * the <code>ParameterList</code> to be appended as new element 1376 * 1377 */ 1378 protected static void appendParameterList( Node toNode, ParameterList parList ) { 1379 1380 if ( parList != null && parList.getParameters().length > 0 ) { 1381 1382 Element e = createElement( D_CONTEXT_NS, "deegree:ParameterList" ); 1383 1384 Parameter[] pars = parList.getParameters(); 1385 for ( int i = 0; i < pars.length; i++ ) { 1386 if ( pars[i] != null ) { 1387 Element p = createElement( D_CONTEXT_NS, "deegree:Parameter" ); 1388 1389 Element n = createElement( D_CONTEXT_NS, "deegree:Name" ); 1390 String name = pars[i].getName(); 1391 // name = name.substring(0,name.indexOf(':')); 1392 n.appendChild( createTextNode( name ) ); 1393 p.appendChild( n ); 1394 1395 n = createElement( D_CONTEXT_NS, "deegree:Value" ); 1396 n.appendChild( createTextNode( pars[i].getValue().toString() ) ); 1397 p.appendChild( n ); 1398 1399 e.appendChild( p ); 1400 } 1401 } 1402 toNode.appendChild( e ); 1403 } 1404 1405 } 1406 1407 /** 1408 * Appends the XML representation of a list of a <code>MapParameter</code> to a <code>Node</code> using the 1409 * <code>namespace</code>. 1410 * 1411 * @param toNode 1412 * the <code>Node</code> to append the new element to 1413 * @param mapPar 1414 * the <code>MapParameter</code> to be appended as new element 1415 * 1416 */ 1417 protected static void appendMapParameter( Node toNode, MapParameter mapPar ) { 1418 1419 if ( mapPar != null ) { 1420 Element e = createElement( D_CONTEXT_NS, "deegree:MapParameter" ); 1421 1422 Element f = createElement( D_CONTEXT_NS, "deegree:OfferedInfoFormats" ); 1423 appendFormats( f, mapPar.getOfferedInfoFormats() ); 1424 e.appendChild( f ); 1425 1426 appendMapOperationFactors( e, mapPar.getOfferedZoomFactors(), "deegree:OfferedZoomFactor" ); 1427 appendMapOperationFactors( e, mapPar.getOfferedPanFactors(), "deegree:OfferedPanFactor" ); 1428 1429 Element minScale = createElement( D_CONTEXT_NS, "deegree:MinScale" ); 1430 minScale.appendChild( createTextNode( String.valueOf( mapPar.getMinScale() ) ) ); 1431 e.appendChild( minScale ); 1432 1433 Element maxScale = createElement( D_CONTEXT_NS, "deegree:MaxScale" ); 1434 maxScale.appendChild( createTextNode( String.valueOf( mapPar.getMaxScale() ) ) ); 1435 e.appendChild( maxScale ); 1436 1437 toNode.appendChild( e ); 1438 } 1439 1440 } 1441 1442 /** 1443 * Appends the XML representation of a list of a <code>Format[]</code> to a <code>Node</code> using the 1444 * <code>namespace</code>. 1445 * 1446 * @param toNode 1447 * the <code>Node</code> to append the new element to 1448 * @param formats 1449 * the <code>Format[]</code> to be appended as new element 1450 * 1451 */ 1452 protected static void appendFormats( Node toNode, Format[] formats ) { 1453 1454 if ( formats != null ) { 1455 for ( int i = 0; i < formats.length; i++ ) { 1456 if ( formats[i] != null ) { 1457 Element f = createElement( D_CONTEXT_NS, "deegree:Format" ); 1458 1459 // TODO is current or selected? 1460 if ( formats[i].isCurrent() ) { 1461 f.setAttribute( "selected", String.valueOf( formats[i].isCurrent() ) ); 1462 } 1463 1464 f.appendChild( createTextNode( formats[i].getName() ) ); 1465 toNode.appendChild( f ); 1466 } 1467 } 1468 } 1469 1470 } 1471 1472 /** 1473 * Appends the XML representation of a list of a <code>MapOperationFactor</code> to a <code>Node</code> using the 1474 * <code>namespace</code>. 1475 * 1476 * @param toNode 1477 * the <code>Node</code> to append the new element to 1478 * @param mapOpFac 1479 * the <code>MapOperationFactor</code> to be appended as new element 1480 * @param opName 1481 * 1482 */ 1483 protected static void appendMapOperationFactors( Node toNode, MapOperationFactor[] mapOpFac, String opName ) { 1484 1485 if ( mapOpFac != null ) { 1486 for ( int i = 0; i < mapOpFac.length; i++ ) { 1487 if ( mapOpFac[i] != null ) { 1488 1489 Element mof = createElement( D_CONTEXT_NS, opName ); 1490 Element f = createElement( D_CONTEXT_NS, "deegree:Factor" ); 1491 f.appendChild( createTextNode( String.valueOf( mapOpFac[i].getFactor() ) ) ); 1492 1493 if ( mapOpFac[i].isSelected() ) { 1494 f.setAttribute( "selected", String.valueOf( mapOpFac[i].isSelected() ) ); 1495 } 1496 1497 // TODO isFree ??? 1498 1499 mof.appendChild( f ); 1500 toNode.appendChild( mof ); 1501 } 1502 } 1503 } 1504 1505 } 1506 1507 /** 1508 * Appends the XML representation of a list of a <code>LayerExtension</code> to a <code>Node</code> using the 1509 * <code>namespace</code>. 1510 * 1511 * @param toNode 1512 * the <code>Node</code> to append the new element to 1513 * @param layExt 1514 * the <code>LayerExtension</code> to be appended as new element 1515 * 1516 */ 1517 protected static void appendLayerExtension( Node toNode, LayerExtension layExt ) { 1518 1519 if ( layExt != null ) { 1520 Element e = createElement( OGC_CONTEXT_NS, "Extension" ); 1521 1522 appendDataService( e, layExt.getDataService() ); 1523 1524 Element g = createElement( D_CONTEXT_NS, "deegree:MasterLayer" ); 1525 g.appendChild( createTextNode( String.valueOf( layExt.isMasterLayer() ) ) ); 1526 e.appendChild( g ); 1527 1528 g = createElement( D_CONTEXT_NS, "deegree:ScaleHint" ); 1529 g.setAttribute( "min", "" + layExt.getMinScaleHint() ); 1530 g.setAttribute( "max", "" + layExt.getMaxScaleHint() ); 1531 e.appendChild( g ); 1532 1533 g = createElement( D_CONTEXT_NS, "deegree:parentNodeId" ); 1534 g.appendChild( createTextNode( String.valueOf( layExt.getParentNodeId() ) ) ); 1535 e.appendChild( g ); 1536 1537 g = createElement( D_CONTEXT_NS, "deegree:SelectedForQuery" ); 1538 g.appendChild( createTextNode( String.valueOf( layExt.isSelectedForQuery() ) ) ); 1539 e.appendChild( g ); 1540 1541 if ( layExt.getIdentifier() != null ) { 1542 g = createElement( D_CONTEXT_NS, "deegree:identifier" ); 1543 g.appendChild( createTextNode( String.valueOf( layExt.getIdentifier() ) ) ); 1544 e.appendChild( g ); 1545 } 1546 1547 g = createElement( D_CONTEXT_NS, "deegree:UseAuthentication" ); 1548 // System.out.println(layExt.getAuthentication()); 1549 if ( layExt.getAuthentication() == LayerExtension.SESSIONID ) { 1550 g.appendChild( createTextNode( "sessionID" ) ); 1551 } else if ( layExt.getAuthentication() == LayerExtension.USERPASSWORD ) { 1552 g.appendChild( createTextNode( "user/password" ) ); 1553 } else if ( layExt.getAuthentication() == LayerExtension.NONE ) { 1554 g.appendChild( createTextNode( "none" ) ); 1555 } 1556 e.appendChild( g ); 1557 1558 toNode.appendChild( e ); 1559 } 1560 1561 } 1562 1563 /** 1564 * Appends the XML representation of a list of a <code>DataService</code> to a <code>Node</code> using the 1565 * <code>namespace</code>. 1566 * 1567 * @param toNode 1568 * the <code>Node</code> to append the new element to 1569 * @param dataServ 1570 * the <code>DataService</code> to be appended as new element 1571 * 1572 */ 1573 protected static void appendDataService( Node toNode, DataService dataServ ) { 1574 1575 if ( dataServ != null ) { 1576 Element e = createElement( D_CONTEXT_NS, "deegree:DataService" ); 1577 1578 if ( dataServ.getServer() != null ) { 1579 appendServer( e, dataServ.getServer() ); 1580 } 1581 String geoType = dataServ.getGeometryType(); 1582 if ( geoType != null ) { 1583 Element g = createElement( D_CONTEXT_NS, "deegree:GeometryType" ); 1584 g.appendChild( createTextNode( dataServ.getGeometryType() ) ); 1585 e.appendChild( g ); 1586 } 1587 String featType = dataServ.getFeatureType(); 1588 if ( featType != null ) { 1589 Element g = createElement( D_CONTEXT_NS, "deegree:FeatureType" ); 1590 g.appendChild( createTextNode( featType ) ); 1591 e.appendChild( g ); 1592 } 1593 1594 toNode.appendChild( e ); 1595 } 1596 1597 } 1598 1599 /** 1600 * Appends the XML representation of a list of a <code>ParameterList</code> to a <code>Node</code> using the 1601 * <code>namespace</code>. 1602 * 1603 * @param toNode 1604 * the <code>Node</code> to append the new element to 1605 * @param modJSList 1606 * the <code>modJSList</code> to be appended as new element 1607 * 1608 */ 1609 protected static void appendModuleJSList( Node toNode, String[] modJSList ) { 1610 1611 if ( modJSList != null && modJSList.length > 0 ) { 1612 1613 for ( int i = 0; i < modJSList.length; i++ ) { 1614 if ( modJSList[i] != null ) { 1615 Element p = createElement( D_CONTEXT_NS, "deegree:ModuleJS" ); 1616 p.appendChild( createTextNode( modJSList[i] ) ); 1617 1618 toNode.appendChild( p ); 1619 } 1620 } 1621 } 1622 1623 } 1624 1625 }