package org.limewire.listener;
import java.util.concurrent.TimeUnit;
import java.util.concurrent.TimeoutException;
import org.limewire.concurrent.OnewayExchanger;
/**
* Provides a synchronous way to listen to one time events. Makes mostly
* sense in test scenarios.
*/
public class BlockingEventListener<E> implements EventListener<E> {
private final OnewayExchanger<E, RuntimeException> exchanger = new OnewayExchanger<E, RuntimeException>();
@Override
public void handleEvent(E event) {
exchanger.setValue(event);
}
/**
* Returns last existing event or the next event that is called within the given
* timeout period.
* <p>
* As a side effect the stored event is also cleared.
*
* @return null if an {@link InterruptedException} occurred or the event didn't
* occur within given time out period
*/
public E getEvent(long timeout, TimeUnit units) {
try {
synchronized (exchanger) {
E event = exchanger.get(timeout, units);
exchanger.reset();
return event;
}
} catch (InterruptedException e) {
return null;
} catch (TimeoutException e) {
return null;
}
}
}