diff --git a/event-bus-core/src/main/java/dev/kske/eventbus/core/DeadEvent.java b/event-bus-core/src/main/java/dev/kske/eventbus/core/DeadEvent.java new file mode 100644 index 0000000..ad0feb8 --- /dev/null +++ b/event-bus-core/src/main/java/dev/kske/eventbus/core/DeadEvent.java @@ -0,0 +1,37 @@ +package dev.kske.eventbus.core; + +/** + * Wraps an event that was dispatched but for which no handler has been bound. + *
+ * Handling dead events is useful as it can identify a poorly configured event distribution.
+ *
+ * @author Kai S. K. Engelbart
+ * @since 1.1.0
+ */
+public final class DeadEvent {
+
+ private final EventBus eventBus;
+ private final Object event;
+
+ DeadEvent(EventBus eventBus, Object event) {
+ this.eventBus = eventBus;
+ this.event = event;
+ }
+
+ @Override
+ public String toString() {
+ return String.format("DeadEvent[eventBus=%s, event=%s]", eventBus, event);
+ }
+
+ /**
+ * @return the event bus that dispatched this event
+ * @since 1.1.0
+ */
+ public EventBus getEventBus() { return eventBus; }
+
+ /**
+ * @return the event that could not be delivered
+ * @since 1.1.0
+ */
+ public Object getEvent() { return event; }
+}
diff --git a/event-bus-core/src/main/java/dev/kske/eventbus/core/EventBus.java b/event-bus-core/src/main/java/dev/kske/eventbus/core/EventBus.java
index 8f30e89..88317c6 100644
--- a/event-bus-core/src/main/java/dev/kske/eventbus/core/EventBus.java
+++ b/event-bus-core/src/main/java/dev/kske/eventbus/core/EventBus.java
@@ -73,14 +73,25 @@ public final class EventBus {
var state = dispatchState.get();
state.isDispatching = true;
- for (var handler : getHandlersFor(event.getClass()))
- if (state.isCancelled) {
- logger.log(Level.INFO, "Cancelled dispatching event {0}", event);
- state.isCancelled = false;
- break;
- } else {
- handler.execute(event);
- }
+ Iterator
- * This is used to retrieve event handlers in order of descending priority from a tree set.
+ * This is used to retrieve event handlers in descending order of priority from a tree set.
*
* @since 0.0.1
*/
diff --git a/event-bus-core/src/test/java/dev/kske/eventbus/core/DeadTest.java b/event-bus-core/src/test/java/dev/kske/eventbus/core/DeadTest.java
new file mode 100644
index 0000000..50e1986
--- /dev/null
+++ b/event-bus-core/src/test/java/dev/kske/eventbus/core/DeadTest.java
@@ -0,0 +1,49 @@
+package dev.kske.eventbus.core;
+
+import static org.junit.jupiter.api.Assertions.*;
+
+import org.junit.jupiter.api.Test;
+
+/**
+ * Tests the dispatching of a dead event if an event could not be delivered.
+ *
+ * @author Kai S. K. Engelbart
+ * @since 1.1.0
+ */
+class DeadTest {
+
+ EventBus bus = new EventBus();
+ String event = "This event has no handler";
+ boolean deadEventHandled;
+
+ /**
+ * Tests dead event delivery.
+ *
+ * @since 1.1.0
+ */
+ @Test
+ void testDeadEvent() {
+ bus.registerListener(this);
+ bus.dispatch(event);
+ assertTrue(deadEventHandled);
+ bus.removeListener(this);
+ }
+
+ /**
+ * Tests how the event bus reacts to an unhandled dead event. This should not lead to an
+ * exception or endless recursion and instead be logged.
+ *
+ * @since 1.1.0
+ */
+ @Test
+ void testUnhandledDeadEvent() {
+ bus.dispatch(event);
+ }
+
+ @Event
+ void onDeadEvent(DeadEvent deadEvent) {
+ assertEquals(bus, deadEvent.getEventBus());
+ assertEquals(event, deadEvent.getEvent());
+ deadEventHandled = true;
+ }
+}
diff --git a/event-bus-core/src/test/java/dev/kske/eventbus/core/DispatchTest.java b/event-bus-core/src/test/java/dev/kske/eventbus/core/DispatchTest.java
index 95bae3f..f8a5f90 100644
--- a/event-bus-core/src/test/java/dev/kske/eventbus/core/DispatchTest.java
+++ b/event-bus-core/src/test/java/dev/kske/eventbus/core/DispatchTest.java
@@ -27,8 +27,8 @@ class DispatchTest {
}
/**
- * Tests {@link EventBus#dispatch(Object)} with multiple handler priorities, a subtype handler
- * and a static handler.
+ * Tests {@link EventBus#dispatch(Object)} with multiple handler priorities, a polymorphic
+ * handler and a static handler.
*
* @since 0.0.1
*/