From ff06ab64c664f9a15c8144e34556e4a9eac3a74b Mon Sep 17 00:00:00 2001 From: Jachym Cepicky Date: Tue, 12 Jun 2012 22:48:48 +0200 Subject: [PATCH 1/3] Added changes to Format/WPS*: BoundingBox for DescribeProcess, multiple outputs for Execute as well as Format.WPS.readers --- lib/OpenLayers/Format/WPSDescribeProcess.js | 4 + lib/OpenLayers/Format/WPSExecute.js | 140 +++++++++++++++++++- tests/Format/WPSDescribeProcess.html | 12 +- tests/Format/WPSExecute.html | 31 +++-- 4 files changed, 172 insertions(+), 15 deletions(-) diff --git a/lib/OpenLayers/Format/WPSDescribeProcess.js b/lib/OpenLayers/Format/WPSDescribeProcess.js index 9534a245c9..60cc4d68b1 100644 --- a/lib/OpenLayers/Format/WPSDescribeProcess.js +++ b/lib/OpenLayers/Format/WPSDescribeProcess.js @@ -127,6 +127,10 @@ OpenLayers.Format.WPSDescribeProcess = OpenLayers.Class( output.complexOutput = {}; this.readChildNodes(node, output.complexOutput); }, + "LiteralOutput": function(node, output) { + output.literalOutput = {}; + this.readChildNodes(node, output.literalOutput); + }, "Input": function(node, dataInputs) { var input = { maxOccurs: parseInt(node.getAttribute("maxOccurs")), diff --git a/lib/OpenLayers/Format/WPSExecute.js b/lib/OpenLayers/Format/WPSExecute.js index c4b2d79afd..257a77c8e6 100644 --- a/lib/OpenLayers/Format/WPSExecute.js +++ b/lib/OpenLayers/Format/WPSExecute.js @@ -93,6 +93,28 @@ OpenLayers.Format.WPSExecute = OpenLayers.Class(OpenLayers.Format.XML, { return OpenLayers.Format.XML.prototype.write.apply(this, [node]); }, + /** + * APIMethod: read + * Parse a WPS Execute and return an object with its information. + * + * Parameters: + * data - {String} or {DOMElement} data to read/parse. + * + * Returns: + * {Object} + */ + read: function(data) { + if(typeof data == "string") { + data = OpenLayers.Format.XML.prototype.read.apply(this, [data]); + } + if(data && data.nodeType == 9) { + data = data.documentElement; + } + var info = {}; + this.readNode(data, info); + return info; + }, + /** * Property: writers * As a compliment to the readers property, this structure contains public @@ -131,15 +153,20 @@ OpenLayers.Format.WPSExecute = OpenLayers.Class(OpenLayers.Format.XML, { status: responseDocument.status } }); - if (responseDocument.output) { - this.writeNode("wps:Output", responseDocument.output, node); + if (responseDocument.outputs) { + for (var i = 0, len = responseDocument.outputs.length; i < len; i++) { + this.writeNode("wps:Output", responseDocument.outputs[i], node); + } } return node; }, "Output": function(output) { var node = this.createElementNSPlus("wps:Output", { attributes: { - asReference: output.asReference + asReference: output.asReference, + mimeType: output.mimeType, + encoding: output.encoding, + schema: output.schema } }); this.writeNode("ows:Identifier", output.identifier, node); @@ -150,7 +177,9 @@ OpenLayers.Format.WPSExecute = OpenLayers.Class(OpenLayers.Format.XML, { "RawDataOutput": function(rawDataOutput) { var node = this.createElementNSPlus("wps:RawDataOutput", { attributes: { - mimeType: rawDataOutput.mimeType + mimeType: rawDataOutput.mimeType, + encoding: rawDataOutput.encoding, + schema: rawDataOutput.schema } }); this.writeNode("ows:Identifier", rawDataOutput.identifier, node); @@ -186,6 +215,8 @@ OpenLayers.Format.WPSExecute = OpenLayers.Class(OpenLayers.Format.XML, { this.writeNode("wps:LiteralData", data.literalData, node); } else if (data.complexData) { this.writeNode("wps:ComplexData", data.complexData, node); + } else if (data.boundingBoxData) { + this.writeNode("ows:BoundingBox", data.boundingBoxData, node); } return node; }, @@ -256,6 +287,107 @@ OpenLayers.Format.WPSExecute = OpenLayers.Class(OpenLayers.Format.XML, { "ogc": OpenLayers.Format.Filter.v1_1_0.prototype.writers.ogc, "ows": OpenLayers.Format.OWSCommon.v1_1_0.prototype.writers.ows }, + + /** + * Property: readers + * Contains public functions, grouped by namespace prefix, that will + * be applied when a namespaced node is found matching the function + * name. The function will be applied in the scope of this parser + * with two arguments: the node being read and a context object passed + * from the parent. + */ + readers: { + "wps": { + "ExecuteResponse": function(node, obj) { + obj.executeResponse = { + lang: node.getAttribute("lang"), + statusLocation: node.getAttribute("statusLocation"), + serviceInstance: node.getAttribute("serviceInstance"), + service: node.getAttribute("service") + }; + this.readChildNodes(node, obj.executeResponse); + }, + "Process":function(node,obj) { + obj.process = {}; + this.readChildNodes(node, obj.process); + }, + "Status":function(node,obj) { + obj.status = { + creationTime: node.getAttribute("creationTime") + }; + this.readChildNodes(node, obj.status); + + }, + "ProcessSucceeded": function(node,obj) { + obj.processSucceeded = true; + }, + "ProcessOutputs": function(node, processDescription) { + processDescription.processOutputs = []; + this.readChildNodes(node, processDescription.processOutputs); + }, + "Output": function(node, processOutputs) { + var output = {}; + this.readChildNodes(node, output); + processOutputs.push(output); + }, + "Reference": function(node, output) { + output.reference = { + href: node.getAttribute("href"), + mimeType: node.getAttribute("mimeType"), + encoding: node.getAttribute("encoding"), + schema: node.getAttribute("schema") + }; + }, + "Data": function(node, output) { + output.data = {}; + this.readChildNodes(node, output); + }, + "LiteralData": function(node, output) { + output.literalData = { + dataType: node.getAttribute("dataType"), + uom: node.getAttribute("uom"), + value: this.getChildValue(node) + }; + }, + "ComplexData": function(node, output) { + output.complexData = { + mimeType: node.getAttribute("mimeType"), + schema: node.getAttribute("schema"), + encoding: node.getAttribute("encoding"), + value: "" + }; + + // try to get *some* value, ignore the empty text values + if (this.isSimpleContent(node)) { + for(var child=node.firstChild; child; child=child.nextSibling) { + switch(child.nodeType) { + case 3: // text node + case 4: // cdata section + output.complexData.value += child.nodeValue; + } + } + } + else { + for(var child=node.firstChild; child; child=child.nextSibling) { + if (child.nodeType == 1) { + output.complexData.value = child; + } + } + } + + }, + "BoundingBox": function(node, output) { + output.boundingBoxData = { + dimensions: node.getAttribute("dimensions"), + crs: node.getAttribute("crs") + }; + this.readChildNodes(node, output.boundingBoxData); + } + }, + + // TODO: we should add Exception parsing here + "ows": OpenLayers.Format.OWSCommon.v1_1_0.prototype.readers["ows"] + }, CLASS_NAME: "OpenLayers.Format.WPSExecute" diff --git a/tests/Format/WPSDescribeProcess.html b/tests/Format/WPSDescribeProcess.html index c411f6267b..f52fd21372 100644 --- a/tests/Format/WPSDescribeProcess.html +++ b/tests/Format/WPSDescribeProcess.html @@ -4,7 +4,7 @@