Respect listener-level properties
This commit is contained in:
parent
6c74af608c
commit
2ec0a82a96
@ -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())
|
||||
|
@ -13,14 +13,6 @@ import dev.kske.eventbus.core.Event.USE_PARAMETER;
|
||||
*/
|
||||
final class EventHandler implements Comparable<EventHandler> {
|
||||
|
||||
/**
|
||||
* 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<EventHandler> {
|
||||
/**
|
||||
* 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<EventHandler> {
|
||||
|
||||
// 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<EventHandler> {
|
||||
* @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 {
|
||||
|
@ -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);
|
||||
|
Loading…
Reference in New Issue
Block a user