From 2ec0a82a96284de20a16a77a8f4d0d64f0cdd4ea Mon Sep 17 00:00:00 2001 From: kske Date: Sun, 14 Mar 2021 11:18:11 +0100 Subject: [PATCH] Respect listener-level properties --- .../java/dev/kske/eventbus/core/EventBus.java | 20 +++++++++++++- .../dev/kske/eventbus/core/EventHandler.java | 26 +++++++++---------- .../dev/kske/eventbus/core/DispatchTest.java | 7 +++-- 3 files changed, 36 insertions(+), 17 deletions(-) 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 a719135..f3e5ba9 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 @@ -30,6 +30,14 @@ public final class EventBus { boolean isDispatching, isCancelled; } + /** + * The priority assigned to every event handler without an explicitly defined priority. + * + * @since 1.1.0 + * @see Priority + */ + public static final int DEFAULT_PRIORITY = 100; + private static volatile EventBus singletonInstance; private static final Logger logger = System.getLogger(EventBus.class.getName()); @@ -165,6 +173,16 @@ public final class EventBus { logger.log(Level.INFO, "Registering event listener {0}", listener.getClass().getName()); boolean handlerBound = false; + // Predefined handler polymorphism + boolean polymorphic = false; + if (listener.getClass().isAnnotationPresent(Polymorphic.class)) + polymorphic = listener.getClass().getAnnotation(Polymorphic.class).value(); + + // Predefined handler priority + int priority = 100; + if (listener.getClass().isAnnotationPresent(Priority.class)) + priority = listener.getClass().getAnnotation(Priority.class).value(); + registeredListeners.add(listener); for (var method : listener.getClass().getDeclaredMethods()) { Event annotation = method.getAnnotation(Event.class); @@ -174,7 +192,7 @@ public final class EventBus { continue; // Initialize and bind the handler - var handler = new EventHandler(listener, method, annotation); + var handler = new EventHandler(listener, method, annotation, polymorphic, priority); bindings.putIfAbsent(handler.getEventType(), new TreeSet<>()); logger.log(Level.DEBUG, "Binding event handler {0}", handler); bindings.get(handler.getEventType()) diff --git a/event-bus-core/src/main/java/dev/kske/eventbus/core/EventHandler.java b/event-bus-core/src/main/java/dev/kske/eventbus/core/EventHandler.java index 60e7e85..f22ddf0 100644 --- a/event-bus-core/src/main/java/dev/kske/eventbus/core/EventHandler.java +++ b/event-bus-core/src/main/java/dev/kske/eventbus/core/EventHandler.java @@ -13,14 +13,6 @@ import dev.kske.eventbus.core.Event.USE_PARAMETER; */ final class EventHandler implements Comparable { - /** - * The priority assigned to every event handler without an explicitly defined priority. - * - * @since 1.0.0 - * @see Priority - */ - public static final int DEFAULT_PRIORITY = 100; - private final Object listener; private final Method method; private final Class eventType; @@ -31,14 +23,17 @@ final class EventHandler implements Comparable { /** * Constructs an event handler. * - * @param listener the listener containing the handler - * @param method the handler method - * @param annotation the event annotation + * @param listener the listener containing the handler + * @param method the handler method + * @param annotation the event annotation + * @param defPolymorphism the predefined polymorphism (default or listener-level) + * @param defPriority the predefined priority (default or listener-level) * @throws EventBusException if the method or the annotation do not comply with the * specification * @since 0.0.1 */ - EventHandler(Object listener, Method method, Event annotation) throws EventBusException { + EventHandler(Object listener, Method method, Event annotation, boolean defPolymorphism, + int defPriority) throws EventBusException { this.listener = listener; this.method = method; useParameter = annotation.value() == USE_PARAMETER.class; @@ -55,10 +50,12 @@ final class EventHandler implements Comparable { // Determine handler properties eventType = useParameter ? method.getParameterTypes()[0] : annotation.value(); - polymorphic = method.isAnnotationPresent(Polymorphic.class); + polymorphic = method.isAnnotationPresent(Polymorphic.class) + ? method.getAnnotation(Polymorphic.class).value() + : defPolymorphism; priority = method.isAnnotationPresent(Priority.class) ? method.getAnnotation(Priority.class).value() - : DEFAULT_PRIORITY; + : defPriority; // Allow access if the method is non-public method.setAccessible(true); @@ -94,6 +91,7 @@ final class EventHandler implements Comparable { * @throws EventBusException if the event handler isn't accessible or has an invalid * signature * @throws InvocationTargetException if the handler throws an exception + * @throws EventBusException if the handler has the wrong signature or is inaccessible * @since 0.0.1 */ void execute(Object event) throws EventBusException, InvocationTargetException { 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 f8a5f90..5149ae1 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 @@ -10,6 +10,8 @@ import org.junit.jupiter.api.*; * @author Kai S. K. Engelbart * @since 0.0.1 */ +@Polymorphic +@Priority(150) class DispatchTest { EventBus bus; @@ -40,20 +42,21 @@ class DispatchTest { @Event(SimpleEvent.class) @Priority(200) - @Polymorphic void onSimpleEventFirst() { ++hits; assertTrue(hits == 1 || hits == 2); } @Event(SimpleEvent.class) - @Priority(150) + @Polymorphic(false) static void onSimpleEventSecond() { ++hits; assertEquals(3, hits); } @Event + @Polymorphic(false) + @Priority(100) void onSimpleEventThird(SimpleEvent event) { ++hits; assertEquals(4, hits);