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>