You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@openwebbeans.apache.org by st...@apache.org on 2013/01/19 14:50:29 UTC

svn commit: r1435547 - in /openwebbeans/trunk/webbeans-impl/src: main/java/org/apache/webbeans/component/creation/ main/java/org/apache/webbeans/intercept/ main/java/org/apache/webbeans/proxy/ test/java/org/apache/webbeans/newtests/decorators/common/ t...

Author: struberg
Date: Sat Jan 19 13:50:28 2013
New Revision: 1435547

URL: http://svn.apache.org/viewvc?rev=1435547&view=rev
Log:
OWB-344 fix abstract Decorator handling

Modified:
    openwebbeans/trunk/webbeans-impl/src/main/java/org/apache/webbeans/component/creation/DecoratorBeanBuilder.java
    openwebbeans/trunk/webbeans-impl/src/main/java/org/apache/webbeans/intercept/InterceptorResolutionService.java
    openwebbeans/trunk/webbeans-impl/src/main/java/org/apache/webbeans/proxy/SubclassProxyFactory.java
    openwebbeans/trunk/webbeans-impl/src/test/java/org/apache/webbeans/newtests/decorators/common/Breeded.java
    openwebbeans/trunk/webbeans-impl/src/test/java/org/apache/webbeans/newtests/decorators/common/Cow.java
    openwebbeans/trunk/webbeans-impl/src/test/java/org/apache/webbeans/newtests/interceptors/resolution/InterceptorResolutionServiceTest.java
    openwebbeans/trunk/webbeans-impl/src/test/resources/org/apache/webbeans/newtests/interceptors/resolution/InterceptorResolutionServiceTest.xml

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=1435547&r1=1435546&r2=1435547&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 Sat Jan 19 13:50:28 2013
@@ -31,7 +31,6 @@ import javax.inject.Inject;
 import java.lang.annotation.Annotation;
 import java.lang.reflect.AnnotatedElement;
 import java.lang.reflect.Constructor;
-import java.lang.reflect.Method;
 import java.lang.reflect.Modifier;
 import java.lang.reflect.Type;
 import java.lang.reflect.TypeVariable;
@@ -364,10 +363,7 @@ public class DecoratorBeanBuilder<T> ext
             ClassLoader classLoader = this.getClass().getClassLoader();
             Class<T> classToProxy = annotatedType.getJavaClass();
 
-            List<Method> methods = ClassUtil.getNonPrivateMethods(classToProxy);
-
-            proxySubClass = webBeansContext.getSubclassProxyFactory().createDecoratorSubclass(null);
-
+            proxySubClass = webBeansContext.getSubclassProxyFactory().createImplementedSubclass(classLoader, classToProxy);
 
             //X TODO what about @Inject constructors?
             Constructor<T> ct = webBeansContext.getWebBeansUtil().getNoArgConstructor(proxySubClass);

Modified: openwebbeans/trunk/webbeans-impl/src/main/java/org/apache/webbeans/intercept/InterceptorResolutionService.java
URL: http://svn.apache.org/viewvc/openwebbeans/trunk/webbeans-impl/src/main/java/org/apache/webbeans/intercept/InterceptorResolutionService.java?rev=1435547&r1=1435546&r2=1435547&view=diff
==============================================================================
--- openwebbeans/trunk/webbeans-impl/src/main/java/org/apache/webbeans/intercept/InterceptorResolutionService.java (original)
+++ openwebbeans/trunk/webbeans-impl/src/main/java/org/apache/webbeans/intercept/InterceptorResolutionService.java Sat Jan 19 13:50:28 2013
@@ -326,6 +326,7 @@ public class InterceptorResolutionServic
                 ParameterizedType parameterizedType = (ParameterizedType)decoratedType;
                 decoratedType = parameterizedType.getRawType();
             }
+
             if (decoratedType instanceof Class)
             {
                 Class decoratedClass = (Class) decoratedType;
@@ -340,27 +341,40 @@ public class InterceptorResolutionServic
                         continue;
                     }
 
