final AtomicReference<CountDownLatch> hasEvents = new AtomicReference<CountDownLatch>(new CountDownLatch(1));
final AtomicReference<CountDownLatch> waitForRemove = new AtomicReference<CountDownLatch>(new CountDownLatch(1));
final Session observingSession = createAdminSession();
try {
final ObservationManager obsMgr = observingSession.getWorkspace().getObservationManager();
final EventListener listener = new EventListener() {
@Override
public void onEvent(EventIterator events) {
while (events.hasNext()) {
events.next();
hasEvents.get().countDown();
try {
// After receiving an event wait until event listener is removed
waitForRemove.get().await();
}
catch (InterruptedException e) {
Thread.currentThread().interrupt();
}
}
}
};
obsMgr.addEventListener(listener, Event.NODE_ADDED | Event.NODE_REMOVED | Event.NODE_MOVED |
Event.PROPERTY_ADDED | Event.PROPERTY_REMOVED | Event.PROPERTY_CHANGED | Event.PERSIST,
"/", true, null, null, false);
// Generate two events
Node n = getNode(TEST_PATH);
n.setProperty("prop1", "val1");
n.setProperty("prop2", "val2");
n.getSession().save();
// Make sure we see the first event
assertTrue(hasEvents.get().await(2, TimeUnit.SECONDS));
// Remove event listener before it receives the second event
Executors.newSingleThreadExecutor().submit(new Callable<Void>() {
@Override
public Void call() throws Exception {
obsMgr.removeEventListener(listener);
return null;
}
}).get(2, TimeUnit.SECONDS);
hasEvents.set(new CountDownLatch(1));
waitForRemove.get().countDown();