[483] | 1 | dojo.provide("dojox.wire.ml.Service"); |
---|
| 2 | |
---|
| 3 | dojo.require("dijit._Widget"); |
---|
| 4 | dojo.require("dojox.xml.parser"); |
---|
| 5 | dojo.require("dojox.wire._base"); |
---|
| 6 | dojo.require("dojox.wire.ml.util"); |
---|
| 7 | |
---|
| 8 | dojo.declare("dojox.wire.ml.Service", dijit._Widget, { |
---|
| 9 | // summary: |
---|
| 10 | // A widget for a service |
---|
| 11 | // description: |
---|
| 12 | // This widget represents a service defined by a service description |
---|
| 13 | // specified with 'url' attribute. |
---|
| 14 | // If 'serviceType' and 'serviceUrl' attributes are specified, 'url' |
---|
| 15 | // attribute can be omitted. |
---|
| 16 | |
---|
| 17 | // url: |
---|
| 18 | // A URL to a service description |
---|
| 19 | url: "", |
---|
| 20 | |
---|
| 21 | // serviceUrl: |
---|
| 22 | // A URL to a service |
---|
| 23 | serviceUrl: "", |
---|
| 24 | |
---|
| 25 | // serviceType: |
---|
| 26 | // A service type |
---|
| 27 | serviceType: "", |
---|
| 28 | |
---|
| 29 | // handlerClass: |
---|
| 30 | // A service handler class name |
---|
| 31 | handlerClass: "", |
---|
| 32 | |
---|
| 33 | preventCache: true, |
---|
| 34 | |
---|
| 35 | postCreate: function(){ |
---|
| 36 | // summary: |
---|
| 37 | // Call _createHandler() |
---|
| 38 | // description: |
---|
| 39 | // See _createHandler(). |
---|
| 40 | this.handler = this._createHandler(); |
---|
| 41 | }, |
---|
| 42 | |
---|
| 43 | _handlerClasses: { |
---|
| 44 | "TEXT": "dojox.wire.ml.RestHandler", |
---|
| 45 | "XML": "dojox.wire.ml.XmlHandler", |
---|
| 46 | "JSON": "dojox.wire.ml.JsonHandler", |
---|
| 47 | "JSON-RPC": "dojo.rpc.JsonService" |
---|
| 48 | }, |
---|
| 49 | |
---|
| 50 | _createHandler: function(){ |
---|
| 51 | // summary: |
---|
| 52 | // Create a service handler |
---|
| 53 | // description: |
---|
| 54 | // A service handler class is determined by: |
---|
| 55 | // |
---|
| 56 | // 1. 'handlerClass' attribute |
---|
| 57 | // 2. 'serviceType' attribute |
---|
| 58 | // 3. 'serviceType' property in a service description |
---|
| 59 | // returns: |
---|
| 60 | // A service handler |
---|
| 61 | if(this.url){ |
---|
| 62 | var self = this; |
---|
| 63 | var d = dojo.xhrGet({ |
---|
| 64 | url: this.url, |
---|
| 65 | handleAs: "json", |
---|
| 66 | sync: true |
---|
| 67 | }); |
---|
| 68 | d.addCallback(function(result){ |
---|
| 69 | self.smd = result; |
---|
| 70 | }); |
---|
| 71 | if(this.smd && !this.serviceUrl){ |
---|
| 72 | this.serviceUrl = (this.smd.serviceUrl || this.smd.serviceURL); |
---|
| 73 | } |
---|
| 74 | } |
---|
| 75 | var handlerClass = undefined; |
---|
| 76 | if(this.handlerClass){ |
---|
| 77 | handlerClass = dojox.wire._getClass(this.handlerClass); |
---|
| 78 | }else if(this.serviceType){ |
---|
| 79 | handlerClass = this._handlerClasses[this.serviceType]; |
---|
| 80 | if(handlerClass && dojo.isString(handlerClass)){ |
---|
| 81 | handlerClass = dojox.wire._getClass(handlerClass); |
---|
| 82 | this._handlerClasses[this.serviceType] = handlerClass; |
---|
| 83 | } |
---|
| 84 | }else if(this.smd && this.smd.serviceType){ |
---|
| 85 | handlerClass = this._handlerClasses[this.smd.serviceType]; |
---|
| 86 | if(handlerClass && dojo.isString(handlerClass)){ |
---|
| 87 | handlerClass = dojox.wire._getClass(handlerClass); |
---|
| 88 | this._handlerClasses[this.smd.serviceType] = handlerClass; |
---|
| 89 | } |
---|
| 90 | } |
---|
| 91 | if(!handlerClass){ |
---|
| 92 | return null; //null |
---|
| 93 | } |
---|
| 94 | return new handlerClass(); //Object |
---|
| 95 | }, |
---|
| 96 | |
---|
| 97 | callMethod: function(method, parameters){ |
---|
| 98 | // summary: |
---|
| 99 | // Call a service method with parameters |
---|
| 100 | // method: |
---|
| 101 | // A method name |
---|
| 102 | // parameters: |
---|
| 103 | // An array parameters |
---|
| 104 | var deferred = new dojo.Deferred(); |
---|
| 105 | this.handler.bind(method, parameters, deferred, this.serviceUrl); |
---|
| 106 | return deferred; |
---|
| 107 | } |
---|
| 108 | }); |
---|