From 84a8d8d1f6d22834d70e38fa7da6553dcc2c0800 Mon Sep 17 00:00:00 2001 From: ahocevar Date: Tue, 2 Oct 2012 14:35:05 +0200 Subject: [PATCH 1/5] Applying VersionedOGC pattern to WMSDescribeLayer format The WMSDescribeLayer format currently differs from other formats that inhreit from VersionedOGC by having an array instead of an object as return type. This especially bad since the VersionedOGC superclass sets a version property on the array. With this change, the WMSDescribeLayer format will also be compatible with GeoServer's new JSON response type for DescribeLayer - see http://sourceforge.net/mailarchive/message.php?msg_id=29912776. Another change included here is the removal of the WMSDescribeLayer format's getVersion hack, which was replaced by a generic fallback to less generic parsers, e.g. from a v1_1_1 parser to a v1_1 parser if v1_1_1 is not implemented. --- examples/WMSDescribeLayerParser.html | 9 ++++---- lib/OpenLayers/Format/WMSDescribeLayer.js | 22 ------------------- .../Format/WMSDescribeLayer/v1_1.js | 20 ++++++++++++----- lib/OpenLayers/Format/XML/VersionedOGC.js | 5 +++++ notes/2.13.md | 4 ++++ tests/Format/WMSDescribeLayer.html | 10 ++++----- 6 files changed, 34 insertions(+), 36 deletions(-) diff --git a/examples/WMSDescribeLayerParser.html b/examples/WMSDescribeLayerParser.html index d1c63e75a2..94be309295 100644 --- a/examples/WMSDescribeLayerParser.html +++ b/examples/WMSDescribeLayerParser.html @@ -12,11 +12,12 @@ format = new OpenLayers.Format.WMSDescribeLayer(); html = "
"; resp = format.read(req.responseText); - for(var i = 0; i < resp.length; i++) { - html += "Layer: typeName: "+ resp[i].typeName+","; + var layerDescriptions = resp.layerDescriptions; + for(var i = 0; i < layerDescriptions.length; i++) { + html += "Layer: typeName: "+layerDescriptions[i].typeName+","; html += "" } document.getElementById('output').innerHTML = html; diff --git a/lib/OpenLayers/Format/WMSDescribeLayer.js b/lib/OpenLayers/Format/WMSDescribeLayer.js index b382d3a882..e18ca83906 100644 --- a/lib/OpenLayers/Format/WMSDescribeLayer.js +++ b/lib/OpenLayers/Format/WMSDescribeLayer.js @@ -23,28 +23,6 @@ OpenLayers.Format.WMSDescribeLayer = OpenLayers.Class(OpenLayers.Format.XML.Vers */ defaultVersion: "1.1.1", - /** - * Method: getVersion - * Returns the version to use. Subclasses can override this function - * if a different version detection is needed. - * - * Parameters: - * root - {DOMElement} - * options - {Object} Optional configuration object. - * - * Returns: - * {String} The version to use. - */ - getVersion: function(root, options) { - var version = OpenLayers.Format.XML.VersionedOGC.prototype.getVersion.apply( - this, arguments); - // these are identical to us, but some WMS use 1.1.1 and some use 1.1.0 - if (version == "1.1.1" || version == "1.1.0") { - version = "1.1"; - } - return version; - }, - /** * Constructor: OpenLayers.Format.WMSDescribeLayer * Create a new parser for WMS DescribeLayer responses. diff --git a/lib/OpenLayers/Format/WMSDescribeLayer/v1_1.js b/lib/OpenLayers/Format/WMSDescribeLayer/v1_1.js index b2ac8cf28d..82b4ba58ce 100644 --- a/lib/OpenLayers/Format/WMSDescribeLayer/v1_1.js +++ b/lib/OpenLayers/Format/WMSDescribeLayer/v1_1.js @@ -45,10 +45,12 @@ OpenLayers.Format.WMSDescribeLayer.v1_1 = OpenLayers.Class( * data - {String} or {DOMElement} data to read/parse. * * Returns: - * {Array} Array of {} objects which have: + * {Object} Object with a layerDescriptions property, which holds an Array + * of {} objects which have: * - {String} owsType: WFS/WCS * - {String} owsURL: the online resource - * - {String} typeName: the name of the typename on the service + * - {String} typeName: the name of the typename on the owsType service + * - {String} layerName: the name of the WMS layer we did a lookup for */ read: function(data) { if(typeof data == "string") { @@ -56,7 +58,7 @@ OpenLayers.Format.WMSDescribeLayer.v1_1 = OpenLayers.Class( } var root = data.documentElement; var children = root.childNodes; - var describelayer = []; + var describelayer = {layerDescriptions: []}; var childNode, nodeName; for(var i=0; i Date: Tue, 2 Oct 2012 14:40:37 +0200 Subject: [PATCH 2/5] Adding TODO, as suggested by @bartvde --- lib/OpenLayers/Format/WMSDescribeLayer/v1_1.js | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/lib/OpenLayers/Format/WMSDescribeLayer/v1_1.js b/lib/OpenLayers/Format/WMSDescribeLayer/v1_1.js index 82b4ba58ce..41f90be073 100644 --- a/lib/OpenLayers/Format/WMSDescribeLayer/v1_1.js +++ b/lib/OpenLayers/Format/WMSDescribeLayer/v1_1.js @@ -97,7 +97,8 @@ OpenLayers.Format.WMSDescribeLayer.v1_1 = OpenLayers.Class( }; describelayer.layerDescriptions.push(layerDescription); - // deprecated array style index for backwards compatibility + //TODO do this in deprecated.js instead: + // array style index for backwards compatibility describelayer.length = describelayer.layerDescriptions.length; describelayer[describelayer.length - 1] = layerDescription; From 3d1b0f0bd9b48a3d36917c77463e79624c0e21e9 Mon Sep 17 00:00:00 2001 From: ahocevar Date: Tue, 2 Oct 2012 16:07:35 +0200 Subject: [PATCH 3/5] Less intrusive version fallback --- lib/OpenLayers/Format/WMSDescribeLayer/v1_1.js | 5 +++++ lib/OpenLayers/Format/XML/VersionedOGC.js | 5 ----- 2 files changed, 5 insertions(+), 5 deletions(-) diff --git a/lib/OpenLayers/Format/WMSDescribeLayer/v1_1.js b/lib/OpenLayers/Format/WMSDescribeLayer/v1_1.js index 41f90be073..771a7b16a2 100644 --- a/lib/OpenLayers/Format/WMSDescribeLayer/v1_1.js +++ b/lib/OpenLayers/Format/WMSDescribeLayer/v1_1.js @@ -116,3 +116,8 @@ OpenLayers.Format.WMSDescribeLayer.v1_1 = OpenLayers.Class( CLASS_NAME: "OpenLayers.Format.WMSDescribeLayer.v1_1" }); + +// Version aliases - workaround for http://trac.osgeo.org/mapserver/ticket/2257 +OpenLayers.Format.WMSDescribeLayer.v1_1_1 = + OpenLayers.Format.WMSDescribeLayer.v1_1_0 = + OpenLayers.Format.WMSDescribeLayer.v1_1; diff --git a/lib/OpenLayers/Format/XML/VersionedOGC.js b/lib/OpenLayers/Format/XML/VersionedOGC.js index c61584ff00..7b9ef90dfb 100644 --- a/lib/OpenLayers/Format/XML/VersionedOGC.js +++ b/lib/OpenLayers/Format/XML/VersionedOGC.js @@ -127,11 +127,6 @@ OpenLayers.Format.XML.VersionedOGC = OpenLayers.Class(OpenLayers.Format.XML, { var format = OpenLayers.Format[this.name][ "v" + version.replace(/\./g, "_") + profile ]; - if (!format && ~version.indexOf('.')) { - // falling back to less specific parser - return this.getParser( - version.substr(0, version.lastIndexOf('.'))); - } if(!format) { throw "Can't find a " + this.name + " parser for version " + version + profile; From 88a7b7d3e2c94bef399e2108d818c4be947f0fd9 Mon Sep 17 00:00:00 2001 From: ahocevar Date: Tue, 2 Oct 2012 16:11:27 +0200 Subject: [PATCH 4/5] Testing backwards compatibility --- tests/Format/WMSDescribeLayer.html | 14 +++++++++++++- 1 file changed, 13 insertions(+), 1 deletion(-) diff --git a/tests/Format/WMSDescribeLayer.html b/tests/Format/WMSDescribeLayer.html index 7fcf7fab24..939bfe1d8f 100644 --- a/tests/Format/WMSDescribeLayer.html +++ b/tests/Format/WMSDescribeLayer.html @@ -4,7 +4,7 @@