001 //$HeadURL: https://svn.wald.intevation.org/svn/deegree/base/branches/2.3_testing/src/org/deegree/ogcwebservices/wpvs/configuration/LocalWCSDataSource.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.awt.Color;
040 import java.io.IOException;
041 import java.net.URL;
042 import java.util.Map;
043 import java.util.concurrent.ConcurrentHashMap;
044
045 import org.deegree.datatypes.Code;
046 import org.deegree.datatypes.CodeList;
047 import org.deegree.datatypes.QualifiedName;
048 import org.deegree.framework.log.ILogger;
049 import org.deegree.framework.log.LoggerFactory;
050 import org.deegree.i18n.Messages;
051 import org.deegree.model.spatialschema.Surface;
052 import org.deegree.ogcwebservices.OGCWebService;
053 import org.deegree.ogcwebservices.OGCWebServiceException;
054 import org.deegree.ogcwebservices.SupportedFormats;
055 import org.deegree.ogcwebservices.getcapabilities.InvalidCapabilitiesException;
056 import org.deegree.ogcwebservices.wcs.CoverageOfferingBrief;
057 import org.deegree.ogcwebservices.wcs.WCService;
058 import org.deegree.ogcwebservices.wcs.configuration.InvalidConfigurationException;
059 import org.deegree.ogcwebservices.wcs.configuration.WCSConfiguration;
060 import org.deegree.ogcwebservices.wcs.describecoverage.CoverageDescription;
061 import org.deegree.ogcwebservices.wcs.describecoverage.CoverageOffering;
062 import org.deegree.ogcwebservices.wcs.getcapabilities.ContentMetadata;
063 import org.deegree.ogcwebservices.wcs.getcapabilities.WCSCapabilities;
064 import org.deegree.ogcwebservices.wcs.getcoverage.GetCoverage;
065 import org.deegree.ogcwebservices.wpvs.capabilities.OWSCapabilities;
066 import org.xml.sax.SAXException;
067
068 /**
069 * This class represents a local WCS dataSource object.
070 *
071 * @author <a href="mailto:taddei@lat-lon.de">Ugo Taddei</a>
072 * @author last edited by: $Author: mschneider $
073 *
074 * $Revision: 18195 $, $Date: 2009-06-18 17:55:39 +0200 (Do, 18. Jun 2009) $
075 *
076 */
077 public class LocalWCSDataSource extends AbstractDataSource {
078
079 private static final ILogger LOG = LoggerFactory.getLogger( LocalWCSDataSource.class );
080
081 private Color[] transparentColors;
082
083 private double configuredMinimalDGMResolution;
084
085 private static Map<URL, WCSConfiguration> cache = new ConcurrentHashMap<URL, WCSConfiguration>();
086
087 private String defaultFormat;
088
089 // private static WCSConfiguration wcsConfig = null;
090
091 /**
092 * Creates a new <code>LocalWCSDataSource</code> object from the given parameters.
093 *
094 * @param name
095 * @param owsCapabilities
096 * @param validArea
097 * @param minScaleDenominator
098 * @param maxScaleDenominator
099 * @param filterCondition
100 * a base request //TODO give an example
101 * @param transparentColors
102 */
103 public LocalWCSDataSource( QualifiedName name, OWSCapabilities owsCapabilities, Surface validArea,
104 double minScaleDenominator, double maxScaleDenominator, GetCoverage filterCondition,
105 Color[] transparentColors ) {
106
107 super( LOCAL_WCS, name, owsCapabilities, validArea, minScaleDenominator, maxScaleDenominator, filterCondition );
108 this.transparentColors = transparentColors;
109 configuredMinimalDGMResolution = 0;
110 StringBuilder sb = new StringBuilder( "Couldn't determine default csw format because: " );
111 if ( filterCondition != null ) {
112 defaultFormat = filterCondition.getOutput().getFormat().getCode();
113 }
114 if ( defaultFormat == null || "".equals( defaultFormat.trim() ) ) {
115 try {
116 WCService service = (WCService) getOGCWebService();
117 if ( service != null ) {
118 WCSCapabilities caps = (WCSCapabilities) service.getCapabilities();
119 if ( caps != null ) {
120 ContentMetadata md = caps.getContentMetadata();
121 if ( md != null ) {
122 CoverageOfferingBrief[] cobs = md.getCoverageOfferingBrief();
123 if ( cobs != null ) {
124 for ( int i = 0; i < cobs.length && defaultFormat == null; ++i ) {
125 CoverageOfferingBrief cob = cobs[i];
126 String cobName = cob.getName();
127 if ( cobName != null && !"".equals( cobName.trim() ) ) {
128 if ( name.getLocalName().equals( cobName.trim() ) ) {
129 LOG.logDebug( "Found a BriefCoverage Offering with the name of this datasource: " + name.getLocalName() );
130 URL url = cob.getConfiguration();
131 CoverageDescription cd = CoverageDescription.createCoverageDescription( url );
132 if ( cd != null ) {
133 CoverageOffering[] cos = cd.getCoverageOfferings();
134 if ( cos != null ) {
135 for ( int coCount = 0; coCount < cos.length && defaultFormat == null; coCount++ ) {
136 CoverageOffering co = cos[coCount];
137 if ( co != null ) {
138 SupportedFormats sfs = co.getSupportedFormats();
139 if ( sfs != null ) {
140 Code nativeFormat = sfs.getNativeFormat();
141 String nf = null;
142 if ( nativeFormat != null ) {
143 nf = nativeFormat.getCode();
144 if ( nf != null ) {
145 nf = nf.trim();
146 }
147 }
148 CodeList[] cls = sfs.getFormats();
149 if ( cls != null ) {
150 for ( int clCount = 0; clCount < cls.length && defaultFormat == null; clCount++ ) {
151 CodeList cl = cls[clCount];
152 if ( cl != null ) {
153 String[] codes = cl.getCodes();
154 if ( codes != null ) {
155 for ( int codeCount = 0; codeCount < codes.length && defaultFormat == null; ++codeCount ) {
156 String code = codes[codeCount];
157 if ( code != null && !"".equals( code.trim() ) ) {
158 if ( code.toLowerCase().contains( "tif" ) ) {
159 defaultFormat = code;
160 }
161 }
162 }
163 }
164 }
165 }
166 }// codelists != null
167 }// supportedformats !=null
168 } // co !=null
169 }// for coverageofferings.
170 }// coverage offerings != null
171 }// no CoverageDescriptor
172 }// name fits
173 }// name not empty
174 }// for brief coverages
175 if ( defaultFormat == null ) {
176 sb.append( "No brief coverage Offering found with datasource name: " )
177 .append( name.getLocalName() );
178 }
179 } else {
180 sb.append( "no Brief Coverage Offerings found." );
181 }
182 } else {
183 sb.append( "no ContentMetadata found." );
184 }
185 } else {
186 sb.append( "no WCSCapabilities found." );
187 }
188 } else {
189 sb.append( "no WCService found." );
190 }
191 } catch ( OGCWebServiceException e ) {
192 if ( LOG.getLevel() == ILogger.LOG_DEBUG ) {
193 e.printStackTrace();
194 }
195 sb.append( e.getMessage() );
196 } catch ( IOException e ) {
197 if ( LOG.getLevel() == ILogger.LOG_DEBUG ) {
198 e.printStackTrace();
199 }
200 sb.append( e.getMessage() );
201 } catch ( SAXException e ) {
202 if ( LOG.getLevel() == ILogger.LOG_DEBUG ) {
203 e.printStackTrace();
204 }
205 sb.append( e.getMessage() );
206 }
207 }
208 if ( defaultFormat == null ) {
209 sb.append( "\nsetting defaultFormat to tiff." );
210 LOG.logWarning( sb.toString() );
211 defaultFormat = "tiff";
212 }
213 if ( LOG.getLevel() == ILogger.LOG_DEBUG ) {
214 LOG.logDebug( "Default GetCoverage request format is: " + defaultFormat );
215 }
216 }
217
218 /**
219 * The <code>filterCondition</code> is a GetCoverage object which extends the WCSRequestBase.
220 *
221 * @return Returns the filterCondition as a GetCoverage object.
222 */
223 public GetCoverage getCoverageFilterCondition() {
224 return (GetCoverage) getFilterCondition();
225 }
226
227 /**
228 * @return Returns the transparentColors.
229 */
230 public Color[] getTransparentColors() {
231 return transparentColors;
232 }
233
234 @Override
235 public String toString() {
236
237 StringBuffer sb = new StringBuffer( super.toString() );
238
239 Color[] colors = getTransparentColors();
240 for ( int i = 0; i < colors.length; i++ ) {
241 sb.append( "\n color : " ).append( colors[i] );
242 }
243
244 GetCoverage filter = getCoverageFilterCondition();
245 try {
246 sb.append( "\n\t filter : " );
247 sb.append( "\n\t -version : " );
248 sb.append( filter.getVersion() );
249 sb.append( "\n\t -id : " );
250 sb.append( filter.getId() );
251 sb.append( "\n\t -serviceName : " );
252 sb.append( filter.getServiceName() );
253 sb.append( "\n\t -sourceCoverage: " );
254 sb.append( filter.getSourceCoverage() );
255 } catch ( Exception e ) {
256 e.printStackTrace();
257 }
258
259 return sb.toString();
260 }
261
262 /**
263 * @throws OGCWebServiceException
264 * @see org.deegree.ogcwebservices.wpvs.configuration.AbstractDataSource#getOGCWebService()
265 */
266 @Override
267 public OGCWebService getOGCWebService()
268 throws OGCWebServiceException {
269 WCSConfiguration wcsConfig = null;
270 synchronized ( this ) {
271 URL url = getOwsCapabilities().getOnlineResource();
272 wcsConfig = cache.get( url );
273 if ( !cache.containsKey( url ) || wcsConfig == null ) {
274
275 URL caps = getOwsCapabilities().getOnlineResource();
276 try {
277 wcsConfig = WCSConfiguration.create( caps );
278 cache.put( url, wcsConfig );
279 } catch ( InvalidCapabilitiesException e ) {
280 throw new OGCWebServiceException( Messages.getMessage( "WPVS_DATASOURCE_CAP_ERROR", toString() ) + e.getMessage() );
281 } catch ( InvalidConfigurationException e ) {
282 throw new OGCWebServiceException( Messages.getMessage( "WPVS_DATASOURCE_CAP_ERROR", toString() ) + e.getMessage() );
283 } catch ( IOException e ) {
284 throw new OGCWebServiceException( Messages.getMessage( "WPVS_DATASOURCE_CAP_ERROR", toString() ) + e.getMessage() );
285 } catch ( SAXException e ) {
286 throw new OGCWebServiceException( Messages.getMessage( "WPVS_DATASOURCE_CAP_ERROR", toString() ) + e.getMessage() );
287 }
288 }
289 this.notifyAll();
290 }
291 return new WCService( wcsConfig );
292 }
293
294 /**
295 * @return the configuredMinimalDGMResolution.
296 */
297 public double getConfiguredMinimalDGMResolution() {
298 return configuredMinimalDGMResolution;
299 }
300
301 /**
302 * @param configuredMinimalDGMResolution
303 * An other configuredMinimalDGMResolution value.
304 */
305 public void setConfiguredMinimalDGMResolution( double configuredMinimalDGMResolution ) {
306 this.configuredMinimalDGMResolution = configuredMinimalDGMResolution;
307 }
308
309 /**
310 * @return the defaultFormat to be used for GetCoverage requests
311 */
312 public final String getDefaultFormat() {
313 return defaultFormat;
314 }
315 }