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>