package org.infinispan.jcache.remote;
import javax.cache.configuration.MutableConfiguration;
import javax.cache.integration.CacheLoader;
import javax.cache.integration.CacheWriter;
import org.infinispan.client.hotrod.RemoteCache;
import org.infinispan.jcache.Exceptions;
public abstract class RemoteCacheWithCacheStore<K, V> extends RemoteCacheWrapper<K, V> {
private final CacheLoader<K, V> jcacheLoader;
private final CacheWriter<? super K, ? super V> jcacheWriter;
private final MutableConfiguration<K, V> configuration;
public RemoteCacheWithCacheStore(RemoteCache<K, V> delegate,
CacheLoader<K, V> jcacheLoader,
CacheWriter<? super K, ? super V> jcacheWriter,
MutableConfiguration<K, V> configuration) {
super(delegate);
this.jcacheLoader = jcacheLoader;
this.jcacheWriter = jcacheWriter;
this.configuration = configuration;
}
@SuppressWarnings("unchecked")
@Override
public V get(Object key) {
V value = super.get(key);
if (value == null) {
try {
value = loadFromCacheLoader((K) key);
} catch (ClassCastException ex) {
//Don't load.
}
}
return value;
}
private V loadFromCacheLoader(K key) {
if (jcacheLoader == null || !configuration.isReadThrough()) {
return null;
}
V value = null;
try {
value = jcacheLoader.load(key);
} catch (Exception ex) {
throw Exceptions.launderCacheLoaderException(ex);
}
if (value != null) {
onLoad(key, value);
}
return value;
}
protected abstract void onLoad(K key, V value);
}