diff --git a/platform/persistence/overwrite/src/PersistenceQueue.js b/platform/persistence/overwrite/src/PersistenceQueue.js index e4d9f422e7..251643c3d4 100644 --- a/platform/persistence/overwrite/src/PersistenceQueue.js +++ b/platform/persistence/overwrite/src/PersistenceQueue.js @@ -1,90 +1,55 @@ /*global define*/ define( - ['./QueuedPersistenceHandler'], - function (QueuedPersistenceHandler) { + [ + './PersistenceQueueImpl', + './PersistenceQueueHandler', + './PersistenceFailureHandler' + ], + function ( + PersistenceQueueImpl, + PersistenceQueueHandler, + PersistenceFailureHandler + ) { "use strict"; + /** * The PersistenceQueue is used by the QueuingPersistenceCapability * to aggregrate calls for object persistence. These are then issued * in a group, such that if some or all are rejected, this result can * be shown to the user (again, in a group.) * - * @param $q Angular's $q + * This constructor is exposed as a service, but handles only the + * wiring of injected dependencies; behavior is implemented in the + * various component parts. + * * @param $timeout Angular's $timeout - * @param {DialogService} dialogService services to prompt for user - * input if persistence fails + * @param {PersistenceQueueHandler} handler handles actual + * persistence when the queue is flushed * @param {number} [DELAY] optional; delay in milliseconds between * attempts to flush the queue */ - function PersistenceQueue($q, $timeout, dialogService, DELAY) { - var queue = {}, - objects = {}, - lastObservedSize = 0, - handler = new QueuedPersistenceHandler($q, dialogService), - pendingTimeout, - flushPromise; - - // Check if the queue's size has stopped increasing) - function quiescent() { - return Object.keys(queue).length === lastObservedSize; - } - - // Persist all queued objects - function flush() { - // Persist all queued objects - flushPromise = handler.persist(queue, objects); - - // When persisted, clear the active promise - flushPromise.then(function () { - flushPromise = undefined; - }); - - // Reset queue, etc. - queue = {}; - objects = {}; - lastObservedSize = 0; - pendingTimeout = undefined; - } - - // Schedule a flushing of the queue (that is, plan to flush - // all objects in the queue) - function scheduleFlush() { - function maybeFlush() { - // Only flush when we've stopped receiving updates - (quiescent() ? flush : scheduleFlush)(); - } - - // If we are already flushing the queue... - if (flushPromise) { - // Wait until that's over before considering a flush - flushPromise.then(maybeFlush); - } else { - // Otherwise, schedule a flush on a timeout (to give - // a window for other updates to get aggregated) - pendingTimeout = pendingTimeout || - $timeout(maybeFlush, DELAY, false); - } - } - - // If no delay is provided, use a default - DELAY = DELAY || 0; - - return { - /** - * Queue persistence of a domain object. - * @param {DomainObject} domainObject the domain object - * @param {PersistenceCapability} persistence the object's - * undecorated persistence capability - */ - put: function (domainObject, persistence) { - var id = domainObject.getId(); - queue[id] = persistence; - objects[id] = domainObject; - scheduleFlush(); - } - }; + function PersistenceQueue( + $q, + $timeout, + dialogService, + persistenceService, + PERSISTENCE_QUEUE_DELAY + ) { + // Wire up injected dependencies + return new PersistenceQueueImpl( + $timeout, + new PersistenceQueueHandler( + $q, + new PersistenceFailureHandler( + $q, + dialogService, + persistenceService + ) + ), + PERSISTENCE_QUEUE_DELAY + ); } return PersistenceQueue; diff --git a/platform/persistence/overwrite/src/QueuedPersistenceHandler.js b/platform/persistence/overwrite/src/PersistenceQueueHandler.js similarity index 100% rename from platform/persistence/overwrite/src/QueuedPersistenceHandler.js rename to platform/persistence/overwrite/src/PersistenceQueueHandler.js diff --git a/platform/persistence/overwrite/src/PersistenceQueueImpl.js b/platform/persistence/overwrite/src/PersistenceQueueImpl.js new file mode 100644 index 0000000000..3ab4edb25c --- /dev/null +++ b/platform/persistence/overwrite/src/PersistenceQueueImpl.js @@ -0,0 +1,94 @@ +/*global define*/ + +define( + [], + function () { + "use strict"; + + /** + * The PersistenceQueue is used by the QueuingPersistenceCapability + * to aggregrate calls for object persistence. These are then issued + * in a group, such that if some or all are rejected, this result can + * be shown to the user (again, in a group.) + * + * This implementation is separate out from PersistenceQueue, which + * handles the wiring of injected dependencies into an instance of + * this class. + * + * @param $timeout Angular's $timeout + * @param {PersistenceQueueHandler} handler handles actual + * persistence when the queue is flushed + * @param {number} [DELAY] optional; delay in milliseconds between + * attempts to flush the queue + */ + function PersistenceQueueImpl($timeout, handler, DELAY) { + var queue = {}, + objects = {}, + lastObservedSize = 0, + pendingTimeout, + flushPromise; + + // Check if the queue's size has stopped increasing) + function quiescent() { + return Object.keys(queue).length === lastObservedSize; + } + + // Persist all queued objects + function flush() { + // Persist all queued objects + flushPromise = handler.persist(queue, objects); + + // When persisted, clear the active promise + flushPromise.then(function () { + flushPromise = undefined; + }); + + // Reset queue, etc. + queue = {}; + objects = {}; + lastObservedSize = 0; + pendingTimeout = undefined; + } + + // Schedule a flushing of the queue (that is, plan to flush + // all objects in the queue) + function scheduleFlush() { + function maybeFlush() { + // Only flush when we've stopped receiving updates + (quiescent() ? flush : scheduleFlush)(); + } + + // If we are already flushing the queue... + if (flushPromise) { + // Wait until that's over before considering a flush + flushPromise.then(maybeFlush); + } else { + // Otherwise, schedule a flush on a timeout (to give + // a window for other updates to get aggregated) + pendingTimeout = pendingTimeout || + $timeout(maybeFlush, DELAY, false); + } + } + + // If no delay is provided, use a default + DELAY = DELAY || 0; + + return { + /** + * Queue persistence of a domain object. + * @param {DomainObject} domainObject the domain object + * @param {PersistenceCapability} persistence the object's + * undecorated persistence capability + */ + put: function (domainObject, persistence) { + var id = domainObject.getId(); + queue[id] = persistence; + objects[id] = domainObject; + scheduleFlush(); + } + }; + } + + return PersistenceQueueImpl; + } +); \ No newline at end of file