Author: rmannibucau
Date: Mon May 13 08:25:40 2013
New Revision: 1481729

URL: http://svn.apache.org/r1481729
Log:
OWB-861 better decorator inheritance/generic handling

Added:
    
openwebbeans/trunk/webbeans-impl/src/test/java/org/apache/webbeans/newtests/decorators/tests/DecoratorInheritanceTest.java
Modified:
    
openwebbeans/trunk/webbeans-impl/src/main/java/org/apache/webbeans/component/creation/DecoratorBeanBuilder.java

Modified: 
openwebbeans/trunk/webbeans-impl/src/main/java/org/apache/webbeans/component/creation/DecoratorBeanBuilder.java
URL: 
http://svn.apache.org/viewvc/openwebbeans/trunk/webbeans-impl/src/main/java/org/apache/webbeans/component/creation/DecoratorBeanBuilder.java?rev=1481729&r1=1481728&r2=1481729&view=diff
==============================================================================
--- 
openwebbeans/trunk/webbeans-impl/src/main/java/org/apache/webbeans/component/creation/DecoratorBeanBuilder.java
 (original)
+++ 
openwebbeans/trunk/webbeans-impl/src/main/java/org/apache/webbeans/component/creation/DecoratorBeanBuilder.java
 Mon May 13 08:25:40 2013
@@ -165,35 +165,46 @@ public class DecoratorBeanBuilder<T>
 
     private void defineDecoratedTypes()
     {
-        Class<T> beanClass = annotatedType.getJavaClass();
+        // remove them first to avoid to loop over them
+        decoratedTypes.remove(Object.class);
+        decoratedTypes.remove(java.io.Serializable.class); /* 8.1 */
 
-        // determine a safe Type for for a later BeanManager.getReference(...)
-        if (ClassUtil.isDefinitionContainsTypeVariables(beanClass))
+        Type beanClass = annotatedType.getJavaClass();
+        do
         {
-            OwbParametrizedTypeImpl pt = new 
OwbParametrizedTypeImpl(beanClass.getDeclaringClass(),beanClass);
-            TypeVariable<?>[] tvs = beanClass.getTypeParameters();
-            for(TypeVariable<?> tv : tvs)
+            final Class<?> clazz = ClassUtil.getClass(beanClass);
+            final Type toRemove;
+            if (ClassUtil.isDefinitionContainsTypeVariables(beanClass))
+            {
+                final OwbParametrizedTypeImpl pt = new 
OwbParametrizedTypeImpl(clazz.getDeclaringClass(), clazz);
+                final TypeVariable<?>[] tvs = clazz.getTypeParameters();
+                for(TypeVariable<?> tv : tvs)
+                {
+                    pt.addTypeArgument(tv);
+                }
+                toRemove = pt;
+                //X TODO generic support setDecoratorGenericType(pt);
+            }
+            else
             {
-                pt.addTypeArgument(tv);
+                toRemove = beanClass;
+                //X TODO generic support setDecoratorGenericType(beanClass);
             }
-            decoratedTypes.remove(pt);
-            //X TODO generic support setDecoratorGenericType(pt);
-        }
-        else
-        {
-            decoratedTypes.remove(beanClass);
-            //X TODO generic support 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 */
+            final Iterator<Type> iterator = decoratedTypes.iterator();
+            while (iterator.hasNext())
+            {
+                final Type next = iterator.next();
+
+                // if raw class is the same and is assignable (generics 
handling)
+                if (ClassUtil.getClass(next) == clazz && 
ClassUtil.isAssignable(toRemove, next))
+                {
+                    iterator.remove();
+                }
+            }
+
+            beanClass = clazz.getGenericSuperclass();
+        } while (beanClass != Object.class);
 
 
         for (Iterator<Type> i = decoratedTypes.iterator(); i.hasNext(); )

Added: 
openwebbeans/trunk/webbeans-impl/src/test/java/org/apache/webbeans/newtests/decorators/tests/DecoratorInheritanceTest.java
URL: 
http://svn.apache.org/viewvc/openwebbeans/trunk/webbeans-impl/src/test/java/org/apache/webbeans/newtests/decorators/tests/DecoratorInheritanceTest.java?rev=1481729&view=auto
==============================================================================
--- 
openwebbeans/trunk/webbeans-impl/src/test/java/org/apache/webbeans/newtests/decorators/tests/DecoratorInheritanceTest.java
 (added)
+++ 
openwebbeans/trunk/webbeans-impl/src/test/java/org/apache/webbeans/newtests/decorators/tests/DecoratorInheritanceTest.java
 Mon May 13 08:25:40 2013
@@ -0,0 +1,119 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements. See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership. The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License. You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied. See the License for the
+ * specific language governing permissions and limitations
+ * under the License.
+ */
+package org.apache.webbeans.newtests.decorators.tests;
+
+import org.apache.webbeans.newtests.AbstractUnitTest;
+import org.junit.Test;
+
+import javax.decorator.Decorator;
+import javax.decorator.Delegate;
+import javax.inject.Inject;
+
+import static org.junit.Assert.assertEquals;
+
+// OWB-861
+public class DecoratorInheritanceTest extends AbstractUnitTest
+{
+    @Test
+    public void checkItWorks()
+    {
+        addDecorator(ServiceDecorator.class);
+        startContainer(BaseDecorator.class, BaseModuleDecorator.class, 
ServiceDecorator.class, TheService.class);
+
+        assertEquals("the decorator", getInstance(TheService.class).name());
+        shutDownContainer();
+    }
+
+    @Test
+    public void checkItWorksWithGenerics()
+    {
+        addDecorator(GServiceDecorator.class);
+        startContainer(GBaseDecorator.class, GBaseModuleDecorator.class, 
GServiceDecorator.class, TheService.class);
+
+        assertEquals("the decorator 1", getInstance(TheService.class).name());
+        shutDownContainer();
+    }
+
+    public static abstract class BaseDecorator implements AService
+    {
+
+    }
+
+    public static abstract class BaseModuleDecorator extends BaseDecorator
+    {
+
+    }
+
+    @Decorator
+    public static class ServiceDecorator extends BaseModuleDecorator
+    {
+        @Delegate
+        @Inject
+        private AService service;
+
+        @Override
+        public String name()
+        {
+            return service.name() + "decorator";
+        }
+    }
+
+    public static class TheService implements AService
+    {
+        @Override
+        public String name()
+        {
+            return "the ";
+        }
+    }
+
+    public static interface AService
+    {
+        String name();
+    }
+
+    public static abstract class GBaseDecorator<T> implements AService
+    {
+        abstract T generateT();
+    }
+
+    public static abstract class GBaseModuleDecorator<T> extends 
GBaseDecorator<T>
+    {
+
+    }
+
+    @Decorator
+    public static class GServiceDecorator extends GBaseModuleDecorator<Integer>
+    {
+        @Delegate
+        @Inject
+        private AService service;
+
+        @Override
+        public String name()
+        {
+            return service.name() + "decorator " + generateT();
+        }
+
+        @Override
+        Integer generateT() {
+            return 1;
+        }
+    }
+}


Reply via email to