You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@openwebbeans.apache.org by rs...@apache.org on 2014/09/29 10:45:44 UTC

svn commit: r1628137 - in /openwebbeans/trunk/webbeans-impl/src: main/java/org/apache/webbeans/component/creation/ main/java/org/apache/webbeans/util/ test/java/org/apache/webbeans/test/util/

Author: rsandtner
Date: Mon Sep 29 08:45:43 2014
New Revision: 1628137

URL: http://svn.apache.org/r1628137
Log:
OWB-1012 implemented validation of producers

Modified:
    openwebbeans/trunk/webbeans-impl/src/main/java/org/apache/webbeans/component/creation/AbstractProducerBeanBuilder.java
    openwebbeans/trunk/webbeans-impl/src/main/java/org/apache/webbeans/component/creation/ProducerFieldBeansBuilder.java
    openwebbeans/trunk/webbeans-impl/src/main/java/org/apache/webbeans/component/creation/ProducerMethodBeansBuilder.java
    openwebbeans/trunk/webbeans-impl/src/main/java/org/apache/webbeans/util/GenericsUtil.java
    openwebbeans/trunk/webbeans-impl/src/test/java/org/apache/webbeans/test/util/GenericsUtilTest.java

Modified: openwebbeans/trunk/webbeans-impl/src/main/java/org/apache/webbeans/component/creation/AbstractProducerBeanBuilder.java
URL: http://svn.apache.org/viewvc/openwebbeans/trunk/webbeans-impl/src/main/java/org/apache/webbeans/component/creation/AbstractProducerBeanBuilder.java?rev=1628137&r1=1628136&r2=1628137&view=diff
==============================================================================
--- openwebbeans/trunk/webbeans-impl/src/main/java/org/apache/webbeans/component/creation/AbstractProducerBeanBuilder.java (original)
+++ openwebbeans/trunk/webbeans-impl/src/main/java/org/apache/webbeans/component/creation/AbstractProducerBeanBuilder.java Mon Sep 29 08:45:43 2014
@@ -18,14 +18,21 @@
  */
 package org.apache.webbeans.component.creation;
 
+import javax.enterprise.context.Dependent;
 import javax.enterprise.inject.spi.AnnotatedMember;
 import javax.enterprise.inject.spi.AnnotatedType;
 import javax.enterprise.inject.spi.BeanAttributes;
 import javax.enterprise.inject.spi.DefinitionException;
 
+import java.lang.reflect.GenericArrayType;
+import java.lang.reflect.ParameterizedType;
+import java.lang.reflect.Type;
+
 import org.apache.webbeans.component.AbstractProducerBean;
 import org.apache.webbeans.component.InjectionTargetBean;
 import org.apache.webbeans.util.Asserts;
+import org.apache.webbeans.util.ClassUtil;
+import org.apache.webbeans.util.GenericsUtil;
 
 public abstract class AbstractProducerBeanBuilder<T, A extends AnnotatedMember<?>, P extends AbstractProducerBean<T>>
 {
@@ -59,7 +66,27 @@ public abstract class AbstractProducerBe
      */
     public void validate() throws DefinitionException
     {
-
+        Type type = annotatedMember.getBaseType();
+        if (type instanceof GenericArrayType)
+        {
+            throw new DefinitionException("Produced Type must not be a GenericArrayType");
+        }
+        else if (ClassUtil.isParametrizedType(type))
+        {
+            if (GenericsUtil.containsWildcardType(type))
+            {
+                throw new DefinitionException("Produced type must not be a WildcardType");
+            }
+            else if (!Dependent.class.equals(beanAttributes.getScope()))
+            {
+
+                ParameterizedType parameterizedType = GenericsUtil.getParameterizedType(type);
+                if (GenericsUtil.containTypeVariable(parameterizedType.getActualTypeArguments()))
+                {
+                    throw new DefinitionException("Produced ParametrizedType must be @Dependent-Scope");
+                }
+            }
+        }
     }
 
     protected abstract <X> P createBean(InjectionTargetBean<X> parent, Class<T> beanClass);

Modified: openwebbeans/trunk/webbeans-impl/src/main/java/org/apache/webbeans/component/creation/ProducerFieldBeansBuilder.java
URL: http://svn.apache.org/viewvc/openwebbeans/trunk/webbeans-impl/src/main/java/org/apache/webbeans/component/creation/ProducerFieldBeansBuilder.java?rev=1628137&r1=1628136&r2=1628137&view=diff
==============================================================================
--- openwebbeans/trunk/webbeans-impl/src/main/java/org/apache/webbeans/component/creation/ProducerFieldBeansBuilder.java (original)
+++ openwebbeans/trunk/webbeans-impl/src/main/java/org/apache/webbeans/component/creation/ProducerFieldBeansBuilder.java Mon Sep 29 08:45:43 2014
@@ -114,7 +114,11 @@ public class ProducerFieldBeansBuilder<T
                     ProducerFieldBeanBuilder<T, ProducerFieldBean<T>> producerFieldBeanCreator
                         = new ProducerFieldBeanBuilder<T, ProducerFieldBean<T>>(bean, annotatedField, beanAttributes);
                     ProducerFieldBean<T> producerFieldBean = producerFieldBeanCreator.getBean();
+
+                    //X TODO validateProxyable returns the exception, throw the returned exception??
                     webBeansContext.getDeploymentValidationService().validateProxyable(producerFieldBean);
+                    producerFieldBeanCreator.validate();
+
                     producerFieldBean.setProducerField(field);
 
                     webBeansContext.getWebBeansUtil().setBeanEnableFlagForProducerBean(bean, producerFieldBean, anns);

Modified: openwebbeans/trunk/webbeans-impl/src/main/java/org/apache/webbeans/component/creation/ProducerMethodBeansBuilder.java
URL: http://svn.apache.org/viewvc/openwebbeans/trunk/webbeans-impl/src/main/java/org/apache/webbeans/component/creation/ProducerMethodBeansBuilder.java?rev=1628137&r1=1628136&r2=1628137&view=diff
==============================================================================
--- openwebbeans/trunk/webbeans-impl/src/main/java/org/apache/webbeans/component/creation/ProducerMethodBeansBuilder.java (original)
+++ openwebbeans/trunk/webbeans-impl/src/main/java/org/apache/webbeans/component/creation/ProducerMethodBeansBuilder.java Mon Sep 29 08:45:43 2014
@@ -97,7 +97,9 @@ public class ProducerMethodBeansBuilder<
 
                     ProducerMethodBean<T> producerMethodBean = producerMethodBeanCreator.getBean();
 
+                    //X TODO validateProxyable returns the exception, throw the returned exception??
                     webBeansContext.getDeploymentValidationService().validateProxyable(producerMethodBean);
+                    producerMethodBeanCreator.validate();
 
                     if(specialize)
                     {

Modified: openwebbeans/trunk/webbeans-impl/src/main/java/org/apache/webbeans/util/GenericsUtil.java
URL: http://svn.apache.org/viewvc/openwebbeans/trunk/webbeans-impl/src/main/java/org/apache/webbeans/util/GenericsUtil.java?rev=1628137&r1=1628136&r2=1628137&view=diff
==============================================================================
--- openwebbeans/trunk/webbeans-impl/src/main/java/org/apache/webbeans/util/GenericsUtil.java (original)
+++ openwebbeans/trunk/webbeans-impl/src/main/java/org/apache/webbeans/util/GenericsUtil.java Mon Sep 29 08:45:43 2014
@@ -454,7 +454,43 @@ public final class GenericsUtil
         }
         return false;
     }
