Author: davidb
Date: Fri Jan 18 14:32:50 2019
New Revision: 1851622

URL: http://svn.apache.org/viewvc?rev=1851622&view=rev
Log:
FELIX-6031 Converter is not working properly when the target is an interface 
that extends others

Fix based on suggested fix by Cristiano Gavião.
Added unit test too.

Modified:
    
felix/trunk/converter/converter/src/main/java/org/osgi/util/converter/ConvertingImpl.java
    
felix/trunk/converter/converter/src/test/java/org/osgi/util/converter/ConverterMapTest.java

Modified: 
felix/trunk/converter/converter/src/main/java/org/osgi/util/converter/ConvertingImpl.java
URL: 
http://svn.apache.org/viewvc/felix/trunk/converter/converter/src/main/java/org/osgi/util/converter/ConvertingImpl.java?rev=1851622&r1=1851621&r2=1851622&view=diff
==============================================================================
--- 
felix/trunk/converter/converter/src/main/java/org/osgi/util/converter/ConvertingImpl.java
 (original)
+++ 
felix/trunk/converter/converter/src/main/java/org/osgi/util/converter/ConvertingImpl.java
 Fri Jan 18 14:32:50 2019
@@ -1119,8 +1119,9 @@ class ConvertingImpl extends AbstractSpe
                Set<Class< ? >> classes = new LinkedHashSet<>();
                if (cls.isInterface()) {
                        classes.add(cls);
-               } else {
-                       classes.addAll(Arrays.asList(cls.getInterfaces()));
+               }
+               for (Class< ? > intf : cls.getInterfaces()) {
+                       classes.addAll(getInterfaces(intf));
                }
 
                classes.addAll(getInterfaces(cls.getSuperclass()));

Modified: 
felix/trunk/converter/converter/src/test/java/org/osgi/util/converter/ConverterMapTest.java
URL: 
http://svn.apache.org/viewvc/felix/trunk/converter/converter/src/test/java/org/osgi/util/converter/ConverterMapTest.java?rev=1851622&r1=1851621&r2=1851622&view=diff
==============================================================================
--- 
felix/trunk/converter/converter/src/test/java/org/osgi/util/converter/ConverterMapTest.java
 (original)
+++ 
felix/trunk/converter/converter/src/test/java/org/osgi/util/converter/ConverterMapTest.java
 Fri Jan 18 14:32:50 2019
@@ -16,6 +16,11 @@
  */
 package org.osgi.util.converter;
 
+import org.junit.After;
+import org.junit.Before;
+import org.junit.Ignore;
+import org.junit.Test;
+
 import java.lang.annotation.Annotation;
 import java.lang.reflect.Method;
 import java.math.BigInteger;
@@ -29,11 +34,6 @@ import java.util.Hashtable;
 import java.util.LinkedHashMap;
 import java.util.Map;
 
-import org.junit.After;
-import org.junit.Before;
-import org.junit.Ignore;
-import org.junit.Test;
-
 import static org.junit.Assert.assertArrayEquals;
 import static org.junit.Assert.assertEquals;
 import static org.junit.Assert.assertFalse;
@@ -179,6 +179,38 @@ public class ConverterMapTest {
         assertEquals(true, (boolean) m.get("za.za"));
     }
 
+    @Test
+    public void testInterfaceToMapEmptySub() {
+        TestInterfaceSub impl = new TestInterfaceSub() {
+            @Override
+            public String foo() {
+                return "Chocolate!";
+            }
+
+            @Override
+            public int bar() {
+                return 76543;
+            }
+
+            @Override
+            public int bar(String def) {
+                return 0;
+            }
+
+            @Override
+            public Boolean za_za() {
+                return true;
+            }
+        };
+
+        @SuppressWarnings("rawtypes")
+        Map m = converter.convert(impl).to(Map.class);
+        assertEquals(3, m.size());
+        assertEquals("Chocolate!", m.get("foo"));
+        assertEquals(76543, (int) m.get("bar"));
+        assertEquals(true, (boolean) m.get("za.za"));
+    }
+
     @SuppressWarnings({ "unchecked", "rawtypes" })
     @Test
     public void testMapToInterface1() {
@@ -557,7 +589,7 @@ public class ConverterMapTest {
         final TestValue testValue = 
converter.convert(Collections.singletonMap("my.prefix.test.value", 
true)).to(TestValue.class);
         assertTrue(testValue.value());
     }
-    
+
     private <K,V> Map.Entry<K,V> getMapEntry(Map<K,V> map) {
         assertEquals("This method assumes a map of size 1", 1, map.size());
         return map.entrySet().iterator().next();
@@ -570,6 +602,8 @@ public class ConverterMapTest {
         Boolean za_za();
     }
 
+    interface TestInterfaceSub extends TestInterface {}
+
     interface TestInterfaceWithGetProperties {
         int blah();
         Dictionary<String, Object> getProperties();
@@ -591,7 +625,7 @@ public class ConverterMapTest {
 
         boolean value();
     }
-    
+
     private static class Foo {
         private final int value;
 


Reply via email to