/**
* Factory for creating caches.
*/
package org.myrobotlab.memory;
import java.util.concurrent.ConcurrentHashMap;
import java.util.concurrent.ConcurrentMap;
import org.myrobotlab.reflection.Reflector;
/**
* Creates a cache based on configuration for the specified package and class.
* Singleton.
*
* @author SwedaKonsult
*
*/
public class CacheFactory {
/**
* Keep this as a singleton
*/
private final static CacheFactory me = new CacheFactory();
/**
* The default initial size of the Cache created.
*/
private final static int DEFAULT_INITIAL_SIZE = 10;
/**
* Cache the caches.
*/
private final ConcurrentMap<String, Cache> caches;
/**
* Get a handle to this factory.
*
* @return
*/
public static CacheFactory getFactory() {
return me;
}
/**
* Private constructor.
*/
private CacheFactory() {
// TODO need to load configuration about caches
caches = new ConcurrentHashMap<String, Cache>();
}
/**
* Create a cache using a specific class. This assumes that the constructor
* does not take any parameters.
*
* @param forClass
* the cache class that should be used
* @return
*/
public Cache createCache(Class<? extends Cache> forClass) {
if (forClass == null) {
return createDefaultCache();
}
Cache cache = getExistingCache(forClass);
if (cache != null) {
return cache;
}
cache = Reflector.<Cache> getNewInstance(forClass, new Object[0]);
caches.put(createKey(forClass), cache);
return cache;
}
/**
* Create a default cache type.
*
* @return LocalCache
*/
private Cache createDefaultCache() {
return new LocalCache(DEFAULT_INITIAL_SIZE);
}
/**
* Build up the key used for caching.
*
* @param forClass
* @return
*/
private String createKey(Class<?> forClass) {
return forClass.getCanonicalName();
}
/**
* Get a key.
*
* @param forClass
* @return
*/
private Cache getExistingCache(Class<? extends Object> forClass) {
String key = createKey(forClass);
if (caches.containsKey(key)) {
return caches.get(key);
}
key = forClass.getPackage().getName();
if (caches.containsKey(key)) {
return caches.get(key);
}
key = forClass.getName();
if (caches.containsKey(key)) {
return caches.get(key);
}
return null;
}
}