package org.solbase.cache;
import java.io.IOException;
import java.lang.management.ManagementFactory;
import java.util.HashMap;
import java.util.ResourceBundle;
import javax.management.InstanceAlreadyExistsException;
import javax.management.MBeanRegistrationException;
import javax.management.MBeanServer;
import javax.management.MalformedObjectNameException;
import javax.management.NotCompliantMBeanException;
import javax.management.ObjectName;
import org.apache.solr.common.util.NamedList;
import org.apache.solr.search.LRUCache;
import org.apache.solr.search.SolrCache.State;
public class SolbaseLRUCache<K, V, Z> extends VersionedCache<K, V, Z> implements SolbaseLRUCacheMBean{
LRUCache cache;
private int size;
public SolbaseLRUCache(int cacheSize, String name) {
String size = System.getProperty("solbase.lrucache.size");
try {
if (size == null && ResourceBundle.getBundle("solbase") != null) {
size = ResourceBundle.getBundle("solbase").getString("lrucache.size");
}
} catch (Exception ex) {
}
if (size == null) {
size = new Integer(1024 * cacheSize).toString();
}
this.size = new Integer(size);
HashMap<String, String> argMap = new HashMap<String, String>();
argMap.put("size", size);
argMap.put("name", "solbaseCache");
cache = new LRUCache();
cache.init(argMap, null, null);
cache.setState(State.LIVE);
// register mbean here
MBeanServer mbs = ManagementFactory.getPlatformMBeanServer();
ObjectName objName;
try {
objName = new ObjectName("org.solbase.cache:type=SolbaseLRUCache-"+name);
mbs.registerMBean(this, objName);
} catch (InstanceAlreadyExistsException e) {
// TODO Auto-generated catch block
e.printStackTrace();
} catch (MBeanRegistrationException e) {
// TODO Auto-generated catch block
e.printStackTrace();
} catch (NotCompliantMBeanException e) {
// TODO Auto-generated catch block
e.printStackTrace();
} catch (MalformedObjectNameException e1) {
// TODO Auto-generated catch block
e1.printStackTrace();
} catch (NullPointerException e1) {
// TODO Auto-generated catch block
e1.printStackTrace();
}
}
@SuppressWarnings("unchecked")
@Override
protected CachedObjectWrapper<V, Z> getInternal(K key) throws IOException {
return (CachedObjectWrapper<V, Z>) cache.get(key);
}
@Override
public void put(K key, CachedObjectWrapper<V, Z> aValue) throws IOException {
cache.put(key, aValue);
}
@Override
public void clear() throws IOException {
cache.clear();
}
@Override
public boolean isCacheFull() {
return this.size <= cache.size();
}
@Override
public NamedList getStatistics() {
return this.cache.getStatistics();
}
@Override
public long getLookups() {
return this.cache.getLookups();
}
@Override
public long getHits() {
return this.cache.getHits();
}
@Override
public long getInserts() {
return this.cache.getInserts();
}
@Override
public long getEvictions() {
return this.cache.getEvictions();
}
@Override
public void freezeCacheSize() {
this.cache.freezeCacheSize();
}
@Override
public void resetCacheLimit(int limit) {
this.cache.resetCacheLimit(limit);
}
}