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