add event listener and future completion to generic event manager
parent
3145720f40
commit
ef0a26bbd1
@ -1,5 +1,5 @@
|
||||
group = org.xbib
|
||||
name = event
|
||||
version = 0.0.7
|
||||
version = 0.0.8
|
||||
|
||||
org.gradle.warning.mode = ALL
|
||||
|
Binary file not shown.
@ -1,6 +1,4 @@
|
||||
package org.xbib.event;
|
||||
|
||||
import java.io.Closeable;
|
||||
|
||||
public interface EventConsumer extends Closeable {
|
||||
public interface EventConsumer {
|
||||
}
|
||||
|
@ -0,0 +1,37 @@
|
||||
package org.xbib.event.bus;
|
||||
|
||||
import java.lang.reflect.Method;
|
||||
import java.util.logging.Level;
|
||||
import java.util.logging.Logger;
|
||||
|
||||
/**
|
||||
* Simple logging handler for subscriber exceptions.
|
||||
*/
|
||||
final class LoggingHandler implements SubscriberExceptionHandler {
|
||||
static final LoggingHandler INSTANCE = new LoggingHandler();
|
||||
|
||||
@Override
|
||||
public void handleException(Throwable exception, SubscriberExceptionContext context) {
|
||||
Logger logger = logger(context);
|
||||
if (logger.isLoggable(Level.SEVERE)) {
|
||||
logger.log(Level.SEVERE, message(context), exception);
|
||||
}
|
||||
}
|
||||
|
||||
private static Logger logger(SubscriberExceptionContext context) {
|
||||
return Logger.getLogger(EventBus.class.getName() + "." + context.getEventBus().identifier());
|
||||
}
|
||||
|
||||
private static String message(SubscriberExceptionContext context) {
|
||||
Method method = context.getSubscriberMethod();
|
||||
return "Exception thrown by subscriber method "
|
||||
+ method.getName()
|
||||
+ '('
|
||||
+ method.getParameterTypes()[0].getName()
|
||||
+ ')'
|
||||
+ " on subscriber "
|
||||
+ context.getSubscriber()
|
||||
+ " when dispatching event: "
|
||||
+ context.getEvent();
|
||||
}
|
||||
}
|
@ -0,0 +1,31 @@
|
||||
package org.xbib.event.generic;
|
||||
|
||||
import org.xbib.event.DefaultEvent;
|
||||
|
||||
public class DefaultGenericEvent extends DefaultEvent implements GenericEvent {
|
||||
|
||||
private Listener listener;
|
||||
|
||||
public DefaultGenericEvent() {
|
||||
this(null);
|
||||
}
|
||||
|
||||
public DefaultGenericEvent(Listener listener) {
|
||||
this.listener = listener;
|
||||
}
|
||||
|
||||
public DefaultGenericEvent setListener(Listener listener) {
|
||||
this.listener = listener;
|
||||
return this;
|
||||
}
|
||||
|
||||
public Listener getListener() {
|
||||
return listener;
|
||||
}
|
||||
|
||||
public void received() {
|
||||
if (listener != null) {
|
||||
listener.listen(this);
|
||||
}
|
||||
}
|
||||
}
|
@ -0,0 +1,6 @@
|
||||
package org.xbib.event.generic;
|
||||
|
||||
import org.xbib.event.Event;
|
||||
|
||||
public interface GenericEvent extends Event {
|
||||
}
|
@ -0,0 +1,7 @@
|
||||
package org.xbib.event.generic;
|
||||
|
||||
@FunctionalInterface
|
||||
public interface Listener {
|
||||
|
||||
void listen(GenericEvent event);
|
||||
}
|
@ -0,0 +1,80 @@
|
||||
package org.xbib.event;
|
||||
|
||||
import org.junit.jupiter.api.Test;
|
||||
import org.xbib.event.bus.Subscribe;
|
||||
import org.xbib.event.generic.DefaultGenericEvent;
|
||||
import org.xbib.event.generic.GenericEvent;
|
||||
import org.xbib.settings.Settings;
|
||||
|
||||
import java.util.concurrent.CompletableFuture;
|
||||
import java.util.concurrent.ExecutionException;
|
||||
import java.util.logging.Level;
|
||||
import java.util.logging.Logger;
|
||||
|
||||
public class EventManagerTest {
|
||||
|
||||
private static final Logger logger = Logger.getLogger(EventManagerTest.class.getName());
|
||||
|
||||
@Test
|
||||
void testGenericEvents() {
|
||||
Settings settings = Settings.settingsBuilder()
|
||||
.build();
|
||||
TestEventConsumer consumer = new TestEventConsumer();
|
||||
EventManager eventManager = EventManager.builder(settings)
|
||||
.register(consumer)
|
||||
.build();
|
||||
eventManager.getGenericEventManager().post(new DefaultGenericEvent(e -> {
|
||||
logger.log(Level.INFO, "received event " + e);
|
||||
}));
|
||||
}
|
||||
|
||||
|
||||
@Test
|
||||
void testGenericEventWithWaitForSubscriber() throws InterruptedException, ExecutionException {
|
||||
Settings settings = Settings.settingsBuilder()
|
||||
.build();
|
||||
TestEventConsumer consumer = new TestEventConsumer();
|
||||
EventManager eventManager = EventManager.builder(settings)
|
||||
.register(consumer)
|
||||
.build();
|
||||
CompletableFuture<GenericEvent> future = new CompletableFuture<>();
|
||||
eventManager.getGenericEventManager().post(new DefaultGenericEvent(e -> {
|
||||
logger.log(Level.INFO, "received event " + e);
|
||||
future.complete(e);
|
||||
}));
|
||||
GenericEvent e = future.get();
|
||||
logger.log(Level.INFO, "the event was received with result " + e + ", continuing");
|
||||
}
|
||||
|
||||
@Test
|
||||
void testGenericEventWithWaitForAllConsumers() throws ExecutionException, InterruptedException {
|
||||
Settings settings = Settings.settingsBuilder()
|
||||
.build();
|
||||
TestEventConsumer consumer1 = new TestEventConsumer();
|
||||
TestEventConsumer consumer2 = new TestEventConsumer();
|
||||
EventManager eventManager = EventManager.builder(settings)
|
||||
.register(consumer1)
|
||||
.register(consumer2)
|
||||
.loadEventConsumers()
|
||||
.build();
|
||||
CompletableFuture<Boolean> future = new CompletableFuture<>();
|
||||
eventManager.getGenericEventManager().post(new DefaultGenericEvent(e -> {
|
||||
logger.log(Level.INFO, "received event " + e);
|
||||
}), future);
|
||||
Boolean b = future.get();
|
||||
if (b != null && b) {
|
||||
logger.log(Level.INFO, "the event was received by all consumers, continuing");
|
||||
}
|
||||
}
|
||||
|
||||
private static class TestEventConsumer implements EventConsumer {
|
||||
|
||||
TestEventConsumer() {
|
||||
}
|
||||
|
||||
@Subscribe
|
||||
public void onEvent(DefaultGenericEvent event) {
|
||||
event.received();
|
||||
}
|
||||
}
|
||||
}
|
Loading…
Reference in New Issue