* make cache more resilient and fail-safe even if the key class structure changes

This commit is contained in:
Reinhard Pointner 2013-09-15 01:38:56 +00:00
parent 9551767595
commit 5b9ab0826a
1 changed files with 25 additions and 32 deletions

View File

@ -1,7 +1,5 @@
package net.sourceforge.filebot;
import java.io.Serializable;
import java.util.Arrays;
import java.util.logging.Level;
@ -10,21 +8,18 @@ import java.util.logging.Logger;
import net.sf.ehcache.CacheManager;
import net.sf.ehcache.Element;
public class Cache {
public static Cache getCache(String name) {
return new Cache(CacheManager.getInstance().getCache(name));
}
private final net.sf.ehcache.Cache cache;
protected Cache(net.sf.ehcache.Cache cache) {
this.cache = cache;
}
public void put(Object key, Object value) {
try {
cache.put(new Element(key, value));
@ -33,13 +28,11 @@ public class Cache {
remove(key); // fail-safe
}
}
public Object get(Object key) {
return get(key, Object.class);
}
public <T> T get(Object key, Class<T> type) {
try {
Element element = cache.get(key);
@ -47,53 +40,53 @@ public class Cache {
return type.cast(element.getValue());
}
} catch (Exception e) {
Logger.getLogger(Cache.class.getName()).log(Level.WARNING, e.getMessage(), e);
Logger.getLogger(Cache.class.getName()).log(Level.WARNING, e.getMessage());
remove(key); // fail-safe
}
return null;
}
public void remove(Object key) {
try {
cache.remove(key);
} catch (Exception e) {
Logger.getLogger(Cache.class.getName()).log(Level.WARNING, e.getMessage(), e);
} catch (Exception e1) {
Logger.getLogger(Cache.class.getName()).log(Level.WARNING, e1.getMessage());
try {
Logger.getLogger(Cache.class.getName()).log(Level.INFO, "Cached data has become invalid: Clearing cache now");
cache.removeAll();
} catch (Exception e2) {
Logger.getLogger(Cache.class.getName()).log(Level.SEVERE, e2.getMessage());
}
}
}
public static class Key implements Serializable {
protected Object[] fields;
public Key(Object... fields) {
this.fields = fields;
}
@Override
public int hashCode() {
return Arrays.hashCode(fields);
}
@Override
public boolean equals(Object other) {
if (other instanceof Key) {
return Arrays.equals(this.fields, ((Key) other).fields);
}
return false;
}
@Override
public String toString() {
return Arrays.toString(fields);
}
}
}