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/09 04:12:40 UTC

svn commit: r1782289 - in /felix/trunk/converter/converter/src/main/java/org/apache/felix/converter/impl: DynamicMapLikeFacade.java Util.java

Author: davidb
Date: Thu Feb  9 04:12:40 2017
New Revision: 1782289

URL: http://svn.apache.org/viewvc?rev=1782289&view=rev
Log:
FELIX-5529 For overloaded methods in interfaces, ensure there's a default (no-arg) method when converting to Map

Patch applied on behalf of Raymond Aug� with many thanks.
This closes https://github.com/apache/felix/pull/90

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/Util.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=1782289&r1=1782288&r2=1782289&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 Thu Feb  9 04:12:40 2017
@@ -22,11 +22,14 @@ import java.util.Collection;
 import java.util.Collections;
 import java.util.Dictionary;
 import java.util.HashSet;
+import java.util.Iterator;
 import java.util.LinkedHashSet;
 import java.util.Map;
 import java.util.Set;
 import java.util.stream.Collectors;
 
+import org.osgi.util.converter.ConversionException;
+
 abstract class DynamicMapLikeFacade<K, V> implements Map<K, V> {
     protected final ConvertingImpl convertingImpl;
 
@@ -210,7 +213,7 @@ class DynamicDTOFacade extends DynamicMa
 }
 
 class DynamicInterfaceFacade extends DynamicMapLikeFacade<String, Object> {
-    private Map <String, Method> keys = null;
+    private Map <String, Set<Method>> keys = null;
     private final Object backingObject;
 
     DynamicInterfaceFacade(Object backingObject, ConvertingImpl convertingImpl) {
@@ -220,12 +223,18 @@ class DynamicInterfaceFacade extends Dyn
 
     @Override
     public Object get(Object key) {
-        Method m = getKeys().get(key);
-        try {
-            return m.invoke(backingObject);
-        } catch (Exception e) {
-            throw new RuntimeException(e);
+        Set<Method> set = getKeys().get(key);
+        for (Iterator<Method> iterator = set.iterator();iterator.hasNext();) {
+            Method m = iterator.next();
+            if (m.getParameterCount() > 0)
+                continue;
+            try {
+                return m.invoke(backingObject);
+            } catch (Exception e) {
+                throw new RuntimeException(e);
+            }
         }
+        throw new ConversionException("Missing no-arg method for key: " + key);
     }
 
     @Override
@@ -233,7 +242,7 @@ class DynamicInterfaceFacade extends Dyn
         return getKeys().keySet();
     }
 
-    private Map<String, Method> getKeys() {
+    private Map<String, Set<Method>> getKeys() {
         if (keys == null)
             keys = Util.getInterfaceKeys(convertingImpl.sourceClass);
 

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=1782289&r1=1782288&r2=1782289&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 Thu Feb  9 04:12:40 2017
@@ -24,7 +24,9 @@ import java.lang.reflect.Type;
 import java.util.Collections;
 import java.util.HashMap;
 import java.util.LinkedHashMap;
+import java.util.LinkedHashSet;
 import java.util.Map;
+import java.util.Set;
 
 class Util {
     private static final Map<Class<?>, Class<?>> boxedClasses;
@@ -134,13 +136,19 @@ class Util {
         return unMangleName(f.getName());
     }
 
-    static Map<String, Method> getInterfaceKeys(Class<?> intf) {
-        Map<String, Method> keys = new LinkedHashMap<>();
+    static Map<String, Set<Method>> getInterfaceKeys(Class<?> intf) {
+        Map<String, Set<Method>> keys = new LinkedHashMap<>();
 
         for (Method md : intf.getMethods()) {
             String name = getInterfacePropertyName(md);
-            if (name != null)
-                keys.put(name, md);
+            if (name != null) {
+                Set<Method> set = keys.get(name);
+                if (set == null) {
+                    set = new LinkedHashSet<>();
+                    keys.put(name, set);
+                }
+                set.add(md);
+            }
         }
         return keys;
     }