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/02/11 17:07:07 UTC

svn commit: r1782623 - in /felix/trunk/converter/converter/src: main/java/org/apache/felix/converter/impl/ test/java/org/apache/felix/converter/impl/

Author: davidb
Date: Sat Feb 11 17:07:06 2017
New Revision: 1782623

URL: http://svn.apache.org/viewvc?rev=1782623&view=rev
Log:
Felix Converter - support Annotations and Interfaces that are implemented as proxies

Modified:
    felix/trunk/converter/converter/src/main/java/org/apache/felix/converter/impl/DynamicMapLikeFacade.java
    felix/trunk/converter/converter/src/main/java/org/apache/felix/converter/impl/MapDelegate.java
    felix/trunk/converter/converter/src/main/java/org/apache/felix/converter/impl/Util.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/DynamicMapLikeFacade.java
URL: http://svn.apache.org/viewvc/felix/trunk/converter/converter/src/main/java/org/apache/felix/converter/impl/DynamicMapLikeFacade.java?rev=1782623&r1=1782622&r2=1782623&view=diff
==============================================================================
--- felix/trunk/converter/converter/src/main/java/org/apache/felix/converter/impl/DynamicMapLikeFacade.java (original)
+++ felix/trunk/converter/converter/src/main/java/org/apache/felix/converter/impl/DynamicMapLikeFacade.java Sat Feb 11 17:07:06 2017
@@ -107,6 +107,27 @@ abstract class DynamicMapLikeFacade<K, V
         }
         return res;
     }
+
+    @Override
+    public String toString() {
+        StringBuilder sb = new StringBuilder();
+
+        sb.append('{');
+        boolean first = true;
+        for (Map.Entry<K, V> entry : entrySet()) {
+            if (first)
+                first = false;
+            else
+                sb.append(", ");
+
+            sb.append(entry.getKey());
+            sb.append('=');
+            sb.append(entry.getValue());
+        }
+        sb.append('}');
+
+        return sb.toString();
+    }
 }
 
 class DynamicBeanFacade extends DynamicMapLikeFacade<String,Object> {

Modified: felix/trunk/converter/converter/src/main/java/org/apache/felix/converter/impl/MapDelegate.java
URL: http://svn.apache.org/viewvc/felix/trunk/converter/converter/src/main/java/org/apache/felix/converter/impl/MapDelegate.java?rev=1782623&r1=1782622&r2=1782623&view=diff
==============================================================================
--- felix/trunk/converter/converter/src/main/java/org/apache/felix/converter/impl/MapDelegate.java (original)
+++ felix/trunk/converter/converter/src/main/java/org/apache/felix/converter/impl/MapDelegate.java Sat Feb 11 17:07:06 2017
@@ -232,6 +232,11 @@ class MapDelegate<K, V> implements Map<K
         delegate = new HashMap<>(delegate);
     }
 
+    @Override
+    public String toString() {
+        return delegate.toString();
+    }
+
     static class MapEntry<K,V> implements Map.Entry<K,V> {
         private final K key;
         private final V value;

Modified: felix/trunk/converter/converter/src/main/java/org/apache/felix/converter/impl/Util.java
URL: http://svn.apache.org/viewvc/felix/trunk/converter/converter/src/main/java/org/apache/felix/converter/impl/Util.java?rev=1782623&r1=1782622&r2=1782623&view=diff
==============================================================================
--- felix/trunk/converter/converter/src/main/java/org/apache/felix/converter/impl/Util.java (original)
+++ felix/trunk/converter/converter/src/main/java/org/apache/felix/converter/impl/Util.java Sat Feb 11 17:07:06 2017
@@ -22,11 +22,14 @@ import java.lang.reflect.InvocationTarge
 import java.lang.reflect.Method;
 import java.lang.reflect.Modifier;
 import java.lang.reflect.Type;
+import java.util.Arrays;
 import java.util.Collections;
 import java.util.HashMap;
+import java.util.Iterator;
 import java.util.LinkedHashMap;
 import java.util.LinkedHashSet;
 import java.util.Map;
+import java.util.Map.Entry;
 import java.util.Set;
 
 class Util {
@@ -151,6 +154,20 @@ class Util {
                 set.add(md);
             }
         }
+
+        for (Iterator<Entry<String, Set<Method>>> it = keys.entrySet().iterator(); it.hasNext(); ) {
+            Entry<String, Set<Method>> entry = it.next();
+            boolean zeroArgFound = false;
+            for (Method md : entry.getValue()) {
+                if (md.getParameterCount() == 0) {
+                    // OK found the zero-arg param
+                    zeroArgFound = true;
+                    break;
+                }
+            }
+            if (!zeroArgFound)
+                it.remove();
+        }
         return keys;
     }
 
@@ -165,9 +182,26 @@ class Util {
             Annotation.class.equals(md.getDeclaringClass()))
             return null; // do not use any methods on the Object or Annotation class as a accessor
 
+        if (md.getDeclaringClass().getSimpleName().startsWith("$Proxy")) {
+            // TODO is there a better way to do this?
+            if (isInheritedMethodInProxy(md, Object.class) ||
+                    isInheritedMethodInProxy(md, Annotation.class))
+                return null;
+        }
+
         return md.getName().replace('_', '.'); // TODO support all the escaping mechanisms.
     }
 
+    private static boolean isInheritedMethodInProxy(Method md, Class<?> cls) {
+        for (Method om : cls.getMethods()) {
+            if (om.getName().equals(md.getName()) &&
+                    Arrays.equals(om.getParameterTypes(), md.getParameterTypes())) {
+                return true;
+            }
+        }
+        return false;
+    }
+
     static Object getInterfaceProperty(Object obj, Method md) throws IllegalAccessException, IllegalArgumentException, InvocationTargetException {
         if (Modifier.isStatic(md.getModifiers()))
             return null;

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=1782623&r1=1782622&r2=1782623&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 Sat Feb 11 17:07:06 2017
@@ -229,6 +229,16 @@ public class ConverterMapTest {
         assertFalse(ta.za_za());
     }
 
+    @Test
+    public void testAnnotationMethods() {
+        TestAnnotation ta = converter.convert(new HashMap<>()).to(TestAnnotation.class);
+        Map<String, Object> m = converter.convert(ta).to(new TypeReference<Map<String, Object>>(){});
+        assertEquals(3, m.size());
+        assertEquals("fooo!", m.get("foo"));
+        assertEquals(42, m.get("bar"));
+        assertEquals(false, m.get("za.za"));
+    }
+
     @SuppressWarnings({ "rawtypes", "unchecked" })
     @Test
     public void testCopyMap() {