summaryrefslogtreecommitdiff
path: root/js/dojo/dojox/rpc/Rest.js
diff options
context:
space:
mode:
Diffstat (limited to 'js/dojo/dojox/rpc/Rest.js')
-rw-r--r--js/dojo/dojox/rpc/Rest.js147
1 files changed, 147 insertions, 0 deletions
diff --git a/js/dojo/dojox/rpc/Rest.js b/js/dojo/dojox/rpc/Rest.js
new file mode 100644
index 0000000..1964479
--- /dev/null
+++ b/js/dojo/dojox/rpc/Rest.js
@@ -0,0 +1,147 @@
+//>>built
+define("dojox/rpc/Rest", ["dojo", "dojox"], function(dojo, dojox) {
+// Note: This doesn't require dojox.rpc.Service, and if you want it you must require it
+// yourself, and you must load it prior to dojox.rpc.Rest.
+
+// summary:
+// This provides a HTTP REST service with full range REST verbs include PUT,POST, and DELETE.
+// description:
+// A normal GET query is done by using the service directly:
+// | var restService = dojox.rpc.Rest("Project");
+// | restService("4");
+// This will do a GET for the URL "/Project/4".
+// | restService.put("4","new content");
+// This will do a PUT to the URL "/Project/4" with the content of "new content".
+// You can also use the SMD service to generate a REST service:
+// | var services = dojox.rpc.Service({services: {myRestService: {transport: "REST",...
+// | services.myRestService("parameters");
+//
+// The modifying methods can be called as sub-methods of the rest service method like:
+// | services.myRestService.put("parameters","data to put in resource");
+// | services.myRestService.post("parameters","data to post to the resource");
+// | services.myRestService['delete']("parameters");
+
+ dojo.getObject("rpc.Rest", true, dojox);
+
+ if(dojox.rpc && dojox.rpc.transportRegistry){
+ // register it as an RPC service if the registry is available
+ dojox.rpc.transportRegistry.register(
+ "REST",
+ function(str){return str == "REST";},
+ {
+ getExecutor : function(func,method,svc){
+ return new dojox.rpc.Rest(
+ method.name,
+ (method.contentType||svc._smd.contentType||"").match(/json|javascript/), // isJson
+ null,
+ function(id, args){
+ var request = svc._getRequest(method,[id]);
+ request.url= request.target + (request.data ? '?'+ request.data : '');
+ if(args && (args.start >= 0 || args.count >= 0)){
+ request.headers = request.headers || {};
+ request.headers.Range = "items=" + (args.start || '0') + '-' +
+ (("count" in args && args.count != Infinity) ?
+ (args.count + (args.start || 0) - 1) : '');
+ }
+ return request;
+ }
+ );
+ }
+ }
+ );
+ }
+ var drr;
+
+ function index(deferred, service, range, id){
+ deferred.addCallback(function(result){
+ if(deferred.ioArgs.xhr && range){
+ // try to record the total number of items from the range header
+ range = deferred.ioArgs.xhr.getResponseHeader("Content-Range");
+ deferred.fullLength = range && (range=range.match(/\/(.*)/)) && parseInt(range[1]);
+ }
+ return result;
+ });
+ return deferred;
+ }
+ drr = dojox.rpc.Rest = function(/*String*/path, /*Boolean?*/isJson, /*Object?*/schema, /*Function?*/getRequest){
+ // summary:
+ // Creates a REST service using the provided path.
+ var service;
+ // it should be in the form /Table/
+ service = function(id, args){
+ return drr._get(service, id, args);
+ };
+ service.isJson = isJson;
+ service._schema = schema;
+ // cache:
+ // This is an object that provides indexing service
+ // This can be overriden to take advantage of more complex referencing/indexing
+ // schemes
+ service.cache = {
+ serialize: isJson ? ((dojox.json && dojox.json.ref) || dojo).toJson : function(result){
+ return result;
+ }
+ };
+ // the default XHR args creator:
+ service._getRequest = getRequest || function(id, args){
+ if(dojo.isObject(id)){
+ id = dojo.objectToQuery(id);
+ id = id ? "?" + id: "";
+ }
+ if(args && args.sort && !args.queryStr){
+ id += (id ? "&" : "?") + "sort("
+ for(var i = 0; i<args.sort.length; i++){
+ var sort = args.sort[i];
+ id += (i > 0 ? "," : "") + (sort.descending ? '-' : '+') + encodeURIComponent(sort.attribute);
+ }
+ id += ")";
+ }
+ var request = {
+ url: path + (id == null ? "" : id),
+ handleAs: isJson ? 'json' : 'text',
+ contentType: isJson ? 'application/json' : 'text/plain',
+ sync: dojox.rpc._sync,
+ headers: {
+ Accept: isJson ? 'application/json,application/javascript' : '*/*'
+ }
+ };
+ if(args && (args.start >= 0 || args.count >= 0)){
+ request.headers.Range = "items=" + (args.start || '0') + '-' +
+ (("count" in args && args.count != Infinity) ?
+ (args.count + (args.start || 0) - 1) : '');
+ }
+ dojox.rpc._sync = false;
+ return request;
+ };
+ // each calls the event handler
+ function makeRest(name){
+ service[name] = function(id,content){
+ return drr._change(name,service,id,content); // the last parameter is to let the OfflineRest know where to store the item
+ };
+ }
+ makeRest('put');
+ makeRest('post');
+ makeRest('delete');
+ // record the REST services for later lookup
+ service.servicePath = path;
+ return service;
+ };
+
+ drr._index={};// the map of all indexed objects that have gone through REST processing
+ drr._timeStamps={};
+ // these do the actual requests
+ drr._change = function(method,service,id,content){
+ // this is called to actually do the put, post, and delete
+ var request = service._getRequest(id);
+ request[method+"Data"] = content;
+ return index(dojo.xhr(method.toUpperCase(),request,true),service);
+ };
+
+ drr._get= function(service,id, args){
+ args = args || {};
+ // this is called to actually do the get
+ return index(dojo.xhrGet(service._getRequest(id, args)), service, (args.start >= 0 || args.count >= 0), id);
+ };
+
+ return dojox.rpc.Rest;
+});