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;