addad namedLayersAsArray option to Format.SLD.v1. Patch by tschaub and

me, r=tschaub,me (closes #2005)


git-svn-id: http://svn.openlayers.org/trunk/openlayers@9140 dc9f47b5-9b13-0410-9fdd-eb0c1a62fdaf
This commit is contained in:
ahocevar
2009-03-27 08:39:15 +00:00
parent a9e087b5b9
commit 44ab482e89
3 changed files with 59 additions and 13 deletions
+11 -2
View File
@@ -34,6 +34,14 @@ OpenLayers.Format.SLD = OpenLayers.Class(OpenLayers.Format.XML, {
*/ */
version: null, version: null,
/**
* APIProperty: namedLayersAsArray
* {Boolean} Generate a namedLayers array. If false, the namedLayers
* property value will be an object keyed by layer name. Default is
* false.
*/
namedLayersAsArray: false,
/** /**
* Property: parser * Property: parser
* {Object} Instance of the versioned parser. Cached for multiple read and * {Object} Instance of the versioned parser. Cached for multiple read and
@@ -87,11 +95,12 @@ OpenLayers.Format.SLD = OpenLayers.Class(OpenLayers.Format.XML, {
* *
* Parameters: * Parameters:
* data - {String | DOMElement} Data to read. * data - {String | DOMElement} Data to read.
* options - {Object} Options for the reader.
* *
* Returns: * Returns:
* {Object} An object representing the SLD. * {Object} An object representing the SLD.
*/ */
read: function(data) { read: function(data, options) {
if(typeof data == "string") { if(typeof data == "string") {
data = OpenLayers.Format.XML.prototype.read.apply(this, [data]); data = OpenLayers.Format.XML.prototype.read.apply(this, [data]);
} }
@@ -113,7 +122,7 @@ OpenLayers.Format.SLD = OpenLayers.Class(OpenLayers.Format.XML, {
} }
this.parser = new format(this.options); this.parser = new format(this.options);
} }
var sld = this.parser.read(data); var sld = this.parser.read(data, options);
return sld; return sld;
}, },
+23 -5
View File
@@ -73,13 +73,20 @@ OpenLayers.Format.SLD.v1 = OpenLayers.Class(OpenLayers.Format.Filter.v1_0_0, {
* *
* Parameters: * Parameters:
* data - {DOMElement} An SLD document element. * data - {DOMElement} An SLD document element.
* options - {Object} Options for the reader.
*
* Valid options:
* namedLayersAsArray - {Boolean} Generate a namedLayers array. If false,
* the namedLayers property value will be an object keyed by layer name.
* Default is false.
* *
* Returns: * Returns:
* {Object} An object representing the SLD. * {Object} An object representing the SLD.
*/ */
read: function(data) { read: function(data, options) {
options = OpenLayers.Util.applyDefaults(options, this.options);
var sld = { var sld = {
namedLayers: {} namedLayers: options.namedLayersAsArray === true ? [] : {}
}; };
this.readChildNodes(data, sld); this.readChildNodes(data, sld);
return sld; return sld;
@@ -118,7 +125,11 @@ OpenLayers.Format.SLD.v1 = OpenLayers.Class(OpenLayers.Format.Filter.v1_0_0, {
for(var i=0, len=layer.userStyles.length; i<len; ++i) { for(var i=0, len=layer.userStyles.length; i<len; ++i) {
layer.userStyles[i].layerName = layer.name; layer.userStyles[i].layerName = layer.name;
} }
sld.namedLayers[layer.name] = layer; if(sld.namedLayers instanceof Array) {
sld.namedLayers.push(layer);
} else {
sld.namedLayers[layer.name] = layer;
}
}, },
"NamedStyle": function(node, layer) { "NamedStyle": function(node, layer) {
layer.namedStyles.push( layer.namedStyles.push(
@@ -435,8 +446,15 @@ OpenLayers.Format.SLD.v1 = OpenLayers.Class(OpenLayers.Format.Filter.v1_0_0, {
this.writeNode("Abstract", sld.description, root); this.writeNode("Abstract", sld.description, root);
} }
// add in named layers // add in named layers
for(var name in sld.namedLayers) { // allow namedLayers to be an array
this.writeNode("NamedLayer", sld.namedLayers[name], root); if(sld.namedLayers instanceof Array) {
for(var i=0, len=sld.namedLayers.length; i<len; ++i) {
this.writeNode("NamedLayer", sld.namedLayers[i], root);
}
} else {
for(var name in sld.namedLayers) {
this.writeNode("NamedLayer", sld.namedLayers[name], root);
}
} }
return root; return root;
}, },
+25 -6
View File
@@ -125,18 +125,32 @@
'</StyledLayerDescriptor>'; '</StyledLayerDescriptor>';
function test_read(t) { function test_read(t) {
t.plan(18); t.plan(21);
var parser = new OpenLayers.Format.SLD.v1_0_0();
var xml = new OpenLayers.Format.XML(); var xml = new OpenLayers.Format.XML();
var obj = parser.read(xml.read(sld)); var sldxml = xml.read(sld);
// test that format options are considered in read
var parser = new OpenLayers.Format.SLD({
version: "1.0.0",
namedLayersAsArray: true
});
var obj = parser.read(sldxml);
t.ok(obj.namedLayers instanceof Array, "namedLayersAsArray option for read works");
parser = new OpenLayers.Format.SLD.v1_0_0();
var obj = parser.read(sldxml, {namedLayersAsArray: true});
t.ok(obj.namedLayers instanceof Array, "namedLayersAsArray option for read works");
var arrayLen = obj.namedLayers.length;
var obj = parser.read(sldxml);
t.eq(typeof obj.namedLayers, "object", "read returns a namedLayers object by default");
// test the named layer count // test the named layer count
var count = 0; var count = 0;
for(var key in obj.namedLayers) { for(var key in obj.namedLayers) {
++count; ++count;
} }
t.eq(count, 2, "correct number of named layers"); t.eq(count, arrayLen, "number of named layers in array equals number of named layers in object");
var layer, style, rule; var layer, style, rule;
@@ -189,16 +203,21 @@
} }
function test_write(t) { function test_write(t) {
t.plan(2); t.plan(3);
// read first - testing that write produces the SLD aboce // read first - testing that write produces the SLD aboce
var parser = new OpenLayers.Format.SLD.v1_0_0(); var parser = new OpenLayers.Format.SLD.v1_0_0();
var xml = new OpenLayers.Format.XML(); var xml = new OpenLayers.Format.XML();
var obj = parser.read(xml.read(sld)); var sldxml = xml.read(sld);
var obj = parser.read(sldxml);
var node = parser.write(obj); var node = parser.write(obj);
t.xml_eq(node, sld, "SLD correctly written"); t.xml_eq(node, sld, "SLD correctly written");
obj = parser.read(sldxml, {namedLayersAsArray: true});
node = parser.write(obj);
t.xml_eq(node, sld, "SLD from namedLayers array correctly written");
// test that 0 fill opacity gets written // test that 0 fill opacity gets written
var symbolizer = { var symbolizer = {
fillColor: "red", fillColor: "red",