package org.radargun.service;
import java.util.Arrays;
import java.util.Collection;
import java.util.concurrent.ConcurrentHashMap;
import java.util.concurrent.ConcurrentMap;
import org.infinispan.client.hotrod.RemoteCacheManager;
import org.infinispan.client.hotrod.annotation.ClientCacheEntryExpired;
import org.infinispan.client.hotrod.annotation.ClientListener;
import org.infinispan.client.hotrod.event.ClientCacheEntryExpiredEvent;
import org.radargun.logging.Log;
import org.radargun.logging.LogFactory;
/**
* Generic Infinispan remote listeners for Infinispan 8, similar to {@link InfinispanCacheListeners}.
*
* @author Martin Gencur <mgencur@redhat.com>
*/
public class Infinispan80ClientListeners extends InfinispanClientListeners {
protected final ConcurrentMap<String, GenericInfinispan80ClientListener> listeners = new ConcurrentHashMap<String, GenericInfinispan80ClientListener>();
public Infinispan80ClientListeners(Infinispan80HotrodService service) {
super(service);
}
@Override
protected GenericInfinispan80ClientListener getOrCreateListener(String cacheName, boolean sync) {
if (cacheName == null)
cacheName = service.getRemoteManager(false).getCache().getName();
GenericInfinispan80ClientListener listenerContainer = listeners.get(cacheName);
if (listenerContainer == null) {
listenerContainer = new GenericInfinispan80ClientListener();
listeners.put(cacheName, listenerContainer);
service.getRemoteManager(false).getCache(cacheName).addClientListener(listenerContainer);
service.getRemoteManager(true).getCache(cacheName).addClientListener(listenerContainer);
}
return listenerContainer;
}
@Override
protected GenericInfinispan80ClientListener getListenerOrThrow(String cacheName, boolean sync) {
if (cacheName == null) {
final RemoteCacheManager remoteManager = service.getRemoteManager(false);
cacheName = remoteManager.getCache().getName();
}
GenericInfinispan80ClientListener listenerContainer = listeners.get(cacheName);
if (listenerContainer == null)
throw new IllegalArgumentException("No listener was registered on cache " + cacheName);
return listenerContainer;
}
@Override
public Collection<Type> getSupportedListeners() {
return Arrays.asList(Type.CREATED, Type.UPDATED, Type.REMOVED, Type.EXPIRED);
}
@Override
public void addExpiredListener(String cacheName, ExpiredListener listener, boolean sync) {
getOrCreateListener(cacheName, sync).add(listener);
}
@Override
public void removeExpiredListener(String cacheName, ExpiredListener listener, boolean sync) {
getListenerOrThrow(cacheName, sync).remove(listener);
removeListener(cacheName, sync);
}
@ClientListener
public static class GenericInfinispan80ClientListener extends GenericClientListener {
protected static final Log log = LogFactory.getLog(GenericInfinispan80ClientListener.class);
@ClientCacheEntryExpired
public void expired(ClientCacheEntryExpiredEvent e) {
for (ExpiredListener listener : expired) {
try {
listener.expired(e.getKey(), null);
} catch (Exception ex) {
log.error("Listener " + listener + " has thrown an exception", ex);
}
}
}
}
}