value: function(instance) { if (instance !== null) { if (typeof instance.context === "undefined") { return Promise.resolve(instance); } if (instance.context !== null) { if (instance.context !== this) { throw Exception.initWithMessageTargetAndMethod("This instance is belongs to another context.", this, "revert"); } if (this._inserted.has(instance)) { // This is a newly inserted object, there is no value to revert to, so do nothing. } else if (this._modified.has(instance)) { this._modified.delete(instance); instance = this._revertValues(instance); } } else { // Maybe that object was deleted let retrieve it? if (this._deleted.has(instance)) { this._deleted.delete(instance); instance.context = this; instance = this._revertValues(instance); } } } else { throw Exception.initWithMessageTargetAndMethod("Cannot revert a null object.", this, "revert"); } return Promise.resolve(instance); }
value: function(instance) { if (instance !== null) { if (typeof instance.context === "undefined") { var metadata = Montage.getInfoForObject(instance); var blueprint = this.blueprintForPrototype(metadata.objectName, metadata.moduleId); if (blueprint !== null) { ObjectProperty.manager.apply(Object.getPrototypeOf(instance), blueprint); } else { throw Exception.create().initWithMessageTargetAndMethod("Cannot find blueprint for: " + metadata.objectName + " " + metadata.moduleId, this, "insert"); } } if (instance.context === null) { instance.context = this; this._inserted.add(instance); return this.initializeObject(instance, this).then(function(instance) { instance.context._objectMap.set(instance.objectId, instance); return Promise.resolve(instance); }); } else if (instance.context !== this) { throw Exception.initWithMessageTargetAndMethod("This instance is already inserted in another context.", this, "insert"); } } else { throw Exception.initWithMessageTargetAndMethod("Cannot insert a null object.", this, "insert"); } }
value: function(instance) { if (instance !== null) { if ((typeof instance.context === "undefined") || (instance.context === null)) { return Promise.resolve(instance); } if (instance.context !== this) { throw Exception.initWithMessageTargetAndMethod("This instance is belongs to another context.", this, "delete"); } if (this._inserted.has(instance)) { // We are forgetting a newly inserted object this._inserted.delete(instance); if (typeof instance.context !== "undefined") { instance.context = null; } } else { if (this._modified.has(instance)) { // the object was modified before teh delete forget those. this._modified.delete(instance); instance = this._revertValues(instance); } this._deleted.add(instance); } this._objectMap.delete(instance.objectId); } else { throw Exception.initWithMessageTargetAndMethod("Cannot delete a null object.", this, "delete"); } return Promise.resolve(instance); }
set:function (value) { if (value !== null) { this._objectId = value; } else { throw Exception.create().initWithMessageTargetAndMethod("Cannot set object Id to null", this, "objectId.set"); } }
value:function (propertyName, value) { var propertyBlueprint = this.blueprint.propertyBlueprintForName(propertyName); var storageKey = "_" + propertyBlueprint.name; if (value == null && propertyBlueprint.denyDelete) { throw Exception.create().initWithMessageTargetAndMethod("Deny Delete", this, propertyBlueprint.name); } else { this[storageKey] = value; } },
var Montage=require("montage").Montage,Blueprint=require("data/blueprint").Blueprint,BlueprintBinder=require("data/blueprint").BlueprintBinder,BinderMapping=require("data/mapping").BinderMapping,BlueprintMapping=require("data/mapping").BlueprintMapping,AttributeMapping=require("data/mapping").AttributeMapping,AssociationMapping=require("data/mapping").AssociationMapping,StoreConnectionInformation=require("data/store-connection-information").StoreConnectionInformation,Query=require("data/query").Query,Pledge=require("data/pledge").Pledge,PledgedSortedSet=require("data/pledge").PledgedSortedSet,Restriction=require("data/restriction").Restriction,TransactionId=require("data/transaction-id").TransactionId,ObjectId=require("data/object-id").ObjectId,TemporaryObjectId=require("data/object-id").TemporaryObjectId,Serializer=require("core/serializer").Serializer,Deserializer=require("core/deserializer").Deserializer,Promise=require("core/promise").Promise,Exception=require("core/exception").Exception,logger=require("core/logger").logger("store"),_defaultStoreManager=null,Store=exports.Store=Montage.create(Montage,{_connectionInfo:{serializable:!0,enumerable:!1,value:null},connectionInfo:{get:function(){return this._connectionInfo},set:function(e){this._connectionInfo=e}},restrictions:{serializable:!0,writable:!1,distinct:!0,value:new Array(10)},_parent:{serializable:!0,enumerable:!1,value:null},parent:{get:function(){return this._parent}},defaultManager:{get:function(){return _defaultStoreManager===null&&(_defaultStoreManager=StoreManager.create().init()),_defaultStoreManager},set:function(e){_defaultStoreManager=e}},init:{serializable:!1,enumerable:!1,value:function(){return this.initWithParentAndRestrictions(null,null)}},initWithParent:{serializable:!1,enumerable:!1,value:function(e){return this.initWithParentAndRestrictions(e,null)}},initWithParentAndRestrictions:{serializable:!1,value:function(e,t){this.parent!==null&&this.parent.remove(this),this._parent=e!=null?e:Store.defaultManager,this.parent.addStore(this);if(t!=null){var n,r;for(r=0;typeof (n=t[r])!="undefined";r++)this.restrictions.push(Object.freeze(n))}return this}},blueprintForPrototype:{value:function(e,t){return this.parent!==null?this.parent.blueprintForPrototype(e,t):null}},createBinderMapping:{get:function(){return BinderMapping.create()}},createBlueprintMapping:{get:function(){return BlueprintMapping.create()}},createAttributeMapping:{get:function(){return AttributeMapping.create()}},createAssociationMapping:{get:function(){return AssociationMapping.create()}},addStore:{value:function(e){return this.parent!==null?this.parent.addStore(e):e}},removeStore:{value:function(e){return this.parent!==null?this.parent.removeStore(e):e}},requireStoreForBlueprint:{value:function(e,t){if(this.parent!==null)return this.parent.requireStoreForBlueprint(e,t)}},canServiceBlueprint:{value:function(e,t){var n=e.mappingForName(t.mappingFolderName);if(!n)return!1;var r=n.parent;if(!r)return!1;var i=Montage.getInfoForObject(this);if(r.storePrototypeName===i.objectName&&r.storeModuleId===i.moduleId){if(this.connectionInfo){var s=r.connectionInformationForName(this.connectionInfo.name);return this.connectionInfo.equals(s)}return!0}return!1}},canServiceQuery:{value:function(e,t){return e!=null?this.canServiceBlueprint(e.blueprint,t):!1}},permanentIdForObjectId:{value:function(e,t,n,r){var i=n,s=!1;try{return i==null&&(s=TransactionId.manager.hasCurrentTransaction(),s?i=TransactionId.manager.currentTransaction():i=TransactionId.manager.startTransaction(r)),this.permanentIdForObjectId$Implementation(e,t,i)}finally{s||TransactionId.manager.closeTransaction(i)}}},permanentIdForObjectId$Implementation:{value:function(e,t,n){return typeof e.objectId!="undefined"?Promise.resolve(e.objectId):Promise.resolve(null)}},pledgeForObjectId:{value:function(e,t,n,r){var i=n,s=!1;try{return i==null&&(s=TransactionId.manager.hasCurrentTransaction(),s?i=TransactionId.manager.currentTransaction():i=TransactionId.manager.startTransaction(r)),this.pledgeForObjectId$Implementation(e,t,i)}finally{s||TransactionId.manager.closeTransaction(i)}}},pledgeForObjectId$Implementation:{value:function(e,t,n){return Promise.resolve(null)}},pledgeForSourceObjectAssociationNamed:{value:function(e,t,n,r,i){var s=r,o=!1;try{return s==null&&(o=TransactionId.manager.hasCurrentTransaction(),o?s=TransactionId.manager.currentTransaction():s=TransactionId.manager.startTransaction(i)),this.pledgeForSourceObjectAssociationNamed$Implementation(e,t,n,s)}finally{o||TransactionId.manager.closeTransaction(s)}}},pledgeForSourceObjectAssociationNamed$Implementation:{value:function(e,t,n,r){return this.parent!==null?this.parent.pledgeForSourceObjectAssociationNamed$Implementation(e,t,n,r):Promise.resolve(null)}},pledgeForSourceObjectAssociation:{value:function(e,t,n,r,i){var s=r,o=!1;try{return s==null&&(o=TransactionId.manager.hasCurrentTransaction(),o?s=TransactionId.manager.currentTransaction():s=TransactionId.manager.startTransaction(i)),this.pledgeForSourceObjectAssociation$Implementation(e,t,n,s)}finally{o||TransactionId.manager.closeTransaction(s)}}},pledgeForSourceObjectAssociation$Implementation:{value:function(e,t,n,r){if(this.parent!==null)return this.parent.pledgeForSourceObjectAssociation$Implementation(e,t,n,r)}},initializeObject:{value:function(e,t,n,r){var i=n,s=!1;try{return i==null&&(s=TransactionId.manager.hasCurrentTransaction(),s?i=TransactionId.manager.currentTransaction():i=TransactionId.manager.startTransaction(r)),this.initializeObject$Implementation(e,t,i)}finally{s||TransactionId.manager.closeTransaction(i)}}},initializeObject$Implementation:{value:function(e,t,n){return typeof e.objectId=="undefined"&&(e.objectId=TemporaryObjectId.create().init()),Promise.resolve(e)}},repledgeObject:{value:function(e,t,n,r){var i=n,s=!1;try{i==null&&(s=TransactionId.manager.hasCurrentTransaction(),s?i=TransactionId.manager.currentTransaction():i=TransactionId.manager.startTransaction(r));if(Array.isArray(e)){var o=new Array(e.length),u,a;for(a=0;typeof (u=e[a])!="undefined";a++)o[a]=this.repledgeObject$Implementation(u,t,i);return o}return this.repledgeObject$Implementation(e,t,i)}finally{s||TransactionId.manager.closeTransaction(i)}}},repledgeObject$Implementation:{value:function(e,t,n){return typeof e.objectId!="undefined"?this.pledgeForObjectId(e.objectId,t,n):Promise.resolve(e)}},saveChangesInContext:{value:function(e,t,n){var r=t,i=!1;try{r==null&&(i=TransactionId.manager.hasCurrentTransaction(),i?r=TransactionId.manager.currentTransaction():r=TransactionId.manager.startTransaction(n)),this.saveChangesInContext$Implementation(e,r)}finally{i||TransactionId.manager.closeTransaction(r)}}},saveChangesInContext$Implementation:{value:function(e,t){if(this.parent!==null)return this.parent.saveChangesInContext$Implementation(e,t)}},prepareToSaveChangesInContext$Implementation:{value:function(e,t){return Promise.resolve(!0)}},cancelSaveChangesInContext$Implementation:{value:function(e,t){return Promise.resolve(!0)}},commitChangesInContext$Implementation:{value:function(e,t){return Promise.resolve(!0)}},queryInContext:{value:function(e,t,n,r){var i=n,s=!1;try{return i==null&&(s=TransactionId.manager.hasCurrentTransaction(),s?i=TransactionId.manager.currentTransaction():i=TransactionId.manager.startTransaction(r)),this.queryInContext$Implementation(e,t,i)}finally{s||TransactionId.manager.closeTransaction(i)}}},queryInContext$Implementation:{value:function(e,t,n){return(new PledgedSortedSet.create).initWithQueryAndContext(e,t)}}}),StoreManager=exports.StoreManager=Montage.create(Store,{stores:{serializable:!0,writable:!1,distinct:!0,value:new Array(10)},parent:{get:function(){return this}},init:{serializable:!1,enumerable:!1,value:function(){return this}},addStore:{value:function(e){if(e!==null&&e!==this){var t=this.stores.indexOf(e);t<0&&this.stores.push(e)}return e}},removeStore:{value:function(e){if(e!==null){var t=this.stores.indexOf(e);t>=0&&(this.stores=this.stores.splice(t,1))}return e}},blueprintForPrototype:{value:function(e,t){return BlueprintBinder.manager.blueprintForPrototype(e,t)}},storeForBlueprint:{value:function(e,t){var n,r;for(r=0;typeof (n=this.stores[r])!="undefined";r++)if(n.canServiceBlueprint(e,t))return n;return null}},findStoreForBlueprint:{value:function(e,t){var n=this._findStoreForBlueprint(e,t);return n==null&&(n=this.requireStoreForBlueprint(e,t)),Promise.resolve(n)}},_findStoreForBlueprint:{value:function(e,t){var n,r;for(r=0;typeof (n=this.stores[r])!="undefined";r++)if(n.canServiceBlueprint(e,t))return n;return null}},requireStoreForBlueprint:{value:function(e,t){return e===null||typeof e=="undefined"?Promise.resolve(null):this._requireStoreForBlueprint(e,t)}},_requireStoreForBlueprint:{value:function(e,t){if(e===null||typeof e=="undefined")return Promise.resolve(null);var n=null,r,i;for(i=0;typeof (r=this.stores[i])!="undefined";i++)r.canServiceBlueprint(e,t)&&(n=r);if(n==null){var s=e.mappingForName(t.mappingFolderName),o=s?s.parent:null;if(o){var u=Promise.defer();require.async(o.storeModuleId,function(e){u.resolve(e)});var a=this;return u.promise.then(function(e){var t=e[o.storePrototypeName],n;return typeof t=="undefined"||t===null?Promise.reject("No Store found "+o.storePrototypeName):(n=t.create().initWithParent(a),n.connectionInfo=o.defaultConnectionInformation,n)})}return Promise.resolve(n)}return Promise.resolve(n)}},storeForObjectId:{value:function(e,t){var n,r;for(r=0;typeof (n=this.stores[r])!="undefined";r++)if(n.canServiceBlueprint(e.blueprint,t))return n;return null}},pledgeForSourceObjectAssociationNamed$Implementation:{value:function(e,t,n,r){var i=null,s=null,o=Montage.getInfoForObject(e),u=this.blueprintForPrototype(o.objectName,o.moduleId);return u!==null&&(s=u.attributeForName(t),s!==null&&s.targetBlueprint!==null?i=this.storeForBlueprint(s.targetBlueprint,r):logger.error("No relationship named "+t+" for "+e)),i!==null?i.pledgeForSourceObjectAssociation(e,s,n,r):Promise.resolve(null)}},pledgeForObjectId$Implementation:{value:function(e,t,n){var r=this.storeForObjectId(e,n);return r!==null?r.pledgeForObjectId$Implementation(e,t,n):Promise.resolve(null)}},pledgeForSourceObjectAssociation$Implementation:{value:function(e,t,n,r){return Promise.resolve(null)}},initializeObject$Implementation:{value:function(e,t,n){return typeof e.objectId=="undefined"&&(e.objectId=TemporaryObjectId.create().init()),Promise.resolve(e)}},repledgeObject$Implementation:{value:function(e,t,n){return typeof e.objectId!="undefined"?this.pledgeForObjectId(e.objectId,t,n):Promise.resolve(e)}},saveChangesInContext$Implementation:{value:function(e,t){var n,r,i=new Array(this.stores.length),s=new Array(this.stores.length);for(r=0;typeof (n=this.stores[r])!="undefined";r++)i[r]=n.prepareToSaveChangesInContext$Implementation(e,t);Promise.when(Promise.all(i),function(){for(r=0;typeof (n=this.stores[r])!="undefined";r++)s[r]=n.commitChangesInContext$Implementation(e,t);return Promise.when(Promise.all(s),function(){return Promise.resolve(!0)},function(){throw Exception.create().initWithMessageTargetAndMethod("Failed to revert prepare for save transaction: "+t,this,"saveChangesInContext")})},function(){for(r=0;typeof (n=this.stores[r])!="undefined";r++)s[r]=n.cancelSaveChangesInContext$Implementation(e,t);return Promise.when(Promise.all(s),function(){return Promise.reject("Could not save the transaction: "+t)},function(){throw Exception.create().initWithMessageTargetAndMethod("Commit failed for transaction: "+t,this,"saveChangesInContext")})})}},prepareToSaveChangesInContext$Implementation:{value:function(e,t){return Promise.resolve(!0)}},cancelSaveChangesInContext$Implementation:{value:function(e,t){return Promise.resolve(!0)}},commitChangesInContext$Implementation:{value:function(e,t){return Promise.resolve(!0)}},queryInContext$Implementation:{value:function(e,t,n){if(e==null||t==null)return Promise.resolve([]);var r=this.storeForBlueprint(e.blueprint,n);return r==null?Promise.resolve([]):r.queryInContext$Implementation(e,t,n)}}})
}, function () { throw Exception.create().initWithMessageTargetAndMethod('Commit failed for transaction: ' + transactionId, this, "saveChangesInContext"); }
}, function () { throw Exception.create().initWithMessageTargetAndMethod('Failed to revert prepare for save transaction: ' + transactionId, this, "saveChangesInContext"); }