Changeset 9733

Show
Ignore:
Timestamp:
10/08/09 17:24:54 (11 months ago)
Author:
tschaub
Message:

Adding some serious enhancements to the WMC format. With this, OL map and layer objects can be created from WMC context objects and vice versa. Thanks for the great patch bbinet. r=me (closes #2251)

Location:
trunk/openlayers
Files:
6 modified

Legend:

Unmodified
Added
Removed
  • trunk/openlayers/lib/OpenLayers/Format/WMC.js

    r8922 r9733  
    8787        if(!version) { 
    8888            version = root.getAttribute("version"); 
    89             if(!version) { 
    90                 version = this.defaultVersion; 
    91             } 
    92         } 
    93         if(!this.parser || this.parser.VERSION != version) { 
    94             var format = OpenLayers.Format.WMC[ 
    95                 "v" + version.replace(/\./g, "_") 
    96             ]; 
    97             if(!format) { 
    98                 throw "Can't find a WMC parser for version " + 
    99                       version; 
    100             } 
    101             this.parser = new format(this.options); 
    102         } 
    103         var context = this.parser.read(data, options); 
     89        } 
     90        var parser = this.getParser(version); 
     91        var context = parser.read(data, options); 
    10492        var map; 
    105         if(options.map) { 
     93        if(options && options.map) { 
    10694            this.context = context; 
    10795            if(options.map instanceof OpenLayers.Map) { 
     
    116104        return map; 
    117105    }, 
     106 
     107    /** 
     108     * Method: getParser 
     109     * Get the WMC parser given a version. Create a new parser if it does not 
     110     * already exist. 
     111     * 
     112     * Parameters: 
     113     * version - {String} The version of the parser. 
     114     * 
     115     * Returns: 
     116     * {<OpenLayers.Format.WMC.v1>} A WMC parser. 
     117     */ 
     118    getParser: function(version) { 
     119        var v = version || this.version || this.defaultVersion; 
     120        if(!this.parser || this.parser.VERSION != v) { 
     121            var format = OpenLayers.Format.WMC[ 
     122                "v" + v.replace(/\./g, "_") 
     123            ]; 
     124            if(!format) { 
     125                throw "Can't find a WMC parser for version " + v; 
     126            } 
     127            this.parser = new format(this.options); 
     128        } 
     129        return this.parser; 
     130    }, 
     131 
     132    /** 
     133     * Method: getLayerFromContext 
     134     * Create a WMS layer from a layerContext object. 
     135     * 
     136     * Parameters: 
     137     * layerContext - {Object} An object representing a WMS layer. 
     138     * 
     139     * Returns: 
     140     * {<OpenLayers.Layer.WMS>} A WMS layer. 
     141     */ 
     142    getLayerFromContext: function(layerContext) { 
     143        var i, len; 
     144        // fill initial options object from layerContext 
     145        var options = { 
     146            queryable: layerContext.queryable, //keep queryable for api compatibility 
     147            visibility: layerContext.visibility, 
     148            maxExtent: layerContext.maxExtent, 
     149            numZoomLevels: layerContext.numZoomLevels, 
     150            units: layerContext.units, 
     151            isBaseLayer: layerContext.isBaseLayer, 
     152            opacity: layerContext.opacity, 
     153            displayInLayerSwitcher: layerContext.displayInLayerSwitcher, 
     154            singleTile: layerContext.singleTile, 
     155            minScale: layerContext.minScale, 
     156            maxScale: layerContext.maxScale 
     157        }; 
     158        if (this.layerOptions) { 
     159            OpenLayers.Util.applyDefaults(options, this.layerOptions); 
     160        } 
     161 
     162        var params = { 
     163            layers: layerContext.name,  
     164            transparent: layerContext.transparent, 
     165            version: layerContext.version 
     166        }; 
     167        if (layerContext.formats && layerContext.formats.length>0) { 
     168            // set default value for params if current attribute is not positionned 
     169            params.format = layerContext.formats[0].value; 
     170            for (i=0, len=layerContext.formats.length; i<len; i++) { 
     171                var format = layerContext.formats[i]; 
     172                if (format.current == true) { 
     173                    params.format = format.value; 
     174                    break; 
     175                } 
     176            } 
     177        } 
     178        if (layerContext.styles && layerContext.styles.length>0) { 
     179            for (i=0, len=layerContext.styles.length; i<len; i++) { 
     180                var style = layerContext.styles[i]; 
     181                if (style.current == true) { 
     182                    // three style types to consider 
     183                    // 1) linked SLD 
     184                    // 2) inline SLD 
     185                    // 3) named style 
     186                    if(style.href) { 
     187                        params.sld = style.href; 
     188                    } else if(style.body) { 
     189                        params.sld_body = style.body; 
     190                    } else { 
     191                        params.styles = style.name; 
     192                    } 
     193                    break; 
     194                } 
     195            } 
     196        } 
     197        if (this.layerParams) { 
     198            OpenLayers.Util.applyDefaults(params, this.layerParams); 
     199        } 
     200 
     201        var layer = new OpenLayers.Layer.WMS( 
     202            layerContext.title || layerContext.name, 
     203            layerContext.url, 
     204            params, 
     205            options 
     206        ); 
     207        return layer; 
     208    }, 
     209     
     210    /** 
     211     * Method: getLayersFromContext 
     212     * Create an array of WMS layers from an array of layerContext objects. 
     213     * 
     214     * Parameters: 
     215     * layersContext - {Array(Object)} An array of objects representing WMS layers. 
     216     * 
     217     * Returns: 
     218     * {Array(<OpenLayers.Layer.WMS>)} An array of WMS layers. 
     219     */ 
     220    getLayersFromContext: function(layersContext) { 
     221        var layers = []; 
     222        for (var i=0, len=layersContext.length; i<len; i++) { 
     223            layers.push(this.getLayerFromContext(layersContext[i])); 
     224        } 
     225        return layers; 
     226    }, 
    118227     
    119228    /** 
     
    134243            projection: context.projection 
    135244        }); 
    136         map.addLayers(context.layers); 
     245        map.addLayers(this.getLayersFromContext(context.layersContext)); 
    137246        map.setCenter( 
    138247            context.bounds.getCenterLonLat(), 
     
    154263     */ 
    155264    mergeContextToMap: function(context, map) { 
    156         map.addLayers(context.layers); 
     265        map.addLayers(this.getLayersFromContext(context.layersContext)); 
    157266        return map; 
    158267    }, 
     
    170279     */ 
    171280    write: function(obj, options) { 
     281        obj = this.toContext(obj); 
     282        var version = options && options.version; 
     283        var parser = this.getParser(version); 
     284        var wmc = parser.write(obj, options); 
     285        return wmc; 
     286    }, 
     287     
     288    /** 
     289     * Method: layerToContext 
     290     * Create a layer context object given a wms layer object. 
     291     * 
     292     * Parameters: 
     293     * obj - {<OpenLayers.Layer.WMS>} The layer. 
     294     * 
     295     * Returns: 
     296     * {Object} A layer context object. 
     297     */ 
     298    layerToContext: function(layer) { 
     299        var parser = this.getParser(); 
     300        var layerContext = { 
     301            queryable: layer.queryable, 
     302            visibility: layer.visibility, 
     303            name: layer.params["LAYERS"], 
     304            title: layer.name, 
     305            metadataURL: layer.metadataURL, 
     306            version: layer.params["VERSION"], 
     307            url: layer.url, 
     308            maxExtent: layer.maxExtent, 
     309            transparent: layer.params["TRANSPARENT"], 
     310            numZoomLevels: layer.numZoomLevels, 
     311            units: layer.units, 
     312            isBaseLayer: layer.isBaseLayer, 
     313            opacity: layer.opacity, 
     314            displayInLayerSwitcher: layer.displayInLayerSwitcher, 
     315            singleTile: layer.singleTile, 
     316            minScale : (layer.options.resolutions || 
     317                        layer.options.scales ||  
     318                        layer.options.maxResolution ||  
     319                        layer.options.minScale) ?  
     320                        layer.minScale : undefined, 
     321            maxScale : (layer.options.resolutions || 
     322                        layer.options.scales ||  
     323                        layer.options.minResolution ||  
     324                        layer.options.maxScale) ?  
     325                        layer.maxScale : undefined, 
     326            formats: [{ 
     327                value: layer.params["FORMAT"], 
     328                current: true 
     329            }], 
     330            styles: [{ 
     331                href: layer.params["SLD"], 
     332                body: layer.params["SLD_BODY"], 
     333                name: layer.params["STYLES"] || parser.defaultStyleName, 
     334                title: parser.defaultStyleTitle, 
     335                current: true 
     336            }] 
     337        }; 
     338        return layerContext; 
     339    }, 
     340     
     341    /** 
     342     * Method: toContext 
     343     * Create a context object free from layer given a map or a 
     344     * context object. 
     345     * 
     346     * Parameters: 
     347     * obj - {<OpenLayers.Map> | Object} The map or context. 
     348     * 
     349     * Returns: 
     350     * {Object} A context object. 
     351     */ 
     352    toContext: function(obj) { 
     353        var context = {}; 
     354        var layers = obj.layers; 
    172355        if(obj.CLASS_NAME == "OpenLayers.Map") { 
    173             obj = this.mapToContext(obj); 
    174         } 
    175         var version = (options && options.version) || 
    176                       this.version || this.defaultVersion; 
    177         if(!this.parser || this.parser.VERSION != version) { 
    178             var format = OpenLayers.Format.WMC[ 
    179                 "v" + version.replace(/\./g, "_") 
    180             ]; 
    181             if(!format) { 
    182                 throw "Can't find a WMS capabilities parser for version " + 
    183                       version; 
    184             } 
    185             this.parser = new format(this.options); 
    186         } 
    187         var wmc = this.parser.write(obj, options); 
    188         return wmc; 
    189     }, 
    190      
    191     /** 
    192      * Method: mapToContext 
    193      * Create a context object given a map. 
    194      * 
    195      * Parameters: 
    196      * map - {<OpenLayers.Map>} The map. 
    197      * 
    198      * Returns: 
    199      * {Object} A context object. 
    200      */ 
    201     mapToContext: function(map) { 
    202         var context = { 
    203             bounds: map.getExtent(), 
    204             maxExtent: map.maxExtent, 
    205             projection: map.projection, 
    206             layers: map.layers, 
    207             size: map.getSize() 
    208         }; 
     356            context.bounds = obj.getExtent(); 
     357            context.maxExtent = obj.maxExtent; 
     358            context.projection = obj.projection; 
     359            context.size = obj.getSize(); 
     360        } 
     361        else { 
     362            // copy all obj properties except the "layers" property 
     363            OpenLayers.Util.applyDefaults(context, obj); 
     364            if(context.layers != undefined) { 
     365                delete(context.layers); 
     366            } 
     367        } 
     368 
     369        if (context.layersContext == undefined) { 
     370            context.layersContext = []; 
     371        } 
     372 
     373        // let's convert layers into layersContext object (if any) 
     374        if (layers != undefined && layers instanceof Array) { 
     375            for (var i=0, len=layers.length; i<len; i++) { 
     376                var layer = layers[i]; 
     377                if(layer instanceof OpenLayers.Layer.WMS) { 
     378                    context.layersContext.push(this.layerToContext(layer)); 
     379                } 
     380            } 
     381        } 
    209382        return context; 
    210383    }, 
  • trunk/openlayers/lib/OpenLayers/Format/WMC/v1.js

    r9703 r9733  
    158158     */ 
    159159    read_wmc_LayerList: function(context, node) { 
    160         context.layers = []; 
     160        // layersContext is an array containing info for each layer 
     161        context.layersContext = []; 
    161162        this.runChildNodes(context, node); 
    162163    }, 
     
    166167     */ 
    167168    read_wmc_Layer: function(context, node) { 
    168         var layerInfo = { 
    169             params: this.layerParams || {}, 
    170             options: { 
    171                 visibility: (node.getAttribute("hidden") != "1"), 
    172                 queryable: (node.getAttribute("queryable") == "1") 
    173                  
    174             }, 
     169        var layerContext = { 
     170            visibility: (node.getAttribute("hidden") != "1"), 
     171            queryable: (node.getAttribute("queryable") == "1"), 
    175172            formats: [], 
    176173            styles: [] 
    177174        }; 
    178         this.runChildNodes(layerInfo, node); 
     175 
     176        this.runChildNodes(layerContext, node); 
    179177        // set properties common to multiple objects on layer options/params 
    180         layerInfo.params.layers = layerInfo.name; 
    181         layerInfo.options.maxExtent = layerInfo.maxExtent; 
    182         // create the layer 
    183         var layer = this.getLayerFromInfo(layerInfo); 
    184         context.layers.push(layer); 
    185     }, 
    186      
    187     /** 
    188      * Method: getLayerFromInfo 
    189      * Create a WMS layer from a layerInfo object. 
    190      * 
    191      * Parameters: 
    192      * layerInfo - {Object} An object representing a WMS layer. 
    193      * 
    194      * Returns: 
    195      * {<OpenLayers.Layer.WMS>} A WMS layer. 
    196      */ 
    197     getLayerFromInfo: function(layerInfo) { 
    198         var options = layerInfo.options; 
    199         if (this.layerOptions) { 
    200             OpenLayers.Util.applyDefaults(options, this.layerOptions); 
    201         } 
    202         var layer = new OpenLayers.Layer.WMS( 
    203             layerInfo.title, 
    204             layerInfo.href, 
    205             layerInfo.params, 
    206             options 
    207         ); 
    208         return layer; 
     178        context.layersContext.push(layerContext); 
    209179    }, 
    210180     
     
    219189     * Method: read_ol_units 
    220190     */ 
    221     read_ol_units: function(layerInfo, node) { 
    222         layerInfo.options.units = this.getChildValue(node); 
     191    read_ol_units: function(layerContext, node) { 
     192        layerContext.units = this.getChildValue(node); 
    223193    }, 
    224194     
     
    237207     * Method: read_ol_transparent 
    238208     */ 
    239     read_ol_transparent: function(layerInfo, node) { 
    240         layerInfo.params.transparent = this.getChildValue(node); 
     209    read_ol_transparent: function(layerContext, node) { 
     210        layerContext.transparent = this.getChildValue(node); 
    241211    }, 
    242212 
     
    244214     * Method: read_ol_numZoomLevels 
    245215     */ 
    246     read_ol_numZoomLevels: function(layerInfo, node) { 
    247         layerInfo.options.numZoomLevels = parseInt(this.getChildValue(node)); 
     216    read_ol_numZoomLevels: function(layerContext, node) { 
     217        layerContext.numZoomLevels = parseInt(this.getChildValue(node)); 
    248218    }, 
    249219 
     
    251221     * Method: read_ol_opacity 
    252222     */ 
    253     read_ol_opacity: function(layerInfo, node) { 
    254         layerInfo.options.opacity = parseFloat(this.getChildValue(node)); 
     223    read_ol_opacity: function(layerContext, node) { 
     224        layerContext.opacity = parseFloat(this.getChildValue(node)); 
    255225    }, 
    256226 
     
    258228     * Method: read_ol_singleTile 
    259229     */ 
    260     read_ol_singleTile: function(layerInfo, node) { 
    261         layerInfo.options.singleTile = (this.getChildValue(node) == "true"); 
     230    read_ol_singleTile: function(layerContext, node) { 
     231        layerContext.singleTile = (this.getChildValue(node) == "true"); 
    262232    }, 
    263233 
     
    265235     * Method: read_ol_isBaseLayer 
    266236     */ 
    267     read_ol_isBaseLayer: function(layerInfo, node) { 
    268         layerInfo.options.isBaseLayer = (this.getChildValue(node) == "true"); 
     237    read_ol_isBaseLayer: function(layerContext, node) { 
     238        layerContext.isBaseLayer = (this.getChildValue(node) == "true"); 
    269239    }, 
    270240 
     
    272242     * Method: read_ol_displayInLayerSwitcher 
    273243     */ 
    274     read_ol_displayInLayerSwitcher: function(layerInfo, node) { 
    275         layerInfo.options.displayInLayerSwitcher = 
    276             (this.getChildValue(node) == "true"); 
     244    read_ol_displayInLayerSwitcher: function(layerContext, node) { 
     245        layerContext.displayInLayerSwitcher = (this.getChildValue(node) == "true"); 
    277246    }, 
    278247 
     
    280249     * Method: read_wmc_Server 
    281250     */ 
    282     read_wmc_Server: function(layerInfo, node) { 
    283         layerInfo.params.version = node.getAttribute("version"); 
    284         this.runChildNodes(layerInfo, node); 
     251    read_wmc_Server: function(layerContext, node) { 
     252        layerContext.version = node.getAttribute("version"); 
     253        var server = {}; 
     254        var links = node.getElementsByTagName("OnlineResource"); 
     255        if(links.length > 0) { 
     256            this.read_wmc_OnlineResource(server, links[0]); 
     257        } 
     258        layerContext.url = server.href; 
    285259    }, 
    286260 
     
    288262     * Method: read_wmc_FormatList 
    289263     */ 
    290     read_wmc_FormatList: function(layerInfo, node) { 
    291         this.runChildNodes(layerInfo, node); 
     264    read_wmc_FormatList: function(layerContext, node) { 
     265        this.runChildNodes(layerContext, node); 
    292266    }, 
    293267 
     
    295269     * Method: read_wmc_Format 
    296270     */ 
    297     read_wmc_Format: function(layerInfo, node) { 
    298         var format = this.getChildValue(node); 
    299         layerInfo.formats.push(format); 
     271    read_wmc_Format: function(layerContext, node) { 
     272        var format = { 
     273            value: this.getChildValue(node) 
     274        }; 
    300275        if(node.getAttribute("current") == "1") { 
    301             layerInfo.params.format = format; 
    302         } 
     276            format.current = true; 
     277        } 
     278        layerContext.formats.push(format); 
    303279    }, 
    304280     
     
    306282     * Method: read_wmc_StyleList 
    307283     */ 
    308     read_wmc_StyleList: function(layerInfo, node) { 
    309         this.runChildNodes(layerInfo, node); 
     284    read_wmc_StyleList: function(layerContext, node) { 
     285        this.runChildNodes(layerContext, node); 
    310286    }, 
    311287 
     
    313289     * Method: read_wmc_Style 
    314290     */ 
    315     read_wmc_Style: function(layerInfo, node) { 
     291    read_wmc_Style: function(layerContext, node) { 
    316292        var style = {}; 
    317293        this.runChildNodes(style, node); 
    318294        if(node.getAttribute("current") == "1") { 
    319             // three style types to consider 
    320             // 1) linked SLD 
    321             // 2) inline SLD 
    322             // 3) named style 
    323             // running child nodes always gets name, optionally gets href or body 
    324             if(style.href) { 
    325                 layerInfo.params.sld = style.href; 
    326             } else if(style.body) { 
    327                 layerInfo.params.sld_body = style.body; 
    328             } else { 
    329                 layerInfo.params.styles = style.name; 
    330             } 
    331         } 
    332         layerInfo.styles.push(style); 
     295            style.current = true; 
     296        } 
     297        layerContext.styles.push(style); 
    333298    }, 
    334299     
     
    381346     * Method: read_wmc_MetadataURL 
    382347     */ 
    383     read_wmc_MetadataURL: function(layerInfo, node) { 
     348    read_wmc_MetadataURL: function(layerContext, node) { 
    384349        var metadataURL = {}; 
    385350        var links = node.getElementsByTagName("OnlineResource"); 
     
    387352            this.read_wmc_OnlineResource(metadataURL, links[0]); 
    388353        } 
    389         layerInfo.options.metadataURL = metadataURL.href; 
     354        layerContext.metadataURL = metadataURL.href; 
    390355 
    391356    }, 
     
    401366    }, 
    402367     
     368    //FIXME: LatLonBoundingBox is not in spec 
    403369    /** 
    404370     * Method: read_wmc_LatLonBoundingBox 
    405371     */ 
    406     read_wmc_LatLonBoundingBox: function(layer, node) { 
    407         layer.llbbox = [ 
    408             parseFloat(node.getAttribute("minx")), 
    409             parseFloat(node.getAttribute("miny")), 
    410             parseFloat(node.getAttribute("maxx")), 
    411             parseFloat(node.getAttribute("maxy")) 
    412         ]; 
    413     }, 
     372    //read_wmc_LatLonBoundingBox: function(layer, node) { 
     373        //layer.llbbox = [ 
     374            //parseFloat(node.getAttribute("minx")), 
     375            //parseFloat(node.getAttribute("miny")), 
     376            //parseFloat(node.getAttribute("maxx")), 
     377            //parseFloat(node.getAttribute("maxy")) 
     378        //]; 
     379    //}, 
    414380 
    415381    /** 
     
    595561        var list = this.createElementDefaultNS("LayerList"); 
    596562         
    597         var layer; 
    598         for(var i=0, len=context.layers.length; i<len; ++i) { 
    599             layer = context.layers[i]; 
    600             if(layer instanceof OpenLayers.Layer.WMS) { 
    601                 list.appendChild(this.write_wmc_Layer(layer)); 
    602             } 
     563        for(var i=0, len=context.layersContext.length; i<len; ++i) { 
     564            list.appendChild(this.write_wmc_Layer(context.layersContext[i])); 
    603565        } 
    604566         
     
    608570    /** 
    609571     * Method: write_wmc_Layer 
    610      * Create a Layer node given a layer object. 
    611      * 
    612      * Parameters: 
    613      * layer - {<OpenLayers.Layer.WMS>} Layer object. 
     572     * Create a Layer node given a layer context object. 
     573     * 
     574     * Parameters: 
     575     * context - {Object} A layer context object.} 
    614576     * 
    615577     * Returns: 
    616578     * {Element} A WMC Layer element node. 
    617579     */ 
    618     write_wmc_Layer: function(layer) { 
     580    write_wmc_Layer: function(context) { 
    619581        var node = this.createElementDefaultNS( 
    620582            "Layer", null, { 
    621                 queryable: layer.queryable ? "1" : "0", 
    622                 hidden: layer.visibility ? "0" : "1" 
     583                queryable: context.queryable ? "1" : "0", 
     584                hidden: context.visibility ? "0" : "1" 
    623585            } 
    624586        ); 
    625587         
    626588        // required Server element 
    627         node.appendChild(this.write_wmc_Server(layer)); 
     589        node.appendChild(this.write_wmc_Server(context)); 
    628590 
    629591        // required Name element 
    630592        node.appendChild(this.createElementDefaultNS( 
    631             "Name", layer.params["LAYERS"] 
     593            "Name", context.name 
    632594        )); 
    633595         
    634596        // required Title element 
    635597        node.appendChild(this.createElementDefaultNS( 
    636             "Title", layer.name 
     598            "Title", context.title 
    637599        )); 
    638600 
    639601        // optional MetadataURL element 
    640         if (layer.metadataURL) { 
    641             node.appendChild(this.write_wmc_MetadataURL(layer)); 
     602        if (context.metadataURL) { 
     603            node.appendChild(this.write_wmc_MetadataURL(context.metadataURL)); 
    642604        } 
    643605         
     
    650612     * 
    651613     * Parameters: 
    652      * layer - {<OpenLayers.Layer.WMS>} A WMS layer. 
     614     * context - {Object} A layer context object. 
    653615     * 
    654616     * Returns: 
    655617     * {Element} A WMC Extension element (for a layer). 
    656618     */ 
    657     write_wmc_LayerExtension: function(layer) { 
     619    write_wmc_LayerExtension: function(context) { 
    658620        var node = this.createElementDefaultNS("Extension"); 
    659621         
    660         var bounds = layer.maxExtent; 
     622        var bounds = context.maxExtent; 
    661623        var maxExtent = this.createElementNS( 
    662624            this.namespaces.ol, "ol:maxExtent" 
     
    670632        node.appendChild(maxExtent); 
    671633         
    672         var param = layer.params["TRANSPARENT"]; 
    673         if(param) { 
    674             var trans = this.createElementNS( 
    675                 this.namespaces.ol, "ol:transparent" 
    676             ); 
    677             trans.appendChild(this.createTextNode(param)); 
    678             node.appendChild(trans); 
    679         } 
    680          
    681634        var properties = [ 
    682             "numZoomLevels", "units", "isBaseLayer", 
     635            "transparent", "numZoomLevels", "units", "isBaseLayer", 
    683636            "opacity", "displayInLayerSwitcher", "singleTile" 
    684637        ]; 
    685638        var child; 
    686639        for(var i=0, len=properties.length; i<len; ++i) { 
    687             child = this.createOLPropertyNode(layer, properties[i]); 
     640            child = this.createOLPropertyNode(context, properties[i]); 
    688641            if(child) { 
    689642                node.appendChild(child); 
     
    717670    /** 
    718671     * Method: write_wmc_Server 
    719      * Create a Server node given a layer object. 
    720      * 
    721      * Parameters: 
    722      * layer - {<OpenLayers.Layer.WMS>} Layer object. 
     672     * Create a Server node given a layer context object. 
     673     * 
     674     * Parameters: 
     675     * context - {Object} Layer context object. 
    723676     * 
    724677     * Returns: 
    725678     * {Element} A WMC Server element node. 
    726679     */ 
    727     write_wmc_Server: function(layer) { 
     680    write_wmc_Server: function(context) { 
    728681        var node = this.createElementDefaultNS("Server"); 
    729682        this.setAttributes(node, { 
    730683            service: "OGC:WMS", 
    731             version: layer.params["VERSION"] 
     684            version: context.version 
    732685        }); 
    733686         
    734687        // required OnlineResource element 
    735         node.appendChild(this.write_wmc_OnlineResource(layer.url)); 
     688        node.appendChild(this.write_wmc_OnlineResource(context.url)); 
    736689         
    737690        return node; 
     
    740693    /** 
    741694     * Method: write_wmc_MetadataURL 
    742      * Create a MetadataURL node given a layer object. 
    743      * 
    744      * Parameters: 
    745      * layer - {<OpenLayers.Layer.WMS>} Layer object. 
     695     * Create a MetadataURL node given a metadataURL string. 
     696     * 
     697     * Parameters: 
     698     * metadataURL - {String} MetadataURL string value. 
    746699     * 
    747700     * Returns: 
    748701     * {Element} A WMC metadataURL element node. 
    749702     */ 
    750     write_wmc_MetadataURL: function(layer) { 
     703    write_wmc_MetadataURL: function(metadataURL) { 
    751704        var node = this.createElementDefaultNS("MetadataURL"); 
    752705 
    753706        // required OnlineResource element 
    754         node.appendChild(this.write_wmc_OnlineResource(layer.metadataURL)); 
     707        node.appendChild(this.write_wmc_OnlineResource(metadataURL)); 
    755708 
    756709        return node; 
     
    759712    /** 
    760713     * Method: write_wmc_FormatList 
    761      * Create a FormatList node given a layer. 
    762      * 
    763      * Parameters: 
    764      * layer - {<OpenLayers.Layer.WMS>} Layer object. 
     714     * Create a FormatList node given a layer context. 
     715     * 
     716     * Parameters: 
     717     * context - {Object} Layer context object. 
    765718     * 
    766719     * Returns: 
    767720     * {Element} A WMC FormatList element node. 
    768721     */ 
    769     write_wmc_FormatList: function(layer) { 
     722    write_wmc_FormatList: function(context) { 
    770723        var node = this.createElementDefaultNS("FormatList"); 
    771         node.appendChild(this.createElementDefaultNS( 
    772             "Format", layer.params["FORMAT"], {current: "1"} 
    773         )); 
     724        for (var i=0, len=context.formats.length; i<len; i++) { 
     725            var format = context.formats[i]; 
     726            node.appendChild(this.createElementDefaultNS( 
     727                "Format", 
     728                format.value, 
     729                (format.current && format.current == true) ? 
     730                    {current: "1"} : null 
     731            )); 
     732        } 
    774733 
    775734        return node; 
     
    778737    /** 
    779738     * Method: write_wmc_StyleList 
    780      * Create a StyleList node given a layer. 
    781      * 
    782      * Parameters: 
    783      * layer - {<OpenLayers.Layer.WMS>} Layer object. 
     739     * Create a StyleList node given a layer context. 
     740     * 
     741     * Parameters: 
     742     * context - {Object} Layer context object. 
    784743     * 
    785744     * Returns: 
     
    788747    write_wmc_StyleList: function(layer) { 
    789748        var node = this.createElementDefaultNS("StyleList"); 
    790         var style = this.createElementDefaultNS( 
    791             "Style", null, {current: "1"} 
    792         ); 
    793          
    794         // Style can come from one of three places (prioritized as below): 
    795         // 1) an SLD parameter 
    796         // 2) and SLD_BODY parameter 
    797         // 3) the STYLES parameter 
    798          
    799         if(layer.params["SLD"]) { 
    800             // create link from SLD parameter 
    801             var sld = this.createElementDefaultNS("SLD"); 
    802             var link = this.write_wmc_OnlineResource(layer.params["SLD"]); 
    803             sld.appendChild(link); 
    804             style.appendChild(sld); 
    805         } else if(layer.params["SLD_BODY"]) { 
    806             // include sld fragment from SLD_BODY parameter 
    807             var sld = this.createElementDefaultNS("SLD"); 
    808             var body = layer.params["SLD_BODY"]; 
    809             // read in body as xml doc - assume proper namespace declarations 
    810             var doc = OpenLayers.Format.XML.prototype.read.apply(this, [body]); 
    811             // append to StyledLayerDescriptor node 
    812             var imported = doc.documentElement; 
    813             if(sld.ownerDocument && sld.ownerDocument.importNode) { 
    814                 imported = sld.ownerDocument.importNode(imported, true); 
     749 
     750        var styles = layer.styles; 
     751        if (styles && styles instanceof Array) { 
     752            var sld; 
     753            for (var i=0, len=styles.length; i<len; i++) { 
     754                var s = styles[i]; 
     755                // three style types to consider 
     756                // [1] linked SLD 
     757                // [2] inline SLD 
     758                // [3] named style 
     759                // running child nodes always gets name, optionally gets href or body 
     760                var style = this.createElementDefaultNS( 
     761                    "Style", 
     762                    null, 
     763                    (s.current && s.current == true) ? 
     764                    {current: "1"} : null 
     765                ); 
     766                if(s.href) { // [1] 
     767                    sld = this.createElementDefaultNS("SLD"); 
     768                    var link = this.write_wmc_OnlineResource(s.href); 
     769                    sld.appendChild(link); 
     770                    // Name is required. 
     771                    sld.appendChild(this.createElementDefaultNS("Name", s.name)); 
     772                    // Title is optionnal. 
     773                    if (s.title) { 
     774                        sld.appendChild(this.createElementDefaultNS("Title", s.title)); 
     775                    } 
     776                    style.appendChild(sld); 
     777                } else if(s.body) { // [2] 
     778                    sld = this.createElementDefaultNS("SLD"); 
     779                    // read in body as xml doc - assume proper namespace declarations 
     780                    var doc = OpenLayers.Format.XML.prototype.read.apply(this, [s.body]); 
     781                    // append to StyledLayerDescriptor node 
     782                    var imported = doc.documentElement; 
     783                    if(sld.ownerDocument && sld.ownerDocument.importNode) { 
     784                        imported = sld.ownerDocument.importNode(imported, true); 
     785                    } 
     786                    sld.appendChild(imported); 
     787                    // Name is required. 
     788                    sld.appendChild(this.createElementDefaultNS("Name", s.name)); 
     789                    // Title is optionnal. 
     790                    if (s.title) { 
     791                        sld.appendChild(this.createElementDefaultNS("Title", s.title)); 
     792                    } 
     793                    style.appendChild(sld);             
     794                } else { // [3] 
     795                    // both Name and Title are required. 
     796                    style.appendChild(this.createElementDefaultNS("Name", s.name)); 
     797                    style.appendChild(this.createElementDefaultNS("Title", s.title)); 
     798                    // Abstract is optionnal 
     799                    if (s['abstract']) { // abstract is a js keyword 
     800                        style.appendChild(this.createElementDefaultNS( 
     801                            "Abstract", s['abstract'] 
     802                        )); 
     803                    } 
     804                } 
     805                node.appendChild(style); 
    815806            } 
    816             sld.appendChild(imported); 
    817             style.appendChild(sld);             
    818         } else { 
    819             // use name(s) from STYLES parameter 
    820             var name = layer.params["STYLES"] ? 
    821                 layer.params["STYLES"] : this.defaultStyleName; 
    822              
    823             style.appendChild(this.createElementDefaultNS("Name", name)); 
    824             style.appendChild(this.createElementDefaultNS( 
    825                 "Title", this.defaultStyleTitle 
    826             )); 
    827         } 
    828         node.appendChild(style); 
     807        } 
     808 
    829809        return node; 
    830810    }, 
  • trunk/openlayers/lib/OpenLayers/Format/WMC/v1_0_0.js

    r9614 r9733  
    4747    /** 
    4848     * Method: write_wmc_Layer 
    49      * Create a Layer node given a layer object. 
     49     * Create a Layer node given a layer context object. This method adds 
     50     *     elements specific to version 1.0.0. 
    5051     * 
    5152     * Parameters: 
    52      * layer - {<OpenLayers.Layer.WMS>} Layer object. 
     53     * context - {Object} A layer context object.} 
    5354     * 
    5455     * Returns: 
    5556     * {Element} A WMC Layer element node. 
    5657     */ 
    57     write_wmc_Layer: function(layer) { 
     58    write_wmc_Layer: function(context) { 
    5859        var node = OpenLayers.Format.WMC.v1.prototype.write_wmc_Layer.apply( 
    59             this, [layer] 
     60            this, [context] 
    6061        ); 
    6162     
    6263        // optional FormatList element 
    63         node.appendChild(this.write_wmc_FormatList(layer)); 
     64        node.appendChild(this.write_wmc_FormatList(context)); 
    6465 
    6566        // optional StyleList element 
    66         node.appendChild(this.write_wmc_StyleList(layer)); 
     67        node.appendChild(this.write_wmc_StyleList(context)); 
    6768         
    6869        // OpenLayers specific properties go in an Extension element 
    69         node.appendChild(this.write_wmc_LayerExtension(layer)); 
     70        node.appendChild(this.write_wmc_LayerExtension(context)); 
    7071    },     
    7172 
  • trunk/openlayers/lib/OpenLayers/Format/WMC/v1_1_0.js

    r9703 r9733  
    5454     * 
    5555     * Parameters: 
    56      * layerInfo - {Object} An object representing a layer. 
     56     * layerContext - {Object} An object representing a layer. 
    5757     * node - {Element} An element node. 
    5858     */ 
    59     read_sld_MinScaleDenominator: function(layerInfo, node) { 
    60         layerInfo.options.maxScale = this.getChildValue(node); 
     59    read_sld_MinScaleDenominator: function(layerContext, node) { 
     60        layerContext.maxScale = this.getChildValue(node); 
    6161    }, 
    6262 
     
    6666     * 
    6767     * Parameters: 
    68      * layerInfo - {Object} An object representing a layer. 
     68     * layerContext - {Object} An object representing a layer. 
    6969     * node - {Element} An element node. 
    7070     */ 
    71     read_sld_MaxScaleDenominator: function(layerInfo, node) { 
    72         layerInfo.options.minScale = this.getChildValue(node); 
     71    read_sld_MaxScaleDenominator: function(layerContext, node) { 
     72        layerContext.minScale = this.getChildValue(node); 
    7373    }, 
    7474 
    7575    /** 
    7676     * Method: write_wmc_Layer 
    77      * Create a Layer node given a layer object.  This method adds elements 
    78      *     specific to version 1.1.0. 
     77     * Create a Layer node given a layer context object. This method adds 
     78     *     elements specific to version 1.1.0. 
    7979     * 
    8080     * Parameters: 
    81      * layer - {<OpenLayers.Layer.WMS>} Layer object. 
     81     * context - {Object} A layer context object.} 
    8282     * 
    8383     * Returns: 
    8484     * {Element} A WMC Layer element node. 
    8585     */ 
    86     write_wmc_Layer: function(layer) { 
     86    write_wmc_Layer: function(context) { 
    8787        var node = OpenLayers.Format.WMC.v1.prototype.write_wmc_Layer.apply( 
    88             this, [layer] 
     88            this, [context] 
    8989        ); 
    9090         
    9191        // min/max scale denominator elements go before the 4th element in v1 
    92         if(layer.options.resolutions || layer.options.scales || 
    93            layer.options.minResolution || layer.options.maxScale) { 
     92        if(context.maxScale) { 
    9493            var minSD = this.createElementNS( 
    9594                this.namespaces.sld, "sld:MinScaleDenominator" 
    9695            ); 
    97             minSD.appendChild(this.createTextNode(layer.maxScale.toPrecision(16))); 
     96            minSD.appendChild(this.createTextNode(context.maxScale.toPrecision(16))); 
    9897            node.appendChild(minSD); 
    9998        } 
    10099         
    101         if(layer.options.resolutions || layer.options.scales || 
    102            layer.options.maxResolution || layer.options.minScale) { 
     100        if(context.minScale) { 
    103101            var maxSD = this.createElementNS( 
    104102                this.namespaces.sld, "sld:MaxScaleDenominator" 
    105103            ); 
    106             maxSD.appendChild(this.createTextNode(layer.minScale.toPrecision(16))); 
     104            maxSD.appendChild(this.createTextNode(context.minScale.toPrecision(16))); 
    107105            node.appendChild(maxSD); 
    108106        } 
    109107 
    110108        // optional FormatList element 
    111         node.appendChild(this.write_wmc_FormatList(layer)); 
     109        node.appendChild(this.write_wmc_FormatList(context)); 
    112110 
    113111        // optional StyleList element 
    114         node.appendChild(this.write_wmc_StyleList(layer)); 
     112        node.appendChild(this.write_wmc_StyleList(context)); 
    115113         
    116114        // OpenLayers specific properties go in an Extension element 
    117         node.appendChild(this.write_wmc_LayerExtension(layer)); 
     115        node.appendChild(this.write_wmc_LayerExtension(context)); 
    118116         
    119117        return node; 
  • trunk/openlayers/tests/Format/WMC/v1.html

    r6721 r9733  
    77        t.plan(3); 
    88         
    9         var layer, got, expected; 
    10          
    11         var parser = new OpenLayers.Format.WMC.v1(); 
     9        var layer, layerContext, got, expected; 
     10         
     11        var format = new OpenLayers.Format.WMC(); 
     12        var parser = format.getParser("1"); 
    1213        var name = "test"; 
    1314        var url = "http://foo"; 
     
    1718            styles: "mystyle" 
    1819        }); 
    19         got = parser.write_wmc_StyleList(layer); 
     20        layerContext = format.layerToContext(layer); 
     21        got = parser.write_wmc_StyleList(layerContext); 
    2022        expected =  
    2123            "<StyleList xmlns='http://www.opengis.net/context'>" + 
     
    3234            sld: "http://linked.sld" 
    3335        }); 
    34         got = parser.write_wmc_StyleList(layer); 
     36        layerContext = format.layerToContext(layer); 
     37        got = parser.write_wmc_StyleList(layerContext); 
    3538        expected =  
    3639            "<StyleList xmlns='http://www.opengis.net/context'>" + 
     
    4043                                        "xlink:type='simple' " + 
    4144                                        "xlink:href='http://linked.sld' />" + 
     45                        "<Name></Name><Title>Default</Title>" + 
    4246                    "</SLD>" +  
    4347                "</Style>" + 
     
    7983        }); 
    8084         
    81         got = parser.write_wmc_StyleList(layer); 
     85        layerContext = format.layerToContext(layer); 
     86        got = parser.write_wmc_StyleList(layerContext); 
    8287        expected = 
    8388            "<StyleList xmlns='http://www.opengis.net/context'>" + 
     
    111116                            "</sld:NamedLayer>" + 
    112117                        "</sld:StyledLayerDescriptor>" + 
     118                        "<Name></Name><Title>Default</Title>" + 
    113119                    "</SLD>" + 
    114120                "</Style>" +  
     
    123129         
    124130        var xml = new OpenLayers.Format.XML(); 
    125         var parser = new OpenLayers.Format.WMC.v1(); 
    126         var node, text, layerInfo; 
     131        var format = new OpenLayers.Format.WMC(); 
     132        var parser = format.getParser("1"); 
     133        var node, text, layerContext, layer; 
    127134 
    128135        // test named style 
     
    134141            "</StyleList>"; 
    135142        node = xml.read(text).documentElement; 
    136         layerInfo = { 
    137             params: {}, 
     143        layerContext = { 
    138144            styles: [] 
    139145        }; 
    140         parser.read_wmc_StyleList(layerInfo, node); 
    141         t.eq(layerInfo.params.styles, "mystyle", "named style correctly read"); 
     146        parser.read_wmc_StyleList(layerContext, node); 
     147        layer = format.getLayerFromContext(layerContext); 
     148        t.eq(layer.params.STYLES, "mystyle", "named style correctly read"); 
    142149         
    143150        // test linked style 
     
    153160            "</StyleList>"; 
    154161        node = xml.read(text).documentElement; 
    155         layerInfo = { 
    156             params: {}, 
     162        layerContext = { 
    157163            styles: [] 
    158164        }; 
    159         parser.read_wmc_StyleList(layerInfo, node); 
    160         t.eq(layerInfo.params.sld, "http://linked.sld", "linked style correctly read");         
     165        parser.read_wmc_StyleList(layerContext, node); 
     166        layer = format.getLayerFromContext(layerContext); 
     167        t.eq(layer.params.SLD, "http://linked.sld", "linked style correctly read");         
    161168         
    162169        // test inline style 
     
    177184            "</StyleList>"; 
    178185        node = xml.read(text).documentElement; 
    179         layerInfo = { 
    180             params: {}, 
     186        layerContext = { 
    181187            styles: [] 
    182188        }; 
    183         parser.read_wmc_StyleList(layerInfo, node);         
     189        parser.read_wmc_StyleList(layerContext, node);         
     190        layer = format.getLayerFromContext(layerContext); 
    184191        var expected =  
    185192            "<sld:StyledLayerDescriptor version='1.0.0' " + 
     
    189196                "<foo xmlns='http://www.opengis.net/context'>bar<more/></foo>" +  
    190197            "</sld:StyledLayerDescriptor>"; 
    191         t.xml_eq(layerInfo.params.sld_body, expected, "inline style correctly read"); 
     198        t.xml_eq(layer.params.SLD_BODY, expected, "inline style correctly read"); 
    192199 
    193200    } 
  • trunk/openlayers/tests/Format/WMC/v1_1_0.html

    r9703 r9733  
    1313 
    1414        // direct construction of a parser for a unit test 
    15         var wmc = new OpenLayers.Format.WMC.v1_1_0(); 
    16         var sldNS = wmc.namespaces["sld"]; 
     15        var format = new OpenLayers.Format.WMC(); 
     16        var parser = format.getParser("1_1_0"); 
     17        var sldNS = parser.namespaces["sld"]; 
    1718 
    1819        // test that Min/MaxScaleDenominator is not written out when no 
     
    2223            {maxExtent: new OpenLayers.Bounds(1, 2, 3, 4)} 
    2324        ); 
    24         var node = wmc.write_wmc_Layer(layer); 
    25         var minList = wmc.getElementsByTagNameNS(node, sldNS, "MinScaleDenominator"); 
     25        var layerContext = format.layerToContext(layer); 
     26        var node = parser.write_wmc_Layer(layerContext); 
     27        var minList = parser.getElementsByTagNameNS(node, sldNS, "MinScaleDenominator"); 
    2628        t.eq(minList.length, 0, "(none) node not written with MinScaleDenominator"); 
    27         var maxList = wmc.getElementsByTagNameNS(node, sldNS, "MaxScaleDenominator"); 
     29        var maxList = parser.getElementsByTagNameNS(node, sldNS, "MaxScaleDenominator"); 
    2830        t.eq(maxList.length, 0, "(none) node not written with MaxScaleDenominator"); 
    2931 
     
    3638        layer.minScale = Math.random(); 
    3739        layer.maxScale = Math.random(); 
    38         sldNS = wmc.namespaces["sld"]; 
    39         node = wmc.write_wmc_Layer(layer); 
    40         minList = wmc.getElementsByTagNameNS(node, sldNS, "MinScaleDenominator"); 
     40        sldNS = parser.namespaces["sld"]; 
     41        layerContext = format.layerToContext(layer); 
     42        node = parser.write_wmc_Layer(layerContext); 
     43        minList = parser.getElementsByTagNameNS(node, sldNS, "MinScaleDenominator"); 
    4144        t.eq(minList.length, 1, "(resolutions) node written with MinScaleDenominator"); 
    42         t.eq(layer.maxScale.toPrecision(16), wmc.getChildValue(minList[0]), 
     45        t.eq(layer.maxScale.toPrecision(16), parser.getChildValue(minList[0]), 
    4346             "(resolutions) node written with correct MinScaleDenominator value"); 
    44         maxList = wmc.getElementsByTagNameNS(node, sldNS, "MaxScaleDenominator"); 
     47        maxList = parser.getElementsByTagNameNS(node, sldNS, "MaxScaleDenominator"); 
    4548        t.eq(maxList.length, 1, "(resolutions) node written with MaxScaleDenominator"); 
    46         t.eq(layer.minScale.toPrecision(16), wmc.getChildValue(maxList[0]), 
     49        t.eq(layer.minScale.toPrecision(16), parser.getChildValue(maxList[0]), 
    4750             "(resolutions) node written with correct MaxScaleDenominator value"); 
    4851 
     
    5356        layer.minScale = Math.random(); 
    5457        layer.maxScale = Math.random(); 
    55         node = wmc.write_wmc_Layer(layer); 
    56         minList = wmc.getElementsByTagNameNS(node, sldNS, "MinScaleDenominator"); 
     58        layerContext = format.layerToContext(layer); 
     59        node = parser.write_wmc_Layer(layerContext); 
     60        minList = parser.getElementsByTagNameNS(node, sldNS, "MinScaleDenominator"); 
    5761        var f = new OpenLayers.Format.XML(); 
    5862        t.eq(minList.length, 1, "(scales) node written with MinScaleDenominator"); 
    59         t.eq(layer.maxScale.toPrecision(16), wmc.getChildValue(minList[0]), 
     63        t.eq(layer.maxScale.toPrecision(16), parser.getChildValue(minList[0]), 
    6064             "(scales) node written with correct MinScaleDenominator value"); 
    61         maxList = wmc.getElementsByTagNameNS(node, sldNS, "MaxScaleDenominator"); 
     65        maxList = parser.getElementsByTagNameNS(node, sldNS, "MaxScaleDenominator"); 
    6266        t.eq(maxList.length, 1, "(scales) node written with MaxScaleDenominator"); 
    63         t.eq(layer.minScale.toPrecision(16), wmc.getChildValue(maxList[0]), 
     67        t.eq(layer.minScale.toPrecision(16), parser.getChildValue(maxList[0]), 
    6468             "(scales) node written with correct MaxScaleDenominator value"); 
    6569 
    6670        layer.metadataURL = 'http://foo'; 
    67         node = wmc.write_wmc_Layer(layer); 
     71        layerContext = format.layerToContext(layer); 
     72        node = parser.write_wmc_Layer(layerContext); 
    6873        t.eq(node.childNodes[3].localName || node.childNodes[3].nodeName.split(":").pop(), 
    6974            'MetadataURL', "MinScaleDenominator is written after MetadataURL, so third node should be MetadataURL");