From 002180ed3b37162c527358bd7bfc86b8d274ad5c Mon Sep 17 00:00:00 2001 From: kske Date: Mon, 15 Feb 2021 14:43:34 +0100 Subject: [PATCH] Remove EventListener and IEvent marker interfaces This allows Event Bus to interface with existing classes without modification. --- README.md | 13 +++---- .../dev/kske/eventbus/ap/EventProcessor.java | 13 +------ .../java/dev/kske/eventbus/core/Event.java | 7 ++-- .../java/dev/kske/eventbus/core/EventBus.java | 16 ++++----- .../dev/kske/eventbus/core/EventHandler.java | 34 +++++++------------ .../dev/kske/eventbus/core/EventListener.java | 12 ------- .../java/dev/kske/eventbus/core/IEvent.java | 12 ------- .../dev/kske/eventbus/core/CancelTest.java | 2 +- .../dev/kske/eventbus/core/DispatchTest.java | 4 +-- .../dev/kske/eventbus/core/SimpleEvent.java | 2 +- 10 files changed, 33 insertions(+), 82 deletions(-) delete mode 100644 event-bus-core/src/main/java/dev/kske/eventbus/core/EventListener.java delete mode 100644 event-bus-core/src/main/java/dev/kske/eventbus/core/IEvent.java diff --git a/README.md b/README.md index c6e2888..8666ba8 100644 --- a/README.md +++ b/README.md @@ -3,7 +3,7 @@ ## Introduction This library allows passing events between different objects without them having a direct reference to each other. -Any class can be made an event by implementing the `IEvent` interface. +Any object can serve as an event. Using an instance of the `EventBus` class, an instant of the event class can be dispatched. This means that it will be forwarded to all listeners registered for it at the event bus. @@ -13,16 +13,13 @@ In addition, a singleton instance of the event bus is provided by the `EventBus# To listen to events, register event handling methods using the `Event` annotation. For this to work, the method must have a return type of `void` and declare a single parameter of the desired event type. Alternatively, a parameter-less event handler can be declared as shown [below](#parameter-less-event-handlers). -Additionally, the class containing the method must implement the `EventListener` interface. ## A Simple Example -Lets look at a simple example: we declare the empty class `SimpleEvent` that implements `IEvent` and can thus be used as an event. +Lets look at a simple example: we declare the empty class `SimpleEvent` whose objects can be used as events. ```java -import dev.kske.eventbus.core.IEvent; - -public class SimpleEvent implements IEvent {} +public class SimpleEvent {} ``` Next, an event listener for the `SimpleEvent` is declared: @@ -30,7 +27,7 @@ Next, an event listener for the `SimpleEvent` is declared: ```java import dev.kske.eventbus.core.*; -public class SimpleEventListener implements EventListener { +public class SimpleEventListener { public SimpleEventListener() { @@ -165,7 +162,7 @@ opens my.module to dev.kske.eventbus.core; To assist you with writing event listeners, the Event Bus AP (Annotation Processor) module enforces correct usage of the `@Event` annotation during compile time. This reduces difficult-to-debug bugs that occur during runtime to compile-time errors which can be easily fixed. -The event annotation processor detects invalid event handlers, missing `EventListener` implementations, event type issues with more to come in future versions. +The event annotation processor detects invalid event handlers and event type issues with more to come in future versions. When using Maven, it can be registered using the Maven Compiler Plugin: diff --git a/event-bus-ap/src/main/java/dev/kske/eventbus/ap/EventProcessor.java b/event-bus-ap/src/main/java/dev/kske/eventbus/ap/EventProcessor.java index c05f15f..f6cc75d 100644 --- a/event-bus-ap/src/main/java/dev/kske/eventbus/ap/EventProcessor.java +++ b/event-bus-ap/src/main/java/dev/kske/eventbus/ap/EventProcessor.java @@ -34,8 +34,7 @@ public class EventProcessor extends AbstractProcessor { private void processRound(Set eventHandlers) { for (ExecutableElement eventHandler : eventHandlers) { - TypeElement eventListener = (TypeElement) eventHandler.getEnclosingElement(); - Event eventAnnotation = eventHandler.getAnnotation(Event.class); + Event eventAnnotation = eventHandler.getAnnotation(Event.class); // Determine how the event type is defined boolean useParameter; @@ -68,11 +67,6 @@ public class EventProcessor extends AbstractProcessor { var paramElement = eventHandler.getParameters().get(0); var paramType = paramElement.asType(); - // Check for valid event type - if (useParameter && !processingEnv.getTypeUtils().isAssignable(paramType, - getTypeMirror(IEvent.class))) - error(paramElement, "Parameter must implement IEvent"); - // Check for handlers for abstract types that aren't polymorphic if (eventHandler.getAnnotation(Polymorphic.class) == null && paramType.getKind() == TypeKind.DECLARED) { @@ -82,11 +76,6 @@ public class EventProcessor extends AbstractProcessor { warning(paramElement, "Parameter should be instantiable or handler should use @Polymorphic"); } - - // Check listener for interface implementation - if (!eventListener.getInterfaces().contains(getTypeMirror(EventListener.class))) - warning(eventHandler.getEnclosingElement(), - "Class should implement EventListener interface"); } } diff --git a/event-bus-core/src/main/java/dev/kske/eventbus/core/Event.java b/event-bus-core/src/main/java/dev/kske/eventbus/core/Event.java index 7a6b837..743c803 100644 --- a/event-bus-core/src/main/java/dev/kske/eventbus/core/Event.java +++ b/event-bus-core/src/main/java/dev/kske/eventbus/core/Event.java @@ -9,10 +9,9 @@ import java.lang.annotation.*; * Indicates that a method is an event handler. To be successfully used as such, the method has to * comply with the following specifications: *