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.
This commit is contained in:
@@ -12,11 +12,12 @@
|
||||
format = new OpenLayers.Format.WMSDescribeLayer();
|
||||
html = "<br>";
|
||||
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 += "<ul>";
|
||||
html += "<li>owsURL: "+resp[i].owsURL+"</li>";
|
||||
html += "<li>owsType: "+resp[i].owsType+"</li>";
|
||||
html += "<li>owsURL: "+layerDescriptions[i].owsURL+"</li>";
|
||||
html += "<li>owsType: "+layerDescriptions[i].owsType+"</li>";
|
||||
html += "</ul>"
|
||||
}
|
||||
document.getElementById('output').innerHTML = html;
|
||||
|
||||
@@ -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.
|
||||
|
||||
@@ -45,10 +45,12 @@ OpenLayers.Format.WMSDescribeLayer.v1_1 = OpenLayers.Class(
|
||||
* data - {String} or {DOMElement} data to read/parse.
|
||||
*
|
||||
* Returns:
|
||||
* {Array} Array of {<LayerDescription>} objects which have:
|
||||
* {Object} Object with a layerDescriptions property, which holds an Array
|
||||
* of {<LayerDescription>} 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<children.length; ++i) {
|
||||
childNode = children[i];
|
||||
@@ -89,8 +91,16 @@ OpenLayers.Format.WMSDescribeLayer.v1_1 = OpenLayers.Class(
|
||||
typeName = query[0].getAttribute('typename');
|
||||
}
|
||||
}
|
||||
describelayer.push({layerName: layerName, owsType: owsType,
|
||||
owsURL: owsURL, typeName: typeName});
|
||||
var layerDescription = {
|
||||
layerName: layerName, owsType: owsType,
|
||||
owsURL: owsURL, typeName: typeName
|
||||
};
|
||||
describelayer.layerDescriptions.push(layerDescription);
|
||||
|
||||
// deprecated array style index for backwards compatibility
|
||||
describelayer.length = describelayer.layerDescriptions.length;
|
||||
describelayer[describelayer.length - 1] = layerDescription;
|
||||
|
||||
} else if (nodeName == 'ServiceException') {
|
||||
// an exception must have occurred, so parse it
|
||||
var parser = new OpenLayers.Format.OGCExceptionReport();
|
||||
|
||||
@@ -127,6 +127,11 @@ 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;
|
||||
|
||||
@@ -45,3 +45,7 @@ run 'build.py -h' for more details
|
||||
Corresponding issue/pull requests:
|
||||
|
||||
* https://github.com/openlayers/openlayers/pull/528
|
||||
|
||||
# Different return type for OpenLayers.Format.WMSDescribeLayer
|
||||
|
||||
The return type of WMSDescribeLayer format's `read` method was different from the one of the VersionedOGC format superclass. So it was changed from an array to an object with a layerDescriptions property that holds the array. For backwards compatibility, the object still has a length property and 0, ..., n properties with the previous array values.
|
||||
@@ -17,19 +17,19 @@
|
||||
|
||||
var res = parser.read(text);
|
||||
|
||||
t.eq(res.length, 1,
|
||||
t.eq(res.layerDescriptions.length, 1,
|
||||
"Only one LayerDescription in data, so only one parsed");
|
||||
|
||||
t.eq(res[0].owsType, "WFS",
|
||||
t.eq(res.layerDescriptions[0].owsType, "WFS",
|
||||
"Properly parses owsType as WFS");
|
||||
|
||||
t.eq(res[0].owsURL, "http://geo.openplans.org:80/geoserver/wfs/WfsDispatcher?",
|
||||
t.eq(res.layerDescriptions[0].owsURL, "http://geo.openplans.org:80/geoserver/wfs/WfsDispatcher?",
|
||||
"Properly parses owsURL");
|
||||
|
||||
t.eq(res[0].typeName, "topp:states",
|
||||
t.eq(res.layerDescriptions[0].typeName, "topp:states",
|
||||
"Properly parses typeName");
|
||||
|
||||
t.eq(res[0].layerName, "topp:states",
|
||||
t.eq(res.layerDescriptions[0].layerName, "topp:states",
|
||||
"Properly parses name");
|
||||
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user