Author: davidb
Date: Fri Dec 21 14:07:56 2018
New Revision: 1849480
URL: http://svn.apache.org/viewvc?rev=1849480&view=rev
Log:
FELIX-6006 errorHandler not consulted for conversions implemented via proxies
Provide more useful type info to the errorHandler when using the errorHandler
with a proxy. The type passed in is the expected return type of the method
invocation.
Unit test provided by Cristiano Gavião with many thanks!
Modified:
felix/trunk/converter/converter/src/main/java/org/osgi/util/converter/CustomConverterImpl.java
felix/trunk/converter/converter/src/test/java/org/osgi/util/converter/ConverterTest.java
Modified:
felix/trunk/converter/converter/src/main/java/org/osgi/util/converter/CustomConverterImpl.java
URL:
http://svn.apache.org/viewvc/felix/trunk/converter/converter/src/main/java/org/osgi/util/converter/CustomConverterImpl.java?rev=1849480&r1=1849479&r2=1849480&view=diff
==============================================================================
---
felix/trunk/converter/converter/src/main/java/org/osgi/util/converter/CustomConverterImpl.java
(original)
+++
felix/trunk/converter/converter/src/main/java/org/osgi/util/converter/CustomConverterImpl.java
Fri Dec 21 14:07:56 2018
@@ -180,7 +180,7 @@ class CustomConverterImpl implements Int
Object result = del.to(type);
if (result != null &&
Proxy.isProxyClass(result.getClass()) && errorHandlers.size() > 0) {
- return wrapErrorHandling(result, type);
+ return wrapErrorHandling(result);
} else {
return result;
}
@@ -202,7 +202,7 @@ class CustomConverterImpl implements Int
}
}
- private Object wrapErrorHandling(final Object wrapped, final
Type type) {
+ private Object wrapErrorHandling(final Object wrapped) {
final Class<?> cls = wrapped.getClass();
return Proxy.newProxyInstance(cls.getClassLoader(),
cls.getInterfaces(), new InvocationHandler() {
@Override
@@ -228,7 +228,7 @@ class CustomConverterImpl implements Int
} catch (Exception ex) {
for (ConverterFunction eh : errorHandlers) {
try {
- Object handled = eh.apply(wrapped, type);
+ Object handled = eh.apply(wrapped,
method.getGenericReturnType());
if (handled != ConverterFunction.CANNOT_HANDLE)
return handled;
} catch (RuntimeException re) {
Modified:
felix/trunk/converter/converter/src/test/java/org/osgi/util/converter/ConverterTest.java
URL:
http://svn.apache.org/viewvc/felix/trunk/converter/converter/src/test/java/org/osgi/util/converter/ConverterTest.java?rev=1849480&r1=1849479&r2=1849480&view=diff
==============================================================================
---
felix/trunk/converter/converter/src/test/java/org/osgi/util/converter/ConverterTest.java
(original)
+++
felix/trunk/converter/converter/src/test/java/org/osgi/util/converter/ConverterTest.java
Fri Dec 21 14:07:56 2018
@@ -1242,6 +1242,33 @@ public class ConverterTest {
assertEquals(new HashSet<Character>(Arrays.asList('f', 'o')),
converted.set());
}
+ @Test
+ public void testMapToInterfaceWithOptionalValue() throws Exception {
+ ConverterBuilder cb = Converters.newConverterBuilder();
+ cb.errorHandler(new ConverterFunction() {
+ @Override
+ public Object apply(Object pObj, Type pTargetType) throws
Exception {
+ if ("java.lang.Integer".equals(pTargetType.getTypeName()))
+ {
+ return 0;
+ }
+ return ConverterFunction.CANNOT_HANDLE;
+ }
+ });
+ Converter convWithErrorHandler = cb.build();
+
+ Map<String, Object> map = new HashMap<String, Object>();
+ map.put("code", "harley");
+ MyIntf2 inter = convWithErrorHandler.convert(map).to(MyIntf2.class);
+ assertEquals("harley", inter.code());
+ assertEquals(Integer.valueOf(0), inter.value());
+ }
+
+ static interface MyIntf2 {
+ String code();
+ Integer value();
+ }
+
static class MyClass2 {
private final String value;
public MyClass2(String v) {