Project

General

Profile

Statistics
| Revision:

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
}