From 902672eb3bca6496d2615b0f7863415d2a951621 Mon Sep 17 00:00:00 2001 From: Keith Donald Date: Mon, 14 Jul 2008 18:36:00 +0000 Subject: [PATCH] fixed bug --- .../service/GenericConversionService.java | 51 ++++++++++++------- 1 file changed, 34 insertions(+), 17 deletions(-) diff --git a/spring-binding/src/main/java/org/springframework/binding/convert/service/GenericConversionService.java b/spring-binding/src/main/java/org/springframework/binding/convert/service/GenericConversionService.java index a72caeff..a2a9e8ed 100644 --- a/spring-binding/src/main/java/org/springframework/binding/convert/service/GenericConversionService.java +++ b/spring-binding/src/main/java/org/springframework/binding/convert/service/GenericConversionService.java @@ -161,24 +161,43 @@ public class GenericConversionService implements ConversionService { } private Converter findRegisteredConverter(Class sourceClass, Class targetClass) { - LinkedList classQueue = new LinkedList(); - classQueue.addFirst(sourceClass); - while (!classQueue.isEmpty()) { - Class currentClass = (Class) classQueue.removeLast(); - Map sourceTargetConverters = findConvertersForSource(currentClass); - Converter converter = findTargetConverter(sourceTargetConverters, targetClass); - if (converter != null) { - return converter; + if (sourceClass.isInterface()) { + LinkedList classQueue = new LinkedList(); + classQueue.addFirst(sourceClass); + while (!classQueue.isEmpty()) { + Class currentClass = (Class) classQueue.removeLast(); + Map sourceTargetConverters = findConvertersForSource(currentClass); + Converter converter = findTargetConverter(sourceTargetConverters, targetClass); + if (converter != null) { + return converter; + } + Class[] interfaces = targetClass.getInterfaces(); + for (int i = 0; i < interfaces.length; i++) { + classQueue.addFirst(interfaces[i]); + } } - if (currentClass.getSuperclass() != null) { - classQueue.addFirst(currentClass.getSuperclass()); - } - Class[] interfaces = currentClass.getInterfaces(); - for (int i = 0; i < interfaces.length; i++) { - classQueue.addFirst(interfaces[i]); + Map objectConverters = findConvertersForSource(Object.class); + return findTargetConverter(objectConverters, targetClass); + } else { + LinkedList classQueue = new LinkedList(); + classQueue.addFirst(sourceClass); + while (!classQueue.isEmpty()) { + Class currentClass = (Class) classQueue.removeLast(); + Map sourceTargetConverters = findConvertersForSource(currentClass); + Converter converter = findTargetConverter(sourceTargetConverters, targetClass); + if (converter != null) { + return converter; + } + if (currentClass.getSuperclass() != null) { + classQueue.addFirst(currentClass.getSuperclass()); + } + Class[] interfaces = currentClass.getInterfaces(); + for (int i = 0; i < interfaces.length; i++) { + classQueue.addFirst(interfaces[i]); + } } + return null; } - return null; } public Object executeConversion(Object source, Class targetClass) throws ConversionException { @@ -257,7 +276,6 @@ public class GenericConversionService implements ConversionService { if (converter != null) { return converter; } - // queue up target class's implemented interfaces. Class[] interfaces = targetClass.getInterfaces(); for (int i = 0; i < interfaces.length; i++) { classQueue.addFirst(interfaces[i]); @@ -276,7 +294,6 @@ public class GenericConversionService implements ConversionService { if (targetClass.getSuperclass() != null) { classQueue.addFirst(targetClass.getSuperclass()); } - // queue up target class's implemented interfaces. Class[] interfaces = targetClass.getInterfaces(); for (int i = 0; i < interfaces.length; i++) { classQueue.addFirst(interfaces[i]);