/*
* Jalview - A Sequence Alignment Editor and Viewer ($$Version-Rel$$)
* Copyright (C) $$Year-Rel$$ The Jalview Authors
*
* This file is part of Jalview.
*
* Jalview is free software: you can redistribute it and/or
* modify it under the terms of the GNU General Public License
* as published by the Free Software Foundation, either version 3
* of the License, or (at your option) any later version.
*
* Jalview is distributed in the hope that it will be useful, but
* WITHOUT ANY WARRANTY; without even the implied warranty
* of MERCHANTABILITY or FITNESS FOR A PARTICULAR
* PURPOSE. See the GNU General Public License for more details.
*
* You should have received a copy of the GNU General Public License
* along with Jalview. If not, see .
* The Jalview Authors are detailed in the 'AUTHORS' file.
*/
package jalview.io.cache;
import jalview.bin.Cache;
import java.util.Hashtable;
import java.util.LinkedHashSet;
/**
* A singleton class used for querying and persisting cache items.
*
* @author tcnofoegbu
*
*/
public class AppCache
{
public static final String DEFAULT_LIMIT = "99";
public static final String CACHE_DELIMITER = ";";
private static AppCache instance = null;
private static final String DEFAULT_LIMIT_KEY = ".DEFAULT_LIMIT";
private Hashtable> cacheItems;
private AppCache()
{
cacheItems = new Hashtable>();
}
/**
* Method to obtain all the cache items for a given cache key
*
* @param cacheKey
* @return
*/
public LinkedHashSet getAllCachedItemsFor(String cacheKey)
{
LinkedHashSet foundCache = cacheItems.get(cacheKey);
if (foundCache == null)
{
foundCache = new LinkedHashSet();
cacheItems.put(cacheKey, foundCache);
}
return foundCache;
}
/**
* Returns a singleton instance of AppCache
*
* @return
*/
public static AppCache getInstance()
{
if (instance == null)
{
instance = new AppCache();
}
return instance;
}
/**
* Method for persisting cache items for a given cache key
*
* @param cacheKey
*/
public void persistCache(String cacheKey)
{
LinkedHashSet foundCacheItems = getAllCachedItemsFor(cacheKey);
StringBuffer delimitedCacheBuf = new StringBuffer();
for (String cacheItem : foundCacheItems)
{
delimitedCacheBuf.append(CACHE_DELIMITER).append(cacheItem);
}
if (delimitedCacheBuf.length() > 0)
{
delimitedCacheBuf.deleteCharAt(0);
}
String delimitedCacheString = delimitedCacheBuf.toString();
Cache.setProperty(cacheKey, delimitedCacheString);
}
/**
* Method for deleting cached items for a given cache key
*
* @param cacheKey
* the cache key
*/
public void deleteCacheItems(String cacheKey)
{
cacheItems.put(cacheKey, new LinkedHashSet());
persistCache(cacheKey);
}
/**
* Method for obtaining the preset maximum cache limit for a given cache key
*
* @param cacheKey
* the cache key
* @return the max number of items that could be cached
*/
public String getCacheLimit(String cacheKey)
{
String uniqueKey = cacheKey + DEFAULT_LIMIT_KEY;
return Cache.getDefault(uniqueKey, DEFAULT_LIMIT);
}
/**
* Method for updating the preset maximum cache limit for a given cache key
*
* @param cacheKey
* the cache key
* @param newLimit
* the max number of items that could be cached for the given cache
* key
* @return
*/
public int updateCacheLimit(String cacheKey, int newUserLimit)
{
String newLimit = String.valueOf(newUserLimit);
String uniqueKey = cacheKey + DEFAULT_LIMIT_KEY;
String formerLimit = getCacheLimit(cacheKey);
if (newLimit != null && !newLimit.isEmpty()
&& !formerLimit.equals(newLimit))
{
Cache.setProperty(uniqueKey, newLimit);
formerLimit = newLimit;
}
return Integer.valueOf(formerLimit);
}
/**
* Method for inserting cache items for given cache key into the cache data
* structure
*
* @param cacheKey
* the cache key
* @param cacheItems
* the items to add to the cache
*/
public void putCache(String cacheKey, LinkedHashSet newCacheItems)
{
cacheItems.put(cacheKey, newCacheItems);
}
}