blob: c6b1c4b63c954e8fa9562a48bc0c651cd3453e74 [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["dojo.data.ItemFileReadStore"]){
dojo._hasResource["dojo.data.ItemFileReadStore"]=true;
dojo.provide("dojo.data.ItemFileReadStore");
dojo.require("dojo.data.util.filter");
dojo.require("dojo.data.util.simpleFetch");
dojo.require("dojo.date.stamp");
dojo.declare("dojo.data.ItemFileReadStore",null,{constructor:function(_1){
this._arrayOfAllItems=[];
this._arrayOfTopLevelItems=[];
this._loadFinished=false;
this._jsonFileUrl=_1.url;
this._jsonData=_1.data;
this._datatypeMap=_1.typeMap||{};
if(!this._datatypeMap["Date"]){
this._datatypeMap["Date"]={type:Date,deserialize:function(_2){
return dojo.date.stamp.fromISOString(_2);
}};
}
this._features={"dojo.data.api.Read":true,"dojo.data.api.Identity":true};
this._itemsByIdentity=null;
this._storeRefPropName="_S";
this._itemNumPropName="_0";
this._rootItemPropName="_RI";
this._reverseRefMap="_RRM";
this._loadInProgress=false;
this._queuedFetches=[];
if(_1.urlPreventCache!==undefined){
this.urlPreventCache=_1.urlPreventCache?true:false;
}
if(_1.clearOnClose){
this.clearOnClose=true;
}
},url:"",data:null,typeMap:null,clearOnClose:false,urlPreventCache:false,_assertIsItem:function(_3){
if(!this.isItem(_3)){
throw new Error("dojo.data.ItemFileReadStore: Invalid item argument.");
}
},_assertIsAttribute:function(_4){
if(typeof _4!=="string"){
throw new Error("dojo.data.ItemFileReadStore: Invalid attribute argument.");
}
},getValue:function(_5,_6,_7){
var _8=this.getValues(_5,_6);
return (_8.length>0)?_8[0]:_7;
},getValues:function(_9,_a){
this._assertIsItem(_9);
this._assertIsAttribute(_a);
return _9[_a]||[];
},getAttributes:function(_b){
this._assertIsItem(_b);
var _c=[];
for(var _d in _b){
if((_d!==this._storeRefPropName)&&(_d!==this._itemNumPropName)&&(_d!==this._rootItemPropName)&&(_d!==this._reverseRefMap)){
_c.push(_d);
}
}
return _c;
},hasAttribute:function(_e,_f){
return this.getValues(_e,_f).length>0;
},containsValue:function(_10,_11,_12){
var _13=undefined;
if(typeof _12==="string"){
_13=dojo.data.util.filter.patternToRegExp(_12,false);
}
return this._containsValue(_10,_11,_12,_13);
},_containsValue:function(_14,_15,_16,_17){
return dojo.some(this.getValues(_14,_15),function(_18){
if(_18!==null&&!dojo.isObject(_18)&&_17){
if(_18.toString().match(_17)){
return true;
}
}else{
if(_16===_18){
return true;
}
}
});
},isItem:function(_19){
if(_19&&_19[this._storeRefPropName]===this){
if(this._arrayOfAllItems[_19[this._itemNumPropName]]===_19){
return true;
}
}
return false;
},isItemLoaded:function(_1a){
return this.isItem(_1a);
},loadItem:function(_1b){
this._assertIsItem(_1b.item);
},getFeatures:function(){
return this._features;
},getLabel:function(_1c){
if(this._labelAttr&&this.isItem(_1c)){
return this.getValue(_1c,this._labelAttr);
}
return undefined;
},getLabelAttributes:function(_1d){
if(this._labelAttr){
return [this._labelAttr];
}
return null;
},_fetchItems:function(_1e,_1f,_20){
var _21=this;
var _22=function(_23,_24){
var _25=[];
var i,key;
if(_23.query){
var _28;
var _29=_23.queryOptions?_23.queryOptions.ignoreCase:false;
var _2a={};
for(key in _23.query){
_28=_23.query[key];
if(typeof _28==="string"){
_2a[key]=dojo.data.util.filter.patternToRegExp(_28,_29);
}
}
for(i=0;i<_24.length;++i){
var _2b=true;
var _2c=_24[i];
if(_2c===null){
_2b=false;
}else{
for(key in _23.query){
_28=_23.query[key];
if(!_21._containsValue(_2c,key,_28,_2a[key])){
_2b=false;
}
}
}
if(_2b){
_25.push(_2c);
}
}
_1f(_25,_23);
}else{
for(i=0;i<_24.length;++i){
var _2d=_24[i];
if(_2d!==null){
_25.push(_2d);
}
}
_1f(_25,_23);
}
};
if(this._loadFinished){
_22(_1e,this._getItemsArray(_1e.queryOptions));
}else{
if(this._jsonFileUrl){
if(this._loadInProgress){
this._queuedFetches.push({args:_1e,filter:_22});
}else{
this._loadInProgress=true;
var _2e={url:_21._jsonFileUrl,handleAs:"json-comment-optional",preventCache:this.urlPreventCache};
var _2f=dojo.xhrGet(_2e);
_2f.addCallback(function(_30){
try{
_21._getItemsFromLoadedData(_30);
_21._loadFinished=true;
_21._loadInProgress=false;
_22(_1e,_21._getItemsArray(_1e.queryOptions));
_21._handleQueuedFetches();
}
catch(e){
_21._loadFinished=true;
_21._loadInProgress=false;
_20(e,_1e);
}
});
_2f.addErrback(function(_31){
_21._loadInProgress=false;
_20(_31,_1e);
});
var _32=null;
if(_1e.abort){
_32=_1e.abort;
}
_1e.abort=function(){
var df=_2f;
if(df&&df.fired===-1){
df.cancel();
df=null;
}
if(_32){
_32.call(_1e);
}
};
}
}else{
if(this._jsonData){
try{
this._loadFinished=true;
this._getItemsFromLoadedData(this._jsonData);
this._jsonData=null;
_22(_1e,this._getItemsArray(_1e.queryOptions));
}
catch(e){
_20(e,_1e);
}
}else{
_20(new Error("dojo.data.ItemFileReadStore: No JSON source data was provided as either URL or a nested Javascript object."),_1e);
}
}
}
},_handleQueuedFetches:function(){
if(this._queuedFetches.length>0){
for(var i=0;i<this._queuedFetches.length;i++){
var _35=this._queuedFetches[i];
var _36=_35.args;
var _37=_35.filter;
if(_37){
_37(_36,this._getItemsArray(_36.queryOptions));
}else{
this.fetchItemByIdentity(_36);
}
}
this._queuedFetches=[];
}
},_getItemsArray:function(_38){
if(_38&&_38.deep){
return this._arrayOfAllItems;
}
return this._arrayOfTopLevelItems;
},close:function(_39){
if(this.clearOnClose&&(this._jsonFileUrl!=="")){
this._arrayOfAllItems=[];
this._arrayOfTopLevelItems=[];
this._loadFinished=false;
this._itemsByIdentity=null;
this._loadInProgress=false;
this._queuedFetches=[];
}
},_getItemsFromLoadedData:function(_3a){
var _3b=false;
function _3c(_3d){
var _3e=((_3d!==null)&&(typeof _3d==="object")&&(!dojo.isArray(_3d)||_3b)&&(!dojo.isFunction(_3d))&&(_3d.constructor==Object||dojo.isArray(_3d))&&(typeof _3d._reference==="undefined")&&(typeof _3d._type==="undefined")&&(typeof _3d._value==="undefined"));
return _3e;
};
var _3f=this;
function _40(_41){
_3f._arrayOfAllItems.push(_41);
for(var _42 in _41){
var _43=_41[_42];
if(_43){
if(dojo.isArray(_43)){
var _44=_43;
for(var k=0;k<_44.length;++k){
var _46=_44[k];
if(_3c(_46)){
_40(_46);
}
}
}else{
if(_3c(_43)){
_40(_43);
}
}
}
}
};
this._labelAttr=_3a.label;
var i;
var _48;
this._arrayOfAllItems=[];
this._arrayOfTopLevelItems=_3a.items;
for(i=0;i<this._arrayOfTopLevelItems.length;++i){
_48=this._arrayOfTopLevelItems[i];
if(dojo.isArray(_48)){
_3b=true;
}
_40(_48);
_48[this._rootItemPropName]=true;
}
var _49={};
var key;
for(i=0;i<this._arrayOfAllItems.length;++i){
_48=this._arrayOfAllItems[i];
for(key in _48){
if(key!==this._rootItemPropName){
var _4b=_48[key];
if(_4b!==null){
if(!dojo.isArray(_4b)){
_48[key]=[_4b];
}
}else{
_48[key]=[null];
}
}
_49[key]=key;
}
}
while(_49[this._storeRefPropName]){
this._storeRefPropName+="_";
}
while(_49[this._itemNumPropName]){
this._itemNumPropName+="_";
}
while(_49[this._reverseRefMap]){
this._reverseRefMap+="_";
}
var _4c;
var _4d=_3a.identifier;
if(_4d){
this._itemsByIdentity={};
this._features["dojo.data.api.Identity"]=_4d;
for(i=0;i<this._arrayOfAllItems.length;++i){
_48=this._arrayOfAllItems[i];
_4c=_48[_4d];
var _4e=_4c[0];
if(!this._itemsByIdentity[_4e]){
this._itemsByIdentity[_4e]=_48;
}else{
if(this._jsonFileUrl){
throw new Error("dojo.data.ItemFileReadStore: The json data as specified by: ["+this._jsonFileUrl+"] is malformed. Items within the list have identifier: ["+_4d+"]. Value collided: ["+_4e+"]");
}else{
if(this._jsonData){
throw new Error("dojo.data.ItemFileReadStore: The json data provided by the creation arguments is malformed. Items within the list have identifier: ["+_4d+"]. Value collided: ["+_4e+"]");
}
}
}
}
}else{
this._features["dojo.data.api.Identity"]=Number;
}
for(i=0;i<this._arrayOfAllItems.length;++i){
_48=this._arrayOfAllItems[i];
_48[this._storeRefPropName]=this;
_48[this._itemNumPropName]=i;
}
for(i=0;i<this._arrayOfAllItems.length;++i){
_48=this._arrayOfAllItems[i];
for(key in _48){
_4c=_48[key];
for(var j=0;j<_4c.length;++j){
_4b=_4c[j];
if(_4b!==null&&typeof _4b=="object"){
if(_4b._type&&_4b._value){
var _50=_4b._type;
var _51=this._datatypeMap[_50];
if(!_51){
throw new Error("dojo.data.ItemFileReadStore: in the typeMap constructor arg, no object class was specified for the datatype '"+_50+"'");
}else{
if(dojo.isFunction(_51)){
_4c[j]=new _51(_4b._value);
}else{
if(dojo.isFunction(_51.deserialize)){
_4c[j]=_51.deserialize(_4b._value);
}else{
throw new Error("dojo.data.ItemFileReadStore: Value provided in typeMap was neither a constructor, nor a an object with a deserialize function");
}
}
}
}
if(_4b._reference){
var _52=_4b._reference;
if(!dojo.isObject(_52)){
_4c[j]=this._itemsByIdentity[_52];
}else{
for(var k=0;k<this._arrayOfAllItems.length;++k){
var _54=this._arrayOfAllItems[k];
var _55=true;
for(var _56 in _52){
if(_54[_56]!=_52[_56]){
_55=false;
}
}
if(_55){
_4c[j]=_54;
}
}
}
if(this.referenceIntegrity){
var _57=_4c[j];
if(this.isItem(_57)){
this._addReferenceToMap(_57,_48,key);
}
}
}else{
if(this.isItem(_4b)){
if(this.referenceIntegrity){
this._addReferenceToMap(_4b,_48,key);
}
}
}
}
}
}
}
},_addReferenceToMap:function(_58,_59,_5a){
},getIdentity:function(_5b){
var _5c=this._features["dojo.data.api.Identity"];
if(_5c===Number){
return _5b[this._itemNumPropName];
}else{
var _5d=_5b[_5c];
if(_5d){
return _5d[0];
}
}
return null;
},fetchItemByIdentity:function(_5e){
var _5f;
var _60;
if(!this._loadFinished){
var _61=this;
if(this._jsonFileUrl){
if(this._loadInProgress){
this._queuedFetches.push({args:_5e});
}else{
this._loadInProgress=true;
var _62={url:_61._jsonFileUrl,handleAs:"json-comment-optional",preventCache:this.urlPreventCache};
var _63=dojo.xhrGet(_62);
_63.addCallback(function(_64){
var _65=_5e.scope?_5e.scope:dojo.global;
try{
_61._getItemsFromLoadedData(_64);
_61._loadFinished=true;
_61._loadInProgress=false;
_5f=_61._getItemByIdentity(_5e.identity);
if(_5e.onItem){
_5e.onItem.call(_65,_5f);
}
_61._handleQueuedFetches();
}
catch(error){
_61._loadInProgress=false;
if(_5e.onError){
_5e.onError.call(_65,error);
}
}
});
_63.addErrback(function(_66){
_61._loadInProgress=false;
if(_5e.onError){
var _67=_5e.scope?_5e.scope:dojo.global;
_5e.onError.call(_67,_66);
}
});
}
}else{
if(this._jsonData){
_61._getItemsFromLoadedData(_61._jsonData);
_61._jsonData=null;
_61._loadFinished=true;
_5f=_61._getItemByIdentity(_5e.identity);
if(_5e.onItem){
_60=_5e.scope?_5e.scope:dojo.global;
_5e.onItem.call(_60,_5f);
}
}
}
}else{
_5f=this._getItemByIdentity(_5e.identity);
if(_5e.onItem){
_60=_5e.scope?_5e.scope:dojo.global;
_5e.onItem.call(_60,_5f);
}
}
},_getItemByIdentity:function(_68){
var _69=null;
if(this._itemsByIdentity){
_69=this._itemsByIdentity[_68];
}else{
_69=this._arrayOfAllItems[_68];
}
if(_69===undefined){
_69=null;
}
return _69;
},getIdentityAttributes:function(_6a){
var _6b=this._features["dojo.data.api.Identity"];
if(_6b===Number){
return null;
}else{
return [_6b];
}
},_forceLoad:function(){
var _6c=this;
if(this._jsonFileUrl){
var _6d={url:_6c._jsonFileUrl,handleAs:"json-comment-optional",preventCache:this.urlPreventCache,sync:true};
var _6e=dojo.xhrGet(_6d);
_6e.addCallback(function(_6f){
try{
if(_6c._loadInProgress!==true&&!_6c._loadFinished){
_6c._getItemsFromLoadedData(_6f);
_6c._loadFinished=true;
}else{
if(_6c._loadInProgress){
throw new Error("dojo.data.ItemFileReadStore: Unable to perform a synchronous load, an async load is in progress.");
}
}
}
catch(e){
throw e;
}
});
_6e.addErrback(function(_70){
throw _70;
});
}else{
if(this._jsonData){
_6c._getItemsFromLoadedData(_6c._jsonData);
_6c._jsonData=null;
_6c._loadFinished=true;
}
}
}});
dojo.extend(dojo.data.ItemFileReadStore,dojo.data.util.simpleFetch);
}