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 2013/01/22 13:40:14 UTC
svn commit: r1436872 - in /openwebbeans/trunk/webbeans-impl/src:
main/java/org/apache/webbeans/component/
main/java/org/apache/webbeans/config/
main/java/org/apache/webbeans/intercept/
main/java/org/apache/webbeans/proxy/ main/java/org/apache/webbeans/...
Author: struberg
Date: Tue Jan 22 12:40:14 2013
New Revision: 1436872
URL: http://svn.apache.org/viewvc?rev=1436872&view=rev
Log:
OWB-755 move interceptor configuration to InjectionTargetBean
Removed:
openwebbeans/trunk/webbeans-impl/src/main/java/org/apache/webbeans/intercept/WebBeansInterceptorConfig.java
Modified:
openwebbeans/trunk/webbeans-impl/src/main/java/org/apache/webbeans/component/InjectionTargetBean.java
openwebbeans/trunk/webbeans-impl/src/main/java/org/apache/webbeans/config/BeansDeployer.java
openwebbeans/trunk/webbeans-impl/src/main/java/org/apache/webbeans/config/WebBeansContext.java
openwebbeans/trunk/webbeans-impl/src/main/java/org/apache/webbeans/proxy/NormalScopeProxyFactory.java
openwebbeans/trunk/webbeans-impl/src/main/java/org/apache/webbeans/util/WebBeansUtil.java
openwebbeans/trunk/webbeans-impl/src/test/java/org/apache/webbeans/test/TestContext.java
Modified: openwebbeans/trunk/webbeans-impl/src/main/java/org/apache/webbeans/component/InjectionTargetBean.java
URL: http://svn.apache.org/viewvc/openwebbeans/trunk/webbeans-impl/src/main/java/org/apache/webbeans/component/InjectionTargetBean.java?rev=1436872&r1=1436871&r2=1436872&view=diff
==============================================================================
--- openwebbeans/trunk/webbeans-impl/src/main/java/org/apache/webbeans/component/InjectionTargetBean.java (original)
+++ openwebbeans/trunk/webbeans-impl/src/main/java/org/apache/webbeans/component/InjectionTargetBean.java Tue Jan 22 12:40:14 2013
@@ -19,7 +19,14 @@
package org.apache.webbeans.component;
import java.lang.annotation.Annotation;
+import java.lang.reflect.Method;
import java.lang.reflect.Type;
+import java.util.ArrayList;
+import java.util.Collections;
+import java.util.HashMap;
+import java.util.LinkedHashSet;
+import java.util.List;
+import java.util.Map;
import java.util.Set;
import javax.enterprise.inject.spi.AnnotatedType;
@@ -27,7 +34,13 @@ import javax.enterprise.inject.spi.Annot
import org.apache.webbeans.config.WebBeansContext;
import javax.enterprise.inject.spi.InjectionTarget;
-
+import javax.enterprise.inject.spi.InterceptionType;
+import javax.enterprise.inject.spi.Interceptor;
+import javax.interceptor.AroundInvoke;
+
+import org.apache.webbeans.intercept.InterceptorResolutionService;
+import org.apache.webbeans.portable.InjectionTargetImpl;
+import org.apache.webbeans.proxy.InterceptorDecoratorProxyFactory;
import org.apache.webbeans.util.Asserts;
@@ -86,4 +99,113 @@ public abstract class InjectionTargetBea
{
return annotatedType;
}
+
+ /**
+ *
+ * Configure bean instance interceptor stack.
+ *
+ * This method gets invoked in the ValidateBean phase and will fill all the
+ * interceptor information into the given InjectionTargetBean
+ *
+ */
+ public <T> void defineBeanInterceptorStack()
+ {
+ if (this instanceof InterceptedMarker && getInjectionTarget() instanceof InjectionTargetImpl)
+ {
+ InjectionTargetImpl<T> injectionTarget = (InjectionTargetImpl<T>) getInjectionTarget();
+ InterceptorResolutionService.BeanInterceptorInfo interceptorInfo = webBeansContext.getInterceptorResolutionService().
+ calculateInterceptorInfo(getTypes(), getQualifiers(), getAnnotatedType());
+
+ Map<Method, List<Interceptor<?>>> methodInterceptors = new HashMap<Method, List<Interceptor<?>>>();
+ for (Map.Entry<Method, InterceptorResolutionService.BusinessMethodInterceptorInfo> miEntry : interceptorInfo.getBusinessMethodsInfo().entrySet())
+ {
+ Method interceptedMethod = miEntry.getKey();
+ InterceptorResolutionService.BusinessMethodInterceptorInfo mii = miEntry.getValue();
+ List<Interceptor<?>> activeInterceptors = new ArrayList<Interceptor<?>>();
+
+ if (mii.getEjbInterceptors() != null)
+ {
+ for (Interceptor<?> i : mii.getEjbInterceptors())
+ {
+ activeInterceptors.add(i);
+ }
+ }
+ if (mii.getCdiInterceptors() != null)
+ {
+ for (Interceptor<?> i : mii.getCdiInterceptors())
+ {
+ activeInterceptors.add(i);
+ }
+ }
+ if (interceptorInfo.getSelfInterceptorBean() != null)
+ {
+ if (interceptedMethod.getAnnotation(AroundInvoke.class) == null) // this check is a dirty hack for now to prevent infinite loops
+ {
+ // add self-interception as last interceptor in the chain.
+ activeInterceptors.add(interceptorInfo.getSelfInterceptorBean());
+ }
+ }
+
+ if (activeInterceptors.size() > 0)
+ {
+ methodInterceptors.put(interceptedMethod, activeInterceptors);
+ }
+ else if (mii.getMethodDecorators() != null)
+ {
+ methodInterceptors.put(interceptedMethod, Collections.EMPTY_LIST);
+ }
+ }
+
+ List<Interceptor<?>> postConstructInterceptors
+ = getLifecycleInterceptors(interceptorInfo.getEjbInterceptors(), interceptorInfo.getCdiInterceptors(), InterceptionType.POST_CONSTRUCT);
+
+ List<Interceptor<?>> preDestroyInterceptors
+ = getLifecycleInterceptors(interceptorInfo.getEjbInterceptors(), interceptorInfo.getCdiInterceptors(), InterceptionType.PRE_DESTROY);
+
+ Class<? extends T> proxyClass = null;
+ if (methodInterceptors.size() > 0 || postConstructInterceptors.size() > 0 || preDestroyInterceptors.size() > 0)
+ {
+ // we only need to create a proxy class for intercepted or decorated Beans
+ InterceptorDecoratorProxyFactory pf = webBeansContext.getInterceptorDecoratorProxyFactory();
+
+ ClassLoader classLoader = getBeanClass().getClassLoader();
+
+ Method[] businessMethods = methodInterceptors.keySet().toArray(new Method[methodInterceptors.size()]);
+ Method[] nonInterceptedMethods = interceptorInfo.getNonInterceptedMethods().toArray(new Method[interceptorInfo.getNonInterceptedMethods().size()]);
+
+ proxyClass = (Class<? extends T>) pf.createProxyClass(classLoader, getReturnType(), businessMethods, nonInterceptedMethods);
+
+ // now we collect the post-construct and pre-destroy interceptors
+
+ }
+ injectionTarget.setInterceptorInfo(interceptorInfo, proxyClass, methodInterceptors, postConstructInterceptors, preDestroyInterceptors);
+
+ }
+
+ }
+
+
+ private List<Interceptor<?>> getLifecycleInterceptors(LinkedHashSet<Interceptor<?>> ejbInterceptors, List<Interceptor<?>> cdiInterceptors, InterceptionType interceptionType)
+ {
+ List<Interceptor<?>> lifecycleInterceptors = new ArrayList<Interceptor<?>>();
+
+ for (Interceptor<?> ejbInterceptor : ejbInterceptors)
+ {
+ if (ejbInterceptor.intercepts(interceptionType))
+ {
+ lifecycleInterceptors.add(ejbInterceptor);
+ }
+ }
+ for (Interceptor<?> cdiInterceptor : cdiInterceptors)
+ {
+ if (cdiInterceptor.intercepts(interceptionType))
+ {
+ lifecycleInterceptors.add(cdiInterceptor);
+ }
+ }
+
+ return lifecycleInterceptors;
+ }
+
+
}
Modified: openwebbeans/trunk/webbeans-impl/src/main/java/org/apache/webbeans/config/BeansDeployer.java
URL: http://svn.apache.org/viewvc/openwebbeans/trunk/webbeans-impl/src/main/java/org/apache/webbeans/config/BeansDeployer.java?rev=1436872&r1=1436871&r2=1436872&view=diff
==============================================================================
--- openwebbeans/trunk/webbeans-impl/src/main/java/org/apache/webbeans/config/BeansDeployer.java (original)
+++ openwebbeans/trunk/webbeans-impl/src/main/java/org/apache/webbeans/config/BeansDeployer.java Tue Jan 22 12:40:14 2013
@@ -403,7 +403,7 @@ public class BeansDeployer
if (bean instanceof InjectionTargetBean && bean instanceof InterceptedMarker)
{
- webBeansContext.getWebBeansInterceptorConfig().defineBeanInterceptorStack((InjectionTargetBean<Object>) bean);
+ ((InjectionTargetBean<Object>) bean).defineBeanInterceptorStack();
}
//Check passivation scope
Modified: openwebbeans/trunk/webbeans-impl/src/main/java/org/apache/webbeans/config/WebBeansContext.java
URL: http://svn.apache.org/viewvc/openwebbeans/trunk/webbeans-impl/src/main/java/org/apache/webbeans/config/WebBeansContext.java?rev=1436872&r1=1436871&r2=1436872&view=diff
==============================================================================
--- openwebbeans/trunk/webbeans-impl/src/main/java/org/apache/webbeans/config/WebBeansContext.java (original)
+++ openwebbeans/trunk/webbeans-impl/src/main/java/org/apache/webbeans/config/WebBeansContext.java Tue Jan 22 12:40:14 2013
@@ -39,7 +39,6 @@ import org.apache.webbeans.inject.impl.I
import org.apache.webbeans.intercept.InterceptorResolutionService;
import org.apache.webbeans.intercept.InterceptorUtil;
import org.apache.webbeans.intercept.InterceptorsManager;
-import org.apache.webbeans.intercept.WebBeansInterceptorConfig;
import org.apache.webbeans.plugins.PluginLoader;
import org.apache.webbeans.portable.AnnotatedElementFactory;
import org.apache.webbeans.portable.events.ExtensionLoader;
@@ -77,7 +76,6 @@ public class WebBeansContext
private final DecoratorsManager decoratorsManager = new DecoratorsManager(this);
private final ExtensionLoader extensionLoader = new ExtensionLoader(this);
private final InterceptorsManager interceptorsManager = new InterceptorsManager(this);
- private final WebBeansInterceptorConfig webBeansInterceptorConfig = new WebBeansInterceptorConfig(this);
private final InterceptorDecoratorProxyFactory interceptorDecoratorProxyFactory = new InterceptorDecoratorProxyFactory(this);
private final NormalScopeProxyFactory normalScopeProxyFactory = new NormalScopeProxyFactory(this);
private final SubclassProxyFactory subclassProxyFactory = new SubclassProxyFactory(this);
@@ -284,12 +282,6 @@ public class WebBeansContext
return decoratorsManager;
}
- public WebBeansInterceptorConfig getWebBeansInterceptorConfig()
- {
- return webBeansInterceptorConfig;
- }
-
-
public StereoTypeManager getStereoTypeManager()
{
return stereoTypeManager;
Modified: openwebbeans/trunk/webbeans-impl/src/main/java/org/apache/webbeans/proxy/NormalScopeProxyFactory.java
URL: http://svn.apache.org/viewvc/openwebbeans/trunk/webbeans-impl/src/main/java/org/apache/webbeans/proxy/NormalScopeProxyFactory.java?rev=1436872&r1=1436871&r2=1436872&view=diff
==============================================================================
--- openwebbeans/trunk/webbeans-impl/src/main/java/org/apache/webbeans/proxy/NormalScopeProxyFactory.java (original)
+++ openwebbeans/trunk/webbeans-impl/src/main/java/org/apache/webbeans/proxy/NormalScopeProxyFactory.java Tue Jan 22 12:40:14 2013
@@ -296,7 +296,9 @@ public class NormalScopeProxyFactory ext
}
if (classLoader != classToProxy.getClassLoader())
{
- // we can only proxy protected methods that way if the subclass and proxied class are in the same classloader
+ // We can only proxy protected methods that way if the subclass
+ // and the proxied class are in the same classloader
+ // Otherwise they don't technically count as being 'in the same package'
if (Modifier.isProtected(delegatedMethod.getModifiers()))
{
continue;
Modified: openwebbeans/trunk/webbeans-impl/src/main/java/org/apache/webbeans/util/WebBeansUtil.java
URL: http://svn.apache.org/viewvc/openwebbeans/trunk/webbeans-impl/src/main/java/org/apache/webbeans/util/WebBeansUtil.java?rev=1436872&r1=1436871&r2=1436872&view=diff
==============================================================================
--- openwebbeans/trunk/webbeans-impl/src/main/java/org/apache/webbeans/util/WebBeansUtil.java (original)
+++ openwebbeans/trunk/webbeans-impl/src/main/java/org/apache/webbeans/util/WebBeansUtil.java Tue Jan 22 12:40:14 2013
@@ -1615,7 +1615,10 @@ public final class WebBeansUtil
managedBeanCreator.defineProducerFields(managedBean);
managedBeanCreator.defineObserverMethods(managedBean);
- webBeansContext.getWebBeansInterceptorConfig().defineBeanInterceptorStack(managedBean);
+ if (managedBean instanceof InjectionTargetBean)
+ {
+ ((InjectionTargetBean) managedBean).defineBeanInterceptorStack();
+ }
managedBeanCreator.validateDisposalMethods(managedBean);//Define disposal method after adding producers
@@ -1758,7 +1761,11 @@ public final class WebBeansUtil
managedBeanCreator.defineProducerMethods(managedBean);
managedBeanCreator.defineProducerFields(managedBean);
managedBeanCreator.defineObserverMethods(managedBean);
- webBeansContext.getWebBeansInterceptorConfig().defineBeanInterceptorStack(managedBean);
+
+ if (managedBean instanceof InjectionTargetBean)
+ {
+ ((InjectionTargetBean) managedBean).defineBeanInterceptorStack();
+ }
managedBeanCreator.validateDisposalMethods(managedBean); //Define disposal method after adding producers
Modified: openwebbeans/trunk/webbeans-impl/src/test/java/org/apache/webbeans/test/TestContext.java
URL: http://svn.apache.org/viewvc/openwebbeans/trunk/webbeans-impl/src/test/java/org/apache/webbeans/test/TestContext.java?rev=1436872&r1=1436871&r2=1436872&view=diff
==============================================================================
--- openwebbeans/trunk/webbeans-impl/src/test/java/org/apache/webbeans/test/TestContext.java (original)
+++ openwebbeans/trunk/webbeans-impl/src/test/java/org/apache/webbeans/test/TestContext.java Tue Jan 22 12:40:14 2013
@@ -283,7 +283,10 @@ public abstract class TestContext implem
bean = define(clazz, WebBeansType.MANAGED, webBeansContext.getAnnotatedElementFactory().newAnnotatedType(clazz));
if (bean != null)
{
- webBeansContext.getWebBeansInterceptorConfig().defineBeanInterceptorStack(bean);
+ if (bean instanceof InjectionTargetBean)
+ {
+ ((InjectionTargetBean) bean).defineBeanInterceptorStack();
+ }
getComponents().add((AbstractOwbBean<?>) bean);
manager.addBean(bean);