1
0
mirror of https://github.com/mitb-archive/filebot synced 2024-12-25 01:08:52 -05:00

* 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

View File

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