You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@aries.apache.org by sb...@apache.org on 2016/01/29 07:23:46 UTC

svn commit: r1727484 - in /aries/trunk/proxy: proxy-impl/src/main/java/org/apache/aries/proxy/impl/interfaces/InterfaceCombiningClassAdapter.java proxy-itests/src/test/java/org/apache/aries/proxy/itests/AbstractBasicProxyTest.java

Author: sbratton
Date: Fri Jan 29 06:23:46 2016
New Revision: 1727484

URL: http://svn.apache.org/viewvc?rev=1727484&view=rev
Log:
[ARIES-1486] can't create proxy on java 8 vm  for interfaces containing lambda

Modified:
    aries/trunk/proxy/proxy-impl/src/main/java/org/apache/aries/proxy/impl/interfaces/InterfaceCombiningClassAdapter.java
    aries/trunk/proxy/proxy-itests/src/test/java/org/apache/aries/proxy/itests/AbstractBasicProxyTest.java

Modified: aries/trunk/proxy/proxy-impl/src/main/java/org/apache/aries/proxy/impl/interfaces/InterfaceCombiningClassAdapter.java
URL: http://svn.apache.org/viewvc/aries/trunk/proxy/proxy-impl/src/main/java/org/apache/aries/proxy/impl/interfaces/InterfaceCombiningClassAdapter.java?rev=1727484&r1=1727483&r2=1727484&view=diff
==============================================================================
--- aries/trunk/proxy/proxy-impl/src/main/java/org/apache/aries/proxy/impl/interfaces/InterfaceCombiningClassAdapter.java (original)
+++ aries/trunk/proxy/proxy-impl/src/main/java/org/apache/aries/proxy/impl/interfaces/InterfaceCombiningClassAdapter.java Fri Jan 29 06:23:46 2016
@@ -84,16 +84,21 @@ final class InterfaceCombiningClassAdapt
 
   @Override
   public final MethodVisitor visitMethod(int access, String name, String desc,
-      String sig, String[] arg4) {
-    //If we already implement this method (from another interface) then we don't
-    //want a duplicate. We also don't want to copy any static init blocks (these
-    //initialize static fields on the interface that we don't copy
-    if(adapter.getKnownMethods().contains(new Method(name, desc)) || 
-        "<clinit>".equals(name))
-      return null;
-    else {//We're going to implement this method, so make it non abstract!
-      return adapter.visitMethod(access, name, desc, null, arg4);
-    }
+          String sig, String[] arg4) {
+      //If we already implement this method (from another interface) then we don't
+      //want a duplicate. We also don't want to copy any static init blocks (these
+      //initialize static fields on the interface that we don't copy
+      if(adapter.getKnownMethods().contains(new Method(name, desc)) || 
+              "<clinit>".equals(name)) {
+          return null;
+      }
+      else if(((access & (ACC_PRIVATE|ACC_SYNTHETIC)) == (ACC_PRIVATE|ACC_SYNTHETIC))) {
+          // private, synthetic methods on interfaces don't need to be proxied.       
+          return null;
+      }
+      else {//We're going to implement this method, so make it non abstract!
+          return adapter.visitMethod(access, name, desc, null, arg4);
+      }
   }
 
   /**

Modified: aries/trunk/proxy/proxy-itests/src/test/java/org/apache/aries/proxy/itests/AbstractBasicProxyTest.java
URL: http://svn.apache.org/viewvc/aries/trunk/proxy/proxy-itests/src/test/java/org/apache/aries/proxy/itests/AbstractBasicProxyTest.java?rev=1727484&r1=1727483&r2=1727484&view=diff
==============================================================================
--- aries/trunk/proxy/proxy-itests/src/test/java/org/apache/aries/proxy/itests/AbstractBasicProxyTest.java (original)
+++ aries/trunk/proxy/proxy-itests/src/test/java/org/apache/aries/proxy/itests/AbstractBasicProxyTest.java Fri Jan 29 06:23:46 2016
@@ -54,6 +54,26 @@ public abstract class AbstractBasicProxy
   }
 
   /**
+   * This method checks that we correctly proxy an interface with default methods on java 8
+   */
+  @Test
+  public void checkProxydefaultMethodInterface() throws UnableToProxyException
+  {
+      Bundle b = bundleContext.getBundle();
+      Callable<Object> c = new TestCallable();
+      Collection<Class<?>> classes = new ArrayList<Class<?>>();
+      // proxy an interface with a default methods (on Java 8).
+      classes.add(java.lang.CharSequence.class);
+      try {
+          mgr.createDelegatingProxy(b, classes, c, null);
+      } catch (FinalModifierException e) {
+          String msg = e.getMessage();
+          assertEquals("The message didn't look right", "The class " + TestCallable.class.getName() + " is final.", msg);
+          assertTrue("The message didn't appear in the toString", e.toString().endsWith(msg));
+      }
+  }
+  
+  /**
    * This method checks that we correctly fail to proxy a class with final methods.
    * It also does a quick validation on the exception message.
    */