You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@openwebbeans.apache.org by st...@apache.org on 2023/02/25 13:01:31 UTC

[openwebbeans] branch main updated: OWB-1425 interceptors for Unmanaged Instances

This is an automated email from the ASF dual-hosted git repository.

struberg pushed a commit to branch main
in repository https://gitbox.apache.org/repos/asf/openwebbeans.git


The following commit(s) were added to refs/heads/main by this push:
     new 01245cf8e OWB-1425 interceptors for Unmanaged Instances
01245cf8e is described below

commit 01245cf8ef0baaa9cd31342b0cdb075d314b6ef9
Author: Mark Struberg <st...@apache.org>
AuthorDate: Sat Feb 25 13:58:57 2023 +0100

    OWB-1425 interceptors for Unmanaged Instances
---
 .../apache/webbeans/container/BeanManagerImpl.java | 13 ++++++++++-
 .../ValidatingInjectionTargetFactory.java          | 25 ++++++++++++++++++++--
 webbeans-tck/standalone-suite.xml                  | 11 +---------
 webbeans-tck/testng-dev.xml                        |  4 ++--
 4 files changed, 38 insertions(+), 15 deletions(-)

diff --git a/webbeans-impl/src/main/java/org/apache/webbeans/container/BeanManagerImpl.java b/webbeans-impl/src/main/java/org/apache/webbeans/container/BeanManagerImpl.java
index 945df6c7b..9cee6b006 100644
--- a/webbeans-impl/src/main/java/org/apache/webbeans/container/BeanManagerImpl.java
+++ b/webbeans-impl/src/main/java/org/apache/webbeans/container/BeanManagerImpl.java
@@ -187,6 +187,12 @@ public class BeanManagerImpl implements BeanManager, Referenceable
 
     private AnnotatedElementFactory annotatedElementFactory;
 
+    /**
+     * A cache for bean classes which get created 'on the fly' by manually calling createInjectionTarget without a bean.
+     */
+    private ConcurrentMap<Class<?>, Bean> unmanagedClassBeans = new ConcurrentHashMap<>();
+
+
     private final WebBeansContext webBeansContext;
 
     /**
@@ -214,7 +220,7 @@ public class BeanManagerImpl implements BeanManager, Referenceable
      * We don't need to take special care about classloader
      * hierarchies, because each cl has other classes.
      */
