You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@openwebbeans.apache.org by rm...@apache.org on 2021/11/24 07:45:37 UTC

[openwebbeans] branch master updated: [OWB-1393] avoid method duplication and iteration to register observer methods

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 <rm...@gmail.com>
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)
         {