[Persistence] Rewrite failure handling

Rewrite the overwrite behavior (for Overwrite/Cancel of rejected
persisted attempts) to utilize simpler API. WTD-1033.
This commit is contained in:
Victor Woeltjen 2015-03-20 15:28:15 -07:00
parent 66fd899650
commit d8e1f69b37
3 changed files with 44 additions and 31 deletions

View File

@ -116,9 +116,9 @@ define(
* @returns {Promise.<boolean>} an indicator of the success or * @returns {Promise.<boolean>} an indicator of the success or
* failure of this request * failure of this request
*/ */
createObject: function (space, key, value, options) { createObject: function (space, key, value) {
addToCache(space, key, value); addToCache(space, key, value);
return persistenceService.createObject(space, key, value, options); return persistenceService.createObject(space, key, value);
}, },
/** /**
* Read an object from a specific space. This will read from a * Read an object from a specific space. This will read from a
@ -126,21 +126,14 @@ define(
* @memberof CachingPersistenceDecorator# * @memberof CachingPersistenceDecorator#
* @param {string} space the space in which to create the object * @param {string} space the space in which to create the object
* @param {string} key the key which identifies the object * @param {string} key the key which identifies the object
* @param {*} options optional parameters
* @returns {Promise.<object>} a promise for the object; may * @returns {Promise.<object>} a promise for the object; may
* resolve to undefined (if the object does not exist * resolve to undefined (if the object does not exist
* in this space) * in this space)
*/ */
readObject: function (space, key, options) { readObject: function (space, key) {
// Ignore cache upon request
if ((options || {}).cache === false) {
return persistenceService.readObject(space, key, options);
}
// Otherwise, use the cache if it's there (and put new
// values into the cache, as well.)
return (cache[space] && cache[space][key]) ? return (cache[space] && cache[space][key]) ?
fastPromise(cache[space][key].value) : fastPromise(cache[space][key].value) :
persistenceService.readObject(space, key, options) persistenceService.readObject(space, key)
.then(putCache(space, key)); .then(putCache(space, key));
}, },
/** /**
@ -154,8 +147,8 @@ define(
* @returns {Promise.<boolean>} an indicator of the success or * @returns {Promise.<boolean>} an indicator of the success or
* failure of this request * failure of this request
*/ */
updateObject: function (space, key, value, options) { updateObject: function (space, key, value) {
return persistenceService.updateObject(space, key, value, options) return persistenceService.updateObject(space, key, value)
.then(function (result) { .then(function (result) {
addToCache(space, key, value); addToCache(space, key, value);
return result; return result;
@ -172,7 +165,7 @@ define(
* @returns {Promise.<boolean>} an indicator of the success or * @returns {Promise.<boolean>} an indicator of the success or
* failure of this request * failure of this request
*/ */
deleteObject: function (space, key, value, options) { deleteObject: function (space, key, value) {
if (cache[space]) { if (cache[space]) {
delete cache[space][key]; delete cache[space][key];
} }

View File

@ -155,12 +155,11 @@ define(
* of the success (true) or failure (false) of this * of the success (true) or failure (false) of this
* operation * operation
*/ */
updateObject: function (space, key, value, options) { updateObject: function (space, key, value) {
var check = (options || {}).check;
function checkUpdate(response) { function checkUpdate(response) {
return checkResponse(response, key); return checkResponse(response, key);
} }
return put(key, value, check && { version: revs[key] }) return put(key, value, { version: revs[key] })
.then(checkUpdate); .then(checkUpdate);
}, },
/** /**

View File

@ -7,16 +7,10 @@ define(
function PersistenceFailureHandler($q, dialogService, persistenceService) { function PersistenceFailureHandler($q, dialogService, persistenceService) {
// Refresh revision information for the domain object associated // Refresh revision information for the domain object associated
// with htis persistence failure // with this persistence failure
function refresh(failure) { function refresh(failure) {
// Perform a new read; this should update the persistence // Refresh the domain object to the latest from persistence
// service's local revision records, so that the next request return failure.persistence.refresh();
// should permit the overwrite
return persistenceService.readObject(
failure.persistence.getSpace(),
failure.id,
{ cache: false } // Disallow caching
);
} }
// Issue a new persist call for the domain object associated with // Issue a new persist call for the domain object associated with
@ -25,15 +19,42 @@ define(
var decoratedPersistence = var decoratedPersistence =
failure.domainObject.getCapability('persistence'); failure.domainObject.getCapability('persistence');
return decoratedPersistence && return decoratedPersistence &&
decoratedPersistence.persist(true); decoratedPersistence.persist();
} }
// Retry persistence for this set of failed attempts // Retry persistence (overwrite) for this set of failed attempts
function retry(failures) { function retry(failures) {
// Refresh all objects within the persistenceService to var models = {};
// get up-to-date revision information; once complete,
// reissue the persistence request. // Cache a copy of the model
function cacheModel(failure) {
// Clone...
models[failure.id] = JSON.parse(JSON.stringify(
failure.domainObject.getModel()
));
}
// Mutate a domain object to restore its model
function remutate(failure) {
var model = models[failure.id];
return failure.domainObject.useCapability(
"mutation",
function () { return model; },
model.modified
);
}
// Cache the object models we might want to save
failures.forEach(cacheModel);
// Strategy here:
// * Cache all of the models we might want to save (above)
// * Refresh all domain objects (so they are latest versions)
// * Re-insert the cached domain object models
// * Invoke persistence again
return $q.all(failures.map(refresh)).then(function () { return $q.all(failures.map(refresh)).then(function () {
return $q.all(failures.map(remutate));
}).then(function () {
return $q.all(failures.map(persist)); return $q.all(failures.map(persist));
}); });
} }