blob: 48e509bfa3d7c43e64671200ad414dcdf7710ba4 [file] [log] [blame]
/*
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.data.JsonRestStore"]){
dojo._hasResource["dojox.data.JsonRestStore"]=true;
dojo.provide("dojox.data.JsonRestStore");
dojo.require("dojox.data.ServiceStore");
dojo.require("dojox.rpc.JsonRest");
dojo.declare("dojox.data.JsonRestStore",dojox.data.ServiceStore,{constructor:function(_1){
dojo.connect(dojox.rpc.Rest._index,"onUpdate",this,function(_2,_3,_4,_5){
var _6=this.service.servicePath;
if(!_2.__id){
}else{
if(_2.__id.substring(0,_6.length)==_6){
this.onSet(_2,_3,_4,_5);
}
}
});
this.idAttribute=this.idAttribute||"id";
if(typeof _1.target=="string"&&!this.service){
this.service=dojox.rpc.Rest(this.target,true);
}
dojox.rpc.JsonRest.registerService(this.service,_1.target,this.schema);
this.schema=this.service._schema=this.schema||this.service._schema||{};
this.service._store=this;
this.schema._idAttr=this.idAttribute;
var _7=dojox.rpc.JsonRest.getConstructor(this.service);
var _8=this;
this._constructor=function(_9){
_7.call(this,_9);
_8.onNew(this);
};
this._constructor.prototype=_7.prototype;
this._index=dojox.rpc.Rest._index;
},referenceIntegrity:true,target:"",newItem:function(_a,_b){
_a=new this._constructor(_a);
if(_b){
var _c=this.getValue(_b.parent,_b.attribute,[]);
this.setValue(_b.parent,_b.attribute,_c.concat([_a]));
}
return _a;
},deleteItem:function(_d){
var _e=[];
var _f=dojox.data._getStoreForItem(_d)||this;
if(this.referenceIntegrity){
dojox.rpc.JsonRest._saveNotNeeded=true;
var _10=dojox.rpc.Rest._index;
var _11=function(_12){
var _13;
_e.push(_12);
_12.__checked=1;
for(var i in _12){
var _15=_12[i];
if(_15==_d){
if(_12!=_10){
if(_12 instanceof Array){
(_13=_13||[]).push(i);
}else{
(dojox.data._getStoreForItem(_12)||_f).unsetAttribute(_12,i);
}
}
}else{
if((typeof _15=="object")&&_15){
if(!_15.__checked){
_11(_15);
}
if(typeof _15.__checked=="object"&&_12!=_10){
(dojox.data._getStoreForItem(_12)||_f).setValue(_12,i,_15.__checked);
}
}
}
}
if(_13){
i=_13.length;
_12=_12.__checked=_12.concat();
while(i--){
_12.splice(_13[i],1);
}
return _12;
}
return null;
};
_11(_10);
dojox.rpc.JsonRest._saveNotNeeded=false;
var i=0;
while(_e[i]){
delete _e[i++].__checked;
}
}
dojox.rpc.JsonRest.deleteObject(_d);
_f.onDelete(_d);
},changing:function(_17,_18){
dojox.rpc.JsonRest.changing(_17,_18);
},setValue:function(_19,_1a,_1b){
var old=_19[_1a];
var _1d=_19.__id?dojox.data._getStoreForItem(_19):this;
if(dojox.json.schema&&_1d.schema&&_1d.schema.properties){
dojox.json.schema.mustBeValid(dojox.json.schema.checkPropertyChange(_1b,_1d.schema.properties[_1a]));
}
if(_1a==_1d.idAttribute){
throw new Error("Can not change the identity attribute for an item");
}
_1d.changing(_19);
_19[_1a]=_1b;
_1d.onSet(_19,_1a,old,_1b);
},setValues:function(_1e,_1f,_20){
if(!dojo.isArray(_20)){
throw new Error("setValues expects to be passed an Array object as its value");
}
this.setValue(_1e,_1f,_20);
},unsetAttribute:function(_21,_22){
this.changing(_21);
var old=_21[_22];
delete _21[_22];
this.onSet(_21,_22,old,undefined);
},save:function(_24){
if(!(_24&&_24.global)){
(_24=_24||{}).service=this.service;
}
var _25=dojox.rpc.JsonRest.commit(_24);
this.serverVersion=this._updates&&this._updates.length;
return _25;
},revert:function(_26){
var _27=dojox.rpc.JsonRest.getDirtyObjects().concat([]);
while(_27.length>0){
var d=_27.pop();
var _29=dojox.data._getStoreForItem(d.object||d.old);
if(!d.object){
_29.onNew(d.old);
}else{
if(!d.old){
_29.onDelete(d.object);
}else{
for(var i in d.object){
if(d.object[i]!=d.old[i]){
_29.onSet(d.object,i,d.object[i],d.old[i]);
}
}
}
}
}
dojox.rpc.JsonRest.revert(_26&&_26.global&&this.service);
},isDirty:function(_2b){
return dojox.rpc.JsonRest.isDirty(_2b);
},isItem:function(_2c,_2d){
return _2c&&_2c.__id&&(_2d||this.service==dojox.rpc.JsonRest.getServiceAndId(_2c.__id).service);
},_doQuery:function(_2e){
var _2f=typeof _2e.queryStr=="string"?_2e.queryStr:_2e.query;
return dojox.rpc.JsonRest.query(this.service,_2f,_2e);
},_processResults:function(_30,_31){
var _32=_30.length;
return {totalCount:_31.fullLength||(_31.request.count==_32?(_31.request.start||0)+_32*2:_32),items:_30};
},getConstructor:function(){
return this._constructor;
},getIdentity:function(_33){
var id=_33.__clientId||_33.__id;
if(!id){
return id;
}
var _35=this.service.servicePath;
return id.substring(0,_35.length)!=_35?id:id.substring(_35.length);
},fetchItemByIdentity:function(_36){
var id=_36.identity;
var _38=this;
if(id.match(/^(\w*:)?\//)){
var _39=dojox.rpc.JsonRest.getServiceAndId(id);
_38=_39.service._store;
_36.identity=_39.id;
}
_36._prefix=_38.service.servicePath;
return _38.inherited(arguments);
},onSet:function(){
},onNew:function(){
},onDelete:function(){
},getFeatures:function(){
var _3a=this.inherited(arguments);
_3a["dojo.data.api.Write"]=true;
_3a["dojo.data.api.Notification"]=true;
return _3a;
}});
dojox.data._getStoreForItem=function(_3b){
if(_3b.__id){
var _3c=_3b.__id.match(/.*\//)[0];
var _3d=dojox.rpc.JsonRest.services[_3c];
return _3d?_3d._store:new dojox.data.JsonRestStore({target:_3c});
}
return null;
};
dojox.json.ref._useRefs=true;
}