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 <[email protected]>
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>
 

Reply via email to