cache-debug.js revision af05c0484a6c6c1f61ee99e58f4a1e29a5560c1d
d4ef65050feac78554addf6e16a06c6e2e0bd331Brian Wellington * The Cache utility provides a common configurable interface for components to
6ea2385360e9e2167e65f9286447da9eea189457Tinderbox User * cache and retrieve data from a local JavaScript struct.
d4ef65050feac78554addf6e16a06c6e2e0bd331Brian Wellington * @module cache
dafcb997e390efa4423883dafd100c975c4095d6Mark Andrews * Base class for the YUI Cache utility.
dafcb997e390efa4423883dafd100c975c4095d6Mark Andrews * @class Cache
dafcb997e390efa4423883dafd100c975c4095d6Mark Andrews * @extends Plugin
dafcb997e390efa4423883dafd100c975c4095d6Mark Andrews * @constructor
dafcb997e390efa4423883dafd100c975c4095d6Mark AndrewsCache = function() {
dafcb997e390efa4423883dafd100c975c4095d6Mark Andrews Cache.superclass.constructor.apply(this, arguments);
b5ad6dfea4cc3e7d1d322ac99f1e5a31096837c4Mark Andrews /////////////////////////////////////////////////////////////////////////////
1753d3c4d74241a847794f7e7cfd94cc79be6600Evan Hunt // Cache static properties
0b062f4990db5cc6db2fe3398926f71b92a67407Brian Wellington /////////////////////////////////////////////////////////////////////////////
0b062f4990db5cc6db2fe3398926f71b92a67407Brian Wellington * The namespace for the plugin. This will be the property on the host which
0b062f4990db5cc6db2fe3398926f71b92a67407Brian Wellington * references the plugin instance.
0b062f4990db5cc6db2fe3398926f71b92a67407Brian Wellington * @property NS
0b062f4990db5cc6db2fe3398926f71b92a67407Brian Wellington * @type String
0b062f4990db5cc6db2fe3398926f71b92a67407Brian Wellington * @value "cache"
c1a883f2e04d94e99c433b1f6cfd0c0338f4ed85Mark Andrews * Class name.
dde8659175c5798267fb0fdefd7576e4efe271b3Automatic Updater * @property NAME
f428e385a4f7a42196b53de8e134909e8c488258Automatic Updater * @type String
6ea2385360e9e2167e65f9286447da9eea189457Tinderbox User * @value "cache"
268a4475065fe6a8cd7cc707820982cf5e98f430Rob Austein /////////////////////////////////////////////////////////////////////////////
f5d30e2864e048a42c4dc1134993ae7efdb5d6c3Mark Andrews // Cache Attributes
268a4475065fe6a8cd7cc707820982cf5e98f430Rob Austein /////////////////////////////////////////////////////////////////////////////
0b062f4990db5cc6db2fe3398926f71b92a67407Brian Wellington * @attribute max
0b062f4990db5cc6db2fe3398926f71b92a67407Brian Wellington * @description Maximum number of entries the Cache can hold.
b272d38cc5d24f64c0647a9afb340c21c4b9aaf7Evan Hunt * Set to 0 to turn off caching.
b272d38cc5d24f64c0647a9afb340c21c4b9aaf7Evan Hunt * @type Number
b272d38cc5d24f64c0647a9afb340c21c4b9aaf7Evan Hunt * @default 0
b843f577bbcd6660fbaa506d9e55b156c689a5a8Evan Hunt // If the cache is full, make room by removing stalest element (index=0)
42782931073786f98d3d0a617351db40066949a4Mukund Sivaraman * @attribute size
553ead32ff5b00284e574dcabc39115d4d74ec66Evan Hunt * @description Number of entries currently cached.
0b062f4990db5cc6db2fe3398926f71b92a67407Brian Wellington * @type Number
553ead32ff5b00284e574dcabc39115d4d74ec66Evan Hunt * @attribute entries
0b062f4990db5cc6db2fe3398926f71b92a67407Brian Wellington * @description Cached entries.
41eeb37b516d1bac073781b6ec50a39a669987dfEvan Hunt * @type Array
41eeb37b516d1bac073781b6ec50a39a669987dfEvan Hunt getter: function() {
0b062f4990db5cc6db2fe3398926f71b92a67407Brian Wellington /////////////////////////////////////////////////////////////////////////////
268a4475065fe6a8cd7cc707820982cf5e98f430Rob Austein // Cache private properties
553ead32ff5b00284e574dcabc39115d4d74ec66Evan Hunt /////////////////////////////////////////////////////////////////////////////
cc6cddfd94e8f0c58c290317b0853dac30b1b895Evan Hunt * Array of request/response objects indexed chronologically.
553ead32ff5b00284e574dcabc39115d4d74ec66Evan Hunt * @property _entries
553ead32ff5b00284e574dcabc39115d4d74ec66Evan Hunt * @type Object[]
cc6cddfd94e8f0c58c290317b0853dac30b1b895Evan Hunt /////////////////////////////////////////////////////////////////////////////
cc6cddfd94e8f0c58c290317b0853dac30b1b895Evan Hunt // Cache private methods
268a4475065fe6a8cd7cc707820982cf5e98f430Rob Austein /////////////////////////////////////////////////////////////////////////////
6098d364b690cb9dabf96e9664c4689c8559bd2eMark Andrews * @method initializer
268a4475065fe6a8cd7cc707820982cf5e98f430Rob Austein * @description Internal init() handler.
268a4475065fe6a8cd7cc707820982cf5e98f430Rob Austein * @param config {Object} Config object.
0b062f4990db5cc6db2fe3398926f71b92a67407Brian Wellington * @description Fired when an entry is added.
0b062f4990db5cc6db2fe3398926f71b92a67407Brian Wellington * @param e {Event.Facade} Event Facade with the following properties:
268a4475065fe6a8cd7cc707820982cf5e98f430Rob Austein * <dt>entry (Object)</dt> <dd>The cached entry.</dd>
cc6cddfd94e8f0c58c290317b0853dac30b1b895Evan Hunt * @preventable _defAddFn
268a4475065fe6a8cd7cc707820982cf5e98f430Rob Austein this.publish("add", {defaultFn: this._defAddFn});
aaaf8d4f4873d21e55c3ffb4f656203d08339865Mark Andrews * @event flush
268a4475065fe6a8cd7cc707820982cf5e98f430Rob Austein * @description Fired when the cache is flushed.
b272d38cc5d24f64c0647a9afb340c21c4b9aaf7Evan Hunt * @param e {Event.Facade} Event Facade object.
553ead32ff5b00284e574dcabc39115d4d74ec66Evan Hunt * @preventable _defFlushFn
edad003e630cf9a25db88d95247d10eb96117d66Jeremy C. Reed this.publish("flush", {defaultFn: this._defFlushFn});
553ead32ff5b00284e574dcabc39115d4d74ec66Evan Hunt * @event request
553ead32ff5b00284e574dcabc39115d4d74ec66Evan Hunt * @description Fired when an entry is requested from the cache.
b272d38cc5d24f64c0647a9afb340c21c4b9aaf7Evan Hunt * @param e {Event.Facade} Event Facade with the following properties:
0b062f4990db5cc6db2fe3398926f71b92a67407Brian Wellington * <dt>request (Object)</dt> <dd>The request object.</dd>
268a4475065fe6a8cd7cc707820982cf5e98f430Rob Austein * @event retrieve
268a4475065fe6a8cd7cc707820982cf5e98f430Rob Austein * @description Fired when an entry is retrieved from the cache.
268a4475065fe6a8cd7cc707820982cf5e98f430Rob Austein * @param e {Event.Facade} Event Facade with the following properties:
268a4475065fe6a8cd7cc707820982cf5e98f430Rob Austein * <dt>entry (Object)</dt> <dd>The retrieved entry.</dd>
268a4475065fe6a8cd7cc707820982cf5e98f430Rob Austein // Initialize internal values
0b062f4990db5cc6db2fe3398926f71b92a67407Brian Wellington Y.log("Cache initialized", "info", "cache");
553ead32ff5b00284e574dcabc39115d4d74ec66Evan Hunt * @method destructor
553ead32ff5b00284e574dcabc39115d4d74ec66Evan Hunt * @description Internal destroy() handler.
553ead32ff5b00284e574dcabc39115d4d74ec66Evan Hunt destructor: function() {
553ead32ff5b00284e574dcabc39115d4d74ec66Evan Hunt /////////////////////////////////////////////////////////////////////////////
553ead32ff5b00284e574dcabc39115d4d74ec66Evan Hunt // Cache protected methods
553ead32ff5b00284e574dcabc39115d4d74ec66Evan Hunt /////////////////////////////////////////////////////////////////////////////
553ead32ff5b00284e574dcabc39115d4d74ec66Evan Hunt * Adds entry to cache.
553ead32ff5b00284e574dcabc39115d4d74ec66Evan Hunt * @method _defAddFn
553ead32ff5b00284e574dcabc39115d4d74ec66Evan Hunt * @param e {Event.Facade} Event Facade with the following properties:
553ead32ff5b00284e574dcabc39115d4d74ec66Evan Hunt * <dt>entry (Object)</dt> <dd>The cached entry.</dd>
553ead32ff5b00284e574dcabc39115d4d74ec66Evan Hunt * @protected
553ead32ff5b00284e574dcabc39115d4d74ec66Evan Hunt _defAddFn: function(e) {
268a4475065fe6a8cd7cc707820982cf5e98f430Rob Austein // If the cache at or over capacity, make room by removing stalest element (index=0)
0b062f4990db5cc6db2fe3398926f71b92a67407Brian Wellington // Add entry to cache in the newest position, at the end of the array
8b78c993cb475cc94e88560941b28c37684789d9Francis Dupont Y.log("Cached entry: " + Y.dump(entry), "info", "cache");
ba751492fcc4f161a18b983d4f018a1a52938cb9Evan Hunt * Flushes cache.
ba751492fcc4f161a18b983d4f018a1a52938cb9Evan Hunt * @method _defFlushFn
ba751492fcc4f161a18b983d4f018a1a52938cb9Evan Hunt * @param e {Event.Facade} Event Facade object.
ba751492fcc4f161a18b983d4f018a1a52938cb9Evan Hunt * @protected
ba751492fcc4f161a18b983d4f018a1a52938cb9Evan Hunt _defFlushFn: function(e) {
8b78c993cb475cc94e88560941b28c37684789d9Francis Dupont * Default overridable method compares current request with given cache entry.
b0c15bd9792112fb47f6d956e580e4369e92f4e7Mark Andrews * Returns true if current request matches the cached request, otherwise
b0c15bd9792112fb47f6d956e580e4369e92f4e7Mark Andrews * false. Implementers should override this method to customize the
268a4475065fe6a8cd7cc707820982cf5e98f430Rob Austein * cache-matching algorithm.
268a4475065fe6a8cd7cc707820982cf5e98f430Rob Austein * @method _isMatch
553ead32ff5b00284e574dcabc39115d4d74ec66Evan Hunt * @param request {Object} Request object.
268a4475065fe6a8cd7cc707820982cf5e98f430Rob Austein * @param entry {Object} Cached entry.
268a4475065fe6a8cd7cc707820982cf5e98f430Rob Austein * @return {Boolean} True if current request matches given cached request, false otherwise.
b0c15bd9792112fb47f6d956e580e4369e92f4e7Mark Andrews * @protected
b843f577bbcd6660fbaa506d9e55b156c689a5a8Evan Hunt /////////////////////////////////////////////////////////////////////////////
b843f577bbcd6660fbaa506d9e55b156c689a5a8Evan Hunt // Cache public methods
b843f577bbcd6660fbaa506d9e55b156c689a5a8Evan Hunt /////////////////////////////////////////////////////////////////////////////
0b062f4990db5cc6db2fe3398926f71b92a67407Brian Wellington * Adds a new entry to the cache of the format
268a4475065fe6a8cd7cc707820982cf5e98f430Rob Austein * {request:request, response:response, payload:payload}.
268a4475065fe6a8cd7cc707820982cf5e98f430Rob Austein * If cache is full, evicts the stalest entry before adding the new one.
268a4475065fe6a8cd7cc707820982cf5e98f430Rob Austein * @method add
268a4475065fe6a8cd7cc707820982cf5e98f430Rob Austein * @param request {Object} Request value.
268a4475065fe6a8cd7cc707820982cf5e98f430Rob Austein * @param response {Object} Response value.
268a4475065fe6a8cd7cc707820982cf5e98f430Rob Austein * @param payload {Object} (optional) Arbitrary data payload.
0b062f4990db5cc6db2fe3398926f71b92a67407Brian Wellington add: function(request, response, payload) {
0b062f4990db5cc6db2fe3398926f71b92a67407Brian Wellington if(this.get("entries") && (this.get("max")>0) &&
0b062f4990db5cc6db2fe3398926f71b92a67407Brian Wellington (LANG.isValue(request) || LANG.isNull(request) || LANG.isUndefined(request))) {
0b062f4990db5cc6db2fe3398926f71b92a67407Brian Wellington this.fire("add", {entry: {request:request, response:response, payload:payload}});
268a4475065fe6a8cd7cc707820982cf5e98f430Rob Austein Y.log("Could not add " + Y.dump(response) + " to cache for " + Y.dump(request), "info", "cache");
0b062f4990db5cc6db2fe3398926f71b92a67407Brian Wellington * Flushes cache.
553ead32ff5b00284e574dcabc39115d4d74ec66Evan Hunt * @method flush
553ead32ff5b00284e574dcabc39115d4d74ec66Evan Hunt flush: function() {
553ead32ff5b00284e574dcabc39115d4d74ec66Evan Hunt * Retrieves cached entry for given request, if available, and refreshes
cc3aafe737334d444781f8a34ffaf459e075bb9aMark Andrews * entry in the cache. Returns null if there is no cache match.
268a4475065fe6a8cd7cc707820982cf5e98f430Rob Austein * @method retrieve
268a4475065fe6a8cd7cc707820982cf5e98f430Rob Austein * @param request {Object} Request object.
553ead32ff5b00284e574dcabc39115d4d74ec66Evan Hunt * @return {Object} Cached entry object with the properties request, response, and payload, or null.
cc3aafe737334d444781f8a34ffaf459e075bb9aMark Andrews // If cache is enabled...
61bcc232038f0a2cb77ed6269675fdc288f5ec98Evan Hunt // Loop through each cached entry starting from the newest
03f979494f5c80e05a72f876914d9d44085fbd6aEvan Hunt for(; i >= 0; i--) {
03f979494f5c80e05a72f876914d9d44085fbd6aEvan Hunt // Execute matching function
61bcc232038f0a2cb77ed6269675fdc288f5ec98Evan Hunt // Refresh the position of the cache hit
0b062f4990db5cc6db2fe3398926f71b92a67407Brian Wellington // Remove element from its original location
268a4475065fe6a8cd7cc707820982cf5e98f430Rob Austein // Add as newest
268a4475065fe6a8cd7cc707820982cf5e98f430Rob Austein Y.log("Refreshed cache entry: " + Y.dump(entry) +
268a4475065fe6a8cd7cc707820982cf5e98f430Rob Austein " for request: " + Y.dump(request), "info", "cache");
c6d2578fd67bc1a427d13fd0699b25a187feec8aMark Andrews Y.log("Retrieved cached response: " + Y.dump(entry) +
c6d2578fd67bc1a427d13fd0699b25a187feec8aMark Andrews " for request: " + Y.dump(request), "info", "cache");
c6d2578fd67bc1a427d13fd0699b25a187feec8aMark Andrews return null;