@Override public <T> Set<ObserverMethod<? super T>> resolveObserverMethods(T event, Annotation... bindings) { return globalStrictObserverNotifier.<T> resolveObserverMethods(event.getClass(), bindings).getAllObservers(); }
/** * Delivers the given synchronous event object to synchronous and transactional observer methods. Event metadata is made available for injection into * observer methods, if needed. Asynchronous observer methods are ignored. * * @param observers the given observer methods * @param event the given event object * @param metadata event metadata */ public <T> void notify(ResolvedObservers<T> observers, T event, EventMetadata metadata) { if (!observers.isMetadataRequired()) { metadata = null; } notifySyncObservers(observers.getImmediateSyncObservers(), event, metadata, ObserverExceptionHandler.IMMEDIATE_HANDLER); notifyTransactionObservers(observers.getTransactionObservers(), event, metadata, ObserverExceptionHandler.IMMEDIATE_HANDLER); }
/** * Delivers the given event object to given observer methods. Event metadata is made available for injection into observer methods, if needed. * * @param observers the given observer methods * @param event the given event object * @param metadata event metadata */ public <T> void notify(ResolvedObservers<T> observers, T event, EventMetadata metadata) { if (!observers.isMetadataRequired()) { metadata = null; } notifySyncObservers(observers.getImmediateObservers(), event, metadata); notifyTransactionObservers(observers.getTransactionObservers(), event, metadata); }
/** * Delivers the given asynchronous event object to given observer asynchronous observer methods. * * Asynchronous observer methods are scheduled to be notified in a separate thread. Note that this method exits just after event delivery to asynchronous * observer methods is scheduled. {@link EventMetadata} is made available for injection into observer methods, if needed. * * Note that if any of the observer methods throws an exception, it is never thrown out of this method. Instead, all the exceptions are grouped together * using {@link CompletionException} and the returned {@link CompletionStage} fails with this compound exception. * * If an executor is provided then observer methods are notified using this executor. Otherwise, Weld's task executor is used. * * @param observers the given observer methods * @param event the given event object * @param metadata event metadata * @param options */ public <T, U extends T> CompletionStage<U> notifyAsync(ResolvedObservers<T> observers, U event, EventMetadata metadata, NotificationOptions options) { if (!observers.isMetadataRequired()) { metadata = null; } return notifyAsyncObservers(observers.getAsyncObservers(), event, metadata, options.getExecutor(), options); }
private <T> void addContainerLifecycleEvent(T event, Object info, BeanManagerImpl beanManagerImpl) { ResolvedObservers<?> resolvedObservers = null; Type eventType = null; if (event instanceof AbstractContainerEvent) { AbstractContainerEvent containerEvent = (AbstractContainerEvent) event; eventType = containerEvent.getEventType(); resolvedObservers = beanManagerImpl.getGlobalLenientObserverNotifier().resolveObserverMethods(eventType); } else if (event instanceof ProcessAnnotatedTypeImpl) { ProcessAnnotatedTypeImpl<?> processAnnotatedTypeEvent = (ProcessAnnotatedTypeImpl<?>) event; eventType = ProcessAnnotatedType.class; info = Formats.formatType(processAnnotatedTypeEvent.getOriginalAnnotatedType().getBaseType(), false); resolvedObservers = beanManagerImpl.getGlobalLenientObserverNotifier().resolveObserverMethods( ProcessAnnotatedTypeEventResolvable.of(processAnnotatedTypeEvent, beanManagerImpl.getServices().get(RequiredAnnotationDiscovery.class))); } if (resolvedObservers != null && eventType != null) { Iterable<ObserverMethod<?>> observerMethods = Reflections.cast(resolvedObservers.getAllObservers()); probe.addEvent(new EventInfo(eventType, Collections.<Annotation> emptySet(), info, null, observerMethods, true, System.currentTimeMillis(), false)); } }
/** * Constructs a new FastEvent instance * @param type the event type * @param manager the bean manager * @param notifier the notifier to be used for observer method resolution * @param qualifiers the event qualifiers * @return */ public static <T> FastEvent<T> of(Class<T> type, BeanManagerImpl manager, ObserverNotifier notifier, Annotation... qualifiers) { ResolvedObservers<T> resolvedObserverMethods = notifier.<T> resolveObserverMethods(type, qualifiers); if (resolvedObserverMethods.isMetadataRequired()) { EventMetadata metadata = new EventMetadataImpl(type, null, qualifiers); CurrentEventMetadata metadataService = manager.getServices().get(CurrentEventMetadata.class); return new FastEventWithMetadataPropagation<T>(resolvedObserverMethods, metadata, metadataService); } else { return new FastEvent<T>(resolvedObserverMethods); } }
private List<ObserverMethod<?>> resolveObservers(EventMetadata metadata, boolean containerEvent) { List<ObserverMethod<?>> observers = new ArrayList<ObserverMethod<?>>(); final ObserverNotifier notifier = (containerEvent) ? manager.getAccessibleLenientObserverNotifier() : manager.getGlobalLenientObserverNotifier(); ResolvedObservers<?> resolvedObservers = notifier.resolveObserverMethods(metadata.getType(), metadata.getQualifiers()); for (ObserverMethod<?> observer : resolvedObservers.getAllObservers()) { // do not show ProbeObserver if (getBeanClass() != observer.getBeanClass()) { observers.add(observer); } } return ImmutableList.copyOf(observers); }
public void fire(T event) { for (ObserverMethod<? super T> observer : resolvedObserverMethods.getImmediateSyncObservers()) { observer.notify(event); } }
@SuppressWarnings("unchecked") public static <T> ResolvedObservers<T> of(List<ObserverMethod<? super T>> observers) { if (observers.isEmpty()) { return (ResolvedObservers<T>) EMPTY; } boolean metadataRequired = false; List<ObserverMethod<? super T>> immediateSyncObservers = new ArrayList<ObserverMethod<? super T>>(); List<ObserverMethod<? super T>> transactionObservers = new ArrayList<ObserverMethod<? super T>>(); List<ObserverMethod<? super T>> asyncObservers = new ArrayList<ObserverMethod<? super T>>(); for (ObserverMethod<? super T> observer : observers) { if(observer.isAsync()) { asyncObservers.add(observer); } else if (TransactionPhase.IN_PROGRESS == observer.getTransactionPhase()) { immediateSyncObservers.add(observer); } else { transactionObservers.add(observer); } if (!metadataRequired && Observers.isEventMetadataRequired(observer)) { metadataRequired = true; } } return new ResolvedObservers<>(copyOf(immediateSyncObservers), copyOf(asyncObservers), copyOf(transactionObservers), metadataRequired); }
@SuppressWarnings("unchecked") public static <T> ResolvedObservers<T> of(Set<ObserverMethod<? super T>> observers) { if (observers.isEmpty()) { return (ResolvedObservers<T>) EMPTY; } boolean metadataRequired = false; List<ObserverMethod<? super T>> immediateObservers = new ArrayList<ObserverMethod<? super T>>(); List<ObserverMethod<? super T>> transactionObservers = new ArrayList<ObserverMethod<? super T>>(); for (ObserverMethod<? super T> observer : observers) { if (TransactionPhase.IN_PROGRESS == observer.getTransactionPhase()) { immediateObservers.add(observer); } else { transactionObservers.add(observer); } if (!metadataRequired && Observers.isEventMetadataRequired(observer)) { metadataRequired = true; } } return new ResolvedObservers<T>(ImmutableList.copyOf(immediateObservers), ImmutableList.copyOf(transactionObservers), metadataRequired); }
@Override public void fire(T event) { final ThreadLocalStackReference<EventMetadata> stack = metadataService.pushIfNotNull(metadata); try { for (ObserverMethod<? super T> observer : resolvedObserverMethods.getImmediateSyncObservers()) { Observers.notify(observer, event, metadata); } } finally { stack.pop(); } } }
private <T> void addContainerLifecycleEvent(T event, Object info, BeanManagerImpl beanManagerImpl) { ResolvedObservers<?> resolvedObservers = null; Type eventType = null; if (event instanceof AbstractContainerEvent) { AbstractContainerEvent containerEvent = (AbstractContainerEvent) event; eventType = containerEvent.getEventType(); resolvedObservers = beanManagerImpl.getGlobalLenientObserverNotifier().resolveObserverMethods(eventType); } else if (event instanceof ProcessAnnotatedTypeImpl) { ProcessAnnotatedTypeImpl<?> processAnnotatedTypeEvent = (ProcessAnnotatedTypeImpl<?>) event; eventType = ProcessAnnotatedType.class; info = Formats.formatType(processAnnotatedTypeEvent.getOriginalAnnotatedType().getBaseType(), false); resolvedObservers = beanManagerImpl.getGlobalLenientObserverNotifier().resolveObserverMethods( ProcessAnnotatedTypeEventResolvable.of(processAnnotatedTypeEvent, beanManagerImpl.getServices().get(RequiredAnnotationDiscovery.class))); } if (resolvedObservers != null && eventType != null) { probe.addEvent(new EventInfo(eventType, Collections.emptySet(), info, null, Reflections.cast(resolvedObservers.getAllObservers()), true, System.currentTimeMillis(), false)); } }
/** * Constructs a new FastEvent instance * @param type the event type * @param manager the bean manager * @param notifier the notifier to be used for observer method resolution * @param qualifiers the event qualifiers * @return */ public static <T> FastEvent<T> of(Class<T> type, BeanManagerImpl manager, ObserverNotifier notifier, Annotation... qualifiers) { ResolvedObservers<T> resolvedObserverMethods = notifier.<T> resolveObserverMethods(type, qualifiers); if (resolvedObserverMethods.isMetadataRequired()) { EventMetadata metadata = new EventMetadataImpl(type, null, qualifiers); CurrentEventMetadata metadataService = manager.getServices().get(CurrentEventMetadata.class); return new FastEventWithMetadataPropagation<T>(resolvedObserverMethods, metadata, metadataService); } else { return new FastEvent<T>(resolvedObserverMethods); } }
private List<ObserverMethod<?>> resolveObservers(EventMetadata metadata, boolean containerEvent) { List<ObserverMethod<?>> observers = new ArrayList<ObserverMethod<?>>(); final ObserverNotifier notifier = (containerEvent) ? manager.getAccessibleLenientObserverNotifier() : manager.getGlobalLenientObserverNotifier(); ResolvedObservers<?> resolvedObservers = notifier.resolveObserverMethods(metadata.getType(), metadata.getQualifiers()); for (ObserverMethod<?> observer : resolvedObservers.getAllObservers()) { // do not show ProbeObserver if (getBeanClass() != observer.getBeanClass()) { observers.add(observer); } } return ImmutableList.copyOf(observers); }
public void fire(T event) { for (ObserverMethod<? super T> observer : resolvedObserverMethods.getImmediateSyncObservers()) { observer.notify(event); } }
@SuppressWarnings("unchecked") public static <T> ResolvedObservers<T> of(List<ObserverMethod<? super T>> observers) { if (observers.isEmpty()) { return (ResolvedObservers<T>) EMPTY; } boolean metadataRequired = false; List<ObserverMethod<? super T>> immediateSyncObservers = new ArrayList<ObserverMethod<? super T>>(); List<ObserverMethod<? super T>> transactionObservers = new ArrayList<ObserverMethod<? super T>>(); List<ObserverMethod<? super T>> asyncObservers = new ArrayList<ObserverMethod<? super T>>(); for (ObserverMethod<? super T> observer : observers) { if(observer.isAsync()) { asyncObservers.add(observer); } else if (TransactionPhase.IN_PROGRESS == observer.getTransactionPhase()) { immediateSyncObservers.add(observer); } else { transactionObservers.add(observer); } if (!metadataRequired && Observers.isEventMetadataRequired(observer)) { metadataRequired = true; } } return new ResolvedObservers<>(copyOf(immediateSyncObservers), copyOf(asyncObservers), copyOf(transactionObservers), metadataRequired); }
/** * Delivers the given asynchronous event object to given observer asynchronous observer methods. * * Asynchronous observer methods are scheduled to be notified in a separate thread. Note that this method exits just after event delivery to asynchronous * observer methods is scheduled. {@link EventMetadata} is made available for injection into observer methods, if needed. * * Note that if any of the observer methods throws an exception, it is never thrown out of this method. Instead, all the exceptions are grouped together * using {@link CompletionException} and the returned {@link CompletionStage} fails with this compound exception. * * If an executor is provided then observer methods are notified using this executor. Otherwise, Weld's task executor is used. * * @param observers the given observer methods * @param event the given event object * @param metadata event metadata * @param options */ public <T, U extends T> CompletionStage<U> notifyAsync(ResolvedObservers<T> observers, U event, EventMetadata metadata, NotificationOptions options) { if (!observers.isMetadataRequired()) { metadata = null; } return notifyAsyncObservers(observers.getAsyncObservers(), event, metadata, options.getExecutor(), options); }
@Override public void fire(T event) { final ThreadLocalStackReference<EventMetadata> stack = metadataService.pushIfNotNull(metadata); try { for (ObserverMethod<? super T> observer : resolvedObserverMethods.getImmediateSyncObservers()) { Observers.notify(observer, event, metadata); } } finally { stack.pop(); } } }
private <T> void addContainerLifecycleEvent(T event, Object info, BeanManagerImpl beanManagerImpl) { ResolvedObservers<?> resolvedObservers = null; Type eventType = null; if (event instanceof AbstractContainerEvent) { AbstractContainerEvent containerEvent = (AbstractContainerEvent) event; eventType = containerEvent.getEventType(); resolvedObservers = beanManagerImpl.getGlobalLenientObserverNotifier().resolveObserverMethods(eventType); } else if (event instanceof ProcessAnnotatedTypeImpl) { ProcessAnnotatedTypeImpl<?> processAnnotatedTypeEvent = (ProcessAnnotatedTypeImpl<?>) event; eventType = ProcessAnnotatedType.class; info = Formats.formatType(processAnnotatedTypeEvent.getOriginalAnnotatedType().getBaseType(), false); resolvedObservers = beanManagerImpl.getGlobalLenientObserverNotifier().resolveObserverMethods( ProcessAnnotatedTypeEventResolvable.of(processAnnotatedTypeEvent, beanManagerImpl.getServices().get(RequiredAnnotationDiscovery.class))); } if (resolvedObservers != null && eventType != null) { probe.addEvent(new EventInfo(eventType, Collections.emptySet(), info, null, Reflections.cast(resolvedObservers.getAllObservers()), true, System.currentTimeMillis(), false)); } }