blob: c9071d7f298a17530180dc6d1fa611ac6a73ccbb [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.ItemFileWriteStore"]){
dojo._hasResource["dojo.data.ItemFileWriteStore"]=true;
dojo.provide("dojo.data.ItemFileWriteStore");
dojo.require("dojo.data.ItemFileReadStore");
dojo.declare("dojo.data.ItemFileWriteStore",dojo.data.ItemFileReadStore,{constructor:function(_1){
this._features["dojo.data.api.Write"]=true;
this._features["dojo.data.api.Notification"]=true;
this._pending={_newItems:{},_modifiedItems:{},_deletedItems:{}};
if(!this._datatypeMap["Date"].serialize){
this._datatypeMap["Date"].serialize=function(_2){
return dojo.date.stamp.toISOString(_2,{zulu:true});
};
}
if(_1&&(_1.referenceIntegrity===false)){
this.referenceIntegrity=false;
}
this._saveInProgress=false;
},referenceIntegrity:true,_assert:function(_3){
if(!_3){
throw new Error("assertion failed in ItemFileWriteStore");
}
},_getIdentifierAttribute:function(){
var _4=this.getFeatures()["dojo.data.api.Identity"];
return _4;
},newItem:function(_5,_6){
this._assert(!this._saveInProgress);
if(!this._loadFinished){
this._forceLoad();
}
if(typeof _5!="object"&&typeof _5!="undefined"){
throw new Error("newItem() was passed something other than an object");
}
var _7=null;
var _8=this._getIdentifierAttribute();
if(_8===Number){
_7=this._arrayOfAllItems.length;
}else{
_7=_5[_8];
if(typeof _7==="undefined"){
throw new Error("newItem() was not passed an identity for the new item");
}
if(dojo.isArray(_7)){
throw new Error("newItem() was not passed an single-valued identity");
}
}
if(this._itemsByIdentity){
this._assert(typeof this._itemsByIdentity[_7]==="undefined");
}
this._assert(typeof this._pending._newItems[_7]==="undefined");
this._assert(typeof this._pending._deletedItems[_7]==="undefined");
var _9={};
_9[this._storeRefPropName]=this;
_9[this._itemNumPropName]=this._arrayOfAllItems.length;
if(this._itemsByIdentity){
this._itemsByIdentity[_7]=_9;
_9[_8]=[_7];
}
this._arrayOfAllItems.push(_9);
var _a=null;
if(_6&&_6.parent&&_6.attribute){
_a={item:_6.parent,attribute:_6.attribute,oldValue:undefined};
var _b=this.getValues(_6.parent,_6.attribute);
if(_b&&_b.length>0){
var _c=_b.slice(0,_b.length);
if(_b.length===1){
_a.oldValue=_b[0];
}else{
_a.oldValue=_b.slice(0,_b.length);
}
_c.push(_9);
this._setValueOrValues(_6.parent,_6.attribute,_c,false);
_a.newValue=this.getValues(_6.parent,_6.attribute);
}else{
this._setValueOrValues(_6.parent,_6.attribute,_9,false);
_a.newValue=_9;
}
}else{
_9[this._rootItemPropName]=true;
this._arrayOfTopLevelItems.push(_9);
}
this._pending._newItems[_7]=_9;
for(var _d in _5){
if(_d===this._storeRefPropName||_d===this._itemNumPropName){
throw new Error("encountered bug in ItemFileWriteStore.newItem");
}
var _e=_5[_d];
if(!dojo.isArray(_e)){
_e=[_e];
}
_9[_d]=_e;
if(this.referenceIntegrity){
for(var i=0;i<_e.length;i++){
var val=_e[i];
if(this.isItem(val)){
this._addReferenceToMap(val,_9,_d);
}
}
}
}
this.onNew(_9,_a);
return _9;
},_removeArrayElement:function(_11,_12){
var _13=dojo.indexOf(_11,_12);
if(_13!=-1){
_11.splice(_13,1);
return true;
}
return false;
},deleteItem:function(_14){
this._assert(!this._saveInProgress);
this._assertIsItem(_14);
var _15=_14[this._itemNumPropName];
var _16=this.getIdentity(_14);
if(this.referenceIntegrity){
var _17=this.getAttributes(_14);
if(_14[this._reverseRefMap]){
_14["backup_"+this._reverseRefMap]=dojo.clone(_14[this._reverseRefMap]);
}
dojo.forEach(_17,function(_18){
dojo.forEach(this.getValues(_14,_18),function(_19){
if(this.isItem(_19)){
if(!_14["backupRefs_"+this._reverseRefMap]){
_14["backupRefs_"+this._reverseRefMap]=[];
}
_14["backupRefs_"+this._reverseRefMap].push({id:this.getIdentity(_19),attr:_18});
this._removeReferenceFromMap(_19,_14,_18);
}
},this);
},this);
var _1a=_14[this._reverseRefMap];
if(_1a){
for(var _1b in _1a){
var _1c=null;
if(this._itemsByIdentity){
_1c=this._itemsByIdentity[_1b];
}else{
_1c=this._arrayOfAllItems[_1b];
}
if(_1c){
for(var _1d in _1a[_1b]){
var _1e=this.getValues(_1c,_1d)||[];
var _1f=dojo.filter(_1e,function(_20){
return !(this.isItem(_20)&&this.getIdentity(_20)==_16);
},this);
this._removeReferenceFromMap(_14,_1c,_1d);
if(_1f.length<_1e.length){
this._setValueOrValues(_1c,_1d,_1f,true);
}
}
}
}
}
}
this._arrayOfAllItems[_15]=null;
_14[this._storeRefPropName]=null;
if(this._itemsByIdentity){
delete this._itemsByIdentity[_16];
}
this._pending._deletedItems[_16]=_14;
if(_14[this._rootItemPropName]){
this._removeArrayElement(this._arrayOfTopLevelItems,_14);
}
this.onDelete(_14);
return true;
},setValue:function(_21,_22,_23){
return this._setValueOrValues(_21,_22,_23,true);
},setValues:function(_24,_25,_26){
return this._setValueOrValues(_24,_25,_26,true);
},unsetAttribute:function(_27,_28){
return this._setValueOrValues(_27,_28,[],true);
},_setValueOrValues:function(_29,_2a,_2b,_2c){
this._assert(!this._saveInProgress);
this._assertIsItem(_29);
this._assert(dojo.isString(_2a));
this._assert(typeof _2b!=="undefined");
var _2d=this._getIdentifierAttribute();
if(_2a==_2d){
throw new Error("ItemFileWriteStore does not have support for changing the value of an item's identifier.");
}
var _2e=this._getValueOrValues(_29,_2a);
var _2f=this.getIdentity(_29);
if(!this._pending._modifiedItems[_2f]){
var _30={};
for(var key in _29){
if((key===this._storeRefPropName)||(key===this._itemNumPropName)||(key===this._rootItemPropName)){
_30[key]=_29[key];
}else{
if(key===this._reverseRefMap){
_30[key]=dojo.clone(_29[key]);
}else{
_30[key]=_29[key].slice(0,_29[key].length);
}
}
}
this._pending._modifiedItems[_2f]=_30;
}
var _32=false;
if(dojo.isArray(_2b)&&_2b.length===0){
_32=delete _29[_2a];
_2b=undefined;
if(this.referenceIntegrity&&_2e){
var _33=_2e;
if(!dojo.isArray(_33)){
_33=[_33];
}
for(var i=0;i<_33.length;i++){
var _35=_33[i];
if(this.isItem(_35)){
this._removeReferenceFromMap(_35,_29,_2a);
}
}
}
}else{
var _36;
if(dojo.isArray(_2b)){
var _37=_2b;
_36=_2b.slice(0,_2b.length);
}else{
_36=[_2b];
}
if(this.referenceIntegrity){
if(_2e){
var _33=_2e;
if(!dojo.isArray(_33)){
_33=[_33];
}
var map={};
dojo.forEach(_33,function(_39){
if(this.isItem(_39)){
var id=this.getIdentity(_39);
map[id.toString()]=true;
}
},this);
dojo.forEach(_36,function(_3b){
if(this.isItem(_3b)){
var id=this.getIdentity(_3b);
if(map[id.toString()]){
delete map[id.toString()];
}else{
this._addReferenceToMap(_3b,_29,_2a);
}
}
},this);
for(var rId in map){
var _3e;
if(this._itemsByIdentity){
_3e=this._itemsByIdentity[rId];
}else{
_3e=this._arrayOfAllItems[rId];
}
this._removeReferenceFromMap(_3e,_29,_2a);
}
}else{
for(var i=0;i<_36.length;i++){
var _35=_36[i];
if(this.isItem(_35)){
this._addReferenceToMap(_35,_29,_2a);
}
}
}
}
_29[_2a]=_36;
_32=true;
}
if(_2c){
this.onSet(_29,_2a,_2e,_2b);
}
return _32;
},_addReferenceToMap:function(_3f,_40,_41){
var _42=this.getIdentity(_40);
var _43=_3f[this._reverseRefMap];
if(!_43){
_43=_3f[this._reverseRefMap]={};
}
var _44=_43[_42];
if(!_44){
_44=_43[_42]={};
}
_44[_41]=true;
},_removeReferenceFromMap:function(_45,_46,_47){
var _48=this.getIdentity(_46);
var _49=_45[this._reverseRefMap];
var _4a;
if(_49){
for(_4a in _49){
if(_4a==_48){
delete _49[_4a][_47];
if(this._isEmpty(_49[_4a])){
delete _49[_4a];
}
}
}
if(this._isEmpty(_49)){
delete _45[this._reverseRefMap];
}
}
},_dumpReferenceMap:function(){
var i;
for(i=0;i<this._arrayOfAllItems.length;i++){
var _4c=this._arrayOfAllItems[i];
if(_4c&&_4c[this._reverseRefMap]){
}
}
},_getValueOrValues:function(_4d,_4e){
var _4f=undefined;
if(this.hasAttribute(_4d,_4e)){
var _50=this.getValues(_4d,_4e);
if(_50.length==1){
_4f=_50[0];
}else{
_4f=_50;
}
}
return _4f;
},_flatten:function(_51){
if(this.isItem(_51)){
var _52=_51;
var _53=this.getIdentity(_52);
var _54={_reference:_53};
return _54;
}else{
if(typeof _51==="object"){
for(var _55 in this._datatypeMap){
var _56=this._datatypeMap[_55];
if(dojo.isObject(_56)&&!dojo.isFunction(_56)){
if(_51 instanceof _56.type){
if(!_56.serialize){
throw new Error("ItemFileWriteStore: No serializer defined for type mapping: ["+_55+"]");
}
return {_type:_55,_value:_56.serialize(_51)};
}
}else{
if(_51 instanceof _56){
return {_type:_55,_value:_51.toString()};
}
}
}
}
return _51;
}
},_getNewFileContentString:function(){
var _57={};
var _58=this._getIdentifierAttribute();
if(_58!==Number){
_57.identifier=_58;
}
if(this._labelAttr){
_57.label=this._labelAttr;
}
_57.items=[];
for(var i=0;i<this._arrayOfAllItems.length;++i){
var _5a=this._arrayOfAllItems[i];
if(_5a!==null){
var _5b={};
for(var key in _5a){
if(key!==this._storeRefPropName&&key!==this._itemNumPropName&&key!==this._reverseRefMap&&key!==this._rootItemPropName){
var _5d=key;
var _5e=this.getValues(_5a,_5d);
if(_5e.length==1){
_5b[_5d]=this._flatten(_5e[0]);
}else{
var _5f=[];
for(var j=0;j<_5e.length;++j){
_5f.push(this._flatten(_5e[j]));
_5b[_5d]=_5f;
}
}
}
}
_57.items.push(_5b);
}
}
var _61=true;
return dojo.toJson(_57,_61);
},_isEmpty:function(_62){
var _63=true;
if(dojo.isObject(_62)){
var i;
for(i in _62){
_63=false;
break;
}
}else{
if(dojo.isArray(_62)){
if(_62.length>0){
_63=false;
}
}
}
return _63;
},save:function(_65){
this._assert(!this._saveInProgress);
this._saveInProgress=true;
var _66=this;
var _67=function(){
_66._pending={_newItems:{},_modifiedItems:{},_deletedItems:{}};
_66._saveInProgress=false;
if(_65&&_65.onComplete){
var _68=_65.scope||dojo.global;
_65.onComplete.call(_68);
}
};
var _69=function(err){
_66._saveInProgress=false;
if(_65&&_65.onError){
var _6b=_65.scope||dojo.global;
_65.onError.call(_6b,err);
}
};
if(this._saveEverything){
var _6c=this._getNewFileContentString();
this._saveEverything(_67,_69,_6c);
}
if(this._saveCustom){
this._saveCustom(_67,_69);
}
if(!this._saveEverything&&!this._saveCustom){
_67();
}
},revert:function(){
this._assert(!this._saveInProgress);
var _6d;
for(_6d in this._pending._modifiedItems){
var _6e=this._pending._modifiedItems[_6d];
var _6f=null;
if(this._itemsByIdentity){
_6f=this._itemsByIdentity[_6d];
}else{
_6f=this._arrayOfAllItems[_6d];
}
_6e[this._storeRefPropName]=this;
_6f[this._storeRefPropName]=null;
var _70=_6f[this._itemNumPropName];
this._arrayOfAllItems[_70]=_6e;
if(_6f[this._rootItemPropName]){
var i;
for(i=0;i<this._arrayOfTopLevelItems.length;i++){
var _72=this._arrayOfTopLevelItems[i];
if(this.getIdentity(_72)==_6d){
this._arrayOfTopLevelItems[i]=_6e;
break;
}
}
}
if(this._itemsByIdentity){
this._itemsByIdentity[_6d]=_6e;
}
}
var _73;
for(_6d in this._pending._deletedItems){
_73=this._pending._deletedItems[_6d];
_73[this._storeRefPropName]=this;
var _74=_73[this._itemNumPropName];
if(_73["backup_"+this._reverseRefMap]){
_73[this._reverseRefMap]=_73["backup_"+this._reverseRefMap];
delete _73["backup_"+this._reverseRefMap];
}
this._arrayOfAllItems[_74]=_73;
if(this._itemsByIdentity){
this._itemsByIdentity[_6d]=_73;
}
if(_73[this._rootItemPropName]){
this._arrayOfTopLevelItems.push(_73);
}
}
for(_6d in this._pending._deletedItems){
_73=this._pending._deletedItems[_6d];
if(_73["backupRefs_"+this._reverseRefMap]){
dojo.forEach(_73["backupRefs_"+this._reverseRefMap],function(_75){
var _76;
if(this._itemsByIdentity){
_76=this._itemsByIdentity[_75.id];
}else{
_76=this._arrayOfAllItems[_75.id];
}
this._addReferenceToMap(_76,_73,_75.attr);
},this);
delete _73["backupRefs_"+this._reverseRefMap];
}
}
for(_6d in this._pending._newItems){
var _77=this._pending._newItems[_6d];
_77[this._storeRefPropName]=null;
this._arrayOfAllItems[_77[this._itemNumPropName]]=null;
if(_77[this._rootItemPropName]){
this._removeArrayElement(this._arrayOfTopLevelItems,_77);
}
if(this._itemsByIdentity){
delete this._itemsByIdentity[_6d];
}
}
this._pending={_newItems:{},_modifiedItems:{},_deletedItems:{}};
return true;
},isDirty:function(_78){
if(_78){
var _79=this.getIdentity(_78);
return new Boolean(this._pending._newItems[_79]||this._pending._modifiedItems[_79]||this._pending._deletedItems[_79]).valueOf();
}else{
if(!this._isEmpty(this._pending._newItems)||!this._isEmpty(this._pending._modifiedItems)||!this._isEmpty(this._pending._deletedItems)){
return true;
}
return false;
}
},onSet:function(_7a,_7b,_7c,_7d){
},onNew:function(_7e,_7f){
},onDelete:function(_80){
},close:function(_81){
if(this.clearOnClose){
if(!this.isDirty()){
this.inherited(arguments);
}else{
if(this._jsonFileUrl!==""){
throw new Error("dojo.data.ItemFileWriteStore: There are unsaved changes present in the store. Please save or revert the changes before invoking close.");
}
}
}
}});
}