-                    if (decoratorMethod.getName().equals(annotatedMethodName))
+                    if (methodEquals(decoratorMethod, annotatedMethod.getJavaMember()))
                     {
-                        Class<?>[] decoratorMethodParams = decoratorMethod.getParameterTypes();
-                        Class<?>[] annotatedMethodParams = annotatedMethod.getJavaMember().getParameterTypes();
-                        if (decoratorMethodParams.length == annotatedMethodParams.length)
+                        // yikes our method is decorated by this very decorator type.
+
+                        if (Modifier.isAbstract((decorator.getBeanClass().getModifiers())))
                         {
-                            boolean paramsMatch = true;
-                            for (int i = 0; i < decoratorMethodParams.length; i++)
+                            // For abstract classes we will only decorate this method if it's really implemented on the decorator itself
+                            Class decoratorClass = decorator.getBeanClass();
+                            while (decoratorClass != Object.class)
                             {
-                                if (!decoratorMethodParams[i].equals(annotatedMethodParams[i]))
+                                try
                                 {
-                                    paramsMatch = false;
-                                    break;
+                                    Method m = decoratorClass.getDeclaredMethod(decoratorMethod.getName(), decoratorMethod.getParameterTypes());
+                                    if (Modifier.isAbstract(m.getModifiers()))
+                                    {
+                                        return null;
+                                    }
+                                    else
+                                    {
+                                        return decoratorMethod;
+                                    }
+                                }
+                                catch (NoSuchMethodException e)
+                                {
+                                    // all ok, just continue
                                 }
-                            }
 
-                            if (paramsMatch)
-                            {
-                                // yikes our method is decorated by this very decorator type.
-                                return decoratorMethod;
+                                decoratorClass = decoratorClass.getSuperclass();
                             }
+
+                            return null;
+                        }
+                        {
+                            return decoratorMethod;
                         }
                     }
                 }
@@ -370,6 +384,34 @@ public class InterceptorResolutionServic
         return null;
     }
 
+    private boolean methodEquals(Method method1, Method method2)
+    {
+        if (method1.getName().equals(method2.getName()))
+        {
+            Class<?>[] method1Params = method1.getParameterTypes();
+            Class<?>[] method2Params = method2.getParameterTypes();
+            if (method1Params.length == method2Params.length)
+            {
+                boolean paramsMatch = true;
+                for (int i = 0; i < method1Params.length; i++)
+                {
+                    if (!method1Params[i].equals(method2Params[i]))
+                    {
+                        paramsMatch = false;
+                        break;
+                    }
+                }
+
+                if (paramsMatch)
+                {
+                    return true;
+                }
+            }
+        }
+
+        return false;
+    }
+
     private void calculateCdiMethodInterceptors(BusinessMethodInterceptorInfo methodInterceptorInfo,
                                                 Set<Interceptor<?>> allUsedCdiInterceptors,
                                                 AnnotatedMethod annotatedMethod,

Modified: openwebbeans/trunk/webbeans-impl/src/main/java/org/apache/webbeans/proxy/SubclassProxyFactory.java
URL: http://svn.apache.org/viewvc/openwebbeans/trunk/webbeans-impl/src/main/java/org/apache/webbeans/proxy/SubclassProxyFactory.java?rev=1435547&r1=1435546&r2=1435547&view=diff
==============================================================================
--- openwebbeans/trunk/webbeans-impl/src/main/java/org/apache/webbeans/proxy/SubclassProxyFactory.java (original)
+++ openwebbeans/trunk/webbeans-impl/src/main/java/org/apache/webbeans/proxy/SubclassProxyFactory.java Sat Jan 19 13:50:28 2013
@@ -18,13 +18,11 @@
  */
 package org.apache.webbeans.proxy;
 
-import javax.enterprise.inject.spi.Bean;
 import java.lang.reflect.Constructor;
 import java.lang.reflect.Method;
 import java.lang.reflect.Modifier;
 import java.util.List;
 
-import org.apache.webbeans.component.OwbBean;
 import org.apache.webbeans.config.WebBeansContext;
 import org.apache.webbeans.exception.WebBeansConfigurationException;
 import org.apache.webbeans.util.ClassUtil;
@@ -52,22 +50,8 @@ public class SubclassProxyFactory extend
     }
 
 
