| /* |
| Copyright (c) 2004-2009, The Dojo Foundation All Rights Reserved. |
| Available via Academic Free License >= 2.1 OR the modified BSD license. |
| see: http://dojotoolkit.org/license for details |
| */ |
| |
| |
| if(!dojo._hasResource["dojox.rpc.JsonRest"]){ |
| dojo._hasResource["dojox.rpc.JsonRest"]=true; |
| dojo.provide("dojox.rpc.JsonRest"); |
| dojo.require("dojox.json.ref"); |
| dojo.require("dojox.rpc.Rest"); |
| (function(){ |
| var _1=[]; |
| var _2=dojox.rpc.Rest; |
| var jr; |
| function _3(_4,_5,_6,_7){ |
| var _8=_5.ioArgs&&_5.ioArgs.xhr&&_5.ioArgs.xhr.getResponseHeader("Last-Modified"); |
| if(_8&&_2._timeStamps){ |
| _2._timeStamps[_7]=_8; |
| } |
| var _9=_4._schema&&_4._schema.hrefProperty; |
| if(_9){ |
| dojox.json.ref.refAttribute=_9; |
| } |
| _6=_6&&dojox.json.ref.resolveJson(_6,{defaultId:_7,index:_2._index,timeStamps:_8&&_2._timeStamps,time:_8,idPrefix:_4.servicePath.replace(/[^\/]*$/,""),idAttribute:jr.getIdAttribute(_4),schemas:jr.schemas,loader:jr._loader,idAsRef:_4.idAsRef,assignAbsoluteIds:true}); |
| dojox.json.ref.refAttribute="$ref"; |
| return _6; |
| }; |
| jr=dojox.rpc.JsonRest={serviceClass:dojox.rpc.Rest,conflictDateHeader:"If-Unmodified-Since",commit:function(_a){ |
| _a=_a||{}; |
| var _b=[]; |
| var _c={}; |
| var _d=[]; |
| for(var i=0;i<_1.length;i++){ |
| var _e=_1[i]; |
| var _f=_e.object; |
| var old=_e.old; |
| var _10=false; |
| if(!(_a.service&&(_f||old)&&(_f||old).__id.indexOf(_a.service.servicePath))&&_e.save){ |
| delete _f.__isDirty; |
| if(_f){ |
| if(old){ |
| var _11; |
| if((_11=_f.__id.match(/(.*)#.*/))){ |
| _f=_2._index[_11[1]]; |
| } |
| if(!(_f.__id in _c)){ |
| _c[_f.__id]=_f; |
| if(_a.incrementalUpdates&&!_11){ |
| var _12=(typeof _a.incrementalUpdates=="function"?_a.incrementalUpdates:function(){ |
| _12={}; |
| for(var j in _f){ |
| if(_f.hasOwnProperty(j)){ |
| if(_f[j]!==old[j]){ |
| _12[j]=_f[j]; |
| } |
| }else{ |
| if(old.hasOwnProperty(j)){ |
| return null; |
| } |
| } |
| } |
| return _12; |
| })(_f,old); |
| } |
| if(_12){ |
| _b.push({method:"post",target:_f,content:_12}); |
| }else{ |
| _b.push({method:"put",target:_f,content:_f}); |
| } |
| } |
| }else{ |
| var _13=jr.getServiceAndId(_f.__id).service; |
| var _14=jr.getIdAttribute(_13); |
| if((_14 in _f)&&!_a.alwaysPostNewItems){ |
| _b.push({method:"put",target:_f,content:_f}); |
| }else{ |
| _b.push({method:"post",target:{__id:_13.servicePath},content:_f}); |
| } |
| } |
| }else{ |
| if(old){ |
| _b.push({method:"delete",target:old}); |
| } |
| } |
| _d.push(_e); |
| _1.splice(i--,1); |
| } |
| } |
| dojo.connect(_a,"onError",function(){ |
| if(_a.revertOnError!==false){ |
| var _15=_1; |
| _1=_d; |
| var _16=0; |
| jr.revert(); |
| _1=_15; |
| }else{ |
| _1=dirtyObject.concat(_d); |
| } |
| }); |
| jr.sendToServer(_b,_a); |
| return _b; |
| },sendToServer:function(_17,_18){ |
| var _19; |
| var _1a=dojo.xhr; |
| var _1b=_17.length; |
| var i,_1c; |
| var _1d; |
| var _1e=this.conflictDateHeader; |
| dojo.xhr=function(_1f,_20){ |
| _20.headers=_20.headers||{}; |
| _20.headers["Transaction"]=_17.length-1==i?"commit":"open"; |
| if(_1e&&_1d){ |
| _20.headers[_1e]=_1d; |
| } |
| if(_1c){ |
| _20.headers["Content-ID"]="<"+_1c+">"; |
| } |
| return _1a.apply(dojo,arguments); |
| }; |
| for(i=0;i<_17.length;i++){ |
| var _21=_17[i]; |
| dojox.rpc.JsonRest._contentId=_21.content&&_21.content.__id; |
| var _22=_21.method=="post"; |
| _1d=_21.method=="put"&&_2._timeStamps[_21.content.__id]; |
| if(_1d){ |
| _2._timeStamps[_21.content.__id]=(new Date())+""; |
| } |
| _1c=_22&&dojox.rpc.JsonRest._contentId; |
| var _23=jr.getServiceAndId(_21.target.__id); |
| var _24=_23.service; |
| var dfd=_21.deferred=_24[_21.method](_23.id.replace(/#/,""),dojox.json.ref.toJson(_21.content,false,_24.servicePath,true)); |
| (function(_25,dfd,_26){ |
| dfd.addCallback(function(_27){ |
| try{ |
| var _28=dfd.ioArgs.xhr&&dfd.ioArgs.xhr.getResponseHeader("Location"); |
| if(_28){ |
| var _29=_28.match(/(^\w+:\/\/)/)&&_28.indexOf(_26.servicePath); |
| _28=_29>0?_28.substring(_29):(_26.servicePath+_28).replace(/^(.*\/)?(\w+:\/\/)|[^\/\.]+\/\.\.\/|^.*\/(\/)/,"$2$3"); |
| _25.__id=_28; |
| _2._index[_28]=_25; |
| } |
| _27=_3(_26,dfd,_27,_25&&_25.__id); |
| } |
| catch(e){ |
| } |
| if(!(--_1b)){ |
| if(_18.onComplete){ |
| _18.onComplete.call(_18.scope,_17); |
| } |
| } |
| return _27; |
| }); |
| })(_21.content,dfd,_24); |
| dfd.addErrback(function(_2a){ |
| _1b=-1; |
| _18.onError.call(_18.scope,_2a); |
| }); |
| } |
| dojo.xhr=_1a; |
| },getDirtyObjects:function(){ |
| return _1; |
| },revert:function(_2b){ |
| for(var i=_1.length;i>0;){ |
| i--; |
| var _2c=_1[i]; |
| var _2d=_2c.object; |
| var old=_2c.old; |
| var _2e=dojox.data._getStoreForItem(_2d||old); |
| if(!(_2b&&(_2d||old)&&(_2d||old).__id.indexOf(_2b.servicePath))){ |
| if(_2d&&old){ |
| for(var j in old){ |
| if(old.hasOwnProperty(j)&&_2d[j]!==old[j]){ |
| if(_2e){ |
| _2e.onSet(_2d,j,_2d[j],old[j]); |
| } |
| _2d[j]=old[j]; |
| } |
| } |
| for(j in _2d){ |
| if(!old.hasOwnProperty(j)){ |
| if(_2e){ |
| _2e.onSet(_2d,j,_2d[j]); |
| } |
| delete _2d[j]; |
| } |
| } |
| }else{ |
| if(!old){ |
| if(_2e){ |
| _2e.onDelete(_2d); |
| } |
| }else{ |
| if(_2e){ |
| _2e.onNew(old); |
| } |
| } |
| } |
| delete (_2d||old).__isDirty; |
| _1.splice(i,1); |
| } |
| } |
| },changing:function(_2f,_30){ |
| if(!_2f.__id){ |
| return; |
| } |
| _2f.__isDirty=true; |
| for(var i=0;i<_1.length;i++){ |
| var _31=_1[i]; |
| if(_2f==_31.object){ |
| if(_30){ |
| _31.object=false; |
| if(!this._saveNotNeeded){ |
| _31.save=true; |
| } |
| } |
| return; |
| } |
| } |
| var old=_2f instanceof Array?[]:{}; |
| for(i in _2f){ |
| if(_2f.hasOwnProperty(i)){ |
| old[i]=_2f[i]; |
| } |
| } |
| _1.push({object:!_30&&_2f,old:old,save:!this._saveNotNeeded}); |
| },deleteObject:function(_32){ |
| this.changing(_32,true); |
| },getConstructor:function(_33,_34){ |
| if(typeof _33=="string"){ |
| var _35=_33; |
| _33=new dojox.rpc.Rest(_33,true); |
| this.registerService(_33,_35,_34); |
| } |
| if(_33._constructor){ |
| return _33._constructor; |
| } |
| _33._constructor=function(_36){ |
| var _37=this; |
| var _38=arguments; |
| var _39; |
| var _3a; |
| function _3b(_3c){ |
| if(_3c){ |
| _3b(_3c["extends"]); |
| _39=_3c.properties; |
| for(var i in _39){ |
| var _3d=_39[i]; |
| if(_3d&&(typeof _3d=="object")&&("default" in _3d)){ |
| _37[i]=_3d["default"]; |
| } |
| } |
| } |
| if(_3c&&_3c.prototype&&_3c.prototype.initialize){ |
| _3a=true; |
| _3c.prototype.initialize.apply(_37,_38); |
| } |
| }; |
| _3b(_33._schema); |
| if(!_3a&&_36&&typeof _36=="object"){ |
| dojo.mixin(_37,_36); |
| } |
| var _3e=jr.getIdAttribute(_33); |
| _2._index[this.__id=this.__clientId=_33.servicePath+(this[_3e]||Math.random().toString(16).substring(2,14)+"@"+((dojox.rpc.Client&&dojox.rpc.Client.clientId)||"client"))]=this; |
| if(dojox.json.schema&&_39){ |
| dojox.json.schema.mustBeValid(dojox.json.schema.validate(this,_33._schema)); |
| } |
| _1.push({object:this,save:true}); |
| }; |
| return dojo.mixin(_33._constructor,_33._schema,{load:_33}); |
| },fetch:function(_3f){ |
| var _40=jr.getServiceAndId(_3f); |
| return this.byId(_40.service,_40.id); |
| },getIdAttribute:function(_41){ |
| var _42=_41._schema; |
| var _43; |
| if(_42){ |
| if(!(_43=_42._idAttr)){ |
| for(var i in _42.properties){ |
| if(_42.properties[i].identity||(_42.properties[i].link=="self")){ |
| _42._idAttr=_43=i; |
| } |
| } |
| } |
| } |
| return _43||"id"; |
| },getServiceAndId:function(_44){ |
| var _45=""; |
| for(var _46 in jr.services){ |
| if((_44.substring(0,_46.length)==_46)&&(_46.length>=_45.length)){ |
| _45=_46; |
| } |
| } |
| if(_45){ |
| return {service:jr.services[_45],id:_44.substring(_45.length)}; |
| } |
| var _47=_44.match(/^(.*\/)([^\/]*)$/); |
| return {service:new jr.serviceClass(_47[1],true),id:_47[2]}; |
| },services:{},schemas:{},registerService:function(_48,_49,_4a){ |
| _49=_48.servicePath=_49||_48.servicePath; |
| _48._schema=jr.schemas[_49]=_4a||_48._schema||{}; |
| jr.services[_49]=_48; |
| },byId:function(_4b,id){ |
| var _4c,_4d=_2._index[(_4b.servicePath||"")+id]; |
| if(_4d&&!_4d._loadObject){ |
| _4c=new dojo.Deferred(); |
| _4c.callback(_4d); |
| return _4c; |
| } |
| return this.query(_4b,id); |
| },query:function(_4e,id,_4f){ |
| var _50=_4e(id,_4f); |
| _50.addCallback(function(_51){ |
| if(_51.nodeType&&_51.cloneNode){ |
| return _51; |
| } |
| return _3(_4e,_50,_51,typeof id!="string"||(_4f&&(_4f.start||_4f.count))?undefined:id); |
| }); |
| return _50; |
| },_loader:function(_52){ |
| var _53=jr.getServiceAndId(this.__id); |
| var _54=this; |
| jr.query(_53.service,_53.id).addBoth(function(_55){ |
| if(_55==_54){ |
| delete _55.$ref; |
| delete _55._loadObject; |
| }else{ |
| _54._loadObject=function(_56){ |
| _56(_55); |
| }; |
| } |
| _52(_55); |
| }); |
| },isDirty:function(_57){ |
| if(!_57){ |
| return !!_1.length; |
| } |
| return _57.__isDirty; |
| }}; |
| })(); |
| } |