You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@cxf.apache.org by se...@apache.org on 2011/12/19 17:52:02 UTC
svn commit: r1220841 - in /cxf/dosgi/trunk/dsw/cxf-dsw/src:
main/java/org/apache/cxf/dosgi/dsw/ClassUtils.java
test/java/org/apache/cxf/dosgi/dsw/ClassUtilsTest.java
Author: sergeyb
Date: Mon Dec 19 16:52:01 2011
New Revision: 1220841
URL: http://svn.apache.org/viewvc?rev=1220841&view=rev
Log:
[DOSGI-94] Applying a patch on behalf of Ivanhoe Abrahams
Modified:
cxf/dosgi/trunk/dsw/cxf-dsw/src/main/java/org/apache/cxf/dosgi/dsw/ClassUtils.java
cxf/dosgi/trunk/dsw/cxf-dsw/src/test/java/org/apache/cxf/dosgi/dsw/ClassUtilsTest.java
Modified: cxf/dosgi/trunk/dsw/cxf-dsw/src/main/java/org/apache/cxf/dosgi/dsw/ClassUtils.java
URL: http://svn.apache.org/viewvc/cxf/dosgi/trunk/dsw/cxf-dsw/src/main/java/org/apache/cxf/dosgi/dsw/ClassUtils.java?rev=1220841&r1=1220840&r2=1220841&view=diff
==============================================================================
--- cxf/dosgi/trunk/dsw/cxf-dsw/src/main/java/org/apache/cxf/dosgi/dsw/ClassUtils.java (original)
+++ cxf/dosgi/trunk/dsw/cxf-dsw/src/main/java/org/apache/cxf/dosgi/dsw/ClassUtils.java Mon Dec 19 16:52:01 2011
@@ -35,9 +35,49 @@ public final class ClassUtils {
return intf;
}
}
+
if (serviceClass.getName().equals(interfaceName)) {
return serviceClass;
}
+
+ Class<?> interfaceOnProxiedClass = getInterfaceClassOnSuperClasses(serviceClass, interfaceName);
+ if (interfaceOnProxiedClass != null){
+ return interfaceOnProxiedClass;
+ }
+
return null;
}
+
+ /**
+ * <pre>
+ *
+ * The following method tries to deal specifically with classes that might have been proxied
+ * eg. CGLIB proxies of which there might be a chain of proxies as different osgi frameworks
+ * might be proxying the original service class that has been registered and then proxying the proxy.
+ *
+ * </pre>
+ *
+ * @param serviceClass
+ * @param interfaceName
+ * @return
+ */
+ private static Class<?> getInterfaceClassOnSuperClasses(Class<?> serviceClass, String interfaceName){
+ Class<?> superClass = serviceClass.getSuperclass();
+ if (superClass != null){
+ for (Class<?> iClass : superClass.getInterfaces()) {
+ if (iClass.getName().equals(interfaceName)) {
+ return iClass;
+ }
+ Class<?> intf = getInterfaceClass(iClass, interfaceName);
+ if (intf != null) {
+ return intf;
+ }
+ }
+ Class<?> foundOnSuperclass = getInterfaceClassOnSuperClasses(superClass, interfaceName);
+ if (foundOnSuperclass != null){
+ return foundOnSuperclass;
+ }
+ }
+ return null;
+ }
}
Modified: cxf/dosgi/trunk/dsw/cxf-dsw/src/test/java/org/apache/cxf/dosgi/dsw/ClassUtilsTest.java
URL: http://svn.apache.org/viewvc/cxf/dosgi/trunk/dsw/cxf-dsw/src/test/java/org/apache/cxf/dosgi/dsw/ClassUtilsTest.java?rev=1220841&r1=1220840&r2=1220841&view=diff
==============================================================================
--- cxf/dosgi/trunk/dsw/cxf-dsw/src/test/java/org/apache/cxf/dosgi/dsw/ClassUtilsTest.java (original)
+++ cxf/dosgi/trunk/dsw/cxf-dsw/src/test/java/org/apache/cxf/dosgi/dsw/ClassUtilsTest.java Mon Dec 19 16:52:01 2011
@@ -20,7 +20,9 @@ package org.apache.cxf.dosgi.dsw;
import java.util.ArrayList;
import java.util.Collection;
+import java.util.HashMap;
import java.util.List;
+import java.util.Map;
import junit.framework.TestCase;
@@ -32,4 +34,18 @@ public class ClassUtilsTest extends Test
assertEquals(List.class, ClassUtils.getInterfaceClass(new ArrayList(), "java.util.List"));
assertEquals(Collection.class, ClassUtils.getInterfaceClass(new ArrayList(), "java.util.Collection"));
}
+
+ public void testGetInterfaceClassFromSubclass() {
+ assertEquals(Map.class, ClassUtils.getInterfaceClass(new MySubclassFour(), "java.util.Map"));
+ assertNull(ClassUtils.getInterfaceClass(new MySubclassFour(), "java.util.UnknownType"));
+ }
+ static class MyMapSubclass extends HashMap{}
+
+ static class MySubclassOne extends MyMapSubclass{}
+
+ static class MySubclassTwo extends MySubclassOne{}
+
+ static class MySubclassThree extends MySubclassTwo{}
+
+ static class MySubclassFour extends MySubclassThree{}
}