cache-debug.js revision af05c0484a6c6c1f61ee99e58f4a1e29a5560c1d
5cd4555ad444fd391002ae32450572054369fd42Rob AusteinYUI.add('cache', function(Y) {
5cd4555ad444fd391002ae32450572054369fd42Rob Austein
268a4475065fe6a8cd7cc707820982cf5e98f430Rob Austein/**
d4ef65050feac78554addf6e16a06c6e2e0bd331Brian Wellington * The Cache utility provides a common configurable interface for components to
6ea2385360e9e2167e65f9286447da9eea189457Tinderbox User * cache and retrieve data from a local JavaScript struct.
c651f15b30f1dae5cc2f00878fb5da5b3a35a468Mark Andrews *
d4ef65050feac78554addf6e16a06c6e2e0bd331Brian Wellington * @module cache
ec5347e2c775f027573ce5648b910361aa926c01Automatic Updater */
d4ef65050feac78554addf6e16a06c6e2e0bd331Brian Wellingtonvar LANG = Y.Lang,
d4ef65050feac78554addf6e16a06c6e2e0bd331Brian Wellington
d4ef65050feac78554addf6e16a06c6e2e0bd331Brian Wellington/**
dafcb997e390efa4423883dafd100c975c4095d6Mark Andrews * Base class for the YUI Cache utility.
dafcb997e390efa4423883dafd100c975c4095d6Mark Andrews * @class Cache
dafcb997e390efa4423883dafd100c975c4095d6Mark Andrews * @extends Plugin
dafcb997e390efa4423883dafd100c975c4095d6Mark Andrews * @constructor
dafcb997e390efa4423883dafd100c975c4095d6Mark Andrews */
dafcb997e390efa4423883dafd100c975c4095d6Mark AndrewsCache = function() {
dafcb997e390efa4423883dafd100c975c4095d6Mark Andrews Cache.superclass.constructor.apply(this, arguments);
d4ef65050feac78554addf6e16a06c6e2e0bd331Brian Wellington};
f5d30e2864e048a42c4dc1134993ae7efdb5d6c3Mark Andrews
b5ad6dfea4cc3e7d1d322ac99f1e5a31096837c4Mark Andrews /////////////////////////////////////////////////////////////////////////////
0b062f4990db5cc6db2fe3398926f71b92a67407Brian Wellington //
1753d3c4d74241a847794f7e7cfd94cc79be6600Evan Hunt // Cache static properties
0b062f4990db5cc6db2fe3398926f71b92a67407Brian Wellington //
0b062f4990db5cc6db2fe3398926f71b92a67407Brian Wellington /////////////////////////////////////////////////////////////////////////////
0b062f4990db5cc6db2fe3398926f71b92a67407Brian WellingtonY.mix(Cache, {
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 *
0b062f4990db5cc6db2fe3398926f71b92a67407Brian Wellington * @property NS
0b062f4990db5cc6db2fe3398926f71b92a67407Brian Wellington * @type String
0b062f4990db5cc6db2fe3398926f71b92a67407Brian Wellington * @static
0b062f4990db5cc6db2fe3398926f71b92a67407Brian Wellington * @final
0b062f4990db5cc6db2fe3398926f71b92a67407Brian Wellington * @value "cache"
0b062f4990db5cc6db2fe3398926f71b92a67407Brian Wellington */
268a4475065fe6a8cd7cc707820982cf5e98f430Rob Austein NS: "cache",
268a4475065fe6a8cd7cc707820982cf5e98f430Rob Austein
268a4475065fe6a8cd7cc707820982cf5e98f430Rob Austein
268a4475065fe6a8cd7cc707820982cf5e98f430Rob Austein /**
c1a883f2e04d94e99c433b1f6cfd0c0338f4ed85Mark Andrews * Class name.
3398334b3acda24b086957286288ca9852662b12Automatic Updater *
dde8659175c5798267fb0fdefd7576e4efe271b3Automatic Updater * @property NAME
f428e385a4f7a42196b53de8e134909e8c488258Automatic Updater * @type String
207cee019eb5cbbe7c905f7c52f7b5d11f8c0305Automatic Updater * @static
99d8f5a70440ee8b63ab1745d713b96dde890546Tinderbox User * @final
6ea2385360e9e2167e65f9286447da9eea189457Tinderbox User * @value "cache"
268a4475065fe6a8cd7cc707820982cf5e98f430Rob Austein */
268a4475065fe6a8cd7cc707820982cf5e98f430Rob Austein NAME: "cache",
268a4475065fe6a8cd7cc707820982cf5e98f430Rob Austein
268a4475065fe6a8cd7cc707820982cf5e98f430Rob Austein
268a4475065fe6a8cd7cc707820982cf5e98f430Rob Austein ATTRS: {
268a4475065fe6a8cd7cc707820982cf5e98f430Rob Austein /////////////////////////////////////////////////////////////////////////////
268a4475065fe6a8cd7cc707820982cf5e98f430Rob Austein //
f5d30e2864e048a42c4dc1134993ae7efdb5d6c3Mark Andrews // Cache Attributes
268a4475065fe6a8cd7cc707820982cf5e98f430Rob Austein //
268a4475065fe6a8cd7cc707820982cf5e98f430Rob Austein /////////////////////////////////////////////////////////////////////////////
268a4475065fe6a8cd7cc707820982cf5e98f430Rob Austein
0b062f4990db5cc6db2fe3398926f71b92a67407Brian Wellington /**
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
553ead32ff5b00284e574dcabc39115d4d74ec66Evan Hunt */
553ead32ff5b00284e574dcabc39115d4d74ec66Evan Hunt max: {
553ead32ff5b00284e574dcabc39115d4d74ec66Evan Hunt value: 0,
0b062f4990db5cc6db2fe3398926f71b92a67407Brian Wellington validator: function(value) {
553ead32ff5b00284e574dcabc39115d4d74ec66Evan Hunt return (LANG.isNumber(value));
8b78c993cb475cc94e88560941b28c37684789d9Francis Dupont },
b0c15bd9792112fb47f6d956e580e4369e92f4e7Mark Andrews setter: function(value) {
b843f577bbcd6660fbaa506d9e55b156c689a5a8Evan Hunt // If the cache is full, make room by removing stalest element (index=0)
0b062f4990db5cc6db2fe3398926f71b92a67407Brian Wellington var entries = this._entries;
0b062f4990db5cc6db2fe3398926f71b92a67407Brian Wellington if(value > 0) {
b843f577bbcd6660fbaa506d9e55b156c689a5a8Evan Hunt if(entries) {
c6f4972c745f8903aba6dcca41f17a44c473db66Mark Andrews while(entries.length > value) {
553ead32ff5b00284e574dcabc39115d4d74ec66Evan Hunt entries.shift();
61bcc232038f0a2cb77ed6269675fdc288f5ec98Evan Hunt }
cc3aafe737334d444781f8a34ffaf459e075bb9aMark Andrews }
553ead32ff5b00284e574dcabc39115d4d74ec66Evan Hunt }
0b062f4990db5cc6db2fe3398926f71b92a67407Brian Wellington else {
c6d2578fd67bc1a427d13fd0699b25a187feec8aMark Andrews this._entries = [];
553ead32ff5b00284e574dcabc39115d4d74ec66Evan Hunt }
0b062f4990db5cc6db2fe3398926f71b92a67407Brian Wellington return value;
c6f4972c745f8903aba6dcca41f17a44c473db66Mark Andrews }
0b062f4990db5cc6db2fe3398926f71b92a67407Brian Wellington },
0b062f4990db5cc6db2fe3398926f71b92a67407Brian Wellington
0b062f4990db5cc6db2fe3398926f71b92a67407Brian Wellington /**
42782931073786f98d3d0a617351db40066949a4Mukund Sivaraman * @attribute size
553ead32ff5b00284e574dcabc39115d4d74ec66Evan Hunt * @description Number of entries currently cached.
0b062f4990db5cc6db2fe3398926f71b92a67407Brian Wellington * @type Number
0b062f4990db5cc6db2fe3398926f71b92a67407Brian Wellington */
0b062f4990db5cc6db2fe3398926f71b92a67407Brian Wellington size: {
0b062f4990db5cc6db2fe3398926f71b92a67407Brian Wellington readOnly: true,
0b062f4990db5cc6db2fe3398926f71b92a67407Brian Wellington getter: function() {
0b062f4990db5cc6db2fe3398926f71b92a67407Brian Wellington return this._entries.length;
268a4475065fe6a8cd7cc707820982cf5e98f430Rob Austein }
268a4475065fe6a8cd7cc707820982cf5e98f430Rob Austein },
561a29af8c54a216e7d30b5b4f6e0d21661654ecMark Andrews
553ead32ff5b00284e574dcabc39115d4d74ec66Evan Hunt /**
553ead32ff5b00284e574dcabc39115d4d74ec66Evan Hunt * @attribute entries
0b062f4990db5cc6db2fe3398926f71b92a67407Brian Wellington * @description Cached entries.
41eeb37b516d1bac073781b6ec50a39a669987dfEvan Hunt * @type Array
41eeb37b516d1bac073781b6ec50a39a669987dfEvan Hunt */
41eeb37b516d1bac073781b6ec50a39a669987dfEvan Hunt entries: {
41eeb37b516d1bac073781b6ec50a39a669987dfEvan Hunt readOnly: true,
41eeb37b516d1bac073781b6ec50a39a669987dfEvan Hunt getter: function() {
0b062f4990db5cc6db2fe3398926f71b92a67407Brian Wellington return this._entries;
0b062f4990db5cc6db2fe3398926f71b92a67407Brian Wellington }
0b062f4990db5cc6db2fe3398926f71b92a67407Brian Wellington }
0b062f4990db5cc6db2fe3398926f71b92a67407Brian Wellington }
0b062f4990db5cc6db2fe3398926f71b92a67407Brian Wellington});
0b062f4990db5cc6db2fe3398926f71b92a67407Brian Wellington
0b062f4990db5cc6db2fe3398926f71b92a67407Brian WellingtonY.extend(Cache, Y.Plugin.Base, {
0b062f4990db5cc6db2fe3398926f71b92a67407Brian Wellington /////////////////////////////////////////////////////////////////////////////
268a4475065fe6a8cd7cc707820982cf5e98f430Rob Austein //
268a4475065fe6a8cd7cc707820982cf5e98f430Rob Austein // Cache private properties
553ead32ff5b00284e574dcabc39115d4d74ec66Evan Hunt //
553ead32ff5b00284e574dcabc39115d4d74ec66Evan Hunt /////////////////////////////////////////////////////////////////////////////
aaaf8d4f4873d21e55c3ffb4f656203d08339865Mark Andrews
aaaf8d4f4873d21e55c3ffb4f656203d08339865Mark Andrews /**
cc6cddfd94e8f0c58c290317b0853dac30b1b895Evan Hunt * Array of request/response objects indexed chronologically.
553ead32ff5b00284e574dcabc39115d4d74ec66Evan Hunt *
553ead32ff5b00284e574dcabc39115d4d74ec66Evan Hunt * @property _entries
553ead32ff5b00284e574dcabc39115d4d74ec66Evan Hunt * @type Object[]
553ead32ff5b00284e574dcabc39115d4d74ec66Evan Hunt * @private
553ead32ff5b00284e574dcabc39115d4d74ec66Evan Hunt */
553ead32ff5b00284e574dcabc39115d4d74ec66Evan Hunt _entries: null,
553ead32ff5b00284e574dcabc39115d4d74ec66Evan Hunt
cc6cddfd94e8f0c58c290317b0853dac30b1b895Evan Hunt /////////////////////////////////////////////////////////////////////////////
cc6cddfd94e8f0c58c290317b0853dac30b1b895Evan Hunt //
cc6cddfd94e8f0c58c290317b0853dac30b1b895Evan Hunt // Cache private methods
268a4475065fe6a8cd7cc707820982cf5e98f430Rob Austein //
268a4475065fe6a8cd7cc707820982cf5e98f430Rob Austein /////////////////////////////////////////////////////////////////////////////
268a4475065fe6a8cd7cc707820982cf5e98f430Rob Austein
6098d364b690cb9dabf96e9664c4689c8559bd2eMark Andrews /**
6098d364b690cb9dabf96e9664c4689c8559bd2eMark Andrews * @method initializer
268a4475065fe6a8cd7cc707820982cf5e98f430Rob Austein * @description Internal init() handler.
268a4475065fe6a8cd7cc707820982cf5e98f430Rob Austein * @param config {Object} Config object.
553ead32ff5b00284e574dcabc39115d4d74ec66Evan Hunt * @private
553ead32ff5b00284e574dcabc39115d4d74ec66Evan Hunt */
268a4475065fe6a8cd7cc707820982cf5e98f430Rob Austein initializer: function(config) {
268a4475065fe6a8cd7cc707820982cf5e98f430Rob Austein
0b062f4990db5cc6db2fe3398926f71b92a67407Brian Wellington /**
0b062f4990db5cc6db2fe3398926f71b92a67407Brian Wellington * @event add
0b062f4990db5cc6db2fe3398926f71b92a67407Brian Wellington * @description Fired when an entry is added.
0b062f4990db5cc6db2fe3398926f71b92a67407Brian Wellington * @param e {Event.Facade} Event Facade with the following properties:
268a4475065fe6a8cd7cc707820982cf5e98f430Rob Austein * <dl>
268a4475065fe6a8cd7cc707820982cf5e98f430Rob Austein * <dt>entry (Object)</dt> <dd>The cached entry.</dd>
268a4475065fe6a8cd7cc707820982cf5e98f430Rob Austein * </dl>
cc6cddfd94e8f0c58c290317b0853dac30b1b895Evan Hunt * @preventable _defAddFn
b272d38cc5d24f64c0647a9afb340c21c4b9aaf7Evan Hunt */
268a4475065fe6a8cd7cc707820982cf5e98f430Rob Austein this.publish("add", {defaultFn: this._defAddFn});
cc6cddfd94e8f0c58c290317b0853dac30b1b895Evan Hunt
aaaf8d4f4873d21e55c3ffb4f656203d08339865Mark Andrews /**
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
553ead32ff5b00284e574dcabc39115d4d74ec66Evan Hunt */
edad003e630cf9a25db88d95247d10eb96117d66Jeremy C. Reed this.publish("flush", {defaultFn: this._defFlushFn});
553ead32ff5b00284e574dcabc39115d4d74ec66Evan Hunt
553ead32ff5b00284e574dcabc39115d4d74ec66Evan Hunt /**
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:
268a4475065fe6a8cd7cc707820982cf5e98f430Rob Austein * <dl>
0b062f4990db5cc6db2fe3398926f71b92a67407Brian Wellington * <dt>request (Object)</dt> <dd>The request object.</dd>
0b062f4990db5cc6db2fe3398926f71b92a67407Brian Wellington * </dl>
0b062f4990db5cc6db2fe3398926f71b92a67407Brian Wellington */
0b062f4990db5cc6db2fe3398926f71b92a67407Brian Wellington
268a4475065fe6a8cd7cc707820982cf5e98f430Rob Austein /**
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 * <dl>
268a4475065fe6a8cd7cc707820982cf5e98f430Rob Austein * <dt>entry (Object)</dt> <dd>The retrieved entry.</dd>
268a4475065fe6a8cd7cc707820982cf5e98f430Rob Austein * </dl>
bf45f72ed319628eebce60c368177320943d001fMark Andrews */
bf45f72ed319628eebce60c368177320943d001fMark Andrews
268a4475065fe6a8cd7cc707820982cf5e98f430Rob Austein // Initialize internal values
268a4475065fe6a8cd7cc707820982cf5e98f430Rob Austein this._entries = [];
0b062f4990db5cc6db2fe3398926f71b92a67407Brian Wellington Y.log("Cache initialized", "info", "cache");
0b062f4990db5cc6db2fe3398926f71b92a67407Brian Wellington },
553ead32ff5b00284e574dcabc39115d4d74ec66Evan Hunt
553ead32ff5b00284e574dcabc39115d4d74ec66Evan Hunt /**
553ead32ff5b00284e574dcabc39115d4d74ec66Evan Hunt * @method destructor
553ead32ff5b00284e574dcabc39115d4d74ec66Evan Hunt * @description Internal destroy() handler.
553ead32ff5b00284e574dcabc39115d4d74ec66Evan Hunt * @private
553ead32ff5b00284e574dcabc39115d4d74ec66Evan Hunt */
553ead32ff5b00284e574dcabc39115d4d74ec66Evan Hunt destructor: function() {
aaaf8d4f4873d21e55c3ffb4f656203d08339865Mark Andrews this._entries = null;
aaaf8d4f4873d21e55c3ffb4f656203d08339865Mark Andrews Y.log("Cache destroyed", "info", "cache");
cc6cddfd94e8f0c58c290317b0853dac30b1b895Evan Hunt },
553ead32ff5b00284e574dcabc39115d4d74ec66Evan Hunt
553ead32ff5b00284e574dcabc39115d4d74ec66Evan Hunt /////////////////////////////////////////////////////////////////////////////
553ead32ff5b00284e574dcabc39115d4d74ec66Evan Hunt //
553ead32ff5b00284e574dcabc39115d4d74ec66Evan Hunt // Cache protected methods
553ead32ff5b00284e574dcabc39115d4d74ec66Evan Hunt //
553ead32ff5b00284e574dcabc39115d4d74ec66Evan Hunt /////////////////////////////////////////////////////////////////////////////
553ead32ff5b00284e574dcabc39115d4d74ec66Evan Hunt
553ead32ff5b00284e574dcabc39115d4d74ec66Evan Hunt /**
553ead32ff5b00284e574dcabc39115d4d74ec66Evan Hunt * Adds entry to cache.
553ead32ff5b00284e574dcabc39115d4d74ec66Evan Hunt *
553ead32ff5b00284e574dcabc39115d4d74ec66Evan Hunt * @method _defAddFn
553ead32ff5b00284e574dcabc39115d4d74ec66Evan Hunt * @param e {Event.Facade} Event Facade with the following properties:
553ead32ff5b00284e574dcabc39115d4d74ec66Evan Hunt * <dl>
553ead32ff5b00284e574dcabc39115d4d74ec66Evan Hunt * <dt>entry (Object)</dt> <dd>The cached entry.</dd>
553ead32ff5b00284e574dcabc39115d4d74ec66Evan Hunt * </dl>
553ead32ff5b00284e574dcabc39115d4d74ec66Evan Hunt * @protected
553ead32ff5b00284e574dcabc39115d4d74ec66Evan Hunt */
553ead32ff5b00284e574dcabc39115d4d74ec66Evan Hunt _defAddFn: function(e) {
553ead32ff5b00284e574dcabc39115d4d74ec66Evan Hunt var entries = this._entries,
0b062f4990db5cc6db2fe3398926f71b92a67407Brian Wellington max = this.get("max"),
0b062f4990db5cc6db2fe3398926f71b92a67407Brian Wellington entry = e.entry;
268a4475065fe6a8cd7cc707820982cf5e98f430Rob Austein
268a4475065fe6a8cd7cc707820982cf5e98f430Rob Austein // If the cache at or over capacity, make room by removing stalest element (index=0)
268a4475065fe6a8cd7cc707820982cf5e98f430Rob Austein while(entries.length>=max) {
268a4475065fe6a8cd7cc707820982cf5e98f430Rob Austein entries.shift();
268a4475065fe6a8cd7cc707820982cf5e98f430Rob Austein }
268a4475065fe6a8cd7cc707820982cf5e98f430Rob Austein
0b062f4990db5cc6db2fe3398926f71b92a67407Brian Wellington // Add entry to cache in the newest position, at the end of the array
0b062f4990db5cc6db2fe3398926f71b92a67407Brian Wellington entries[entries.length] = entry;
8b78c993cb475cc94e88560941b28c37684789d9Francis Dupont Y.log("Cached entry: " + Y.dump(entry), "info", "cache");
8b78c993cb475cc94e88560941b28c37684789d9Francis Dupont },
8b78c993cb475cc94e88560941b28c37684789d9Francis Dupont
8b78c993cb475cc94e88560941b28c37684789d9Francis Dupont /**
ba751492fcc4f161a18b983d4f018a1a52938cb9Evan Hunt * Flushes cache.
ba751492fcc4f161a18b983d4f018a1a52938cb9Evan Hunt *
ba751492fcc4f161a18b983d4f018a1a52938cb9Evan Hunt * @method _defFlushFn
ba751492fcc4f161a18b983d4f018a1a52938cb9Evan Hunt * @param e {Event.Facade} Event Facade object.
ba751492fcc4f161a18b983d4f018a1a52938cb9Evan Hunt * @protected
ba751492fcc4f161a18b983d4f018a1a52938cb9Evan Hunt */
ba751492fcc4f161a18b983d4f018a1a52938cb9Evan Hunt _defFlushFn: function(e) {
ba751492fcc4f161a18b983d4f018a1a52938cb9Evan Hunt this._entries = [];
ba751492fcc4f161a18b983d4f018a1a52938cb9Evan Hunt Y.log("Cache flushed", "info", "cache");
8b78c993cb475cc94e88560941b28c37684789d9Francis Dupont },
8b78c993cb475cc94e88560941b28c37684789d9Francis Dupont
8b78c993cb475cc94e88560941b28c37684789d9Francis Dupont /**
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 *
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
b0c15bd9792112fb47f6d956e580e4369e92f4e7Mark Andrews */
b843f577bbcd6660fbaa506d9e55b156c689a5a8Evan Hunt _isMatch: function(request, entry) {
b843f577bbcd6660fbaa506d9e55b156c689a5a8Evan Hunt return (request === entry.request);
b843f577bbcd6660fbaa506d9e55b156c689a5a8Evan Hunt },
b843f577bbcd6660fbaa506d9e55b156c689a5a8Evan Hunt
b843f577bbcd6660fbaa506d9e55b156c689a5a8Evan Hunt /////////////////////////////////////////////////////////////////////////////
b843f577bbcd6660fbaa506d9e55b156c689a5a8Evan Hunt //
b843f577bbcd6660fbaa506d9e55b156c689a5a8Evan Hunt // Cache public methods
b843f577bbcd6660fbaa506d9e55b156c689a5a8Evan Hunt //
b843f577bbcd6660fbaa506d9e55b156c689a5a8Evan Hunt /////////////////////////////////////////////////////////////////////////////
b843f577bbcd6660fbaa506d9e55b156c689a5a8Evan Hunt
0b062f4990db5cc6db2fe3398926f71b92a67407Brian Wellington /**
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 *
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.
268a4475065fe6a8cd7cc707820982cf5e98f430Rob Austein */
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 }
268a4475065fe6a8cd7cc707820982cf5e98f430Rob Austein else {
268a4475065fe6a8cd7cc707820982cf5e98f430Rob Austein Y.log("Could not add " + Y.dump(response) + " to cache for " + Y.dump(request), "info", "cache");
268a4475065fe6a8cd7cc707820982cf5e98f430Rob Austein }
268a4475065fe6a8cd7cc707820982cf5e98f430Rob Austein },
268a4475065fe6a8cd7cc707820982cf5e98f430Rob Austein
0b062f4990db5cc6db2fe3398926f71b92a67407Brian Wellington /**
0b062f4990db5cc6db2fe3398926f71b92a67407Brian Wellington * Flushes cache.
553ead32ff5b00284e574dcabc39115d4d74ec66Evan Hunt *
553ead32ff5b00284e574dcabc39115d4d74ec66Evan Hunt * @method flush
553ead32ff5b00284e574dcabc39115d4d74ec66Evan Hunt */
553ead32ff5b00284e574dcabc39115d4d74ec66Evan Hunt flush: function() {
553ead32ff5b00284e574dcabc39115d4d74ec66Evan Hunt this.fire("flush");
553ead32ff5b00284e574dcabc39115d4d74ec66Evan Hunt },
553ead32ff5b00284e574dcabc39115d4d74ec66Evan Hunt
553ead32ff5b00284e574dcabc39115d4d74ec66Evan Hunt /**
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.
cc3aafe737334d444781f8a34ffaf459e075bb9aMark Andrews *
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.
268a4475065fe6a8cd7cc707820982cf5e98f430Rob Austein */
268a4475065fe6a8cd7cc707820982cf5e98f430Rob Austein retrieve: function(request) {
cc3aafe737334d444781f8a34ffaf459e075bb9aMark Andrews // If cache is enabled...
cc3aafe737334d444781f8a34ffaf459e075bb9aMark Andrews var entries = this._entries,
61bcc232038f0a2cb77ed6269675fdc288f5ec98Evan Hunt length = entries.length,
61bcc232038f0a2cb77ed6269675fdc288f5ec98Evan Hunt entry = null,
61bcc232038f0a2cb77ed6269675fdc288f5ec98Evan Hunt i = length-1;
61bcc232038f0a2cb77ed6269675fdc288f5ec98Evan Hunt
61bcc232038f0a2cb77ed6269675fdc288f5ec98Evan Hunt if((this.get("max") > 0) && (length > 0)) {
61bcc232038f0a2cb77ed6269675fdc288f5ec98Evan Hunt this.fire("request", {request: request});
61bcc232038f0a2cb77ed6269675fdc288f5ec98Evan Hunt
61bcc232038f0a2cb77ed6269675fdc288f5ec98Evan Hunt // Loop through each cached entry starting from the newest
03f979494f5c80e05a72f876914d9d44085fbd6aEvan Hunt for(; i >= 0; i--) {
03f979494f5c80e05a72f876914d9d44085fbd6aEvan Hunt entry = entries[i];
03f979494f5c80e05a72f876914d9d44085fbd6aEvan Hunt
03f979494f5c80e05a72f876914d9d44085fbd6aEvan Hunt // Execute matching function
61bcc232038f0a2cb77ed6269675fdc288f5ec98Evan Hunt if(this._isMatch(request, entry)) {
61bcc232038f0a2cb77ed6269675fdc288f5ec98Evan Hunt this.fire("retrieve", {entry: entry});
61bcc232038f0a2cb77ed6269675fdc288f5ec98Evan Hunt
61bcc232038f0a2cb77ed6269675fdc288f5ec98Evan Hunt // Refresh the position of the cache hit
0b062f4990db5cc6db2fe3398926f71b92a67407Brian Wellington if(i < length-1) {
0b062f4990db5cc6db2fe3398926f71b92a67407Brian Wellington // Remove element from its original location
268a4475065fe6a8cd7cc707820982cf5e98f430Rob Austein entries.splice(i,1);
268a4475065fe6a8cd7cc707820982cf5e98f430Rob Austein // Add as newest
268a4475065fe6a8cd7cc707820982cf5e98f430Rob Austein entries[entries.length] = entry;
268a4475065fe6a8cd7cc707820982cf5e98f430Rob Austein Y.log("Refreshed cache entry: " + Y.dump(entry) +
268a4475065fe6a8cd7cc707820982cf5e98f430Rob Austein " for request: " + Y.dump(request), "info", "cache");
268a4475065fe6a8cd7cc707820982cf5e98f430Rob Austein }
268a4475065fe6a8cd7cc707820982cf5e98f430Rob Austein
268a4475065fe6a8cd7cc707820982cf5e98f430Rob Austein break;
0b062f4990db5cc6db2fe3398926f71b92a67407Brian Wellington }
0b062f4990db5cc6db2fe3398926f71b92a67407Brian Wellington }
c6d2578fd67bc1a427d13fd0699b25a187feec8aMark Andrews Y.log("Retrieved cached response: " + Y.dump(entry) +
c6d2578fd67bc1a427d13fd0699b25a187feec8aMark Andrews " for request: " + Y.dump(request), "info", "cache");
c6d2578fd67bc1a427d13fd0699b25a187feec8aMark Andrews return entry;
c6d2578fd67bc1a427d13fd0699b25a187feec8aMark Andrews
c6d2578fd67bc1a427d13fd0699b25a187feec8aMark Andrews }
c6d2578fd67bc1a427d13fd0699b25a187feec8aMark Andrews return null;
c6d2578fd67bc1a427d13fd0699b25a187feec8aMark Andrews }
c6d2578fd67bc1a427d13fd0699b25a187feec8aMark Andrews});
c6d2578fd67bc1a427d13fd0699b25a187feec8aMark Andrews
c6d2578fd67bc1a427d13fd0699b25a187feec8aMark AndrewsY.Cache = Cache;
c6d2578fd67bc1a427d13fd0699b25a187feec8aMark Andrews
c6d2578fd67bc1a427d13fd0699b25a187feec8aMark Andrews
c6d2578fd67bc1a427d13fd0699b25a187feec8aMark Andrews
c6d2578fd67bc1a427d13fd0699b25a187feec8aMark Andrews
c6d2578fd67bc1a427d13fd0699b25a187feec8aMark Andrews}, '@VERSION@' ,{requires:['plugin']});
c6d2578fd67bc1a427d13fd0699b25a187feec8aMark Andrews