Merge pull request #136 from bartvde/csw
Add CS-W protocol based on the work from pgiraud (http://trac.osgeo.org/openlayers/ticket/2133)
This commit is contained in:
@@ -241,6 +241,8 @@
|
||||
"OpenLayers/Protocol/WFS/v1.js",
|
||||
"OpenLayers/Protocol/WFS/v1_0_0.js",
|
||||
"OpenLayers/Protocol/WFS/v1_1_0.js",
|
||||
"OpenLayers/Protocol/CSW.js",
|
||||
"OpenLayers/Protocol/CSW/v2_0_2.js",
|
||||
"OpenLayers/Protocol/Script.js",
|
||||
"OpenLayers/Protocol/SOS.js",
|
||||
"OpenLayers/Protocol/SOS/v1_0_0.js",
|
||||
|
||||
@@ -231,10 +231,19 @@ OpenLayers.Protocol.Response = OpenLayers.Class({
|
||||
/**
|
||||
* Property: features
|
||||
* {Array({<OpenLayers.Feature.Vector>})} or {<OpenLayers.Feature.Vector>}
|
||||
* The features returned in the response by the server.
|
||||
* The features returned in the response by the server. Depending on the
|
||||
* protocol's read payload, either features or data will be populated.
|
||||
*/
|
||||
features: null,
|
||||
|
||||
/**
|
||||
* Property: data
|
||||
* {Object}
|
||||
* The data returned in the response by the server. Depending on the
|
||||
* protocol's read payload, either features or data will be populated.
|
||||
*/
|
||||
data: null,
|
||||
|
||||
/**
|
||||
* Property: reqFeatures
|
||||
* {Array({<OpenLayers.Feature.Vector>})} or {<OpenLayers.Feature.Vector>}
|
||||
|
||||
30
lib/OpenLayers/Protocol/CSW.js
Normal file
30
lib/OpenLayers/Protocol/CSW.js
Normal file
@@ -0,0 +1,30 @@
|
||||
/* Copyright (c) 2006-2012 by OpenLayers Contributors (see authors.txt for
|
||||
* full list of contributors). Published under the Clear BSD license.
|
||||
* See http://svn.openlayers.org/trunk/openlayers/license.txt for the
|
||||
* full text of the license. */
|
||||
|
||||
/**
|
||||
* @requires OpenLayers/Protocol.js
|
||||
*/
|
||||
|
||||
/**
|
||||
* Class: OpenLayers.Protocol.CSW
|
||||
* Used to create a versioned CSW protocol. Default version is 2.0.2.
|
||||
*/
|
||||
OpenLayers.Protocol.CSW = function(options) {
|
||||
options = OpenLayers.Util.applyDefaults(
|
||||
options, OpenLayers.Protocol.CSW.DEFAULTS
|
||||
);
|
||||
var cls = OpenLayers.Protocol.CSW["v"+options.version.replace(/\./g, "_")];
|
||||
if(!cls) {
|
||||
throw "Unsupported CSW version: " + options.version;
|
||||
}
|
||||
return new cls(options);
|
||||
};
|
||||
|
||||
/**
|
||||
* Constant: OpenLayers.Protocol.CSW.DEFAULTS
|
||||
*/
|
||||
OpenLayers.Protocol.CSW.DEFAULTS = {
|
||||
"version": "2.0.2"
|
||||
};
|
||||
144
lib/OpenLayers/Protocol/CSW/v2_0_2.js
Normal file
144
lib/OpenLayers/Protocol/CSW/v2_0_2.js
Normal file
@@ -0,0 +1,144 @@
|
||||
/* Copyright (c) 2006-2012 by OpenLayers Contributors (see authors.txt for
|
||||
* full list of contributors). Published under the Clear BSD license.
|
||||
* See http://svn.openlayers.org/trunk/openlayers/license.txt for the
|
||||
* full text of the license. */
|
||||
|
||||
/**
|
||||
* @requires OpenLayers/Protocol/CSW.js
|
||||
* @requires OpenLayers/Format/CSWGetRecords/v2_0_2.js
|
||||
*/
|
||||
|
||||
/**
|
||||
* Class: OpenLayers.Protocol.CSW.v2_0_2
|
||||
* CS-W (Catalogue services for the Web) version 2.0.2 protocol.
|
||||
*
|
||||
* Inherits from:
|
||||
* - <OpenLayers.Protocol>
|
||||
*/
|
||||
OpenLayers.Protocol.CSW.v2_0_2 = OpenLayers.Class(OpenLayers.Protocol, {
|
||||
|
||||
/**
|
||||
* Property: formatOptions
|
||||
* {Object} Optional options for the format. If a format is not provided,
|
||||
* this property can be used to extend the default format options.
|
||||
*/
|
||||
formatOptions: null,
|
||||
|
||||
/**
|
||||
* Constructor: OpenLayers.Protocol.CSW.v2_0_2
|
||||
* A class for CSW version 2.0.2 protocol management.
|
||||
*
|
||||
* Parameters:
|
||||
* options - {Object} Optional object whose properties will be set on the
|
||||
* instance.
|
||||
*/
|
||||
initialize: function(options) {
|
||||
OpenLayers.Protocol.prototype.initialize.apply(this, [options]);
|
||||
if(!options.format) {
|
||||
this.format = new OpenLayers.Format.CSWGetRecords.v2_0_2(OpenLayers.Util.extend({
|
||||
}, this.formatOptions));
|
||||
}
|
||||
},
|
||||
|
||||
/**
|
||||
* APIMethod: destroy
|
||||
* Clean up the protocol.
|
||||
*/
|
||||
destroy: function() {
|
||||
if(this.options && !this.options.format) {
|
||||
this.format.destroy();
|
||||
}
|
||||
this.format = null;
|
||||
OpenLayers.Protocol.prototype.destroy.apply(this);
|
||||
},
|
||||
|
||||
/**
|
||||
* Method: createCallback
|
||||
* Returns a function that applies the given public method with resp and
|
||||
* options arguments.
|
||||
*
|
||||
* Parameters:
|
||||
* method - {Function} The method to be applied by the callback.
|
||||
* response - {<OpenLayers.Protocol.Response>} The protocol response object.
|
||||
* options - {Object} Options sent to the protocol method (read, create,
|
||||
* update, or delete).
|
||||
*/
|
||||
createCallback: function(method, response, options) {
|
||||
return OpenLayers.Function.bind(function() {
|
||||
method.apply(this, [response, options]);
|
||||
}, this);
|
||||
},
|
||||
|
||||
/**
|
||||
* Method: read
|
||||
* Construct a request for reading new records from the Catalogue.
|
||||
*/
|
||||
read: function(options) {
|
||||
options = OpenLayers.Util.extend({}, options);
|
||||
OpenLayers.Util.applyDefaults(options, this.options || {});
|
||||
var response = new OpenLayers.Protocol.Response({requestType: "read"});
|
||||
|
||||
var data = this.format.write(options.params);
|
||||
|
||||
response.priv = OpenLayers.Request.POST({
|
||||
url: options.url,
|
||||
callback: this.createCallback(this.handleRead, response, options),
|
||||
params: options.params,
|
||||
headers: options.headers,
|
||||
data: data
|
||||
});
|
||||
|
||||
return response;
|
||||
},
|
||||
|
||||
/**
|
||||
* Method: handleRead
|
||||
* Deal with response from the read request.
|
||||
*
|
||||
* Parameters:
|
||||
* response - {<OpenLayers.Protocol.Response>} The response object to pass
|
||||
* to the user callback.
|
||||
* This response is given a code property, and optionally a data property.
|
||||
* The latter represents the CSW records as returned by the call to
|
||||
* the CSW format read method.
|
||||
* options - {Object} The user options passed to the read call.
|
||||
*/
|
||||
handleRead: function(response, options) {
|
||||
if(options.callback) {
|
||||
var request = response.priv;
|
||||
if(request.status >= 200 && request.status < 300) {
|
||||
// success
|
||||
response.data = this.parseData(request);
|
||||
response.code = OpenLayers.Protocol.Response.SUCCESS;
|
||||
} else {
|
||||
// failure
|
||||
response.code = OpenLayers.Protocol.Response.FAILURE;
|
||||
}
|
||||
options.callback.call(options.scope, response);
|
||||
}
|
||||
},
|
||||
|
||||
/**
|
||||
* Method: parseData
|
||||
* Read HTTP response body and return records
|
||||
*
|
||||
* Parameters:
|
||||
* request - {XMLHttpRequest} The request object
|
||||
*
|
||||
* Returns:
|
||||
* {Object} The CSW records as returned by the call to the format read method.
|
||||
*/
|
||||
parseData: function(request) {
|
||||
var doc = request.responseXML;
|
||||
if(!doc || !doc.documentElement) {
|
||||
doc = request.responseText;
|
||||
}
|
||||
if(!doc || doc.length <= 0) {
|
||||
return null;
|
||||
}
|
||||
return this.format.read(doc);
|
||||
},
|
||||
|
||||
CLASS_NAME: "OpenLayers.Protocol.CSW.v2_0_2"
|
||||
|
||||
});
|
||||
90
tests/Protocol/CSW.html
Normal file
90
tests/Protocol/CSW.html
Normal file
@@ -0,0 +1,90 @@
|
||||
<html>
|
||||
<head>
|
||||
<script src="../../lib/OpenLayers.js"></script>
|
||||
<script type="text/javascript">
|
||||
|
||||
function test_initialize(t) {
|
||||
t.plan(3);
|
||||
|
||||
var protocol = new OpenLayers.Protocol.CSW({formatOptions: {foo: "bar"},});
|
||||
t.ok(protocol instanceof OpenLayers.Protocol.CSW.v2_0_2,
|
||||
"initialize returns instance of default versioned protocol");
|
||||
var format = protocol.format;
|
||||
t.ok(format instanceof OpenLayers.Format.CSWGetRecords.v2_0_2, "Default format created");
|
||||
t.ok(format.foo, "bar", "formatOptions set correctly");
|
||||
protocol.destroy();
|
||||
}
|
||||
|
||||
function test_read(t) {
|
||||
t.plan(6);
|
||||
|
||||
var protocol = new OpenLayers.Protocol.CSW({
|
||||
url: "http://some.url.org",
|
||||
parseData: function(request) {
|
||||
t.eq(request.responseText, "foo", "parseData called properly");
|
||||
return "foo";
|
||||
}
|
||||
});
|
||||
|
||||
var _POST = OpenLayers.Request.POST;
|
||||
|
||||
var expected, status;
|
||||
OpenLayers.Request.POST = function(obj) {
|
||||
t.xml_eq(new OpenLayers.Format.XML().read(obj.data).documentElement, expected, "GetRecords request is correct");
|
||||
obj.status = status;
|
||||
obj.responseText = "foo";
|
||||
obj.options = {};
|
||||
t.delay_call(0.1, function() {obj.callback.call(this)});
|
||||
return obj;
|
||||
};
|
||||
|
||||
expected = readXML("GetRecords");
|
||||
status = 200;
|
||||
var data = {
|
||||
"resultType": "results",
|
||||
"maxRecords": 100,
|
||||
"Query": {
|
||||
"typeNames": "gmd:MD_Metadata",
|
||||
"ElementSetName": {
|
||||
"value": "full"
|
||||
}
|
||||
}
|
||||
};
|
||||
var response = protocol.read({
|
||||
params: data,
|
||||
callback: function(response) {
|
||||
t.eq(response.data, "foo", "user callback properly called with data");
|
||||
t.eq(response.code, OpenLayers.Protocol.Response.SUCCESS, "success reported properly to user callback");
|
||||
}
|
||||
});
|
||||
|
||||
var options = {
|
||||
params: data,
|
||||
callback: function(response) {
|
||||
t.eq(response.code, OpenLayers.Protocol.Response.FAILURE, "failure reported properly to user callback");
|
||||
}
|
||||
};
|
||||
status = 400;
|
||||
var response = protocol.read(options);
|
||||
|
||||
OpenLayers.Request.POST = _POST;
|
||||
}
|
||||
|
||||
function readXML(id) {
|
||||
var xml = document.getElementById(id).firstChild.nodeValue;
|
||||
return new OpenLayers.Format.XML().read(xml).documentElement;
|
||||
}
|
||||
|
||||
</script>
|
||||
</head>
|
||||
<body>
|
||||
<div id="map" style="width:512px; height:256px"> </div>
|
||||
<div id="GetRecords"><!--
|
||||
<csw:GetRecords xmlns:csw="http://www.opengis.net/cat/csw/2.0.2" service="CSW" version="2.0.2" resultType="results" maxRecords="100">
|
||||
<csw:Query typeNames="gmd:MD_Metadata">
|
||||
<csw:ElementSetName>full</csw:ElementSetName>
|
||||
</csw:Query>
|
||||
</csw:GetRecords>
|
||||
--></div>
|
||||
</body>
|
||||
</html>
|
||||
@@ -184,6 +184,7 @@
|
||||
<li>Protocol/HTTP.html</li>
|
||||
<li>Protocol/Script.html</li>
|
||||
<li>Protocol/WFS.html</li>
|
||||
<li>Protocol/CSW.html</li>
|
||||
<li>Protocol/SOS.html</li>
|
||||
<li>Renderer.html</li>
|
||||
<li>Renderer/Canvas.html</li>
|
||||
|
||||
Reference in New Issue
Block a user