001 //$$HeadURL: svn+ssh://jwilden@svn.wald.intevation.org/deegree/base/branches/2.5_testing/src/org/deegree/ogcwebservices/wpvs/configuration/LocalWFSDataSource.java $$ 002 /*---------------------------------------------------------------------------- 003 This file is part of deegree, http://deegree.org/ 004 Copyright (C) 2001-2009 by: 005 Department of Geography, University of Bonn 006 and 007 lat/lon GmbH 008 009 This library is free software; you can redistribute it and/or modify it under 010 the terms of the GNU Lesser General Public License as published by the Free 011 Software Foundation; either version 2.1 of the License, or (at your option) 012 any later version. 013 This library is distributed in the hope that it will be useful, but WITHOUT 014 ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS 015 FOR A PARTICULAR PURPOSE. See the GNU Lesser General Public License for more 016 details. 017 You should have received a copy of the GNU Lesser General Public License 018 along with this library; if not, write to the Free Software Foundation, Inc., 019 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA 020 021 Contact information: 022 023 lat/lon GmbH 024 Aennchenstr. 19, 53177 Bonn 025 Germany 026 http://lat-lon.de/ 027 028 Department of Geography, University of Bonn 029 Prof. Dr. Klaus Greve 030 Postfach 1147, 53001 Bonn 031 Germany 032 http://www.geographie.uni-bonn.de/deegree/ 033 034 e-mail: info@deegree.org 035 ----------------------------------------------------------------------------*/ 036 037 package org.deegree.ogcwebservices.wpvs.configuration; 038 039 import java.io.IOException; 040 import java.net.URL; 041 import java.util.Map; 042 import java.util.concurrent.ConcurrentHashMap; 043 044 import org.deegree.datatypes.QualifiedName; 045 import org.deegree.framework.log.ILogger; 046 import org.deegree.framework.log.LoggerFactory; 047 import org.deegree.framework.xml.InvalidConfigurationException; 048 import org.deegree.i18n.Messages; 049 import org.deegree.model.filterencoding.Filter; 050 import org.deegree.model.spatialschema.Surface; 051 import org.deegree.ogcbase.PropertyPath; 052 import org.deegree.ogcwebservices.OGCWebService; 053 import org.deegree.ogcwebservices.OGCWebServiceException; 054 import org.deegree.ogcwebservices.wfs.WFServiceFactory; 055 import org.deegree.ogcwebservices.wfs.configuration.WFSConfiguration; 056 import org.deegree.ogcwebservices.wfs.configuration.WFSConfigurationDocument; 057 import org.deegree.ogcwebservices.wpvs.capabilities.OWSCapabilities; 058 import org.deegree.owscommon.OWSDomainType; 059 import org.xml.sax.SAXException; 060 061 /** 062 * This class represents a local WFS dataSource object. 063 * 064 * @author <a href="mailto:taddei@lat-lon.de">Ugo Taddei</a> 065 * @author last edited by: $Author: mschneider $ 066 * 067 * $Revision: 18195 $, $Date: 2009-06-18 17:55:39 +0200 (Do, 18 Jun 2009) $ 068 */ 069 public class LocalWFSDataSource extends AbstractDataSource { 070 071 private static final ILogger LOG = LoggerFactory.getLogger( LocalWFSDataSource.class ); 072 073 private final PropertyPath geometryProperty; 074 075 private int maxFeatures; 076 077 private static Map<URL, WFSConfiguration> cache = new ConcurrentHashMap<URL, WFSConfiguration>(); 078 079 /** 080 * Creates a new <code>LocalWFSDataSource</code> object from the given parameters. 081 * 082 * @param name 083 * @param owsCapabilities 084 * @param validArea 085 * @param minScaleDenominator 086 * @param maxScaleDenominator 087 * @param geomProperty 088 * @param filterCondition 089 * a wfs query //TODO give an example //* 090 * @param maxFeatures to query this datasource for. 091 */ 092 public LocalWFSDataSource( QualifiedName name, OWSCapabilities owsCapabilities, 093 Surface validArea, double minScaleDenominator, 094 double maxScaleDenominator, PropertyPath geomProperty, 095 Filter filterCondition/* , FeatureCollectionAdapter adapter */, int maxFeatures) { 096 097 super( LOCAL_WFS, name, owsCapabilities, validArea, minScaleDenominator, 098 maxScaleDenominator, filterCondition ); 099 this.geometryProperty = geomProperty; 100 this.maxFeatures = maxFeatures; 101 // this.fcAdapter = adapter; 102 } 103 104 @Override 105 public String toString() { 106 return super.toString() +"\n\t" + geometryProperty.getAsString(); 107 } 108 109 /** 110 * @return the Filter of the filterCondition. 111 */ 112 public Filter getFilter() { 113 return (Filter) getFilterCondition(); 114 } 115 116 /** 117 * @return the geometryProperty. 118 */ 119 public PropertyPath getGeometryProperty() { 120 return geometryProperty; 121 } 122 123 @Override 124 public OGCWebService getOGCWebService() 125 throws OGCWebServiceException { 126 WFSConfiguration wfsConfig = null; 127 synchronized ( this ) { 128 129 URL url = getOwsCapabilities().getOnlineResource(); 130 wfsConfig = cache.get( url ); 131 if ( !cache.containsKey( url ) || wfsConfig == null ) { 132 WFSConfigurationDocument wfsDoc = new WFSConfigurationDocument(); 133 try { 134 wfsDoc.load( getOwsCapabilities().getOnlineResource() ); 135 wfsConfig = wfsDoc.getConfiguration(); 136 cache.put( url, wfsConfig ); 137 } catch ( IOException e ) { 138 throw new OGCWebServiceException( 139 Messages.getMessage( 140 "WPVS_DATASOURCE_CAP_ERROR", 141 toString() ) 142 + e.getMessage() ); 143 } catch ( SAXException e ) { 144 throw new OGCWebServiceException( 145 Messages.getMessage( 146 "WPVS_DATASOURCE_CAP_ERROR", 147 toString() ) 148 + e.getMessage() ); 149 } catch ( InvalidConfigurationException e ) { 150 throw new OGCWebServiceException( 151 Messages.getMessage( 152 "WPVS_DATASOURCE_CAP_ERROR", 153 toString() ) 154 + e.getMessage() ); 155 } 156 157 } 158 } 159 return WFServiceFactory.createInstance( wfsConfig ); 160 } 161 162 // /** 163 // * @return the configured FeatureCollectionAdapter. 164 // */ 165 // public FeatureCollectionAdapter getFeatureCollectionAdapter() { 166 // return fcAdapter; 167 // } 168 169 /** 170 * ---DO NOT REMOVE --- NOT FUNCTIONAL YET, BUT might be if the WFS uses the new OWSCommon 171 * Package. 172 * 173 * Retrieves (if it exists) the first value of the requestedParameterName of the Operation 174 * defined by it's name. For example one wants to get GetFeature#outputFormat 175 * 176 * @param operationName 177 * the name of the configured Operation 178 * @param requestedParameterName 179 * the name of the Parameter. 180 * @return <code>null</code> - in the future: the Value of the (first) parameter if it exists else 181 * <code>null</code>. 182 */ 183 @SuppressWarnings("unused") 184 public String retrieveConfiguredValueForOperationOfNewOWSCommon( String operationName, 185 String requestedParameterName ) { 186 String result = null; 187 /* 188 * if( operationName == null || requestedParameterName == null )return null; OGCCapabilities 189 * ogcCap = getOGCWebService().getCapabilities(); List<Operation> operations = 190 * ((org.deegree.owscommon_new.OWSCommonCapabilities)ogcCap).getOperationsMetadata().getOperations(); 191 * 192 * for( Operation operation : operations ){ if( operationName.equalsIgnoreCase( 193 * operation.getName().getLocalName() ) ){ QualifiedName outputFormatName = new 194 * QualifiedName( operation.getName().getPrefix(), requestedParameterName, 195 * operation.getName().getNamespace() ); Parameter para = operation.getParameter( 196 * outputFormatName ); if( para != null ){ if( para instanceof DomainType ){ List<TypedLiteral> 197 * values = ((DomainType)para).getValues(); if( values.size() > 0 ){ outputFormat = 198 * values.get(0).getValue(); } else { outputFormat = 199 * ((DomainType)para).getDefaultValue().getValue(); } } } } } 200 */ 201 return result; 202 203 } 204 205 /** 206 * Retrieves (if it exists) the first value of the requestedParameterName of the Operation 207 * defined by it's name. For example one wants to get GetFeature#outputFormat 208 * 209 * @param operationName 210 * the name of the configured Operation 211 * @param requestedParameterName 212 * the name of the Parameter. 213 * @return the Value of the (first) parameter if it exists else <code>null</code>. 214 */ 215 public String retrieveConfiguredValueForOperation( String operationName, 216 String requestedParameterName ) { 217 if ( operationName == null || requestedParameterName == null ) 218 return null; 219 WFSConfiguration wfsConfig = null; 220 synchronized ( this ) { 221 URL url = getOwsCapabilities().getOnlineResource(); 222 wfsConfig = cache.get( url ); 223 if ( !cache.containsKey( url ) || wfsConfig == null ) { 224 WFSConfigurationDocument wfsDoc = new WFSConfigurationDocument(); 225 try { 226 wfsDoc.load( getOwsCapabilities().getOnlineResource() ); 227 wfsConfig = wfsDoc.getConfiguration(); 228 cache.put( url, wfsConfig ); 229 } catch ( IOException e ) { 230 LOG.logError( 231 Messages.getMessage( 232 "WPVS_DATASOURCE_CAP_ERROR", 233 toString() ) 234 + e.getMessage() ); 235 return null; 236 } catch ( SAXException e ) { 237 LOG.logError( 238 Messages.getMessage( 239 "WPVS_DATASOURCE_CAP_ERROR", 240 toString() ) 241 + e.getMessage() ); 242 return null; 243 } catch ( InvalidConfigurationException e ) { 244 LOG.logError( 245 Messages.getMessage( 246 "WPVS_DATASOURCE_CAP_ERROR", 247 toString() ) 248 + e.getMessage() ); 249 return null; 250 } 251 252 } 253 } 254 255 OWSDomainType[] operations = ( (org.deegree.owscommon.OWSCommonCapabilities) wfsConfig ).getOperationsMetadata().getParameter(); 256 for ( OWSDomainType operation : operations ) { 257 if ( operationName.equalsIgnoreCase( operation.getName() ) ) { 258 String[] values = operation.getValues(); 259 if ( values != null && values.length > 0 ) { 260 return values[0]; 261 } 262 } 263 } 264 return null; 265 } 266 267 /** 268 * returns the (first) value of the configured constraint (given by it's name) for this 269 * WFSDataSource. 270 * 271 * @param constraintName 272 * the name of the constraint. 273 * @return the value of the Constraint or <code>null</code> if no such constraint could be found. 274 */ 275 public String retrieveConfiguredConstraintValue( String constraintName ) { 276 if ( constraintName == null ) 277 return null; 278 WFSConfiguration wfsConfig = null; 279 synchronized ( this ) { 280 URL url = getOwsCapabilities().getOnlineResource(); 281 wfsConfig = cache.get( url ); 282 if ( !cache.containsKey( url ) || wfsConfig == null ) { 283 WFSConfigurationDocument wfsDoc = new WFSConfigurationDocument(); 284 try { 285 wfsDoc.load( getOwsCapabilities().getOnlineResource() ); 286 wfsConfig = wfsDoc.getConfiguration(); 287 cache.put( url, wfsConfig ); 288 } catch ( IOException e ) { 289 LOG.logError( 290 Messages.getMessage( 291 "WPVS_DATASOURCE_CAP_ERROR", 292 toString() ) 293 + e.getMessage() ); 294 return null; 295 } catch ( SAXException e ) { 296 LOG.logError( 297 Messages.getMessage( 298 "WPVS_DATASOURCE_CAP_ERROR", 299 toString() ) 300 + e.getMessage() ); 301 return null; 302 } catch ( InvalidConfigurationException e ) { 303 LOG.logError( 304 Messages.getMessage( 305 "WPVS_DATASOURCE_CAP_ERROR", 306 toString() ) 307 + e.getMessage() ); 308 return null; 309 } 310 311 } 312 } 313 314 OWSDomainType[] constraints = ( (org.deegree.owscommon.OWSCommonCapabilities) wfsConfig ).getOperationsMetadata().getConstraints(); 315 for ( OWSDomainType constraint : constraints ) { 316 if ( constraintName.equalsIgnoreCase( constraint.getName() ) ) { 317 String[] values = constraint.getValues(); 318 if ( values != null && values.length > 0 ) { 319 return values[0]; 320 } 321 } 322 } 323 return null; 324 } 325 326 /** 327 * @return the configured MaxFeatures. 328 */ 329 public final int getMaxFeatures() { 330 return maxFeatures; 331 } 332 }