001 //$Header: /raid/cvs-repos/cvsroot/lgv_3g/src/de/latlon/lgv3d/WPVSClientConfig.java,v 1.1 2007/03/09 10:40:46 ap Exp $ 002 /*---------------- FILE HEADER ------------------------------------------ 003 This file is part of deegree. 004 Copyright (C) 2001-2008 by: 005 Department of Geography, University of Bonn 006 http://www.giub.uni-bonn.de/deegree/ 007 lat/lon GmbH 008 http://www.lat-lon.de 009 010 This library is free software; you can redistribute it and/or 011 modify it under the terms of the GNU Lesser General Public 012 License as published by the Free Software Foundation; either 013 version 2.1 of the License, or (at your option) any later version. 014 015 This library is distributed in the hope that it will be useful, 016 but WITHOUT ANY WARRANTY; without even the implied warranty of 017 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU 018 Lesser General Public License for more details. 019 020 You should have received a copy of the GNU Lesser General Public 021 License along with this library; if not, write to the Free Software 022 Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA 023 024 Contact: 025 026 Andreas Poth 027 lat/lon GmbH 028 Aennchenstr. 19 029 53177 Bonn 030 Germany 031 E-Mail: poth@lat-lon.de 032 033 Prof. Dr. Klaus Greve 034 Department of Geography 035 University of Bonn 036 Meckenheimer Allee 166 037 53115 Bonn 038 Germany 039 E-Mail: greve@giub.uni-bonn.de 040 041 ---------------------------------------------------------------------------*/ 042 043 package org.deegree.portal.common; 044 045 import java.io.IOException; 046 import java.io.InputStream; 047 import java.net.MalformedURLException; 048 import java.net.URL; 049 import java.util.ArrayList; 050 import java.util.List; 051 import java.util.Properties; 052 053 import org.deegree.framework.log.ILogger; 054 import org.deegree.framework.log.LoggerFactory; 055 import org.deegree.model.crs.CoordinateSystem; 056 import org.deegree.ogcwebservices.OWSUtils; 057 import org.deegree.ogcwebservices.getcapabilities.InvalidCapabilitiesException; 058 import org.deegree.ogcwebservices.wpvs.capabilities.Dataset; 059 import org.deegree.ogcwebservices.wpvs.capabilities.WPVSCapabilities; 060 import org.deegree.ogcwebservices.wpvs.capabilities.WPVSCapabilitiesDocument; 061 import org.xml.sax.SAXException; 062 063 /** 064 * TODO add documentation here 065 * 066 * @author <a href="mailto:taddei@lat-lon.de">Ugo Taddei</a> 067 * @author last edited by: $Author: ap $ 068 * 069 * @version $Revision: 1.1 $, $Date: 2007/03/09 10:40:46 $ 070 */ 071 public class WPVSClientConfig { 072 073 private final String[] initialBBox; 074 075 private final String initialBBoxString; 076 077 private final String wpvsBaseURL; 078 079 private final int viewHeight; 080 081 private final int viewWidth; 082 083 private final int overViewHeight; 084 085 private final int overViewWidth; 086 087 private final String[] availableDatasets; 088 089 private final WPVSCapabilities WPVS_Capabilities; 090 091 private final String WMS_GetMap_Fragment; 092 093 private static WPVSClientConfig clientConfig; 094 095 private final Properties clientOptions; 096 097 private final String defaultCRS; 098 099 private final String propertieFile = "wpvsclient.properties"; 100 101 private final String elevationModel; 102 103 private final String serviceIdentification; 104 105 private final int distanceAboveSeaLevel; 106 107 private final int initialPitch; 108 109 private final int initialRoll; 110 111 private final int initialYaw; 112 113 private final int initialHeight; 114 115 private final int initialDistance; 116 117 private final double poi_x; 118 119 private final double poi_y; 120 121 private static ILogger LOG = LoggerFactory.getLogger( WPVSClientConfig.class ); 122 123 private WPVSClientConfig() throws SAXException, InvalidCapabilitiesException, IOException { 124 // Singleton pattern 125 clientOptions = new Properties(); 126 try { 127 InputStream clientProps = WPVSClientConfig.class.getResourceAsStream( "/" + propertieFile ); 128 if ( clientProps == null ) { 129 clientProps = WPVSClientConfig.class.getResourceAsStream( propertieFile ); 130 } 131 clientOptions.load( clientProps ); 132 } catch ( IOException e ) { 133 LOG.logError( e.getMessage(), e ); 134 } 135 136 String value = clientOptions.getProperty( "initialBBox" ); 137 if ( value == null || "".equals( value.trim() ) ) { 138 LOG.logError( "The property 'initialBBox' can not be found or has no value. Please insert it into the wpvsclient.properties." ); 139 throw new IllegalArgumentException( 140 "The property 'initialBBox' can not be found or has no value. Please insert it into the wpvsclient.properties." ); 141 } 142 143 initialBBox = value.split( "," ); 144 if ( initialBBox.length != 4 ) { 145 LOG.logError( "The property 'initialBBox' must have exactly 4 values seperated by commata (',')." ); 146 throw new IllegalArgumentException( 147 "The property 'initialBBox' must have exactly 4 values seperated by commata (',')." ); 148 149 } 150 initialBBoxString = value; 151 152 String wpvsAddress = clientOptions.getProperty( "wpvsService" ); 153 if ( wpvsAddress == null ) { 154 LOG.logError( "The property 'wpvsService' can not be found or has no value. Please insert it into the wpvsclient.properties." ); 155 throw new IllegalArgumentException( 156 "The property 'wpvsService' can not be found or has no value. Please insert it into the wpvsclient.properties." ); 157 } 158 159 wpvsBaseURL = OWSUtils.validateHTTPGetBaseURL( wpvsAddress ); 160 161 URL wpvsAddressURL = null; 162 try { 163 wpvsAddressURL = new URL( wpvsAddress + "request=GetCapabilities&service=WPVS" ); 164 } catch ( MalformedURLException e ) { 165 throw new IllegalArgumentException( "The value (" + wpvsAddress 166 + ") of property 'WPVS_Capabilities' is not a valid URL because: " 167 + e.getMessage() ); 168 } 169 WPVSCapabilitiesDocument capsDoc = new WPVSCapabilitiesDocument(); 170 try { 171 capsDoc.load( wpvsAddressURL ); 172 } catch ( IOException e ) { 173 LOG.logError( "Error while contacting the wpvs at location: '" + wpvsAddress 174 + "' please make sure, the server is a valid wpvs." ); 175 throw e; 176 } 177 WPVS_Capabilities = (WPVSCapabilities) capsDoc.parseCapabilities(); 178 179 String serviceID = WPVS_Capabilities.getServiceIdentification().getName(); 180 if ( serviceID == null ) { 181 serviceIdentification = "Unknown WPVS service"; 182 } else { 183 serviceIdentification = serviceID; 184 } 185 186 // find the datasets and a default crs. 187 Dataset ds = WPVS_Capabilities.getDataset(); 188 if ( ds == null ) { 189 throw new IllegalArgumentException( 190 "Found no rootdataset in the capabilitiesdocument, this may not be, please make sure, the server at location: " 191 + wpvsBaseURL + " is a valid wpvs." ); 192 } 193 List<Dataset> foundSets = new ArrayList<Dataset>(); 194 //foundSets.add( ds ); 195 findDataSets( ds, foundSets ); 196 availableDatasets = new String[foundSets.size()]; 197 String elevationModeltmp = null; 198 for ( int i = 0; i < foundSets.size(); ++i ) { 199 availableDatasets[i] = foundSets.get( i ).getName(); 200 if ( elevationModeltmp == null && foundSets.get( i ).getElevationModel() != null ) { 201 LOG.logInfo( "Using elevationModel of dataset: " + availableDatasets[i] ); 202 elevationModeltmp = foundSets.get( i ).getElevationModel().getName(); 203 } 204 205 } 206 207 if ( elevationModeltmp == null ) { 208 LOG.logInfo( "Found no elevationModel in the capabilitiesdocument, though correct it is a little awkward, please make sure, the server at location: " 209 + wpvsBaseURL + " is configured correctly." ); 210 } 211 212 elevationModel = elevationModeltmp; 213 214 value = clientOptions.getProperty( "defaultCRS" ); 215 if ( value == null || "".equals( value.trim() ) ) { 216 LOG.logInfo( "The property 'defaultCRS' can not be found or has no value. Trying to find in datasets." ); 217 CoordinateSystem[] crs = ds.getCrs(); 218 if ( crs == null || crs.length == 0 ) { 219 LOG.logInfo( "No crs's found in datasets, setting defaultCRS to EPSG:4326." ); 220 defaultCRS = "EPGS:4326"; 221 } else { 222 defaultCRS = crs[0].getFormattedString(); 223 } 224 } else { 225 defaultCRS = value.trim(); 226 } 227 228 value = clientOptions.getProperty( "WMS_GetMap_Fragment" ); 229 if ( value == null ) { 230 value = clientOptions.getProperty( "wmsDefaultLayer" ); 231 if ( value == null ) { 232 String message = "No WMS_GetMap_Fragment was defined, and no wms default Layer was defined, please specify either one (WMS_GetMap_Fragment or wmsDefaultLayer) in wpvsclient.properties no Overview image will be available"; 233 LOG.logInfo( message ); 234 WMS_GetMap_Fragment = null; 235 } else { 236 String layer = value; 237 value = clientOptions.getProperty( "wmsVersion" ); 238 if ( value == null ) { 239 LOG.logInfo( "No WMS_GetMap_Fragment was defined, and no wms version was found defined,thus assuming version 1.3.0" ); 240 value = "1.3.0"; 241 } 242 WMS_GetMap_Fragment = wpvsAddress 243 + "SERVICE=WMS&VERSION=" 244 + value 245 + "&REQUEST=GetMap&FORMAT=image/png&TRANSPARENT=true&BGCOLOR=0xFFFFFF&EXCEPTIONS=application/vnd.ogc.se_inimage&STYLES=&LAYERS=" 246 + layer + "&CRS=" + defaultCRS; 247 248 LOG.logInfo( "The property WMS_GetMap_Fragment could not be found or has no value. Using the default wpvs server adress as the base wms overview server. Request will be:\n" 249 + WMS_GetMap_Fragment ); 250 } 251 } else { 252 WMS_GetMap_Fragment = value; 253 } 254 255 value = clientOptions.getProperty( "viewHeight" ); 256 if ( value == null ) { 257 LOG.logInfo( "The property 'viewHeight' can not be found or has no value. Setting viewHeight to a value of 600." ); 258 viewHeight = 600; 259 } else { 260 viewHeight = Integer.parseInt( value ); 261 } 262 263 value = clientOptions.getProperty( "viewWidth" ); 264 if ( value == null ) { 265 LOG.logInfo( "The property 'viewWidth' can not be found or has no value. Setting viewWidth to a value of 800." ); 266 viewWidth = 800; 267 } else { 268 viewWidth = Integer.parseInt( value ); 269 } 270 271 value = clientOptions.getProperty( "overViewHeight" ); 272 if ( value == null ) { 273 LOG.logInfo( "The property 'overViewHeight' can not be found or has no value. Setting overViewHeight to a value of 150." ); 274 overViewHeight = 150; 275 } else { 276 overViewHeight = Integer.parseInt( value ); 277 } 278 279 value = clientOptions.getProperty( "overViewWidth" ); 280 if ( value == null ) { 281 LOG.logInfo( "The property 'overViewWidth' can not be found or has no value. Setting overViewWidth to a value of 150." ); 282 overViewWidth = 150; 283 } else { 284 overViewWidth = Integer.parseInt( value ); 285 } 286 287 value = clientOptions.getProperty( "distanceAboveSeaLevel" ); 288 if ( value == null ) { 289 LOG.logInfo( "The property 'distanceAboveSeaLevel' can not be found or has no value. Setting initialElevation to a value of 150." ); 290 distanceAboveSeaLevel = 0; 291 } else { 292 distanceAboveSeaLevel = Integer.parseInt( value ); 293 } 294 value = clientOptions.getProperty( "initialHeight" ); 295 if ( value == null ) { 296 LOG.logInfo( "The property 'initialHeight' can not be found or has no value. Setting initialElevation to a value of 150." ); 297 initialHeight = 150; 298 } else { 299 initialHeight = Integer.parseInt( value ); 300 } 301 302 value = clientOptions.getProperty( "poi_x" ); 303 if ( value == null ) { 304 LOG.logInfo( "The property 'poi_x' can not be found or has no value. Setting poi_x to a value of 424453." ); 305 poi_x = 424453; 306 } else { 307 poi_x = Double.parseDouble( value ); 308 } 309 310 value = clientOptions.getProperty( "poi_y" ); 311 if ( value == null ) { 312 LOG.logInfo( "The property 'poi_y' can not be found or has no value. Setting poi_y to a value of 150." ); 313 poi_y = 4512876; 314 } else { 315 poi_y = Double.parseDouble( value ); 316 } 317 318 value = clientOptions.getProperty( "initialPitch" ); 319 if ( value == null ) { 320 LOG.logInfo( "The property 'initialPitch' can not be found or has no value. Setting initialPitch to a value of 50." ); 321 initialPitch = 50; 322 } else { 323 initialPitch = Integer.parseInt( value ); 324 } 325 326 value = clientOptions.getProperty( "initialRoll" ); 327 if ( value == null ) { 328 LOG.logInfo( "The property 'initialRoll' can not be found or has no value. Setting initialRoll to a value of 0." ); 329 initialRoll = 0; 330 } else { 331 initialRoll = Integer.parseInt( value ); 332 } 333 334 value = clientOptions.getProperty( "initialYaw" ); 335 if ( value == null ) { 336 LOG.logInfo( "The property 'initialYaw' can not be found or has no value. Setting initialYaw to a value of 180." ); 337 initialYaw = 180; 338 } else { 339 initialYaw = Integer.parseInt( value ); 340 } 341 342 value = clientOptions.getProperty( "initialDistance" ); 343 if ( value == null ) { 344 LOG.logInfo( "The property 'initialDistance' can not be found or has no value. Setting initialDistance to a value of 1000." ); 345 initialDistance = 1000; 346 } else { 347 initialDistance = Integer.parseInt( value ); 348 } 349 350 } 351 352 private void findDataSets( Dataset rootSet, List<Dataset> foundSets ) { 353 if ( rootSet != null ) { 354 Dataset[] childSets = rootSet.getDatasets(); 355 for ( Dataset ds : childSets ) { 356 if ( !foundSets.contains( ds ) ) { 357 if( ds.getQueryable() ){ 358 foundSets.add( ds ); 359 } 360 findDataSets( ds, foundSets ); 361 } 362 } 363 } 364 } 365 366 /** 367 * @return a WPVSClientConfig instance following a singleton pattern. 368 * @throws SAXException 369 * if the creation of the capabilities document fails 370 * @throws IOException 371 * if the wpvs capabilities document cannot be read 372 * @throws InvalidCapabilitiesException 373 * if the wpvs capabilitiesdocument cannot be parsed. 374 */ 375 public static synchronized WPVSClientConfig getInstance() 376 throws InvalidCapabilitiesException, IOException, SAXException { 377 if ( clientConfig == null ) { 378 clientConfig = new WPVSClientConfig(); 379 } 380 return clientConfig; 381 } 382 383 /** 384 * 385 * @return initial bounding box for GetView request 386 */ 387 public final String[] getInitialBBox() { 388 return initialBBox; 389 } 390 391 /** 392 * 393 * @return WMS GetMap request fragment for overview map 394 */ 395 public final String getWmsGetMapFragment() { 396 return WMS_GetMap_Fragment; 397 } 398 399 /** 400 * 401 * @return capabilities of the WPVS 402 */ 403 public final WPVSCapabilities getWpvsCapabilities() { 404 return WPVS_Capabilities; 405 } 406 407 /** 408 * @return the overViewHeight. 409 */ 410 public final int getOverViewHeight() { 411 return overViewHeight; 412 } 413 414 /** 415 * @return the overViewWidth. 416 */ 417 public final int getOverViewWidth() { 418 return overViewWidth; 419 } 420 421 /** 422 * @return the viewHeight. 423 */ 424 public final int getViewHeight() { 425 return viewHeight; 426 } 427 428 /** 429 * @return the viewWidth. 430 */ 431 public final int getViewWidth() { 432 return viewWidth; 433 } 434 435 /** 436 * @return the wpvsBaseURL. 437 */ 438 public final String getWpvsBaseURL() { 439 return wpvsBaseURL; 440 } 441 442 /** 443 * @return the availableDatasets. 444 */ 445 public final String[] getAvailableDatasets() { 446 return availableDatasets; 447 } 448 449 /** 450 * @return the defaultCRS. 451 */ 452 public final String getDefaultCRS() { 453 return defaultCRS; 454 } 455 456 /** 457 * @return the elevationModel. 458 */ 459 public final String getElevationModel() { 460 return elevationModel; 461 } 462 463 /** 464 * @return the serviceIdentification. 465 */ 466 public final String getServiceIdentification() { 467 return serviceIdentification; 468 } 469 470 /** 471 * @return the initialElevation. 472 */ 473 public final int getDistanceAboveSeaLevel() { 474 return distanceAboveSeaLevel; 475 } 476 477 /** 478 * @return the initialBBoxString. 479 */ 480 public final String getInitialBBoxAsString() { 481 return initialBBoxString; 482 } 483 484 /** 485 * @return the initialPitch. 486 */ 487 public final int getInitialPitch() { 488 return initialPitch; 489 } 490 491 /** 492 * @return the initialDistance. 493 */ 494 public final int getInitialDistance() { 495 return initialDistance; 496 } 497 498 /** 499 * @return the initialRoll. 500 */ 501 public final int getInitialRoll() { 502 return initialRoll; 503 } 504 505 /** 506 * @return the initialYaw. 507 */ 508 public final int getInitialYaw() { 509 return initialYaw; 510 } 511 512 /** 513 * @return the initialHeight. 514 */ 515 public final int getInitialHeight() { 516 return initialHeight; 517 } 518 519 /** 520 * @return the poi_x. 521 */ 522 public final double getPOIX() { 523 return poi_x; 524 } 525 526 /** 527 * @return the poi_y. 528 */ 529 public final double getPOIY() { 530 return poi_y; 531 } 532 533 }