diff --git a/platform/core/bundle.js b/platform/core/bundle.js index 3c56e7e51b..abb0ce9fab 100644 --- a/platform/core/bundle.js +++ b/platform/core/bundle.js @@ -27,6 +27,7 @@ define([ "./src/models/StaticModelProvider", "./src/models/RootModelProvider", "./src/models/ModelAggregator", + "./src/models/ModelCacheService", "./src/models/PersistedModelProvider", "./src/models/CachingModelDecorator", "./src/models/MissingModelDecorator", @@ -58,6 +59,7 @@ define([ StaticModelProvider, RootModelProvider, ModelAggregator, + ModelCacheService, PersistedModelProvider, CachingModelDecorator, MissingModelDecorator, @@ -182,7 +184,10 @@ define([ { "provides": "modelService", "type": "decorator", - "implementation": CachingModelDecorator + "implementation": CachingModelDecorator, + "depends": [ + "cacheService" + ] }, { "provides": "modelService", @@ -319,6 +324,7 @@ define([ "key": "persistence", "implementation": PersistenceCapability, "depends": [ + "cacheService", "persistenceService", "identifierService", "notificationService", @@ -354,6 +360,10 @@ define([ } ], "services": [ + { + "key": "cacheService", + "implementation": ModelCacheService + }, { "key": "now", "implementation": Now diff --git a/platform/core/src/capabilities/PersistenceCapability.js b/platform/core/src/capabilities/PersistenceCapability.js index 9c7d769d22..91c5147bfe 100644 --- a/platform/core/src/capabilities/PersistenceCapability.js +++ b/platform/core/src/capabilities/PersistenceCapability.js @@ -46,6 +46,7 @@ define( * @implements {Capability} */ function PersistenceCapability( + cacheService, persistenceService, identifierService, notificationService, @@ -56,6 +57,7 @@ define( this.modified = domainObject.getModel().modified; this.domainObject = domainObject; + this.cacheService = cacheService; this.identifierService = identifierService; this.persistenceService = persistenceService; this.notificationService = notificationService; @@ -130,6 +132,7 @@ define( domainObject = this.domainObject, model = domainObject.getModel(), modified = model.modified, + cacheService = this.cacheService, persistenceService = this.persistenceService, persistenceFn = model.persisted !== undefined ? this.persistenceService.updateObject : @@ -146,6 +149,9 @@ define( getKey(domainObject.getId()), domainObject.getModel() ]).then(function(result){ + if (result) { + cacheService.remove(domainObject.getId()); + } return rejectIfFalsey(result, self.$q); }).catch(function(error){ return notifyOnError(error, domainObject, self.notificationService, self.$q); diff --git a/platform/core/src/models/CachingModelDecorator.js b/platform/core/src/models/CachingModelDecorator.js index a338d6770f..ffa377cf0a 100644 --- a/platform/core/src/models/CachingModelDecorator.js +++ b/platform/core/src/models/CachingModelDecorator.js @@ -35,9 +35,8 @@ define( * @param {ModelService} modelService this service to decorate * @implements {ModelService} */ - function CachingModelDecorator(modelService) { - this.cache = {}; - this.cached = {}; + function CachingModelDecorator(cacheService, modelService) { + this.cacheService = cacheService; this.modelService = modelService; } @@ -51,10 +50,9 @@ define( } CachingModelDecorator.prototype.getModels = function (ids) { - var cache = this.cache, - cached = this.cached, + var cacheService = this.cacheService, neededIds = ids.filter(function notCached(id) { - return !cached[id]; + return !cacheService.has(id); }); // Update the cached instance of a model to a new value. @@ -71,7 +69,7 @@ define( // If we'd previously cached an undefined value, or are now // seeing undefined, replace the item in the cache entirely. if (oldModel === undefined || model === undefined) { - cache[id] = model; + cacheService.put(id, model); return model; } @@ -91,15 +89,15 @@ define( // Store the provided models in our cache function cacheAll(models) { Object.keys(models).forEach(function (id) { - cache[id] = cached[id] ? + var model = cacheService.has(id) ? updateModel(id, models[id]) : models[id]; - cached[id] = true; + cacheService.put(id, model); }); } // Expose the cache (for promise chaining) function giveCache() { - return cache; + return cacheService.all(); } // Look up if we have unknown IDs diff --git a/platform/core/src/models/ModelCacheService.js b/platform/core/src/models/ModelCacheService.js new file mode 100644 index 0000000000..ee6edd522c --- /dev/null +++ b/platform/core/src/models/ModelCacheService.js @@ -0,0 +1,55 @@ +/***************************************************************************** + * Open MCT Web, Copyright (c) 2014-2015, United States Government + * as represented by the Administrator of the National Aeronautics and Space + * Administration. All rights reserved. + * + * Open MCT Web is licensed under the Apache License, Version 2.0 (the + * "License"); you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * http://www.apache.org/licenses/LICENSE-2.0. + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT + * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the + * License for the specific language governing permissions and limitations + * under the License. + * + * Open MCT Web includes source code licensed under additional open source + * licenses. See the Open Source Licenses file (LICENSES.md) included with + * this source code distribution or the Licensing information page available + * at runtime from the About dialog for additional information. + *****************************************************************************/ +/*global define*/ + +define([], function () { + 'use strict'; + + function ModelCacheService() { + this.cache = {}; + this.cached = {}; + } + + ModelCacheService.prototype.put = function (id, model) { + this.cached[id] = true; + this.cache[id] = model; + }; + + ModelCacheService.prototype.get = function (id) { + return this.cache[id]; + }; + + ModelCacheService.prototype.has = function (id) { + return this.cached[id]; + }; + + ModelCacheService.prototype.remove = function (id) { + delete this.cached[id]; + delete this.cache[id]; + }; + + ModelCacheService.prototype.all = function () { + return this.cache; + }; + + return ModelCacheService; +}); diff --git a/platform/core/src/services/Instantiate.js b/platform/core/src/services/Instantiate.js index c184e08f84..2b6032e80e 100644 --- a/platform/core/src/services/Instantiate.js +++ b/platform/core/src/services/Instantiate.js @@ -44,10 +44,15 @@ define( * @param {IdentifierService} identifierService service to generate * new identifiers */ - function Instantiate(capabilityService, identifierService) { + function Instantiate( + capabilityService, + identifierService, + cacheService + ) { return function (model, id) { var capabilities = capabilityService.getCapabilities(model); id = id || identifierService.generate(); + cacheService.put(id, model); return new DomainObjectImpl(id, model, capabilities); }; }