-    public <T> Class<T> createDecoratorSubclass(Bean<T> bean)
+    public <T> Class<T> createImplementedSubclass(ClassLoader classLoader, Class<T> classToProxy)
     {
-        ClassLoader classLoader = bean.getClass().getClassLoader();
-
-        Class<T> classToProxy;
-        if (bean instanceof OwbBean)
-        {
-            classToProxy = ((OwbBean<T>) bean).getReturnType();
-
-        }
-        else
-        {
-            // TODO: that might be wrong sometimes
-            classToProxy = (Class<T>) bean.getBeanClass();
-        }
-
         if (!Modifier.isAbstract(classToProxy.getModifiers()))
         {
             throw new WebBeansConfigurationException("Only abstract classes should get subclassed, not " + classToProxy);

Modified: openwebbeans/trunk/webbeans-impl/src/test/java/org/apache/webbeans/newtests/decorators/common/Breeded.java
URL: http://svn.apache.org/viewvc/openwebbeans/trunk/webbeans-impl/src/test/java/org/apache/webbeans/newtests/decorators/common/Breeded.java?rev=1435547&r1=1435546&r2=1435547&view=diff
==============================================================================
--- openwebbeans/trunk/webbeans-impl/src/test/java/org/apache/webbeans/newtests/decorators/common/Breeded.java (original)
+++ openwebbeans/trunk/webbeans-impl/src/test/java/org/apache/webbeans/newtests/decorators/common/Breeded.java Sat Jan 19 13:50:28 2013
@@ -24,4 +24,6 @@ package org.apache.webbeans.newtests.dec
 public interface Breeded
 {
     int getAge();
+
+    String getFarmer();
 }

Modified: openwebbeans/trunk/webbeans-impl/src/test/java/org/apache/webbeans/newtests/decorators/common/Cow.java
URL: http://svn.apache.org/viewvc/openwebbeans/trunk/webbeans-impl/src/test/java/org/apache/webbeans/newtests/decorators/common/Cow.java?rev=1435547&r1=1435546&r2=1435547&view=diff
==============================================================================
--- openwebbeans/trunk/webbeans-impl/src/test/java/org/apache/webbeans/newtests/decorators/common/Cow.java (original)
+++ openwebbeans/trunk/webbeans-impl/src/test/java/org/apache/webbeans/newtests/decorators/common/Cow.java Sat Jan 19 13:50:28 2013
@@ -37,4 +37,10 @@ public class Cow extends Animal implemen
     {
         this.color = color;
     }
+
+    @Override
+    public String getFarmer()
+    {
+        return "Deary Farmer";
+    }
 }

Modified: openwebbeans/trunk/webbeans-impl/src/test/java/org/apache/webbeans/newtests/interceptors/resolution/InterceptorResolutionServiceTest.java
URL: http://svn.apache.org/viewvc/openwebbeans/trunk/webbeans-impl/src/test/java/org/apache/webbeans/newtests/interceptors/resolution/InterceptorResolutionServiceTest.java?rev=1435547&r1=1435546&r2=1435547&view=diff
==============================================================================
--- openwebbeans/trunk/webbeans-impl/src/test/java/org/apache/webbeans/newtests/interceptors/resolution/InterceptorResolutionServiceTest.java (original)
+++ openwebbeans/trunk/webbeans-impl/src/test/java/org/apache/webbeans/newtests/interceptors/resolution/InterceptorResolutionServiceTest.java Sat Jan 19 13:50:28 2013
@@ -29,10 +29,12 @@ import java.util.Map;
 
 import org.apache.webbeans.intercept.InterceptorResolutionService;
 import org.apache.webbeans.newtests.AbstractUnitTest;
+import org.apache.webbeans.newtests.decorators.common.Cow;
 import org.apache.webbeans.newtests.interceptors.factory.beans.ClassInterceptedClass;
 import org.apache.webbeans.newtests.interceptors.factory.beans.ClassMultiInterceptedClass;
 import org.apache.webbeans.newtests.interceptors.factory.beans.DecoratedClass;
 import org.apache.webbeans.newtests.interceptors.factory.beans.MethodInterceptedClass;
+import org.apache.webbeans.newtests.interceptors.factory.beans.MyAbstractTestDecorator;
 import org.apache.webbeans.newtests.interceptors.factory.beans.StereotypeInterceptedClass;
 import org.apache.webbeans.test.annotation.binding.Binding1;
 import org.apache.webbeans.test.component.decorator.clean.ServiceDecorator;
@@ -252,6 +254,36 @@ public class InterceptorResolutionServic
         shutDownContainer();
     }
 
