Changeset 378

Show
Ignore:
Timestamp:
09/03/08 21:48:05 (4 months ago)
Author:
arneke
Message:

jgarnett's temporary getcapabilities patch

Files:
1 modified

Legend:

Unmodified
Added
Removed
  • trunk/geowebcache/src/main/java/org/geowebcache/service/wms/WMSService.java

    r342 r378  
    1818package org.geowebcache.service.wms; 
    1919 
     20import java.io.BufferedReader; 
    2021import java.io.IOException; 
     22import java.io.InputStream; 
     23import java.io.InputStreamReader; 
    2124import java.io.OutputStream; 
     25import java.net.URL; 
     26import java.net.URLConnection; 
    2227import java.util.Iterator; 
    2328import java.util.Map; 
     
    2934import org.apache.commons.logging.Log; 
    3035import org.apache.commons.logging.LogFactory; 
     36import org.geotools.data.ows.WMSCapabilities; 
     37import org.geotools.data.wms.WebMapServer; 
    3138import org.geowebcache.GeoWebCacheException; 
    3239import org.geowebcache.layer.SRS; 
     
    3441import org.geowebcache.layer.TileLayer; 
    3542import org.geowebcache.layer.TileLayerDispatcher; 
     43import org.geowebcache.layer.wms.WMSLayer; 
    3644import org.geowebcache.mime.MimeException; 
    3745import org.geowebcache.mime.MimeType; 
     
    3947import org.geowebcache.service.ServiceException; 
    4048import org.geowebcache.tile.Tile; 
     49import org.geowebcache.util.Configuration; 
    4150import org.geowebcache.util.ServletUtils; 
    4251import org.geowebcache.util.wms.BBOX; 
     
    4554    public static final String SERVICE_WMS = "wms"; 
    4655 
    47     private static Log log = LogFactory 
    48             .getLog(org.geowebcache.service.wms.WMSService.class); 
     56    private static Log log = LogFactory.getLog(org.geowebcache.service.wms.WMSService.class); 
     57 
     58        private List configs; 
     59 
     60        private String caps; 
    4961 
    5062    public WMSService() { 
     
    180192    } 
    181193 
    182     private static String getCapabilitiesHeader() { 
    183         return "<WMT_MS_Capabilities version=\"1.1.1\" updateSequence=\"0\">\n" 
    184                 + "<VendorSpecificCapabilities>"; 
    185     } 
    186  
    187     private static String getCapabilitiesFooter() { 
    188         return "\n</VendorSpecificCapabilities>" + "\n</WMT_MS_Capabilities>"; 
    189     } 
    190  
     194    private String getCapabilitiesHeader() { 
     195        String wms = fetchOrigionalWMSCapabilitiesDocument(); 
     196        int split = wms.indexOf("<VendorSpecificCapabilities/>"); 
     197        if( split != -1 ){ 
     198                // we have an empty VendorSpecificCapabilities to fill in... 
     199                String header = wms.substring(0,split); 
     200                return header+"\n<VendorSpecificCapabilities>"; 
     201        } 
     202        split = wms.indexOf("</VendorSpecificCapabilities>"); 
     203        if( split != -1 ){ 
     204                // we have an existing VendorSpecificCapabilities to add to 
     205                String header = wms.substring(0,split);                  
     206        } 
     207        // look for <UserDefinedSymbolization .. VendorSpecificCapabilities goes before this element 
     208        split = wms.indexOf("<UserDefinedSymbolization"); 
     209        if( split ==-1 ){ 
     210                // look for <Layer> ... VendorSpecificParameters goes before this element 
     211                split = wms.indexOf("<Layer"); 
     212        } 
     213        String header = wms.substring(0,split); 
     214         
     215        return header +"\n<VendorSpecificCapabilities>"; 
     216    } 
     217 
     218    private String getCapabilitiesFooter() { 
     219        //return "\n</VendorSpecificCapabilities>" + "\n</WMT_MS_Capabilities>"; 
     220        String wms = fetchOrigionalWMSCapabilitiesDocument(); 
     221        int split = wms.indexOf("<VendorSpecificCapabilities/>"); 
     222        if( split != -1 ){ 
     223                // we have an empty VendorSpecificCapabilities to fill in... 
     224                String footer = wms.substring(split+29); 
     225                return "\n</VendorSpecificCapabilities>" + footer; 
     226        } 
     227        split = wms.indexOf("<VendorSpecificCapabilities/>"); 
     228        if( split != -1 ){ 
     229                // we have an existing VendorSpecificCapabilities to add to 
     230                String footer = wms.substring(split+28); 
     231                return "\n</VendorSpecificCapabilities>" + footer; 
     232        } 
     233        // look for <UserDefinedSymbolization .. VendorSpecificCapabilities goes before this element 
     234        split = wms.indexOf("<UserDefinedSymbolization"); 
     235        if( split ==-1 ){ 
     236                // look for <Layer> ... VendorSpecificParameters goes before this element 
     237                split = wms.indexOf("<Layer"); 
     238        } 
     239        String footer = wms.substring(split);            
     240        return "\n</VendorSpecificCapabilities>" + footer; 
     241    } 
     242 
     243    /** 
     244     * Fetch the original WMS capabilities document (we will add our vendor specific 
     245     * parameters here). 
     246     * <p> 
     247     * Currently this is returned as a String; in the future we can make use of 
     248     * the GeoTools WMSCapabilities data structure (and strip out any 
     249     * layers that are not mentioned explicitly). 
     250     *  
     251     * @return The origional WMS capabilities document prior to processing 
     252     */ 
     253    synchronized String fetchOrigionalWMSCapabilitiesDocument(){ 
     254        if( caps != null ){ 
     255                return caps; 
     256        } 
     257        StringBuffer buf = new StringBuffer(); 
     258        if (configs == null ){ 
     259                return "sad"; 
     260        } 
     261         Iterator configIter = configs.iterator(); 
     262         CONFIG: while (configIter.hasNext()) { 
     263             Map<String, TileLayer> configLayers = null; 
     264             Configuration config = (Configuration) configIter.next(); 
     265             try { 
     266                 configLayers = config.getTileLayers(); 
     267             } catch (GeoWebCacheException gwce) { 
     268                 log.error(gwce.getMessage()); 
     269                 log.error("Failed to add layers from "+ config.getIdentifier()); 
     270             } 
     271             if (configLayers != null && configLayers.size() > 0) { 
     272                 LAYER: for( TileLayer layer : configLayers.values() ){ 
     273                         if( !(layer instanceof WMSLayer)){ 
     274                                 continue; // skip! 
     275                         } 
     276                         WMSLayer wmsLayer = (WMSLayer) layer; 
     277                         WMSURL: for( String url : wmsLayer.getWMSurl() ){ 
     278                                 try { 
     279                                         URL capabilitiesURL = new URL( url+"?REQUEST=GetCapabilities&SERVICE=WMS&VESION=1.1.0"); 
     280                                                 URLConnection connection = capabilitiesURL.openConnection(); 
     281                                                 InputStream input = connection.getInputStream(); 
     282                                                 InputStreamReader reader = new InputStreamReader( input ); 
     283                                                 BufferedReader process = new BufferedReader( reader ); 
     284                                                  
     285                                                 buf = new StringBuffer(); 
     286                                                 String line; 
     287                                                 while( (line = process.readLine()) != null ){ 
     288                                                         buf.append( line ); 
     289                                                         buf.append("\n"); 
     290                                                 } 
     291                                                 if( buf.length() != 0 ){ 
     292                                                         break CONFIG; // we managed to read a capabilities into buf 
     293                                                 } 
     294                                                 /*   
     295                                                     // TODO only use the parts of the capabilities file that 
     296                                                         // are mentioned in our configuration! 
     297                                                           
     298                                                         WebMapServer wms = new WebMapServer(capabilitiesURL); 
     299                                                         WMSCapabilities capabilities = wms.getCapabilities();                                                                                           
     300                                                 */ 
     301                                 } 
     302                                 catch( Throwable notConnected ){ 
     303                                         // continue WMSURL 
     304                                 }                                
     305                         } 
     306                 } 
     307             } else { 
     308                 log.error("Configuration " + config.getIdentifier()+ " contained no layers."); 
     309             } 
     310         } 
     311         caps = buf.toString(); 
     312         return caps; 
     313    } 
     314 
     315    public void setConfig(List configs) { 
     316        this.configs = configs; 
     317    } 
    191318    /** 
    192319     *