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/12 17:32:12 UTC

svn commit: r1432468 - in /openwebbeans/trunk/webbeans-impl/src: main/java/org/apache/webbeans/component/ main/java/org/apache/webbeans/component/creation/ test/java/org/apache/webbeans/newtests/interceptors/resolution/

Author: struberg
Date: Sat Jan 12 16:32:11 2013
New Revision: 1432468

URL: http://svn.apache.org/viewvc?rev=1432468&view=rev
Log:
OWB-344 add CdiInterceptor constructor handling and instance creation

Modified:
    openwebbeans/trunk/webbeans-impl/src/main/java/org/apache/webbeans/component/CdiInterceptorBean.java
    openwebbeans/trunk/webbeans-impl/src/main/java/org/apache/webbeans/component/EnterpriseBeanMarker.java
    openwebbeans/trunk/webbeans-impl/src/main/java/org/apache/webbeans/component/InterceptorBean.java
    openwebbeans/trunk/webbeans-impl/src/main/java/org/apache/webbeans/component/ManagedBean.java
    openwebbeans/trunk/webbeans-impl/src/main/java/org/apache/webbeans/component/creation/AbstractInjectionTargetBeanBuilder.java
    openwebbeans/trunk/webbeans-impl/src/main/java/org/apache/webbeans/component/creation/CdiInterceptorBeanBuilder.java
    openwebbeans/trunk/webbeans-impl/src/main/java/org/apache/webbeans/component/creation/InterceptorBeanBuilder.java
    openwebbeans/trunk/webbeans-impl/src/main/java/org/apache/webbeans/component/creation/ManagedBeanBuilder.java
    openwebbeans/trunk/webbeans-impl/src/test/java/org/apache/webbeans/newtests/interceptors/resolution/InterceptorBeanBuilderTest.java

Modified: openwebbeans/trunk/webbeans-impl/src/main/java/org/apache/webbeans/component/CdiInterceptorBean.java
URL: http://svn.apache.org/viewvc/openwebbeans/trunk/webbeans-impl/src/main/java/org/apache/webbeans/component/CdiInterceptorBean.java?rev=1432468&r1=1432467&r2=1432468&view=diff
==============================================================================
--- openwebbeans/trunk/webbeans-impl/src/main/java/org/apache/webbeans/component/CdiInterceptorBean.java (original)
+++ openwebbeans/trunk/webbeans-impl/src/main/java/org/apache/webbeans/component/CdiInterceptorBean.java Sat Jan 12 16:32:11 2013
@@ -18,11 +18,16 @@
  */
 package org.apache.webbeans.component;
 
+import javax.enterprise.context.spi.CreationalContext;
 import javax.enterprise.inject.spi.AnnotatedType;
 import java.lang.annotation.Annotation;
+import java.lang.reflect.Constructor;
 import java.util.Set;
 
 import org.apache.webbeans.config.WebBeansContext;
