//@include lib_Class.js

/**
 * A threadsafe cache implementation.
 *
 * The cache holds key-value pairs.
 * Keys should be strings, whereas values could be arbitary objects.
 *
 * @author PZ, ELO Digital Office GmbH
 * @version 1.03.000
 *
 * @eloix
 * @eloas
 * @elojc
 *
 */
sol.define("sol.common.Cache", {

  initialize: function (config) {
    var me = this;
    me.cache = new java.util.concurrent.ConcurrentHashMap(8, new java.lang.Float(0.9), 1);
  },

  /**
   * Inserts the specified key-value pair into the cache.
   * @param {String} key
   * @param {Object} value
   * @return {Object} The previous value associated with the key, or null if there was no mapping before
   */
  put: function (key, value) {
    var me = this;
    return me.cache.put(key, value);
  },

  /**
   * Inserts all key-value pairs specified by an object into the cache. Existing mappings will be replaced.
   * @param {Object} data Property names will be used as keys and the associated values as values.
   */
  putAll: function (data) {
    var me = this;
    me.cache.putAll(data);
  },

  /**
   * Tests if the specified object is a key in the cache.
   * @param {String} key
   * @return {Boolean}
   */
  containsKey: function (key) {
    var me = this;
    return me.cache.containsKey(key);
  },

  /**
   * Returns the value for the specified key from the cache, or null if the chache contains no mapping for the key.
   * @param {String} key
   * @return {Object}
   */
  get: function (key) {
    var me = this;
    return me.cache.get(key);
  },

  /**
   * Returns an enumeration of all keys in the cache.
   * @return {Object} An `java.util.Enumeration` of all keys
   */
  keys: function () {
    var me = this;
    return me.cache.keys();
  },

  /**
   * Returns a collection view of the values contained in the cache.
   * @return {Object} An `java.util.Collection` of all values
   */
  values: function () {
    var me = this;
    return me.cache.values();
  },

  /**
   * Returns an enumeration of the values in the cache.
   * @return {Object} An `java.util.Enumeration` of all values
   */
  elements: function () {
    var me = this;
    return me.cache.elements();
  },

  /**
   * Removes the key (and its corresponding value) from the cache.
   * @param {String} key
   * @return {Object} The previous value associated with the key, or null if there was no value for the key
   */
  remove: function (key) {
    var me = this;
    return me.cache.remove(key);
  },

  /**
   * Returns the number of key-value pairs in the cache.
   * @return {Number}
   */
  size: function () {
    var me = this;
    return me.cache.size();
  },

  /**
   * Returns `true` if the chache contains no key-value pairs.
   * @return {Boolean}
   */
  isEmpty: function () {
    var me = this;
    return me.cache.isEmpty();
  },

  /**
   * Removes all of the mappings from the cache.
   */
  clear: function () {
    var me = this;
    me.cache.clear();
  }

});