package org.radargun.service;
import com.hazelcast.core.EntryEvent;
import com.hazelcast.core.EntryListener;
import com.hazelcast.core.IMap;
import com.hazelcast.core.MapEvent;
import org.radargun.traits.ContinuousQuery;
import org.radargun.traits.Query;
/**
* @author vjuranek
*/
public class HazelcastContinuousQuery implements ContinuousQuery {
protected final Hazelcast36Service service;
private String hazelcastCQListenerId;
public HazelcastContinuousQuery(Hazelcast36Service service) {
this.service = service;
}
@Override
public ListenerReference createContinuousQuery(String mapName, Query query, Listener cqListener) {
EntryListener entryListener = new HazelcastContinuousQueryListener(cqListener);
hazelcastCQListenerId = getMap(mapName).addEntryListener(entryListener, ((HazelcastQuery) query).getPredicate(), true);
return new ListenerReference(cqListener, entryListener, hazelcastCQListenerId);
}
@Override
public void removeContinuousQuery(String mapName, ContinuousQuery.ListenerReference listenerReference) {
if (((HazelcastContinuousQuery.ListenerReference)listenerReference).listenerId != null) {
getMap(mapName).removeEntryListener(hazelcastCQListenerId);
}
}
protected IMap<Object, Object> getMap(String mapName) {
return service.getMap(mapName);
}
public static class HazelcastContinuousQueryListener implements EntryListener {
private final Listener cqListener;
public HazelcastContinuousQueryListener(Listener cqListener) {
this.cqListener = cqListener;
}
@Override
public void entryAdded(EntryEvent entryEvent) {
cqListener.onEntryJoined(entryEvent.getKey(), entryEvent.getValue());
}
@Override
public void entryRemoved(EntryEvent entryEvent) {
cqListener.onEntryLeft(entryEvent.getKey());
}
@Override
public void entryUpdated(EntryEvent entryEvent) {
//TODO check, if this is correct
cqListener.onEntryJoined(entryEvent.getKey(), entryEvent.getValue());
}
@Override
public void entryEvicted(EntryEvent entryEvent) {
cqListener.onEntryLeft(entryEvent.getKey());
}
@Override
public void mapCleared(MapEvent mapEvent) {
}
@Override
public void mapEvicted(MapEvent mapEvent) {
}
}
private static class ListenerReference implements ContinuousQuery.ListenerReference {
private final Listener listener;
private final EntryListener entryListener;
private final String listenerId;
private ListenerReference(Listener listener, EntryListener entryListener, String listenerId) {
this.listener = listener;
this.entryListener = entryListener;
this.listenerId = listenerId;
}
}
}