001 //$$HeadURL: svn+ssh://rbezema@svn.wald.intevation.org/deegree/base/branches/2.2_testing/src/org/deegree/ogcwebservices/wpvs/configuration/LocalWFSDataSource.java $$
002 /*---------------- FILE HEADER ------------------------------------------
003
004 This file is part of deegree.
005 Copyright (C) 2001-2008 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: apoth $
073 *
074 * $Revision: 9345 $, $Date: 2007-12-27 17:22:25 +0100 (Do, 27 Dez 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 int maxFeatures;
083
084 private static Map<URL, WFSConfiguration> cache = new ConcurrentHashMap<URL, WFSConfiguration>();
085
086 /**
087 * Creates a new <code>LocalWFSDataSource</code> object from the given parameters.
088 *
089 * @param name
090 * @param owsCapabilities
091 * @param validArea
092 * @param minScaleDenominator
093 * @param maxScaleDenominator
094 * @param geomProperty
095 * @param filterCondition
096 * a wfs query //TODO give an example //*
097 * @param maxFeatures to query this datasource for.
098 */
099 public LocalWFSDataSource( QualifiedName name, OWSCapabilities owsCapabilities,
100 Surface validArea, double minScaleDenominator,
101 double maxScaleDenominator, PropertyPath geomProperty,
102 Filter filterCondition/* , FeatureCollectionAdapter adapter */, int maxFeatures) {
103
104 super( LOCAL_WFS, name, owsCapabilities, validArea, minScaleDenominator,
105 maxScaleDenominator, filterCondition );
106 this.geometryProperty = geomProperty;
107 this.maxFeatures = maxFeatures;
108 // this.fcAdapter = adapter;
109 }
110
111 @Override
112 public String toString() {
113 return super.toString() +"\n\t" + geometryProperty.getAsString();
114 }
115
116 /**
117 * @return the Filter of the filterCondition.
118 */
119 public Filter getFilter() {
120 return (Filter) getFilterCondition();
121 }
122
123 /**
124 * @return the geometryProperty.
125 */
126 public PropertyPath getGeometryProperty() {
127 return geometryProperty;
128 }
129
130 @Override
131 public OGCWebService getOGCWebService()
132 throws OGCWebServiceException {
133 WFSConfiguration wfsConfig = null;
134 synchronized ( this ) {
135
136 URL url = getOwsCapabilities().getOnlineResource();
137 wfsConfig = cache.get( url );
138 if ( !cache.containsKey( url ) || wfsConfig == null ) {
139 WFSConfigurationDocument wfsDoc = new WFSConfigurationDocument();
140 try {
141 wfsDoc.load( getOwsCapabilities().getOnlineResource() );
142 wfsConfig = wfsDoc.getConfiguration();
143 cache.put( url, wfsConfig );
144 } catch ( IOException e ) {
145 throw new OGCWebServiceException(
146 Messages.getMessage(
147 "WPVS_DATASOURCE_CAP_ERROR",
148 toString() )
149 + e.getMessage() );
150 } catch ( SAXException e ) {
151 throw new OGCWebServiceException(
152 Messages.getMessage(
153 "WPVS_DATASOURCE_CAP_ERROR",
154 toString() )
155 + e.getMessage() );
156 } catch ( InvalidConfigurationException e ) {
157 throw new OGCWebServiceException(
158 Messages.getMessage(
159 "WPVS_DATASOURCE_CAP_ERROR",
160 toString() )
161 + e.getMessage() );
162 }
163
164 }
165 }
166 return WFServiceFactory.createInstance( wfsConfig );
167 }
168
169 // /**
170 // * @return the configured FeatureCollectionAdapter.
171 // */
172 // public FeatureCollectionAdapter getFeatureCollectionAdapter() {
173 // return fcAdapter;
174 // }
175
176 /**
177 * ---DO NOT REMOVE --- NOT FUNCTIONAL YET, BUT might be if the WFS uses the new OWSCommon
178 * Package.
179 *
180 * Retrieves (if it exists) the first value of the requestedParameterName of the Operation
181 * defined by it's name. For example one wants to get GetFeature#outputFormat
182 *
183 * @param operationName
184 * the name of the configured Operation
185 * @param requestedParameterName
186 * the name of the Parameter.
187 * @return <code>null</code> - in the future: the Value of the (first) parameter if it exists else
188 * <code>null</code>.
189 */
190 @SuppressWarnings("unused")
191 public String retrieveConfiguredValueForOperationOfNewOWSCommon( String operationName,
192 String requestedParameterName ) {
193 String result = null;
194 /*
195 * if( operationName == null || requestedParameterName == null )return null; OGCCapabilities
196 * ogcCap = getOGCWebService().getCapabilities(); List<Operation> operations =
197 * ((org.deegree.owscommon_new.OWSCommonCapabilities)ogcCap).getOperationsMetadata().getOperations();
198 *
199 * for( Operation operation : operations ){ if( operationName.equalsIgnoreCase(
200 * operation.getName().getLocalName() ) ){ QualifiedName outputFormatName = new
201 * QualifiedName( operation.getName().getPrefix(), requestedParameterName,
202 * operation.getName().getNamespace() ); Parameter para = operation.getParameter(
203 * outputFormatName ); if( para != null ){ if( para instanceof DomainType ){ List<TypedLiteral>
204 * values = ((DomainType)para).getValues(); if( values.size() > 0 ){ outputFormat =
205 * values.get(0).getValue(); } else { outputFormat =
206 * ((DomainType)para).getDefaultValue().getValue(); } } } } }
207 */
208 return result;
209
210 }
211
212 /**
213 * Retrieves (if it exists) the first value of the requestedParameterName of the Operation
214 * defined by it's name. For example one wants to get GetFeature#outputFormat
215 *
216 * @param operationName
217 * the name of the configured Operation
218 * @param requestedParameterName
219 * the name of the Parameter.
220 * @return the Value of the (first) parameter if it exists else <code>null</code>.
221 */
222 public String retrieveConfiguredValueForOperation( String operationName,
223 String requestedParameterName ) {
224 if ( operationName == null || requestedParameterName == null )
225 return null;
226 WFSConfiguration wfsConfig = null;
227 synchronized ( this ) {
228 URL url = getOwsCapabilities().getOnlineResource();
229 wfsConfig = cache.get( url );
230 if ( !cache.containsKey( url ) || wfsConfig == null ) {
231 WFSConfigurationDocument wfsDoc = new WFSConfigurationDocument();
232 try {
233 wfsDoc.load( getOwsCapabilities().getOnlineResource() );
234 wfsConfig = wfsDoc.getConfiguration();
235 cache.put( url, wfsConfig );
236 } catch ( IOException e ) {
237 LOG.logError(
238 Messages.getMessage(
239 "WPVS_DATASOURCE_CAP_ERROR",
240 toString() )
241 + e.getMessage() );
242 return null;
243 } catch ( SAXException e ) {
244 LOG.logError(
245 Messages.getMessage(
246 "WPVS_DATASOURCE_CAP_ERROR",
247 toString() )
248 + e.getMessage() );
249 return null;
250 } catch ( InvalidConfigurationException e ) {
251 LOG.logError(
252 Messages.getMessage(
253 "WPVS_DATASOURCE_CAP_ERROR",
254 toString() )
255 + e.getMessage() );
256 return null;
257 }
258
259 }
260 }
261
262 OWSDomainType[] operations = ( (org.deegree.owscommon.OWSCommonCapabilities) wfsConfig ).getOperationsMetadata().getParameter();
263 for ( OWSDomainType operation : operations ) {
264 if ( operationName.equalsIgnoreCase( operation.getName() ) ) {
265 String[] values = operation.getValues();
266 if ( values != null && values.length > 0 ) {
267 return values[0];
268 }
269 }
270 }
271 return null;
272 }
273
274 /**
275 * returns the (first) value of the configured constraint (given by it's name) for this
276 * WFSDataSource.
277 *
278 * @param constraintName
279 * the name of the constraint.
280 * @return the value of the Constraint or <code>null</code> if no such constraint could be found.
281 */
282 public String retrieveConfiguredConstraintValue( String constraintName ) {
283 if ( constraintName == null )
284 return null;
285 WFSConfiguration wfsConfig = null;
286 synchronized ( this ) {
287 URL url = getOwsCapabilities().getOnlineResource();
288 wfsConfig = cache.get( url );
289 if ( !cache.containsKey( url ) || wfsConfig == null ) {
290 WFSConfigurationDocument wfsDoc = new WFSConfigurationDocument();
291 try {
292 wfsDoc.load( getOwsCapabilities().getOnlineResource() );
293 wfsConfig = wfsDoc.getConfiguration();
294 cache.put( url, wfsConfig );
295 } catch ( IOException e ) {
296 LOG.logError(
297 Messages.getMessage(
298 "WPVS_DATASOURCE_CAP_ERROR",
299 toString() )
300 + e.getMessage() );
301 return null;
302 } catch ( SAXException e ) {
303 LOG.logError(
304 Messages.getMessage(
305 "WPVS_DATASOURCE_CAP_ERROR",
306 toString() )
307 + e.getMessage() );
308 return null;
309 } catch ( InvalidConfigurationException e ) {
310 LOG.logError(
311 Messages.getMessage(
312 "WPVS_DATASOURCE_CAP_ERROR",
313 toString() )
314 + e.getMessage() );
315 return null;
316 }
317
318 }
319 }
320
321 OWSDomainType[] constraints = ( (org.deegree.owscommon.OWSCommonCapabilities) wfsConfig ).getOperationsMetadata().getConstraints();
322 for ( OWSDomainType constraint : constraints ) {
323 if ( constraintName.equalsIgnoreCase( constraint.getName() ) ) {
324 String[] values = constraint.getValues();
325 if ( values != null && values.length > 0 ) {
326 return values[0];
327 }
328 }
329 }
330 return null;
331 }
332
333 /**
334 * @return the configured MaxFeatures.
335 */
336 public final int getMaxFeatures() {
337 return maxFeatures;
338 }
339 }