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 2019/12/11 10:14:19 UTC

[openwebbeans] branch master updated: OWB-1305 avoid the case an extension observes an event before its bean+instance can be looked up

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 88ffcd7  OWB-1305 avoid the case an extension observes an event before its bean+instance can be looked up
88ffcd7 is described below

commit 88ffcd7778faf7681b82db6e4c6998555cde17e5
Author: Romain Manni-Bucau <rm...@gmail.com>
AuthorDate: Wed Dec 11 11:14:03 2019 +0100

    OWB-1305 avoid the case an extension observes an event before its bean+instance can be looked up
---
 .../webbeans/portable/events/ExtensionLoader.java     | 19 +++++++++++++++----
 .../java/org/apache/webbeans/util/WebBeansUtil.java   | 19 -------------------
 2 files changed, 15 insertions(+), 23 deletions(-)

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 b3b9913..d40ef20 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
@@ -32,16 +32,19 @@ import java.util.Set;
 import java.util.concurrent.ConcurrentHashMap;
 import java.util.logging.Logger;
 
-import javax.enterprise.inject.spi.Bean;
 import javax.enterprise.inject.spi.DefinitionException;
 import javax.enterprise.inject.spi.DeploymentException;
 import javax.enterprise.inject.spi.Extension;
 
+import org.apache.webbeans.component.ExtensionBean;
+import org.apache.webbeans.component.creation.ExtensionBeanBuilder;
+import org.apache.webbeans.component.creation.ObserverMethodsBuilder;
 import org.apache.webbeans.config.OpenWebBeansConfiguration;
 import org.apache.webbeans.config.WebBeansContext;
 import org.apache.webbeans.container.BeanManagerImpl;
 import org.apache.webbeans.exception.WebBeansException;
 import org.apache.webbeans.logger.WebBeansLoggerFacade;
+import org.apache.webbeans.util.Asserts;
 import org.apache.webbeans.util.ExceptionUtil;
 import org.apache.webbeans.util.WebBeansUtil;
 import org.apache.xbean.finder.archive.FileArchive;
@@ -201,13 +204,21 @@ public class ExtensionLoader
      * Add a CDI Extension to our internal list.
      * @param ext Extension to add
      */
-    public void addExtension(Extension ext)
+    public void addExtension(final Extension ext)
     {
-        Bean<?> bean = webBeansContext.getWebBeansUtil().createExtensionComponent(ext.getClass());
-        Class<?> extensionClass = ext.getClass();
+        final Class<Extension> extensionClass = (Class<Extension>) ext.getClass();
+        Asserts.nullCheckForClass(extensionClass);
         extensions.put(extensionClass, ext);
 
+        final ExtensionBeanBuilder<Extension> extensionBeanBuilder =
+                new ExtensionBeanBuilder<>(webBeansContext, extensionClass);
+        final ExtensionBean<Extension> bean = extensionBeanBuilder.getBean();
         manager.addBean(bean);
+
+        // 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())
+                .defineObserverMethods(bean);
     }
 
     /**
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 2842619..108622f 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
@@ -31,7 +31,6 @@ import org.apache.webbeans.component.DecoratorMetadataBean;
 import org.apache.webbeans.component.EnterpriseBeanMarker;
 import org.apache.webbeans.component.EventBean;
 import org.apache.webbeans.component.EventMetadataBean;
-import org.apache.webbeans.component.ExtensionBean;
 import org.apache.webbeans.component.InjectionPointBean;
 import org.apache.webbeans.component.InjectionTargetBean;
 import org.apache.webbeans.component.InstanceBean;
@@ -47,7 +46,6 @@ import org.apache.webbeans.component.ProducerMethodBean;
 import org.apache.webbeans.component.ResourceBean;
 import org.apache.webbeans.component.WebBeansType;
 import org.apache.webbeans.component.creation.BeanAttributesBuilder;
-import org.apache.webbeans.component.creation.ExtensionBeanBuilder;
 import org.apache.webbeans.component.creation.ManagedBeanBuilder;
 import org.apache.webbeans.component.creation.ObserverMethodsBuilder;
 import org.apache.webbeans.component.creation.ProducerFieldBeansBuilder;
@@ -479,23 +477,6 @@ public final class WebBeansUtil
     }
 
     /**
-     * Creates a new extension bean.
-     *
-     * @param <T> extension service class
-     * @param clazz impl. class
-     * @return a new extension service bean
-     */
-    public <T> ExtensionBean<T> createExtensionComponent(Class<T> clazz)
-    {
-        Asserts.nullCheckForClass(clazz);
-        ExtensionBeanBuilder<T> extensionBeanBuilder = new ExtensionBeanBuilder<>(webBeansContext, clazz);
-        ExtensionBean<T> bean = extensionBeanBuilder.getBean();
-        new ObserverMethodsBuilder<>(webBeansContext, extensionBeanBuilder.getAnnotatedType()).defineObserverMethods(bean);
-        return bean;
-    }
-
-
-    /**
      * Creates a new manager bean instance.
      * @return new manager bean instance
      */