Subversion Repositories Applications.papyrus

Rev

Details | Last modification | View Log | RSS feed

Rev Author Line No. Line
2150 mathias 1
if(!dojo._hasResource["dojox.wire.ml.Service"]){ //_hasResource checks added by build. Do not use _hasResource directly in your code.
2
dojo._hasResource["dojox.wire.ml.Service"] = true;
3
dojo.provide("dojox.wire.ml.Service");
4
dojo.provide("dojox.wire.ml.RestHandler");
5
dojo.provide("dojox.wire.ml.XmlHandler");
6
dojo.provide("dojox.wire.ml.JsonHandler");
7
 
8
dojo.require("dijit._Widget");
9
dojo.require("dojox.data.dom");
10
dojo.require("dojox.wire._base");
11
dojo.require("dojox.wire.ml.util");
12
 
13
dojo.declare("dojox.wire.ml.Service", dijit._Widget, {
14
	//	summary:
15
	//		A widget for a service
16
	//	description:
17
	//		This widget represents a service defined by a service description
18
	//		specified with 'url' attribute.
19
	//		If 'serviceType' and 'serviceUrl' attributes are specified, 'url'
20
	//		attribute can be omitted.
21
	//	url:
22
	//		A URL to a service description
23
	//	serviceUrl:
24
	//		A URL to a service
25
	//	serviceType:
26
	//		A service type
27
	//	handlerClass:
28
	//		A service handler class name
29
	url: "",
30
	serviceUrl: "",
31
	serviceType: "",
32
	handlerClass: "",
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
		//	desription:
54
		//		A service handler class is determined by:
55
		//		1. 'handlerClass' attribute
56
		//		2. 'serviceType' attribute
57
		//		3. 'serviceType' property in a service description
58
		//	returns:
59
		//		A service handler
60
		if(this.url){
61
			var self = this;
62
			var d = dojo.xhrGet({
63
				url: this.url,
64
				handleAs: "json",
65
				sync: true
66
			});
67
			d.addCallback(function(result){
68
				self.smd = result;
69
			});
70
			if(this.smd && !this.serviceUrl){
71
				this.serviceUrl = (this.smd.serviceUrl || this.smd.serviceURL);
72
			}
73
		}
74
		var handlerClass = undefined;
75
		if(this.handlerClass){
76
			handlerClass = dojox.wire._getClass(this.handlerClass);
77
		}else if(this.serviceType){
78
			handlerClass = this._handlerClasses[this.serviceType];
79
			if(handlerClass && dojo.isString(handlerClass)){
80
				handlerClass = dojox.wire._getClass(handlerClass);
81
				this._handlerClasses[this.serviceType] = handlerClass;
82
			}
83
		}else if(this.smd && this.smd.serviceType){
84
			handlerClass = this._handlerClasses[this.smd.serviceType];
85
			if(handlerClass && dojo.isString(handlerClass)){
86
				handlerClass = dojox.wire._getClass(handlerClass);
87
				this._handlerClasses[this.smd.serviceType] = handlerClass;
88
			}
89
		}
90
		if(!handlerClass){
91
			return null; //null
92
		}
93
		return new handlerClass(); //Object
94
	},
95
 
96
	callMethod: function(method, parameters){
97
		//	summary:
98
		//		Call a service method with parameters
99
		//	method:
100
		//		A method name
101
		//	parameters:
102
		//		An array parameters
103
		var deferred = new dojo.Deferred();
104
		this.handler.bind(method, parameters, deferred, this.serviceUrl);
105
		return deferred;
106
	}
107
});
108
 
