package org.radargun.service;
import java.util.concurrent.TimeUnit;
import org.infinispan.AdvancedCache;
import org.infinispan.context.Flag;
import org.radargun.logging.Log;
import org.radargun.logging.LogFactory;
import org.radargun.traits.BasicOperations;
import org.radargun.traits.ConditionalOperations;
import org.radargun.traits.LocalBasicOperations;
import org.radargun.traits.LocalConditionalOperations;
import org.radargun.traits.TemporalOperations;
/**
* @author Radim Vansa <rvansa@redhat.com>
*/
public class InfinispanOperations implements BasicOperations, ConditionalOperations, LocalBasicOperations, LocalConditionalOperations, TemporalOperations {
protected final InfinispanEmbeddedService service;
public InfinispanOperations(InfinispanEmbeddedService service) {
this.service = service;
}
@Override
public <K, V> InfinispanCache<K, V> getCache(String cacheName) {
return new Cache<K, V>(service, (AdvancedCache<K, V>) service.getCache(cacheName).getAdvancedCache());
}
@Override
public <K, V> InfinispanCache<K, V> getLocalCache(String cacheName) {
return new Cache<K, V>(service, (AdvancedCache<K, V>) service.getCache(cacheName).getAdvancedCache().withFlags(Flag.CACHE_MODE_LOCAL));
}
protected interface InfinispanCache<K, V> extends BasicOperations.Cache<K, V>, ConditionalOperations.Cache<K, V>, TemporalOperations.Cache<K, V>, AdvancedCacheHolder {}
protected static class Cache<K, V> implements InfinispanCache<K, V> {
protected final Log log = LogFactory.getLog(getClass());
protected final boolean trace = log.isTraceEnabled();
protected final InfinispanEmbeddedService service;
protected final org.infinispan.AdvancedCache<K, V> impl;
protected final org.infinispan.Cache<K, V> ignoreReturnValueImpl;
public Cache(InfinispanEmbeddedService service, org.infinispan.AdvancedCache<K, V> impl) {
this.service = service;
this.impl = impl;
this.ignoreReturnValueImpl = impl.withFlags(Flag.SKIP_REMOTE_LOOKUP, Flag.SKIP_CACHE_LOAD);
}
public void put(K key, V value) {
if (trace) log.tracef("PUT cache=%s key=%s value=%s", impl.getName(), key, value);
ignoreReturnValueImpl.put(key, value);
}
@Override
public V getAndPut(K key, V value) {
if (trace) log.tracef("GET_AND_PUT cache=%s key=%s value=%s", impl.getName(), key, value);
return impl.put(key, value);
}
public V get(K key) {
if (trace) log.tracef("GET cache=%s key=%s", impl.getName(), key);
return impl.get(key);
}
@Override
public boolean containsKey(K key) {
if (trace) log.tracef("CONTAINS cache=%s key=%s", impl.getName(), key);
return impl.containsKey(key);
}
public boolean remove(K key) {
if (trace) log.tracef("REMOVE cache=%s key=%s", impl.getName(), key);
return impl.remove(key) != null;
}
@Override
public V getAndRemove(K key) {
if (trace) log.tracef("GET_AND_REMOVE cache=%s key=%s", impl.getName(), key);
return impl.remove(key);
}
@Override
public boolean replace(K key, V value) {
if (trace) log.tracef("REPLACE cache=%s key=%s value=%s", impl.getName(), key, value);
return impl.replace(key, value) != null;
}
@Override
public V getAndReplace(K key, V value) {
if (trace) log.tracef("GET_AND_REPLACE cache=%s key=%s value=%s", impl.getName(), key, value);
return impl.replace(key, value);
}
@Override
public void clear() {
if (trace) log.trace("CLEAR " + impl.getName());
impl.clear();
}
@Override
public boolean replace(K key, V oldValue, V newValue) {
if (trace) log.tracef("REPLACE cache=%s key=%s old=%s, new=%s", impl.getName(), key, oldValue, newValue);
return impl.replace(key, oldValue, newValue);
}
@Override
public boolean putIfAbsent(K key, V value) {
if (trace) log.tracef("PUT_IF_ABSENT cache=%s key=%s value=%s", impl.getName(), key, value);
return impl.putIfAbsent(key, value) == null;
}
@Override
public boolean remove(K key, V oldValue) {
if (trace) log.tracef("REMOVE cache=%s key=%s value=%s", impl.getName(), key, oldValue);
return impl.remove(key, oldValue);
}
@Override
public AdvancedCache getAdvancedCache() {
return impl;
}
@Override
public void put(K key, V value, long lifespan) {
if (trace)
log.tracef("PUT_WITH_LIFESPAN cache=%s key=%s value=%s lifespan=%s", impl.getName(), key, value, lifespan);
ignoreReturnValueImpl.put(key, value, lifespan, TimeUnit.MILLISECONDS);
}
@Override
public V getAndPut(K key, V value, long lifespan) {
if (trace)
log.tracef("GET_AND_PUT_WITH_LIFESPAN cache=%s key=%s value=%s lifespan=%s", impl.getName(), key, value, lifespan);
return impl.put(key, value, lifespan, TimeUnit.MILLISECONDS);
}
@Override
public boolean putIfAbsent(K key, V value, long lifespan) {
if (trace)
log.tracef("PUT_IF_ABSENT_WITH_LIFESPAN cache=%s key=%s value=%s, lifespan=%s", impl.getName(), key, value, lifespan);
return impl.putIfAbsent(key, value, lifespan, TimeUnit.MILLISECONDS) == null;
}
@Override
public void put(K key, V value, long lifespan, long maxIdleTime) {
if (trace)
log.tracef("PUT_WITH_LIFESPAN_AND_MAXIDLE cache=%s key=%s value=%s lifespan=%s maxIdle=%s", impl.getName(), key, value, lifespan, maxIdleTime);
ignoreReturnValueImpl.put(key, value, lifespan, TimeUnit.MILLISECONDS, maxIdleTime, TimeUnit.MILLISECONDS);
}
@Override
public V getAndPut(K key, V value, long lifespan, long maxIdleTime) {
if (trace)
log.tracef("GET_AND_PUT_WITH_LIFESPAN_AND_MAXIDLE cache=%s key=%s value=%s lifespan=%s maxIdle=%s", impl.getName(), key, value, lifespan, maxIdleTime);
return impl.put(key, value, lifespan, TimeUnit.MILLISECONDS, maxIdleTime, TimeUnit.MILLISECONDS);
}
@Override
public boolean putIfAbsent(K key, V value, long lifespan, long maxIdleTime) {
if (trace)
log.tracef("PUT_IF_ABSENT_WITH_LIFESPAN cache=%s key=%s value=%s lifespan=%s maxIdle=%s", impl.getName(), key, value, lifespan, maxIdleTime);
return impl.putIfAbsent(key, value, lifespan, TimeUnit.MILLISECONDS, maxIdleTime, TimeUnit.MILLISECONDS) == null;
}
}
}