/** * Adds a converter. * * @param converter * The converter. */ public final void addConverter(final Converter<?> converter) { Validate.notNull(converter, AbstractDefaultConverterTool.CONVERTER_NULL); final Type converterType = GenericsUtil.getEntityGenericType(converter.getClass(), 0, Converter.class); this.converters.put(GenericsUtil.guessClazz(converterType), converter); }
/** * Handle an event. * * @param event * The event to handle. * @param <T> * The event type. * @throws EventException * Thrown if the event could not be processed. */ public <T> void handleEvent(final T event) throws EventException { final Class<?> type = event.getClass(); if (!this.cachedListeners.containsKey(event.getClass())) { this.cachedListeners.put(type, new LinkedList<ListenerInstancePair<?>>()); for (final ListenerInstancePair<?> listener : this.listeners) { final Type observableType = GenericsUtil.getEntityGenericType(listener.listener.getClass(), 0, Listener.class); final Class<?> observable = GenericsUtil.guessClazz(observableType); if (observable.isAssignableFrom(type)) { this.cachedListeners.get(type).add(listener); } } } @SuppressWarnings("unchecked") final List<ListenerInstancePair<T>> resolvedListeners = List.class.cast(this.cachedListeners.get(event.getClass())); for (final ListenerInstancePair<T> listener : resolvedListeners) { listener.handleEvent(event, null); } }
/** * Adds a listener. * * @param listener * The listener. * @param instance * The instance associated with this listener. * @param <T> * The listener event type. */ public <T> void addListener(final Listener<T> listener, final Object instance) { final ListenerInstancePair<T> pair = new ListenerInstancePair<T>(listener, instance); this.listeners.add(pair); final Type observableType = GenericsUtil.getEntityGenericType(listener.getClass(), 0, Listener.class); final Class<?> observable = GenericsUtil.guessClazz(observableType); if (!this.cachedListeners.containsKey(observable)) { this.cachedListeners.put(observable, new LinkedList<ListenerInstancePair<?>>()); } for (final Map.Entry<Class<?>, List<ListenerInstancePair<?>>> entry : this.cachedListeners.entrySet()) { final Class<?> type = entry.getKey(); if (observable.isAssignableFrom(type)) { entry.getValue().add(pair); } } }
/** * Adds a listener. * * @param listener * The listener. * @param instance * The instance associated with this listener. * @param <T> * The listener event type. */ public <T> void addListenerBefore(final Listener<T> listener, final Object instance) { final ListenerInstancePair<T> pair = new ListenerInstancePair<T>(listener, instance); this.listeners.add(pair); final Type observableType = GenericsUtil.getEntityGenericType(listener.getClass(), 0, Listener.class); final Class<?> observable = GenericsUtil.guessClazz(observableType); if (!this.cachedListeners.containsKey(observable)) { this.cachedListeners.put(observable, new LinkedList<ListenerInstancePair<?>>()); } for (final Map.Entry<Class<?>, List<ListenerInstancePair<?>>> entry : this.cachedListeners.entrySet()) { final Class<?> type = entry.getKey(); if (observable.isAssignableFrom(type)) { entry.getValue().add(0, pair); } } }
/** * Handle an event. * * @param event * The event to handle. * @param instance * The instance. * @param <T> * The event type. * @throws EventException * Thrown if the event could not be processed. */ public <T> void handleEvent(final T event, final Object instance) throws EventException { final Class<?> type = event.getClass(); if (!this.cachedListeners.containsKey(event.getClass())) { this.cachedListeners.put(type, new LinkedList<ListenerInstancePair<?>>()); for (final ListenerInstancePair<?> listener : this.listeners) { final Type observableType = GenericsUtil.getEntityGenericType(listener.listener.getClass(), 0, Listener.class); final Class<?> observable = GenericsUtil.guessClazz(observableType); if (observable.isAssignableFrom(type)) { this.cachedListeners.get(type).add(listener); } } } @SuppressWarnings("unchecked") final List<ListenerInstancePair<T>> resolvedListeners = List.class.cast(this.cachedListeners.get(event.getClass())); for (final ListenerInstancePair<T> listener : resolvedListeners) { listener.handleEvent(event, instance); } }
final Type registryTypeTmp = GenericsUtil.getEntityGenericType(registryInstance.getClass(), 0, Registry.class); if (registryTypeTmp instanceof Class) { ctx.setRegistryType((Class<N>) registryTypeTmp);