77 lines
2.0 KiB
Java
77 lines
2.0 KiB
Java
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;
|
|
}
|
|
}
|
|
}
|