+
+    @Test
+    public void testAbstractDecoratorResolution() throws Exception
+    {
+        Collection<String> beanXmls = new ArrayList<String>();
+        beanXmls.add(getXmlPath(this.getClass().getPackage().getName(), this.getClass().getSimpleName()));
+
+        Collection<Class<?>> beanClasses = new ArrayList<Class<?>>();
+        beanClasses.add(Cow.class);
+        beanClasses.add(MyAbstractTestDecorator.class);
+
+        startContainer(beanClasses, beanXmls);
+
+        InterceptorResolutionService ir = new InterceptorResolutionService(getWebBeansContext());
+        AnnotatedType<Cow> annotatedType = getBeanManager().createAnnotatedType(Cow.class);
+        Bean<Cow> bean = (Bean<Cow>) getBeanManager().resolve(
+                getBeanManager().getBeans(Cow.class));
+        Assert.assertNotNull(bean);
+
+        BeanInterceptorInfo interceptorInfo = ir.calculateInterceptorInfo(bean.getTypes(), bean.getQualifiers(), annotatedType);
+        Assert.assertNotNull(interceptorInfo);
+
+        Assert.assertNotNull(interceptorInfo.getBusinessMethodsInfo());
+        Assert.assertEquals(1, interceptorInfo.getBusinessMethodsInfo().size());
+
+        Assert.assertNotNull(interceptorInfo.getDecorators());
+        Assert.assertEquals(1, interceptorInfo.getDecorators().size());
+
+        shutDownContainer();
+    }
     @Test
     public void testEjbStyleInterceptorResolution() throws Exception
     {

Modified: openwebbeans/trunk/webbeans-impl/src/test/resources/org/apache/webbeans/newtests/interceptors/resolution/InterceptorResolutionServiceTest.xml
URL: http://svn.apache.org/viewvc/openwebbeans/trunk/webbeans-impl/src/test/resources/org/apache/webbeans/newtests/interceptors/resolution/InterceptorResolutionServiceTest.xml?rev=1435547&r1=1435546&r2=1435547&view=diff
==============================================================================
--- openwebbeans/trunk/webbeans-impl/src/test/resources/org/apache/webbeans/newtests/interceptors/resolution/InterceptorResolutionServiceTest.xml (original)
+++ openwebbeans/trunk/webbeans-impl/src/test/resources/org/apache/webbeans/newtests/interceptors/resolution/InterceptorResolutionServiceTest.xml Sat Jan 19 13:50:28 2013
@@ -26,5 +26,6 @@ under the License.
     </interceptors>
     <decorators>
         <class>org.apache.webbeans.test.component.decorator.clean.ServiceDecorator</class>
+        <class>org.apache.webbeans.newtests.interceptors.factory.beans.MyAbstractTestDecorator</class>
     </decorators>
 </beans>