Author: covener
Date: Tue Jan  8 18:09:31 2013
New Revision: 1430423

URL: http://svn.apache.org/viewvc?rev=1430423&view=rev
Log:
[OWB-568] fix checking of generic decorated interfaces vs type of delegate 
injection points. Re-enable previously failing unit test.


Modified:
    
openwebbeans/trunk/webbeans-impl/src/main/java/org/apache/webbeans/decorator/DecoratorUtil.java
    
openwebbeans/trunk/webbeans-impl/src/main/java/org/apache/webbeans/decorator/WebBeansDecorator.java
    
openwebbeans/trunk/webbeans-impl/src/main/java/org/apache/webbeans/decorator/WebBeansDecoratorConfig.java
    
openwebbeans/trunk/webbeans-impl/src/main/java/org/apache/webbeans/util/ClassUtil.java
    
openwebbeans/trunk/webbeans-impl/src/test/java/org/apache/webbeans/newtests/decorators/tests/GenericDecoratorTest.java

Modified: 
openwebbeans/trunk/webbeans-impl/src/main/java/org/apache/webbeans/decorator/DecoratorUtil.java
URL: 
http://svn.apache.org/viewvc/openwebbeans/trunk/webbeans-impl/src/main/java/org/apache/webbeans/decorator/DecoratorUtil.java?rev=1430423&r1=1430422&r2=1430423&view=diff
==============================================================================
--- 
openwebbeans/trunk/webbeans-impl/src/main/java/org/apache/webbeans/decorator/DecoratorUtil.java
 (original)
+++ 
openwebbeans/trunk/webbeans-impl/src/main/java/org/apache/webbeans/decorator/DecoratorUtil.java
 Tue Jan  8 18:09:31 2013
@@ -21,8 +21,6 @@ package org.apache.webbeans.decorator;
 import java.lang.annotation.Annotation;
 import java.lang.reflect.Method;
 import java.lang.reflect.Modifier;
-import java.lang.reflect.Type;
-import java.util.HashSet;
 import java.util.Iterator;
 import java.util.List;
 import java.util.Set;
@@ -40,7 +38,6 @@ import org.apache.webbeans.exception.Web
 import org.apache.webbeans.logger.WebBeansLoggerFacade;
 import org.apache.webbeans.util.AnnotationUtil;
 import org.apache.webbeans.util.Asserts;
-import org.apache.webbeans.util.ClassUtil;
 
 /**
  * Decorator related utility class.
@@ -80,16 +77,6 @@ public final class DecoratorUtil
                 throw new WebBeansConfigurationException("Decorator class : " 
+ decoratorClazz + " can not have observer methods but it has one with name : " 
+ method.getName());
             }
         }
-        
-        Set<Type> decoratorSet = new HashSet<Type>();
-        ClassUtil.setInterfaceTypeHierarchy(decoratorSet, decoratorClazz);
-        
-        //Per section 8.1 do no consider Serializable a decorated type
-        if(decoratorSet.contains(java.io.Serializable.class))
-        {
-            decoratorSet.remove(java.io.Serializable.class);
-        }
-        
     }
    
     public static void 
checkManagedBeanDecoratorConditions(AbstractInjectionTargetBean<?> bean, 
List<Decorator<?>> decoratorList)

Modified: 
openwebbeans/trunk/webbeans-impl/src/main/java/org/apache/webbeans/decorator/WebBeansDecorator.java
URL: 
http://svn.apache.org/viewvc/openwebbeans/trunk/webbeans-impl/src/main/java/org/apache/webbeans/decorator/WebBeansDecorator.java?rev=1430423&r1=1430422&r2=1430423&view=diff
==============================================================================
--- 
openwebbeans/trunk/webbeans-impl/src/main/java/org/apache/webbeans/decorator/WebBeansDecorator.java
 (original)
+++ 
openwebbeans/trunk/webbeans-impl/src/main/java/org/apache/webbeans/decorator/WebBeansDecorator.java
 Tue Jan  8 18:09:31 2013
@@ -22,6 +22,7 @@ import org.apache.webbeans.component.Abs
 import org.apache.webbeans.component.ManagedBean;
 import org.apache.webbeans.component.WebBeansType;
 import org.apache.webbeans.config.OWBLogConst;
+import org.apache.webbeans.config.OwbParametrizedTypeImpl;
 import org.apache.webbeans.config.WebBeansContext;
 import org.apache.webbeans.exception.WebBeansConfigurationException;
 import org.apache.webbeans.exception.WebBeansException;
@@ -46,6 +47,7 @@ import java.lang.reflect.Field;
 import java.lang.reflect.Member;
 import java.lang.reflect.Method;
 import java.lang.reflect.Type;
+import java.lang.reflect.TypeVariable;
 import java.util.HashSet;
 import java.util.Iterator;
 import java.util.Set;
@@ -71,6 +73,9 @@ public class WebBeansDecorator<T> extend
     /** Delegate field class type */
     protected Type delegateType;
     
+    /** The type of this decorator */
+    protected Type decoratorGenericType;
+
     /** Delegate field bindings */
     protected Set<Annotation> delegateBindings = new HashSet<Annotation>();
     
