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;
}