Project

General

Profile

Statistics
| Revision:

root / trunk / web / dojo / dojox / data / AndOrReadStore.js @ 13

History | View | Annotate | Download (15 KB)

1 9 andrej.cim
/*
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.AndOrReadStore"]){
9
dojo._hasResource["dojox.data.AndOrReadStore"]=true;
10
dojo.provide("dojox.data.AndOrReadStore");
11
dojo.require("dojo.data.util.filter");
12
dojo.require("dojo.data.util.simpleFetch");
13
dojo.require("dojo.date.stamp");
14
dojo.declare("dojox.data.AndOrReadStore",null,{constructor:function(_1){
15
this._arrayOfAllItems=[];
16
this._arrayOfTopLevelItems=[];
17
this._loadFinished=false;
18
this._jsonFileUrl=_1.url;
19
this._ccUrl=_1.url;
20
this.url=_1.url;
21
this._jsonData=_1.data;
22
this.data=null;
23
this._datatypeMap=_1.typeMap||{};
24
if(!this._datatypeMap["Date"]){
25
this._datatypeMap["Date"]={type:Date,deserialize:function(_2){
26
return dojo.date.stamp.fromISOString(_2);
27
}};
28
}
29
this._features={"dojo.data.api.Read":true,"dojo.data.api.Identity":true};
30
this._itemsByIdentity=null;
31
this._storeRefPropName="_S";
32
this._itemNumPropName="_0";
33
this._rootItemPropName="_RI";
34
this._reverseRefMap="_RRM";
35
this._loadInProgress=false;
36
this._queuedFetches=[];
37
if(_1.urlPreventCache!==undefined){
38
this.urlPreventCache=_1.urlPreventCache?true:false;
39
}
40
if(_1.hierarchical!==undefined){
41
this.hierarchical=_1.hierarchical?true:false;
42
}
43
if(_1.clearOnClose){
44
this.clearOnClose=true;
45
}
46
},url:"",_ccUrl:"",data:null,typeMap:null,clearOnClose:false,urlPreventCache:false,hierarchical:true,_assertIsItem:function(_3){
47
if(!this.isItem(_3)){
48
throw new Error("dojox.data.AndOrReadStore: Invalid item argument.");
49
}
50
},_assertIsAttribute:function(_4){
51
if(typeof _4!=="string"){
52
throw new Error("dojox.data.AndOrReadStore: Invalid attribute argument.");
53
}
54
},getValue:function(_5,_6,_7){
55
var _8=this.getValues(_5,_6);
56
return (_8.length>0)?_8[0]:_7;
57
},getValues:function(_9,_a){
58
this._assertIsItem(_9);
59
this._assertIsAttribute(_a);
60
var _b=_9[_a]||[];
61
return _b.slice(0,_b.length);
62
},getAttributes:function(_c){
63
this._assertIsItem(_c);
64
var _d=[];
65
for(var _e in _c){
66
if((_e!==this._storeRefPropName)&&(_e!==this._itemNumPropName)&&(_e!==this._rootItemPropName)&&(_e!==this._reverseRefMap)){
67
_d.push(_e);
68
}
69
}
70
return _d;
71
},hasAttribute:function(_f,_10){
72
this._assertIsItem(_f);
73
this._assertIsAttribute(_10);
74
return (_10 in _f);
75
},containsValue:function(_11,_12,_13){
76
var _14=undefined;
77
if(typeof _13==="string"){
78
_14=dojo.data.util.filter.patternToRegExp(_13,false);
79
}
80
return this._containsValue(_11,_12,_13,_14);
81
},_containsValue:function(_15,_16,_17,_18){
82
return dojo.some(this.getValues(_15,_16),function(_19){
83
if(_19!==null&&!dojo.isObject(_19)&&_18){
84
if(_19.toString().match(_18)){
85
return true;
86
}
87
}else{
88
if(_17===_19){
89
return true;
90
}
91
}
92
});
93
},isItem:function(_1a){
94
if(_1a&&_1a[this._storeRefPropName]===this){
95
if(this._arrayOfAllItems[_1a[this._itemNumPropName]]===_1a){
96
return true;
97
}
98
}
99
return false;
100
},isItemLoaded:function(_1b){
101
return this.isItem(_1b);
102
},loadItem:function(_1c){
103
this._assertIsItem(_1c.item);
104
},getFeatures:function(){
105
return this._features;
106
},getLabel:function(_1d){
107
if(this._labelAttr&&this.isItem(_1d)){
108
return this.getValue(_1d,this._labelAttr);
109
}
110
return undefined;
111
},getLabelAttributes:function(_1e){
112
if(this._labelAttr){
113
return [this._labelAttr];
114
}
115
return null;
116
},_fetchItems:function(_1f,_20,_21){
117
var _22=this;
118
var _23=function(_24,_25){
119
var _26=[];
120
if(_24.query){
121
var _27=dojo.fromJson(dojo.toJson(_24.query));
122
if(typeof _27=="object"){
123
var _28=0;
124
var p;
125
for(p in _27){
126
_28++;
127
}
128
if(_28>1&&_27.complexQuery){
129
var cq=_27.complexQuery;
130
var _29=false;
131
for(p in _27){
132
if(p!=="complexQuery"){
133
if(!_29){
134
cq="( "+cq+" )";
135
_29=true;
136
}
137
var v=_24.query[p];
138
if(dojo.isString(v)){
139
v="'"+v+"'";
140
}
141
cq+=" AND "+p+":"+v;
142
delete _27[p];
143
}
144
}
145
_27.complexQuery=cq;
146
}
147
}
148
var _2a=_24.queryOptions?_24.queryOptions.ignoreCase:false;
149
if(typeof _27!="string"){
150
_27=dojo.toJson(_27);
151
_27=_27.replace(/\\\\/g,"\\");
152
}
153
_27=_27.replace(/\\"/g,"\"");
154
var _2b=dojo.trim(_27.replace(/{|}/g,""));
155
var _2c,i;
156
if(_2b.match(/"? *complexQuery *"?:/)){
157
_2b=dojo.trim(_2b.replace(/"?\s*complexQuery\s*"?:/,""));
158
var _2d=["'","\""];
159
var _2e,_2f;
160
var _30=false;
161
for(i=0;i<_2d.length;i++){
162
_2e=_2b.indexOf(_2d[i]);
163
_2c=_2b.indexOf(_2d[i],1);
164
_2f=_2b.indexOf(":",1);
165
if(_2e===0&&_2c!=-1&&_2f<_2c){
166
_30=true;
167
break;
168
}
169
}
170
if(_30){
171
_2b=_2b.replace(/^\"|^\'|\"$|\'$/g,"");
172
}
173
}
174
var _31=_2b;
175
var _32=/^,|^NOT |^AND |^OR |^\(|^\)|^!|^&&|^\|\|/i;
176
var _33="";
177
var op="";
178
var val="";
179
var pos=-1;
180
var err=false;
181
var key="";
182
var _34="";
183
var tok="";
184
_2c=-1;
185
for(i=0;i<_25.length;++i){
186
var _35=true;
187
var _36=_25[i];
188
if(_36===null){
189
_35=false;
190
}else{
191
_2b=_31;
192
_33="";
193
while(_2b.length>0&&!err){
194
op=_2b.match(_32);
195
while(op&&!err){
196
_2b=dojo.trim(_2b.replace(op[0],""));
197
op=dojo.trim(op[0]).toUpperCase();
198
op=op=="NOT"?"!":op=="AND"||op==","?"&&":op=="OR"?"||":op;
199
op=" "+op+" ";
200
_33+=op;
201
op=_2b.match(_32);
202
}
203
if(_2b.length>0){
204
pos=_2b.indexOf(":");
205
if(pos==-1){
206
err=true;
207
break;
208
}else{
209
key=dojo.trim(_2b.substring(0,pos).replace(/\"|\'/g,""));
210
_2b=dojo.trim(_2b.substring(pos+1));
211
tok=_2b.match(/^\'|^\"/);
212
if(tok){
213
tok=tok[0];
214
pos=_2b.indexOf(tok);
215
_2c=_2b.indexOf(tok,pos+1);
216
if(_2c==-1){
217
err=true;
218
break;
219
}
220
_34=_2b.substring(pos+1,_2c);
221
if(_2c==_2b.length-1){
222
_2b="";
223
}else{
224
_2b=dojo.trim(_2b.substring(_2c+1));
225
}
226
_33+=_22._containsValue(_36,key,_34,dojo.data.util.filter.patternToRegExp(_34,_2a));
227
}else{
228
tok=_2b.match(/\s|\)|,/);
229
if(tok){
230
var _37=new Array(tok.length);
231
for(var j=0;j<tok.length;j++){
232
_37[j]=_2b.indexOf(tok[j]);
233
}
234
pos=_37[0];
235
if(_37.length>1){
236
for(var j=1;j<_37.length;j++){
237
pos=Math.min(pos,_37[j]);
238
}
239
}
240
_34=dojo.trim(_2b.substring(0,pos));
241
_2b=dojo.trim(_2b.substring(pos));
242
}else{
243
_34=dojo.trim(_2b);
244
_2b="";
245
}
246
_33+=_22._containsValue(_36,key,_34,dojo.data.util.filter.patternToRegExp(_34,_2a));
247
}
248
}
249
}
250
}
251
_35=eval(_33);
252
}
253
if(_35){
254
_26.push(_36);
255
}
256
}
257
if(err){
258
_26=[];
259
}
260
_20(_26,_24);
261
}else{
262
for(var i=0;i<_25.length;++i){
263
var _38=_25[i];
264
if(_38!==null){
265
_26.push(_38);
266
}
267
}
268
_20(_26,_24);
269
}
270
};
271
if(this._loadFinished){
272
_23(_1f,this._getItemsArray(_1f.queryOptions));
273
}else{
274
if(this._jsonFileUrl!==this._ccUrl){
275
dojo.deprecated("dojox.data.AndOrReadStore: ","To change the url, set the url property of the store,"+" not _jsonFileUrl.  _jsonFileUrl support will be removed in 2.0");
276
this._ccUrl=this._jsonFileUrl;
277
this.url=this._jsonFileUrl;
278
}else{
279
if(this.url!==this._ccUrl){
280
this._jsonFileUrl=this.url;
281
this._ccUrl=this.url;
282
}
283
}
284
if(this.data!=null&&this._jsonData==null){
285
this._jsonData=this.data;
286
this.data=null;
287
}
288
if(this._jsonFileUrl){
289
if(this._loadInProgress){
290
this._queuedFetches.push({args:_1f,filter:_23});
291
}else{
292
this._loadInProgress=true;
293
var _39={url:_22._jsonFileUrl,handleAs:"json-comment-optional",preventCache:this.urlPreventCache};
294
var _3a=dojo.xhrGet(_39);
295
_3a.addCallback(function(_3b){
296
try{
297
_22._getItemsFromLoadedData(_3b);
298
_22._loadFinished=true;
299
_22._loadInProgress=false;
300
_23(_1f,_22._getItemsArray(_1f.queryOptions));
301
_22._handleQueuedFetches();
302
}
303
catch(e){
304
_22._loadFinished=true;
305
_22._loadInProgress=false;
306
_21(e,_1f);
307
}
308
});
309
_3a.addErrback(function(_3c){
310
_22._loadInProgress=false;
311
_21(_3c,_1f);
312
});
313
var _3d=null;
314
if(_1f.abort){
315
_3d=_1f.abort;
316
}
317
_1f.abort=function(){
318
var df=_3a;
319
if(df&&df.fired===-1){
320
df.cancel();
321
df=null;
322
}
323
if(_3d){
324
_3d.call(_1f);
325
}
326
};
327
}
328
}else{
329
if(this._jsonData){
330
try{
331
this._loadFinished=true;
332
this._getItemsFromLoadedData(this._jsonData);
333
this._jsonData=null;
334
_23(_1f,this._getItemsArray(_1f.queryOptions));
335
}
336
catch(e){
337
_21(e,_1f);
338
}
339
}else{
340
_21(new Error("dojox.data.AndOrReadStore: No JSON source data was provided as either URL or a nested Javascript object."),_1f);
341
}
342
}
343
}
344
},_handleQueuedFetches:function(){
345
if(this._queuedFetches.length>0){
346
for(var i=0;i<this._queuedFetches.length;i++){
347
var _3e=this._queuedFetches[i];
348
var _3f=_3e.args;
349
var _40=_3e.filter;
350
if(_40){
351
_40(_3f,this._getItemsArray(_3f.queryOptions));
352
}else{
353
this.fetchItemByIdentity(_3f);
354
}
355
}
356
this._queuedFetches=[];
357
}
358
},_getItemsArray:function(_41){
359
if(_41&&_41.deep){
360
return this._arrayOfAllItems;
361
}
362
return this._arrayOfTopLevelItems;
363
},close:function(_42){
364
if(this.clearOnClose&&this._loadFinished&&!this._loadInProgress){
365
if(((this._jsonFileUrl==""||this._jsonFileUrl==null)&&(this.url==""||this.url==null))&&this.data==null){
366
}
367
this._arrayOfAllItems=[];
368
this._arrayOfTopLevelItems=[];
369
this._loadFinished=false;
370
this._itemsByIdentity=null;
371
this._loadInProgress=false;
372
this._queuedFetches=[];
373
}
374
},_getItemsFromLoadedData:function(_43){
375
var _44=this;
376
function _45(_46){
377
var _47=((_46!==null)&&(typeof _46==="object")&&(!dojo.isArray(_46))&&(!dojo.isFunction(_46))&&(_46.constructor==Object)&&(typeof _46._reference==="undefined")&&(typeof _46._type==="undefined")&&(typeof _46._value==="undefined")&&_44.hierarchical);
378
return _47;
379
};
380
function _48(_49){
381
_44._arrayOfAllItems.push(_49);
382
for(var _4a in _49){
383
var _4b=_49[_4a];
384
if(_4b){
385
if(dojo.isArray(_4b)){
386
var _4c=_4b;
387
for(var k=0;k<_4c.length;++k){
388
var _4d=_4c[k];
389
if(_45(_4d)){
390
_48(_4d);
391
}
392
}
393
}else{
394
if(_45(_4b)){
395
_48(_4b);
396
}
397
}
398
}
399
}
400
};
401
this._labelAttr=_43.label;
402
var i;
403
var _4e;
404
this._arrayOfAllItems=[];
405
this._arrayOfTopLevelItems=_43.items;
406
for(i=0;i<this._arrayOfTopLevelItems.length;++i){
407
_4e=this._arrayOfTopLevelItems[i];
408
_48(_4e);
409
_4e[this._rootItemPropName]=true;
410
}
411
var _4f={};
412
var key;
413
for(i=0;i<this._arrayOfAllItems.length;++i){
414
_4e=this._arrayOfAllItems[i];
415
for(key in _4e){
416
if(key!==this._rootItemPropName){
417
var _50=_4e[key];
418
if(_50!==null){
419
if(!dojo.isArray(_50)){
420
_4e[key]=[_50];
421
}
422
}else{
423
_4e[key]=[null];
424
}
425
}
426
_4f[key]=key;
427
}
428
}
429
while(_4f[this._storeRefPropName]){
430
this._storeRefPropName+="_";
431
}
432
while(_4f[this._itemNumPropName]){
433
this._itemNumPropName+="_";
434
}
435
while(_4f[this._reverseRefMap]){
436
this._reverseRefMap+="_";
437
}
438
var _51;
439
var _52=_43.identifier;
440
if(_52){
441
this._itemsByIdentity={};
442
this._features["dojo.data.api.Identity"]=_52;
443
for(i=0;i<this._arrayOfAllItems.length;++i){
444
_4e=this._arrayOfAllItems[i];
445
_51=_4e[_52];
446
var _53=_51[0];
447
if(!this._itemsByIdentity[_53]){
448
this._itemsByIdentity[_53]=_4e;
449
}else{
450
if(this._jsonFileUrl){
451
throw new Error("dojox.data.AndOrReadStore:  The json data as specified by: ["+this._jsonFileUrl+"] is malformed.  Items within the list have identifier: ["+_52+"].  Value collided: ["+_53+"]");
452
}else{
453
if(this._jsonData){
454
throw new Error("dojox.data.AndOrReadStore:  The json data provided by the creation arguments is malformed.  Items within the list have identifier: ["+_52+"].  Value collided: ["+_53+"]");
455
}
456
}
457
}
458
}
459
}else{
460
this._features["dojo.data.api.Identity"]=Number;
461
}
462
for(i=0;i<this._arrayOfAllItems.length;++i){
463
_4e=this._arrayOfAllItems[i];
464
_4e[this._storeRefPropName]=this;
465
_4e[this._itemNumPropName]=i;
466
}
467
for(i=0;i<this._arrayOfAllItems.length;++i){
468
_4e=this._arrayOfAllItems[i];
469
for(key in _4e){
470
_51=_4e[key];
471
for(var j=0;j<_51.length;++j){
472
_50=_51[j];
473
if(_50!==null&&typeof _50=="object"){
474
if(("_type" in _50)&&("_value" in _50)){
475
var _54=_50._type;
476
var _55=this._datatypeMap[_54];
477
if(!_55){
478
throw new Error("dojox.data.AndOrReadStore: in the typeMap constructor arg, no object class was specified for the datatype '"+_54+"'");
479
}else{
480
if(dojo.isFunction(_55)){
481
_51[j]=new _55(_50._value);
482
}else{
483
if(dojo.isFunction(_55.deserialize)){
484
_51[j]=_55.deserialize(_50._value);
485
}else{
486
throw new Error("dojox.data.AndOrReadStore: Value provided in typeMap was neither a constructor, nor a an object with a deserialize function");
487
}
488
}
489
}
490
}
491
if(_50._reference){
492
var _56=_50._reference;
493
if(!dojo.isObject(_56)){
494
_51[j]=this._getItemByIdentity(_56);
495
}else{
496
for(var k=0;k<this._arrayOfAllItems.length;++k){
497
var _57=this._arrayOfAllItems[k];
498
var _58=true;
499
for(var _59 in _56){
500
if(_57[_59]!=_56[_59]){
501
_58=false;
502
}
503
}
504
if(_58){
505
_51[j]=_57;
506
}
507
}
508
}
509
if(this.referenceIntegrity){
510
var _5a=_51[j];
511
if(this.isItem(_5a)){
512
this._addReferenceToMap(_5a,_4e,key);
513
}
514
}
515
}else{
516
if(this.isItem(_50)){
517
if(this.referenceIntegrity){
518
this._addReferenceToMap(_50,_4e,key);
519
}
520
}
521
}
522
}
523
}
524
}
525
}
526
},_addReferenceToMap:function(_5b,_5c,_5d){
527
},getIdentity:function(_5e){
528
var _5f=this._features["dojo.data.api.Identity"];
529
if(_5f===Number){
530
return _5e[this._itemNumPropName];
531
}else{
532
var _60=_5e[_5f];
533
if(_60){
534
return _60[0];
535
}
536
}
537
return null;
538
},fetchItemByIdentity:function(_61){
539
if(!this._loadFinished){
540
var _62=this;
541
if(this._jsonFileUrl!==this._ccUrl){
542
dojo.deprecated("dojox.data.AndOrReadStore: ","To change the url, set the url property of the store,"+" not _jsonFileUrl.  _jsonFileUrl support will be removed in 2.0");
543
this._ccUrl=this._jsonFileUrl;
544
this.url=this._jsonFileUrl;
545
}else{
546
if(this.url!==this._ccUrl){
547
this._jsonFileUrl=this.url;
548
this._ccUrl=this.url;
549
}
550
}
551
if(this.data!=null&&this._jsonData==null){
552
this._jsonData=this.data;
553
this.data=null;
554
}
555
if(this._jsonFileUrl){
556
if(this._loadInProgress){
557
this._queuedFetches.push({args:_61});
558
}else{
559
this._loadInProgress=true;
560
var _63={url:_62._jsonFileUrl,handleAs:"json-comment-optional",preventCache:this.urlPreventCache};
561
var _64=dojo.xhrGet(_63);
562
_64.addCallback(function(_65){
563
var _66=_61.scope?_61.scope:dojo.global;
564
try{
565
_62._getItemsFromLoadedData(_65);
566
_62._loadFinished=true;
567
_62._loadInProgress=false;
568
var _67=_62._getItemByIdentity(_61.identity);
569
if(_61.onItem){
570
_61.onItem.call(_66,_67);
571
}
572
_62._handleQueuedFetches();
573
}
574
catch(error){
575
_62._loadInProgress=false;
576
if(_61.onError){
577
_61.onError.call(_66,error);
578
}
579
}
580
});
581
_64.addErrback(function(_68){
582
_62._loadInProgress=false;
583
if(_61.onError){
584
var _69=_61.scope?_61.scope:dojo.global;
585
_61.onError.call(_69,_68);
586
}
587
});
588
}
589
}else{
590
if(this._jsonData){
591
_62._getItemsFromLoadedData(_62._jsonData);
592
_62._jsonData=null;
593
_62._loadFinished=true;
594
var _6a=_62._getItemByIdentity(_61.identity);
595
if(_61.onItem){
596
var _6b=_61.scope?_61.scope:dojo.global;
597
_61.onItem.call(_6b,_6a);
598
}
599
}
600
}
601
}else{
602
var _6a=this._getItemByIdentity(_61.identity);
603
if(_61.onItem){
604
var _6b=_61.scope?_61.scope:dojo.global;
605
_61.onItem.call(_6b,_6a);
606
}
607
}
608
},_getItemByIdentity:function(_6c){
609
var _6d=null;
610
if(this._itemsByIdentity){
611
_6d=this._itemsByIdentity[_6c];
612
}else{
613
_6d=this._arrayOfAllItems[_6c];
614
}
615
if(_6d===undefined){
616
_6d=null;
617
}
618
return _6d;
619
},getIdentityAttributes:function(_6e){
620
var _6f=this._features["dojo.data.api.Identity"];
621
if(_6f===Number){
622
return null;
623
}else{
624
return [_6f];
625
}
626
},_forceLoad:function(){
627
var _70=this;
628
if(this._jsonFileUrl!==this._ccUrl){
629
dojo.deprecated("dojox.data.AndOrReadStore: ","To change the url, set the url property of the store,"+" not _jsonFileUrl.  _jsonFileUrl support will be removed in 2.0");
630
this._ccUrl=this._jsonFileUrl;
631
this.url=this._jsonFileUrl;
632
}else{
633
if(this.url!==this._ccUrl){
634
this._jsonFileUrl=this.url;
635
this._ccUrl=this.url;
636
}
637
}
638
if(this.data!=null&&this._jsonData==null){
639
this._jsonData=this.data;
640
this.data=null;
641
}
642
if(this._jsonFileUrl){
643
var _71={url:_70._jsonFileUrl,handleAs:"json-comment-optional",preventCache:this.urlPreventCache,sync:true};
644
var _72=dojo.xhrGet(_71);
645
_72.addCallback(function(_73){
646
try{
647
if(_70._loadInProgress!==true&&!_70._loadFinished){
648
_70._getItemsFromLoadedData(_73);
649
_70._loadFinished=true;
650
}else{
651
if(_70._loadInProgress){
652
throw new Error("dojox.data.AndOrReadStore:  Unable to perform a synchronous load, an async load is in progress.");
653
}
654
}
655
}
656
catch(e){
657
throw e;
658
}
659
});
660
_72.addErrback(function(_74){
661
throw _74;
662
});
663
}else{
664
if(this._jsonData){
665
_70._getItemsFromLoadedData(_70._jsonData);
666
_70._jsonData=null;
667
_70._loadFinished=true;
668
}
669
}
670
}});
671
dojo.extend(dojox.data.AndOrReadStore,dojo.data.util.simpleFetch);
672
}