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)
         {

Reply via email to