+import org.apache.webbeans.context.creational.CreationalContextImpl;
+import org.apache.webbeans.inject.InjectableConstructor;
+import org.apache.webbeans.portable.InjectionTargetImpl;
 
 /**
  * <p>{@link javax.enterprise.inject.spi.Interceptor}
@@ -33,6 +38,11 @@ import org.apache.webbeans.config.WebBea
 public class CdiInterceptorBean<T> extends InterceptorBean<T>
 {
     /**
+     * Constructor of the web bean component
+     */
+    private Constructor<T> constructor;
+
+    /**
      *
      * @param annotatedType AnnotatedType will be returned by some methods in the SPI
      * @param webBeansContext
@@ -45,6 +55,41 @@ public class CdiInterceptorBean<T> exten
 
     private Set<Annotation> interceptorBindings;
 
+    /**
+     * Get constructor.
+     *
+     * @return constructor
+     */
+    public Constructor<T> getConstructor()
+    {
+        return constructor;
+    }
+
+    /**
+     * Set constructor.
+     *
+     * @param constructor constructor instance
+     */
+    public void setConstructor(Constructor<T> constructor)
+    {
+        this.constructor = constructor;
+    }
+
+    /**
+     * {@inheritDoc}
+     */
+    @Override
+    protected T createComponentInstance(CreationalContext<T> creationalContext)
+    {
+        Constructor<T> con = getConstructor();
+        InjectionTargetImpl<T> injectionTarget = new InjectionTargetImpl<T>(getAnnotatedType(), getInjectionPoints(), getWebBeansContext());
+        InjectableConstructor<T> ic = new InjectableConstructor<T>(con, injectionTarget, (CreationalContextImpl<T>) creationalContext);
+
+        T instance = ic.doInjection();
+
+        return instance;
+    }
+
 
     public void setInterceptorBindings(Set<Annotation> interceptorBindings)
     {

Modified: openwebbeans/trunk/webbeans-impl/src/main/java/org/apache/webbeans/component/EnterpriseBeanMarker.java
URL: http://svn.apache.org/viewvc/openwebbeans/trunk/webbeans-impl/src/main/java/org/apache/webbeans/component/EnterpriseBeanMarker.java?rev=1432468&r1=1432467&r2=1432468&view=diff
==============================================================================
--- openwebbeans/trunk/webbeans-impl/src/main/java/org/apache/webbeans/component/EnterpriseBeanMarker.java (original)
+++ openwebbeans/trunk/webbeans-impl/src/main/java/org/apache/webbeans/component/EnterpriseBeanMarker.java Sat Jan 12 16:32:11 2013
@@ -20,6 +20,7 @@ package org.apache.webbeans.component;
 
 /**
  * Marker interface for enterprise beans.
+ * All those beans will not get intercepted.
  * 
  * @version $Rev$ $Date$
  *

Modified: openwebbeans/trunk/webbeans-impl/src/main/java/org/apache/webbeans/component/InterceptorBean.java
URL: http://svn.apache.org/viewvc/openwebbeans/trunk/webbeans-impl/src/main/java/org/apache/webbeans/component/InterceptorBean.java?rev=1432468&r1=1432467&r2=1432468&view=diff
==============================================================================
--- openwebbeans/trunk/webbeans-impl/src/main/java/org/apache/webbeans/component/InterceptorBean.java (original)
+++ openwebbeans/trunk/webbeans-impl/src/main/java/org/apache/webbeans/component/InterceptorBean.java Sat Jan 12 16:32:11 2013
@@ -39,8 +39,9 @@ import org.apache.webbeans.util.Exceptio
  * <p>Any Interceptor is also an InjectionTarget as they can contain
  * &#064;Inject InjectionPoints.</p>
  */
-public abstract class InterceptorBean<T> extends AbstractInjectionTargetBean<T> implements Interceptor<T>
+public abstract class InterceptorBean<T> extends AbstractInjectionTargetBean<T> implements Interceptor<T>, EnterpriseBeanMarker
 {
+
     /**
      *
      * @param annotatedType AnnotatedType will be returned by some methods in the SPI
@@ -144,6 +145,7 @@ public abstract class InterceptorBean<T>
         return Dependent.class;
     }
 
+
     /**
      * @param interceptionType
      * @return the underlying interceptor method for the given InterceptionType or <code>null</code>

Modified: openwebbeans/trunk/webbeans-impl/src/main/java/org/apache/webbeans/component/ManagedBean.java
URL: http://svn.apache.org/viewvc/openwebbeans/trunk/webbeans-impl/src/main/java/org/apache/webbeans/component/ManagedBean.java?rev=1432468&r1=1432467&r2=1432468&view=diff
==============================================================================
--- openwebbeans/trunk/webbeans-impl/src/main/java/org/apache/webbeans/component/ManagedBean.java (original)
+++ openwebbeans/trunk/webbeans-impl/src/main/java/org/apache/webbeans/component/ManagedBean.java Sat Jan 12 16:32:11 2013
@@ -78,6 +78,7 @@ public class ManagedBean<T> extends Abst
         T instance = ic.doInjection();
         
         //If this is an abstract Decorator, we need to set the handler on the Proxy instance
+        //X TODO should be done in DecoratorBean
         if(isAbstractDecorator)
         {
             webBeansContext.getProxyFactory().setHandler(instance, new AbstractDecoratorMethodHandler());

Modified: openwebbeans/trunk/webbeans-impl/src/main/java/org/apache/webbeans/component/creation/AbstractInjectionTargetBeanBuilder.java
URL: http://svn.apache.org/viewvc/openwebbeans/trunk/webbeans-impl/src/main/java/org/apache/webbeans/component/creation/AbstractInjectionTargetBeanBuilder.java?rev=1432468&r1=1432467&r2=1432468&view=diff
==============================================================================
--- openwebbeans/trunk/webbeans-impl/src/main/java/org/apache/webbeans/component/creation/AbstractInjectionTargetBeanBuilder.java (original)
+++ openwebbeans/trunk/webbeans-impl/src/main/java/org/apache/webbeans/component/creation/AbstractInjectionTargetBeanBuilder.java Sat Jan 12 16:32:11 2013
@@ -37,6 +37,7 @@ import javax.enterprise.event.Reception;
 import javax.enterprise.inject.Disposes;
 import javax.enterprise.inject.Produces;
 import javax.enterprise.inject.Specializes;
+import javax.enterprise.inject.spi.AnnotatedConstructor;
 import javax.enterprise.inject.spi.AnnotatedField;
 import javax.enterprise.inject.spi.AnnotatedMethod;
 import javax.enterprise.inject.spi.AnnotatedParameter;
@@ -99,6 +100,71 @@ public abstract class AbstractInjectionT
         defineName(WebBeansUtil.getManagedBeanDefaultName(getAnnotated().getJavaClass().getSimpleName()));
     }
 
+
+
+    protected AnnotatedConstructor<T> getBeanConstructor()
+    {
+        Asserts.assertNotNull(getAnnotated(),"Type is null");
+        AnnotatedConstructor<T> result = null;
+
+        Set<AnnotatedConstructor<T>> annConsts = getAnnotated().getConstructors();
+        if(annConsts != null)
+        {
+            boolean found = false;
+            boolean noParamConsIsDefined = false;
+            for(AnnotatedConstructor<T> annConst : annConsts)
+            {
+                if(annConst.isAnnotationPresent(Inject.class))
+                {
+                    if (found)
+                    {
+                        throw new WebBeansConfigurationException("There are more than one constructor with @Inject annotation in annotation type : "
+                                + getAnnotated());
+                    }
+
+                    found = true;
+                    result = annConst;
+                }
+                else
+                {
+                    if(!found && !noParamConsIsDefined)
+                    {
+                        List<AnnotatedParameter<T>> parameters = annConst.getParameters();
+                        if(parameters != null && parameters.isEmpty())
+                        {
+                            result = annConst;
+                            noParamConsIsDefined = true;
+                        }
+                    }
+                }
+            }
+        }
+
+        if (result == null)
+        {
+            throw new WebBeansConfigurationException("No constructor is found for the annotated type : " + getAnnotated());
+        }
+
+        List<AnnotatedParameter<T>> parameters = result.getParameters();
+        for(AnnotatedParameter<T> parameter : parameters)
+        {
+            if (parameter.isAnnotationPresent(Disposes.class))
+            {
+                throw new WebBeansConfigurationException("Constructor parameter annotations can not contain @Disposes annotation in annotated constructor : "
+                        + result);
+            }
+
+            if(parameter.isAnnotationPresent(Observes.class))
+            {
+                throw new WebBeansConfigurationException("Constructor parameter annotations can not contain @Observes annotation in annotated constructor : " + result);
+            }
+
+        }
+
+        return result;
+    }
+
+
     /**
      * {@inheritDoc}
      */
@@ -506,7 +572,7 @@ public abstract class AbstractInjectionT
                     {
                         producerFieldBean.getTypes().addAll(annotatedField.getTypeClosure());
                     }
-                    WebBeansUtil.checkProducerGenericType(producerFieldBean,annotatedField.getJavaMember());
+                    WebBeansUtil.checkProducerGenericType(producerFieldBean, annotatedField.getJavaMember());
                     
                     producerBeans.add(producerFieldBean);
                 }
@@ -563,8 +629,8 @@ public abstract class AbstractInjectionT
                 }
                 
                 webBeansContext.getWebBeansUtil().setBeanEnableFlagForProducerBean(bean,
-                                                                                   producerMethodBean,
-                                                                                   AnnotationUtil.asArray(annotatedMethod.getAnnotations()));
+                        producerMethodBean,
+                        AnnotationUtil.asArray(annotatedMethod.getAnnotations()));
 
                 if (producerMethodBean.getReturnType().isArray())
                 {

Modified: openwebbeans/trunk/webbeans-impl/src/main/java/org/apache/webbeans/component/creation/CdiInterceptorBeanBuilder.java
URL: http://svn.apache.org/viewvc/openwebbeans/trunk/webbeans-impl/src/main/java/org/apache/webbeans/component/creation/CdiInterceptorBeanBuilder.java?rev=1432468&r1=1432467&r2=1432468&view=diff
==============================================================================
--- openwebbeans/trunk/webbeans-impl/src/main/java/org/apache/webbeans/component/creation/CdiInterceptorBeanBuilder.java (original)
+++ openwebbeans/trunk/webbeans-impl/src/main/java/org/apache/webbeans/component/creation/CdiInterceptorBeanBuilder.java Sat Jan 12 16:32:11 2013
@@ -19,13 +19,17 @@
 package org.apache.webbeans.component.creation;
 
 
+import javax.enterprise.inject.spi.AnnotatedConstructor;
 import javax.enterprise.inject.spi.AnnotatedType;
+import javax.enterprise.inject.spi.InjectionPoint;
 
 import java.lang.annotation.Annotation;
+import java.util.List;
 
 import org.apache.webbeans.component.CdiInterceptorBean;
 import org.apache.webbeans.config.WebBeansContext;
 import org.apache.webbeans.exception.WebBeansConfigurationException;
+import org.apache.webbeans.inject.impl.InjectionPointFactory;
 import org.apache.webbeans.util.ArrayUtil;
 
 /**
@@ -33,6 +37,8 @@ import org.apache.webbeans.util.ArrayUti
  */
 public class CdiInterceptorBeanBuilder<T> extends InterceptorBeanBuilder<T>
 {
+    private AnnotatedConstructor<T> constructor;
+
     public CdiInterceptorBeanBuilder(WebBeansContext webBeansContext, AnnotatedType<T> annotatedType)
     {
         super(new CdiInterceptorBean<T>(webBeansContext, annotatedType));
@@ -63,6 +69,30 @@ public class CdiInterceptorBeanBuilder<T
         getBean().setInterceptorBindings(ArrayUtil.asSet(bindings));
     }
 
+    public void defineConstructor()
+    {
+        constructor = getBeanConstructor();
+        addConstructorInjectionPointMetaData();
+    }
+
+
+    protected void addConstructorInjectionPointMetaData()
+    {
+        if (constructor == null)
+        {
+            return;
+        }
+        CdiInterceptorBean<T> bean = getBean();
+        InjectionPointFactory injectionPointFactory = webBeansContext.getInjectionPointFactory();
+        List<InjectionPoint> injectionPoints = injectionPointFactory.getConstructorInjectionPointData(bean, constructor);
+        for (InjectionPoint injectionPoint : injectionPoints)
+        {
+            addImplicitComponentForInjectionPoint(injectionPoint);
+            bean.addInjectionPoint(injectionPoint);
+        }
+        bean.setConstructor(constructor.getJavaMember());
+    }
+
     public CdiInterceptorBean<T> getBean()
     {
         return (CdiInterceptorBean<T>)super.getBean();

Modified: openwebbeans/trunk/webbeans-impl/src/main/java/org/apache/webbeans/component/creation/InterceptorBeanBuilder.java
URL: http://svn.apache.org/viewvc/openwebbeans/trunk/webbeans-impl/src/main/java/org/apache/webbeans/component/creation/InterceptorBeanBuilder.java?rev=1432468&r1=1432467&r2=1432468&view=diff
==============================================================================
--- openwebbeans/trunk/webbeans-impl/src/main/java/org/apache/webbeans/component/creation/InterceptorBeanBuilder.java (original)
+++ openwebbeans/trunk/webbeans-impl/src/main/java/org/apache/webbeans/component/creation/InterceptorBeanBuilder.java Sat Jan 12 16:32:11 2013
@@ -75,6 +75,8 @@ public abstract class InterceptorBeanBui
      */
     public abstract boolean isInterceptorEnabled();
 
+    public abstract void defineConstructor();
+
     protected void checkInterceptorConditions()
     {
         Set<AnnotatedMethod<? super T>> methods = getAnnotated().getMethods();
@@ -95,6 +97,7 @@ public abstract class InterceptorBeanBui
 
     protected void defineInterceptorRules()
     {
+        defineConstructor();
         defineInterceptorMethods();
         defineInjectedMethods();
         defineInjectedFields();

Modified: openwebbeans/trunk/webbeans-impl/src/main/java/org/apache/webbeans/component/creation/ManagedBeanBuilder.java
URL: http://svn.apache.org/viewvc/openwebbeans/trunk/webbeans-impl/src/main/java/org/apache/webbeans/component/creation/ManagedBeanBuilder.java?rev=1432468&r1=1432467&r2=1432468&view=diff
==============================================================================
--- openwebbeans/trunk/webbeans-impl/src/main/java/org/apache/webbeans/component/creation/ManagedBeanBuilder.java (original)
+++ openwebbeans/trunk/webbeans-impl/src/main/java/org/apache/webbeans/component/creation/ManagedBeanBuilder.java Sat Jan 12 16:32:11 2013
@@ -27,18 +27,14 @@ import java.util.List;
 import java.util.Map;
 import java.util.Set;
 
-import javax.enterprise.event.Observes;
-import javax.enterprise.inject.Disposes;
 import javax.enterprise.inject.spi.AnnotatedConstructor;
 import javax.enterprise.inject.spi.AnnotatedField;
 import javax.enterprise.inject.spi.AnnotatedMethod;
-import javax.enterprise.inject.spi.AnnotatedParameter;
 import javax.enterprise.inject.spi.AnnotatedType;
 import javax.enterprise.inject.spi.InjectionPoint;
 import javax.enterprise.inject.spi.ObserverMethod;
 import javax.enterprise.inject.spi.ProcessInjectionTarget;
 import javax.enterprise.inject.spi.Producer;
-import javax.inject.Inject;
 
 import org.apache.webbeans.component.ManagedBean;
 import org.apache.webbeans.component.ProducerFieldBean;
@@ -49,14 +45,12 @@ import org.apache.webbeans.container.Bea
 import org.apache.webbeans.decorator.DecoratorUtil;
 import org.apache.webbeans.decorator.WebBeansDecoratorConfig;
 import org.apache.webbeans.event.ObserverMethodImpl;
-import org.apache.webbeans.exception.WebBeansConfigurationException;
 import org.apache.webbeans.exception.inject.DeploymentException;
 import org.apache.webbeans.inject.impl.InjectionPointFactory;
 import org.apache.webbeans.logger.WebBeansLoggerFacade;
 import org.apache.webbeans.portable.events.ProcessBeanImpl;
 import org.apache.webbeans.portable.events.ProcessProducerImpl;
 import org.apache.webbeans.portable.events.generics.GProcessManagedBean;
-import org.apache.webbeans.util.Asserts;
 import org.apache.webbeans.util.WebBeansUtil;
 
 /**
@@ -269,69 +263,7 @@ public class ManagedBeanBuilder<T> exten
         }
 
     }
-    
-    protected AnnotatedConstructor<T> getBeanConstructor()
-    {
-        Asserts.assertNotNull(getAnnotated(),"Type is null");
-        AnnotatedConstructor<T> result = null;
-        
-        Set<AnnotatedConstructor<T>> annConsts = getAnnotated().getConstructors();
-        if(annConsts != null)
-        {
-            boolean found = false;
-            boolean noParamConsIsDefined = false;
-            for(AnnotatedConstructor<T> annConst : annConsts)
-            {
-                if(annConst.isAnnotationPresent(Inject.class))
-                {
-                    if (found)
-                    {
-                        throw new WebBeansConfigurationException("There are more than one constructor with @Inject annotation in annotation type : "
-                                                                 + getAnnotated());
-                    }
-                    
-                    found = true;
-                    result = annConst;
-                }
-                else
-                {
-                    if(!found && !noParamConsIsDefined)
-                    {
-                        List<AnnotatedParameter<T>> parameters = annConst.getParameters();
-                        if(parameters != null && parameters.isEmpty())
-                        {
-                            result = annConst;
-                            noParamConsIsDefined = true;
-                        }                        
-                    }
-                }
-            }
-        }
-        
-        if (result == null)
-        {
-            throw new WebBeansConfigurationException("No constructor is found for the annotated type : " + getAnnotated());
-        }
-        
-        List<AnnotatedParameter<T>> parameters = result.getParameters();
-        for(AnnotatedParameter<T> parameter : parameters)
-        {
-            if (parameter.isAnnotationPresent(Disposes.class))
-            {
-                throw new WebBeansConfigurationException("Constructor parameter annotations can not contain @Disposes annotation in annotated constructor : "
-                                                         + result);
-            }
-            
-            if(parameter.isAnnotationPresent(Observes.class))
-            {
-                throw new WebBeansConfigurationException("Constructor parameter annotations can not contain @Observes annotation in annotated constructor : " + result);
-            }
-            
-        }
 
-        return result;
-    }
-    
     protected void addConstructorInjectionPointMetaData(ManagedBean<T> bean)
     {
         if (constructor == null)

Modified: openwebbeans/trunk/webbeans-impl/src/test/java/org/apache/webbeans/newtests/interceptors/resolution/InterceptorBeanBuilderTest.java
URL: http://svn.apache.org/viewvc/openwebbeans/trunk/webbeans-impl/src/test/java/org/apache/webbeans/newtests/interceptors/resolution/InterceptorBeanBuilderTest.java?rev=1432468&r1=1432467&r2=1432468&view=diff
==============================================================================
--- openwebbeans/trunk/webbeans-impl/src/test/java/org/apache/webbeans/newtests/interceptors/resolution/InterceptorBeanBuilderTest.java (original)
+++ openwebbeans/trunk/webbeans-impl/src/test/java/org/apache/webbeans/newtests/interceptors/resolution/InterceptorBeanBuilderTest.java Sat Jan 12 16:32:11 2013
@@ -19,6 +19,7 @@
 package org.apache.webbeans.newtests.interceptors.resolution;
 
 
+import javax.enterprise.context.spi.CreationalContext;
 import javax.enterprise.inject.spi.AnnotatedType;
 import javax.enterprise.inject.spi.InterceptionType;
 import javax.enterprise.inject.spi.Interceptor;
@@ -124,6 +125,10 @@ public class InterceptorBeanBuilderTest 
         Assert.assertEquals(2, bean.getInterceptorMethods(InterceptionType.POST_CONSTRUCT).length);
         Assert.assertEquals(2, bean.getInterceptorMethods(InterceptionType.PRE_DESTROY).length);
 
+        CreationalContext<TestInterceptor1> cc = getBeanManager().createCreationalContext(bean);
+        TestInterceptor1 interceptorInstance = bean.create(cc);
+        Assert.assertNotNull(interceptorInstance);
+
         shutDownContainer();
     }
 }