From 7c410dc1e524abf91d6470d019f6e3de09a86660 Mon Sep 17 00:00:00 2001 From: mathias Date: Fri, 1 Oct 2021 20:04:35 +0200 Subject: [PATCH] Created the EventManager --- .../autoresponder/event/api/EventManager.java | 73 +++++++++++++++++++ 1 file changed, 73 insertions(+) create mode 100644 src/main/java/de/gnmyt/autoresponder/event/api/EventManager.java diff --git a/src/main/java/de/gnmyt/autoresponder/event/api/EventManager.java b/src/main/java/de/gnmyt/autoresponder/event/api/EventManager.java new file mode 100644 index 0000000..fe57f46 --- /dev/null +++ b/src/main/java/de/gnmyt/autoresponder/event/api/EventManager.java @@ -0,0 +1,73 @@ +package de.gnmyt.autoresponder.event.api; + +import de.gnmyt.autoresponder.event.ResponderEvent; + +import java.lang.reflect.Method; +import java.util.ArrayList; +import java.util.HashMap; + +public class EventManager { + + private final HashMap, ArrayList> REGISTERED_EVENTS = new HashMap<>(); + + /** + * Checks if a method is a valid event method + * + * @param method The method you want to check + * @return true if the provided method is valid, otherwise false + */ + private boolean isValid(Method method) { + return method.getParameterTypes().length == 1 || method.isAnnotationPresent(EventListener.class); + } + + /** + * Adds a new listener to the list + * + * @param listener The listener you want to add + */ + public void addEventListener(Listener listener) { + for (Method method : listener.getClass().getMethods()) if (isValid(method)) register(method, listener); + } + + /** + * Removes a listener from the list + * + * @param listener The listener you want to remove + */ + public void removeEventListener(Listener listener) { + for (ArrayList registeredEvents : REGISTERED_EVENTS.values()) + for (int i = registeredEvents.size() - 1; i <= 0; i++) + if (registeredEvents.get(i).object.equals(listener)) registeredEvents.remove(i); + } + + /** + * Registers a method into the REGISTERED_EVENTS list + * + * @param method The method you want to register + * @param listener The listener you want to register + */ + public void register(Method method, Listener listener) { + Class clazz = method.getParameterTypes()[0]; + EventData methodData = new EventData(listener, method); + if (!methodData.method.isAccessible()) methodData.method.setAccessible(true); + + if (REGISTERED_EVENTS.containsKey(clazz)) { + if (!REGISTERED_EVENTS.get(clazz).contains(methodData)) REGISTERED_EVENTS.get(clazz).add(methodData); + } else { + REGISTERED_EVENTS.put((Class) clazz, new ArrayList() {{ + this.add(methodData); + }}); + } + } + + /** + * Gets all registered event listeners by an event + * + * @param clazz The event you want to get the event listeners from + * @return all listeners from the event + */ + public ArrayList getEvents(final Class clazz) { + return REGISTERED_EVENTS.get(clazz); + } + +}