@Override public void addEventListener(EventType eventType, Consumer<PrimitiveEvent> listener) { eventListeners.computeIfAbsent(eventType.canonicalize(), t -> Sets.newLinkedHashSet()).add(listener); }
/** * Returns an identical event type in canonical form. * * @return an identical event type in canonical form */ default EventType canonicalize() { return canonical(this); } }
/** * Recursively finds events defined by the given type and its implemented interfaces. * * @param type the type for which to find events * @return the events defined by the given type and its parent interfaces */ private static Map<Method, EventType> findMethods(Class<?> type) { Map<Method, EventType> events = new HashMap<>(); for (Method method : type.getDeclaredMethods()) { Event event = method.getAnnotation(Event.class); if (event != null) { String name = event.value().equals("") ? method.getName() : event.value(); events.put(method, EventType.from(name)); } } for (Class<?> iface : type.getInterfaces()) { events.putAll(findMethods(iface)); } return events; }
/** * Simplifies the given event type. * * @param eventType the event type to simplify * @return the simplified event type */ static EventType canonical(EventType eventType) { return new DefaultEventType(eventType.id()); }
/** * Recursively finds events defined by the given type and its implemented interfaces. * * @param type the type for which to find events * @return the events defined by the given type and its parent interfaces */ private static Map<EventType, Method> findEvents(Class<?> type) { Map<EventType, Method> events = new HashMap<>(); for (Method method : type.getDeclaredMethods()) { Event event = method.getAnnotation(Event.class); if (event != null) { String name = event.value().equals("") ? method.getName() : event.value(); events.put(EventType.from(name), method); } } for (Class<?> iface : type.getInterfaces()) { events.putAll(findEvents(iface)); } return events; }
@Override public void removeEventListener(EventType eventType, Consumer<PrimitiveEvent> listener) { eventListeners.computeIfAbsent(eventType.canonicalize(), t -> Sets.newLinkedHashSet()).remove(listener); }
/** * Creates a new primitive event. * * @param eventType the event type * @param value the event value * @return the primitive event */ public static PrimitiveEvent event(EventType eventType, byte[] value) { return new PrimitiveEvent(EventType.canonical(eventType), value); }
/** * Removes an event listener from the session. * * @param listener the event listener callback */ public void removeEventListener(EventType eventType, Consumer<PrimitiveEvent> listener) { executor.execute(() -> eventListeners.computeIfAbsent(eventType.canonicalize(), e -> Sets.newLinkedHashSet()).remove(listener)); }
/** * Adds an event listener to the session. * * @param listener the event listener callback */ public void addEventListener(EventType eventType, Consumer<PrimitiveEvent> listener) { executor.execute(() -> eventListeners.computeIfAbsent(eventType.canonicalize(), e -> Sets.newLinkedHashSet()).add(listener)); }
@Override public synchronized void addEventListener(EventType eventType, Consumer<PrimitiveEvent> consumer) { eventListeners.put(eventType.canonicalize(), consumer); SessionClient proxy = this.session; if (proxy != null) { proxy.addEventListener(eventType, consumer); } }
@Override public synchronized void removeEventListener(EventType eventType, Consumer<PrimitiveEvent> consumer) { eventListeners.remove(eventType.canonicalize(), consumer); SessionClient proxy = this.session; if (proxy != null) { proxy.removeEventListener(eventType, consumer); } }