public SingleArgumentMethodEventListener(Object target, Method method) { this.target = target; this.method = method; //assert that the method is defined as expected: getMethodArgumentType(method); assertPublicMethod(method); }
public boolean accepts(Object event) { return event != null && getEventType().isInstance(event); }
public Class getEventType() { return getMethodArgumentType(getMethod()); }
public void onEvent(Object event) { Set<Object> delivered = new HashSet<Object>(); for (EventListener listener : this.listeners) { Object target = listener; if (listener instanceof SingleArgumentMethodEventListener) { SingleArgumentMethodEventListener singleArgListener = (SingleArgumentMethodEventListener) listener; target = singleArgListener.getTarget(); } if (listener.accepts(event) && !delivered.contains(target)) { try { listener.onEvent(event); } catch (Throwable t) { log.warn(EVENT_LISTENER_ERROR_MSG, t); } delivered.add(target); } } } }
/** * Returns a new collection of {@link EventListener} instances, each instance corresponding to an annotated * method discovered on the specified {@code instance} argument. * * @param instance the instance to inspect for annotated event handler methods. * @return a new collection of {@link EventListener} instances, each instance corresponding to an annotated * method discovered on the specified {@code instance} argument. */ public List<EventListener> getEventListeners(Object instance) { if (instance == null) { return Collections.emptyList(); } List<Method> methods = ClassUtils.getAnnotatedMethods(instance.getClass(), getAnnotationClass()); if (methods == null || methods.isEmpty()) { return Collections.emptyList(); } List<EventListener> listeners = new ArrayList<EventListener>(methods.size()); for (Method m : methods) { listeners.add(new SingleArgumentMethodEventListener(instance, m)); } return listeners; }