package de.mrbesen.telegram.event; import java.lang.reflect.Method; import java.util.ArrayList; public class EventManager { private ArrayList listeners = new ArrayList(); private ArrayList handler = new ArrayList(); 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) 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 eventtype; private EventMethod(Class 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; } } }