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/03/23 15:26:43 UTC
svn commit: r1788269 - in /felix/trunk/converter/converter/src:
main/java/org/apache/felix/converter/impl/ConvertingImpl.java
main/java/org/apache/felix/converter/impl/Util.java
test/java/org/apache/felix/converter/impl/ConverterMapTest.java
Author: davidb
Date: Thu Mar 23 15:26:43 2017
New Revision: 1788269
URL: http://svn.apache.org/viewvc?rev=1788269&view=rev
Log:
Felix Converter - Support converting to SingleElementAnnotations
Modified:
felix/trunk/converter/converter/src/main/java/org/apache/felix/converter/impl/ConvertingImpl.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/ConvertingImpl.java
URL: http://svn.apache.org/viewvc/felix/trunk/converter/converter/src/main/java/org/apache/felix/converter/impl/ConvertingImpl.java?rev=1788269&r1=1788268&r2=1788269&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 Thu Mar 23 15:26:43 2017
@@ -16,6 +16,7 @@
*/
package org.apache.felix.converter.impl;
+import java.lang.annotation.Annotation;
import java.lang.reflect.Array;
import java.lang.reflect.Constructor;
import java.lang.reflect.Field;
@@ -450,6 +451,24 @@ public class ConvertingImpl implements C
new InvocationHandler() {
@Override
public Object invoke(Object proxy, Method method, Object[] args) throws Throwable {
+ Class<?> mdDecl = method.getDeclaringClass();
+ if (mdDecl.equals(Object.class))
+ switch (method.getName()) {
+ case "equals":
+ return proxy == args[0];
+ case "hashCode":
+ return System.identityHashCode(proxy);
+ case "toString":
+ return "Proxy for " + targetCls;
+ default:
+ throw new UnsupportedOperationException("Method " + method + " not supported on proxy for " + targetCls);
+ }
+ if (mdDecl.equals(Annotation.class)) {
+ if ("annotationType".equals(method.getName()) && method.getParameterTypes().length == 0) {
+ return targetCls;
+ }
+ }
+
String propName = Util.getInterfacePropertyName(method, Util.getSingleElementAnnotationKey(targetCls, proxy), proxy);
if (propName == null)
return null;
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=1788269&r1=1788268&r2=1788269&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 Mar 23 15:26:43 2017
@@ -244,7 +244,7 @@ class Util {
Annotation.class.equals(md.getDeclaringClass()))
return null; // do not use any methods on the Object or Annotation class as a accessor
- if ("annotationType".equals(md.getName())) {
+ if ("annotationType".equals(md.getName()) && md.getParameterTypes().length == 0) {
try {
Object cls = md.invoke(object);
if (cls instanceof Class && ((Class<?>) cls).isAnnotation())
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=1788269&r1=1788268&r2=1788269&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 Thu Mar 23 15:26:43 2017
@@ -40,6 +40,7 @@ import org.osgi.util.converter.TypeRefer
import static org.junit.Assert.assertArrayEquals;
import static org.junit.Assert.assertEquals;
import static org.junit.Assert.assertFalse;
+import static org.junit.Assert.assertNotNull;
import static org.junit.Assert.assertNotSame;
import static org.junit.Assert.assertNull;
import static org.junit.Assert.assertSame;
@@ -260,7 +261,7 @@ public class ConverterMapTest {
}
@Test
- @SuppressWarnings({ "unchecked", "rawtypes" })
+ @SuppressWarnings({ "rawtypes", "unchecked" })
public void testSingleElementAnnotation() {
class MySingleElementAnnotation implements SingleElementAnnotation {
@Override
@@ -284,7 +285,10 @@ public class ConverterMapTest {
assertArrayEquals(new String[] {"hi", "there"}, (String []) m.get("single.element.annotation"));
assertEquals(42L, m.get("somethingElse"));
- // TODO support conversion in the other direction too.
+ m.put("somethingElse", 51.0);
+ SingleElementAnnotation sea2 = converter.convert(m).to(SingleElementAnnotation.class);
+ assertArrayEquals(new String[] {"hi", "there"}, sea2.value());
+ assertEquals(51L, sea2.somethingElse());
}
@SuppressWarnings({ "rawtypes", "unchecked" })
@@ -298,6 +302,25 @@ public class ConverterMapTest {
assertSame(m.get("key"), cm.get("key"));
}
+ @Test
+ public void testProxyObjectMethodsInterface() {
+ Map<String, String> m = new HashMap<>();
+ TestInterface ti = converter.convert(m).to(TestInterface.class);
+ assertTrue(ti.equals(ti));
+ assertFalse(ti.equals(new Object()));
+ assertFalse(ti.equals(null));
+
+ assertNotNull(ti.toString());
+ assertTrue(ti.hashCode() != 0);
+ }
+
+ @Test
+ public void testProxyObjectMethodsAnnotation() {
+ Map<String, String> m = new HashMap<>();
+ TestAnnotation ta = converter.convert(m).to(TestAnnotation.class);
+ assertTrue(ta.equals(ta));
+ }
+
interface TestInterface {
String foo();
int bar();