This is an automated email from the ASF dual-hosted git repository.
rmannibucau pushed a commit to branch master
in repository https://gitbox.apache.org/repos/asf/openwebbeans.git
The following commit(s) were added to refs/heads/master by this push:
new f93415c [OWB-1393] avoid method duplication and iteration to register
observer methods
f93415c is described below
commit f93415c5f487e38b39966274641a0c874c6df298
Author: Romain Manni-Bucau <[email protected]>
AuthorDate: Wed Nov 24 08:45:31 2021 +0100
[OWB-1393] avoid method duplication and iteration to register observer
methods
---
.../component/creation/ObserverMethodsBuilder.java | 48 ++----------------
.../org/apache/webbeans/config/BeansDeployer.java | 2 +-
.../apache/webbeans/event/NotificationManager.java | 59 +++++++---------------
.../webbeans/portable/events/ExtensionLoader.java | 10 ++--
.../org/apache/webbeans/util/WebBeansUtil.java | 2 +-
5 files changed, 28 insertions(+), 93 deletions(-)
diff --git
a/webbeans-impl/src/main/java/org/apache/webbeans/component/creation/ObserverMethodsBuilder.java
b/webbeans-impl/src/main/java/org/apache/webbeans/component/creation/ObserverMethodsBuilder.java
index 7fea99b..e40bf2b 100644
---
a/webbeans-impl/src/main/java/org/apache/webbeans/component/creation/ObserverMethodsBuilder.java
+++
b/webbeans-impl/src/main/java/org/apache/webbeans/component/creation/ObserverMethodsBuilder.java
@@ -66,32 +66,15 @@ public class ObserverMethodsBuilder<T>
this.annotatedType = annotatedType;
}
- public Set<ObserverMethod<?>>
defineContainerLifecycleEventObserverMethods(AbstractOwbBean<T> ownerBean)
- {
- Set<ObserverMethod<?>> definedObservers = new HashSet<>();
- for (AnnotatedMethod<?> annotatedMethod :
webBeansContext.getAnnotatedElementFactory().getFilteredAnnotatedMethods(annotatedType))
- {
- ObserverMethod<?> observerMethod =
defineContainerLifecycleEventObserverMethod(ownerBean, annotatedMethod);
- if (observerMethod != null)
- {
- definedObservers.add(observerMethod);
- }
- }
-
- checkDefinedObservers(ownerBean, definedObservers);
-
- return definedObservers;
- }
-
/**
* {@inheritDoc}
*/
- public Set<ObserverMethod<?>> defineObserverMethods(AbstractOwbBean<T>
ownerBean)
+ public Set<ObserverMethod<?>> defineObserverMethods(AbstractOwbBean<T>
ownerBean, boolean checkContainerEvents)
{
Set<ObserverMethod<?>> definedObservers = new HashSet<>();
for (AnnotatedMethod<?> annotatedMethod :
webBeansContext.getAnnotatedElementFactory().getFilteredAnnotatedMethods(annotatedType))
{
- ObserverMethod<?> observerMethod = defineObserverMethod(ownerBean,
annotatedMethod);
+ ObserverMethod<?> observerMethod = defineObserverMethod(ownerBean,
annotatedMethod, checkContainerEvents);
if (observerMethod != null)
{
definedObservers.add(observerMethod);
@@ -107,29 +90,8 @@ public class ObserverMethodsBuilder<T>
* Check whether the given annotatedMethod is an ObserverMethod and verify
it
* @return the ObserverMethod or {@code null} if this method is not an
observer.
*/
- public ObserverMethod<?>
defineContainerLifecycleEventObserverMethod(AbstractOwbBean<T> ownerBean,
AnnotatedMethod<?> annotatedMethod)
- {
- AnnotatedParameter<?> observesParameter =
findObservesParameter(annotatedMethod);
-
- if (observesParameter != null)
- {
- checkObserverMethodConditions(ownerBean, observesParameter);
-
- //Looking for ObserverMethod
- ObserverMethod<?> definedObserver =
webBeansContext.getNotificationManager().
-
getContainerLifecycleEventObservableMethodForAnnotatedMethod(annotatedMethod,
observesParameter, ownerBean);
-
- return definedObserver;
- }
-
- return null;
- }
-
- /**
- * Check whether the given annotatedMethod is an ObserverMethod and verify
it
- * @return the ObserverMethod or {@code null} if this method is not an
observer.
- */
- public ObserverMethod<?> defineObserverMethod(AbstractOwbBean<T>
ownerBean, AnnotatedMethod<?> annotatedMethod)
+ public ObserverMethod<?> defineObserverMethod(AbstractOwbBean<T>
ownerBean, AnnotatedMethod<?> annotatedMethod,
+ boolean checkContainerEvents)
{
AnnotatedParameter<?> observesParameter =
findObservesParameter(annotatedMethod);
@@ -139,7 +101,7 @@ public class ObserverMethodsBuilder<T>
//Looking for ObserverMethod
ObserverMethod<?> definedObserver =
webBeansContext.getNotificationManager().
- getObservableMethodForAnnotatedMethod(annotatedMethod,
observesParameter, ownerBean);
+ getObservableMethodForAnnotatedMethod(annotatedMethod,
observesParameter, ownerBean, checkContainerEvents);
return definedObserver;
}
diff --git
a/webbeans-impl/src/main/java/org/apache/webbeans/config/BeansDeployer.java
b/webbeans-impl/src/main/java/org/apache/webbeans/config/BeansDeployer.java
index bd079f5..6d3af2f 100644
--- a/webbeans-impl/src/main/java/org/apache/webbeans/config/BeansDeployer.java
+++ b/webbeans-impl/src/main/java/org/apache/webbeans/config/BeansDeployer.java
@@ -2062,7 +2062,7 @@ public class BeansDeployer
AnnotatedType<T> beanAnnotatedType = bean.getAnnotatedType();
if(bean.isEnabled())
{
- observerMethods = new
ObserverMethodsBuilder<>(webBeansContext,
beanAnnotatedType).defineObserverMethods(bean);
+ observerMethods = new
ObserverMethodsBuilder<>(webBeansContext,
beanAnnotatedType).defineObserverMethods(bean, false);
}
else
{
diff --git
a/webbeans-impl/src/main/java/org/apache/webbeans/event/NotificationManager.java
b/webbeans-impl/src/main/java/org/apache/webbeans/event/NotificationManager.java
index 918730d..dafa450 100644
---
a/webbeans-impl/src/main/java/org/apache/webbeans/event/NotificationManager.java
+++
b/webbeans-impl/src/main/java/org/apache/webbeans/event/NotificationManager.java
@@ -1150,63 +1150,38 @@ public class NotificationManager
}
/**
- * Gets container lifecycle event observer method from given annotated
method.
+ * Gets observer method from given annotated method.
* @param <T> bean type info
* @param annotatedMethod annotated method for observer
* @param ownerBean bean instance
+ * @param checkContainerEvents hint to know if container event test is
needed or can be bypassed
* @return ObserverMethod
*/
- public <T> ObserverMethod<?>
getContainerLifecycleEventObservableMethodForAnnotatedMethod(
- AnnotatedMethod<?> annotatedMethod, AnnotatedParameter<?>
annotatedParameter, AbstractOwbBean<T> ownerBean)
+ public <T> ObserverMethod<?> getObservableMethodForAnnotatedMethod(
+ AnnotatedMethod<?> annotatedMethod, AnnotatedParameter<?>
annotatedParameter, AbstractOwbBean<T> ownerBean,
+ boolean checkContainerEvents)
{
Asserts.assertNotNull(annotatedParameter, "annotatedParameter");
- ObserverMethodImpl<T> observer = null;
- if (isContainerEvent(annotatedParameter))
+ if (checkContainerEvents && isContainerEvent(annotatedParameter))
{
- observer = new ContainerEventObserverMethodImpl(ownerBean,
annotatedMethod, annotatedParameter);
+ ObserverMethodImpl<T> observer = new
ContainerEventObserverMethodImpl(ownerBean, annotatedMethod,
annotatedParameter);
addObserver(observer);
+ return observer;
}
- return observer;
- }
-
- /**
- * Gets observer method from given annotated method.
- * @param <T> bean type info
- * @param annotatedMethod annotated method for observer
- * @param ownerBean bean instance
- * @return ObserverMethod
- */
- public <T> ObserverMethod<?>
getObservableMethodForAnnotatedMethod(AnnotatedMethod<?> annotatedMethod,
AnnotatedParameter<?> annotatedParameter, AbstractOwbBean<T> ownerBean)
- {
- Asserts.assertNotNull(annotatedParameter, "annotatedParameter");
- ObserverMethodImpl<T> observer = null;
-
- if (!isContainerEvent(annotatedParameter))
- {
- observer = new ObserverMethodImpl(ownerBean, annotatedMethod,
annotatedParameter);
-
- GProcessObserverMethod event = new
GProcessObserverMethod(webBeansContext, annotatedMethod, observer);
-
- //Fires ProcessObserverMethod
- webBeansContext.getBeanManagerImpl().fireEvent(event, true,
AnnotationUtil.EMPTY_ANNOTATION_ARRAY);
-
-
webBeansContext.getWebBeansUtil().inspectDefinitionErrorStack("There are errors
that are added by ProcessObserverMethod event observers for " +
+ ObserverMethodImpl<T> observer = new ObserverMethodImpl(ownerBean,
annotatedMethod, annotatedParameter);
+ GProcessObserverMethod event = new
GProcessObserverMethod(webBeansContext, annotatedMethod, observer);
+ webBeansContext.getBeanManagerImpl().fireEvent(event, true,
AnnotationUtil.EMPTY_ANNOTATION_ARRAY);
+ webBeansContext.getWebBeansUtil().inspectDefinitionErrorStack("There
are errors that are added by ProcessObserverMethod event observers for " +
"observer methods. Look at logs for further details");
-
- if (!event.isVetoed())
- {
- //Adds this observer
- addObserver(event.getObserverMethod());
- }
- else
- {
- observer = null;
- }
+ if (event.isVetoed())
+ {
event.setStarted();
+ return null;
}
-
+ addObserver(event.getObserverMethod());
+ event.setStarted();
return observer;
}
diff --git
a/webbeans-impl/src/main/java/org/apache/webbeans/portable/events/ExtensionLoader.java
b/webbeans-impl/src/main/java/org/apache/webbeans/portable/events/ExtensionLoader.java
index 5df35b7..83e18d7 100644
---
a/webbeans-impl/src/main/java/org/apache/webbeans/portable/events/ExtensionLoader.java
+++
b/webbeans-impl/src/main/java/org/apache/webbeans/portable/events/ExtensionLoader.java
@@ -200,10 +200,6 @@ public class ExtensionLoader
ExtensionBean<Extension> bean =
createExtensionBean(extensionBeanBuilder);
extensionBeans.put(bean,
extensionBeanBuilder.getAnnotatedType());
- // since an extension can fire a ProcessInjectionPoint
event when observing something else than a lifecycle event
- // and at the same time observe it, we must ensure to
build the observers only once the bean is available
- new ObserverMethodsBuilder<>(webBeansContext,
extensionBeanBuilder.getAnnotatedType())
-
.defineContainerLifecycleEventObserverMethods(bean);
}
catch (Exception e)
{
@@ -219,14 +215,16 @@ public class ExtensionLoader
// now register observers for non container lifecycle events
for (Entry<ExtensionBean<Extension>, AnnotatedType> extensionEntry :
extensionBeans.entrySet())
{
+ // since an extension can fire a ProcessInjectionPoint event when
observing something else than a lifecycle event
+ // and at the same time observe it, we must ensure to build the
observers only once the bean is available
new ObserverMethodsBuilder<>(webBeansContext,
extensionEntry.getValue())
- .defineObserverMethods(extensionEntry.getKey());
+ .defineObserverMethods(extensionEntry.getKey(), true);
}
}
/**
* Add a CDI Extension to our internal list.
- * @param ext Extension to add
+ * @param extensionBeanBuilder Extension builder to create the bean for
*/
public ExtensionBean<Extension>
createExtensionBean(ExtensionBeanBuilder<Extension> extensionBeanBuilder)
{
diff --git
a/webbeans-impl/src/main/java/org/apache/webbeans/util/WebBeansUtil.java
b/webbeans-impl/src/main/java/org/apache/webbeans/util/WebBeansUtil.java
index 4ab8c20..cbd3638 100644
--- a/webbeans-impl/src/main/java/org/apache/webbeans/util/WebBeansUtil.java
+++ b/webbeans-impl/src/main/java/org/apache/webbeans/util/WebBeansUtil.java
@@ -1200,7 +1200,7 @@ public final class WebBeansUtil
ManagedBean<T> managedBean = managedBeanCreator.getBean();
new ProducerMethodBeansBuilder(managedBean.getWebBeansContext(),
managedBean.getAnnotatedType()).defineProducerMethods(
managedBean, new
ProducerFieldBeansBuilder(managedBean.getWebBeansContext(),
managedBean.getAnnotatedType()).defineProducerFields(managedBean));
- new ObserverMethodsBuilder<>(webBeansContext,
managedBean.getAnnotatedType()).defineObserverMethods(managedBean);
+ new ObserverMethodsBuilder<>(webBeansContext,
managedBean.getAnnotatedType()).defineObserverMethods(managedBean, false);
if (managedBean.getProducer() instanceof AbstractProducer)
{