You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@openwebbeans.apache.org by ta...@apache.org on 2015/02/10 15:57:07 UTC

svn commit: r1658730 - in /openwebbeans/trunk/webbeans-impl/src: main/java/org/apache/webbeans/util/ test/java/org/apache/webbeans/test/interceptors/factory/ test/java/org/apache/webbeans/test/interceptors/factory/beans/

Author: tandraschko
Date: Tue Feb 10 14:57:07 2015
New Revision: 1658730

URL: http://svn.apache.org/r1658730
Log:
OWB-1036 NormalScoped ASM proxies broken in some cases for partial beans

Added:
    openwebbeans/trunk/webbeans-impl/src/test/java/org/apache/webbeans/test/interceptors/factory/beans/PartialBeanClass.java
    openwebbeans/trunk/webbeans-impl/src/test/java/org/apache/webbeans/test/interceptors/factory/beans/PartialBeanClassSuperClass.java
    openwebbeans/trunk/webbeans-impl/src/test/java/org/apache/webbeans/test/interceptors/factory/beans/PartialBeanClassSuperInterface.java
Modified:
    openwebbeans/trunk/webbeans-impl/src/main/java/org/apache/webbeans/util/ClassUtil.java
    openwebbeans/trunk/webbeans-impl/src/test/java/org/apache/webbeans/test/interceptors/factory/NormalScopeProxyFactoryTest.java

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=1658730&r1=1658729&r2=1658730&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 Feb 10 14:57:07 2015
@@ -305,8 +305,22 @@ public final class ClassUtil
                                              Map<String, List<Method>> methodMap, List<Method> allMethods,
                                              Class<?> clazz)
     {
+        List<Method> temp = new ArrayList<Method>(Arrays.asList(clazz.getMethods()));
         for (Method method : clazz.getDeclaredMethods())
         {
+            if (!temp.contains(method))
+            {
+                temp.add(method);
+            }
+        }
+	
+        for (Method method : temp)
+        {
+			if (allMethods.contains(method))
+			{
+				continue;
+			}
+
             if (method.isBridge())
             {
                 // we have no interest in generics bridge methods

Modified: openwebbeans/trunk/webbeans-impl/src/test/java/org/apache/webbeans/test/interceptors/factory/NormalScopeProxyFactoryTest.java
URL: http://svn.apache.org/viewvc/openwebbeans/trunk/webbeans-impl/src/test/java/org/apache/webbeans/test/interceptors/factory/NormalScopeProxyFactoryTest.java?rev=1658730&r1=1658729&r2=1658730&view=diff
==============================================================================
--- openwebbeans/trunk/webbeans-impl/src/test/java/org/apache/webbeans/test/interceptors/factory/NormalScopeProxyFactoryTest.java (original)
+++ openwebbeans/trunk/webbeans-impl/src/test/java/org/apache/webbeans/test/interceptors/factory/NormalScopeProxyFactoryTest.java Tue Feb 10 14:57:07 2015
@@ -38,6 +38,7 @@ import java.lang.reflect.Type;
 import java.net.URL;
 import java.net.URLClassLoader;
 import java.util.Set;
+import org.apache.webbeans.test.interceptors.factory.beans.PartialBeanClass;
 
 import static org.junit.Assert.assertNotNull;
 
@@ -207,6 +208,40 @@ public class NormalScopeProxyFactoryTest
 
     }
 
+    @Test
+    public void textPartialBeanProxyCreation() throws Exception
+    {
+        NormalScopeProxyFactory pf = new NormalScopeProxyFactory(new WebBeansContext());
+
+        // we take a fresh URLClassLoader to not blur the test classpath with synthetic classes.
+        ClassLoader classLoader = new URLClassLoader(new URL[0]);
+
+        Class<PartialBeanClass> proxyClass = pf.createProxyClass(classLoader, PartialBeanClass.class);
+        Assert.assertNotNull(proxyClass);
+
+        PartialBeanClass internalInstance = new PartialBeanClass()
+        {
+            @Override
+            public String willFail2()
+            {
+                return "";
+            }
+
+            @Override
+            public String willFail()
+            {
+                return "";
+            }
+        };
+
+        TestContextualInstanceProvider provider = new TestContextualInstanceProvider(internalInstance);
+
+        PartialBeanClass proxy = pf.createProxyInstance(proxyClass, provider);
+
+        proxy.willFail();
+        proxy.willFail2();
+        proxy.willFail3();
+    }
 
     /**
      * Test if protected and package scope methods are proxied as well.

Added: openwebbeans/trunk/webbeans-impl/src/test/java/org/apache/webbeans/test/interceptors/factory/beans/PartialBeanClass.java
URL: http://svn.apache.org/viewvc/openwebbeans/trunk/webbeans-impl/src/test/java/org/apache/webbeans/test/interceptors/factory/beans/PartialBeanClass.java?rev=1658730&view=auto
==============================================================================
--- openwebbeans/trunk/webbeans-impl/src/test/java/org/apache/webbeans/test/interceptors/factory/beans/PartialBeanClass.java (added)
+++ openwebbeans/trunk/webbeans-impl/src/test/java/org/apache/webbeans/test/interceptors/factory/beans/PartialBeanClass.java Tue Feb 10 14:57:07 2015
@@ -0,0 +1,30 @@
+/*
+ * 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.test.interceptors.factory.beans;
+
+import javax.enterprise.context.ApplicationScoped;
+
+@ApplicationScoped
+public abstract class PartialBeanClass extends PartialBeanClassSuperClass implements PartialBeanClassSuperInterface
+{
+    public String willFail3()
+    {
+        return "";
+    }
+}

Added: openwebbeans/trunk/webbeans-impl/src/test/java/org/apache/webbeans/test/interceptors/factory/beans/PartialBeanClassSuperClass.java
URL: http://svn.apache.org/viewvc/openwebbeans/trunk/webbeans-impl/src/test/java/org/apache/webbeans/test/interceptors/factory/beans/PartialBeanClassSuperClass.java?rev=1658730&view=auto
==============================================================================
--- openwebbeans/trunk/webbeans-impl/src/test/java/org/apache/webbeans/test/interceptors/factory/beans/PartialBeanClassSuperClass.java (added)
+++ openwebbeans/trunk/webbeans-impl/src/test/java/org/apache/webbeans/test/interceptors/factory/beans/PartialBeanClassSuperClass.java Tue Feb 10 14:57:07 2015
@@ -0,0 +1,24 @@
+/*
+ * 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.test.interceptors.factory.beans;
+
+public abstract class PartialBeanClassSuperClass
+{
+    public abstract String willFail2();
+}

Added: openwebbeans/trunk/webbeans-impl/src/test/java/org/apache/webbeans/test/interceptors/factory/beans/PartialBeanClassSuperInterface.java
URL: http://svn.apache.org/viewvc/openwebbeans/trunk/webbeans-impl/src/test/java/org/apache/webbeans/test/interceptors/factory/beans/PartialBeanClassSuperInterface.java?rev=1658730&view=auto
==============================================================================
--- openwebbeans/trunk/webbeans-impl/src/test/java/org/apache/webbeans/test/interceptors/factory/beans/PartialBeanClassSuperInterface.java (added)
+++ openwebbeans/trunk/webbeans-impl/src/test/java/org/apache/webbeans/test/interceptors/factory/beans/PartialBeanClassSuperInterface.java Tue Feb 10 14:57:07 2015
@@ -0,0 +1,24 @@
+/*
+ * 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.test.interceptors.factory.beans;
+
+public interface PartialBeanClassSuperInterface
+{
+    public String willFail();
+}



Re: svn commit: r1658730 - in /openwebbeans/trunk/webbeans-impl/src: main/java/org/apache/webbeans/util/ test/java/org/apache/webbeans/test/interceptors/factory/ test/java/org/apache/webbeans/test/interceptors/factory/beans/

Posted by Mark Struberg <st...@yahoo.de>.
I think we originally DID use AnnotatedType. We surely did provide proxies for methods in superclasses. Would need to look at the history if/when we lost this.

LieGrue,
strub





> On Thursday, 12 February 2015, 14:48, Romain Manni-Bucau <rm...@gmail.com> wrote:
> > sure it should but shouldn't we use annotated type methods instead of
> pure reflection?
> 
> 
> Romain Manni-Bucau
> @rmannibucau
> http://www.tomitribe.com
> http://rmannibucau.wordpress.com
> https://github.com/rmannibucau
> 
> 
> 
> 2015-02-12 14:41 GMT+01:00 Joseph Bergmark <be...@gmail.com>:
>>  I need to write a quick unit test to verify, but I think this may still be
>>  missing non-public inherited methods.
>> 
>>  Previously it only used getDeclaredMethods, which would return all all
>>  private, protected, default and public methods for the class, but did not
>>  contain any inherited methods.  If I'm reading this change correctly it 
> now
>>  adds getMethods which will add public inherited methods but still 
> doesn't
>>  include protected or default methods.
>> 
>>  I wonder if we should walk up the class hierarchy and call
>>  getDeclaredMethods at each step.  Might need to discard private methods
>>  found in superclasses as I'm not sure we need to worry about those 
> being
>>  called on the proxy.
>> 
>>  On Tue, Feb 10, 2015 at 9:57 AM, <ta...@apache.org> wrote:
>> 
>>>  Author: tandraschko
>>>  Date: Tue Feb 10 14:57:07 2015
>>>  New Revision: 1658730
>>> 
>>>  URL: http://svn.apache.org/r1658730
>>>  Log:
>>>  OWB-1036 NormalScoped ASM proxies broken in some cases for partial 
> beans
>>> 
>>>  Added:
>>> 
>>> 
> openwebbeans/trunk/webbeans-impl/src/test/java/org/apache/webbeans/test/interceptors/factory/beans/PartialBeanClass.java
>>> 
>>> 
> openwebbeans/trunk/webbeans-impl/src/test/java/org/apache/webbeans/test/interceptors/factory/beans/PartialBeanClassSuperClass.java
>>> 
>>> 
> openwebbeans/trunk/webbeans-impl/src/test/java/org/apache/webbeans/test/interceptors/factory/beans/PartialBeanClassSuperInterface.java
>>>  Modified:
>>> 
>>> 
> openwebbeans/trunk/webbeans-impl/src/main/java/org/apache/webbeans/util/ClassUtil.java
>>> 
>>> 
> openwebbeans/trunk/webbeans-impl/src/test/java/org/apache/webbeans/test/interceptors/factory/NormalScopeProxyFactoryTest.java
>>> 
>>>  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=1658730&r1=1658729&r2=1658730&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 Feb 10 14:57:07 2015
>>>  @@ -305,8 +305,22 @@ public final class ClassUtil
>>>                                                Map<String, 
> List<Method>>
>>>  methodMap, List<Method> allMethods,
>>>                                                Class<?> clazz)
>>>       {
>>>  +        List<Method> temp = new
>>>  ArrayList<Method>(Arrays.asList(clazz.getMethods()));
>>>           for (Method method : clazz.getDeclaredMethods())
>>>           {
>>>  +            if (!temp.contains(method))
>>>  +            {
>>>  +                temp.add(method);
>>>  +            }
>>>  +        }
>>>  +
>>>  +        for (Method method : temp)
>>>  +        {
>>>  +                       if (allMethods.contains(method))
>>>  +                       {
>>>  +                               continue;
>>>  +                       }
>>>  +
>>>               if (method.isBridge())
>>>               {
>>>                   // we have no interest in generics bridge methods
>>> 
>>>  Modified:
>>> 
> openwebbeans/trunk/webbeans-impl/src/test/java/org/apache/webbeans/test/interceptors/factory/NormalScopeProxyFactoryTest.java
>>>  URL:
>>> 
> http://svn.apache.org/viewvc/openwebbeans/trunk/webbeans-impl/src/test/java/org/apache/webbeans/test/interceptors/factory/NormalScopeProxyFactoryTest.java?rev=1658730&r1=1658729&r2=1658730&view=diff
>>> 
>>> 
> ==============================================================================
>>>  ---
>>> 
> openwebbeans/trunk/webbeans-impl/src/test/java/org/apache/webbeans/test/interceptors/factory/NormalScopeProxyFactoryTest.java
>>>  (original)
>>>  +++
>>> 
> openwebbeans/trunk/webbeans-impl/src/test/java/org/apache/webbeans/test/interceptors/factory/NormalScopeProxyFactoryTest.java
>>>  Tue Feb 10 14:57:07 2015
>>>  @@ -38,6 +38,7 @@ import java.lang.reflect.Type;
>>>   import java.net.URL;
>>>   import java.net.URLClassLoader;
>>>   import java.util.Set;
>>>  +import
>>>  org.apache.webbeans.test.interceptors.factory.beans.PartialBeanClass;
>>> 
>>>   import static org.junit.Assert.assertNotNull;
>>> 
>>>  @@ -207,6 +208,40 @@ public class NormalScopeProxyFactoryTest
>>> 
>>>       }
>>> 
>>>  +    @Test
>>>  +    public void textPartialBeanProxyCreation() throws Exception
>>>  +    {
>>>  +        NormalScopeProxyFactory pf = new NormalScopeProxyFactory(new
>>>  WebBeansContext());
>>>  +
>>>  +        // we take a fresh URLClassLoader to not blur the test 
> classpath
>>>  with synthetic classes.
>>>  +        ClassLoader classLoader = new URLClassLoader(new URL[0]);
>>>  +
>>>  +        Class<PartialBeanClass> proxyClass =
>>>  pf.createProxyClass(classLoader, PartialBeanClass.class);
>>>  +        Assert.assertNotNull(proxyClass);
>>>  +
>>>  +        PartialBeanClass internalInstance = new PartialBeanClass()
>>>  +        {
>>>  +            @Override
>>>  +            public String willFail2()
>>>  +            {
>>>  +                return "";
>>>  +            }
>>>  +
>>>  +            @Override
>>>  +            public String willFail()
>>>  +            {
>>>  +                return "";
>>>  +            }
>>>  +        };
>>>  +
>>>  +        TestContextualInstanceProvider provider = new
>>>  TestContextualInstanceProvider(internalInstance);
>>>  +
>>>  +        PartialBeanClass proxy = pf.createProxyInstance(proxyClass,
>>>  provider);
>>>  +
>>>  +        proxy.willFail();
>>>  +        proxy.willFail2();
>>>  +        proxy.willFail3();
>>>  +    }
>>> 
>>>       /**
>>>        * Test if protected and package scope methods are proxied as 
> well.
>>> 
>>>  Added:
>>> 
> openwebbeans/trunk/webbeans-impl/src/test/java/org/apache/webbeans/test/interceptors/factory/beans/PartialBeanClass.java
>>>  URL:
>>> 
> http://svn.apache.org/viewvc/openwebbeans/trunk/webbeans-impl/src/test/java/org/apache/webbeans/test/interceptors/factory/beans/PartialBeanClass.java?rev=1658730&view=auto
>>> 
>>> 
> ==============================================================================
>>>  ---
>>> 
> openwebbeans/trunk/webbeans-impl/src/test/java/org/apache/webbeans/test/interceptors/factory/beans/PartialBeanClass.java
>>>  (added)
>>>  +++
>>> 
> openwebbeans/trunk/webbeans-impl/src/test/java/org/apache/webbeans/test/interceptors/factory/beans/PartialBeanClass.java
>>>  Tue Feb 10 14:57:07 2015
>>>  @@ -0,0 +1,30 @@
>>>  +/*
>>>  + * 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.test.interceptors.factory.beans;
>>>  +
>>>  +import javax.enterprise.context.ApplicationScoped;
>>>  +
>>>  +@ApplicationScoped
>>>  +public abstract class PartialBeanClass extends 
> PartialBeanClassSuperClass
>>>  implements PartialBeanClassSuperInterface
>>>  +{
>>>  +    public String willFail3()
>>>  +    {
>>>  +        return "";
>>>  +    }
>>>  +}
>>> 
>>>  Added:
>>> 
> openwebbeans/trunk/webbeans-impl/src/test/java/org/apache/webbeans/test/interceptors/factory/beans/PartialBeanClassSuperClass.java
>>>  URL:
>>> 
> http://svn.apache.org/viewvc/openwebbeans/trunk/webbeans-impl/src/test/java/org/apache/webbeans/test/interceptors/factory/beans/PartialBeanClassSuperClass.java?rev=1658730&view=auto
>>> 
>>> 
> ==============================================================================
>>>  ---
>>> 
> openwebbeans/trunk/webbeans-impl/src/test/java/org/apache/webbeans/test/interceptors/factory/beans/PartialBeanClassSuperClass.java
>>>  (added)
>>>  +++
>>> 
> openwebbeans/trunk/webbeans-impl/src/test/java/org/apache/webbeans/test/interceptors/factory/beans/PartialBeanClassSuperClass.java
>>>  Tue Feb 10 14:57:07 2015
>>>  @@ -0,0 +1,24 @@
>>>  +/*
>>>  + * 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.test.interceptors.factory.beans;
>>>  +
>>>  +public abstract class PartialBeanClassSuperClass
>>>  +{
>>>  +    public abstract String willFail2();
>>>  +}
>>> 
>>>  Added:
>>> 
> openwebbeans/trunk/webbeans-impl/src/test/java/org/apache/webbeans/test/interceptors/factory/beans/PartialBeanClassSuperInterface.java
>>>  URL:
>>> 
> http://svn.apache.org/viewvc/openwebbeans/trunk/webbeans-impl/src/test/java/org/apache/webbeans/test/interceptors/factory/beans/PartialBeanClassSuperInterface.java?rev=1658730&view=auto
>>> 
>>> 
> ==============================================================================
>>>  ---
>>> 
> openwebbeans/trunk/webbeans-impl/src/test/java/org/apache/webbeans/test/interceptors/factory/beans/PartialBeanClassSuperInterface.java
>>>  (added)
>>>  +++
>>> 
> openwebbeans/trunk/webbeans-impl/src/test/java/org/apache/webbeans/test/interceptors/factory/beans/PartialBeanClassSuperInterface.java
>>>  Tue Feb 10 14:57:07 2015
>>>  @@ -0,0 +1,24 @@
>>>  +/*
>>>  + * 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.test.interceptors.factory.beans;
>>>  +
>>>  +public interface PartialBeanClassSuperInterface
>>>  +{
>>>  +    public String willFail();
>>>  +}
>>> 
>>> 
>>> 
> 

Re: svn commit: r1658730 - in /openwebbeans/trunk/webbeans-impl/src: main/java/org/apache/webbeans/util/ test/java/org/apache/webbeans/test/interceptors/factory/ test/java/org/apache/webbeans/test/interceptors/factory/beans/

Posted by Romain Manni-Bucau <rm...@gmail.com>.
sure it should but shouldn't we use annotated type methods instead of
pure reflection?


Romain Manni-Bucau
@rmannibucau
http://www.tomitribe.com
http://rmannibucau.wordpress.com
https://github.com/rmannibucau


2015-02-12 14:41 GMT+01:00 Joseph Bergmark <be...@gmail.com>:
> I need to write a quick unit test to verify, but I think this may still be
> missing non-public inherited methods.
>
> Previously it only used getDeclaredMethods, which would return all all
> private, protected, default and public methods for the class, but did not
> contain any inherited methods.  If I'm reading this change correctly it now
> adds getMethods which will add public inherited methods but still doesn't
> include protected or default methods.
>
> I wonder if we should walk up the class hierarchy and call
> getDeclaredMethods at each step.  Might need to discard private methods
> found in superclasses as I'm not sure we need to worry about those being
> called on the proxy.
>
> On Tue, Feb 10, 2015 at 9:57 AM, <ta...@apache.org> wrote:
>
>> Author: tandraschko
>> Date: Tue Feb 10 14:57:07 2015
>> New Revision: 1658730
>>
>> URL: http://svn.apache.org/r1658730
>> Log:
>> OWB-1036 NormalScoped ASM proxies broken in some cases for partial beans
>>
>> Added:
>>
>> openwebbeans/trunk/webbeans-impl/src/test/java/org/apache/webbeans/test/interceptors/factory/beans/PartialBeanClass.java
>>
>> openwebbeans/trunk/webbeans-impl/src/test/java/org/apache/webbeans/test/interceptors/factory/beans/PartialBeanClassSuperClass.java
>>
>> openwebbeans/trunk/webbeans-impl/src/test/java/org/apache/webbeans/test/interceptors/factory/beans/PartialBeanClassSuperInterface.java
>> Modified:
>>
>> openwebbeans/trunk/webbeans-impl/src/main/java/org/apache/webbeans/util/ClassUtil.java
>>
>> openwebbeans/trunk/webbeans-impl/src/test/java/org/apache/webbeans/test/interceptors/factory/NormalScopeProxyFactoryTest.java
>>
>> 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=1658730&r1=1658729&r2=1658730&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 Feb 10 14:57:07 2015
>> @@ -305,8 +305,22 @@ public final class ClassUtil
>>                                               Map<String, List<Method>>
>> methodMap, List<Method> allMethods,
>>                                               Class<?> clazz)
>>      {
>> +        List<Method> temp = new
>> ArrayList<Method>(Arrays.asList(clazz.getMethods()));
>>          for (Method method : clazz.getDeclaredMethods())
>>          {
>> +            if (!temp.contains(method))
>> +            {
>> +                temp.add(method);
>> +            }
>> +        }
>> +
>> +        for (Method method : temp)
>> +        {
>> +                       if (allMethods.contains(method))
>> +                       {
>> +                               continue;
>> +                       }
>> +
>>              if (method.isBridge())
>>              {
>>                  // we have no interest in generics bridge methods
>>
>> Modified:
>> openwebbeans/trunk/webbeans-impl/src/test/java/org/apache/webbeans/test/interceptors/factory/NormalScopeProxyFactoryTest.java
>> URL:
>> http://svn.apache.org/viewvc/openwebbeans/trunk/webbeans-impl/src/test/java/org/apache/webbeans/test/interceptors/factory/NormalScopeProxyFactoryTest.java?rev=1658730&r1=1658729&r2=1658730&view=diff
>>
>> ==============================================================================
>> ---
>> openwebbeans/trunk/webbeans-impl/src/test/java/org/apache/webbeans/test/interceptors/factory/NormalScopeProxyFactoryTest.java
>> (original)
>> +++
>> openwebbeans/trunk/webbeans-impl/src/test/java/org/apache/webbeans/test/interceptors/factory/NormalScopeProxyFactoryTest.java
>> Tue Feb 10 14:57:07 2015
>> @@ -38,6 +38,7 @@ import java.lang.reflect.Type;
>>  import java.net.URL;
>>  import java.net.URLClassLoader;
>>  import java.util.Set;
>> +import
>> org.apache.webbeans.test.interceptors.factory.beans.PartialBeanClass;
>>
>>  import static org.junit.Assert.assertNotNull;
>>
>> @@ -207,6 +208,40 @@ public class NormalScopeProxyFactoryTest
>>
>>      }
>>
>> +    @Test
>> +    public void textPartialBeanProxyCreation() throws Exception
>> +    {
>> +        NormalScopeProxyFactory pf = new NormalScopeProxyFactory(new
>> WebBeansContext());
>> +
>> +        // we take a fresh URLClassLoader to not blur the test classpath
>> with synthetic classes.
>> +        ClassLoader classLoader = new URLClassLoader(new URL[0]);
>> +
>> +        Class<PartialBeanClass> proxyClass =
>> pf.createProxyClass(classLoader, PartialBeanClass.class);
>> +        Assert.assertNotNull(proxyClass);
>> +
>> +        PartialBeanClass internalInstance = new PartialBeanClass()
>> +        {
>> +            @Override
>> +            public String willFail2()
>> +            {
>> +                return "";
>> +            }
>> +
>> +            @Override
>> +            public String willFail()
>> +            {
>> +                return "";
>> +            }
>> +        };
>> +
>> +        TestContextualInstanceProvider provider = new
>> TestContextualInstanceProvider(internalInstance);
>> +
>> +        PartialBeanClass proxy = pf.createProxyInstance(proxyClass,
>> provider);
>> +
>> +        proxy.willFail();
>> +        proxy.willFail2();
>> +        proxy.willFail3();
>> +    }
>>
>>      /**
>>       * Test if protected and package scope methods are proxied as well.
>>
>> Added:
>> openwebbeans/trunk/webbeans-impl/src/test/java/org/apache/webbeans/test/interceptors/factory/beans/PartialBeanClass.java
>> URL:
>> http://svn.apache.org/viewvc/openwebbeans/trunk/webbeans-impl/src/test/java/org/apache/webbeans/test/interceptors/factory/beans/PartialBeanClass.java?rev=1658730&view=auto
>>
>> ==============================================================================
>> ---
>> openwebbeans/trunk/webbeans-impl/src/test/java/org/apache/webbeans/test/interceptors/factory/beans/PartialBeanClass.java
>> (added)
>> +++
>> openwebbeans/trunk/webbeans-impl/src/test/java/org/apache/webbeans/test/interceptors/factory/beans/PartialBeanClass.java
>> Tue Feb 10 14:57:07 2015
>> @@ -0,0 +1,30 @@
>> +/*
>> + * 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.test.interceptors.factory.beans;
>> +
>> +import javax.enterprise.context.ApplicationScoped;
>> +
>> +@ApplicationScoped
>> +public abstract class PartialBeanClass extends PartialBeanClassSuperClass
>> implements PartialBeanClassSuperInterface
>> +{
>> +    public String willFail3()
>> +    {
>> +        return "";
>> +    }
>> +}
>>
>> Added:
>> openwebbeans/trunk/webbeans-impl/src/test/java/org/apache/webbeans/test/interceptors/factory/beans/PartialBeanClassSuperClass.java
>> URL:
>> http://svn.apache.org/viewvc/openwebbeans/trunk/webbeans-impl/src/test/java/org/apache/webbeans/test/interceptors/factory/beans/PartialBeanClassSuperClass.java?rev=1658730&view=auto
>>
>> ==============================================================================
>> ---
>> openwebbeans/trunk/webbeans-impl/src/test/java/org/apache/webbeans/test/interceptors/factory/beans/PartialBeanClassSuperClass.java
>> (added)
>> +++
>> openwebbeans/trunk/webbeans-impl/src/test/java/org/apache/webbeans/test/interceptors/factory/beans/PartialBeanClassSuperClass.java
>> Tue Feb 10 14:57:07 2015
>> @@ -0,0 +1,24 @@
>> +/*
>> + * 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.test.interceptors.factory.beans;
>> +
>> +public abstract class PartialBeanClassSuperClass
>> +{
>> +    public abstract String willFail2();
>> +}
>>
>> Added:
>> openwebbeans/trunk/webbeans-impl/src/test/java/org/apache/webbeans/test/interceptors/factory/beans/PartialBeanClassSuperInterface.java
>> URL:
>> http://svn.apache.org/viewvc/openwebbeans/trunk/webbeans-impl/src/test/java/org/apache/webbeans/test/interceptors/factory/beans/PartialBeanClassSuperInterface.java?rev=1658730&view=auto
>>
>> ==============================================================================
>> ---
>> openwebbeans/trunk/webbeans-impl/src/test/java/org/apache/webbeans/test/interceptors/factory/beans/PartialBeanClassSuperInterface.java
>> (added)
>> +++
>> openwebbeans/trunk/webbeans-impl/src/test/java/org/apache/webbeans/test/interceptors/factory/beans/PartialBeanClassSuperInterface.java
>> Tue Feb 10 14:57:07 2015
>> @@ -0,0 +1,24 @@
>> +/*
>> + * 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.test.interceptors.factory.beans;
>> +
>> +public interface PartialBeanClassSuperInterface
>> +{
>> +    public String willFail();
>> +}
>>
>>
>>

Re: svn commit: r1658730 - in /openwebbeans/trunk/webbeans-impl/src: main/java/org/apache/webbeans/util/ test/java/org/apache/webbeans/test/interceptors/factory/ test/java/org/apache/webbeans/test/interceptors/factory/beans/

Posted by Joseph Bergmark <be...@gmail.com>.
I need to write a quick unit test to verify, but I think this may still be
missing non-public inherited methods.

Previously it only used getDeclaredMethods, which would return all all
private, protected, default and public methods for the class, but did not
contain any inherited methods.  If I'm reading this change correctly it now
adds getMethods which will add public inherited methods but still doesn't
include protected or default methods.

I wonder if we should walk up the class hierarchy and call
getDeclaredMethods at each step.  Might need to discard private methods
found in superclasses as I'm not sure we need to worry about those being
called on the proxy.

On Tue, Feb 10, 2015 at 9:57 AM, <ta...@apache.org> wrote:

> Author: tandraschko
> Date: Tue Feb 10 14:57:07 2015
> New Revision: 1658730
>
> URL: http://svn.apache.org/r1658730
> Log:
> OWB-1036 NormalScoped ASM proxies broken in some cases for partial beans
>
> Added:
>
> openwebbeans/trunk/webbeans-impl/src/test/java/org/apache/webbeans/test/interceptors/factory/beans/PartialBeanClass.java
>
> openwebbeans/trunk/webbeans-impl/src/test/java/org/apache/webbeans/test/interceptors/factory/beans/PartialBeanClassSuperClass.java
>
> openwebbeans/trunk/webbeans-impl/src/test/java/org/apache/webbeans/test/interceptors/factory/beans/PartialBeanClassSuperInterface.java
> Modified:
>
> openwebbeans/trunk/webbeans-impl/src/main/java/org/apache/webbeans/util/ClassUtil.java
>
> openwebbeans/trunk/webbeans-impl/src/test/java/org/apache/webbeans/test/interceptors/factory/NormalScopeProxyFactoryTest.java
>
> 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=1658730&r1=1658729&r2=1658730&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 Feb 10 14:57:07 2015
> @@ -305,8 +305,22 @@ public final class ClassUtil
>                                               Map<String, List<Method>>
> methodMap, List<Method> allMethods,
>                                               Class<?> clazz)
>      {
> +        List<Method> temp = new
> ArrayList<Method>(Arrays.asList(clazz.getMethods()));
>          for (Method method : clazz.getDeclaredMethods())
>          {
> +            if (!temp.contains(method))
> +            {
> +                temp.add(method);
> +            }
> +        }
> +
> +        for (Method method : temp)
> +        {
> +                       if (allMethods.contains(method))
> +                       {
> +                               continue;
> +                       }
> +
>              if (method.isBridge())
>              {
>                  // we have no interest in generics bridge methods
>
> Modified:
> openwebbeans/trunk/webbeans-impl/src/test/java/org/apache/webbeans/test/interceptors/factory/NormalScopeProxyFactoryTest.java
> URL:
> http://svn.apache.org/viewvc/openwebbeans/trunk/webbeans-impl/src/test/java/org/apache/webbeans/test/interceptors/factory/NormalScopeProxyFactoryTest.java?rev=1658730&r1=1658729&r2=1658730&view=diff
>
> ==============================================================================
> ---
> openwebbeans/trunk/webbeans-impl/src/test/java/org/apache/webbeans/test/interceptors/factory/NormalScopeProxyFactoryTest.java
> (original)
> +++
> openwebbeans/trunk/webbeans-impl/src/test/java/org/apache/webbeans/test/interceptors/factory/NormalScopeProxyFactoryTest.java
> Tue Feb 10 14:57:07 2015
> @@ -38,6 +38,7 @@ import java.lang.reflect.Type;
>  import java.net.URL;
>  import java.net.URLClassLoader;
>  import java.util.Set;
> +import
> org.apache.webbeans.test.interceptors.factory.beans.PartialBeanClass;
>
>  import static org.junit.Assert.assertNotNull;
>
> @@ -207,6 +208,40 @@ public class NormalScopeProxyFactoryTest
>
>      }
>
> +    @Test
> +    public void textPartialBeanProxyCreation() throws Exception
> +    {
> +        NormalScopeProxyFactory pf = new NormalScopeProxyFactory(new
> WebBeansContext());
> +
> +        // we take a fresh URLClassLoader to not blur the test classpath
> with synthetic classes.
> +        ClassLoader classLoader = new URLClassLoader(new URL[0]);
> +
> +        Class<PartialBeanClass> proxyClass =
> pf.createProxyClass(classLoader, PartialBeanClass.class);
> +        Assert.assertNotNull(proxyClass);
> +
> +        PartialBeanClass internalInstance = new PartialBeanClass()
> +        {
> +            @Override
> +            public String willFail2()
> +            {
> +                return "";
> +            }
> +
> +            @Override
> +            public String willFail()
> +            {
> +                return "";
> +            }
> +        };
> +
> +        TestContextualInstanceProvider provider = new
> TestContextualInstanceProvider(internalInstance);
> +
> +        PartialBeanClass proxy = pf.createProxyInstance(proxyClass,
> provider);
> +
> +        proxy.willFail();
> +        proxy.willFail2();
> +        proxy.willFail3();
> +    }
>
>      /**
>       * Test if protected and package scope methods are proxied as well.
>
> Added:
> openwebbeans/trunk/webbeans-impl/src/test/java/org/apache/webbeans/test/interceptors/factory/beans/PartialBeanClass.java
> URL:
> http://svn.apache.org/viewvc/openwebbeans/trunk/webbeans-impl/src/test/java/org/apache/webbeans/test/interceptors/factory/beans/PartialBeanClass.java?rev=1658730&view=auto
>
> ==============================================================================
> ---
> openwebbeans/trunk/webbeans-impl/src/test/java/org/apache/webbeans/test/interceptors/factory/beans/PartialBeanClass.java
> (added)
> +++
> openwebbeans/trunk/webbeans-impl/src/test/java/org/apache/webbeans/test/interceptors/factory/beans/PartialBeanClass.java
> Tue Feb 10 14:57:07 2015
> @@ -0,0 +1,30 @@
> +/*
> + * 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.test.interceptors.factory.beans;
> +
> +import javax.enterprise.context.ApplicationScoped;
> +
> +@ApplicationScoped
> +public abstract class PartialBeanClass extends PartialBeanClassSuperClass
> implements PartialBeanClassSuperInterface
> +{
> +    public String willFail3()
> +    {
> +        return "";
> +    }
> +}
>
> Added:
> openwebbeans/trunk/webbeans-impl/src/test/java/org/apache/webbeans/test/interceptors/factory/beans/PartialBeanClassSuperClass.java
> URL:
> http://svn.apache.org/viewvc/openwebbeans/trunk/webbeans-impl/src/test/java/org/apache/webbeans/test/interceptors/factory/beans/PartialBeanClassSuperClass.java?rev=1658730&view=auto
>
> ==============================================================================
> ---
> openwebbeans/trunk/webbeans-impl/src/test/java/org/apache/webbeans/test/interceptors/factory/beans/PartialBeanClassSuperClass.java
> (added)
> +++
> openwebbeans/trunk/webbeans-impl/src/test/java/org/apache/webbeans/test/interceptors/factory/beans/PartialBeanClassSuperClass.java
> Tue Feb 10 14:57:07 2015
> @@ -0,0 +1,24 @@
> +/*
> + * 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.test.interceptors.factory.beans;
> +
> +public abstract class PartialBeanClassSuperClass
> +{
> +    public abstract String willFail2();
> +}
>
> Added:
> openwebbeans/trunk/webbeans-impl/src/test/java/org/apache/webbeans/test/interceptors/factory/beans/PartialBeanClassSuperInterface.java
> URL:
> http://svn.apache.org/viewvc/openwebbeans/trunk/webbeans-impl/src/test/java/org/apache/webbeans/test/interceptors/factory/beans/PartialBeanClassSuperInterface.java?rev=1658730&view=auto
>
> ==============================================================================
> ---
> openwebbeans/trunk/webbeans-impl/src/test/java/org/apache/webbeans/test/interceptors/factory/beans/PartialBeanClassSuperInterface.java
> (added)
> +++
> openwebbeans/trunk/webbeans-impl/src/test/java/org/apache/webbeans/test/interceptors/factory/beans/PartialBeanClassSuperInterface.java
> Tue Feb 10 14:57:07 2015
> @@ -0,0 +1,24 @@
> +/*
> + * 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.test.interceptors.factory.beans;
> +
> +public interface PartialBeanClassSuperInterface
> +{
> +    public String willFail();
> +}
>
>
>