001 //$HeadURL: svn+ssh://jwilden@svn.wald.intevation.org/deegree/base/branches/2.5_testing/src/org/deegree/portal/context/WebMapContextFactory.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.portal.context; 037 038 import java.awt.Rectangle; 039 import java.io.File; 040 import java.io.IOException; 041 import java.io.InputStreamReader; 042 import java.io.Reader; 043 import java.net.MalformedURLException; 044 import java.net.URL; 045 import java.util.HashMap; 046 import java.util.Map; 047 048 import org.apache.commons.httpclient.HttpClient; 049 import org.apache.commons.httpclient.methods.GetMethod; 050 import org.deegree.datatypes.QualifiedName; 051 import org.deegree.enterprise.WebUtils; 052 import org.deegree.framework.log.ILogger; 053 import org.deegree.framework.log.LoggerFactory; 054 import org.deegree.framework.util.HttpUtils; 055 import org.deegree.framework.util.Parameter; 056 import org.deegree.framework.util.ParameterList; 057 import org.deegree.framework.util.StringTools; 058 import org.deegree.framework.xml.ElementList; 059 import org.deegree.framework.xml.NamespaceContext; 060 import org.deegree.framework.xml.XMLFragment; 061 import org.deegree.framework.xml.XMLParsingException; 062 import org.deegree.framework.xml.XMLTools; 063 import org.deegree.graphics.sld.FeatureTypeStyle; 064 import org.deegree.graphics.sld.SLDFactory; 065 import org.deegree.graphics.sld.StyledLayerDescriptor; 066 import org.deegree.model.crs.CRSFactory; 067 import org.deegree.model.crs.CoordinateSystem; 068 import org.deegree.model.crs.UnknownCRSException; 069 import org.deegree.model.metadata.iso19115.Address; 070 import org.deegree.model.metadata.iso19115.CitedResponsibleParty; 071 import org.deegree.model.metadata.iso19115.ContactInfo; 072 import org.deegree.model.metadata.iso19115.Phone; 073 import org.deegree.model.metadata.iso19115.RoleCode; 074 import org.deegree.model.spatialschema.GeometryFactory; 075 import org.deegree.model.spatialschema.Point; 076 import org.deegree.ogcbase.BaseURL; 077 import org.deegree.ogcbase.CommonNamespaces; 078 import org.deegree.ogcbase.ImageURL; 079 import org.deegree.ogcwebservices.OWSUtils; 080 import org.deegree.ogcwebservices.getcapabilities.MetadataURL; 081 import org.deegree.ogcwebservices.getcapabilities.OGCCapabilities; 082 import org.deegree.ogcwebservices.getcapabilities.OGCCapabilitiesDocument; 083 import org.deegree.ogcwebservices.wcs.getcapabilities.WCSCapabilities; 084 import org.deegree.ogcwebservices.wcs.getcapabilities.WCSCapabilitiesDocument; 085 import org.deegree.ogcwebservices.wfs.capabilities.WFSCapabilities; 086 import org.deegree.ogcwebservices.wfs.capabilities.WFSCapabilitiesDocument; 087 import org.deegree.ogcwebservices.wms.capabilities.LegendURL; 088 import org.deegree.ogcwebservices.wms.capabilities.WMSCapabilities; 089 import org.deegree.ogcwebservices.wms.capabilities.WMSCapabilitiesDocument; 090 import org.deegree.ogcwebservices.wms.capabilities.WMSCapabilitiesDocumentFactory; 091 import org.deegree.ogcwebservices.wms.operation.GetLegendGraphic; 092 import org.deegree.owscommon_new.HTTP; 093 import org.deegree.owscommon_new.Operation; 094 import org.deegree.owscommon_new.OperationsMetadata; 095 import org.deegree.security.drm.model.User; 096 import org.w3c.dom.Element; 097 import org.w3c.dom.Text; 098 import org.xml.sax.SAXException; 099 100 /** 101 * Factory class for creating an instance of a web map Context (<tt>ViewContext</tt>). The factory is able to parse 102 * deegree specific extensions (General and Layer) as well as standard web map context documents. 103 * 104 * @author <a href="mailto:poth@lat-lon.de">Andreas Poth</a> 105 * @author last edited by: $Author: jmays $ 106 * 107 * @version $Revision: 23790 $, $Date: 2010-04-23 14:22:04 +0200 (Fr, 23 Apr 2010) $ 108 */ 109 public class WebMapContextFactory { 110 111 private static final ILogger LOG = LoggerFactory.getLogger( WebMapContextFactory.class ); 112 113 /** 114 * Caching the wms capabilities. Key is the wms address (URL), value is the WMSCapabilities. 115 */ 116 private static Map<URL, WMSCapabilities> wmsCache = new HashMap<URL, WMSCapabilities>(); 117 118 private static Map<URL, WFSCapabilities> wfsCache = new HashMap<URL, WFSCapabilities>(); 119 120 private static Map<URL, WCSCapabilities> wcsCache = new HashMap<URL, WCSCapabilities>(); 121 122 /** 123 * creates an instance of a ViewContext from the web map context document read from the passed URL 124 * 125 * @param url 126 * @param user 127 * @param sessionID 128 * @return new ViewContext for web map context document from <code>url</code> 129 * @throws IOException 130 * @throws XMLParsingException 131 * @throws ContextException 132 * @throws SAXException 133 * @throws UnknownCRSException 134 */ 135 public synchronized static ViewContext createViewContext( URL url, User user, String sessionID ) 136 throws IOException, XMLParsingException, ContextException, SAXException, 137 UnknownCRSException { 138 // cache have to be cleared because contained capabilities may has been 139 // requested with other user identification 140 wmsCache.clear(); 141 142 XMLFragment xml = new XMLFragment( url ); 143 144 return createViewContext( xml, user, sessionID ); 145 } 146 147 /** 148 * @param xml 149 * @param user 150 * @param sessionID 151 * @return new ViewContext for web map context document from <code>xml</code> 152 * @throws IOException 153 * @throws XMLParsingException 154 * @throws ContextException 155 * @throws UnknownCRSException 156 */ 157 public synchronized static ViewContext createViewContext( XMLFragment xml, User user, String sessionID ) 158 throws IOException, XMLParsingException, ContextException, UnknownCRSException { 159 // general section 160 Element element = XMLTools.getRequiredChildElement( "General", CommonNamespaces.CNTXTNS, xml.getRootElement() ); 161 General general = createGeneral( element, xml ); 162 163 // Layer (List) section 164 element = XMLTools.getRequiredChildElement( "LayerList", CommonNamespaces.CNTXTNS, xml.getRootElement() ); 165 166 final LayerList layerList = createLayerList( element, user, sessionID ); 167 168 GeneralExtension ge = general.getExtension(); 169 MapModel mapModel = ge.getMapModel(); 170 if ( mapModel != null ) { 171 // WMC layers assigned to MapModel layers just can be set after WMC layer 172 // list has been parsed 173 try { 174 mapModel.walkLayerTree( new MapModelVisitor() { 175 176 public void visit( LayerGroup layerGroup ) 177 throws Exception { 178 } 179 180 public void visit( MMLayer layer ) 181 throws Exception { 182 Layer[] layers = layerList.getLayers(); 183 for ( Layer layer2 : layers ) { 184 if ( layer.getIdentifier().equals( layer2.getExtension().getIdentifier() ) ) { 185 layer.setLayer( layer2 ); 186 break; 187 } 188 } 189 } 190 } ); 191 } catch ( Exception e ) { 192 e.printStackTrace(); 193 } 194 } 195 196 ViewContext vc = new ViewContext( general, layerList ); 197 198 return vc; 199 } 200 201 /** 202 * creates an instance of a class encapsulating the general context informations 203 * 204 * @param element 205 * <General> 206 * @param xml 207 * 208 * @return instance of <tt>General</tt> 209 * 210 * @throws XMLParsingException 211 * @throws UnknownCRSException 212 */ 213 private static General createGeneral( Element element, XMLFragment xml ) 214 throws XMLParsingException, MalformedURLException, UnknownCRSException { 215 216 // <Window> 217 Element elem = XMLTools.getChildElement( "Window", CommonNamespaces.CNTXTNS, element ); 218 Rectangle rect = createWindow( elem ); 219 220 // <BoundingBox> 221 elem = XMLTools.getRequiredChildElement( "BoundingBox", CommonNamespaces.CNTXTNS, element ); 222 Point[] bbox = createBoundingBox( elem ); 223 224 // <Title> 225 String title = XMLTools.getRequiredStringValue( "Title", CommonNamespaces.CNTXTNS, element ); 226 227 // <KeywordList> 228 elem = XMLTools.getChildElement( "KeywordList", CommonNamespaces.CNTXTNS, element ); 229 String[] keywords = createKeywords( elem ); 230 231 // <Abstract> 232 String abstract_ = XMLTools.getStringValue( "Abstract", CommonNamespaces.CNTXTNS, element, null ); 233 234 // <LogoURL> 235 elem = XMLTools.getChildElement( "LogoURL", CommonNamespaces.CNTXTNS, element ); 236 ImageURL logoURL = createImageURL( elem ); 237 238 // <DescriptionURL> 239 240 // elem = XMLTools.getChildElement( "DescriptionURL", CommonNamespaces.CNTXTNS, element ); 241 elem = XMLTools.getRequiredElement( element, CommonNamespaces.CNTXT_PREFIX + ":DescriptionURL", 242 CommonNamespaces.getNamespaceContext() ); 243 244 BaseURL descriptionURL = createBaseURL( elem ); 245 246 // <ContactInformation> 247 elem = XMLTools.getChildElement( "ContactInformation", CommonNamespaces.CNTXTNS, element ); 248 CitedResponsibleParty contact = createContactInformation( elem ); 249 250 // <Extension> 251 elem = XMLTools.getChildElement( "Extension", CommonNamespaces.CNTXTNS, element ); 252 GeneralExtension extension = createGeneralExtension( elem, xml ); 253 254 General general = null; 255 try { 256 general = new General( title, abstract_, rect, contact, bbox, descriptionURL, logoURL, keywords, extension ); 257 } catch ( Exception e ) { 258 throw new XMLParsingException( e.getMessage(), e ); 259 } 260 261 return general; 262 } 263 264 /** 265 * creates a <tt>Rectangle<tt> (Window) instance from the passed Element. 266 * 267 * @param element 268 * <Window> 269 * 270 * @return instance of <tt>Rectangle</tt> 271 * 272 * @throws XMLParsingException 273 */ 274 private static Rectangle createWindow( Element element ) 275 throws XMLParsingException { 276 277 Rectangle rect = null; 278 279 if ( element != null ) { 280 String tmp = XMLTools.getRequiredAttrValue( "width", null, element ); 281 int width = Integer.parseInt( tmp ); 282 tmp = XMLTools.getRequiredAttrValue( "height", null, element ); 283 284 int height = Integer.parseInt( tmp ); 285 rect = new Rectangle( width, height ); 286 } 287 288 return rect; 289 } 290 291 /** 292 * creates a <tt>Envelope </tt> from the passed Element 293 * 294 * @param element 295 * <BoundingBox> 296 * 297 * @return instance of <tt>Envelope</tt> 298 * 299 * @throws XMLParsingException 300 * @throws UnknownCRSException 301 */ 302 private static Point[] createBoundingBox( Element element ) 303 throws XMLParsingException, UnknownCRSException { 304 305 String srs = XMLTools.getRequiredAttrValue( "SRS", null, element ); 306 CoordinateSystem crs = CRSFactory.create( srs ); 307 String tmp = XMLTools.getRequiredAttrValue( "minx", null, element ); 308 double minx = Double.parseDouble( tmp ); 309 tmp = XMLTools.getRequiredAttrValue( "miny", null, element ); 310 311 double miny = Double.parseDouble( tmp ); 312 tmp = XMLTools.getRequiredAttrValue( "maxx", null, element ); 313 314 double maxx = Double.parseDouble( tmp ); 315 tmp = XMLTools.getRequiredAttrValue( "maxy", null, element ); 316 317 double maxy = Double.parseDouble( tmp ); 318 319 Point[] points = new Point[2]; 320 points[0] = GeometryFactory.createPoint( minx, miny, crs ); 321 points[1] = GeometryFactory.createPoint( maxx, maxy, crs ); 322 323 return points; 324 } 325 326 /** 327 * creates an array of keywords (String) from the passed Keyword list 328 * 329 * @param element 330 * <KeywordList> 331 * 332 * @return array of Strings 333 * 334 */ 335 private static String[] createKeywords( Element element ) { 336 337 ElementList el = XMLTools.getChildElements( "Keyword", CommonNamespaces.CNTXTNS, element ); 338 String[] keywords = new String[el.getLength()]; 339 340 for ( int i = 0; i < keywords.length; i++ ) { 341 keywords[i] = XMLTools.getStringValue( el.item( i ) ); 342 } 343 344 return keywords; 345 } 346 347 /** 348 * creates an instance of an ImageURL that is used for <LogoURL> and LegendURL 349 * 350 * @param element 351 * <LogoURL> or <LegendURL> 352 * 353 * @return instance of <tt>ImageURL</tt> 354 * 355 * @throws XMLParsingException 356 */ 357 private static ImageURL createImageURL( Element element ) 358 throws XMLParsingException { 359 360 ImageURL imageURL = null; 361 362 if ( element != null ) { 363 String tmp = XMLTools.getAttrValue( element, null, "width", null ); 364 int width = -1; 365 if ( tmp != null ) { 366 width = Integer.parseInt( tmp ); 367 } 368 tmp = XMLTools.getAttrValue( element, null, "height", null ); 369 int height = -1; 370 if ( tmp != null ) { 371 height = Integer.parseInt( tmp ); 372 } 373 String format = XMLTools.getAttrValue( element, null, "format", null ); 374 375 Element elem = XMLTools.getRequiredChildElement( "OnlineResource", CommonNamespaces.CNTXTNS, element ); 376 URL onlineResource = createOnlineResource( elem ); 377 378 imageURL = new ImageURL( width, height, format, onlineResource ); 379 } 380 381 return imageURL; 382 } 383 384 /** 385 * creates an instance of an URL described by a <OnlineResource> element 386 * 387 * @param element 388 * <OnlineResource> 389 * 390 * @return instance of <tt>URL</tt> 391 * 392 * @throws XMLParsingException 393 */ 394 private static URL createOnlineResource( Element element ) 395 throws XMLParsingException { 396 397 URL onlineResource = null; 398 399 if ( element != null ) { 400 String type = element.getAttributeNS( CommonNamespaces.XLNNS.toASCIIString(), "type" ); 401 if ( ( type != null ) && !"".equals( type ) && !type.equals( "simple" ) ) { 402 throw new XMLParsingException( "unknown type of online resource: " + type ); 403 } 404 String tmp = element.getAttributeNS( CommonNamespaces.XLNNS.toASCIIString(), "href" ); 405 tmp = OWSUtils.validateHTTPGetBaseURL( tmp ); 406 407 // System.out.println("href is: " + tmp); 408 try { 409 onlineResource = new URL( tmp ); 410 } catch ( Exception e ) { 411 throw new XMLParsingException( "couldn't create online resource", e ); 412 } 413 } 414 415 return onlineResource; 416 } 417 418 /** 419 * creates an instance of BaseURL that is used for <DescriptionURL> 420 * 421 * @param element 422 * <DescriptionURL> 423 * @return instance of <tt>BaseURL</tt>, or null, if the passed element is null 424 * @throws XMLParsingException 425 */ 426 private static BaseURL createBaseURL( Element element ) 427 throws XMLParsingException { 428 429 BaseURL baseURL = null; 430 431 if ( element != null ) { 432 String format = XMLTools.getAttrValue( element, null, "format", null ); 433 434 Element elem = XMLTools.getElement( element, CommonNamespaces.CNTXT_PREFIX + ":OnlineResource", 435 CommonNamespaces.getNamespaceContext() ); 436 URL onlineResource = createOnlineResource( elem ); 437 438 baseURL = new BaseURL( format, onlineResource ); 439 } 440 441 return baseURL; 442 } 443 444 /** 445 * Creates a <tt>ContactInformation</tt>-instance according to the contents of the DOM-subtree starting at the given 446 * 'ContactInformation'-<tt>Element</tt>. 447 * <p> 448 * 449 * @param element 450 * the 'ContactInformation'-<tt>Element</tt> 451 * @throws XMLParsingException 452 * if a syntactic or semantic error in the DOM-subtree is encountered 453 * @return the constructed <tt>ContactInformation</tt>-instance 454 */ 455 private static CitedResponsibleParty createContactInformation( Element element ) 456 throws XMLParsingException { 457 458 CitedResponsibleParty contact = null; 459 460 if ( element != null ) { 461 // optional: <ContactPersonPrimary> 462 Element contactPersonPrimaryElement = XMLTools.getChildElement( "ContactPersonPrimary", 463 CommonNamespaces.CNTXTNS, element ); 464 465 String contactPerson = null; 466 String contactOrganization = null; 467 if ( contactPersonPrimaryElement != null ) { 468 // required: <ContactPerson> 469 contactPerson = XMLTools.getRequiredStringValue( "ContactPerson", CommonNamespaces.CNTXTNS, 470 contactPersonPrimaryElement ); 471 472 // required: <ContactOrganization> 473 contactOrganization = XMLTools.getRequiredStringValue( "ContactOrganization", CommonNamespaces.CNTXTNS, 474 contactPersonPrimaryElement ); 475 } 476 477 // optional: <ContactPosition> 478 String contactPosition = XMLTools.getStringValue( "ContactPosition", CommonNamespaces.CNTXTNS, element, 479 null ); 480 481 // optional: <ContactAddress> 482 Address contactAddress = null; 483 Element contactAddressElement = XMLTools.getChildElement( "ContactAddress", CommonNamespaces.CNTXTNS, 484 element ); 485 486 if ( contactAddressElement != null ) { 487 // optional: <ContactElectronicMailAddress> 488 String eMailAddress = XMLTools.getStringValue( "ContactElectronicMailAddress", 489 CommonNamespaces.CNTXTNS, element, null ); 490 contactAddress = createContactAddress( eMailAddress, contactAddressElement ); 491 } 492 493 // optional: <ContactVoiceTelephone> 494 String voice = XMLTools.getStringValue( "ContactVoiceTelephone", CommonNamespaces.CNTXTNS, element, null ); 495 496 // optional: <ContactFacsimileTelephone> 497 String fax = XMLTools.getStringValue( "ContactFacsimileTelephone", CommonNamespaces.CNTXTNS, element, null ); 498 499 Phone phone = new Phone( new String[] { fax }, new String[] { voice } ); 500 ContactInfo ci = new ContactInfo( contactAddress, null, null, null, phone ); 501 contact = new CitedResponsibleParty( new ContactInfo[] { ci }, new String[] { contactPerson }, 502 new String[] { contactOrganization }, 503 new String[] { contactPosition }, new RoleCode[0] ); 504 } 505 506 return contact; 507 } 508 509 /** 510 * Creates a <tt>ContactAddress</tt>-instance according to the contents of the DOM-subtree starting at the given 511 * 'ContactAddress'-<tt>Element</tt>. 512 * <p> 513 * 514 * @param element 515 * the 'ContactAddress'-<tt>Element</tt> 516 * @throws XMLParsingException 517 * if a syntactic or semantic error in the DOM-subtree is encountered 518 * @return the constructed <tt>ContactAddress</tt>-instance 519 */ 520 private static Address createContactAddress( String eMail, Element element ) 521 throws XMLParsingException { 522 523 // required: <AddressType> 524 /* 525 * String addressType = XMLTools.getRequiredStringValue( "AddressType", CommonNamespaces.CNTXTNS, element ); 526 */ 527 // required: <Address> 528 String address = XMLTools.getRequiredStringValue( "Address", CommonNamespaces.CNTXTNS, element ); 529 530 // required: <City> 531 String city = XMLTools.getRequiredStringValue( "City", CommonNamespaces.CNTXTNS, element ); 532 533 // required: <StateOrProvince> 534 String stateOrProvince = XMLTools.getRequiredStringValue( "StateOrProvince", CommonNamespaces.CNTXTNS, element ); 535 536 // required: <PostCode> 537 String postCode = XMLTools.getRequiredStringValue( "PostCode", CommonNamespaces.CNTXTNS, element ); 538 539 // required: <Country> 540 String country = XMLTools.getRequiredStringValue( "Country", CommonNamespaces.CNTXTNS, element ); 541 542 return new Address( stateOrProvince, city, country, new String[] { address }, new String[] { eMail }, postCode ); 543 } 544 545 /** 546 * creates an instance of a class encapsulating the deegree specific extensions of the general section of a web map 547 * context document 548 * 549 * @param element 550 * <Extension> 551 * @param xml 552 * 553 * @return instance of <tt>GeneralExtension</tt> 554 * 555 * @throws XMLParsingException 556 */ 557 private static GeneralExtension createGeneralExtension( Element element, XMLFragment xml ) 558 throws XMLParsingException, MalformedURLException { 559 560 GeneralExtension ge = null; 561 562 if ( element != null ) { 563 564 // retunrs the current mode of a client using a WMC 565 String mode = XMLTools.getStringValue( "Mode", CommonNamespaces.DGCNTXTNS, element, "ZOOMIN" ); 566 567 // <AuthentificationSettings> 568 Element elem = XMLTools.getChildElement( "AuthentificationSettings", CommonNamespaces.DGCNTXTNS, element ); 569 AuthentificationSettings authSettings = null; 570 if ( elem != null ) { 571 authSettings = createAuthentificationSettings( elem ); 572 } 573 // <IOSetiings> 574 elem = XMLTools.getChildElement( "IOSettings", CommonNamespaces.DGCNTXTNS, element ); 575 IOSettings ioSettings = null; 576 if ( elem != null ) { 577 ioSettings = createIOSettings( elem, xml ); 578 } 579 // <Frontend> 580 elem = XMLTools.getChildElement( "Frontend", CommonNamespaces.DGCNTXTNS, element ); 581 Frontend frontend = null; 582 if ( elem != null ) { 583 frontend = createFrontend( elem ); 584 } 585 // <MapParameter> 586 elem = XMLTools.getRequiredChildElement( "MapParameter", CommonNamespaces.DGCNTXTNS, element ); 587 MapParameter mapParameter = createMapParameter( elem ); 588 589 // <LayerTree> old version 590 elem = XMLTools.getChildElement( "LayerTree", CommonNamespaces.DGCNTXTNS, element ); 591 592 Node layerTreeRoot = null; 593 if ( elem != null ) { 594 Element nodeElem = XMLTools.getRequiredChildElement( "Node", CommonNamespaces.DGCNTXTNS, elem ); 595 layerTreeRoot = createNode( nodeElem, null ); 596 } else { 597 try { 598 layerTreeRoot = new Node( 0, null, "root", false, false ); 599 Node[] nodes = new Node[] { new Node( 1, layerTreeRoot, "deegree", false, false ) }; 600 layerTreeRoot.setNodes( nodes ); 601 } catch ( ContextException e ) { 602 throw new XMLParsingException( "couldn't create layertree node", e ); 603 } 604 } 605 606 elem = XMLTools.getChildElement( "MapModel", CommonNamespaces.DGCNTXTNS, element ); 607 MapModel mapModel = null; 608 if ( elem != null ) { 609 MapModelDocument doc = new MapModelDocument( elem ); 610 mapModel = doc.parseMapModel(); 611 } 612 613 String tmp = XMLTools.getStringValue( "XSLT", CommonNamespaces.DGCNTXTNS, element, "context2HTML.xsl" ); 614 URL xslt = xml.resolve( tmp ); 615 File file = new File( xslt.getFile() ); 616 if ( !file.exists() ) { 617 // address xslt script from WEB-INF/conf/igeoportal 618 file = new File( file.getParentFile().getParentFile().getParent() + File.separatorChar + file.getName() ); 619 xslt = file.toURL(); 620 } 621 622 ge = new GeneralExtension( ioSettings, frontend, mapParameter, authSettings, mode, layerTreeRoot, mapModel, 623 xslt ); 624 } 625 626 return ge; 627 } 628 629 /** 630 * creates a node in the layerTree 631 */ 632 private static Node createNode( Element nodeElem, Node parent ) 633 throws XMLParsingException { 634 635 int id = Integer.parseInt( XMLTools.getRequiredAttrValue( "id", null, nodeElem ) ); 636 String title = XMLTools.getRequiredAttrValue( "title", null, nodeElem ); 637 String s = XMLTools.getAttrValue( nodeElem, null, "selectable", null ); 638 boolean selectable = "true".equals( s ) || "1".equals( s ); 639 s = XMLTools.getAttrValue( nodeElem, null, "collapsed", null ); 640 boolean collapsed = "true".equals( s ) || "1".equals( s ); 641 Node node = null; 642 try { 643 node = new Node( id, parent, title, selectable, collapsed ); 644 } catch ( Exception e ) { 645 throw new XMLParsingException( "couldn't create layertree node", e ); 646 } 647 648 // get Child nodes 649 ElementList nl = XMLTools.getChildElements( "Node", CommonNamespaces.DGCNTXTNS, nodeElem ); 650 Node[] nodes = new Node[nl.getLength()]; 651 for ( int i = 0; i < nodes.length; i++ ) { 652 nodes[i] = createNode( nl.item( i ), node ); 653 } 654 // set child nodes 655 node.setNodes( nodes ); 656 657 return node; 658 } 659 660 /** 661 * creates an instance of a class encapsulating access descrition to an authentification service for a deegree map 662 * client 663 * 664 * @param element 665 * <AuthentificationSettings> 666 * @return instance of <tt>AuthentificationSettings</tt> 667 * @throws XMLParsingException 668 */ 669 private static AuthentificationSettings createAuthentificationSettings( Element element ) 670 throws XMLParsingException { 671 672 Element elem = XMLTools.getRequiredChildElement( "AuthentificationService", CommonNamespaces.DGCNTXTNS, element ); 673 elem = XMLTools.getRequiredChildElement( "OnlineResource", CommonNamespaces.CNTXTNS, elem ); 674 675 URL url = createOnlineResource( elem ); 676 BaseURL bu = new BaseURL( "text/xml", url ); 677 678 return new AuthentificationSettings( bu ); 679 } 680 681 /** 682 * creates an instance of a class encapsulating the frontend (GUI) description of a deegree map client 683 * 684 * @param element 685 * <Frontend> 686 * 687 * @return instance of <tt>Frontend</tt> 688 * 689 * @throws XMLParsingException 690 */ 691 private static Frontend createFrontend( Element element ) 692 throws XMLParsingException { 693 694 // <Controller> 695 String controller = XMLTools.getRequiredStringValue( "Controller", CommonNamespaces.DGCNTXTNS, element ); 696 // <Style> 697 String style = XMLTools.getStringValue( "Style", CommonNamespaces.DGCNTXTNS, element, null ); 698 // <Buttons> 699 String buttons = XMLTools.getStringValue( "Buttons", CommonNamespaces.DGCNTXTNS, element, null ); 700 // <CommonJS> 701 Element elem = XMLTools.getChildElement( "CommonJS", CommonNamespaces.DGCNTXTNS, element ); 702 String[] commonJS = createCommonJS( elem ); 703 // <West> 704 elem = XMLTools.getChildElement( "West", CommonNamespaces.DGCNTXTNS, element ); 705 GUIArea west = createGUIArea( elem ); 706 // <East> 707 elem = XMLTools.getChildElement( "East", CommonNamespaces.DGCNTXTNS, element ); 708 GUIArea east = createGUIArea( elem ); 709 // <North> 710 elem = XMLTools.getChildElement( "North", CommonNamespaces.DGCNTXTNS, element ); 711 GUIArea north = createGUIArea( elem ); 712 // <South> 713 elem = XMLTools.getChildElement( "South", CommonNamespaces.DGCNTXTNS, element ); 714 GUIArea south = createGUIArea( elem ); 715 // <Center> 716 elem = XMLTools.getChildElement( "Center", CommonNamespaces.DGCNTXTNS, element ); 717 GUIArea center = createGUIArea( elem ); 718 // <Header> 719 String header = XMLTools.getStringValue( "Header", CommonNamespaces.DGCNTXTNS, element, null ); 720 // <Footer> 721 String footer = XMLTools.getStringValue( "Footer", CommonNamespaces.DGCNTXTNS, element, null ); 722 723 Frontend frontend = new JSPFrontend( controller, west, east, south, north, center, style, buttons, commonJS, 724 header, footer ); 725 726 return frontend; 727 } 728 729 /** 730 * creates a list of javascript pages (names) that contains javascript objects and methods that are used by more 731 * than one module 732 * 733 * @param element 734 * <CommonJS> 735 * 736 * @return instance of <tt>String[]</tt> 737 * 738 */ 739 private static String[] createCommonJS( Element element ) { 740 String[] commonJS = null; 741 if ( element != null ) { 742 ElementList el = XMLTools.getChildElements( "Name", CommonNamespaces.DGCNTXTNS, element ); 743 commonJS = new String[el.getLength()]; 744 for ( int i = 0; i < commonJS.length; i++ ) { 745 commonJS[i] = XMLTools.getStringValue( el.item( i ) ); 746 } 747 } 748 749 return commonJS; 750 } 751 752 /** 753 * creates an instance of a class encapsulating the GUI description of one region of the GUI 754 * 755 * @param element 756 * <West>; <East>; <South>; <North> or <Center> 757 * 758 * @return instance of <tt>GUIArea</tt> 759 * 760 * @throws XMLParsingException 761 */ 762 private static GUIArea createGUIArea( Element element ) 763 throws XMLParsingException { 764 765 GUIArea gui = null; 766 if ( element != null ) { 767 String tmp = element.getLocalName(); 768 int area = 0; 769 if ( tmp.equals( "West" ) ) { 770 area = GUIArea.WEST; 771 } else if ( tmp.equals( "East" ) ) { 772 area = GUIArea.EAST; 773 } else if ( tmp.equals( "South" ) ) { 774 area = GUIArea.SOUTH; 775 } else if ( tmp.equals( "North" ) ) { 776 area = GUIArea.NORTH; 777 } else if ( tmp.equals( "Center" ) ) { 778 area = GUIArea.CENTER; 779 } 780 781 NamespaceContext nsContext = CommonNamespaces.getNamespaceContext(); 782 int w = XMLTools.getNodeAsInt( element, "./@width", nsContext, -1 ); 783 int h = XMLTools.getNodeAsInt( element, "./@height", nsContext, -1 ); 784 int l = XMLTools.getNodeAsInt( element, "./@left", nsContext, -1 ); 785 int t = XMLTools.getNodeAsInt( element, "./@top", nsContext, -1 ); 786 int r = XMLTools.getNodeAsInt( element, "./@right", nsContext, -1 ); 787 int b = XMLTools.getNodeAsInt( element, "./@bottom", nsContext, -1 ); 788 boolean ov = XMLTools.getNodeAsBoolean( element, "./@overlay", nsContext, false ); 789 boolean head = XMLTools.getNodeAsBoolean( element, "./@header", nsContext, false ); 790 boolean close = XMLTools.getNodeAsBoolean( element, "./@closable", nsContext, false ); 791 792 // hidden 793 tmp = XMLTools.getAttrValue( element, null, "hidden", null ); 794 boolean hidden = "1".equals( tmp ) || "true".equals( tmp ); 795 // <Module> 796 ElementList el = XMLTools.getChildElements( "Module", CommonNamespaces.DGCNTXTNS, element ); 797 Module[] modules = new Module[el.getLength()]; 798 for ( int i = 0; i < modules.length; i++ ) { 799 modules[i] = createModule( el.item( i ) ); 800 } 801 gui = new GUIArea( area, hidden, w, h, l, t, r, b, ov, head, close, modules ); 802 } 803 804 return gui; 805 } 806 807 /** 808 * creates an instance of a class encapsulating module informations 809 * 810 * @param element 811 * <Module> 812 * 813 * @return instance of <tt>Module</tt> 814 * 815 * @throws XMLParsingException 816 */ 817 private static Module createModule( Element element ) 818 throws XMLParsingException { 819 820 // hidden 821 String tmp = XMLTools.getAttrValue( element, null, "hidden", null ); 822 boolean hidden = tmp.equals( "1" ) || tmp.equals( "true" ); 823 // <Name> 824 String name = XMLTools.getRequiredStringValue( "Name", CommonNamespaces.DGCNTXTNS, element ); 825 // <Title> 826 String title = XMLTools.getStringValue( "Title", CommonNamespaces.DGCNTXTNS, element, name ); 827 // <Content> 828 String content = XMLTools.getRequiredStringValue( "Content", CommonNamespaces.DGCNTXTNS, element ); 829 // <ModuleConfiguration> 830 Element elem = XMLTools.getChildElement( "ModuleConfiguration", CommonNamespaces.DGCNTXTNS, element ); 831 ModuleConfiguration mc = createModuleConfiguration( elem ); 832 // <ParameterList> 833 elem = XMLTools.getChildElement( "ParameterList", CommonNamespaces.DGCNTXTNS, element ); 834 ParameterList paramList = createParameterList( elem ); 835 836 String type = XMLTools.getAttrValue( element, null, "type", null ); 837 838 // width and height of a Module are optional 839 // if not set '0' will be used instead 840 NamespaceContext nsContext = CommonNamespaces.getNamespaceContext(); 841 int w = XMLTools.getNodeAsInt( element, "./@width", nsContext, -1 ); 842 int h = XMLTools.getNodeAsInt( element, "./@height", nsContext, -1 ); 843 int l = XMLTools.getNodeAsInt( element, "./@left", nsContext, -1 ); 844 int t = XMLTools.getNodeAsInt( element, "./@top", nsContext, -1 ); 845 int b = XMLTools.getNodeAsInt( element, "./@bottom", nsContext, -1 ); 846 int r = XMLTools.getNodeAsInt( element, "./@right", nsContext, -1 ); 847 boolean ov = XMLTools.getNodeAsBoolean( element, "./@overlay", nsContext, false ); 848 boolean head = XMLTools.getNodeAsBoolean( element, "./@header", nsContext, false ); 849 boolean close = XMLTools.getNodeAsBoolean( element, "./@closable", nsContext, false ); 850 boolean collapsed = XMLTools.getNodeAsBoolean( element, "./@collapsed", nsContext, false ); 851 852 String scrollable = XMLTools.getAttrValue( element, null, "scrolling", null ); 853 854 String[] moduleJS = createModuleJSList( element ); 855 return new Module( name, title, content, hidden, type, l, t, r, b, w, h, ov, head, close, collapsed, 856 scrollable, moduleJS, mc, paramList ); 857 } 858 859 /** 860 * creates an instance of a class encapsulating the access the configuration of Module 861 * 862 * @param element 863 * <ModuleConfiguration> 864 * 865 * @return instance of <tt>ModuleConfiguration</tt> 866 * 867 * @throws XMLParsingException 868 */ 869 private static ModuleConfiguration createModuleConfiguration( Element element ) 870 throws XMLParsingException { 871 872 ModuleConfiguration mc = null; 873 if ( element != null ) { 874 Element elem = XMLTools.getRequiredChildElement( "OnlineResource", CommonNamespaces.DGCNTXTNS, element ); 875 URL onlineResource = createOnlineResource( elem ); 876 mc = new ModuleConfiguration( onlineResource ); 877 } 878 879 return mc; 880 } 881 882 /** 883 * creates an instance of a class encapsulating the layer list informations 884 * 885 * @param element 886 * <LayerList> 887 * 888 * @return instance of <tt>LayerList</tt> 889 * 890 * @throws XMLParsingException 891 */ 892 private static ParameterList createParameterList( Element element ) 893 throws XMLParsingException { 894 895 ParameterList parameterList = new ParameterList(); 896 if ( element != null ) { 897 ElementList el = XMLTools.getChildElements( "Parameter", CommonNamespaces.DGCNTXTNS, element ); 898 for ( int i = 0; i < el.getLength(); i++ ) { 899 Parameter parameter = createParameter( el.item( i ) ); 900 parameterList.addParameter( parameter ); 901 } 902 } 903 904 return parameterList; 905 } 906 907 /** 908 * creates an instance of a class encapsulating a parameter that shall be passed to a module 909 * 910 * @param element 911 * <Parameter> 912 * 913 * @return instance of <tt>Parameter</tt> 914 * 915 * @throws XMLParsingException 916 */ 917 private static Parameter createParameter( Element element ) 918 throws XMLParsingException { 919 920 String name = XMLTools.getRequiredStringValue( "Name", CommonNamespaces.DGCNTXTNS, element ); 921 String value = XMLTools.getRequiredStringValue( "Value", CommonNamespaces.DGCNTXTNS, element ); 922 // Parameter param = new Parameter_Impl( name+":"+value, value ); 923 Parameter param = new Parameter( name, value ); 924 925 return param; 926 } 927 928 /** 929 * creates an instance of a class encapsulating informations about controlling options for a map presented to the 930 * user 931 * 932 * @param element 933 * <MapParameter> 934 * 935 * @return instance of <tt>MapParameter</tt> 936 * 937 * @throws XMLParsingException 938 */ 939 private static MapParameter createMapParameter( Element element ) 940 throws XMLParsingException { 941 942 // <OfferedInfoFormats> 943 Element elem = XMLTools.getChildElement( "OfferedInfoFormats", CommonNamespaces.DGCNTXTNS, element ); 944 Format[] infoFormats = null; 945 if ( elem != null ) { 946 infoFormats = createOfferedInfoFormats( elem ); 947 } 948 // <OfferedZoomFactor> 949 elem = XMLTools.getChildElement( "OfferedZoomFactor", CommonNamespaces.DGCNTXTNS, element ); 950 MapOperationFactor[] zoomFactors = null; 951 if ( elem != null ) { 952 zoomFactors = createOfferedMapOperationFactors( elem ); 953 } 954 // <OfferedPanFactor> 955 elem = XMLTools.getChildElement( "OfferedPanFactor", CommonNamespaces.DGCNTXTNS, element ); 956 MapOperationFactor[] panFactors = null; 957 if ( elem != null ) { 958 panFactors = createOfferedMapOperationFactors( elem ); 959 } 960 // <MinScale> 961 String tmp = XMLTools.getStringValue( "MinScale", CommonNamespaces.DGCNTXTNS, element, "0" ); 962 double minScale = Double.parseDouble( tmp ); 963 // <MaxScale> 964 tmp = XMLTools.getStringValue( "MaxScale", CommonNamespaces.DGCNTXTNS, element, "9999999999" ); 965 double maxScale = Double.parseDouble( tmp ); 966 967 MapParameter mp = new MapParameter( infoFormats, panFactors, zoomFactors, minScale, maxScale ); 968 969 return mp; 970 } 971 972 /** 973 * Creates a list of the feature info formats offered by the client. 974 * 975 * @param element 976 * <OfferedInfoFormats> element of the configuration 977 * 978 * @return list of offered feature info formats 979 * 980 * @throws XMLParsingException 981 */ 982 private static Format[] createOfferedInfoFormats( Element element ) 983 throws XMLParsingException { 984 985 Format[] format = null; 986 987 // get list of offered feature info formats 988 ElementList el = XMLTools.getChildElements( "Format", CommonNamespaces.DGCNTXTNS, element ); 989 990 format = new Format[el.getLength()]; 991 992 for ( int i = 0; i < el.getLength(); i++ ) { 993 String name = XMLTools.getStringValue( el.item( i ) ); 994 String sel = XMLTools.getAttrValue( el.item( i ), null, "selected", null ); 995 996 boolean selected = "1".equals( sel ) || "true".equals( sel ); 997 try { 998 format[i] = new Format( name, selected ); 999 } catch ( ContextException e ) { 1000 throw new XMLParsingException( "", e ); 1001 } 1002 } 1003 1004 return format; 1005 } 1006 1007 /** 1008 * returns a list of offered numerical map operation factors that can be used to determine zoom or pan levels 1009 * 1010 * @param element 1011 * a <tt>Element</tt> that contains <Factor> elements as children 1012 * 1013 * @return list of <tt>MapOperationFactor</tt>s 1014 * 1015 */ 1016 private static MapOperationFactor[] createOfferedMapOperationFactors( Element element ) { 1017 1018 // get list of offered factors 1019 ElementList el = XMLTools.getChildElements( "Factor", CommonNamespaces.DGCNTXTNS, element ); 1020 1021 MapOperationFactor[] mof = new MapOperationFactor[el.getLength()]; 1022 1023 for ( int i = 0; i < el.getLength(); i++ ) { 1024 boolean free = true; 1025 String tmp = XMLTools.getStringValue( el.item( i ) ); 1026 double fac = -99; 1027 1028 if ( !tmp.equals( "*" ) ) { 1029 free = false; 1030 fac = Double.parseDouble( tmp ); 1031 } 1032 1033 String sel = XMLTools.getAttrValue( el.item( i ), null, "selected", null ); 1034 boolean selected = "1".equals( sel ) || "true".equals( sel ); 1035 mof[i] = new MapOperationFactor( fac, selected, free ); 1036 } 1037 1038 return mof; 1039 } 1040 1041 /** 1042 * creates an instance of a class encapsulating the IO setting informations 1043 * 1044 * @param element 1045 * @param xml 1046 * @return the iosettings. 1047 * @throws XMLParsingException 1048 */ 1049 private static IOSettings createIOSettings( Element element, XMLFragment xml ) 1050 throws XMLParsingException, MalformedURLException { 1051 1052 // temp directory 1053 Element elem = XMLTools.getChildElement( "TempDirectory", CommonNamespaces.DGCNTXTNS, element ); 1054 DirectoryAccess temp = null; 1055 if ( elem != null ) { 1056 temp = createDirectoryAccess( elem, null, xml ); 1057 } 1058 // download directory 1059 elem = XMLTools.getChildElement( "DownloadDirectory", CommonNamespaces.DGCNTXTNS, element ); 1060 DirectoryAccess download = null; 1061 if ( elem != null ) { 1062 download = createDirectoryAccess( elem, temp, xml ); 1063 } 1064 if ( temp == null && elem == null ) { 1065 throw new XMLParsingException( "If <TempDirectory> isn't set, " + "downloaddirectory must be set!" ); 1066 } 1067 // SLD directory 1068 elem = XMLTools.getChildElement( "SLDDirectory", CommonNamespaces.DGCNTXTNS, element ); 1069 DirectoryAccess sld = null; 1070 if ( elem != null ) { 1071 sld = createDirectoryAccess( elem, temp, xml ); 1072 } 1073 if ( temp == null && elem == null ) { 1074 throw new XMLParsingException( "If <TempDirectory> isn't set, " + "slddirectory must be set!" ); 1075 } 1076 // Print directory 1077 elem = XMLTools.getChildElement( "PrintDirectory", CommonNamespaces.DGCNTXTNS, element ); 1078 DirectoryAccess print = null; 1079 if ( elem != null ) { 1080 print = createDirectoryAccess( elem, temp, xml ); 1081 } 1082 if ( temp == null && elem == null ) { 1083 throw new XMLParsingException( "If <TempDirectory> isn't set, " + "printdirectory must be set!" ); 1084 } 1085 1086 IOSettings ioSettings = new IOSettings( download, sld, print, temp ); 1087 1088 return ioSettings; 1089 } 1090 1091 /** 1092 * @param element 1093 * @param tempDir 1094 * @return the directory access. 1095 * @throws XMLParsingException 1096 */ 1097 private static DirectoryAccess createDirectoryAccess( Element element, DirectoryAccess tempDir, XMLFragment xml ) 1098 throws XMLParsingException, MalformedURLException { 1099 1100 // directory name 1101 String name = XMLTools.getStringValue( "Name", CommonNamespaces.DGCNTXTNS, element, null ); 1102 name = xml.resolve( name ).toExternalForm(); 1103 1104 URL url = null; 1105 Element elem = XMLTools.getChildElement( "Access", CommonNamespaces.DGCNTXTNS, element ); 1106 if ( elem != null ) { 1107 elem = XMLTools.getRequiredChildElement( "OnlineResource", CommonNamespaces.CNTXTNS, elem ); 1108 url = createOnlineResource( elem ); 1109 } 1110 1111 DirectoryAccess da = null; 1112 if ( name == null || url == null ) { 1113 da = tempDir; 1114 } else { 1115 da = new DirectoryAccess( xml.resolve( name ).toExternalForm(), url ); 1116 } 1117 1118 return da; 1119 1120 } 1121 1122 /** 1123 * creates an instance of a class encapsulating the layer list informations 1124 * 1125 * @param element 1126 * <LayerList> 1127 * @param user 1128 * @param sessionID 1129 * 1130 * @return instance of <tt>LayerList</tt> 1131 * 1132 * @throws XMLParsingException 1133 */ 1134 private static LayerList createLayerList( Element element, User user, String sessionID ) 1135 throws XMLParsingException { 1136 1137 ElementList el = XMLTools.getChildElements( "Layer", CommonNamespaces.CNTXTNS, element ); 1138 Layer[] layers = new Layer[el.getLength()]; 1139 for ( int i = 0; i < layers.length; i++ ) { 1140 layers[i] = createLayer( el.item( i ), user, sessionID ); 1141 } 1142 LayerList list = new LayerList( layers ); 1143 1144 return list; 1145 } 1146 1147 /** 1148 * creates an instance of a class encapsulating a web map context layer's attributes 1149 * 1150 * @param element 1151 * <Layer> 1152 * @param user 1153 * @param sessionID 1154 * 1155 * @return instance of <tt>Layer</tt> 1156 * 1157 * @throws XMLParsingException 1158 */ 1159 private static Layer createLayer( Element element, User user, String sessionID ) 1160 throws XMLParsingException { 1161 1162 String tmp = XMLTools.getRequiredAttrValue( "queryable", null, element ); 1163 boolean queryable = "1".equals( tmp ) || "true".equals( tmp ); 1164 tmp = XMLTools.getRequiredAttrValue( "hidden", null, element ); 1165 boolean hidden = "1".equals( tmp ) || "true".equals( tmp ); 1166 1167 // <Name> 1168 String name = XMLTools.getRequiredStringValue( "Name", CommonNamespaces.CNTXTNS, element ); 1169 // <Title> 1170 String title = XMLTools.getRequiredStringValue( "Title", CommonNamespaces.CNTXTNS, element ); 1171 // <Abstract> 1172 String abstract_ = XMLTools.getStringValue( "Abstract", CommonNamespaces.CNTXTNS, element, null ); 1173 // <DataURL> 1174 Element elem = XMLTools.getChildElement( "DataURL", CommonNamespaces.CNTXTNS, element ); 1175 BaseURL dataURL = createBaseURL( elem ); 1176 // <MetaDataURL> 1177 elem = XMLTools.getChildElement( "MetadataURL", CommonNamespaces.CNTXTNS, element ); 1178 BaseURL metadataURL = createBaseURL( elem ); 1179 // <SRS> 1180 tmp = XMLTools.getStringValue( "SRS", CommonNamespaces.CNTXTNS, element, null ); 1181 String[] srs = StringTools.toArray( tmp, ",; ", true ); 1182 // <FormatList> 1183 elem = XMLTools.getChildElement( "FormatList", CommonNamespaces.CNTXTNS, element ); 1184 FormatList formatList = createFormatList( elem ); 1185 // <Extension> 1186 Element extElem = XMLTools.getChildElement( "Extension", CommonNamespaces.CNTXTNS, element ); 1187 LayerExtension extension = createLayerExtension( extElem, user, sessionID ); 1188 // <Server> 1189 elem = XMLTools.getRequiredChildElement( "Server", CommonNamespaces.CNTXTNS, element ); 1190 Server server = createServer( elem, user, sessionID, extension.getAuthentication() ); 1191 1192 // try setting metadataURl again. this time from server. 1193 if ( metadataURL == null ) { 1194 metadataURL = createMetadataURL( name, server ); 1195 } 1196 1197 // TODO must be removed, if reading capabilities from remote WMS is too slow 1198 setScaleHint( extElem, name, extension, server, user, sessionID, extension.getAuthentication() ); 1199 1200 // <StyleList> 1201 elem = XMLTools.getChildElement( "StyleList", CommonNamespaces.CNTXTNS, element ); 1202 StyleList styleList = createStyleList( elem, name, server ); 1203 1204 Layer layer = null; 1205 try { 1206 layer = new Layer( server, name, title, abstract_, srs, dataURL, metadataURL, formatList, styleList, 1207 queryable, hidden, extension ); 1208 } catch ( Exception e ) { 1209 throw new XMLParsingException( "couldn't create map context layer", e ); 1210 } 1211 1212 return layer; 1213 } 1214 1215 /** 1216 * @param layerName 1217 * the layer name from which to take the MetadataURL information 1218 * @param server 1219 * the WMS server from which to read the layer information (WMS capabilities document) 1220 * @return only the first MetadataURL from the WMS capabilities for the given layer 1221 * @throws XMLParsingException 1222 */ 1223 private static BaseURL createMetadataURL( String layerName, Server server ) 1224 throws XMLParsingException { 1225 1226 WMSCapabilities capa = (WMSCapabilities) server.getCapabilities(); 1227 BaseURL metaURL = null; 1228 1229 if ( capa != null ) { 1230 org.deegree.ogcwebservices.wms.capabilities.Layer layer = capa.getLayer( layerName ); 1231 if ( layer != null ) { 1232 MetadataURL[] urls = layer.getMetadataURL(); 1233 if ( urls != null && urls.length > 0 ) { 1234 metaURL = urls[0]; 1235 } 1236 } else { 1237 if ( LOG.getLevel() == ILogger.LOG_DEBUG ) { 1238 String msg = StringTools.concat( 500, "LayerName '", layerName, 1239 "' does not exist in the WMSCapabilities of server ", 1240 server.getOnlineResource() ); 1241 LOG.logDebug( msg ); 1242 } 1243 } 1244 } 1245 return metaURL; 1246 } 1247 1248 /** 1249 * creates an instance of a class encapsulating informations about the server (service) a layer based on 1250 * 1251 * @param element 1252 * <Server> 1253 * @param user 1254 * @param sessionID 1255 * @param useAuthentication 1256 * 1257 * @return instance of <tt>Server</tt> 1258 * 1259 * @throws XMLParsingException 1260 */ 1261 private static Server createServer( Element element, User user, String sessionID, int useAuthentication ) 1262 throws XMLParsingException { 1263 1264 String service = XMLTools.getRequiredAttrValue( "service", null, element ); 1265 String version = XMLTools.getRequiredAttrValue( "version", null, element ); 1266 String title = XMLTools.getRequiredAttrValue( "title", null, element ); 1267 // <OnlineResource> 1268 Element elem = XMLTools.getRequiredChildElement( "OnlineResource", CommonNamespaces.CNTXTNS, element ); 1269 URL onlineResource = createOnlineResource( elem ); 1270 1271 OGCCapabilities capabilities = getCapabilities( onlineResource, service, version, user, sessionID, 1272 useAuthentication ); 1273 1274 Server server = null; 1275 try { 1276 server = new Server( title, version, service, onlineResource, capabilities ); 1277 } catch ( Exception e ) { 1278 LOG.logError( e.getMessage(), e ); 1279 throw new XMLParsingException( "could not create context server", e ); 1280 } 1281 1282 return server; 1283 } 1284 1285 /** 1286 * creates an instance of a class encapsulating a list of image formats a layer offers 1287 * 1288 * @param element 1289 * <FormatList> 1290 * 1291 * @return instance of <tt>FormatList</tt> 1292 * 1293 * @throws XMLParsingException 1294 */ 1295 private static FormatList createFormatList( Element element ) 1296 throws XMLParsingException { 1297 1298 ElementList el = XMLTools.getChildElements( "Format", CommonNamespaces.CNTXTNS, element ); 1299 Format[] formats = new Format[el.getLength()]; 1300 for ( int i = 0; i < formats.length; i++ ) { 1301 String name = XMLTools.getStringValue( el.item( i ) ); 1302 String tmp = XMLTools.getAttrValue( el.item( i ), null, "current", null ); 1303 boolean current = "1".equals( tmp ) || "true".equals( tmp ) || formats.length == 1; 1304 try { 1305 formats[i] = new Format( name, current ); 1306 } catch ( Exception e ) { 1307 throw new XMLParsingException( "could not create context format", e ); 1308 } 1309 } 1310 1311 FormatList formatList = null; 1312 try { 1313 formatList = new FormatList( formats ); 1314 } catch ( Exception e ) { 1315 LOG.logDebug( e.getMessage(), e ); 1316 throw new XMLParsingException( "could not create context formatList", e ); 1317 } 1318 1319 return formatList; 1320 } 1321 1322 /** 1323 * creates an instance of a class encapsulating a list of styles available for a layer 1324 * 1325 * @param element 1326 * <StyleList> 1327 * @param layerName 1328 * @param server 1329 * 1330 * @return instance of <tt>StyleList</tt> 1331 * 1332 * @throws XMLParsingException 1333 */ 1334 private static StyleList createStyleList( Element element, String layerName, Server server ) 1335 throws XMLParsingException { 1336 1337 ElementList el = XMLTools.getChildElements( "Style", CommonNamespaces.CNTXTNS, element ); 1338 Style[] styles = new Style[el.getLength()]; 1339 boolean current = false; 1340 for ( int i = 0; i < styles.length; i++ ) { 1341 styles[i] = createStyle( el.item( i ), layerName, server ); 1342 if ( styles[i].isCurrent() ) { 1343 current = true; 1344 } 1345 } 1346 if ( !current ) { 1347 styles[0].setCurrent( true ); 1348 LOG.logWarning( "not style for layer: " + layerName + " has been defined as current -> first style has been marked as current" ); 1349 } 1350 StyleList styleList = null; 1351 try { 1352 styleList = new StyleList( styles ); 1353 } catch ( Exception e ) { 1354 LOG.logDebug( e.getMessage(), e ); 1355 throw new XMLParsingException( "could not create context stylelist", e ); 1356 } 1357 1358 return styleList; 1359 } 1360 1361 /** 1362 * creates an instance of a class encapsulating a description of a Style 1363 * 1364 * @param element 1365 * <Style> 1366 * 1367 * @return instance of <tt>Style</tt> 1368 * 1369 * @throws XMLParsingException 1370 */ 1371 private static Style createStyle( Element element, String layerName, Server server ) 1372 throws XMLParsingException { 1373 1374 Style style = null; 1375 1376 String tmp = XMLTools.getAttrValue( element, null, "current", null ); 1377 boolean current = "1".equals( tmp ) || "true".equals( tmp ); 1378 1379 Element elem = XMLTools.getChildElement( "SLD", CommonNamespaces.CNTXTNS, element ); 1380 if ( elem != null ) { 1381 SLD sld = createSLD( elem ); 1382 try { 1383 style = new Style( sld, current ); 1384 } catch ( Exception e ) { 1385 throw new XMLParsingException( "could not create context style", e ); 1386 } 1387 } else { 1388 String name = XMLTools.getRequiredStringValue( "Name", CommonNamespaces.CNTXTNS, element ); 1389 String title = XMLTools.getRequiredStringValue( "Title", CommonNamespaces.CNTXTNS, element ); 1390 String abstract_ = XMLTools.getStringValue( "Abstract", CommonNamespaces.CNTXTNS, element, null ); 1391 // <LegendURL> 1392 elem = XMLTools.getChildElement( "LegendURL", CommonNamespaces.CNTXTNS, element ); 1393 ImageURL legendURL = null; 1394 if ( elem != null ) { 1395 legendURL = createImageURL( elem ); 1396 } else { 1397 try { 1398 legendURL = createLegendURL( name, layerName, server ); 1399 } catch ( Exception e ) { 1400 throw new XMLParsingException( "could not create context style", e ); 1401 } 1402 } 1403 try { 1404 style = new Style( name, title, abstract_, legendURL, current ); 1405 } catch ( Exception e ) { 1406 LOG.logDebug( e.getMessage(), e ); 1407 throw new XMLParsingException( "could not create context style", e ); 1408 } 1409 } 1410 1411 return style; 1412 } 1413 1414 /** 1415 * creates a legendURL for a style/layer by evaluating the servers capabilities the layer is servered by. 1416 * 1417 * @return the image url. 1418 * @throws XMLParsingException 1419 */ 1420 private static ImageURL createLegendURL( String styleName, String layerName, Server server ) 1421 throws XMLParsingException { 1422 1423 WMSCapabilities capa = (WMSCapabilities) server.getCapabilities(); 1424 ImageURL legendURL = null; 1425 if ( capa != null ) { 1426 org.deegree.ogcwebservices.wms.capabilities.Layer layer = capa.getLayer( layerName ); 1427 // null layer will produce NullPointerException@layer.getStyles() 1428 if ( layer == null ) { 1429 LOG.logDebug( "LayerName: " + layerName + " does not exist in the WMSCapabilities" ); 1430 } 1431 // if layer is null, no legend is needed! 1432 if ( layer != null ) { 1433 org.deegree.ogcwebservices.wms.capabilities.Style[] styles = layer.getStyles(); 1434 org.deegree.ogcwebservices.wms.capabilities.Style style = null; 1435 for ( int i = 0; i < styles.length; i++ ) { 1436 // find responsible style definition 1437 style = styles[i]; 1438 if ( style.getName().equals( styleName ) ) { 1439 break; 1440 } 1441 } 1442 1443 LegendURL[] urls = null; 1444 1445 if ( style != null ) { 1446 urls = style.getLegendURL(); 1447 } 1448 1449 if ( urls != null && urls.length > 0 && urls[0] != null ) { 1450 // if style has defined LegendURL(s) take the first 1451 legendURL = new ImageURL( urls[0].getWidth(), urls[0].getHeight(), urls[0].getFormat(), 1452 urls[0].getOnlineResource() ); 1453 } else { 1454 // create a GetLegendGraphic request as style URL if the server 1455 // supports GetLegendGraphic operation 1456 OperationsMetadata om = capa.getOperationMetadata(); 1457 Operation operation = om.getOperation( new QualifiedName( "GetLegendGraphic" ) ); 1458 if ( operation != null ) { 1459 HTTP http = (HTTP) operation.getDCP().get( 0 ); 1460 URL url = http.getGetOnlineResources().get( 0 ); 1461 StringBuffer sb = new StringBuffer( 500 ); 1462 sb.append( OWSUtils.validateHTTPGetBaseURL( url.toExternalForm() ) ); 1463 GetLegendGraphic glg = GetLegendGraphic.create( "12", capa.getVersion(), layerName, styleName, 1464 null, null, 1, null, null, "image/jpeg", 20, 1465 20, null, null ); 1466 try { 1467 sb.append( glg.getRequestParameter() ); 1468 url = new URL( sb.toString() ); 1469 legendURL = new ImageURL( 20, 20, "image/jpeg", url ); 1470 } catch ( Exception shouldNeverHappen ) { 1471 shouldNeverHappen.printStackTrace(); 1472 } 1473 } 1474 } 1475 } 1476 } 1477 1478 return legendURL; 1479 } 1480 1481 /** 1482 * creates an instance of a class encapsulating a description of a Style based on a SLD 1483 * 1484 * @param element 1485 * <SLD> 1486 * 1487 * @return instance of <tt>SLD</tt> 1488 * 1489 * @throws XMLParsingException 1490 */ 1491 private static SLD createSLD( Element element ) 1492 throws XMLParsingException { 1493 1494 SLD sld = null; 1495 1496 String name = XMLTools.getRequiredStringValue( "Name", CommonNamespaces.CNTXTNS, element ); 1497 String title = XMLTools.getStringValue( "Title", CommonNamespaces.CNTXTNS, element, null ); 1498 1499 Element elem = XMLTools.getChildElement( "OnlineResource", CommonNamespaces.CNTXTNS, element ); 1500 try { 1501 if ( elem != null ) { 1502 URL onlineResource = createOnlineResource( elem ); 1503 sld = new SLD( name, title, onlineResource ); 1504 } else { 1505 elem = XMLTools.getChildElement( "StyledLayerDescriptor", CommonNamespaces.SLDNS, element ); 1506 if ( elem != null ) { 1507 XMLFragment xml = new XMLFragment(); 1508 xml.setRootElement( elem ); 1509 StyledLayerDescriptor styledLayerDescriptor = SLDFactory.createSLD( xml ); 1510 sld = new SLD( name, title, styledLayerDescriptor ); 1511 } else { 1512 FeatureTypeStyle fts = SLDFactory.createFeatureTypeStyle( elem ); 1513 sld = new SLD( name, title, fts ); 1514 } 1515 } 1516 } catch ( Exception e ) { 1517 LOG.logDebug( e.getMessage(), e ); 1518 throw new XMLParsingException( "couldn't create map context SLD", e ); 1519 } 1520 1521 return sld; 1522 } 1523 1524 /** 1525 * creates an instance of a class encapsulating the deegree specific extensions of a Layer. 1526 * 1527 * Extensions are: DataService, MasterLayer, SelectedForQuery, parentNodeId, showLegendGraphic, identifier, 1528 * ScaleHint. 1529 * 1530 * @param element 1531 * Extension 1532 * @param user 1533 * @param sessionID 1534 * 1535 * @return instance of <tt>LayerExtension</tt> 1536 * 1537 * @throws XMLParsingException 1538 */ 1539 private static LayerExtension createLayerExtension( Element element, User user, String sessionID ) 1540 throws XMLParsingException { 1541 1542 LayerExtension le = null; 1543 if ( element != null ) { 1544 1545 String tmp = XMLTools.getNodeAsString( element, "./dgcntxt:UseAuthentication/text()", 1546 CommonNamespaces.getNamespaceContext(), "NONE" ); 1547 int ua = LayerExtension.NONE; 1548 if ( "sessionID".equalsIgnoreCase( tmp ) ) { 1549 ua = LayerExtension.SESSIONID; 1550 } else if ( "user/password".equalsIgnoreCase( tmp ) ) { 1551 ua = LayerExtension.USERPASSWORD; 1552 } 1553 1554 // standard edition: download WFS data 1555 DataService dataService = null; 1556 Element elem = XMLTools.getChildElement( "DataService", CommonNamespaces.DGCNTXTNS, element ); 1557 if ( elem != null ) { 1558 Element el = XMLTools.getRequiredChildElement( "Server", CommonNamespaces.CNTXTNS, elem ); 1559 Server server = createServer( el, user, sessionID, ua ); 1560 String geoType = XMLTools.getStringValue( "GeometryType", CommonNamespaces.DGCNTXTNS, elem, null ); 1561 String featureType = XMLTools.getStringValue( "FeatureType", CommonNamespaces.DGCNTXTNS, elem, null ); 1562 dataService = new DataService( server, featureType, geoType ); 1563 } 1564 1565 // project specific 1566 boolean masterLayer = false; 1567 elem = XMLTools.getChildElement( "MasterLayer", CommonNamespaces.DGCNTXTNS, element ); 1568 if ( elem != null ) { 1569 String s = XMLTools.getStringValue( elem ); 1570 masterLayer = "true".equals( s ) || "1".equals( s ); 1571 } 1572 1573 // project specific 1574 boolean selectedForFI = false; 1575 elem = XMLTools.getChildElement( "SelectedForQuery", CommonNamespaces.DGCNTXTNS, element ); 1576 if ( elem != null ) { 1577 String s = XMLTools.getStringValue( elem ); 1578 selectedForFI = "true".equals( s ) || "1".equals( s ); 1579 } 1580 1581 // portlet edition: LayerTree 1582 int parentNodeId = 1; 1583 elem = XMLTools.getChildElement( "parentNodeId", CommonNamespaces.DGCNTXTNS, element ); 1584 if ( elem != null ) { 1585 parentNodeId = Integer.parseInt( XMLTools.getStringValue( elem ) ); 1586 } 1587 1588 // 1589 boolean showLegendGraphic = false; 1590 elem = XMLTools.getChildElement( "showLegendGraphic", CommonNamespaces.DGCNTXTNS, element ); 1591 if ( elem != null ) { 1592 String s = XMLTools.getStringValue( elem ); 1593 showLegendGraphic = "true".equals( s ) || "1".equals( s ); 1594 } 1595 1596 // standard edition: LayerTree 1597 String identifier = null; 1598 elem = XMLTools.getChildElement( "identifier", CommonNamespaces.DGCNTXTNS, element ); 1599 if ( elem != null ) { 1600 identifier = XMLTools.getStringValue( elem ); 1601 } 1602 1603 // standard edition: ScaleHint 1604 String scaleHint = null; 1605 elem = XMLTools.getChildElement( "ScaleHint", CommonNamespaces.DGCNTXTNS, element ); 1606 double minScale = 0; 1607 double maxScale = Double.MAX_VALUE; 1608 if ( elem != null ) { 1609 minScale = Double.valueOf( XMLTools.getRequiredAttrValue( "min", null, elem ) ); 1610 maxScale = Double.valueOf( XMLTools.getRequiredAttrValue( "max", null, elem ) ); 1611 } 1612 1613 le = new LayerExtension( dataService, masterLayer, minScale, maxScale, selectedForFI, ua, parentNodeId, 1614 showLegendGraphic, identifier ); 1615 1616 } else { 1617 le = new LayerExtension(); 1618 } 1619 1620 return le; 1621 } 1622 1623 /** 1624 * Use information form extension and server elements of a layer to set a scaleHint. 1625 * 1626 * If layer extension contains scale hints (min, max), then these values are used. Otherwise, the information is 1627 * taken from the WMS capabilities by using {@link #getScaleHintFromCapabilities(Server, String, User, String, int)} 1628 * 1629 * @param extElem 1630 * @param name 1631 * @param extension 1632 * @param server 1633 * @param user 1634 * @param sessionID 1635 * @param useAuthentication 1636 * @throws XMLParsingException 1637 */ 1638 private static void setScaleHint( Element extElem, String name, LayerExtension extension, Server server, User user, 1639 String sessionID, int useAuthentication ) 1640 throws XMLParsingException { 1641 1642 // <deegree:ScaleHint min="0.0" max="41.0"/> 1643 Element elem = null; 1644 if ( extElem != null ) { 1645 elem = XMLTools.getChildElement( "ScaleHint", CommonNamespaces.DGCNTXTNS, extElem ); 1646 } 1647 1648 if ( elem == null ) { 1649 // reade scaleHint from WMS Capabilities 1650 double[] sc = getScaleHintFromCapabilities( server, name, user, sessionID, useAuthentication ); 1651 extension.setMinScaleHint( sc[0] ); 1652 extension.setMaxScaleHint( sc[1] ); 1653 } else { 1654 // do nothing. Values have already been read from layer extension when creating the LayerExtension object. 1655 } 1656 } 1657 1658 /** 1659 * taken from d1 and adjusted for d2. 1660 * 1661 * TODO: check if inconsistencies arise regarding user-dependant scaleHint, because of using {@link #wmsCache}. 1662 * 1663 * @param server 1664 * @param layerName 1665 * @param user 1666 * @param sessionID 1667 * @param useAuthentication 1668 * @return 1669 */ 1670 private static double[] getScaleHintFromCapabilities( Server server, String layerName, User user, String sessionID, 1671 int useAuthentication ) { 1672 1673 double[] sc = new double[] { 0, Double.MAX_VALUE }; 1674 WMSCapabilities capa = null; 1675 1676 // capabilities have not been stored in cache before. getting the capabilities for the specified user 1677 if ( wmsCache.get( server.getOnlineResource() ) == null ) { 1678 capa = (WMSCapabilities) getCapabilities( server.getOnlineResource(), server.getService(), 1679 server.getVersion(), user, sessionID, useAuthentication ); 1680 } else { 1681 // get capabilities from cache. 1682 // May cause an inconsistency problem, if cache contains capabilities of a different but the specified user. 1683 // Could be handled with different caches for different users, but this would cause performance problems. 1684 capa = (WMSCapabilities) wmsCache.get( server.getOnlineResource() ); 1685 } 1686 if ( capa != null ) { 1687 wmsCache.put( server.getOnlineResource(), capa ); 1688 org.deegree.ogcwebservices.wms.capabilities.Layer lay = capa.getLayer( layerName ); 1689 if ( lay != null ) { 1690 try { 1691 sc[0] = lay.getScaleHint().getMin(); 1692 sc[1] = lay.getScaleHint().getMax(); 1693 } catch ( Exception e ) { 1694 } 1695 } 1696 } 1697 return sc; 1698 } 1699 1700 /** 1701 * returns the capabilities for the passed server. The capabilities are read directly from the server or from the 1702 * loacal cache. 1703 * 1704 * @param url 1705 * @param service 1706 * @param version 1707 * @param user 1708 * @param sessionID 1709 * @param useAuthentication 1710 * @return he capabilities for the passed server. The capabilities are read directly from the server or from the 1711 * loacal cache. 1712 */ 1713 private static OGCCapabilities getCapabilities( URL url, String service, String version, User user, 1714 String sessionID, int useAuthentication ) { 1715 1716 OGCCapabilities capa = null; 1717 1718 String href = OWSUtils.validateHTTPGetBaseURL( url.toExternalForm() ); 1719 if ( href.toLowerCase().startsWith( "http://" ) || href.toLowerCase().startsWith( "https://" ) ) { 1720 if ( "OGC:WMS".equals( service ) ) { 1721 // is a HTTP URL so GetCapabilities request must be constructed 1722 if ( "1.0.0".equals( version ) ) { 1723 href = StringTools.concat( 1000, href, "request=capabilities&service=WMS", "&WMTVER=", version ); 1724 } else { 1725 href = StringTools.concat( 1000, href, "request=GetCapabilities&service=WMS", "&version=", version ); 1726 } 1727 1728 } else if ( "OGC:WFS".equals( service ) ) { 1729 // is a HTTP URL so GetCapabilities request must be constructed 1730 href = StringTools.concat( 1000, href, "request=GetCapabilities&service=WFS", "&version=", version ); 1731 1732 } else if ( "OGC:WCS".equals( service ) ) { 1733 // is a HTTP URL so GetCapabilities request must be constructed 1734 href = StringTools.concat( 1000, href, "request=GetCapabilities&service=WCS", "&version=", version ); 1735 1736 } 1737 1738 if ( useAuthentication == LayerExtension.SESSIONID ) { 1739 href = StringTools.concat( 1000, href, "&sessionID=", sessionID ); 1740 } else if ( useAuthentication == LayerExtension.USERPASSWORD ) { 1741 href = StringTools.concat( 1000, href, "&user=", user.getName(), "&password=", user.getPassword() ); 1742 } 1743 } 1744 1745 if ( wmsCache.get( url ) == null && "OGC:WMS".equals( service ) ) { 1746 LOG.logDebug( "get " + service + " capabilities from GetCapabilities request" ); 1747 capa = parseCapabilities( href, service ); 1748 if ( capa != null ) { 1749 // write capabilities into local cache 1750 wmsCache.put( url, (WMSCapabilities) capa ); 1751 } 1752 } else if ( "OGC:WMS".equals( service ) ) { 1753 LOG.logDebug( "get WMS capabilities from cache" ); 1754 capa = wmsCache.get( url ); 1755 } else if ( wfsCache.get( url ) == null && "OGC:WFS".equals( service ) ) { 1756 LOG.logDebug( "get " + service + " capabilities from GetCapabilities request" ); 1757 capa = parseCapabilities( href, service ); 1758 if ( capa != null ) { 1759 // write capabilities into local cache 1760 wfsCache.put( url, (WFSCapabilities) capa ); 1761 } 1762 } else if ( "OGC:WFS".equals( service ) ) { 1763 LOG.logDebug( "get WFS capabilities from cache" ); 1764 capa = wfsCache.get( url ); 1765 } else if ( wcsCache.get( url ) == null && "OGC:WCS".equals( service ) ) { 1766 LOG.logDebug( "get " + service + " capabilities from GetCapabilities request" ); 1767 capa = parseCapabilities( href, service ); 1768 if ( capa != null ) { 1769 // write capabilities into local cache 1770 wcsCache.put( url, (WCSCapabilities) capa ); 1771 } 1772 } else if ( "OGC:WFS".equals( service ) ) { 1773 LOG.logDebug( "get WCS capabilities from cache" ); 1774 capa = wcsCache.get( url ); 1775 } 1776 1777 return capa; 1778 } 1779 1780 /** 1781 * 1782 * @param href 1783 * @param service 1784 * @return the capabilities bean. 1785 */ 1786 private static OGCCapabilities parseCapabilities( String href, String service ) { 1787 1788 OGCCapabilities capa = null; 1789 try { 1790 URL url = null; 1791 Reader reader = null; 1792 1793 // consider that the reference to the capabilities may has been 1794 // made by a file URL to a local copy 1795 if ( href.toLowerCase().startsWith( "http://" ) || href.toLowerCase().startsWith( "https://" ) ) { 1796 HttpClient httpclient = new HttpClient(); 1797 httpclient = WebUtils.enableProxyUsage( httpclient, new URL( href ) ); 1798 int timeout = Integer.parseInt( Messages.getString( "WebMapContextFactory.timeout" ) ); 1799 httpclient.getHttpConnectionManager().getParams().setSoTimeout( timeout ); 1800 1801 GetMethod httpget = new GetMethod( href ); 1802 LOG.logDebug( "GetCapabilities: ", href ); 1803 1804 httpclient.executeMethod( httpget ); 1805 reader = new InputStreamReader( httpget.getResponseBodyAsStream() ); 1806 } else { 1807 if ( href.endsWith( "?" ) ) { 1808 url = new URL( href.substring( 0, href.length() - 1 ) ); 1809 } 1810 reader = new InputStreamReader( url.openStream() ); 1811 } 1812 1813 OGCCapabilitiesDocument doc = null; 1814 if ( "OGC:WMS".equals( service ) ) { 1815 doc = new WMSCapabilitiesDocument(); 1816 doc.load( reader, XMLFragment.DEFAULT_URL ); 1817 doc = WMSCapabilitiesDocumentFactory.getWMSCapabilitiesDocument( doc.getRootElement() ); 1818 } else if ( "OGC:WFS".equals( service ) ) { 1819 doc = new WFSCapabilitiesDocument(); 1820 doc.load( reader, XMLFragment.DEFAULT_URL ); 1821 } else if ( "OGC:WCS".equals( service ) ) { 1822 doc = new WCSCapabilitiesDocument(); 1823 doc.load( reader, XMLFragment.DEFAULT_URL ); 1824 } else { 1825 throw new XMLParsingException( "not supported service type: " + service ); 1826 } 1827 1828 capa = doc.parseCapabilities(); 1829 } catch ( Exception e ) { 1830 LOG.logWarning( "could not read capabilities: " + href ); 1831 // LOG.logError( e.getMessage(), e ); 1832 return null; 1833 } 1834 return capa; 1835 } 1836 1837 // /** 1838 // * @param mapServer 1839 // * @param layer 1840 // * @return ScaleHint 1841 // */ 1842 // private static double[] getScaleHintFromCapabilities( Server mapServer, String layer ) { 1843 // 1844 // double[] sc = new double[] { 0, 9999999 }; 1845 // WMSCapabilities capa = (WMSCapabilities) mapServer.getCapabilities(); 1846 // if ( capa != null ) { 1847 // org.deegree.ogcwebservices.wms.capabilities.Layer lay = capa.getLayer( layer ); 1848 // if ( lay != null ) { 1849 // sc[0] = lay.getScaleHint().getMin(); 1850 // sc[1] = lay.getScaleHint().getMax(); 1851 // } 1852 // } 1853 // return sc; 1854 // } 1855 1856 /** 1857 * creates a list (String[]) containing the name of the JavaScript files used by the moudle 1858 * 1859 * @param element 1860 * <Module> 1861 * 1862 * @return instance of <tt>String[]</tt> 1863 * 1864 */ 1865 private static String[] createModuleJSList( Element element ) { 1866 String[] moduleJS = null; 1867 if ( element != null ) { 1868 ElementList el = XMLTools.getChildElements( "ModuleJS", CommonNamespaces.DGCNTXTNS, element ); 1869 moduleJS = new String[el.getLength()]; 1870 for ( int i = 0; i < el.getLength(); i++ ) { 1871 moduleJS[i] = ( (Text) el.item( i ).getFirstChild() ).getData(); 1872 } 1873 } 1874 1875 return moduleJS; 1876 } 1877 }