summaryrefslogtreecommitdiff
path: root/includes/js/dojox/wire/ml/Service.js
diff options
context:
space:
mode:
Diffstat (limited to 'includes/js/dojox/wire/ml/Service.js')
-rw-r--r--includes/js/dojox/wire/ml/Service.js340
1 files changed, 340 insertions, 0 deletions
diff --git a/includes/js/dojox/wire/ml/Service.js b/includes/js/dojox/wire/ml/Service.js
new file mode 100644
index 0000000..15f074b
--- /dev/null
+++ b/includes/js/dojox/wire/ml/Service.js
@@ -0,0 +1,340 @@
+if(!dojo._hasResource["dojox.wire.ml.Service"]){ //_hasResource checks added by build. Do not use _hasResource directly in your code.
+dojo._hasResource["dojox.wire.ml.Service"] = true;
+dojo.provide("dojox.wire.ml.Service");
+dojo.provide("dojox.wire.ml.RestHandler");
+dojo.provide("dojox.wire.ml.XmlHandler");
+dojo.provide("dojox.wire.ml.JsonHandler");
+
+dojo.require("dijit._Widget");
+dojo.require("dojox.data.dom");
+dojo.require("dojox.wire._base");
+dojo.require("dojox.wire.ml.util");
+
+dojo.declare("dojox.wire.ml.Service", dijit._Widget, {
+ // summary:
+ // A widget for a service
+ // description:
+ // This widget represents a service defined by a service description
+ // specified with 'url' attribute.
+ // If 'serviceType' and 'serviceUrl' attributes are specified, 'url'
+ // attribute can be omitted.
+ // url:
+ // A URL to a service description
+ // serviceUrl:
+ // A URL to a service
+ // serviceType:
+ // A service type
+ // handlerClass:
+ // A service handler class name
+ url: "",
+ serviceUrl: "",
+ serviceType: "",
+ handlerClass: "",
+ preventCache: true,
+
+ postCreate: function(){
+ // summary:
+ // Call _createHandler()
+ // description:
+ // See _createHandler().
+ this.handler = this._createHandler();
+ },
+
+ _handlerClasses: {
+ "TEXT": "dojox.wire.ml.RestHandler",
+ "XML": "dojox.wire.ml.XmlHandler",
+ "JSON": "dojox.wire.ml.JsonHandler",
+ "JSON-RPC": "dojo.rpc.JsonService"
+ },
+
+ _createHandler: function(){
+ // summary:
+ // Create a service handler
+ // desription:
+ // A service handler class is determined by:
+ // 1. 'handlerClass' attribute
+ // 2. 'serviceType' attribute
+ // 3. 'serviceType' property in a service description
+ // returns:
+ // A service handler
+ if(this.url){
+ var self = this;
+ var d = dojo.xhrGet({
+ url: this.url,
+ handleAs: "json",
+ sync: true
+ });
+ d.addCallback(function(result){
+ self.smd = result;
+ });
+ if(this.smd && !this.serviceUrl){
+ this.serviceUrl = (this.smd.serviceUrl || this.smd.serviceURL);
+ }
+ }
+ var handlerClass = undefined;
+ if(this.handlerClass){
+ handlerClass = dojox.wire._getClass(this.handlerClass);
+ }else if(this.serviceType){
+ handlerClass = this._handlerClasses[this.serviceType];
+ if(handlerClass && dojo.isString(handlerClass)){
+ handlerClass = dojox.wire._getClass(handlerClass);
+ this._handlerClasses[this.serviceType] = handlerClass;
+ }
+ }else if(this.smd && this.smd.serviceType){
+ handlerClass = this._handlerClasses[this.smd.serviceType];
+ if(handlerClass && dojo.isString(handlerClass)){
+ handlerClass = dojox.wire._getClass(handlerClass);
+ this._handlerClasses[this.smd.serviceType] = handlerClass;
+ }
+ }
+ if(!handlerClass){
+ return null; //null
+ }
+ return new handlerClass(); //Object
+ },
+
+ callMethod: function(method, parameters){
+ // summary:
+ // Call a service method with parameters
+ // method:
+ // A method name
+ // parameters:
+ // An array parameters
+ var deferred = new dojo.Deferred();
+ this.handler.bind(method, parameters, deferred, this.serviceUrl);
+ return deferred;
+ }
+});
+
+dojo.declare("dojox.wire.ml.RestHandler", null, {
+ // summary:
+ // A REST service handler
+ // description:
+ // This class serves as a base REST service.
+ // Sub-classes may override _getContent() and _getResult() to handle
+ // specific content types.
+ contentType: "text/plain",
+ handleAs: "text",
+
+ bind: function(method, parameters, deferred, url){
+ // summary:
+ // Call a service method with parameters.
+ // description:
+ // A service is called with a URL generated by _getUrl() and
+ // an HTTP method specified with 'method'.
+ // For "POST" and "PUT", a content is generated by _getContent().
+ // When data is loaded, _getResult() is used to pass the result to
+ // Deferred.callback().
+ // method:
+ // A method name
+ // parameters:
+ // An array of parameters
+ // deferred:
+ // 'Deferred'
+ // url:
+ // A URL for the method
+ method = method.toUpperCase();
+ var self = this;
+ var args = {
+ url: this._getUrl(method, parameters, url),
+ contentType: this.contentType,
+ handleAs: this.handleAs,
+ headers: this.headers,
+ preventCache: this.preventCache
+ };
+ var d = null;
+ if(method == "POST"){
+ args.postData = this._getContent(method, parameters);
+ d = dojo.rawXhrPost(args);
+ }else if(method == "PUT"){
+ args.putData = this._getContent(method, parameters);
+ d = dojo.rawXhrPut(args);
+ }else if(method == "DELETE"){
+ d = dojo.xhrDelete(args);
+ }else{ // "GET"
+ d = dojo.xhrGet(args);
+ }
+ d.addCallbacks(function(result){
+ deferred.callback(self._getResult(result));
+ }, function(error){
+ deferred.errback(error);
+ });
+ },
+
+ _getUrl: function(/*String*/method, /*Array*/parameters, /*String*/url){
+ // summary:
+ // Generate a URL
+ // description:
+ // If 'method' is "GET" or "DELETE", a query string is generated
+ // from a query object specified to the first parameter in
+ // 'parameters' and appended to 'url'.
+ // If 'url' contains variable seguments ("{parameter_name}"),
+ // they are replaced with corresponding parameter values, instead.
+ // method:
+ // A method name
+ // parameters:
+ // An array of parameters
+ // url:
+ // A base URL
+ // returns:
+ // A URL
+ var query;
+ if(method == "GET" || method == "DELETE"){
+ if(parameters.length > 0){
+ query = parameters[0];
+ }
+ }else{ // "POST" || "PUT"
+ if(parameters.length > 1){
+ query = parameters[1];
+ }
+ }
+ if(query){
+ var queryString = "";
+ for(var name in query){
+ var value = query[name];
+ if(value){
+ value = encodeURIComponent(value);
+ var variable = "{" + name + "}";
+ var index = url.indexOf(variable);
+ if(index >= 0){ // encode in path
+ url = url.substring(0, index) + value + url.substring(index + variable.length);
+ }else{ // encode as query string
+ if(queryString){
+ queryString += "&";
+ }
+ queryString += (name + "=" + value);
+ }
+ }
+ }
+ if(queryString){
+ url += "?" + queryString;
+ }
+ }
+ return url; //String
+ },
+
+ _getContent: function(/*String*/method, /*Array*/parameters){
+ // summary:
+ // Generate a request content
+ // description:
+ // If 'method' is "POST" or "PUT", the first parameter in
+ // 'parameters' is returned.
+ // method:
+ // A method name
+ // parameters:
+ // An array of parameters
+ // returns:
+ // A request content
+ if(method == "POST" || method == "PUT"){
+ return (parameters ? parameters[0] : null); //anything
+ }else{
+ return null; //null
+ }
+ },
+
+ _getResult: function(/*anything*/data){
+ // summary:
+ // Extract a result
+ // description:
+ // A response data is returned as is.
+ // data:
+ // A response data returned by a service
+ // returns:
+ // A result object
+ return data; //anything
+ }
+});
+
+dojo.declare("dojox.wire.ml.XmlHandler", dojox.wire.ml.RestHandler, {
+ // summary:
+ // A REST service handler for XML
+ // description:
+ // This class provides XML handling for a REST service.
+ contentType: "text/xml",
+ handleAs: "xml",
+
+ _getContent: function(/*String*/method, /*Array*/parameters){
+ // description:
+ // If 'method' is "POST" or "PUT", the first parameter in
+ // 'parameters' is used to generate an XML content.
+ // method:
+ // A method name
+ // parameters:
+ // An array of parameters
+ // returns:
+ // A request content
+ var content = null;
+ if(method == "POST" || method == "PUT"){
+ var p = parameters[0];
+ if(p){
+ if(dojo.isString(p)){
+ content = p;
+ }else{
+ var element = p;
+ if(element instanceof dojox.wire.ml.XmlElement){
+ element = element.element;
+ }else if(element.nodeType === 9 /* DOCUMENT_NODE */){
+ element = element.documentElement;
+ }
+ var declaration = "<?xml version=\"1.0\"?>"; // TODO: encoding?
+ content = declaration + dojox.data.dom.innerXML(element);
+ }
+ }
+ }
+ return content;
+ },
+
+ _getResult: function(/*Document*/data){
+ // summary:
+ // Extract a result
+ // description:
+ // A response data (XML Document) is returned wrapped with
+ // XmlElement.
+ // data:
+ // A response data returned by a service
+ // returns:
+ // A result object
+ if(data){
+ data = new dojox.wire.ml.XmlElement(data);
+ }
+ return data;
+ }
+});
+
+dojo.declare("dojox.wire.ml.JsonHandler", dojox.wire.ml.RestHandler, {
+ // summary:
+ // A REST service handler for JSON
+ // description:
+ // This class provides JSON handling for a REST service.
+ contentType: "text/json",
+ handleAs: "json",
+ headers: {"Accept": "*/json"},
+
+ _getContent: function(/*String*/method, /*Array*/parameters){
+ // summary:
+ // Generate a request content
+ // description:
+ // If 'method' is "POST" or "PUT", the first parameter in
+ // 'parameter' is used to generate a JSON content.
+ // method:
+ // A method name
+ // parameters:
+ // An array of parameters
+ // returns:
+ // A request content
+ var content = null;
+ if(method == "POST" || method == "PUT"){
+ var p = (parameters ? parameters[0] : undefined);
+ if(p){
+ if(dojo.isString(p)){
+ content = p;
+ }else{
+ content = dojo.toJson(p);
+ }
+ }
+ }
+ return content; //String
+ }
+});
+
+}