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-2007 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 static ILogger LOG = LoggerFactory.getLogger( WPVSClientConfig.class );
118
119 private WPVSClientConfig() throws SAXException, InvalidCapabilitiesException, IOException {
120 // Singleton pattern
121 clientOptions = new Properties();
122 try {
123 InputStream clientProps = WPVSClientConfig.class.getResourceAsStream( "/" + propertieFile );
124 if ( clientProps == null ) {
125 clientProps = WPVSClientConfig.class.getResourceAsStream( propertieFile );
126 }
127 clientOptions.load( clientProps );
128 } catch ( IOException e ) {
129 LOG.logError( e.getMessage(), e );
130 }
131
132 String value = clientOptions.getProperty( "initialBBox" );
133 if( value == null || "".equals( value.trim() ) ){
134 LOG.logError( "The property 'initialBBox' can not be found or has no value. Please insert it into the wpvsclient.properties." );
135 throw new IllegalArgumentException( "The property 'initialBBox' can not be found or has no value. Please insert it into the wpvsclient.properties." );
136 }
137
138 initialBBox = value.split( "," );
139 if( initialBBox.length != 4 ){
140 LOG.logError( "The property 'initialBBox' must have exactly 4 values seperated by commata (',')." );
141 throw new IllegalArgumentException( "The property 'initialBBox' must have exactly 4 values seperated by commata (',')." );
142
143 }
144 initialBBoxString = value;
145
146 String wpvsAddress = clientOptions.getProperty( "wpvsService" );
147 if( wpvsAddress == null ){
148 LOG.logError( "The property 'wpvsService' can not be found or has no value. Please insert it into the wpvsclient.properties." );
149 throw new IllegalArgumentException( "The property 'wpvsService' can not be found or has no value. Please insert it into the wpvsclient.properties." );
150 }
151
152 wpvsBaseURL = OWSUtils.validateHTTPGetBaseURL( wpvsAddress );
153
154 URL wpvsAddressURL = null;
155 try {
156 wpvsAddressURL = new URL( wpvsAddress + "request=GetCapabilities&service=WPVS" );
157 } catch ( MalformedURLException e ) {
158 throw new IllegalArgumentException( "The value ("+wpvsAddress + ") of property 'WPVS_Capabilities' is not a valid URL because: " + e.getMessage() );
159 }
160 WPVSCapabilitiesDocument capsDoc = new WPVSCapabilitiesDocument();
161 try {
162 capsDoc.load( wpvsAddressURL );
163 } catch ( IOException e ) {
164 LOG.logError( "Error while contacting the wpvs at location: '" + wpvsAddress + "' please make sure, the server is a valid wpvs.");
165 throw e;
166 }
167 WPVS_Capabilities = (WPVSCapabilities) capsDoc.parseCapabilities();
168
169 String serviceID = WPVS_Capabilities.getServiceIdentification().getName();
170 if( serviceID == null ){
171 serviceIdentification = "Unknown WPVS service";
172 } else {
173 serviceIdentification = serviceID;
174 }
175
176 //find the datasets and a default crs.
177 Dataset ds = WPVS_Capabilities.getDataset();
178 if( ds == null ){
179 throw new IllegalArgumentException( "Found no rootdataset in the capabilitiesdocument, this may not be, please make sure, the server at location: " + wpvsBaseURL + " is a valid wpvs." );
180 }
181 List<Dataset> foundSets = new ArrayList<Dataset>();
182 foundSets.add( ds );
183 findDataSets( ds, foundSets );
184 availableDatasets = new String[foundSets.size()];
185 String elevationModeltmp = null;
186 for( int i = 0; i < foundSets.size(); ++i ){
187 availableDatasets[i] = foundSets.get(i).getName();
188 if( elevationModeltmp==null && foundSets.get(i).getElevationModel()!= null ){
189 LOG.logInfo( "Using elevationModel of dataset: " + availableDatasets[i] );
190 elevationModeltmp = foundSets.get(i).getElevationModel().getName();
191 }
192
193 }
194
195 if( elevationModeltmp == null ){
196 LOG.logInfo( "Found no elevationModel in the capabilitiesdocument, though correct it is a little awkward, please make sure, the server at location: " + wpvsBaseURL + " is configured correctly." );
197 }
198
199 elevationModel = elevationModeltmp;
200
201 value = clientOptions.getProperty( "defaultCRS" );
202 if( value == null || "".equals( value.trim() )){
203 LOG.logInfo( "The property 'defaultCRS' can not be found or has no value. Trying to find in datasets." );
204 CoordinateSystem[] crs = ds.getCrs();
205 if( crs == null || crs.length == 0 ){
206 LOG.logInfo( "No crs's found in datasets, setting defaultCRS to EPSG:4326." );
207 defaultCRS = "EPGS:4326";
208 } else {
209 defaultCRS = crs[0].getFormattedString();
210 }
211 } else {
212 defaultCRS = value.trim();
213 }
214
215
216
217 WMS_GetMap_Fragment = clientOptions.getProperty( "WMS_GetMap_Fragment" );
218 if( WMS_GetMap_Fragment == null ){
219 LOG.logError( "The property WMS_GetMap_Fragment can not be found or has no value. Please insert it into the wpvsclient.properties." );
220 throw new IllegalArgumentException( "The property WMS_GetMap_Fragment can not be found or has no value. Please insert it into the wpvsclient.properties." );
221 }
222
223 value = clientOptions.getProperty( "viewHeight" );
224 if( value == null ){
225 LOG.logInfo( "The property 'viewHeight' can not be found or has no value. Setting viewHeight to a value of 600." );
226 viewHeight = 600;
227 } else {
228 viewHeight = Integer.parseInt( value );
229 }
230
231 value = clientOptions.getProperty( "viewWidth" );
232 if( value == null ){
233 LOG.logInfo( "The property 'viewWidth' can not be found or has no value. Setting viewWidth to a value of 800." );
234 viewWidth = 800;
235 } else {
236 viewWidth = Integer.parseInt( value );
237 }
238
239 value = clientOptions.getProperty( "overViewHeight" );
240 if( value == null ){
241 LOG.logInfo( "The property 'overViewHeight' can not be found or has no value. Setting overViewHeight to a value of 150." );
242 overViewHeight = 150;
243 } else {
244 overViewHeight = Integer.parseInt( value );
245 }
246
247 value = clientOptions.getProperty( "overViewWidth" );
248 if( value == null ){
249 LOG.logInfo( "The property 'overViewWidth' can not be found or has no value. Setting overViewWidth to a value of 150." );
250 overViewWidth = 150;
251 } else {
252 overViewWidth = Integer.parseInt( value );
253 }
254
255 value = clientOptions.getProperty( "distanceAboveSeaLevel" );
256 if( value == null ){
257 LOG.logInfo( "The property 'distanceAboveSeaLevel' can not be found or has no value. Setting initialElevation to a value of 150." );
258 distanceAboveSeaLevel = 0;
259 } else {
260 distanceAboveSeaLevel = Integer.parseInt( value );
261 }
262 value = clientOptions.getProperty( "initialHeight" );
263 if( value == null ){
264 LOG.logInfo( "The property 'initialHeight' can not be found or has no value. Setting initialElevation to a value of 150." );
265 initialHeight = 150;
266 } else {
267 initialHeight = Integer.parseInt( value );
268 }
269
270 value = clientOptions.getProperty( "initialPitch" );
271 if( value == null ){
272 LOG.logInfo( "The property 'initialPitch' can not be found or has no value. Setting initialPitch to a value of 50." );
273 initialPitch = 50;
274 } else {
275 initialPitch = Integer.parseInt( value );
276 }
277
278 value = clientOptions.getProperty( "initialRoll" );
279 if( value == null ){
280 LOG.logInfo( "The property 'initialRoll' can not be found or has no value. Setting initialRoll to a value of 0." );
281 initialRoll = 0;
282 } else {
283 initialRoll = Integer.parseInt( value );
284 }
285
286 value = clientOptions.getProperty( "initialYaw" );
287 if( value == null ){
288 LOG.logInfo( "The property 'initialYaw' can not be found or has no value. Setting initialYaw to a value of 180." );
289 initialYaw = 180;
290 } else {
291 initialYaw = Integer.parseInt( value );
292 }
293
294 value = clientOptions.getProperty( "initialDistance" );
295 if( value == null ){
296 LOG.logInfo( "The property 'initialDistance' can not be found or has no value. Setting initialDistance to a value of 1000." );
297 initialDistance = 1000;
298 } else {
299 initialDistance = Integer.parseInt( value );
300 }
301
302
303
304
305
306 }
307
308 private void findDataSets( Dataset rootSet, List<Dataset> foundSets ){
309 if( rootSet != null ){
310 Dataset[] childSets = rootSet.getDatasets();
311 for( Dataset ds : childSets ){
312 if( !foundSets.contains( ds ) ){
313 foundSets.add( ds );
314 findDataSets( ds, foundSets );
315 }
316 }
317 }
318 }
319
320 /**
321 * @return a WPVSClientConfig instance following a singleton pattern.
322 * @throws SAXException if the creation of the capabilities document fails
323 * @throws IOException if the wpvs capabilities document cannot be read
324 * @throws InvalidCapabilitiesException if the wpvs capabilitiesdocument cannot be parsed.
325 */
326 public static synchronized WPVSClientConfig getInstance() throws InvalidCapabilitiesException, IOException, SAXException {
327 if ( clientConfig == null ) {
328 clientConfig = new WPVSClientConfig();
329 }
330 return clientConfig;
331 }
332
333 /**
334 *
335 * @return initial bounding box for GetView request
336 */
337 public final String[] getInitialBBox() {
338 return initialBBox;
339 }
340
341
342 /**
343 *
344 * @return WMS GetMap request fragment for overview map
345 */
346 public final String getWmsGetMapFragment() {
347 return WMS_GetMap_Fragment;
348 }
349
350 /**
351 *
352 * @return capabilities of the WPVS
353 */
354 public final WPVSCapabilities getWpvsCapabilities() {
355 return WPVS_Capabilities;
356 }
357
358 /**
359 * @return the overViewHeight.
360 */
361 public final int getOverViewHeight() {
362 return overViewHeight;
363 }
364
365 /**
366 * @return the overViewWidth.
367 */
368 public final int getOverViewWidth() {
369 return overViewWidth;
370 }
371
372 /**
373 * @return the viewHeight.
374 */
375 public final int getViewHeight() {
376 return viewHeight;
377 }
378
379 /**
380 * @return the viewWidth.
381 */
382 public final int getViewWidth() {
383 return viewWidth;
384 }
385
386 /**
387 * @return the wpvsBaseURL.
388 */
389 public final String getWpvsBaseURL() {
390 return wpvsBaseURL;
391 }
392
393 /**
394 * @return the availableDatasets.
395 */
396 public final String[] getAvailableDatasets() {
397 return availableDatasets;
398 }
399
400 /**
401 * @return the defaultCRS.
402 */
403 public final String getDefaultCRS() {
404 return defaultCRS;
405 }
406
407 /**
408 * @return the elevationModel.
409 */
410 public final String getElevationModel() {
411 return elevationModel;
412 }
413
414 /**
415 * @return the serviceIdentification.
416 */
417 public final String getServiceIdentification() {
418 return serviceIdentification;
419 }
420
421 /**
422 * @return the initialElevation.
423 */
424 public final int getDistanceAboveSeaLevel() {
425 return distanceAboveSeaLevel;
426 }
427
428 /**
429 * @return the initialBBoxString.
430 */
431 public final String getInitialBBoxAsString() {
432 return initialBBoxString;
433 }
434
435 /**
436 * @return the initialPitch.
437 */
438 public final int getInitialPitch() {
439 return initialPitch;
440 }
441
442 /**
443 * @return the initialDistance.
444 */
445 public final int getInitialDistance() {
446 return initialDistance;
447 }
448
449 /**
450 * @return the initialRoll.
451 */
452 public final int getInitialRoll() {
453 return initialRoll;
454 }
455
456 /**
457 * @return the initialYaw.
458 */
459 public final int getInitialYaw() {
460 return initialYaw;
461 }
462
463 /**
464 * @return the initialHeight.
465 */
466 public final int getInitialHeight() {
467 return initialHeight;
468 }
469
470 }