TelegramAPI/src/de/mrbesen/telegram/event/EventManager.java

77 lines
2.0 KiB
Java
Raw Normal View History

2018-07-17 19:23:54 +02:00
package de.mrbesen.telegram.event;
import java.lang.reflect.Method;
import java.util.ArrayList;
public class EventManager {
private ArrayList<EventListener> listeners = new ArrayList<EventListener>();
private ArrayList<EventMethod> handler = new ArrayList<EventMethod>();
public EventManager() {
}
@SuppressWarnings("unchecked")
public void registerEvent(EventListener listener) {
if(listener == null) {
throw new NullPointerException();
}
if(listeners.contains(listener)) {
throw new RuntimeException("Listener is allready registered.");
}
listeners.add(listener);
//scanning handler
for(Method met : listener.getClass().getMethods()) {
EventHandler h = met.getAnnotation(EventHandler.class);
if(h != null) {//handler annotation vorhanden
if(met.getParameterCount() == 1) {//only one parameter required
Class<?> parameterclass = met.getParameters()[0].getClass();
if(Event.class.isAssignableFrom(parameterclass) && !parameterclass.equals(Event.class)) {//the needed parameter is a Event-subclass)
handler.add(new EventMethod((Class<? extends Event>) parameterclass, met, listener));
} else {
//warn / error?
}
} else {
//warn?
}
}
}
}
public Event callEvent(Event e) {
for(EventMethod met : handler) {
try {
e = met.callEvent(e);
} catch(Throwable t) {
System.err.println("Error while calling Event " + e.getClass().getSimpleName() + " at " + met.listener.getClass().getSimpleName() + ":" + met.met.getName());
t.printStackTrace();
}
}
return e;
}
private class EventMethod {
private EventListener listener;
private Method met;
private Class<? extends Event> eventtype;
private EventMethod(Class<? extends Event> eventtype, Method m, EventListener list) {
this.met = m;
this.eventtype = eventtype;
this.listener = list;
}
private Event callEvent(Event e) {
if(eventtype.equals(e.getClass())) {
try {
met.invoke(listener, e);
} catch(Throwable t) {
t.printStackTrace();
}
}
return e;
}
}
}