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/11/17 18:31:42 UTC

svn commit: r1640195 - in /openwebbeans/branches/owb_1.2.x/webbeans-impl/src: main/java/org/apache/webbeans/component/creation/DecoratorBeanBuilder.java test/java/org/apache/webbeans/newtests/decorators/tests/ExtendedMulitpleGenericDecoratorTest.java

Author: rsandtner
Date: Mon Nov 17 17:31:42 2014
New Revision: 1640195

URL: http://svn.apache.org/r1640195
Log:
OWB-1024 only check the decorated interface

Added:
    openwebbeans/branches/owb_1.2.x/webbeans-impl/src/test/java/org/apache/webbeans/newtests/decorators/tests/ExtendedMulitpleGenericDecoratorTest.java
Modified:
    openwebbeans/branches/owb_1.2.x/webbeans-impl/src/main/java/org/apache/webbeans/component/creation/DecoratorBeanBuilder.java

Modified: openwebbeans/branches/owb_1.2.x/webbeans-impl/src/main/java/org/apache/webbeans/component/creation/DecoratorBeanBuilder.java
URL: http://svn.apache.org/viewvc/openwebbeans/branches/owb_1.2.x/webbeans-impl/src/main/java/org/apache/webbeans/component/creation/DecoratorBeanBuilder.java?rev=1640195&r1=1640194&r2=1640195&view=diff
==============================================================================
--- openwebbeans/branches/owb_1.2.x/webbeans-impl/src/main/java/org/apache/webbeans/component/creation/DecoratorBeanBuilder.java (original)
+++ openwebbeans/branches/owb_1.2.x/webbeans-impl/src/main/java/org/apache/webbeans/component/creation/DecoratorBeanBuilder.java Mon Nov 17 17:31:42 2014
@@ -50,6 +50,7 @@ import org.apache.webbeans.component.Web
 import org.apache.webbeans.config.OWBLogConst;
 import org.apache.webbeans.config.WebBeansContext;
 import org.apache.webbeans.exception.WebBeansConfigurationException;
+import org.apache.webbeans.exception.inject.DefinitionException;
 import org.apache.webbeans.logger.WebBeansLoggerFacade;
 import org.apache.webbeans.util.Asserts;
 import org.apache.webbeans.util.ClassUtil;
