Changeset 9733
- Timestamp:
- 10/08/09 17:24:54 (11 months ago)
- Location:
- trunk/openlayers
- Files:
-
- 6 modified
-
lib/OpenLayers/Format/WMC.js (modified) (5 diffs)
-
lib/OpenLayers/Format/WMC/v1.js (modified) (26 diffs)
-
lib/OpenLayers/Format/WMC/v1_0_0.js (modified) (1 diff)
-
lib/OpenLayers/Format/WMC/v1_1_0.js (modified) (2 diffs)
-
tests/Format/WMC/v1.html (modified) (11 diffs)
-
tests/Format/WMC/v1_1_0.html (modified) (4 diffs)
Legend:
- Unmodified
- Added
- Removed
-
trunk/openlayers/lib/OpenLayers/Format/WMC.js
r8922 r9733 87 87 if(!version) { 88 88 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); 104 92 var map; 105 if(options .map) {93 if(options && options.map) { 106 94 this.context = context; 107 95 if(options.map instanceof OpenLayers.Map) { … … 116 104 return map; 117 105 }, 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 }, 118 227 119 228 /** … … 134 243 projection: context.projection 135 244 }); 136 map.addLayers( context.layers);245 map.addLayers(this.getLayersFromContext(context.layersContext)); 137 246 map.setCenter( 138 247 context.bounds.getCenterLonLat(), … … 154 263 */ 155 264 mergeContextToMap: function(context, map) { 156 map.addLayers( context.layers);265 map.addLayers(this.getLayersFromContext(context.layersContext)); 157 266 return map; 158 267 }, … … 170 279 */ 171 280 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; 172 355 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 } 209 382 return context; 210 383 }, -
trunk/openlayers/lib/OpenLayers/Format/WMC/v1.js
r9703 r9733 158 158 */ 159 159 read_wmc_LayerList: function(context, node) { 160 context.layers = []; 160 // layersContext is an array containing info for each layer 161 context.layersContext = []; 161 162 this.runChildNodes(context, node); 162 163 }, … … 166 167 */ 167 168 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"), 175 172 formats: [], 176 173 styles: [] 177 174 }; 178 this.runChildNodes(layerInfo, node); 175 176 this.runChildNodes(layerContext, node); 179 177 // 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); 209 179 }, 210 180 … … 219 189 * Method: read_ol_units 220 190 */ 221 read_ol_units: function(layer Info, node) {222 layer Info.options.units = this.getChildValue(node);191 read_ol_units: function(layerContext, node) { 192 layerContext.units = this.getChildValue(node); 223 193 }, 224 194 … … 237 207 * Method: read_ol_transparent 238 208 */ 239 read_ol_transparent: function(layer Info, node) {240 layer Info.params.transparent = this.getChildValue(node);209 read_ol_transparent: function(layerContext, node) { 210 layerContext.transparent = this.getChildValue(node); 241 211 }, 242 212 … … 244 214 * Method: read_ol_numZoomLevels 245 215 */ 246 read_ol_numZoomLevels: function(layer Info, node) {247 layer Info.options.numZoomLevels = parseInt(this.getChildValue(node));216 read_ol_numZoomLevels: function(layerContext, node) { 217 layerContext.numZoomLevels = parseInt(this.getChildValue(node)); 248 218 }, 249 219 … … 251 221 * Method: read_ol_opacity 252 222 */ 253 read_ol_opacity: function(layer Info, node) {254 layer Info.options.opacity = parseFloat(this.getChildValue(node));223 read_ol_opacity: function(layerContext, node) { 224 layerContext.opacity = parseFloat(this.getChildValue(node)); 255 225 }, 256 226 … … 258 228 * Method: read_ol_singleTile 259 229 */ 260 read_ol_singleTile: function(layer Info, node) {261 layer Info.options.singleTile = (this.getChildValue(node) == "true");230 read_ol_singleTile: function(layerContext, node) { 231 layerContext.singleTile = (this.getChildValue(node) == "true"); 262 232 }, 263 233 … … 265 235 * Method: read_ol_isBaseLayer 266 236 */ 267 read_ol_isBaseLayer: function(layer Info, node) {268 layer Info.options.isBaseLayer = (this.getChildValue(node) == "true");237 read_ol_isBaseLayer: function(layerContext, node) { 238 layerContext.isBaseLayer = (this.getChildValue(node) == "true"); 269 239 }, 270 240 … … 272 242 * Method: read_ol_displayInLayerSwitcher 273 243 */ 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"); 277 246 }, 278 247 … … 280 249 * Method: read_wmc_Server 281 250 */ 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; 285 259 }, 286 260 … … 288 262 * Method: read_wmc_FormatList 289 263 */ 290 read_wmc_FormatList: function(layer Info, node) {291 this.runChildNodes(layer Info, node);264 read_wmc_FormatList: function(layerContext, node) { 265 this.runChildNodes(layerContext, node); 292 266 }, 293 267 … … 295 269 * Method: read_wmc_Format 296 270 */ 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 }; 300 275 if(node.getAttribute("current") == "1") { 301 layerInfo.params.format = format; 302 } 276 format.current = true; 277 } 278 layerContext.formats.push(format); 303 279 }, 304 280 … … 306 282 * Method: read_wmc_StyleList 307 283 */ 308 read_wmc_StyleList: function(layer Info, node) {309 this.runChildNodes(layer Info, node);284 read_wmc_StyleList: function(layerContext, node) { 285 this.runChildNodes(layerContext, node); 310 286 }, 311 287 … … 313 289 * Method: read_wmc_Style 314 290 */ 315 read_wmc_Style: function(layer Info, node) {291 read_wmc_Style: function(layerContext, node) { 316 292 var style = {}; 317 293 this.runChildNodes(style, node); 318 294 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); 333 298 }, 334 299 … … 381 346 * Method: read_wmc_MetadataURL 382 347 */ 383 read_wmc_MetadataURL: function(layer Info, node) {348 read_wmc_MetadataURL: function(layerContext, node) { 384 349 var metadataURL = {}; 385 350 var links = node.getElementsByTagName("OnlineResource"); … … 387 352 this.read_wmc_OnlineResource(metadataURL, links[0]); 388 353 } 389 layer Info.options.metadataURL = metadataURL.href;354 layerContext.metadataURL = metadataURL.href; 390 355 391 356 }, … … 401 366 }, 402 367 368 //FIXME: LatLonBoundingBox is not in spec 403 369 /** 404 370 * Method: read_wmc_LatLonBoundingBox 405 371 */ 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 //}, 414 380 415 381 /** … … 595 561 var list = this.createElementDefaultNS("LayerList"); 596 562 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])); 603 565 } 604 566 … … 608 570 /** 609 571 * 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.} 614 576 * 615 577 * Returns: 616 578 * {Element} A WMC Layer element node. 617 579 */ 618 write_wmc_Layer: function( layer) {580 write_wmc_Layer: function(context) { 619 581 var node = this.createElementDefaultNS( 620 582 "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" 623 585 } 624 586 ); 625 587 626 588 // required Server element 627 node.appendChild(this.write_wmc_Server( layer));589 node.appendChild(this.write_wmc_Server(context)); 628 590 629 591 // required Name element 630 592 node.appendChild(this.createElementDefaultNS( 631 "Name", layer.params["LAYERS"]593 "Name", context.name 632 594 )); 633 595 634 596 // required Title element 635 597 node.appendChild(this.createElementDefaultNS( 636 "Title", layer.name598 "Title", context.title 637 599 )); 638 600 639 601 // 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)); 642 604 } 643 605 … … 650 612 * 651 613 * Parameters: 652 * layer - {<OpenLayers.Layer.WMS>} A WMS layer.614 * context - {Object} A layer context object. 653 615 * 654 616 * Returns: 655 617 * {Element} A WMC Extension element (for a layer). 656 618 */ 657 write_wmc_LayerExtension: function( layer) {619 write_wmc_LayerExtension: function(context) { 658 620 var node = this.createElementDefaultNS("Extension"); 659 621 660 var bounds = layer.maxExtent;622 var bounds = context.maxExtent; 661 623 var maxExtent = this.createElementNS( 662 624 this.namespaces.ol, "ol:maxExtent" … … 670 632 node.appendChild(maxExtent); 671 633 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 681 634 var properties = [ 682 " numZoomLevels", "units", "isBaseLayer",635 "transparent", "numZoomLevels", "units", "isBaseLayer", 683 636 "opacity", "displayInLayerSwitcher", "singleTile" 684 637 ]; 685 638 var child; 686 639 for(var i=0, len=properties.length; i<len; ++i) { 687 child = this.createOLPropertyNode( layer, properties[i]);640 child = this.createOLPropertyNode(context, properties[i]); 688 641 if(child) { 689 642 node.appendChild(child); … … 717 670 /** 718 671 * Method: write_wmc_Server 719 * Create a Server node given a layer object.720 * 721 * Parameters: 722 * layer - {<OpenLayers.Layer.WMS>} Layerobject.672 * Create a Server node given a layer context object. 673 * 674 * Parameters: 675 * context - {Object} Layer context object. 723 676 * 724 677 * Returns: 725 678 * {Element} A WMC Server element node. 726 679 */ 727 write_wmc_Server: function( layer) {680 write_wmc_Server: function(context) { 728 681 var node = this.createElementDefaultNS("Server"); 729 682 this.setAttributes(node, { 730 683 service: "OGC:WMS", 731 version: layer.params["VERSION"]684 version: context.version 732 685 }); 733 686 734 687 // required OnlineResource element 735 node.appendChild(this.write_wmc_OnlineResource( layer.url));688 node.appendChild(this.write_wmc_OnlineResource(context.url)); 736 689 737 690 return node; … … 740 693 /** 741 694 * 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. 746 699 * 747 700 * Returns: 748 701 * {Element} A WMC metadataURL element node. 749 702 */ 750 write_wmc_MetadataURL: function( layer) {703 write_wmc_MetadataURL: function(metadataURL) { 751 704 var node = this.createElementDefaultNS("MetadataURL"); 752 705 753 706 // required OnlineResource element 754 node.appendChild(this.write_wmc_OnlineResource( layer.metadataURL));707 node.appendChild(this.write_wmc_OnlineResource(metadataURL)); 755 708 756 709 return node; … … 759 712 /** 760 713 * Method: write_wmc_FormatList 761 * Create a FormatList node given a layer .762 * 763 * Parameters: 764 * layer - {<OpenLayers.Layer.WMS>} Layerobject.714 * Create a FormatList node given a layer context. 715 * 716 * Parameters: 717 * context - {Object} Layer context object. 765 718 * 766 719 * Returns: 767 720 * {Element} A WMC FormatList element node. 768 721 */ 769 write_wmc_FormatList: function( layer) {722 write_wmc_FormatList: function(context) { 770 723 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 } 774 733 775 734 return node; … … 778 737 /** 779 738 * Method: write_wmc_StyleList 780 * Create a StyleList node given a layer .781 * 782 * Parameters: 783 * layer - {<OpenLayers.Layer.WMS>} Layerobject.739 * Create a StyleList node given a layer context. 740 * 741 * Parameters: 742 * context - {Object} Layer context object. 784 743 * 785 744 * Returns: … … 788 747 write_wmc_StyleList: function(layer) { 789 748 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); 815 806 } 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 829 809 return node; 830 810 }, -
trunk/openlayers/lib/OpenLayers/Format/WMC/v1_0_0.js
r9614 r9733 47 47 /** 48 48 * 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. 50 51 * 51 52 * Parameters: 52 * layer - {<OpenLayers.Layer.WMS>} Layer object.53 * context - {Object} A layer context object.} 53 54 * 54 55 * Returns: 55 56 * {Element} A WMC Layer element node. 56 57 */ 57 write_wmc_Layer: function( layer) {58 write_wmc_Layer: function(context) { 58 59 var node = OpenLayers.Format.WMC.v1.prototype.write_wmc_Layer.apply( 59 this, [ layer]60 this, [context] 60 61 ); 61 62 62 63 // optional FormatList element 63 node.appendChild(this.write_wmc_FormatList( layer));64 node.appendChild(this.write_wmc_FormatList(context)); 64 65 65 66 // optional StyleList element 66 node.appendChild(this.write_wmc_StyleList( layer));67 node.appendChild(this.write_wmc_StyleList(context)); 67 68 68 69 // OpenLayers specific properties go in an Extension element 69 node.appendChild(this.write_wmc_LayerExtension( layer));70 node.appendChild(this.write_wmc_LayerExtension(context)); 70 71 }, 71 72 -
trunk/openlayers/lib/OpenLayers/Format/WMC/v1_1_0.js
r9703 r9733 54 54 * 55 55 * Parameters: 56 * layer Info- {Object} An object representing a layer.56 * layerContext - {Object} An object representing a layer. 57 57 * node - {Element} An element node. 58 58 */ 59 read_sld_MinScaleDenominator: function(layer Info, node) {60 layer Info.options.maxScale = this.getChildValue(node);59 read_sld_MinScaleDenominator: function(layerContext, node) { 60 layerContext.maxScale = this.getChildValue(node); 61 61 }, 62 62 … … 66 66 * 67 67 * Parameters: 68 * layer Info- {Object} An object representing a layer.68 * layerContext - {Object} An object representing a layer. 69 69 * node - {Element} An element node. 70 70 */ 71 read_sld_MaxScaleDenominator: function(layer Info, node) {72 layer Info.options.minScale = this.getChildValue(node);71 read_sld_MaxScaleDenominator: function(layerContext, node) { 72 layerContext.minScale = this.getChildValue(node); 73 73 }, 74 74 75 75 /** 76 76 * Method: write_wmc_Layer 77 * Create a Layer node given a layer object. This method adds elements78 * 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. 79 79 * 80 80 * Parameters: 81 * layer - {<OpenLayers.Layer.WMS>} Layer object.81 * context - {Object} A layer context object.} 82 82 * 83 83 * Returns: 84 84 * {Element} A WMC Layer element node. 85 85 */ 86 write_wmc_Layer: function( layer) {86 write_wmc_Layer: function(context) { 87 87 var node = OpenLayers.Format.WMC.v1.prototype.write_wmc_Layer.apply( 88 this, [ layer]88 this, [context] 89 89 ); 90 90 91 91 // 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) { 94 93 var minSD = this.createElementNS( 95 94 this.namespaces.sld, "sld:MinScaleDenominator" 96 95 ); 97 minSD.appendChild(this.createTextNode( layer.maxScale.toPrecision(16)));96 minSD.appendChild(this.createTextNode(context.maxScale.toPrecision(16))); 98 97 node.appendChild(minSD); 99 98 } 100 99 101 if(layer.options.resolutions || layer.options.scales || 102 layer.options.maxResolution || layer.options.minScale) { 100 if(context.minScale) { 103 101 var maxSD = this.createElementNS( 104 102 this.namespaces.sld, "sld:MaxScaleDenominator" 105 103 ); 106 maxSD.appendChild(this.createTextNode( layer.minScale.toPrecision(16)));104 maxSD.appendChild(this.createTextNode(context.minScale.toPrecision(16))); 107 105 node.appendChild(maxSD); 108 106 } 109 107 110 108 // optional FormatList element 111 node.appendChild(this.write_wmc_FormatList( layer));109 node.appendChild(this.write_wmc_FormatList(context)); 112 110 113 111 // optional StyleList element 114 node.appendChild(this.write_wmc_StyleList( layer));112 node.appendChild(this.write_wmc_StyleList(context)); 115 113 116 114 // OpenLayers specific properties go in an Extension element 117 node.appendChild(this.write_wmc_LayerExtension( layer));115 node.appendChild(this.write_wmc_LayerExtension(context)); 118 116 119 117 return node; -
trunk/openlayers/tests/Format/WMC/v1.html
r6721 r9733 7 7 t.plan(3); 8 8 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"); 12 13 var name = "test"; 13 14 var url = "http://foo"; … … 17 18 styles: "mystyle" 18 19 }); 19 got = parser.write_wmc_StyleList(layer); 20 layerContext = format.layerToContext(layer); 21 got = parser.write_wmc_StyleList(layerContext); 20 22 expected = 21 23 "<StyleList xmlns='http://www.opengis.net/context'>" + … … 32 34 sld: "http://linked.sld" 33 35 }); 34 got = parser.write_wmc_StyleList(layer); 36 layerContext = format.layerToContext(layer); 37 got = parser.write_wmc_StyleList(layerContext); 35 38 expected = 36 39 "<StyleList xmlns='http://www.opengis.net/context'>" + … … 40 43 "xlink:type='simple' " + 41 44 "xlink:href='http://linked.sld' />" + 45 "<Name></Name><Title>Default</Title>" + 42 46 "</SLD>" + 43 47 "</Style>" + … … 79 83 }); 80 84 81 got = parser.write_wmc_StyleList(layer); 85 layerContext = format.layerToContext(layer); 86 got = parser.write_wmc_StyleList(layerContext); 82 87 expected = 83 88 "<StyleList xmlns='http://www.opengis.net/context'>" + … … 111 116 "</sld:NamedLayer>" + 112 117 "</sld:StyledLayerDescriptor>" + 118 "<Name></Name><Title>Default</Title>" + 113 119 "</SLD>" + 114 120 "</Style>" + … … 123 129 124 130 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; 127 134 128 135 // test named style … … 134 141 "</StyleList>"; 135 142 node = xml.read(text).documentElement; 136 layerInfo = { 137 params: {}, 143 layerContext = { 138 144 styles: [] 139 145 }; 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"); 142 149 143 150 // test linked style … … 153 160 "</StyleList>"; 154 161 node = xml.read(text).documentElement; 155 layerInfo = { 156 params: {}, 162 layerContext = { 157 163 styles: [] 158 164 }; 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"); 161 168 162 169 // test inline style … … 177 184 "</StyleList>"; 178 185 node = xml.read(text).documentElement; 179 layerInfo = { 180 params: {}, 186 layerContext = { 181 187 styles: [] 182 188 }; 183 parser.read_wmc_StyleList(layerInfo, node); 189 parser.read_wmc_StyleList(layerContext, node); 190 layer = format.getLayerFromContext(layerContext); 184 191 var expected = 185 192 "<sld:StyledLayerDescriptor version='1.0.0' " + … … 189 196 "<foo xmlns='http://www.opengis.net/context'>bar<more/></foo>" + 190 197 "</sld:StyledLayerDescriptor>"; 191 t.xml_eq(layer Info.params.sld_body, expected, "inline style correctly read");198 t.xml_eq(layer.params.SLD_BODY, expected, "inline style correctly read"); 192 199 193 200 } -
trunk/openlayers/tests/Format/WMC/v1_1_0.html
r9703 r9733 13 13 14 14 // 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"]; 17 18 18 19 // test that Min/MaxScaleDenominator is not written out when no … … 22 23 {maxExtent: new OpenLayers.Bounds(1, 2, 3, 4)} 23 24 ); 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"); 26 28 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"); 28 30 t.eq(maxList.length, 0, "(none) node not written with MaxScaleDenominator"); 29 31 … … 36 38 layer.minScale = Math.random(); 37 39 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"); 41 44 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]), 43 46 "(resolutions) node written with correct MinScaleDenominator value"); 44 maxList = wmc.getElementsByTagNameNS(node, sldNS, "MaxScaleDenominator");47 maxList = parser.getElementsByTagNameNS(node, sldNS, "MaxScaleDenominator"); 45 48 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]), 47 50 "(resolutions) node written with correct MaxScaleDenominator value"); 48 51 … … 53 56 layer.minScale = Math.random(); 54 57 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"); 57 61 var f = new OpenLayers.Format.XML(); 58 62 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]), 60 64 "(scales) node written with correct MinScaleDenominator value"); 61 maxList = wmc.getElementsByTagNameNS(node, sldNS, "MaxScaleDenominator");65 maxList = parser.getElementsByTagNameNS(node, sldNS, "MaxScaleDenominator"); 62 66 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]), 64 68 "(scales) node written with correct MaxScaleDenominator value"); 65 69 66 70 layer.metadataURL = 'http://foo'; 67 node = wmc.write_wmc_Layer(layer); 71 layerContext = format.layerToContext(layer); 72 node = parser.write_wmc_Layer(layerContext); 68 73 t.eq(node.childNodes[3].localName || node.childNodes[3].nodeName.split(":").pop(), 69 74 'MetadataURL', "MinScaleDenominator is written after MetadataURL, so third node should be MetadataURL");
