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