package org.radargun.service;
import org.infinispan.query.Search;
import org.radargun.traits.ContinuousQuery;
import org.radargun.traits.Query;
/**
* @author Vojtech Juranek <vjuranek@redhat.com>
*/
public class Infinispan82EmbeddedContinuousQuery implements ContinuousQuery {
protected final Infinispan82EmbeddedService service;
public Infinispan82EmbeddedContinuousQuery(Infinispan82EmbeddedService service) {
this.service = service;
}
@Override
public ListenerReference createContinuousQuery(String cacheName, Query query, ContinuousQuery.Listener cqListener) {
AbstractInfinispanQueryable.QueryImpl ispnQuery = (AbstractInfinispanQueryable.QueryImpl) query;
org.infinispan.query.api.continuous.ContinuousQuery cq = Search.getContinuousQuery(service.getCache(cacheName));
Listener ispnCqListener = new Listener(cqListener);
cq.addContinuousQueryListener(ispnQuery.getDelegatingQuery(), ispnCqListener);
return new ListenerReference(cq, ispnCqListener);
}
@Override
public void removeContinuousQuery(String cacheName, ContinuousQuery.ListenerReference listenerReference) {
ListenerReference ref = (ListenerReference) listenerReference;
ref.cq.removeContinuousQueryListener(ref.listener);
}
private static class Listener implements org.infinispan.query.api.continuous.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);
}
}
public static class ListenerReference implements ContinuousQuery.ListenerReference {
private final org.infinispan.query.api.continuous.ContinuousQuery<Object, Object> cq;
private final Listener listener;
public ListenerReference(org.infinispan.query.api.continuous.ContinuousQuery<Object, Object> cq, Listener listener) {
this.cq = cq;
this.listener = listener;
}
}
}