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.ClientCacheEntryCreated; import org.infinispan.client.hotrod.annotation.ClientCacheEntryModified; import org.infinispan.client.hotrod.annotation.ClientCacheEntryRemoved; import org.infinispan.client.hotrod.annotation.ClientListener; import org.infinispan.client.hotrod.event.ClientCacheEntryCreatedEvent; import org.infinispan.client.hotrod.event.ClientCacheEntryModifiedEvent; import org.infinispan.client.hotrod.event.ClientCacheEntryRemovedEvent; import org.radargun.logging.Log; import org.radargun.logging.LogFactory; /** * Generic Infinispan remote listeners, similar to {@link InfinispanCacheListeners}. * * @author vjuranek */ public class InfinispanClientListeners extends AbstractInfinispanListeners { protected static final Log log = LogFactory.getLog(InfinispanClientListeners.class); protected final Infinispan70HotrodService service; protected final ConcurrentMap<String, GenericClientListener> listeners = new ConcurrentHashMap<String, GenericClientListener>(); public InfinispanClientListeners(Infinispan70HotrodService service) { this.service = service; } @Override protected GenericClientListener getOrCreateListener(String cacheName, boolean sync) { final RemoteCacheManager remoteManager = service.getRemoteManager(false); if (cacheName == null) cacheName = remoteManager.getCache().getName(); GenericClientListener listenerContainer = listeners.putIfAbsent(cacheName, new GenericClientListener()); if (listenerContainer == null) { listenerContainer = listeners.get(cacheName); service.getRemoteManager(false).getCache(cacheName).addClientListener(listenerContainer); service.getRemoteManager(true).getCache(cacheName).addClientListener(listenerContainer); } return listenerContainer; } @Override protected GenericClientListener getListenerOrThrow(String cacheName, boolean sync) { if (cacheName == null) { final RemoteCacheManager remoteManager = service.getRemoteManager(false); cacheName = remoteManager.getCache().getName(); } GenericClientListener 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); } @Override public void addEvictedListener(String cacheName, EvictedListener listener, boolean sync) { throw new UnsupportedOperationException("HotRod doesn't support client listeners for eviction"); } @Override public void addExpiredListener(String cacheName, ExpiredListener listener, boolean sync) { throw new UnsupportedOperationException("HotRod doesn't support client listeners for expiration"); } @Override public void removeEvictedListener(String cacheName, EvictedListener listener, boolean sync) { throw new UnsupportedOperationException("HotRod doesn't support client listeners for eviction"); } @Override public void removeExpiredListener(String cacheName, ExpiredListener listener, boolean sync) { throw new UnsupportedOperationException("HotRod doesn't support client listeners for expiration"); } @Override public void removeListener(String cacheName, boolean sync) { GenericClientListener listener = getListenerOrThrow(cacheName, sync); if (listener.isEmpty()) { service.getRemoteManager(false).getCache(cacheName == null ? "" : cacheName).removeClientListener(listener); service.getRemoteManager(true).getCache(cacheName == null ? "" : cacheName).removeClientListener(listener); } } @ClientListener public static class GenericClientListener extends AbstractInfinispanListeners.GenericListener { @ClientCacheEntryCreated public void created(ClientCacheEntryCreatedEvent e) { for (CreatedListener listener : created) { try { listener.created(e.getKey(), e.getVersion()); } catch (Exception ex) { log.error("Listener " + listener + " has thrown an exception", ex); } } } @ClientCacheEntryModified public void updated(ClientCacheEntryModifiedEvent e) { for (UpdatedListener listener : updated) { try { listener.updated(e.getKey(), e.getVersion()); } catch (Exception ex) { log.error("Listener " + listener + " has thrown an exception", ex); } } } @ClientCacheEntryRemoved public void updated(ClientCacheEntryRemovedEvent e) { for (RemovedListener listener : removed) { try { listener.removed(e.getKey(), null); } catch (Exception ex) { log.error("Listener " + listener + " has thrown an exception", ex); } } } } }