package org.radargun.service;
import org.infinispan.client.hotrod.RemoteCache;
import org.infinispan.client.hotrod.event.ClientEvents;
import org.radargun.traits.ContinuousQuery;
import org.radargun.traits.Query;
/**
* @author Vojtech Juranek <vjuranek@redhat.com>
*/
public class InfinispanHotrodContinuousQuery implements ContinuousQuery {
protected final InfinispanHotrodService service;
public InfinispanHotrodContinuousQuery(InfinispanHotrodService service) {
this.service = service;
}
@Override
public ListenerReference createContinuousQuery(String cacheName, Query query, ContinuousQuery.Listener cqListener) {
AbstractInfinispanQueryable.QueryImpl ispnQuery = (AbstractInfinispanQueryable.QueryImpl) query;
Listener ispnCqListener = new Listener(cqListener);
Object clientListener = ClientEvents.addContinuousQueryListener(getRemoteCache(cacheName), ispnCqListener, ispnQuery.getDelegatingQuery());
return new ListenerReference(clientListener);
}
@Override
public void removeContinuousQuery(String cacheName, ContinuousQuery.ListenerReference listenerReference) {
ListenerReference ref = (ListenerReference) listenerReference;
getRemoteCache(cacheName).removeClientListener(ref.clientListener);
}
protected RemoteCache getRemoteCache(String cacheName) {
return cacheName == null ? service.managerNoReturn.getCache() : service.managerNoReturn.getCache(cacheName);
}
private static class Listener implements org.infinispan.client.hotrod.event.ContinuousQueryListener {
private final ContinuousQuery.Listener cqListener;
public Listener(ContinuousQuery.Listener cqListener) {
this.cqListener = cqListener;
}
@Override
public void resultJoining(Object key, Object value) {
cqListener.onEntryJoined(key, value);
}
@Override
public void resultLeaving(Object key) {
cqListener.onEntryLeft(key);
}
}
private static class ListenerReference implements ContinuousQuery.ListenerReference {
private final Object clientListener;
private ListenerReference(Object clientListener) {
this.clientListener = clientListener;
}
}
}