@@ -231,7 +232,7 @@ public class DecoratorBeanBuilder<T>
             {
                 if(ClassUtil.isParametrizedType(decType) && ClassUtil.isParametrizedType(delegateType))
                 {
-                    checkParametrizedType((ParameterizedType) decType, (ParameterizedType) delegateType);
+                    checkParametrizedType();
                 }
                 else if (ClassUtil.isTypeVariable(decType))
                 {
@@ -248,37 +249,34 @@ public class DecoratorBeanBuilder<T>
     /**
      * Checks recursive, if the ParameterizedTypes are equal
      *
-     * @param decoratedType ParameterizedType of the decoreatedType
-     * @param delegateType ParameterizedType of the delegateType
-     *
-     * @throws WebBeansConfigurationException
+     * @throws DefinitionException
      */
-    private void checkParametrizedType(ParameterizedType decoratedType, ParameterizedType delegateType)
+    private void checkParametrizedType()
     {
-        //X TODO maybe we could move this to GenericsUtil
-
-        Type[] decTypeArguments = ClassUtil.getActualTypeArguments(decoratedType);
-        Type[] delegateTypeArguments = ClassUtil.getActualTypeArguments(delegateType);
-
-        if (decTypeArguments.length != delegateTypeArguments.length)
-        {
-            throw new WebBeansConfigurationException("Decorator: " + toString() + " " +
-                    "Number of TypeArguments must match - Decorated Type:  " + decTypeArguments.length +
-                    " Delegate Type: " + delegateTypeArguments.length);
-        }
+        Type[] delegeteTypes = ((ParameterizedType) delegateType).getActualTypeArguments();
+        Type[] interfaceTypes = annotatedType.getJavaClass().getGenericInterfaces();
 
-        for (int i = 0; i < decTypeArguments.length; i++)
+        for (Type interfaceType : interfaceTypes)
         {
-            Type decTypeArg = decTypeArguments[i];
-            Type delegateTypeArg = delegateTypeArguments[i];
+            if (!ClassUtil.isClassAssignable(ClassUtil.getClass(delegateType), ClassUtil.getClass(interfaceType)))
+            {
+                // only check the interface from the decorated type
+                continue;
+            }
 
-            if (ClassUtil.isParametrizedType(decTypeArg) && ClassUtil.isParametrizedType(delegateTypeArg))
+            Type[] arguments = ClassUtil.getActualTypeArguments(interfaceType);
+            if (arguments.length != delegeteTypes.length)
             {
-                checkParametrizedType((ParameterizedType) decTypeArg, (ParameterizedType) delegateTypeArg);
+                throw new DefinitionException("Decorator: " + toString() + " Number of TypeArguments must match - Decorated Type:  " + arguments.length +
+                                                      " Delegate Type: " + delegeteTypes.length);
             }
-            else if (!decTypeArg.equals(delegateTypeArg))
+
+            for (int i = 0; i < delegeteTypes.length; i++)
             {
-                throw new WebBeansConfigurationException("Decorator: " + toString() + " delegate attribute must match decorated type: " + decTypeArg);
+                if (!delegeteTypes[i].equals(arguments[i]))
+                {
+                    throw new DefinitionException("Decorator: " + toString() + " delegate attribute must match decorated type: " + delegeteTypes[i]);
+                }
             }
         }
     }

Added: openwebbeans/branches/owb_1.2.x/webbeans-impl/src/test/java/org/apache/webbeans/newtests/decorators/tests/ExtendedMulitpleGenericDecoratorTest.java
URL: http://svn.apache.org/viewvc/openwebbeans/branches/owb_1.2.x/webbeans-impl/src/test/java/org/apache/webbeans/newtests/decorators/tests/ExtendedMulitpleGenericDecoratorTest.java?rev=1640195&view=auto
==============================================================================
--- openwebbeans/branches/owb_1.2.x/webbeans-impl/src/test/java/org/apache/webbeans/newtests/decorators/tests/ExtendedMulitpleGenericDecoratorTest.java (added)
+++ openwebbeans/branches/owb_1.2.x/webbeans-impl/src/test/java/org/apache/webbeans/newtests/decorators/tests/ExtendedMulitpleGenericDecoratorTest.java Mon Nov 17 17:31:42 2014
@@ -0,0 +1,168 @@
+/*
+ * 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 junit.framework.Assert;
+import org.apache.webbeans.newtests.AbstractUnitTest;
+import org.junit.Test;
+
+import javax.decorator.Decorator;
+import javax.decorator.Delegate;
+import javax.enterprise.inject.Any;
+import javax.inject.Inject;
+import java.io.Serializable;
+import java.util.concurrent.atomic.AtomicInteger;
+
+/**
+ * Test to reproduce OWB-1024
+ */
+public class ExtendedMulitpleGenericDecoratorTest extends AbstractUnitTest
+{
+
+    @Test
+    public void testMultipleTypeParameters() throws Exception
+    {
+        addDecorator(ExtendingInterfaceDecorator.class);
+        addDecorator(SwapedExtendingInterfaceDecorator.class);
+        startContainer(Interface.class,
+                       ExtendingInterface.class,
+                       Service.class,
+                       ExtendingInterfaceDecorator.class,
+                       SwapedExtendingInterfaceDecorator.class,
+                       SwapedService.class,
+                       SwapedParameterExtendingInterface.class);
+
+        Service service = getInstance(Service.class);
+        SwapedService swapedService = getInstance(SwapedService.class);
+
+        Assert.assertNotNull(service);
+        Assert.assertNotNull(swapedService);
+
+        Number result = service.doSomethingOthers("aString");
+
+        Assert.assertNotNull(result);
+        Assert.assertEquals(2, result.intValue());
+
+        Assert.assertTrue(ExtendingInterfaceDecorator.called);
+        Assert.assertEquals(1, ExtendingInterfaceDecorator.callCount.get());
+
+        String swapedResult = swapedService.doSomethingWithWrappedTypeParams(5L);
+
+        Assert.assertNotNull(swapedResult);
+        Assert.assertEquals("doSomethingWithWrappedTypeParams: your number is 5", swapedResult);
+
+        Assert.assertTrue(SwapedExtendingInterfaceDecorator.called);
+        Assert.assertEquals(1, SwapedExtendingInterfaceDecorator.callCount.get());
+
+
+        // shutdown is called @After in AbstractUnitTest
+    }
+
+
+
+    public static interface Interface<P, T> {
+        T doSomething(P param);
+    }
+
+    public static interface ExtendingInterface<P extends Serializable> extends Interface<P, Number> {
+        Number doSomethingOthers(P param);
+    }
+
+    public static interface SwapedParameterExtendingInterface<T extends Serializable> extends Interface<Number, T>
+    {
+        T doSomethingWithWrappedTypeParams(Number param);
+    }
+
+    public static class Service implements ExtendingInterface<String>
+    {
+
+        @Override
+        public Number doSomethingOthers(String param)
+        {
+            return param.length() % 5;
+        }
+
+        @Override
+        public Number doSomething(String param)
+        {
+            return (param.length() / 2) * 6;
+        }
+    }
+
+    public static class SwapedService implements SwapedParameterExtendingInterface<String> {
+
+        @Override
+        public String doSomethingWithWrappedTypeParams(Number param)
+        {
+            return "doSomethingWithWrappedTypeParams: your number is " + param.longValue();
+        }
+
+        @Override
+        public String doSomething(Number param)
+        {
+            return "doSomething: parameter = " + param;
+        }
+    }
+
+    @Decorator
+    public abstract static class ExtendingInterfaceDecorator<T extends Serializable> implements ExtendingInterface<T>
+    {
+        public static boolean called;
+        public static AtomicInteger callCount = new AtomicInteger(0);
+
+
+        @Inject
+        @Any
+        @Delegate
+        private ExtendingInterface<T> delegate;
+
+
+        @Override
+        public Number doSomethingOthers(T param)
+        {
+            called = true;
+            callCount.incrementAndGet();
+
+            return delegate.doSomethingOthers(param);
+        }
+    }
+
+    @Decorator
+    public abstract static class SwapedExtendingInterfaceDecorator<T extends Serializable> implements SwapedParameterExtendingInterface<T>
+    {
+        public static boolean called;
+        public static AtomicInteger callCount = new AtomicInteger(0);
+
+
+        @Inject
+        @Any
+        @Delegate
+        private SwapedParameterExtendingInterface<T> delegete;
+
+
+        @Override
+        public T doSomethingWithWrappedTypeParams(Number param)
+        {
+            called = true;
+            callCount.incrementAndGet();
+
+            return delegete.doSomethingWithWrappedTypeParams(param);
+        }
+    }
+}