76ca635d61eb3f9fb7c9d788a44fa8b1690aa138Dav GlassYUI.add('cache-base', function(Y) {
76ca635d61eb3f9fb7c9d788a44fa8b1690aa138Dav Glass
76ca635d61eb3f9fb7c9d788a44fa8b1690aa138Dav Glass/**
76ca635d61eb3f9fb7c9d788a44fa8b1690aa138Dav Glass * The Cache utility provides a common configurable interface for components to
76ca635d61eb3f9fb7c9d788a44fa8b1690aa138Dav Glass * cache and retrieve data from a local JavaScript struct.
76ca635d61eb3f9fb7c9d788a44fa8b1690aa138Dav Glass *
76ca635d61eb3f9fb7c9d788a44fa8b1690aa138Dav Glass * @module cache
ec052a9992ee87808cf659da150ad92c7162f43bEric Ferraiuolo * @main
ec052a9992ee87808cf659da150ad92c7162f43bEric Ferraiuolo */
ec052a9992ee87808cf659da150ad92c7162f43bEric Ferraiuolo
ec052a9992ee87808cf659da150ad92c7162f43bEric Ferraiuolo/**
ec052a9992ee87808cf659da150ad92c7162f43bEric Ferraiuolo * Provides the base class for the YUI Cache utility.
3e92a339399ff1eb34f9c0a03145d186c60b20c6Eric Ferraiuolo *
ec052a9992ee87808cf659da150ad92c7162f43bEric Ferraiuolo * @submodule cache-base
76ca635d61eb3f9fb7c9d788a44fa8b1690aa138Dav Glass */
76ca635d61eb3f9fb7c9d788a44fa8b1690aa138Dav Glassvar LANG = Y.Lang,
76ca635d61eb3f9fb7c9d788a44fa8b1690aa138Dav Glass isDate = Y.Lang.isDate,
76ca635d61eb3f9fb7c9d788a44fa8b1690aa138Dav Glass
76ca635d61eb3f9fb7c9d788a44fa8b1690aa138Dav Glass/**
76ca635d61eb3f9fb7c9d788a44fa8b1690aa138Dav Glass * Base class for the YUI Cache utility.
76ca635d61eb3f9fb7c9d788a44fa8b1690aa138Dav Glass * @class Cache
76ca635d61eb3f9fb7c9d788a44fa8b1690aa138Dav Glass * @extends Base
76ca635d61eb3f9fb7c9d788a44fa8b1690aa138Dav Glass * @constructor
76ca635d61eb3f9fb7c9d788a44fa8b1690aa138Dav Glass */
76ca635d61eb3f9fb7c9d788a44fa8b1690aa138Dav GlassCache = function() {
76ca635d61eb3f9fb7c9d788a44fa8b1690aa138Dav Glass Cache.superclass.constructor.apply(this, arguments);
76ca635d61eb3f9fb7c9d788a44fa8b1690aa138Dav Glass};
76ca635d61eb3f9fb7c9d788a44fa8b1690aa138Dav Glass
76ca635d61eb3f9fb7c9d788a44fa8b1690aa138Dav Glass /////////////////////////////////////////////////////////////////////////////
76ca635d61eb3f9fb7c9d788a44fa8b1690aa138Dav Glass //
76ca635d61eb3f9fb7c9d788a44fa8b1690aa138Dav Glass // Cache static properties
76ca635d61eb3f9fb7c9d788a44fa8b1690aa138Dav Glass //
76ca635d61eb3f9fb7c9d788a44fa8b1690aa138Dav Glass /////////////////////////////////////////////////////////////////////////////
76ca635d61eb3f9fb7c9d788a44fa8b1690aa138Dav GlassY.mix(Cache, {
76ca635d61eb3f9fb7c9d788a44fa8b1690aa138Dav Glass /**
76ca635d61eb3f9fb7c9d788a44fa8b1690aa138Dav Glass * Class name.
76ca635d61eb3f9fb7c9d788a44fa8b1690aa138Dav Glass *
76ca635d61eb3f9fb7c9d788a44fa8b1690aa138Dav Glass * @property NAME
76ca635d61eb3f9fb7c9d788a44fa8b1690aa138Dav Glass * @type String
76ca635d61eb3f9fb7c9d788a44fa8b1690aa138Dav Glass * @static
76ca635d61eb3f9fb7c9d788a44fa8b1690aa138Dav Glass * @final
76ca635d61eb3f9fb7c9d788a44fa8b1690aa138Dav Glass * @value "cache"
76ca635d61eb3f9fb7c9d788a44fa8b1690aa138Dav Glass */
76ca635d61eb3f9fb7c9d788a44fa8b1690aa138Dav Glass NAME: "cache",
76ca635d61eb3f9fb7c9d788a44fa8b1690aa138Dav Glass
76ca635d61eb3f9fb7c9d788a44fa8b1690aa138Dav Glass
76ca635d61eb3f9fb7c9d788a44fa8b1690aa138Dav Glass ATTRS: {
76ca635d61eb3f9fb7c9d788a44fa8b1690aa138Dav Glass /////////////////////////////////////////////////////////////////////////////
76ca635d61eb3f9fb7c9d788a44fa8b1690aa138Dav Glass //
76ca635d61eb3f9fb7c9d788a44fa8b1690aa138Dav Glass // Cache Attributes
76ca635d61eb3f9fb7c9d788a44fa8b1690aa138Dav Glass //
76ca635d61eb3f9fb7c9d788a44fa8b1690aa138Dav Glass /////////////////////////////////////////////////////////////////////////////
76ca635d61eb3f9fb7c9d788a44fa8b1690aa138Dav Glass
76ca635d61eb3f9fb7c9d788a44fa8b1690aa138Dav Glass /**
76ca635d61eb3f9fb7c9d788a44fa8b1690aa138Dav Glass * @attribute max
76ca635d61eb3f9fb7c9d788a44fa8b1690aa138Dav Glass * @description Maximum number of entries the Cache can hold.
76ca635d61eb3f9fb7c9d788a44fa8b1690aa138Dav Glass * Set to 0 to turn off caching.
76ca635d61eb3f9fb7c9d788a44fa8b1690aa138Dav Glass * @type Number
76ca635d61eb3f9fb7c9d788a44fa8b1690aa138Dav Glass * @default 0
76ca635d61eb3f9fb7c9d788a44fa8b1690aa138Dav Glass */
76ca635d61eb3f9fb7c9d788a44fa8b1690aa138Dav Glass max: {
76ca635d61eb3f9fb7c9d788a44fa8b1690aa138Dav Glass value: 0,
76ca635d61eb3f9fb7c9d788a44fa8b1690aa138Dav Glass setter: "_setMax"
76ca635d61eb3f9fb7c9d788a44fa8b1690aa138Dav Glass },
76ca635d61eb3f9fb7c9d788a44fa8b1690aa138Dav Glass
76ca635d61eb3f9fb7c9d788a44fa8b1690aa138Dav Glass /**
76ca635d61eb3f9fb7c9d788a44fa8b1690aa138Dav Glass * @attribute size
76ca635d61eb3f9fb7c9d788a44fa8b1690aa138Dav Glass * @description Number of entries currently cached.
76ca635d61eb3f9fb7c9d788a44fa8b1690aa138Dav Glass * @type Number
76ca635d61eb3f9fb7c9d788a44fa8b1690aa138Dav Glass */
76ca635d61eb3f9fb7c9d788a44fa8b1690aa138Dav Glass size: {
76ca635d61eb3f9fb7c9d788a44fa8b1690aa138Dav Glass readOnly: true,
76ca635d61eb3f9fb7c9d788a44fa8b1690aa138Dav Glass getter: "_getSize"
76ca635d61eb3f9fb7c9d788a44fa8b1690aa138Dav Glass },
76ca635d61eb3f9fb7c9d788a44fa8b1690aa138Dav Glass
76ca635d61eb3f9fb7c9d788a44fa8b1690aa138Dav Glass /**
76ca635d61eb3f9fb7c9d788a44fa8b1690aa138Dav Glass * @attribute uniqueKeys
76ca635d61eb3f9fb7c9d788a44fa8b1690aa138Dav Glass * @description Validate uniqueness of stored keys. Default is false and
76ca635d61eb3f9fb7c9d788a44fa8b1690aa138Dav Glass * is more performant.
76ca635d61eb3f9fb7c9d788a44fa8b1690aa138Dav Glass * @type Boolean
76ca635d61eb3f9fb7c9d788a44fa8b1690aa138Dav Glass */
76ca635d61eb3f9fb7c9d788a44fa8b1690aa138Dav Glass uniqueKeys: {
76ca635d61eb3f9fb7c9d788a44fa8b1690aa138Dav Glass value: false
76ca635d61eb3f9fb7c9d788a44fa8b1690aa138Dav Glass },
76ca635d61eb3f9fb7c9d788a44fa8b1690aa138Dav Glass
76ca635d61eb3f9fb7c9d788a44fa8b1690aa138Dav Glass /**
76ca635d61eb3f9fb7c9d788a44fa8b1690aa138Dav Glass * @attribute expires
76ca635d61eb3f9fb7c9d788a44fa8b1690aa138Dav Glass * @description Absolute Date when data expires or
76ca635d61eb3f9fb7c9d788a44fa8b1690aa138Dav Glass * relative number of milliseconds. Zero disables expiration.
76ca635d61eb3f9fb7c9d788a44fa8b1690aa138Dav Glass * @type Date | Number
76ca635d61eb3f9fb7c9d788a44fa8b1690aa138Dav Glass * @default 0
76ca635d61eb3f9fb7c9d788a44fa8b1690aa138Dav Glass */
76ca635d61eb3f9fb7c9d788a44fa8b1690aa138Dav Glass expires: {
76ca635d61eb3f9fb7c9d788a44fa8b1690aa138Dav Glass value: 0,
76ca635d61eb3f9fb7c9d788a44fa8b1690aa138Dav Glass validator: function(v) {
76ca635d61eb3f9fb7c9d788a44fa8b1690aa138Dav Glass return Y.Lang.isDate(v) || (Y.Lang.isNumber(v) && v >= 0);
76ca635d61eb3f9fb7c9d788a44fa8b1690aa138Dav Glass }
76ca635d61eb3f9fb7c9d788a44fa8b1690aa138Dav Glass },
76ca635d61eb3f9fb7c9d788a44fa8b1690aa138Dav Glass
76ca635d61eb3f9fb7c9d788a44fa8b1690aa138Dav Glass /**
76ca635d61eb3f9fb7c9d788a44fa8b1690aa138Dav Glass * @attribute entries
76ca635d61eb3f9fb7c9d788a44fa8b1690aa138Dav Glass * @description Cached entries.
76ca635d61eb3f9fb7c9d788a44fa8b1690aa138Dav Glass * @type Array
76ca635d61eb3f9fb7c9d788a44fa8b1690aa138Dav Glass */
76ca635d61eb3f9fb7c9d788a44fa8b1690aa138Dav Glass entries: {
76ca635d61eb3f9fb7c9d788a44fa8b1690aa138Dav Glass readOnly: true,
76ca635d61eb3f9fb7c9d788a44fa8b1690aa138Dav Glass getter: "_getEntries"
76ca635d61eb3f9fb7c9d788a44fa8b1690aa138Dav Glass }
76ca635d61eb3f9fb7c9d788a44fa8b1690aa138Dav Glass }
76ca635d61eb3f9fb7c9d788a44fa8b1690aa138Dav Glass});
76ca635d61eb3f9fb7c9d788a44fa8b1690aa138Dav Glass
76ca635d61eb3f9fb7c9d788a44fa8b1690aa138Dav GlassY.extend(Cache, Y.Base, {
76ca635d61eb3f9fb7c9d788a44fa8b1690aa138Dav Glass /////////////////////////////////////////////////////////////////////////////
76ca635d61eb3f9fb7c9d788a44fa8b1690aa138Dav Glass //
76ca635d61eb3f9fb7c9d788a44fa8b1690aa138Dav Glass // Cache private properties
76ca635d61eb3f9fb7c9d788a44fa8b1690aa138Dav Glass //
76ca635d61eb3f9fb7c9d788a44fa8b1690aa138Dav Glass /////////////////////////////////////////////////////////////////////////////
76ca635d61eb3f9fb7c9d788a44fa8b1690aa138Dav Glass
76ca635d61eb3f9fb7c9d788a44fa8b1690aa138Dav Glass /**
76ca635d61eb3f9fb7c9d788a44fa8b1690aa138Dav Glass * Array of request/response objects indexed chronologically.
76ca635d61eb3f9fb7c9d788a44fa8b1690aa138Dav Glass *
76ca635d61eb3f9fb7c9d788a44fa8b1690aa138Dav Glass * @property _entries
76ca635d61eb3f9fb7c9d788a44fa8b1690aa138Dav Glass * @type Object[]
76ca635d61eb3f9fb7c9d788a44fa8b1690aa138Dav Glass * @private
76ca635d61eb3f9fb7c9d788a44fa8b1690aa138Dav Glass */
76ca635d61eb3f9fb7c9d788a44fa8b1690aa138Dav Glass _entries: null,
76ca635d61eb3f9fb7c9d788a44fa8b1690aa138Dav Glass
76ca635d61eb3f9fb7c9d788a44fa8b1690aa138Dav Glass /////////////////////////////////////////////////////////////////////////////
76ca635d61eb3f9fb7c9d788a44fa8b1690aa138Dav Glass //
76ca635d61eb3f9fb7c9d788a44fa8b1690aa138Dav Glass // Cache private methods
76ca635d61eb3f9fb7c9d788a44fa8b1690aa138Dav Glass //
76ca635d61eb3f9fb7c9d788a44fa8b1690aa138Dav Glass /////////////////////////////////////////////////////////////////////////////
76ca635d61eb3f9fb7c9d788a44fa8b1690aa138Dav Glass
76ca635d61eb3f9fb7c9d788a44fa8b1690aa138Dav Glass /**
76ca635d61eb3f9fb7c9d788a44fa8b1690aa138Dav Glass * @method initializer
76ca635d61eb3f9fb7c9d788a44fa8b1690aa138Dav Glass * @description Internal init() handler.
76ca635d61eb3f9fb7c9d788a44fa8b1690aa138Dav Glass * @param config {Object} Config object.
76ca635d61eb3f9fb7c9d788a44fa8b1690aa138Dav Glass * @private
76ca635d61eb3f9fb7c9d788a44fa8b1690aa138Dav Glass */
76ca635d61eb3f9fb7c9d788a44fa8b1690aa138Dav Glass initializer: function(config) {
76ca635d61eb3f9fb7c9d788a44fa8b1690aa138Dav Glass
76ca635d61eb3f9fb7c9d788a44fa8b1690aa138Dav Glass /**
76ca635d61eb3f9fb7c9d788a44fa8b1690aa138Dav Glass * @event add
76ca635d61eb3f9fb7c9d788a44fa8b1690aa138Dav Glass * @description Fired when an entry is added.
76ca635d61eb3f9fb7c9d788a44fa8b1690aa138Dav Glass * @param e {Event.Facade} Event Facade with the following properties:
76ca635d61eb3f9fb7c9d788a44fa8b1690aa138Dav Glass * <dl>
76ca635d61eb3f9fb7c9d788a44fa8b1690aa138Dav Glass * <dt>entry (Object)</dt> <dd>The cached entry.</dd>
76ca635d61eb3f9fb7c9d788a44fa8b1690aa138Dav Glass * </dl>
76ca635d61eb3f9fb7c9d788a44fa8b1690aa138Dav Glass * @preventable _defAddFn
76ca635d61eb3f9fb7c9d788a44fa8b1690aa138Dav Glass */
76ca635d61eb3f9fb7c9d788a44fa8b1690aa138Dav Glass this.publish("add", {defaultFn: this._defAddFn});
76ca635d61eb3f9fb7c9d788a44fa8b1690aa138Dav Glass
76ca635d61eb3f9fb7c9d788a44fa8b1690aa138Dav Glass /**
76ca635d61eb3f9fb7c9d788a44fa8b1690aa138Dav Glass * @event flush
76ca635d61eb3f9fb7c9d788a44fa8b1690aa138Dav Glass * @description Fired when the cache is flushed.
76ca635d61eb3f9fb7c9d788a44fa8b1690aa138Dav Glass * @param e {Event.Facade} Event Facade object.
76ca635d61eb3f9fb7c9d788a44fa8b1690aa138Dav Glass * @preventable _defFlushFn
76ca635d61eb3f9fb7c9d788a44fa8b1690aa138Dav Glass */
76ca635d61eb3f9fb7c9d788a44fa8b1690aa138Dav Glass this.publish("flush", {defaultFn: this._defFlushFn});
76ca635d61eb3f9fb7c9d788a44fa8b1690aa138Dav Glass
76ca635d61eb3f9fb7c9d788a44fa8b1690aa138Dav Glass /**
76ca635d61eb3f9fb7c9d788a44fa8b1690aa138Dav Glass * @event request
76ca635d61eb3f9fb7c9d788a44fa8b1690aa138Dav Glass * @description Fired when an entry is requested from the cache.
76ca635d61eb3f9fb7c9d788a44fa8b1690aa138Dav Glass * @param e {Event.Facade} Event Facade with the following properties:
76ca635d61eb3f9fb7c9d788a44fa8b1690aa138Dav Glass * <dl>
76ca635d61eb3f9fb7c9d788a44fa8b1690aa138Dav Glass * <dt>request (Object)</dt> <dd>The request object.</dd>
76ca635d61eb3f9fb7c9d788a44fa8b1690aa138Dav Glass * </dl>
76ca635d61eb3f9fb7c9d788a44fa8b1690aa138Dav Glass */
76ca635d61eb3f9fb7c9d788a44fa8b1690aa138Dav Glass
76ca635d61eb3f9fb7c9d788a44fa8b1690aa138Dav Glass /**
76ca635d61eb3f9fb7c9d788a44fa8b1690aa138Dav Glass * @event retrieve
76ca635d61eb3f9fb7c9d788a44fa8b1690aa138Dav Glass * @description Fired when an entry is retrieved from the cache.
76ca635d61eb3f9fb7c9d788a44fa8b1690aa138Dav Glass * @param e {Event.Facade} Event Facade with the following properties:
76ca635d61eb3f9fb7c9d788a44fa8b1690aa138Dav Glass * <dl>
76ca635d61eb3f9fb7c9d788a44fa8b1690aa138Dav Glass * <dt>entry (Object)</dt> <dd>The retrieved entry.</dd>
76ca635d61eb3f9fb7c9d788a44fa8b1690aa138Dav Glass * </dl>
76ca635d61eb3f9fb7c9d788a44fa8b1690aa138Dav Glass */
76ca635d61eb3f9fb7c9d788a44fa8b1690aa138Dav Glass
76ca635d61eb3f9fb7c9d788a44fa8b1690aa138Dav Glass // Initialize internal values
76ca635d61eb3f9fb7c9d788a44fa8b1690aa138Dav Glass this._entries = [];
76ca635d61eb3f9fb7c9d788a44fa8b1690aa138Dav Glass Y.log("Cache initialized", "info", "cache");
76ca635d61eb3f9fb7c9d788a44fa8b1690aa138Dav Glass },
76ca635d61eb3f9fb7c9d788a44fa8b1690aa138Dav Glass
76ca635d61eb3f9fb7c9d788a44fa8b1690aa138Dav Glass /**
76ca635d61eb3f9fb7c9d788a44fa8b1690aa138Dav Glass * @method destructor
76ca635d61eb3f9fb7c9d788a44fa8b1690aa138Dav Glass * @description Internal destroy() handler.
76ca635d61eb3f9fb7c9d788a44fa8b1690aa138Dav Glass * @private
76ca635d61eb3f9fb7c9d788a44fa8b1690aa138Dav Glass */
76ca635d61eb3f9fb7c9d788a44fa8b1690aa138Dav Glass destructor: function() {
76ca635d61eb3f9fb7c9d788a44fa8b1690aa138Dav Glass this._entries = [];
76ca635d61eb3f9fb7c9d788a44fa8b1690aa138Dav Glass Y.log("Cache destroyed", "info", "cache");
76ca635d61eb3f9fb7c9d788a44fa8b1690aa138Dav Glass },
76ca635d61eb3f9fb7c9d788a44fa8b1690aa138Dav Glass
76ca635d61eb3f9fb7c9d788a44fa8b1690aa138Dav Glass /////////////////////////////////////////////////////////////////////////////
76ca635d61eb3f9fb7c9d788a44fa8b1690aa138Dav Glass //
76ca635d61eb3f9fb7c9d788a44fa8b1690aa138Dav Glass // Cache protected methods
76ca635d61eb3f9fb7c9d788a44fa8b1690aa138Dav Glass //
76ca635d61eb3f9fb7c9d788a44fa8b1690aa138Dav Glass /////////////////////////////////////////////////////////////////////////////
76ca635d61eb3f9fb7c9d788a44fa8b1690aa138Dav Glass
76ca635d61eb3f9fb7c9d788a44fa8b1690aa138Dav Glass /**
76ca635d61eb3f9fb7c9d788a44fa8b1690aa138Dav Glass * Sets max.
76ca635d61eb3f9fb7c9d788a44fa8b1690aa138Dav Glass *
76ca635d61eb3f9fb7c9d788a44fa8b1690aa138Dav Glass * @method _setMax
76ca635d61eb3f9fb7c9d788a44fa8b1690aa138Dav Glass * @protected
76ca635d61eb3f9fb7c9d788a44fa8b1690aa138Dav Glass */
76ca635d61eb3f9fb7c9d788a44fa8b1690aa138Dav Glass _setMax: function(value) {
76ca635d61eb3f9fb7c9d788a44fa8b1690aa138Dav Glass // If the cache is full, make room by removing stalest element (index=0)
76ca635d61eb3f9fb7c9d788a44fa8b1690aa138Dav Glass var entries = this._entries;
76ca635d61eb3f9fb7c9d788a44fa8b1690aa138Dav Glass if(value > 0) {
76ca635d61eb3f9fb7c9d788a44fa8b1690aa138Dav Glass if(entries) {
76ca635d61eb3f9fb7c9d788a44fa8b1690aa138Dav Glass while(entries.length > value) {
76ca635d61eb3f9fb7c9d788a44fa8b1690aa138Dav Glass entries.shift();
76ca635d61eb3f9fb7c9d788a44fa8b1690aa138Dav Glass }
76ca635d61eb3f9fb7c9d788a44fa8b1690aa138Dav Glass }
76ca635d61eb3f9fb7c9d788a44fa8b1690aa138Dav Glass }
76ca635d61eb3f9fb7c9d788a44fa8b1690aa138Dav Glass else {
76ca635d61eb3f9fb7c9d788a44fa8b1690aa138Dav Glass value = 0;
76ca635d61eb3f9fb7c9d788a44fa8b1690aa138Dav Glass this._entries = [];
76ca635d61eb3f9fb7c9d788a44fa8b1690aa138Dav Glass }
76ca635d61eb3f9fb7c9d788a44fa8b1690aa138Dav Glass return value;
76ca635d61eb3f9fb7c9d788a44fa8b1690aa138Dav Glass },
76ca635d61eb3f9fb7c9d788a44fa8b1690aa138Dav Glass
76ca635d61eb3f9fb7c9d788a44fa8b1690aa138Dav Glass /**
76ca635d61eb3f9fb7c9d788a44fa8b1690aa138Dav Glass * Gets size.
76ca635d61eb3f9fb7c9d788a44fa8b1690aa138Dav Glass *
76ca635d61eb3f9fb7c9d788a44fa8b1690aa138Dav Glass * @method _getSize
76ca635d61eb3f9fb7c9d788a44fa8b1690aa138Dav Glass * @protected
76ca635d61eb3f9fb7c9d788a44fa8b1690aa138Dav Glass */
76ca635d61eb3f9fb7c9d788a44fa8b1690aa138Dav Glass _getSize: function() {
76ca635d61eb3f9fb7c9d788a44fa8b1690aa138Dav Glass return this._entries.length;
76ca635d61eb3f9fb7c9d788a44fa8b1690aa138Dav Glass },
76ca635d61eb3f9fb7c9d788a44fa8b1690aa138Dav Glass
76ca635d61eb3f9fb7c9d788a44fa8b1690aa138Dav Glass /**
76ca635d61eb3f9fb7c9d788a44fa8b1690aa138Dav Glass * Gets all entries.
76ca635d61eb3f9fb7c9d788a44fa8b1690aa138Dav Glass *
76ca635d61eb3f9fb7c9d788a44fa8b1690aa138Dav Glass * @method _getEntries
76ca635d61eb3f9fb7c9d788a44fa8b1690aa138Dav Glass * @protected
76ca635d61eb3f9fb7c9d788a44fa8b1690aa138Dav Glass */
76ca635d61eb3f9fb7c9d788a44fa8b1690aa138Dav Glass _getEntries: function() {
76ca635d61eb3f9fb7c9d788a44fa8b1690aa138Dav Glass return this._entries;
76ca635d61eb3f9fb7c9d788a44fa8b1690aa138Dav Glass },
76ca635d61eb3f9fb7c9d788a44fa8b1690aa138Dav Glass
76ca635d61eb3f9fb7c9d788a44fa8b1690aa138Dav Glass
76ca635d61eb3f9fb7c9d788a44fa8b1690aa138Dav Glass /**
76ca635d61eb3f9fb7c9d788a44fa8b1690aa138Dav Glass * Adds entry to cache.
76ca635d61eb3f9fb7c9d788a44fa8b1690aa138Dav Glass *
76ca635d61eb3f9fb7c9d788a44fa8b1690aa138Dav Glass * @method _defAddFn
76ca635d61eb3f9fb7c9d788a44fa8b1690aa138Dav Glass * @param e {Event.Facade} Event Facade with the following properties:
76ca635d61eb3f9fb7c9d788a44fa8b1690aa138Dav Glass * <dl>
76ca635d61eb3f9fb7c9d788a44fa8b1690aa138Dav Glass * <dt>entry (Object)</dt> <dd>The cached entry.</dd>
76ca635d61eb3f9fb7c9d788a44fa8b1690aa138Dav Glass * </dl>
76ca635d61eb3f9fb7c9d788a44fa8b1690aa138Dav Glass * @protected
76ca635d61eb3f9fb7c9d788a44fa8b1690aa138Dav Glass */
76ca635d61eb3f9fb7c9d788a44fa8b1690aa138Dav Glass _defAddFn: function(e) {
76ca635d61eb3f9fb7c9d788a44fa8b1690aa138Dav Glass var entries = this._entries,
3e92a339399ff1eb34f9c0a03145d186c60b20c6Eric Ferraiuolo entry = e.entry,
3e92a339399ff1eb34f9c0a03145d186c60b20c6Eric Ferraiuolo max = this.get("max"),
3e92a339399ff1eb34f9c0a03145d186c60b20c6Eric Ferraiuolo pos;
76ca635d61eb3f9fb7c9d788a44fa8b1690aa138Dav Glass
3e92a339399ff1eb34f9c0a03145d186c60b20c6Eric Ferraiuolo // If uniqueKeys is true and item exists with this key, then remove it.
3e92a339399ff1eb34f9c0a03145d186c60b20c6Eric Ferraiuolo if (this.get("uniqueKeys")) {
3e92a339399ff1eb34f9c0a03145d186c60b20c6Eric Ferraiuolo pos = this._position(e.entry.request);
3e92a339399ff1eb34f9c0a03145d186c60b20c6Eric Ferraiuolo if (LANG.isValue(pos)) {
3e92a339399ff1eb34f9c0a03145d186c60b20c6Eric Ferraiuolo entries.splice(pos, 1);
3e92a339399ff1eb34f9c0a03145d186c60b20c6Eric Ferraiuolo }
76ca635d61eb3f9fb7c9d788a44fa8b1690aa138Dav Glass }
76ca635d61eb3f9fb7c9d788a44fa8b1690aa138Dav Glass
3e92a339399ff1eb34f9c0a03145d186c60b20c6Eric Ferraiuolo // If the cache at or over capacity, make room by removing stalest
3e92a339399ff1eb34f9c0a03145d186c60b20c6Eric Ferraiuolo // element(s) starting at index-0.
3e92a339399ff1eb34f9c0a03145d186c60b20c6Eric Ferraiuolo while (max && entries.length >= max) {
76ca635d61eb3f9fb7c9d788a44fa8b1690aa138Dav Glass entries.shift();
76ca635d61eb3f9fb7c9d788a44fa8b1690aa138Dav Glass }
76ca635d61eb3f9fb7c9d788a44fa8b1690aa138Dav Glass
76ca635d61eb3f9fb7c9d788a44fa8b1690aa138Dav Glass // Add entry to cache in the newest position, at the end of the array
76ca635d61eb3f9fb7c9d788a44fa8b1690aa138Dav Glass entries[entries.length] = entry;
76ca635d61eb3f9fb7c9d788a44fa8b1690aa138Dav Glass Y.log("Cached entry: " + Y.dump(entry), "info", "cache");
76ca635d61eb3f9fb7c9d788a44fa8b1690aa138Dav Glass },
76ca635d61eb3f9fb7c9d788a44fa8b1690aa138Dav Glass
76ca635d61eb3f9fb7c9d788a44fa8b1690aa138Dav Glass /**
76ca635d61eb3f9fb7c9d788a44fa8b1690aa138Dav Glass * Flushes cache.
76ca635d61eb3f9fb7c9d788a44fa8b1690aa138Dav Glass *
76ca635d61eb3f9fb7c9d788a44fa8b1690aa138Dav Glass * @method _defFlushFn
76ca635d61eb3f9fb7c9d788a44fa8b1690aa138Dav Glass * @param e {Event.Facade} Event Facade object.
76ca635d61eb3f9fb7c9d788a44fa8b1690aa138Dav Glass * @protected
76ca635d61eb3f9fb7c9d788a44fa8b1690aa138Dav Glass */
76ca635d61eb3f9fb7c9d788a44fa8b1690aa138Dav Glass _defFlushFn: function(e) {
d49f394f1b80e68357a4896ef90df98cbd63e909Luke Smith var entries = this._entries,
d49f394f1b80e68357a4896ef90df98cbd63e909Luke Smith details = e.details[0],
d49f394f1b80e68357a4896ef90df98cbd63e909Luke Smith pos;
3e92a339399ff1eb34f9c0a03145d186c60b20c6Eric Ferraiuolo
d49f394f1b80e68357a4896ef90df98cbd63e909Luke Smith //passed an item, flush only that
d49f394f1b80e68357a4896ef90df98cbd63e909Luke Smith if(details && LANG.isValue(details.request)) {
d49f394f1b80e68357a4896ef90df98cbd63e909Luke Smith pos = this._position(details.request);
3e92a339399ff1eb34f9c0a03145d186c60b20c6Eric Ferraiuolo
d49f394f1b80e68357a4896ef90df98cbd63e909Luke Smith if(LANG.isValue(pos)) {
d49f394f1b80e68357a4896ef90df98cbd63e909Luke Smith entries.splice(pos,1);
3e92a339399ff1eb34f9c0a03145d186c60b20c6Eric Ferraiuolo
d49f394f1b80e68357a4896ef90df98cbd63e909Luke Smith Y.log("Flushed cache item " + Y.dump(details.request), "info", "cache");
d49f394f1b80e68357a4896ef90df98cbd63e909Luke Smith }
3e92a339399ff1eb34f9c0a03145d186c60b20c6Eric Ferraiuolo }
d49f394f1b80e68357a4896ef90df98cbd63e909Luke Smith //no item, flush everything
d49f394f1b80e68357a4896ef90df98cbd63e909Luke Smith else {
d49f394f1b80e68357a4896ef90df98cbd63e909Luke Smith this._entries = [];
d49f394f1b80e68357a4896ef90df98cbd63e909Luke Smith Y.log("Cache flushed", "info", "cache");
d49f394f1b80e68357a4896ef90df98cbd63e909Luke Smith }
76ca635d61eb3f9fb7c9d788a44fa8b1690aa138Dav Glass },
76ca635d61eb3f9fb7c9d788a44fa8b1690aa138Dav Glass
76ca635d61eb3f9fb7c9d788a44fa8b1690aa138Dav Glass /**
76ca635d61eb3f9fb7c9d788a44fa8b1690aa138Dav Glass * Default overridable method compares current request with given cache entry.
76ca635d61eb3f9fb7c9d788a44fa8b1690aa138Dav Glass * Returns true if current request matches the cached request, otherwise
76ca635d61eb3f9fb7c9d788a44fa8b1690aa138Dav Glass * false. Implementers should override this method to customize the
76ca635d61eb3f9fb7c9d788a44fa8b1690aa138Dav Glass * cache-matching algorithm.
76ca635d61eb3f9fb7c9d788a44fa8b1690aa138Dav Glass *
76ca635d61eb3f9fb7c9d788a44fa8b1690aa138Dav Glass * @method _isMatch
76ca635d61eb3f9fb7c9d788a44fa8b1690aa138Dav Glass * @param request {Object} Request object.
76ca635d61eb3f9fb7c9d788a44fa8b1690aa138Dav Glass * @param entry {Object} Cached entry.
76ca635d61eb3f9fb7c9d788a44fa8b1690aa138Dav Glass * @return {Boolean} True if current request matches given cached request, false otherwise.
76ca635d61eb3f9fb7c9d788a44fa8b1690aa138Dav Glass * @protected
76ca635d61eb3f9fb7c9d788a44fa8b1690aa138Dav Glass */
76ca635d61eb3f9fb7c9d788a44fa8b1690aa138Dav Glass _isMatch: function(request, entry) {
76ca635d61eb3f9fb7c9d788a44fa8b1690aa138Dav Glass if(!entry.expires || new Date() < entry.expires) {
76ca635d61eb3f9fb7c9d788a44fa8b1690aa138Dav Glass return (request === entry.request);
76ca635d61eb3f9fb7c9d788a44fa8b1690aa138Dav Glass }
76ca635d61eb3f9fb7c9d788a44fa8b1690aa138Dav Glass return false;
76ca635d61eb3f9fb7c9d788a44fa8b1690aa138Dav Glass },
3e92a339399ff1eb34f9c0a03145d186c60b20c6Eric Ferraiuolo
d49f394f1b80e68357a4896ef90df98cbd63e909Luke Smith /**
d49f394f1b80e68357a4896ef90df98cbd63e909Luke Smith * Returns position of a request in the entries array, otherwise null.
d49f394f1b80e68357a4896ef90df98cbd63e909Luke Smith *
d49f394f1b80e68357a4896ef90df98cbd63e909Luke Smith * @method _position
d49f394f1b80e68357a4896ef90df98cbd63e909Luke Smith * @param request {Object} Request object.
d49f394f1b80e68357a4896ef90df98cbd63e909Luke Smith * @return {Number} Array position if found, null otherwise.
d49f394f1b80e68357a4896ef90df98cbd63e909Luke Smith * @protected
d49f394f1b80e68357a4896ef90df98cbd63e909Luke Smith */
d49f394f1b80e68357a4896ef90df98cbd63e909Luke Smith _position: function(request) {
d49f394f1b80e68357a4896ef90df98cbd63e909Luke Smith // If cache is enabled...
d49f394f1b80e68357a4896ef90df98cbd63e909Luke Smith var entries = this._entries,
d49f394f1b80e68357a4896ef90df98cbd63e909Luke Smith length = entries.length,
d49f394f1b80e68357a4896ef90df98cbd63e909Luke Smith i = length-1;
3e92a339399ff1eb34f9c0a03145d186c60b20c6Eric Ferraiuolo
d49f394f1b80e68357a4896ef90df98cbd63e909Luke Smith if((this.get("max") === null) || this.get("max") > 0) {
d49f394f1b80e68357a4896ef90df98cbd63e909Luke Smith // Loop through each cached entry starting from the newest
d49f394f1b80e68357a4896ef90df98cbd63e909Luke Smith for(; i >= 0; i--) {
d49f394f1b80e68357a4896ef90df98cbd63e909Luke Smith // Execute matching function
d49f394f1b80e68357a4896ef90df98cbd63e909Luke Smith if(this._isMatch(request, entries[i])) {
d49f394f1b80e68357a4896ef90df98cbd63e909Luke Smith return i;
d49f394f1b80e68357a4896ef90df98cbd63e909Luke Smith }
d49f394f1b80e68357a4896ef90df98cbd63e909Luke Smith }
d49f394f1b80e68357a4896ef90df98cbd63e909Luke Smith }
3e92a339399ff1eb34f9c0a03145d186c60b20c6Eric Ferraiuolo
d49f394f1b80e68357a4896ef90df98cbd63e909Luke Smith return null;
d49f394f1b80e68357a4896ef90df98cbd63e909Luke Smith },
76ca635d61eb3f9fb7c9d788a44fa8b1690aa138Dav Glass
76ca635d61eb3f9fb7c9d788a44fa8b1690aa138Dav Glass /////////////////////////////////////////////////////////////////////////////
76ca635d61eb3f9fb7c9d788a44fa8b1690aa138Dav Glass //
76ca635d61eb3f9fb7c9d788a44fa8b1690aa138Dav Glass // Cache public methods
76ca635d61eb3f9fb7c9d788a44fa8b1690aa138Dav Glass //
76ca635d61eb3f9fb7c9d788a44fa8b1690aa138Dav Glass /////////////////////////////////////////////////////////////////////////////
76ca635d61eb3f9fb7c9d788a44fa8b1690aa138Dav Glass
76ca635d61eb3f9fb7c9d788a44fa8b1690aa138Dav Glass /**
76ca635d61eb3f9fb7c9d788a44fa8b1690aa138Dav Glass * Adds a new entry to the cache of the format
76ca635d61eb3f9fb7c9d788a44fa8b1690aa138Dav Glass * {request:request, response:response, cached:cached, expires:expires}.
76ca635d61eb3f9fb7c9d788a44fa8b1690aa138Dav Glass * If cache is full, evicts the stalest entry before adding the new one.
76ca635d61eb3f9fb7c9d788a44fa8b1690aa138Dav Glass *
76ca635d61eb3f9fb7c9d788a44fa8b1690aa138Dav Glass * @method add
76ca635d61eb3f9fb7c9d788a44fa8b1690aa138Dav Glass * @param request {Object} Request value.
76ca635d61eb3f9fb7c9d788a44fa8b1690aa138Dav Glass * @param response {Object} Response value.
76ca635d61eb3f9fb7c9d788a44fa8b1690aa138Dav Glass */
76ca635d61eb3f9fb7c9d788a44fa8b1690aa138Dav Glass add: function(request, response) {
76ca635d61eb3f9fb7c9d788a44fa8b1690aa138Dav Glass var expires = this.get("expires");
76ca635d61eb3f9fb7c9d788a44fa8b1690aa138Dav Glass if(this.get("initialized") && ((this.get("max") === null) || this.get("max") > 0) &&
76ca635d61eb3f9fb7c9d788a44fa8b1690aa138Dav Glass (LANG.isValue(request) || LANG.isNull(request) || LANG.isUndefined(request))) {
76ca635d61eb3f9fb7c9d788a44fa8b1690aa138Dav Glass this.fire("add", {entry: {
76ca635d61eb3f9fb7c9d788a44fa8b1690aa138Dav Glass request:request,
76ca635d61eb3f9fb7c9d788a44fa8b1690aa138Dav Glass response:response,
76ca635d61eb3f9fb7c9d788a44fa8b1690aa138Dav Glass cached: new Date(),
76ca635d61eb3f9fb7c9d788a44fa8b1690aa138Dav Glass expires: isDate(expires) ? expires :
76ca635d61eb3f9fb7c9d788a44fa8b1690aa138Dav Glass (expires ? new Date(new Date().getTime() + this.get("expires")) : null)
76ca635d61eb3f9fb7c9d788a44fa8b1690aa138Dav Glass }});
76ca635d61eb3f9fb7c9d788a44fa8b1690aa138Dav Glass }
76ca635d61eb3f9fb7c9d788a44fa8b1690aa138Dav Glass else {
76ca635d61eb3f9fb7c9d788a44fa8b1690aa138Dav Glass Y.log("Could not add " + Y.dump(response) + " to cache for " + Y.dump(request), "info", "cache");
76ca635d61eb3f9fb7c9d788a44fa8b1690aa138Dav Glass }
76ca635d61eb3f9fb7c9d788a44fa8b1690aa138Dav Glass },
76ca635d61eb3f9fb7c9d788a44fa8b1690aa138Dav Glass
76ca635d61eb3f9fb7c9d788a44fa8b1690aa138Dav Glass /**
76ca635d61eb3f9fb7c9d788a44fa8b1690aa138Dav Glass * Flushes cache.
76ca635d61eb3f9fb7c9d788a44fa8b1690aa138Dav Glass *
76ca635d61eb3f9fb7c9d788a44fa8b1690aa138Dav Glass * @method flush
76ca635d61eb3f9fb7c9d788a44fa8b1690aa138Dav Glass */
d49f394f1b80e68357a4896ef90df98cbd63e909Luke Smith flush: function(request) {
d49f394f1b80e68357a4896ef90df98cbd63e909Luke Smith this.fire("flush", { request: (LANG.isValue(request) ? request : null) });
76ca635d61eb3f9fb7c9d788a44fa8b1690aa138Dav Glass },
3e92a339399ff1eb34f9c0a03145d186c60b20c6Eric Ferraiuolo
76ca635d61eb3f9fb7c9d788a44fa8b1690aa138Dav Glass /**
76ca635d61eb3f9fb7c9d788a44fa8b1690aa138Dav Glass * Retrieves cached object for given request, if available, and refreshes
76ca635d61eb3f9fb7c9d788a44fa8b1690aa138Dav Glass * entry in the cache. Returns null if there is no cache match.
76ca635d61eb3f9fb7c9d788a44fa8b1690aa138Dav Glass *
76ca635d61eb3f9fb7c9d788a44fa8b1690aa138Dav Glass * @method retrieve
76ca635d61eb3f9fb7c9d788a44fa8b1690aa138Dav Glass * @param request {Object} Request object.
76ca635d61eb3f9fb7c9d788a44fa8b1690aa138Dav Glass * @return {Object} Cached object with the properties request and response, or null.
76ca635d61eb3f9fb7c9d788a44fa8b1690aa138Dav Glass */
76ca635d61eb3f9fb7c9d788a44fa8b1690aa138Dav Glass retrieve: function(request) {
76ca635d61eb3f9fb7c9d788a44fa8b1690aa138Dav Glass // If cache is enabled...
76ca635d61eb3f9fb7c9d788a44fa8b1690aa138Dav Glass var entries = this._entries,
76ca635d61eb3f9fb7c9d788a44fa8b1690aa138Dav Glass length = entries.length,
76ca635d61eb3f9fb7c9d788a44fa8b1690aa138Dav Glass entry = null,
d49f394f1b80e68357a4896ef90df98cbd63e909Luke Smith pos;
76ca635d61eb3f9fb7c9d788a44fa8b1690aa138Dav Glass
76ca635d61eb3f9fb7c9d788a44fa8b1690aa138Dav Glass if((length > 0) && ((this.get("max") === null) || (this.get("max") > 0))) {
76ca635d61eb3f9fb7c9d788a44fa8b1690aa138Dav Glass this.fire("request", {request: request});
3e92a339399ff1eb34f9c0a03145d186c60b20c6Eric Ferraiuolo
d49f394f1b80e68357a4896ef90df98cbd63e909Luke Smith pos = this._position(request);
3e92a339399ff1eb34f9c0a03145d186c60b20c6Eric Ferraiuolo
d49f394f1b80e68357a4896ef90df98cbd63e909Luke Smith if(LANG.isValue(pos)) {
d49f394f1b80e68357a4896ef90df98cbd63e909Luke Smith entry = entries[pos];
3e92a339399ff1eb34f9c0a03145d186c60b20c6Eric Ferraiuolo
d49f394f1b80e68357a4896ef90df98cbd63e909Luke Smith this.fire("retrieve", {entry: entry});
d49f394f1b80e68357a4896ef90df98cbd63e909Luke Smith
d49f394f1b80e68357a4896ef90df98cbd63e909Luke Smith // Refresh the position of the cache hit
d49f394f1b80e68357a4896ef90df98cbd63e909Luke Smith if(pos < length-1) {
d49f394f1b80e68357a4896ef90df98cbd63e909Luke Smith // Remove element from its original location
d49f394f1b80e68357a4896ef90df98cbd63e909Luke Smith entries.splice(pos,1);
d49f394f1b80e68357a4896ef90df98cbd63e909Luke Smith // Add as newest
d49f394f1b80e68357a4896ef90df98cbd63e909Luke Smith entries[entries.length] = entry;
d49f394f1b80e68357a4896ef90df98cbd63e909Luke Smith Y.log("Refreshed cache entry: " + Y.dump(entry) +
d49f394f1b80e68357a4896ef90df98cbd63e909Luke Smith " for request: " + Y.dump(request), "info", "cache");
76ca635d61eb3f9fb7c9d788a44fa8b1690aa138Dav Glass }
d49f394f1b80e68357a4896ef90df98cbd63e909Luke Smith
d49f394f1b80e68357a4896ef90df98cbd63e909Luke Smith Y.log("Retrieved cached response: " + Y.dump(entry) +
d49f394f1b80e68357a4896ef90df98cbd63e909Luke Smith " for request: " + Y.dump(request), "info", "cache");
d49f394f1b80e68357a4896ef90df98cbd63e909Luke Smith return entry;
76ca635d61eb3f9fb7c9d788a44fa8b1690aa138Dav Glass }
76ca635d61eb3f9fb7c9d788a44fa8b1690aa138Dav Glass }
76ca635d61eb3f9fb7c9d788a44fa8b1690aa138Dav Glass return null;
76ca635d61eb3f9fb7c9d788a44fa8b1690aa138Dav Glass }
76ca635d61eb3f9fb7c9d788a44fa8b1690aa138Dav Glass});
76ca635d61eb3f9fb7c9d788a44fa8b1690aa138Dav Glass
76ca635d61eb3f9fb7c9d788a44fa8b1690aa138Dav GlassY.Cache = Cache;
76ca635d61eb3f9fb7c9d788a44fa8b1690aa138Dav Glass
76ca635d61eb3f9fb7c9d788a44fa8b1690aa138Dav Glass
76ca635d61eb3f9fb7c9d788a44fa8b1690aa138Dav Glass}, '@VERSION@' ,{requires:['base']});