@@ -122,8 +127,38 @@ public class WebBeansDecorator<T> extend
 
     protected void init()
     {
-        ClassUtil.setInterfaceTypeHierarchy(decoratedTypes, clazz);
+        Class<?> beanClass = getBeanClass();
+        decoratedTypes = new HashSet<Type>(this.getTypes());
+        
+        /* determine a safe Type for for a later BeanManager.getReference(...) 
*/
+        if (ClassUtil.isDefinitionContainsTypeVariables(beanClass)) 
+        { 
+              OwbParametrizedTypeImpl pt = new 
OwbParametrizedTypeImpl(beanClass.getDeclaringClass(),beanClass);
+              TypeVariable<?>[] tvs = beanClass.getTypeParameters();
+              for(TypeVariable<?> tv : tvs)
+              {
+                  pt.addTypeArgument(tv);
+              }
+              decoratedTypes.remove(pt);
+              setDecoratorGenericType(pt);
+        }
+        else 
+        {               
+            decoratedTypes.remove(beanClass);
+            setDecoratorGenericType(beanClass);
+        }
+
+        /* drop any non-interface bean types */
+        Type superClass = beanClass.getGenericSuperclass();
+        while (superClass != Object.class) 
+        { 
+            decoratedTypes.remove(superClass);
+            superClass = superClass.getClass().getGenericSuperclass();
+        }
+        decoratedTypes.remove(Object.class);
+        decoratedTypes.remove(java.io.Serializable.class); /* 8.1 */
 
+        
         for (Iterator<Type> i = decoratedTypes.iterator(); i.hasNext(); )
         {
             Type t = i.next();
@@ -412,6 +447,15 @@ public class WebBeansDecorator<T> extend
         }        
     }
     
+    public Type getDecoratorGenericType() 
+    {
+        return decoratorGenericType;
+    }
+
+    public void setDecoratorGenericType(Type decoratorGenericType) 
+    {
+        this.decoratorGenericType = decoratorGenericType;
+    }
     private void injectField(Field field, Object instance, 
CreationalContext<?> creationalContext)
     {
         InjectableField f = new InjectableField(field, instance, wrappedBean, 
creationalContext);

Modified: 
openwebbeans/trunk/webbeans-impl/src/main/java/org/apache/webbeans/decorator/WebBeansDecoratorConfig.java
URL: 
http://svn.apache.org/viewvc/openwebbeans/trunk/webbeans-impl/src/main/java/org/apache/webbeans/decorator/WebBeansDecoratorConfig.java?rev=1430423&r1=1430422&r2=1430423&view=diff
==============================================================================
--- 
openwebbeans/trunk/webbeans-impl/src/main/java/org/apache/webbeans/decorator/WebBeansDecoratorConfig.java
 (original)
+++ 
openwebbeans/trunk/webbeans-impl/src/main/java/org/apache/webbeans/decorator/WebBeansDecoratorConfig.java
 Tue Jan  8 18:09:31 2013
@@ -155,7 +155,7 @@ public final class WebBeansDecoratorConf
                 decoratorInstance = 
ownerCreationalContext.getDependentDecorator(instance, decorator);
                 if(decoratorInstance == null)
                 {
-                    decoratorInstance = manager.getReference(decorator, 
decorator.getBeanClass(), ownerCreationalContext);
+                    decoratorInstance = manager.getReference(decorator, 
decorator.getDecoratorGenericType(), ownerCreationalContext);
 
                     decorator.setInjections(decoratorInstance, 
ownerCreationalContext);
                     decorator.setDelegate(decoratorInstance, delegate);

Modified: 
openwebbeans/trunk/webbeans-impl/src/main/java/org/apache/webbeans/util/ClassUtil.java
URL: 
http://svn.apache.org/viewvc/openwebbeans/trunk/webbeans-impl/src/main/java/org/apache/webbeans/util/ClassUtil.java?rev=1430423&r1=1430422&r2=1430423&view=diff
==============================================================================
--- 
openwebbeans/trunk/webbeans-impl/src/main/java/org/apache/webbeans/util/ClassUtil.java
 (original)
+++ 
openwebbeans/trunk/webbeans-impl/src/main/java/org/apache/webbeans/util/ClassUtil.java
 Tue Jan  8 18:09:31 2013
@@ -1115,6 +1115,9 @@ public final class ClassUtil
         return raw;
     }
 
+    /**
+     *  @deprecated no longer used by core, not safe for generic types
+     */
     public static Set<Type> setInterfaceTypeHierarchy(Set<Type> set, Class<?> 
clazz)
     {
         Asserts.nullCheckForClass(clazz);

Modified: 
openwebbeans/trunk/webbeans-impl/src/test/java/org/apache/webbeans/newtests/decorators/tests/GenericDecoratorTest.java
URL: 
http://svn.apache.org/viewvc/openwebbeans/trunk/webbeans-impl/src/test/java/org/apache/webbeans/newtests/decorators/tests/GenericDecoratorTest.java?rev=1430423&r1=1430422&r2=1430423&view=diff
==============================================================================
--- 
openwebbeans/trunk/webbeans-impl/src/test/java/org/apache/webbeans/newtests/decorators/tests/GenericDecoratorTest.java
 (original)
+++ 
openwebbeans/trunk/webbeans-impl/src/test/java/org/apache/webbeans/newtests/decorators/tests/GenericDecoratorTest.java
 Tue Jan  8 18:09:31 2013
@@ -71,7 +71,7 @@ public class GenericDecoratorTest extend
         shutDownContainer();
     }
 
-    //X TODO currently broken @Test
+    @Test
     public void injection() throws Exception {
         Collection<Class<?>> classes = new ArrayList<Class<?>>();
         classes.add(DecoratedBean.class);


Reply via email to