You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@openwebbeans.apache.org by rm...@apache.org on 2014/10/01 16:54:27 UTC

svn commit: r1628724 - in /openwebbeans/trunk/webbeans-impl/src: main/java/org/apache/webbeans/component/creation/ main/java/org/apache/webbeans/config/ main/java/org/apache/webbeans/container/ main/java/org/apache/webbeans/decorator/ main/java/org/apa...

Author: rmannibucau
Date: Wed Oct  1 14:54:27 2014
New Revision: 1628724

URL: http://svn.apache.org/r1628724
Log:
some more generics - producer and managed beans don't share rules :'(

Modified:
    openwebbeans/trunk/webbeans-impl/src/main/java/org/apache/webbeans/component/creation/AbstractBeanBuilder.java
    openwebbeans/trunk/webbeans-impl/src/main/java/org/apache/webbeans/component/creation/BaseProducerFactory.java
    openwebbeans/trunk/webbeans-impl/src/main/java/org/apache/webbeans/config/BeansDeployer.java
    openwebbeans/trunk/webbeans-impl/src/main/java/org/apache/webbeans/container/BeanManagerImpl.java
    openwebbeans/trunk/webbeans-impl/src/main/java/org/apache/webbeans/container/InjectionResolver.java
    openwebbeans/trunk/webbeans-impl/src/main/java/org/apache/webbeans/decorator/DecoratorsManager.java
    openwebbeans/trunk/webbeans-impl/src/main/java/org/apache/webbeans/event/NotificationManager.java
    openwebbeans/trunk/webbeans-impl/src/main/java/org/apache/webbeans/portable/EventProducer.java
    openwebbeans/trunk/webbeans-impl/src/main/java/org/apache/webbeans/util/GenericsUtil.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/injection/generics/zoo/GenericsInTheZooTest.java
    openwebbeans/trunk/webbeans-impl/src/test/java/org/apache/webbeans/test/unittests/inject/parametrized/GenericClassTest.java

Modified: openwebbeans/trunk/webbeans-impl/src/main/java/org/apache/webbeans/component/creation/AbstractBeanBuilder.java
URL: http://svn.apache.org/viewvc/openwebbeans/trunk/webbeans-impl/src/main/java/org/apache/webbeans/component/creation/AbstractBeanBuilder.java?rev=1628724&r1=1628723&r2=1628724&view=diff
==============================================================================
--- openwebbeans/trunk/webbeans-impl/src/main/java/org/apache/webbeans/component/creation/AbstractBeanBuilder.java (original)
+++ openwebbeans/trunk/webbeans-impl/src/main/java/org/apache/webbeans/component/creation/AbstractBeanBuilder.java Wed Oct  1 14:54:27 2014
@@ -59,7 +59,7 @@ public abstract class AbstractBeanBuilde
                     boolean found = false;
                     for (final ProducerMethodBean<?> producer : producerBeans)
                     {
-                        if (GenericsUtil.satisfiesDependency(false, producer.getCreatorMethod().getGenericReturnType(), param.getBaseType()))
+                        if (GenericsUtil.satisfiesDependency(false, true, producer.getCreatorMethod().getGenericReturnType(), param.getBaseType()))
                         {
                             found = true;
                             break;
@@ -69,7 +69,7 @@ public abstract class AbstractBeanBuilde
                     {
                         for (final ProducerFieldBean<?> field : producerFields)
                         {
-                            if (GenericsUtil.satisfiesDependency(false, field.getCreatorField().getType(), param.getBaseType()))
+                            if (GenericsUtil.satisfiesDependency(false, true, field.getCreatorField().getType(), param.getBaseType()))
                             {
                                 found = true;
                                 break;
@@ -81,7 +81,7 @@ public abstract class AbstractBeanBuilde
                             // see if @Disposes should just be ignored as well - no inheritance
                             for (final AnnotatedMethod<?> producer : ignoredProducers)
                             {
-                                if (GenericsUtil.satisfiesDependency(false, producer.getJavaMember().getGenericReturnType(), param.getBaseType()))
+                                if (GenericsUtil.satisfiesDependency(false, true, producer.getJavaMember().getGenericReturnType(), param.getBaseType()))
                                 {
                                     found = true;
                                     break;

Modified: openwebbeans/trunk/webbeans-impl/src/main/java/org/apache/webbeans/component/creation/BaseProducerFactory.java
URL: http://svn.apache.org/viewvc/openwebbeans/trunk/webbeans-impl/src/main/java/org/apache/webbeans/component/creation/BaseProducerFactory.java?rev=1628724&r1=1628723&r2=1628724&view=diff
==============================================================================
--- openwebbeans/trunk/webbeans-impl/src/main/java/org/apache/webbeans/component/creation/BaseProducerFactory.java (original)
+++ openwebbeans/trunk/webbeans-impl/src/main/java/org/apache/webbeans/component/creation/BaseProducerFactory.java Wed Oct  1 14:54:27 2014
@@ -102,7 +102,7 @@ public abstract class BaseProducerFactor
                 {
                     if (annotatedParameter.isAnnotationPresent(Disposes.class))
                     {
-                        if (!GenericsUtil.satisfiesDependency(false, producerBaseType, annotatedParameter.getBaseType()))
+                        if (!GenericsUtil.satisfiesDependency(false, true, producerBaseType, annotatedParameter.getBaseType()))
                         {
                             continue;
                         }

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=1628724&r1=1628723&r2=1628724&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 Wed Oct  1 14:54:27 2014
@@ -384,7 +384,7 @@ public class BeansDeployer
 
                         if (pt1.getRawType() == pt2.getRawType())
                         {
-                            if (!GenericsUtil.isAssignableFrom(true, pt1, pt2))
+                            if (!GenericsUtil.isAssignableFrom(true, false, pt1, pt2))
                             {
                                 throw new DefinitionException("Generic error matching " + api + " and " + t);
                             }

Modified: openwebbeans/trunk/webbeans-impl/src/main/java/org/apache/webbeans/container/BeanManagerImpl.java
URL: http://svn.apache.org/viewvc/openwebbeans/trunk/webbeans-impl/src/main/java/org/apache/webbeans/container/BeanManagerImpl.java?rev=1628724&r1=1628723&r2=1628724&view=diff
==============================================================================
--- openwebbeans/trunk/webbeans-impl/src/main/java/org/apache/webbeans/container/BeanManagerImpl.java (original)
+++ openwebbeans/trunk/webbeans-impl/src/main/java/org/apache/webbeans/container/BeanManagerImpl.java Wed Oct  1 14:54:27 2014
@@ -55,6 +55,7 @@ import javax.naming.Referenceable;
 import javax.naming.StringRefAddr;
 
 import org.apache.webbeans.component.AbstractOwbBean;
+import org.apache.webbeans.component.AbstractProducerBean;
 import org.apache.webbeans.component.CdiInterceptorBean;
 import org.apache.webbeans.component.DecoratorBean;
 import org.apache.webbeans.component.EnterpriseBeanMarker;
@@ -694,7 +695,7 @@ public class BeanManagerImpl implements 
         if(beanType != null && beanType != Object.class)
         {
             if(!isBeanTypeAssignableToGivenType(bean.getTypes(), beanType, bean instanceof NewBean) &&
-               !GenericsUtil.satisfiesDependency(false, beanType, bean.getBeanClass()))
+               !GenericsUtil.satisfiesDependency(false, AbstractProducerBean.class.isInstance(bean), beanType, bean.getBeanClass()))
             {
                 throw new IllegalArgumentException("Given bean type : " + beanType + " is not applicable for the bean instance : " + bean);
             }
@@ -872,7 +873,7 @@ public class BeanManagerImpl implements 
         {
             Type beanApiType = itBeanApiTypes.next();
 
-            if(GenericsUtil.satisfiesDependency(false, givenType, beanApiType))
+            if(GenericsUtil.satisfiesDependency(false, false, givenType, beanApiType))
             {
                 return true;
             }

Modified: openwebbeans/trunk/webbeans-impl/src/main/java/org/apache/webbeans/container/InjectionResolver.java
URL: http://svn.apache.org/viewvc/openwebbeans/trunk/webbeans-impl/src/main/java/org/apache/webbeans/container/InjectionResolver.java?rev=1628724&r1=1628723&r2=1628724&view=diff
==============================================================================
--- openwebbeans/trunk/webbeans-impl/src/main/java/org/apache/webbeans/container/InjectionResolver.java (original)
+++ openwebbeans/trunk/webbeans-impl/src/main/java/org/apache/webbeans/container/InjectionResolver.java Wed Oct  1 14:54:27 2014
@@ -21,6 +21,7 @@ package org.apache.webbeans.container;
 import org.apache.webbeans.annotation.AnyLiteral;
 import org.apache.webbeans.annotation.DefaultLiteral;
 import org.apache.webbeans.component.AbstractOwbBean;
+import org.apache.webbeans.component.AbstractProducerBean;
 import org.apache.webbeans.component.InjectionTargetBean;
 import org.apache.webbeans.component.ManagedBean;
 import org.apache.webbeans.component.OwbBean;
@@ -472,7 +473,8 @@ public class InjectionResolver
                 for (Type componentApiType : component.getTypes())
                 {
 
-                    if (GenericsUtil.satisfiesDependency(isDelegate, injectionPointType, componentApiType))
+                    if (GenericsUtil.satisfiesDependency(isDelegate, AbstractProducerBean.class.isInstance(component),
+                            injectionPointType, componentApiType))
                     {
                         resolvedComponents.add(component);
                         break;

Modified: openwebbeans/trunk/webbeans-impl/src/main/java/org/apache/webbeans/decorator/DecoratorsManager.java
URL: http://svn.apache.org/viewvc/openwebbeans/trunk/webbeans-impl/src/main/java/org/apache/webbeans/decorator/DecoratorsManager.java?rev=1628724&r1=1628723&r2=1628724&view=diff
==============================================================================
--- openwebbeans/trunk/webbeans-impl/src/main/java/org/apache/webbeans/decorator/DecoratorsManager.java (original)
+++ openwebbeans/trunk/webbeans-impl/src/main/java/org/apache/webbeans/decorator/DecoratorsManager.java Wed Oct  1 14:54:27 2014
@@ -222,7 +222,7 @@ public class DecoratorsManager
         boolean ok = false;
         for (Type apiType : apiTypes)
         {
-            if (GenericsUtil.satisfiesDependency(true, decorator.getDelegateType(), apiType))
+            if (GenericsUtil.satisfiesDependency(true, false, decorator.getDelegateType(), apiType))
             {
                 ok = true;
                 break;

Modified: openwebbeans/trunk/webbeans-impl/src/main/java/org/apache/webbeans/event/NotificationManager.java
URL: http://svn.apache.org/viewvc/openwebbeans/trunk/webbeans-impl/src/main/java/org/apache/webbeans/event/NotificationManager.java?rev=1628724&r1=1628723&r2=1628724&view=diff
==============================================================================
--- openwebbeans/trunk/webbeans-impl/src/main/java/org/apache/webbeans/event/NotificationManager.java (original)
+++ openwebbeans/trunk/webbeans-impl/src/main/java/org/apache/webbeans/event/NotificationManager.java Wed Oct  1 14:54:27 2014
@@ -285,7 +285,7 @@ public final class NotificationManager
         {
             for (Type eventType : eventTypes)
             {
-                if (GenericsUtil.isAssignableFrom(true, observedType, eventType))
+                if (GenericsUtil.isAssignableFrom(true, false, observedType, eventType))
                 {
                     Set<ObserverMethod<?>> observerMethods = observers.get(observedType);
 

Modified: openwebbeans/trunk/webbeans-impl/src/main/java/org/apache/webbeans/portable/EventProducer.java
URL: http://svn.apache.org/viewvc/openwebbeans/trunk/webbeans-impl/src/main/java/org/apache/webbeans/portable/EventProducer.java?rev=1628724&r1=1628723&r2=1628724&view=diff
==============================================================================
--- openwebbeans/trunk/webbeans-impl/src/main/java/org/apache/webbeans/portable/EventProducer.java (original)
+++ openwebbeans/trunk/webbeans-impl/src/main/java/org/apache/webbeans/portable/EventProducer.java Wed Oct  1 14:54:27 2014
@@ -64,7 +64,7 @@ public class EventProducer<T> extends Ab
             {
                 final ParameterizedType arg = ParameterizedType.class.cast(event);
                 final Type[] actualTypeArguments = arg.getActualTypeArguments();
-                if (actualTypeArguments.length > 0 && GenericsUtil.isAssignableFrom(true, actualTypeArguments[0], type))
+                if (actualTypeArguments.length > 0 && GenericsUtil.isAssignableFrom(true, false, actualTypeArguments[0], type))
                 {
                     list.add(original);
                 }

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=1628724&r1=1628723&r2=1628724&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 Wed Oct  1 14:54:27 2014
@@ -45,11 +45,11 @@ import org.apache.webbeans.config.OwbWil
  */
 public final class GenericsUtil
 {
-    public static boolean satisfiesDependency(boolean isDelegateOrEvent, Type injectionPointType, Type beanType)
+    public static boolean satisfiesDependency(boolean isDelegateOrEvent, boolean isProducer, Type injectionPointType, Type beanType)
     {
         if (beanType instanceof TypeVariable || beanType instanceof WildcardType || beanType instanceof GenericArrayType)
         {
-            return isAssignableFrom(isDelegateOrEvent, injectionPointType, beanType);
+            return isAssignableFrom(isDelegateOrEvent, isProducer, injectionPointType, beanType);
         }
         else
         {
@@ -58,7 +58,7 @@ public final class GenericsUtil
             
             if  (ClassUtil.isSame(injectionPointRawType, beanRawType))
             {
-                return isAssignableFrom(isDelegateOrEvent, injectionPointType, beanType);
+                return isAssignableFrom(isDelegateOrEvent, isProducer, injectionPointType, beanType);
             }
         }
 
@@ -68,7 +68,7 @@ public final class GenericsUtil
     /**
      * 5.2.3 and 5.2.4
      */
-    public static boolean isAssignableFrom(boolean isDelegateOrEvent, Type requiredType, Type beanType)
+    public static boolean isAssignableFrom(boolean isDelegateOrEvent, boolean isProducer, Type requiredType, Type beanType)
     {
         if (requiredType instanceof Class)
         {
@@ -76,7 +76,7 @@ public final class GenericsUtil
         }
         else if (requiredType instanceof ParameterizedType)
         {
-            return isAssignableFrom(isDelegateOrEvent, (ParameterizedType)requiredType, beanType);
+            return isAssignableFrom(isDelegateOrEvent, isProducer, (ParameterizedType)requiredType, beanType);
         }
         else if (requiredType instanceof TypeVariable)
         {
@@ -117,7 +117,7 @@ public final class GenericsUtil
         }
         else if (beanType instanceof WildcardType)
         {
-            return isAssignableFrom(isDelegateOrEvent, (Type)injectionPointType, (WildcardType)beanType);
+            return isAssignableFrom(isDelegateOrEvent, false, (Type)injectionPointType, (WildcardType)beanType);
         }
         else
         {
@@ -176,25 +176,21 @@ public final class GenericsUtil
 
     private static boolean isAssignableFrom(boolean isDelegateOrEvent, Class<?> injectionPointType, GenericArrayType beanType)
     {
-        if (!injectionPointType.isArray())
-        {
-            return false;
-        }
-        return isAssignableFrom(isDelegateOrEvent, injectionPointType.getComponentType(), beanType.getGenericComponentType());
+        return injectionPointType.isArray() && isAssignableFrom(isDelegateOrEvent, injectionPointType.getComponentType(), beanType.getGenericComponentType());
     }
     
-    private static boolean isAssignableFrom(boolean isDelegateOrEvent, Type injectionPointType, WildcardType beanType)
+    private static boolean isAssignableFrom(boolean isDelegateOrEvent, boolean isProducer, Type injectionPointType, WildcardType beanType)
     {
         for (Type bounds: beanType.getLowerBounds())
         {
-            if (!isAssignableFrom(isDelegateOrEvent, bounds, injectionPointType))
+            if (!isAssignableFrom(isDelegateOrEvent, false, bounds, injectionPointType))
             {
                 return false;
             }
         }
         for (Type bounds: beanType.getUpperBounds())
         {
-            if (isAssignableFrom(isDelegateOrEvent, injectionPointType, bounds))
+            if (isAssignableFrom(isDelegateOrEvent, false, injectionPointType, bounds))
             {
                 return true;
             }
@@ -202,23 +198,23 @@ public final class GenericsUtil
         return false;
     }
 
-    private static boolean isAssignableFrom(boolean isDelegateOrEvent, ParameterizedType injectionPointType, Type beanType)
+    private static boolean isAssignableFrom(boolean isDelegateOrEvent, boolean isProducer, ParameterizedType injectionPointType, Type beanType)
     {
         if (beanType instanceof Class)
         {
-            return isAssignableFrom(isDelegateOrEvent, injectionPointType, (Class<?>)beanType);
+            return isAssignableFrom(isDelegateOrEvent, isProducer, injectionPointType, (Class<?>)beanType);
         }
         else if (beanType instanceof TypeVariable)
         {
-            return isAssignableFrom(isDelegateOrEvent, injectionPointType, (TypeVariable<?>)beanType);
+            return isAssignableFrom(isDelegateOrEvent, isProducer, injectionPointType, (TypeVariable<?>)beanType);
         }
         else if (beanType instanceof ParameterizedType)
         {
-            return isAssignableFrom(isDelegateOrEvent, injectionPointType, (ParameterizedType)beanType);
+            return isAssignableFrom(isDelegateOrEvent, isProducer, injectionPointType, (ParameterizedType)beanType);
         }
         else if (beanType instanceof WildcardType)
         {
-            return isAssignableFrom(isDelegateOrEvent, (Type)injectionPointType, (WildcardType)beanType);
+            return isAssignableFrom(isDelegateOrEvent, isProducer, (Type)injectionPointType, (WildcardType)beanType);
         }
         else if (beanType instanceof GenericArrayType)
         {
@@ -230,7 +226,7 @@ public final class GenericsUtil
         }
     }
 
-    private static boolean isAssignableFrom(boolean isDelegateOrEvent, ParameterizedType injectionPointType, Class<?> beanType)
+    private static boolean isAssignableFrom(boolean isDelegateOrEvent, boolean isProducer, ParameterizedType injectionPointType, Class<?> beanType)
     {
         Class<?> rawInjectionPointType = getRawType(injectionPointType);
         if (rawInjectionPointType.equals(beanType))
@@ -241,13 +237,13 @@ public final class GenericsUtil
         {
             return false;
         }
-        if (beanType.getSuperclass() != null && isAssignableFrom(isDelegateOrEvent, injectionPointType, beanType.getGenericSuperclass()))
+        if (beanType.getSuperclass() != null && isAssignableFrom(isDelegateOrEvent, isProducer, injectionPointType, beanType.getGenericSuperclass()))
         {
             return true;
         }
         for (Type genericInterface: beanType.getGenericInterfaces())
         {
-            if (isAssignableFrom(isDelegateOrEvent, injectionPointType, genericInterface))
+            if (isAssignableFrom(isDelegateOrEvent, isProducer, injectionPointType, genericInterface))
             {
                 return true;
             }
@@ -255,11 +251,16 @@ public final class GenericsUtil
         return false;
     }
 
-    private static boolean isAssignableFrom(boolean isDelegateOrEvent, ParameterizedType injectionPointType, TypeVariable<?> beanType)
+    private static boolean isAssignableFrom(boolean isDelegateOrEvent, boolean isProducer, ParameterizedType injectionPointType, TypeVariable<?> beanType)
     {
-        for (Type bounds: beanType.getBounds())
+        final Type[] types = beanType.getBounds();
+        if (isNotBound(types))
         {
-            if (isAssignableFrom(isDelegateOrEvent, injectionPointType, bounds))
+            return true;
+        }
+        for (final Type bounds: types)
+        {
+            if (isAssignableFrom(isDelegateOrEvent, isProducer, injectionPointType, bounds))
             {
                 return true;
             }
@@ -270,7 +271,7 @@ public final class GenericsUtil
     /**
      * CDI Spec. 5.2.4
      */
-    private static boolean isAssignableFrom(boolean isDelegateOrEvent, ParameterizedType injectionPointType, ParameterizedType beanType)
+    private static boolean isAssignableFrom(boolean isDelegateOrEvent, boolean isProducer, ParameterizedType injectionPointType, ParameterizedType beanType)
     {
         if (injectionPointType.getRawType() != beanType.getRawType())
         {
@@ -290,21 +291,30 @@ public final class GenericsUtil
                 (injectionPointTypeArgument instanceof Class || injectionPointTypeArgument instanceof TypeVariable) &&
                 beanTypeArgument instanceof TypeVariable)
             {
-                for (Type upperBound: ((TypeVariable<?>)beanTypeArgument).getBounds())
+                final Type[] bounds = ((TypeVariable<?>) beanTypeArgument).getBounds();
+                final boolean isNotBound = isNotBound(bounds);
+                if (isNotBound)
+                {
+                    final boolean valid = Object.class == injectionPointTypeArgument
+                            || (TypeVariable.class.isInstance(injectionPointTypeArgument) && isNotBound(TypeVariable.class.cast(injectionPointTypeArgument).getBounds()));
+                    if (!valid)
+                    {
+                        return !isProducer;
+                    }
+                }
+                for (final Type upperBound : bounds)
                 {
-                    if (!isAssignableFrom(true, upperBound, injectionPointTypeArgument))
+                    if (!isAssignableFrom(true, false, upperBound, injectionPointTypeArgument))
                     {
                         return false;
                     }
                 }
-
             }
             else if (swapParams && injectionPointTypeArgument instanceof TypeVariable)
             {
                 return false;
             }
-            else if ((!TypeVariable.class.isInstance(beanTypeArgument) || TypeVariable.class.cast(beanTypeArgument).getGenericDeclaration() != beanType.getRawType())
-                && !isAssignableFrom(isDelegateOrEvent, injectionPointTypeArgument, beanTypeArgument))
+            else if (!isAssignableFrom(isDelegateOrEvent, false, injectionPointTypeArgument, beanTypeArgument))
             {
                 return false;
             }
@@ -312,11 +322,16 @@ public final class GenericsUtil
         return true;
     }
 
+    private static boolean isNotBound(final Type... bounds)
+    {
+        return bounds == null || bounds.length == 0 || (bounds.length == 1 && Object.class == bounds[0]);
+    }
+
     private static boolean isAssignableFrom(boolean isDelegateOrEvent, TypeVariable<?> injectionPointType, Type beanType)
     {
         for (Type bounds: injectionPointType.getBounds())
         {
-            if (!isAssignableFrom(isDelegateOrEvent, bounds, beanType))
+            if (!isAssignableFrom(isDelegateOrEvent, false, bounds, beanType))
             {
                 return false;
             }
@@ -335,9 +350,9 @@ public final class GenericsUtil
         }
         if (ParameterizedType.class.isInstance(genericComponentType))
         {
-            return isAssignableFrom(isDelegateOrEvent, ParameterizedType.class.cast(genericComponentType).getRawType(), componentType);
+            return isAssignableFrom(isDelegateOrEvent, false, ParameterizedType.class.cast(genericComponentType).getRawType(), componentType);
         }
-        return isAssignableFrom(isDelegateOrEvent, genericComponentType, componentType);
+        return isAssignableFrom(isDelegateOrEvent, false, genericComponentType, componentType);
     }
 
     private static boolean isAssignableFrom(boolean isDelegateOrEvent, WildcardType injectionPointType, Type beanType)
@@ -348,7 +363,7 @@ public final class GenericsUtil
         }
         for (Type bounds: injectionPointType.getLowerBounds())
         {
-            if (!isAssignableFrom(isDelegateOrEvent, beanType, bounds))
+            if (!isAssignableFrom(isDelegateOrEvent, false, beanType, bounds))
             {
                 return false;
             }
@@ -359,7 +374,7 @@ public final class GenericsUtil
             boolean isAssignable = false;
             for (Type beanSupertype: beanTypeClosure)
             {
-                if (isAssignableFrom(isDelegateOrEvent, bounds, beanSupertype)
+                if (isAssignableFrom(isDelegateOrEvent, false, bounds, beanSupertype)
                     || (Class.class.isInstance(bounds)
                         && ParameterizedType.class.isInstance(beanSupertype)
                         && bounds == ParameterizedType.class.cast(beanSupertype).getRawType()))
@@ -385,7 +400,7 @@ public final class GenericsUtil
         {
             for (Type bound: beanType.getBounds())
             {
-                if (!isAssignableFrom(isDelegateOrEvent, upperBound, bound) && !isAssignableFrom(isDelegateOrEvent, bound, upperBound))
+                if (!isAssignableFrom(isDelegateOrEvent, false, upperBound, bound) && !isAssignableFrom(isDelegateOrEvent, false, bound, upperBound))
                 {
                     return false;
                 }
@@ -395,7 +410,7 @@ public final class GenericsUtil
         {
             for (Type bound: beanType.getBounds())
             {
-                if (!isAssignableFrom(isDelegateOrEvent, bound, lowerBound))
+                if (!isAssignableFrom(isDelegateOrEvent, false, bound, lowerBound))
                 {
                     return false;
                 }

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=1628724&r1=1628723&r2=1628724&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 Wed Oct  1 14:54:27 2014
@@ -1645,7 +1645,7 @@ public final class WebBeansUtil
                     rawType.equals(Interceptor.class))
                 {
                     Type[] types = ClassUtil.getActualTypeArguments(injectionPoint.getType());
-                    if (types.length != 1 || !GenericsUtil.isAssignableFrom(false, bean.getBeanClass(), types[0]))
+                    if (types.length != 1 || !GenericsUtil.isAssignableFrom(false, AbstractProducerBean.class.isInstance(bean), bean.getBeanClass(), types[0]))
                     {
                         throw new DefinitionException("injected bean parameter must be " + rawType);
                     }
@@ -1859,7 +1859,7 @@ public final class WebBeansUtil
                     final Class<?> beanClass = AbstractOwbBean.class.isInstance(injectionPointBean) ?
                             AbstractOwbBean.class.cast(injectionPointBean).getReturnType() : injectionPointBean.getBeanClass();
                     final Type beanType = pt.getActualTypeArguments()[0];
-                    if (!GenericsUtil.isAssignableFrom(false, beanClass, beanType))
+                    if (!GenericsUtil.isAssignableFrom(false, AbstractProducerBean.class.isInstance(bean), beanClass, beanType))
                     {
                         throw new DefinitionException("@Inject Bean<X> can only be done in X, found " + beanType + " and " + beanClass);
                     }

Modified: openwebbeans/trunk/webbeans-impl/src/test/java/org/apache/webbeans/test/injection/generics/zoo/GenericsInTheZooTest.java
URL: http://svn.apache.org/viewvc/openwebbeans/trunk/webbeans-impl/src/test/java/org/apache/webbeans/test/injection/generics/zoo/GenericsInTheZooTest.java?rev=1628724&r1=1628723&r2=1628724&view=diff
==============================================================================
--- openwebbeans/trunk/webbeans-impl/src/test/java/org/apache/webbeans/test/injection/generics/zoo/GenericsInTheZooTest.java (original)
+++ openwebbeans/trunk/webbeans-impl/src/test/java/org/apache/webbeans/test/injection/generics/zoo/GenericsInTheZooTest.java Wed Oct  1 14:54:27 2014
@@ -18,11 +18,13 @@
  */
 package org.apache.webbeans.test.injection.generics.zoo;
 
+import org.apache.webbeans.exception.WebBeansConfigurationException;
 import org.apache.webbeans.test.AbstractUnitTest;
 import org.junit.Assert;
 import org.junit.Test;
 
 import javax.enterprise.context.Dependent;
+import javax.enterprise.inject.spi.DeploymentException;
 import javax.inject.Inject;
 
 /**
@@ -62,7 +64,7 @@ public class GenericsInTheZooTest extend
         }
     }
 
-    @Test
+    @Test(expected = WebBeansConfigurationException.class) // yes it sucks but producers and managed beans doesn't have same rules
     public void testGenericProducer() throws Exception
     {
         // create the stables via a single producer method

Modified: openwebbeans/trunk/webbeans-impl/src/test/java/org/apache/webbeans/test/unittests/inject/parametrized/GenericClassTest.java
URL: http://svn.apache.org/viewvc/openwebbeans/trunk/webbeans-impl/src/test/java/org/apache/webbeans/test/unittests/inject/parametrized/GenericClassTest.java?rev=1628724&r1=1628723&r2=1628724&view=diff
==============================================================================
--- openwebbeans/trunk/webbeans-impl/src/test/java/org/apache/webbeans/test/unittests/inject/parametrized/GenericClassTest.java (original)
+++ openwebbeans/trunk/webbeans-impl/src/test/java/org/apache/webbeans/test/unittests/inject/parametrized/GenericClassTest.java Wed Oct  1 14:54:27 2014
@@ -44,10 +44,10 @@ public class GenericClassTest
         Field check22Bound = Dao.class.getField("check22WithBound");
         Field check4 = WithTypeVariable.class.getField("check4");
 
-        Assert.assertFalse(GenericsUtil.satisfiesDependency(false, raw.getGenericType(), t.getGenericType()));
-        Assert.assertTrue(GenericsUtil.satisfiesDependency(false, check4.getGenericType(), t.getGenericType()));
-        Assert.assertTrue(GenericsUtil.satisfiesDependency(false, check22.getGenericType(), t.getGenericType()));
-        Assert.assertTrue(GenericsUtil.satisfiesDependency(false, check22Bound.getGenericType(), t.getGenericType()));
+        Assert.assertFalse(GenericsUtil.satisfiesDependency(false, false, raw.getGenericType(), t.getGenericType()));
+        Assert.assertTrue(GenericsUtil.satisfiesDependency(false, false, check4.getGenericType(), t.getGenericType()));
+        Assert.assertTrue(GenericsUtil.satisfiesDependency(false, false, check22.getGenericType(), t.getGenericType()));
+        Assert.assertTrue(GenericsUtil.satisfiesDependency(false, false, check22Bound.getGenericType(), t.getGenericType()));
     }
     
     @Test
@@ -59,8 +59,8 @@ public class GenericClassTest
         Field f4 = UserDao.class.getField("field4");
 
 
-        Assert.assertTrue(GenericsUtil.satisfiesDependency(false, f3.getGenericType(), f1.getGenericType()));
-        Assert.assertTrue(GenericsUtil.satisfiesDependency(false, f4.getGenericType(), f1.getGenericType()));
+        Assert.assertTrue(GenericsUtil.satisfiesDependency(false, false, f3.getGenericType(), f1.getGenericType()));
+        Assert.assertTrue(GenericsUtil.satisfiesDependency(false, false, f4.getGenericType(), f1.getGenericType()));
     }
 
     @Test
@@ -74,8 +74,8 @@ public class GenericClassTest
         Type pigStableType = this.getClass().getDeclaredField("pigStable").getType().getGenericSuperclass();
         Type horseStableType = this.getClass().getDeclaredField("horseStable").getType().getGenericSuperclass();
 
-        Assert.assertTrue(GenericsUtil.satisfiesDependency(false, horseStableType, parameterizedHorseStableType));
-        Assert.assertTrue(GenericsUtil.satisfiesDependency(false, parameterizedPigStableType, pigStableType));
+        Assert.assertTrue(GenericsUtil.satisfiesDependency(false, false, horseStableType, parameterizedHorseStableType));
+        Assert.assertTrue(GenericsUtil.satisfiesDependency(false, false, parameterizedPigStableType, pigStableType));
     }
     // fields for {@link #testStable}
     private Stable<Horse> parameterizedHorseStable;
@@ -91,8 +91,8 @@ public class GenericClassTest
         Type parameterizedHorseStableType = this.getClass().getDeclaredField("parameterizedHorseStable").getGenericType();
         Type stableProducerMethodType = this.getClass().getDeclaredMethod("stableProducer").getGenericReturnType();
 
-        Assert.assertTrue(GenericsUtil.satisfiesDependency(false, parameterizedPigStableType, stableProducerMethodType));
-        Assert.assertTrue(GenericsUtil.satisfiesDependency(false, parameterizedHorseStableType, stableProducerMethodType));
+        Assert.assertTrue(GenericsUtil.satisfiesDependency(false, false, parameterizedPigStableType, stableProducerMethodType));
+        Assert.assertTrue(GenericsUtil.satisfiesDependency(false, false, parameterizedHorseStableType, stableProducerMethodType));
     }
     // method and field for {@link #testGenericProducerType}
     private <T> Stable<T> stableProducer()