src/cm/media/js/lib/yui/yui3-3.15.0/build/cache-base/cache-base-debug.js
author gibus
Mon, 10 Mar 2014 15:19:48 +0100
changeset 602 e16a97fb364a
permissions -rw-r--r--
Use YUI 3.15
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
602
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
     1
YUI.add('cache-base', function (Y, NAME) {
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
     2
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
     3
/**
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
     4
 * The Cache utility provides a common configurable interface for components to
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
     5
 * cache and retrieve data from a local JavaScript struct.
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
     6
 *
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
     7
 * @module cache
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
     8
 * @main
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
     9
 */
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
    10
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
    11
/**
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
    12
 * Provides the base class for the YUI Cache utility.
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
    13
 *
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
    14
 * @submodule cache-base
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
    15
 */
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
    16
var LANG = Y.Lang,
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
    17
    isDate = Y.Lang.isDate,
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
    18
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
    19
/**
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
    20
 * Base class for the YUI Cache utility.
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
    21
 * @class Cache
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
    22
 * @extends Base
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
    23
 * @constructor
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
    24
 */
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
    25
Cache = function() {
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
    26
    Cache.superclass.constructor.apply(this, arguments);
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
    27
};
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
    28
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
    29
    /////////////////////////////////////////////////////////////////////////////
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
    30
    //
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
    31
    // Cache static properties
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
    32
    //
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
    33
    /////////////////////////////////////////////////////////////////////////////
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
    34
Y.mix(Cache, {
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
    35
    /**
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
    36
     * Class name.
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
    37
     *
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
    38
     * @property NAME
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
    39
     * @type String
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
    40
     * @static
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
    41
     * @final
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
    42
     * @value "cache"
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
    43
     */
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
    44
    NAME: "cache",
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
    45
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
    46
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
    47
    ATTRS: {
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
    48
        /////////////////////////////////////////////////////////////////////////////
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
    49
        //
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
    50
        // Cache Attributes
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
    51
        //
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
    52
        /////////////////////////////////////////////////////////////////////////////
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
    53
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
    54
        /**
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
    55
        * @attribute max
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
    56
        * @description Maximum number of entries the Cache can hold.
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
    57
        * Set to 0 to turn off caching.
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
    58
        * @type Number
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
    59
        * @default 0
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
    60
        */
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
    61
        max: {
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
    62
            value: 0,
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
    63
            setter: "_setMax"
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
    64
        },
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
    65
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
    66
        /**
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
    67
        * @attribute size
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
    68
        * @description Number of entries currently cached.
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
    69
        * @type Number
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
    70
        */
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
    71
        size: {
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
    72
            readOnly: true,
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
    73
            getter: "_getSize"
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
    74
        },
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
    75
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
    76
        /**
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
    77
        * @attribute uniqueKeys
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
    78
        * @description Validate uniqueness of stored keys. Default is false and
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
    79
        * is more performant.
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
    80
        * @type Boolean
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
    81
        */
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
    82
        uniqueKeys: {
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
    83
            value: false
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
    84
        },
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
    85
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
    86
        /**
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
    87
        * @attribute expires
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
    88
        * @description Absolute Date when data expires or
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
    89
        * relative number of milliseconds. Zero disables expiration.
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
    90
        * @type Date | Number
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
    91
        * @default 0
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
    92
        */
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
    93
        expires: {
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
    94
            value: 0,
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
    95
            validator: function(v) {
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
    96
                return Y.Lang.isDate(v) || (Y.Lang.isNumber(v) && v >= 0);
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
    97
            }
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
    98
        },
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
    99
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   100
        /**
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   101
         * @attribute entries
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   102
         * @description Cached entries.
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   103
         * @type Array
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   104
         */
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   105
        entries: {
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   106
            readOnly: true,
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   107
            getter: "_getEntries"
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   108
        }
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   109
    }
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   110
});
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   111
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   112
Y.extend(Cache, Y.Base, {
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   113
    /////////////////////////////////////////////////////////////////////////////
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   114
    //
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   115
    // Cache private properties
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   116
    //
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   117
    /////////////////////////////////////////////////////////////////////////////
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   118
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   119
    /**
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   120
     * Array of request/response objects indexed chronologically.
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   121
     *
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   122
     * @property _entries
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   123
     * @type Object[]
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   124
     * @private
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   125
     */
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   126
    _entries: null,
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   127
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   128
    /////////////////////////////////////////////////////////////////////////////
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   129
    //
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   130
    // Cache private methods
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   131
    //
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   132
    /////////////////////////////////////////////////////////////////////////////
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   133
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   134
    /**
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   135
    * @method initializer
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   136
    * @description Internal init() handler.
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   137
    * @param config {Object} Config object.
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   138
    * @private
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   139
    */
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   140
    initializer: function(config) {
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   141
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   142
        /**
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   143
        * @event add
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   144
        * @description Fired when an entry is added.
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   145
        * @param e {EventFacade} Event Facade with the following properties:
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   146
         * <dl>
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   147
         * <dt>entry (Object)</dt> <dd>The cached entry.</dd>
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   148
         * </dl>
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   149
        * @preventable _defAddFn
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   150
        */
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   151
        this.publish("add", {defaultFn: this._defAddFn});
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   152
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   153
        /**
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   154
        * @event flush
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   155
        * @description Fired when the cache is flushed.
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   156
        * @param e {EventFacade} Event Facade object.
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   157
        * @preventable _defFlushFn
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   158
        */
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   159
        this.publish("flush", {defaultFn: this._defFlushFn});
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   160
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   161
        /**
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   162
        * @event request
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   163
        * @description Fired when an entry is requested from the cache.
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   164
        * @param e {EventFacade} Event Facade with the following properties:
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   165
        * <dl>
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   166
        * <dt>request (Object)</dt> <dd>The request object.</dd>
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   167
        * </dl>
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   168
        */
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   169
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   170
        /**
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   171
        * @event retrieve
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   172
        * @description Fired when an entry is retrieved from the cache.
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   173
        * @param e {EventFacade} Event Facade with the following properties:
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   174
        * <dl>
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   175
        * <dt>entry (Object)</dt> <dd>The retrieved entry.</dd>
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   176
        * </dl>
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   177
        */
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   178
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   179
        // Initialize internal values
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   180
        this._entries = [];
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   181
        Y.log("Cache initialized", "info", "cache");
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   182
    },
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   183
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   184
    /**
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   185
    * @method destructor
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   186
    * @description Internal destroy() handler.
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   187
    * @private
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   188
    */
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   189
    destructor: function() {
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   190
        this._entries = [];
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   191
        Y.log("Cache destroyed", "info", "cache");
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   192
    },
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   193
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   194
    /////////////////////////////////////////////////////////////////////////////
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   195
    //
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   196
    // Cache protected methods
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   197
    //
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   198
    /////////////////////////////////////////////////////////////////////////////
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   199
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   200
    /**
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   201
     * Sets max.
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   202
     *
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   203
     * @method _setMax
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   204
     * @protected
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   205
     */
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   206
    _setMax: function(value) {
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   207
        // If the cache is full, make room by removing stalest element (index=0)
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   208
        var entries = this._entries;
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   209
        if(value > 0) {
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   210
            if(entries) {
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   211
                while(entries.length > value) {
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   212
                    entries.shift();
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   213
                }
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   214
            }
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   215
        }
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   216
        else {
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   217
            value = 0;
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   218
            this._entries = [];
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   219
        }
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   220
        return value;
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   221
    },
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   222
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   223
    /**
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   224
     * Gets size.
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   225
     *
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   226
     * @method _getSize
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   227
     * @protected
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   228
     */
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   229
    _getSize: function() {
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   230
        return this._entries.length;
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   231
    },
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   232
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   233
    /**
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   234
     * Gets all entries.
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   235
     *
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   236
     * @method _getEntries
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   237
     * @protected
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   238
     */
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   239
    _getEntries: function() {
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   240
        return this._entries;
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   241
    },
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   242
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   243
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   244
    /**
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   245
     * Adds entry to cache.
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   246
     *
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   247
     * @method _defAddFn
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   248
     * @param e {EventFacade} Event Facade with the following properties:
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   249
     * <dl>
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   250
     * <dt>entry (Object)</dt> <dd>The cached entry.</dd>
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   251
     * </dl>
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   252
     * @protected
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   253
     */
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   254
    _defAddFn: function(e) {
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   255
        var entries = this._entries,
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   256
            entry   = e.entry,
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   257
            max     = this.get("max"),
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   258
            pos;
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   259
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   260
        // If uniqueKeys is true and item exists with this key, then remove it.
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   261
        if (this.get("uniqueKeys")) {
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   262
            pos = this._position(e.entry.request);
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   263
            if (LANG.isValue(pos)) {
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   264
                entries.splice(pos, 1);
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   265
            }
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   266
        }
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   267
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   268
        // If the cache at or over capacity, make room by removing stalest
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   269
        // element(s) starting at index-0.
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   270
        while (max && entries.length >= max) {
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   271
            entries.shift();
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   272
        }
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   273
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   274
        // Add entry to cache in the newest position, at the end of the array
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   275
        entries[entries.length] = entry;
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   276
        Y.log("Cached entry: " + Y.dump(entry), "info", "cache");
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   277
    },
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   278
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   279
    /**
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   280
     * Flushes cache.
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   281
     *
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   282
     * @method _defFlushFn
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   283
     * @param e {EventFacade} Event Facade object.
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   284
     * @protected
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   285
     */
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   286
    _defFlushFn: function(e) {
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   287
        var entries = this._entries,
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   288
            details = e.details[0],
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   289
            pos;
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   290
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   291
        //passed an item, flush only that
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   292
        if(details && LANG.isValue(details.request)) {
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   293
            pos = this._position(details.request);
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   294
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   295
            if(LANG.isValue(pos)) {
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   296
                entries.splice(pos,1);
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   297
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   298
                Y.log("Flushed cache item " + Y.dump(details.request), "info", "cache");
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   299
            }
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   300
        }
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   301
        //no item, flush everything
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   302
        else {
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   303
            this._entries = [];
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   304
            Y.log("Cache flushed", "info", "cache");
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   305
        }
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   306
    },
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   307
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   308
    /**
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   309
     * Default overridable method compares current request with given cache entry.
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   310
     * Returns true if current request matches the cached request, otherwise
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   311
     * false. Implementers should override this method to customize the
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   312
     * cache-matching algorithm.
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   313
     *
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   314
     * @method _isMatch
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   315
     * @param request {Object} Request object.
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   316
     * @param entry {Object} Cached entry.
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   317
     * @return {Boolean} True if current request matches given cached request, false otherwise.
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   318
     * @protected
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   319
     */
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   320
    _isMatch: function(request, entry) {
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   321
        if(!entry.expires || new Date() < entry.expires) {
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   322
            return (request === entry.request);
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   323
        }
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   324
        return false;
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   325
    },
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   326
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   327
    /**
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   328
     * Returns position of a request in the entries array, otherwise null.
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   329
     *
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   330
     * @method _position
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   331
     * @param request {Object} Request object.
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   332
     * @return {Number} Array position if found, null otherwise.
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   333
     * @protected
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   334
     */
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   335
    _position: function(request) {
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   336
        // If cache is enabled...
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   337
        var entries = this._entries,
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   338
            length = entries.length,
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   339
            i = length-1;
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   340
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   341
        if((this.get("max") === null) || this.get("max") > 0) {
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   342
            // Loop through each cached entry starting from the newest
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   343
            for(; i >= 0; i--) {
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   344
                // Execute matching function
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   345
                if(this._isMatch(request, entries[i])) {
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   346
                    return i;
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   347
                }
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   348
            }
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   349
        }
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   350
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   351
        return null;
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   352
    },
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   353
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   354
    /////////////////////////////////////////////////////////////////////////////
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   355
    //
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   356
    // Cache public methods
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   357
    //
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   358
    /////////////////////////////////////////////////////////////////////////////
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   359
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   360
    /**
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   361
     * Adds a new entry to the cache of the format
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   362
     * {request:request, response:response, cached:cached, expires:expires}.
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   363
     * If cache is full, evicts the stalest entry before adding the new one.
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   364
     *
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   365
     * @method add
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   366
     * @param request {Object} Request value.
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   367
     * @param response {Object} Response value.
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   368
     */
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   369
    add: function(request, response) {
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   370
        var expires = this.get("expires");
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   371
        if(this.get("initialized") && ((this.get("max") === null) || this.get("max") > 0) &&
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   372
                (LANG.isValue(request) || LANG.isNull(request) || LANG.isUndefined(request))) {
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   373
            this.fire("add", {entry: {
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   374
                request:request,
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   375
                response:response,
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   376
                cached: new Date(),
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   377
                expires: isDate(expires) ? expires :
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   378
            (expires ? new Date(new Date().getTime() + this.get("expires")) : null)
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   379
            }});
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   380
        }
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   381
        else {
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   382
            Y.log("Could not add " + Y.dump(response) + " to cache for " + Y.dump(request), "info", "cache");
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   383
        }
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   384
    },
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   385
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   386
    /**
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   387
     * Flushes cache.
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   388
     *
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   389
     * @method flush
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   390
     */
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   391
    flush: function(request) {
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   392
        this.fire("flush", { request: (LANG.isValue(request) ? request : null) });
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   393
    },
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   394
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   395
    /**
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   396
     * Retrieves cached object for given request, if available, and refreshes
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   397
     * entry in the cache. Returns null if there is no cache match.
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   398
     *
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   399
     * @method retrieve
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   400
     * @param request {Object} Request object.
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   401
     * @return {Object} Cached object with the properties request and response, or null.
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   402
     */
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   403
    retrieve: function(request) {
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   404
        // If cache is enabled...
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   405
        var entries = this._entries,
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   406
            length = entries.length,
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   407
            entry = null,
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   408
            pos;
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   409
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   410
        if((length > 0) && ((this.get("max") === null) || (this.get("max") > 0))) {
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   411
            this.fire("request", {request: request});
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   412
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   413
            pos = this._position(request);
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   414
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   415
            if(LANG.isValue(pos)) {
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   416
                entry = entries[pos];
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   417
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   418
                this.fire("retrieve", {entry: entry});
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   419
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   420
                // Refresh the position of the cache hit
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   421
                if(pos < length-1) {
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   422
                    // Remove element from its original location
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   423
                    entries.splice(pos,1);
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   424
                    // Add as newest
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   425
                    entries[entries.length] = entry;
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   426
                    Y.log("Refreshed cache entry: " + Y.dump(entry) +
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   427
                            " for request: " +  Y.dump(request), "info", "cache");
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   428
                }
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   429
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   430
                Y.log("Retrieved cached response: " + Y.dump(entry) +
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   431
                        " for request: " + Y.dump(request), "info", "cache");
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   432
                return entry;
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   433
            }
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   434
        }
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   435
        return null;
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   436
    }
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   437
});
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   438
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   439
Y.Cache = Cache;
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   440
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   441
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   442
}, '@VERSION@', {"requires": ["base"]});