/* Copyright (c) 2006-2013 by OpenLayers Contributors (see authors.txt for * full list of contributors). Published under the 2-clause BSD license. * See license.txt in the OpenLayers distribution or repository for the * full text of the license. */ /** * @requires OpenLayers/SingleFile.js */ /** * @requires OpenLayers/Events.js * @requires OpenLayers/WPSProcess.js * @requires OpenLayers/Format/WPSDescribeProcess.js * @requires OpenLayers/Request.js */ /** * Class: OpenLayers.WPSClient * High level API for interaction with Web Processing Services (WPS). * An instance is used to create * instances for servers known to the WPSClient. The WPSClient also caches * DescribeProcess responses to reduce the number of requests sent to servers * when processes are created. */ OpenLayers.WPSClient = OpenLayers.Class({ /** * Property: servers * {Object} Service metadata, keyed by a local identifier. * * Properties: * url - {String} the url of the server * version - {String} WPS version of the server * processDescription - {Object} Cache of raw DescribeProcess * responses, keyed by process identifier. */ servers: null, /** * Property: version * {String} The default WPS version to use if none is configured. Default * is '1.0.0'. */ version: '1.0.0', /** * Property: lazy * {Boolean} Should the DescribeProcess be deferred until a process is * fully configured? Default is false. */ lazy: false, /** * Property: events * {} * * Supported event types: * describeprocess - Fires when the process description is available. * Listeners receive an object with a 'raw' property holding the raw * DescribeProcess response, and an 'identifier' property holding the * process identifier of the described process. */ events: null, /** * Constructor: OpenLayers.WPSClient * * Parameters: * options - {Object} Object whose properties will be set on the instance. * * Avaliable options: * servers - {Object} Mandatory. Service metadata, keyed by a local * identifier. Can either be a string with the service url or an * object literal with additional metadata: * * (code) * servers: { * local: '/geoserver/wps' * }, { * opengeo: { * url: 'http://demo.opengeo.org/geoserver/wps', * version: '1.0.0' * } * } * (end) * * lazy - {Boolean} Optional. Set to true if DescribeProcess should not be * requested until a process is fully configured. Default is false. */ initialize: function(options) { OpenLayers.Util.extend(this, options); this.events = new OpenLayers.Events(this); this.servers = {}; for (var s in options.servers) { this.servers[s] = typeof options.servers[s] == 'string' ? { url: options.servers[s], version: this.version, processDescription: {} } : options.servers[s]; } }, /** * APIMethod: execute * Shortcut to execute a process with a single function call. This is * equivalent to using and then calling execute on the * process. * * Parameters: * options - {Object} Options for the execute operation. * * Available options: * server - {String} Mandatory. One of the local identifiers of the * configured servers. * process - {String} Mandatory. A process identifier known to the * server. * inputs - {Object} The inputs for the process, keyed by input identifier. * For spatial data inputs, the value of an input is usually an * , an or an array of * geometries or features. * output - {String} The identifier of an output to parse. Optional. If not * provided, the first output will be parsed. * success - {Function} Callback to call when the process is complete. * This function is called with an outputs object as argument, which * will have a property with the identifier of the requested output * (e.g. 'result'). For processes that generate spatial output, the * value will either be a single or an * array of features. * scope - {Object} Optional scope for the success callback. */ execute: function(options) { var process = this.getProcess(options.server, options.process); process.execute({ inputs: options.inputs, success: options.success, scope: options.scope }); }, /** * APIMethod: getProcess * Creates an . * * Parameters: * serverID - {String} Local identifier from the servers that this instance * was constructed with. * processID - {String} Process identifier known to the server. * * Returns: * {} */ getProcess: function(serverID, processID) { var process = new OpenLayers.WPSProcess({ client: this, server: serverID, identifier: processID }); if (!this.lazy) { process.describe(); } return process; }, /** * Method: describeProcess * * Parameters: * serverID - {String} Identifier of the server * processID - {String} Identifier of the requested process * callback - {Function} Callback to call when the description is available * scope - {Object} Optional execution scope for the callback function */ describeProcess: function(serverID, processID, callback, scope) { var server = this.servers[serverID]; if (!server.processDescription[processID]) { if (!(processID in server.processDescription)) { // set to null so we know a describeFeature request is pending server.processDescription[processID] = null; OpenLayers.Request.GET({ url: server.url, params: { SERVICE: 'WPS', VERSION: server.version, REQUEST: 'DescribeProcess', IDENTIFIER: processID }, success: function(response) { server.processDescription[processID] = response.responseText; this.events.triggerEvent('describeprocess', { identifier: processID, raw: response.responseText }); }, scope: this }); } else { // pending request this.events.register('describeprocess', this, function describe(evt) { if (evt.identifier === processID) { this.events.unregister('describeprocess', this, describe); callback.call(scope, evt.raw); } }); } } else { window.setTimeout(function() { callback.call(scope, server.processDescription[processID]); }, 0); } }, /** * Method: destroy */ destroy: function() { this.events.destroy(); this.events = null; this.servers = null; }, CLASS_NAME: 'OpenLayers.WPSClient' });