You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@aries.apache.org by gn...@apache.org on 2016/03/08 11:58:09 UTC

svn commit: r1734053 - /aries/trunk/proxy/proxy-impl/src/main/java/org/apache/aries/proxy/impl/interfaces/InterfaceProxyGenerator.java

Author: gnodet
Date: Tue Mar  8 10:58:09 2016
New Revision: 1734053

URL: http://svn.apache.org/viewvc?rev=1734053&view=rev
Log:
[ARIES-1342] Aries Proxy Impl fails to proxy a service with covariant type hierarchy in Java 8

Modified:
    aries/trunk/proxy/proxy-impl/src/main/java/org/apache/aries/proxy/impl/interfaces/InterfaceProxyGenerator.java

Modified: aries/trunk/proxy/proxy-impl/src/main/java/org/apache/aries/proxy/impl/interfaces/InterfaceProxyGenerator.java
URL: http://svn.apache.org/viewvc/aries/trunk/proxy/proxy-impl/src/main/java/org/apache/aries/proxy/impl/interfaces/InterfaceProxyGenerator.java?rev=1734053&r1=1734052&r2=1734053&view=diff
==============================================================================
--- aries/trunk/proxy/proxy-impl/src/main/java/org/apache/aries/proxy/impl/interfaces/InterfaceProxyGenerator.java (original)
+++ aries/trunk/proxy/proxy-impl/src/main/java/org/apache/aries/proxy/impl/interfaces/InterfaceProxyGenerator.java Tue Mar  8 10:58:09 2016
@@ -115,7 +115,18 @@ public final class InterfaceProxyGenerat
   private static SortedSet<Class<?>> createSet(Collection<Class<?>> ifaces) {
     SortedSet<Class<?>> classes = new TreeSet<Class<?>>(new Comparator<Class<?>>() {
       public int compare(Class<?> object1, Class<?> object2) {
-        return object1.getName().compareTo(object2.getName());
+        if (object1.getName().equals(object2.getName())) {
+          return 0;
+        } else if (object1.isAssignableFrom(object2)) {
+          // first class is parent of second, it occurs earlier in type hierarchy
+          return -1;
+        } else if (object2.isAssignableFrom(object1)) {
+          // second class is subclass of first one, it occurs later in hierarchy
+          return 1;
+        }
+        // types have separate inheritance trees, so it doesn't mater which one is first or second,
+        // however we can't mark them as equal cause one of them will be removed
+        return 1;
       }
     });
     for(Class<?> c : ifaces) {