package com.yfrog.http;
import ie.ucd.murmur.MurmurHash;
import net.sf.ehcache.Cache;
import net.sf.ehcache.CacheManager;
import net.sf.ehcache.Element;
import net.sf.ehcache.config.Configuration;
import net.sf.ehcache.config.DiskStoreConfiguration;
import net.sf.ehcache.config.CacheConfiguration;
import java.util.Vector;
public class MultiCacheManager {
Vector<CacheManager> cacheManagers = new Vector<CacheManager>();
static final public String DEFAULT_SCHEME = "/disk%d";
public MultiCacheManager(int count) {
for (int i = 0; i< count;++i) {
createCache(i, DEFAULT_SCHEME);
}
}
public MultiCacheManager(int count, String scheme) {
for (int i = 0; i< count;++i) {
createCache(i, scheme);
}
}
private void createCache(int number, String scheme) {
Configuration config = new Configuration();
config.setName("Cache " + String.valueOf(number));
DiskStoreConfiguration diskConfig = new DiskStoreConfiguration();
diskConfig.setPath(String.format(scheme, number));
config.diskStore(diskConfig);
CacheConfiguration cacheConfig = new CacheConfiguration();
cacheConfig.setEternal(false);
cacheConfig.setTimeToIdleSeconds(120);
cacheConfig.setTimeToLiveSeconds(120);
cacheConfig.setDiskSpoolBufferSizeMB(30);
cacheConfig.setDiskExpiryThreadIntervalSeconds(120);
cacheConfig.setMaxBytesLocalHeap("100M");
cacheConfig.setMemoryStoreEvictionPolicy("LRU");
cacheConfig.setName("Cache " + String.valueOf(number));
config.addCache(cacheConfig);
CacheManager cacheManager = CacheManager.newInstance(config);
cacheManagers.add(cacheManager);
}
private CacheManager getCacheManager(String key) {
return cacheManagers.get(getCacheId(key));
}
private Cache getCache(String key) {
CacheManager manager = getCacheManager(key);
return manager.getCache(manager.getCacheNames()[0]);
}
public HttpObject getCachedValue(String key) {
Element value = getCache(key).get(key);
if (value == null) {
return null;
}
return (HttpObject)value.getObjectValue();
}
private int getCacheId(String key) {
final long integerCount = (long)Integer.MAX_VALUE - (long)Integer.MIN_VALUE; // Java int is 32 bit
final long interval = integerCount / cacheManagers.size();
int hash = MurmurHash.hash32(key);
int id = (int)(((long)hash - (long)Integer.MIN_VALUE) / interval);
return id;
}
public void putValue(String key, HttpObject value) {
getCache(key).put(new Element(key, value));
}
}