root / trunk / web / dojo / dojox / data / JsonRestStore.js @ 9
History | View | Annotate | Download (6.38 KB)
1 |
/*
|
---|---|
2 |
Copyright (c) 2004-2010, The Dojo Foundation All Rights Reserved.
|
3 |
Available via Academic Free License >= 2.1 OR the modified BSD license.
|
4 |
see: http://dojotoolkit.org/license for details
|
5 |
*/
|
6 |
|
7 |
|
8 |
if(!dojo._hasResource["dojox.data.JsonRestStore"]){ |
9 |
dojo._hasResource["dojox.data.JsonRestStore"]=true; |
10 |
dojo.provide("dojox.data.JsonRestStore");
|
11 |
dojo.require("dojox.data.ServiceStore");
|
12 |
dojo.require("dojox.rpc.JsonRest");
|
13 |
dojo.declare("dojox.data.JsonRestStore",dojox.data.ServiceStore,{constructor:function(_1){ |
14 |
dojo.connect(dojox.rpc.Rest._index,"onUpdate",this,function(_2,_3,_4,_5){ |
15 |
var _6=this.service.servicePath; |
16 |
if(!_2.__id){
|
17 |
}else{
|
18 |
if(_2.__id.substring(0,_6.length)==_6){ |
19 |
this.onSet(_2,_3,_4,_5);
|
20 |
} |
21 |
} |
22 |
}); |
23 |
this.idAttribute=this.idAttribute||"id"; |
24 |
if(typeof _1.target=="string"){ |
25 |
_1.target=_1.target.match(/\/$/)||this.allowNoTrailingSlash?_1.target:(_1.target+"/"); |
26 |
if(!this.service){ |
27 |
this.service=dojox.rpc.JsonRest.services[_1.target]||dojox.rpc.Rest(_1.target,true); |
28 |
} |
29 |
} |
30 |
dojox.rpc.JsonRest.registerService(this.service,_1.target,this.schema); |
31 |
this.schema=this.service._schema=this.schema||this.service._schema||{}; |
32 |
this.service._store=this; |
33 |
this.service.idAsRef=this.idAsRef; |
34 |
this.schema._idAttr=this.idAttribute; |
35 |
var _7=dojox.rpc.JsonRest.getConstructor(this.service); |
36 |
var _8=this; |
37 |
this._constructor=function(_9){ |
38 |
_7.call(this,_9);
|
39 |
_8.onNew(this);
|
40 |
}; |
41 |
this._constructor.prototype=_7.prototype;
|
42 |
this._index=dojox.rpc.Rest._index;
|
43 |
},loadReferencedSchema:true,idAsRef:false,referenceIntegrity:true,target:"",allowNoTrailingSlash:false,newItem:function(_a,_b){ |
44 |
_a=new this._constructor(_a); |
45 |
if(_b){
|
46 |
var _c=this.getValue(_b.parent,_b.attribute,[]); |
47 |
_c=_c.concat([_a]); |
48 |
_a.__parent=_c; |
49 |
this.setValue(_b.parent,_b.attribute,_c);
|
50 |
} |
51 |
return _a;
|
52 |
},deleteItem:function(_d){ |
53 |
var _e=[];
|
54 |
var _f=dojox.data._getStoreForItem(_d)||this; |
55 |
if(this.referenceIntegrity){ |
56 |
dojox.rpc.JsonRest._saveNotNeeded=true;
|
57 |
var _10=dojox.rpc.Rest._index;
|
58 |
var _11=function(_12){ |
59 |
var _13;
|
60 |
_e.push(_12); |
61 |
_12.__checked=1;
|
62 |
for(var i in _12){ |
63 |
if(i.substring(0,2)!="__"){ |
64 |
var _14=_12[i];
|
65 |
if(_14==_d){
|
66 |
if(_12!=_10){
|
67 |
if(_12 instanceof Array){ |
68 |
(_13=_13||[]).push(i); |
69 |
}else{
|
70 |
(dojox.data._getStoreForItem(_12)||_f).unsetAttribute(_12,i); |
71 |
} |
72 |
} |
73 |
}else{
|
74 |
if((typeof _14=="object")&&_14){ |
75 |
if(!_14.__checked){
|
76 |
_11(_14); |
77 |
} |
78 |
if(typeof _14.__checked=="object"&&_12!=_10){ |
79 |
(dojox.data._getStoreForItem(_12)||_f).setValue(_12,i,_14.__checked); |
80 |
} |
81 |
} |
82 |
} |
83 |
} |
84 |
} |
85 |
if(_13){
|
86 |
i=_13.length; |
87 |
_12=_12.__checked=_12.concat(); |
88 |
while(i--){
|
89 |
_12.splice(_13[i],1);
|
90 |
} |
91 |
return _12;
|
92 |
} |
93 |
return null; |
94 |
}; |
95 |
_11(_10); |
96 |
dojox.rpc.JsonRest._saveNotNeeded=false;
|
97 |
var i=0; |
98 |
while(_e[i]){
|
99 |
delete _e[i++].__checked;
|
100 |
} |
101 |
} |
102 |
dojox.rpc.JsonRest.deleteObject(_d); |
103 |
_f.onDelete(_d); |
104 |
},changing:function(_15,_16){ |
105 |
dojox.rpc.JsonRest.changing(_15,_16); |
106 |
},setValue:function(_17,_18,_19){ |
107 |
var old=_17[_18];
|
108 |
var _1a=_17.__id?dojox.data._getStoreForItem(_17):this; |
109 |
if(dojox.json.schema&&_1a.schema&&_1a.schema.properties){
|
110 |
dojox.json.schema.mustBeValid(dojox.json.schema.checkPropertyChange(_19,_1a.schema.properties[_18])); |
111 |
} |
112 |
if(_18==_1a.idAttribute){
|
113 |
throw new Error("Can not change the identity attribute for an item"); |
114 |
} |
115 |
_1a.changing(_17); |
116 |
_17[_18]=_19; |
117 |
if(_19&&!_19.__parent){
|
118 |
_19.__parent=_17; |
119 |
} |
120 |
_1a.onSet(_17,_18,old,_19); |
121 |
},setValues:function(_1b,_1c,_1d){ |
122 |
if(!dojo.isArray(_1d)){
|
123 |
throw new Error("setValues expects to be passed an Array object as its value"); |
124 |
} |
125 |
this.setValue(_1b,_1c,_1d);
|
126 |
},unsetAttribute:function(_1e,_1f){ |
127 |
this.changing(_1e);
|
128 |
var old=_1e[_1f];
|
129 |
delete _1e[_1f];
|
130 |
this.onSet(_1e,_1f,old,undefined); |
131 |
},save:function(_20){ |
132 |
if(!(_20&&_20.global)){
|
133 |
(_20=_20||{}).service=this.service;
|
134 |
} |
135 |
if("syncMode" in _20?_20.syncMode:this.syncMode){ |
136 |
dojox.rpc._sync=true;
|
137 |
} |
138 |
var _21=dojox.rpc.JsonRest.commit(_20);
|
139 |
this.serverVersion=this._updates&&this._updates.length; |
140 |
return _21;
|
141 |
},revert:function(_22){ |
142 |
dojox.rpc.JsonRest.revert(_22&&_22.global&&this.service);
|
143 |
},isDirty:function(_23){ |
144 |
return dojox.rpc.JsonRest.isDirty(_23);
|
145 |
},isItem:function(_24,_25){ |
146 |
return _24&&_24.__id&&(_25||this.service==dojox.rpc.JsonRest.getServiceAndId(_24.__id).service); |
147 |
},_doQuery:function(_26){ |
148 |
var _27=typeof _26.queryStr=="string"?_26.queryStr:_26.query; |
149 |
var _28=dojox.rpc.JsonRest.query(this.service,_27,_26); |
150 |
var _29=this; |
151 |
if(this.loadReferencedSchema){ |
152 |
_28.addCallback(function(_2a){
|
153 |
var _2b=_28.ioArgs&&_28.ioArgs.xhr&&_28.ioArgs.xhr.getResponseHeader("Content-Type"); |
154 |
var _2c=_2b&&_2b.match(/definedby\s*=\s*([^;]*)/); |
155 |
if(_2b&&!_2c){
|
156 |
_2c=_28.ioArgs.xhr.getResponseHeader("Link");
|
157 |
_2c=_2c&&_2c.match(/<([^>]*)>;\s*rel="?definedby"?/);
|
158 |
} |
159 |
_2c=_2c&&_2c[1];
|
160 |
if(_2c){
|
161 |
var _2d=dojox.rpc.JsonRest.getServiceAndId((_29.target+_2c).replace(/^(.*\/)?(\w+:\/\/)|[^\/\.]+\/\.\.\/|^.*\/(\/)/,"$2$3")); |
162 |
var _2e=dojox.rpc.JsonRest.byId(_2d.service,_2d.id);
|
163 |
_2e.addCallbacks(function(_2f){
|
164 |
dojo.mixin(_29.schema,_2f); |
165 |
return _2a;
|
166 |
},function(_30){
|
167 |
console.error(_30); |
168 |
return _2a;
|
169 |
}); |
170 |
return _2e;
|
171 |
} |
172 |
return undefined; |
173 |
}); |
174 |
} |
175 |
return _28;
|
176 |
},_processResults:function(_31,_32){ |
177 |
var _33=_31.length;
|
178 |
return {totalCount:_32.fullLength||(_32.request.count==_33?(_32.request.start||0)+_33*2:_33),items:_31}; |
179 |
},getConstructor:function(){ |
180 |
return this._constructor; |
181 |
},getIdentity:function(_34){ |
182 |
var id=_34.__clientId||_34.__id;
|
183 |
if(!id){
|
184 |
return id;
|
185 |
} |
186 |
var _35=this.service.servicePath.replace(/[^\/]*$/,""); |
187 |
return id.substring(0,_35.length)!=_35?id:id.substring(_35.length); |
188 |
},fetchItemByIdentity:function(_36){ |
189 |
var id=_36.identity;
|
190 |
var _37=this; |
191 |
if(id.toString().match(/^(\w*:)?\//)){ |
192 |
var _38=dojox.rpc.JsonRest.getServiceAndId(id);
|
193 |
_37=_38.service._store; |
194 |
_36.identity=_38.id; |
195 |
} |
196 |
_36._prefix=_37.service.servicePath.replace(/[^\/]*$/,""); |
197 |
return _37.inherited(arguments); |
198 |
},onSet:function(){ |
199 |
},onNew:function(){ |
200 |
},onDelete:function(){ |
201 |
},getFeatures:function(){ |
202 |
var _39=this.inherited(arguments); |
203 |
_39["dojo.data.api.Write"]=true; |
204 |
_39["dojo.data.api.Notification"]=true; |
205 |
return _39;
|
206 |
},getParent:function(_3a){ |
207 |
return _3a&&_3a.__parent;
|
208 |
}}); |
209 |
dojox.data.JsonRestStore.getStore=function(_3b,_3c){ |
210 |
if(typeof _3b.target=="string"){ |
211 |
_3b.target=_3b.target.match(/\/$/)||_3b.allowNoTrailingSlash?_3b.target:(_3b.target+"/"); |
212 |
var _3d=(dojox.rpc.JsonRest.services[_3b.target]||{})._store;
|
213 |
if(_3d){
|
214 |
return _3d;
|
215 |
} |
216 |
} |
217 |
return new (_3c||dojox.data.JsonRestStore)(_3b); |
218 |
}; |
219 |
dojox.data._getStoreForItem=function(_3e){ |
220 |
if(_3e.__id){
|
221 |
var _3f=dojox.rpc.JsonRest.getServiceAndId(_3e.__id);
|
222 |
if(_3f&&_3f.service._store){
|
223 |
return _3f.service._store;
|
224 |
}else{
|
225 |
var _40=_3e.__id.toString().match(/.*\//)[0]; |
226 |
return new dojox.data.JsonRestStore({target:_40}); |
227 |
} |
228 |
} |
229 |
return null; |
230 |
}; |
231 |
dojox.json.ref._useRefs=true;
|
232 |
} |