reassign writers instead of creating a different geometry instance. r=bartvde (closes #3407)

git-svn-id: http://svn.openlayers.org/trunk/openlayers@12171 dc9f47b5-9b13-0410-9fdd-eb0c1a62fdaf
This commit is contained in:
ahocevar
2011-07-15 14:07:39 +00:00
parent 6714640844
commit 46a10135d9
4 changed files with 37 additions and 29 deletions
+9 -6
View File
@@ -502,8 +502,9 @@ OpenLayers.Format.GML.Base = OpenLayers.Class(OpenLayers.Format.XML, {
}, },
"MultiPoint": function(geometry) { "MultiPoint": function(geometry) {
var node = this.createElementNSPlus("gml:MultiPoint"); var node = this.createElementNSPlus("gml:MultiPoint");
for(var i=0; i<geometry.components.length; ++i) { var components = geometry.components || [geometry];
this.writeNode("pointMember", geometry.components[i], node); for(var i=0, ii=components.length; i<ii; ++i) {
this.writeNode("pointMember", components[i], node);
} }
return node; return node;
}, },
@@ -514,8 +515,9 @@ OpenLayers.Format.GML.Base = OpenLayers.Class(OpenLayers.Format.XML, {
}, },
"MultiLineString": function(geometry) { "MultiLineString": function(geometry) {
var node = this.createElementNSPlus("gml:MultiLineString"); var node = this.createElementNSPlus("gml:MultiLineString");
for(var i=0; i<geometry.components.length; ++i) { var components = geometry.components || [geometry];
this.writeNode("lineStringMember", geometry.components[i], node); for(var i=0, ii=components.length; i<ii; ++i) {
this.writeNode("lineStringMember", components[i], node);
} }
return node; return node;
}, },
@@ -526,9 +528,10 @@ OpenLayers.Format.GML.Base = OpenLayers.Class(OpenLayers.Format.XML, {
}, },
"MultiPolygon": function(geometry) { "MultiPolygon": function(geometry) {
var node = this.createElementNSPlus("gml:MultiPolygon"); var node = this.createElementNSPlus("gml:MultiPolygon");
for(var i=0; i<geometry.components.length; ++i) { var components = geometry.components || [geometry];
for(var i=0, ii=components.length; i<ii; ++i) {
this.writeNode( this.writeNode(
"polygonMember", geometry.components[i], node "polygonMember", components[i], node
); );
} }
return node; return node;
+6 -4
View File
@@ -378,8 +378,9 @@ OpenLayers.Format.GML.v3 = OpenLayers.Class(OpenLayers.Format.GML.Base, {
}, },
"MultiCurve": function(geometry) { "MultiCurve": function(geometry) {
var node = this.createElementNSPlus("gml:MultiCurve"); var node = this.createElementNSPlus("gml:MultiCurve");
for(var i=0, len=geometry.components.length; i<len; ++i) { var components = geometry.components || [geometry];
this.writeNode("curveMember", geometry.components[i], node); for(var i=0, len=components.length; i<len; ++i) {
this.writeNode("curveMember", components[i], node);
} }
return node; return node;
}, },
@@ -394,8 +395,9 @@ OpenLayers.Format.GML.v3 = OpenLayers.Class(OpenLayers.Format.GML.Base, {
}, },
"MultiSurface": function(geometry) { "MultiSurface": function(geometry) {
var node = this.createElementNSPlus("gml:MultiSurface"); var node = this.createElementNSPlus("gml:MultiSurface");
for(var i=0, len=geometry.components.length; i<len; ++i) { var components = geometry.components || [geometry];
this.writeNode("surfaceMember", geometry.components[i], node); for(var i=0, len=components.length; i<len; ++i) {
this.writeNode("surfaceMember", components[i], node);
} }
return node; return node;
}, },
+19 -18
View File
@@ -71,7 +71,7 @@ OpenLayers.Format.WFST.v1 = OpenLayers.Class(OpenLayers.Format.XML, {
* {Object} Maps feature states to node names. * {Object} Maps feature states to node names.
*/ */
stateName: null, stateName: null,
/** /**
* Constructor: OpenLayers.Format.WFST.v1 * Constructor: OpenLayers.Format.WFST.v1
* Instances of this class are not created directly. Use the * Instances of this class are not created directly. Use the
@@ -241,42 +241,43 @@ OpenLayers.Format.WFST.v1 = OpenLayers.Class(OpenLayers.Format.XML, {
return node; return node;
}, },
"Transaction": function(obj) { "Transaction": function(obj) {
var options = obj && obj.options; obj = obj || {};
var options = obj.options || {};
var node = this.createElementNSPlus("wfs:Transaction", { var node = this.createElementNSPlus("wfs:Transaction", {
attributes: { attributes: {
service: "WFS", service: "WFS",
version: this.version, version: this.version,
handle: options && options.handle handle: options.handle
} }
}); });
var i, len; var i, len;
var features = obj && obj.features; var features = obj.features;
if(features) { if(features) {
var name, feature, geometry; // temporarily re-assigning geometry types
if (options.multi === true) {
OpenLayers.Util.extend(this.geometryTypes, {
"OpenLayers.Geometry.Point": "MultiPoint",
"OpenLayers.Geometry.LineString": (this.multiCurve === true) ? "MultiCurve": "MultiLineString",
"OpenLayers.Geometry.Polygon": (this.multiSurface === true) ? "MultiSurface" : "MultiPolygon"
});
}
var name, feature;
for(i=0, len=features.length; i<len; ++i) { for(i=0, len=features.length; i<len; ++i) {
feature = features[i]; feature = features[i];
name = this.stateName[feature.state]; name = this.stateName[feature.state];
if(name) { if(name) {
geometry = feature.geometry;
if (options && options.multi === true && geometry) {
var type = geometry.CLASS_NAME.split(".").pop();
if (type.indexOf("Multi") != 0) {
var Cls = OpenLayers.Geometry["Multi" + type];
if (Cls) {
feature = OpenLayers.Util.applyDefaults({
geometry: new Cls([geometry])
}, feature);
}
}
}
this.writeNode(name, { this.writeNode(name, {
feature: feature, feature: feature,
options: options options: options
}, node); }, node);
} }
} }
// switch back to original geometry types assignment
if (options.multi === true) {
this.setGeometryTypes();
}
} }
if (options && options.nativeElements) { if (options.nativeElements) {
for (i=0, len=options.nativeElements.length; i<len; ++i) { for (i=0, len=options.nativeElements.length; i<len; ++i) {
this.writeNode("wfs:Native", this.writeNode("wfs:Native",
options.nativeElements[i], node); options.nativeElements[i], node);
+3 -1
View File
@@ -176,7 +176,7 @@
} }
function test_write_multi(t) { function test_write_multi(t) {
t.plan(1); t.plan(2);
var format = new OpenLayers.Format.WFST({ var format = new OpenLayers.Format.WFST({
featureNS: "http://www.openplans.org/topp", featureNS: "http://www.openplans.org/topp",
featureType: "states", featureType: "states",
@@ -203,11 +203,13 @@
var features = [insertFeature, updateFeature]; var features = [insertFeature, updateFeature];
var expected = readXML("TransactionMulti"); var expected = readXML("TransactionMulti");
var geomTypes = OpenLayers.Util.extend({}, format.geometryTypes);
var got = format.writers["wfs"]["Transaction"].apply(format, [{ var got = format.writers["wfs"]["Transaction"].apply(format, [{
features: features, features: features,
options: {multi: true}} options: {multi: true}}
]); ]);
t.xml_eq(got, expected, "Transaction request with multi option created correctly"); t.xml_eq(got, expected, "Transaction request with multi option created correctly");
t.eq(format.geometryTypes, geomTypes, "geometry types unchanged after write with multi option");
} }
function readXML(id) { function readXML(id) {