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);