-    private static Map<Class<? extends Annotation>, Boolean> isScopeTypeNormalCache =
+    private Map<Class<? extends Annotation>, Boolean> isScopeTypeNormalCache =
         new ConcurrentHashMap<>();
 
     /**
@@ -258,6 +264,11 @@ public class BeanManagerImpl implements BeanManager, Referenceable
         return errorStack;
     }
 
+    public ConcurrentMap<Class<?>, Bean> getUnmanagedClassBeans()
+    {
+        return unmanagedClassBeans;
+    }
+
     /**
      * Gets injection resolver.
      *
diff --git a/webbeans-impl/src/main/java/org/apache/webbeans/container/ValidatingInjectionTargetFactory.java b/webbeans-impl/src/main/java/org/apache/webbeans/container/ValidatingInjectionTargetFactory.java
index f87b4c114..73e42b090 100644
--- a/webbeans-impl/src/main/java/org/apache/webbeans/container/ValidatingInjectionTargetFactory.java
+++ b/webbeans-impl/src/main/java/org/apache/webbeans/container/ValidatingInjectionTargetFactory.java
@@ -17,12 +17,16 @@
 package org.apache.webbeans.container;
 
 import java.util.Set;
-
 import jakarta.enterprise.inject.spi.AnnotatedType;
 import jakarta.enterprise.inject.spi.Bean;
 import jakarta.enterprise.inject.spi.InjectionPoint;
 import jakarta.enterprise.inject.spi.InjectionTarget;
+import org.apache.webbeans.component.BeanAttributesImpl;
+import org.apache.webbeans.component.ManagedBean;
+import org.apache.webbeans.component.creation.BeanAttributesBuilder;
+import org.apache.webbeans.component.creation.ManagedBeanBuilder;
 import org.apache.webbeans.config.WebBeansContext;
+import org.apache.webbeans.portable.InjectionTargetImpl;
 
 /**
  * InjectionTargetFactory which validates the craeted InjectionTarget.
@@ -39,7 +43,8 @@ public class ValidatingInjectionTargetFactory<T> extends InjectionTargetFactoryI
     @Override
     public InjectionTarget<T> createInjectionTarget(Bean<T> bean)
     {
-        final InjectionTarget<T> injectionTarget = super.createInjectionTarget(bean);
+        final AnnotatedType<T> annotatedType = getAnnotatedType();
+        final InjectionTargetImpl<T> injectionTarget =  (InjectionTargetImpl<T>) super.createInjectionTarget(bean);
         final Set<InjectionPoint> injectionPoints = injectionTarget.getInjectionPoints();
         try
         {
@@ -52,6 +57,22 @@ public class ValidatingInjectionTargetFactory<T> extends InjectionTargetFactoryI
             throw new IllegalArgumentException("Problem while creating InjectionTarget", e);
         }
 
+        // only possible to define an interceptor if there is a default ct
+        if (getWebBeansContext().getWebBeansUtil().getNoArgConstructor(annotatedType.getJavaClass()) != null)
+        {
+            if (bean == null)
+            {
+                bean = getWebBeansContext().getBeanManagerImpl().getUnmanagedClassBeans().computeIfAbsent(annotatedType.getJavaClass(), c -> {
+                    final BeanAttributesImpl<T> attributes = BeanAttributesBuilder.forContext(getWebBeansContext()).newBeanAttibutes(annotatedType).build();
+                    ManagedBeanBuilder<T, ManagedBean<T>> managedBeanCreator
+                        = new ManagedBeanBuilder<>(getWebBeansContext(), annotatedType, attributes, false);
+                    return managedBeanCreator.getBean();
+                });
+            }
+
+            injectionTarget.defineInterceptorStack(bean, annotatedType, getWebBeansContext());
+        }
+
         return injectionTarget;
     }
 }
diff --git a/webbeans-tck/standalone-suite.xml b/webbeans-tck/standalone-suite.xml
index efc025f91..048a7d6c8 100644
--- a/webbeans-tck/standalone-suite.xml
+++ b/webbeans-tck/standalone-suite.xml
@@ -89,16 +89,7 @@
                     <exclude name="testMultipleLifecycleInterceptors"/>
                 </methods>
             </class>
-
-            <!--
-                The test asserts something which is not defined in the spec.
-            -->
-            <class name="org.jboss.cdi.tck.tests.full.extensions.beanManager.unmanaged.UnmanagedInstanceTest" >
-                <methods>
-                    <exclude name="testNonContextualInstanceIsIntercepted"/>
-                </methods>
-            </class>
-
+            
             <!--
                 The spec says nowhere that they must be invoked in exactly that order.
             -->
diff --git a/webbeans-tck/testng-dev.xml b/webbeans-tck/testng-dev.xml
index e63273b2f..2f9ab5201 100644
--- a/webbeans-tck/testng-dev.xml
+++ b/webbeans-tck/testng-dev.xml
@@ -19,9 +19,9 @@
     <test name="JSR-346 TCK">
 
         <classes>
-            <class name="org.jboss.cdi.tck.interceptors.tests.contract.lifecycleCallback.bindings.LifecycleInterceptorDefinitionTest" >
+            <class name="org.jboss.cdi.tck.tests.full.extensions.beanManager.unmanaged.UnmanagedInstanceTest" >
                 <methods>
-                    <include name=".*"/>
+                    <include name="testNonContextualInstanceIsIntercepted"/>
                 </methods>
             </class>