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() {