-    
+
+    /**
+     *
+     * @param type to check
+     *
+     * @return {@code true} if the given type contains a {@link java.lang.reflect.WildcardType}
+     *         {@code false} otherwise
+     */
+    public static boolean containsWildcardType(Type type)
+    {
+        if (!(type instanceof ParameterizedType))
+        {
+            return false;
+        }
+
+        for (Type typeArgument : getParameterizedType(type).getActualTypeArguments())
+        {
+            if (ClassUtil.isParametrizedType(typeArgument))
+            {
+                if (containsWildcardType(typeArgument))
+                {
+                    return true;
+                }
+            }
+            else
+            {
+                if (ClassUtil.isWildCardType(typeArgument))
+                {
+                    return true;
+                }
+            }
+        }
+
+        return false;
+    }
+
+
     /**
      * Resolves the actual type of the specified field for the type hierarchy specified by the given subclass
      */

Modified: openwebbeans/trunk/webbeans-impl/src/test/java/org/apache/webbeans/test/util/GenericsUtilTest.java
URL: http://svn.apache.org/viewvc/openwebbeans/trunk/webbeans-impl/src/test/java/org/apache/webbeans/test/util/GenericsUtilTest.java?rev=1628137&r1=1628136&r2=1628137&view=diff
==============================================================================
--- openwebbeans/trunk/webbeans-impl/src/test/java/org/apache/webbeans/test/util/GenericsUtilTest.java (original)
+++ openwebbeans/trunk/webbeans-impl/src/test/java/org/apache/webbeans/test/util/GenericsUtilTest.java Mon Sep 29 08:45:43 2014
@@ -58,6 +58,15 @@ public class GenericsUtilTest {
         assertEquals(SubInterface.class, GenericsUtil.getRawType(subInterfaceType));
     }
 
+    @Test
+    public void testContainsWildcardTypes() throws Exception
+    {
+        Assert.assertFalse(GenericsUtil.containsWildcardType(StringObject.class));
+        Assert.assertTrue(GenericsUtil.containsWildcardType(GenericNumberObject.class.getMethod("getObject").getGenericReturnType()));
+        Assert.assertFalse(GenericsUtil.containsWildcardType(GenericObject.class.getMethod("getObject").getGenericReturnType()));
+    }
+
+
     public static abstract class AbstractObject<V> {
     
         private V field;
@@ -73,10 +82,19 @@ public class GenericsUtilTest {
 
     private static class GenericObject<T, V> extends AbstractObject<T> {
 
+        public GenericObject<T, V> getObject()
+        {
+            return new GenericObject<T, V>();
+        }
+
     }
 
     private static class GenericNumberObject<X, Y extends Number & Comparable<Integer>> extends AbstractObject<Y> {
 
+        public GenericNumberObject<?, ? extends Comparable<Integer>> getObject()
+        {
+            return new GenericNumberObject<X, Integer>();
+        }
     }
 
     private static class IntegerObject extends GenericNumberObject<String, Integer> {