package net.dev123.yibo.common;
import java.util.Map;
import java.util.Set;
import java.util.concurrent.ConcurrentHashMap;
import net.dev123.yibo.YiBoApplication;
import net.dev123.yibo.db.LocalAccount;
import net.dev123.yibo.service.cache.AdapterCollectionCache;
import net.dev123.yibo.service.cache.Cache;
import net.dev123.yibo.service.cache.ImageCache;
import net.dev123.yibo.service.cache.ReclaimLevel;
public class CacheManager {
private Map<Object, Cache> cacheMap = null;
private static volatile CacheManager instance = new CacheManager();
private static byte[] lock = new byte[0];
private CacheManager() {
cacheMap = new ConcurrentHashMap<Object, Cache>();
//图片缓冲Cache;
ImageCache imageCache = new ImageCache(YiBoApplication.getSdcardCachePath(),
YiBoApplication.getInnerCachePath());
putCache(ImageCache.class, imageCache);
}
public static CacheManager getInstance() {
if (instance == null) {
synchronized (lock) {
if (instance == null)
instance = new CacheManager();
}
}
return instance;
}
public boolean containsKey(String key) {
return cacheMap.containsKey(key);
}
// public void putCache(Class<?> clazz, String identifyID, Cache cache) {
// cacheMap.put(clazz.getName() + "_" + identifyID, cache);
// }
public void putCache(Class<?> clazz, Cache cache) {
if (clazz == null || cache == null) {
return;
}
cacheMap.put(clazz.getName(), cache);
}
public void putCache(LocalAccount account, AdapterCollectionCache cache) {
cacheMap.put(account, cache);
}
public Cache getCache(Class<?> clazz) {
Cache cache = getCache(clazz.getName());
if (cache == null && clazz.equals(ImageCache.class)) {
String sdcardCachePath = YiBoApplication.getSdcardCachePath();
ImageCache imageCache = new ImageCache(sdcardCachePath, YiBoApplication.getInnerCachePath());
cacheMap.put(ImageCache.class.getName(), imageCache);
}
return getCache(clazz.getName());
}
public Cache getCache(LocalAccount account) {
if (account == null) {
return null;
}
return cacheMap.get(account);
}
// public Cache getCache(Class<?> clazz, String identifyID) {
// return getCache(clazz.getName() + "_" + identifyID);
// }
public Cache getCache(String key) {
return cacheMap.get(key);
}
public void reclaim(ReclaimLevel level) {
switch (level) {
case LIGHT:
case MODERATE:
ImageCache imageCache = (ImageCache)getCache(ImageCache.class);
if (imageCache != null) {
imageCache.reclaim(level);
}
break;
case WEIGHT:
Set<Object> set = cacheMap.keySet();
for (Object key : set) {
Cache cache = cacheMap.get(key);
cache.reclaim(level);
}
break;
default:
break;
}
}
public void flush() {
Set<Object> set = cacheMap.keySet();
Cache cache = null;
for (Object key : set) {
cache = cacheMap.get(key);
if (cache != null) {
cache.flush();
}
}
}
public void clear() {
flush();
cacheMap.clear();
instance = null;
}
}