109
dojo.declare("dojox.wire.ml.RestHandler", null, {
110
	//	summary:
111
	//		A REST service handler
112
	//	description:
113
	//		This class serves as a base REST service.
114
	//		Sub-classes may override _getContent() and _getResult() to handle
115
	//		specific content types.
116
	contentType: "text/plain",
117
	handleAs: "text",
118
 
119
	bind: function(method, parameters, deferred, url){
120
		//	summary:
121
		//		Call a service method with parameters.
122
		//	description:
123
		//		A service is called with a URL generated by _getUrl() and
124
		//		an HTTP method specified with 'method'.
125
		//		For "POST" and "PUT", a content is generated by _getContent().
126
		//		When data is loaded, _getResult() is used to pass the result to
127
		//		Deferred.callback().
128
		//	method:
129
		//		A method name
130
		//	parameters:
131
		//		An array of parameters
132
		//	deferred:
133
		//		'Deferred'
134
		//	url:
135
		//		A URL for the method
136
		method = method.toUpperCase();
137
		var self = this;
138
		var args = {
139
			url: this._getUrl(method, parameters, url),
140
			contentType: this.contentType,
141
			handleAs: this.handleAs,
142
			headers: this.headers,
143
			preventCache: this.preventCache
144
		};
145
		var d = null;
146
		if(method == "POST"){
147
			args.postData = this._getContent(method, parameters);
148
			d = dojo.rawXhrPost(args);
149
		}else if(method == "PUT"){
150
			args.putData = this._getContent(method, parameters);
151
			d = dojo.rawXhrPut(args);
152
		}else if(method == "DELETE"){
153
			d = dojo.xhrDelete(args);
154
		}else{ // "GET"
155
			d = dojo.xhrGet(args);
156
		}
157
		d.addCallbacks(function(result){
158
			deferred.callback(self._getResult(result));
159
		}, function(error){
160
			deferred.errback(error);
161
		});
162
	},
163
 
164
	_getUrl: function(/*String*/method, /*Array*/parameters, /*String*/url){
165
		//	summary:
166
		//		Generate a URL
167
		//	description:
168
		//		If 'method' is "GET" or "DELETE", a query string is generated
169
		//		from a query object specified to the first parameter in
170
		//		'parameters' and appended to 'url'.
171
		//		If 'url' contains variable seguments ("{parameter_name}"),
172
		//		they are replaced with corresponding parameter values, instead.
173
		//	method:
174
		//		A method name
175
		//	parameters:
176
		//		An array of parameters
177
		//	url:
178
		//		A base URL
179
		//	returns:
180
		//		A URL
181
		if(method == "GET" || method == "DELETE"){
182
			var query = parameters[0];
183
			var queryString = "";
184
			for(var name in query){
185
				var value = query[name];
186
				if(value){
187
					value = encodeURIComponent(value);
188
					var variable = "{" + name + "}";
189
					var index = url.indexOf(variable);
190
					if(index >= 0){ // encode in path
191
						url = url.substring(0, index) + value + url.substring(index + variable.length);
192
					}else{ // encode as query string
193
						if(queryString){
194
							queryString += "&";
195
						}
196
						queryString += (name + "=" + value);
197
					}
198
				}
199
			}
200
			if(queryString){
201
				url += "?" + queryString;
202
			}
203
		}
204
		return url; //String
205
	},
206
 
207
	_getContent: function(/*String*/method, /*Array*/parameters){
208
		//	summary:
209
		//		Generate a request content
210
		//	description:
211
		//		If 'method' is "POST" or "PUT", the first parameter in
212
		//		'parameters' is returned.
213
		//	method:
214
		//		A method name
215
		//	parameters:
216
		//		An array of parameters
217
		//	returns:
218
		//		A request content
219
		if(method == "POST" || method == "PUT"){
220
			return (parameters ? parameters[0] : null); //anything
221
		}else{
222
			return null; //null
223
		}
224
	},
225
 
226
	_getResult: function(/*anything*/data){
227
		//	summary:
228
		//		Extract a result
229
		//	description:
230
		//		A response data is returned as is.
231
		//	data:
232
		//		A response data returned by a service
233
		//	returns:
234
		//		A result object
235
		return data; //anything
236
	}
237
});
238
 
239
dojo.declare("dojox.wire.ml.XmlHandler", dojox.wire.ml.RestHandler, {
240
	//	summary:
241
	//		A REST service handler for XML
242
	//	description:
243
	//		This class provides XML handling for a REST service.
244
	contentType: "text/xml",
245
	handleAs: "xml",
246
 
247
	_getContent: function(/*String*/method, /*Array*/parameters){
248
		//	description:
249
		//		If 'method' is "POST" or "PUT", the first parameter in
250
		//		'parameters' is used to generate an XML content.
251
		//	method:
252
		//		A method name
253
		//	parameters:
254
		//		An array of parameters
255
		//	returns:
256
		//		A request content
257
		var content = null;
258
		if(method == "POST" || method == "PUT"){
259
			var p = parameters[0];
260
			if(p){
261
				if(dojo.isString(p)){
262
					content = p;
263
				}else{
264
					var element = p;
265
					if(element instanceof dojox.wire.ml.XmlElement){
266
						element = element.element;
267
					}else if(element.nodeType === 9 /* DOCUMENT_NODE */){
268
						element = element.documentElement;
269
					}
270
					var declaration = "<?xml version=\"1.0\"?>"; // TODO: encoding?
271
					content = declaration + dojox.data.dom.innerXML(element);
272
				}
273
			}
274
		}
275
		return content;
276
	},
277
 
278
	_getResult: function(/*Document*/data){
279
		//	summary:
280
		//		Extract a result
281
		//	description:
282
		//		A response data (XML Document) is returned wrapped with
283
		//		XmlElement.
284
		//	data:
285
		//		A response data returned by a service
286
		//	returns:
287
		//		A result object
288
		if(data){
289
			data = new dojox.wire.ml.XmlElement(data);
290
		}
291
		return data;
292
	}
293
});
294
 
295
dojo.declare("dojox.wire.ml.JsonHandler", dojox.wire.ml.RestHandler, {
296
	//	summary:
297
	//		A REST service handler for JSON
298
	//	description:
299
	//		This class provides JSON handling for a REST service.
300
	contentType: "text/json",
301
	handleAs: "json",
302
	headers: {"Accept": "*/json"},
303
 
304
	_getContent: function(/*String*/method, /*Array*/parameters){
305
		//	summary:
306
		//		Generate a request content
307
		//	description:
308
		//		If 'method' is "POST" or "PUT", the first parameter in
309
		//		'parameter' is used to generate a JSON content.
310
		//	method:
311
		//		A method name
312
		//	parameters:
313
		//		An array of parameters
314
		//	returns:
315
		//		A request content
316
		var content = null;
317
		if(method == "POST" || method == "PUT"){
318
			var p = (parameters ? parameters[0] : undefined);
319
			if(p){
320
				if(dojo.isString(p)){
321
					content = p;
322
				}else{
323
					content = dojo.toJson(p);
324
				}
325
			}
326
		}
327
		return content; //String
328
	}
329
});
330
 
331
}