You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@felix.apache.org by da...@apache.org on 2017/06/21 13:32:25 UTC

svn commit: r1799441 - in /felix/trunk/converter/converter/src: main/java/org/apache/felix/converter/impl/ConvertingImpl.java test/java/org/apache/felix/converter/impl/ConverterMapTest.java

Author: davidb
Date: Wed Jun 21 13:32:25 2017
New Revision: 1799441

URL: http://svn.apache.org/viewvc?rev=1799441&view=rev
Log:
Felix Converter - add support for conversions of Map Entries.

Modified:
    felix/trunk/converter/converter/src/main/java/org/apache/felix/converter/impl/ConvertingImpl.java
    felix/trunk/converter/converter/src/test/java/org/apache/felix/converter/impl/ConverterMapTest.java

Modified: felix/trunk/converter/converter/src/main/java/org/apache/felix/converter/impl/ConvertingImpl.java
URL: http://svn.apache.org/viewvc/felix/trunk/converter/converter/src/main/java/org/apache/felix/converter/impl/ConvertingImpl.java?rev=1799441&r1=1799440&r2=1799441&view=diff
==============================================================================
--- felix/trunk/converter/converter/src/main/java/org/apache/felix/converter/impl/ConvertingImpl.java (original)
+++ felix/trunk/converter/converter/src/main/java/org/apache/felix/converter/impl/ConvertingImpl.java Wed Jun 21 13:32:25 2017
@@ -216,9 +216,11 @@ public class ConvertingImpl implements C
 
         // At this point we know that the target is a 'singular' type: not a map, collection or array
         if (Collection.class.isAssignableFrom(sourceClass)) {
-            return convertCollectionToSingleValue(cls);
+            return convertCollectionToSingleValue(targetAsClass);
+        } else if (object instanceof Map.Entry) {
+            return convertMapEntryToSingleValue(targetAsClass);
         } else if ((object = asBoxedArray(object)) instanceof Object[]) {
-            return convertArrayToSingleValue(cls);
+            return convertArrayToSingleValue(targetAsClass);
         }
 
         Object res2 = tryStandardMethods();
@@ -248,6 +250,30 @@ public class ConvertingImpl implements C
             return converter.convert(coll.iterator().next()).to(cls);
     }
 
+    @SuppressWarnings("rawtypes")
+    private Object convertMapEntryToSingleValue(Class<?> cls) {
+        Map.Entry entry = (Map.Entry) object;
+
+        Class keyCls = entry.getKey() != null ? entry.getKey().getClass() : null;
+        Class valueCls = entry.getValue() != null ? entry.getValue().getClass() : null;
+
+        if (cls.equals(keyCls)) {
+            return converter.convert(entry.getKey()).to(cls);
+        } else if (cls.equals(valueCls)) {
+            return converter.convert(entry.getValue()).to(cls);
+        } else if (cls.isAssignableFrom(keyCls)) {
+            return converter.convert(entry.getKey()).to(cls);
+        } else if (cls.isAssignableFrom(valueCls)) {
+            return converter.convert(entry.getValue()).to(cls);
+        } else if (entry.getKey() instanceof String) {
+            return converter.convert(entry.getKey()).to(cls);
+        } else if (entry.getValue() instanceof String) {
+            return converter.convert(entry.getValue()).to(cls);
+        }
+
+        return converter.convert(converter.convert(entry.getKey()).to(String.class)).to(cls);
+    }
+
     @SuppressWarnings("unchecked")
     private <T> T convertToArray() {
         Collection<?> collectionView = collectionView(object);

Modified: felix/trunk/converter/converter/src/test/java/org/apache/felix/converter/impl/ConverterMapTest.java
URL: http://svn.apache.org/viewvc/felix/trunk/converter/converter/src/test/java/org/apache/felix/converter/impl/ConverterMapTest.java?rev=1799441&r1=1799440&r2=1799441&view=diff
==============================================================================
--- felix/trunk/converter/converter/src/test/java/org/apache/felix/converter/impl/ConverterMapTest.java (original)
+++ felix/trunk/converter/converter/src/test/java/org/apache/felix/converter/impl/ConverterMapTest.java Wed Jun 21 13:32:25 2017
@@ -429,6 +429,57 @@ public class ConverterMapTest {
         assertEquals(true, m3.invoke(ta2));
     }
 
+    @Test
+    public void testMapEntry() {
+        Map<String, Boolean> m1 = Collections.singletonMap("Hi", Boolean.TRUE);
+        Map.Entry<String, Boolean> e1 = getMapEntry(m1);
+
+        assertTrue(converter.convert(e1).to(Boolean.class));
+        assertTrue(converter.convert(e1).to(boolean.class));
+        assertEquals("Hi", converter.convert(e1).to(String.class));
+
+    }
+
+    @Test
+    public void testMapEntry1() {
+        Map<Long, String> m1 = Collections.singletonMap(17L, "18");
+        Map.Entry<Long, String> e1 = getMapEntry(m1);
+
+        assertEquals(17L, converter.convert(e1).to(Number.class));
+        assertEquals("18", converter.convert(e1).to(String.class));
+        assertEquals("18", converter.convert(e1).to(Bar.class).value);
+    }
+
+    @Test
+    public void testMapEntry2() {
+        Map<String, Short> m1 = Collections.singletonMap("123", Short.valueOf((short) 567));
+        Map.Entry<String, Short> e1 = getMapEntry(m1);
+
+        assertEquals(Integer.valueOf(123), converter.convert(e1).to(Integer.class));
+    }
+
+    @Test
+    public void testMapEntry3() {
+        Map<Long,Long> l1 = Collections.singletonMap(9L, 10L);
+        Map.Entry<Long, Long> e1 = getMapEntry(l1);
+
+        assertEquals("Should take the key if key and value are equally suitable",
+                9L, (long) converter.convert(e1).to(long.class));
+    }
+
+    @Test
+    public void testMapEntry4() {
+        Map<Foo, Foo> m1 = Collections.singletonMap(new Foo(111), new Foo(999));
+        Map.Entry<Foo, Foo> e1 = getMapEntry(m1);
+
+        assertEquals("111", converter.convert(e1).to(Bar.class).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();
+    }
+
     interface TestInterface {
         String foo();
         int bar();
@@ -446,4 +497,24 @@ public class ConverterMapTest {
     	String[] value();
     	long somethingElse() default -87;
     }
+
+    private static class Foo {
+        private final int value;
+
+        Foo(int v) {
+            value = v;
+        }
+
+        @Override
+        public String toString() {
+            return "" + value;
+        }
+    }
+
+    public static class Bar {
+        final String value;
+        public Bar(String v) {
+            value = v;
+        }
+    }
 }