You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@camel.apache.org by da...@apache.org on 2009/04/01 15:11:32 UTC

svn commit: r760877 - /camel/trunk/camel-core/src/main/java/org/apache/camel/impl/converter/DefaultTypeConverter.java

Author: davsclaus
Date: Wed Apr  1 13:11:29 2009
New Revision: 760877

URL: http://svn.apache.org/viewvc?rev=760877&view=rev
Log:
CAMEL-1508: Fixed type converter picking wrong converter when there was a more specialized converter (eg it went down the super path to fast)

Modified:
    camel/trunk/camel-core/src/main/java/org/apache/camel/impl/converter/DefaultTypeConverter.java

Modified: camel/trunk/camel-core/src/main/java/org/apache/camel/impl/converter/DefaultTypeConverter.java
URL: http://svn.apache.org/viewvc/camel/trunk/camel-core/src/main/java/org/apache/camel/impl/converter/DefaultTypeConverter.java?rev=760877&r1=760876&r2=760877&view=diff
==============================================================================
--- camel/trunk/camel-core/src/main/java/org/apache/camel/impl/converter/DefaultTypeConverter.java (original)
+++ camel/trunk/camel-core/src/main/java/org/apache/camel/impl/converter/DefaultTypeConverter.java Wed Apr  1 13:11:29 2009
@@ -278,44 +278,55 @@
         // make sure we have loaded the converters
         checkLoaded();
 
-        // lets try the super classes of the from type
+        return doLookup(toType, fromType, false);
+    }
+
+    private TypeConverter doLookup(Class toType, Class fromType, boolean isSuper) {
+
         if (fromType != null) {
-            Class fromSuperClass = fromType.getSuperclass();
-            if (fromSuperClass != null && !fromSuperClass.equals(Object.class)) {
+            // lets try if there is a direct match
+            TypeConverter converter = getTypeConverter(toType, fromType);
+            if (converter != null) {
+                return converter;
+            }
 
-                TypeConverter converter = getTypeConverter(toType, fromSuperClass);
-                if (converter == null) {
-                    converter = lookup(toType, fromSuperClass);
-                }
+            // try the interfaces
+            for (Class type : fromType.getInterfaces()) {
+                converter = getTypeConverter(toType, type);
                 if (converter != null) {
                     return converter;
                 }
             }
-            for (Class type : fromType.getInterfaces()) {
-                TypeConverter converter = getTypeConverter(toType, type);
+
+            // try super then
+            Class fromSuperClass = fromType.getSuperclass();
+            if (fromSuperClass != null && !fromSuperClass.equals(Object.class)) {
+                converter = doLookup(toType, fromSuperClass, true);
                 if (converter != null) {
                     return converter;
                 }
             }
+        }
 
-            // lets test for arrays
-            if (fromType.isArray() && !fromType.getComponentType().isPrimitive()) {
-                // TODO can we try walking the inheritance-tree for the element types?
-                if (!fromType.equals(Object[].class)) {
-                    fromSuperClass = Object[].class;
-
-                    TypeConverter converter = getTypeConverter(toType, fromSuperClass);
-                    if (converter == null) {
-                        converter = lookup(toType, fromSuperClass);
-                    }
-                    if (converter != null) {
-                        return converter;
+        // only do these tests as fallback and only on the target type (eg not on its super)
+        if (!isSuper) {
+            if (fromType != null && !fromType.equals(Object.class)) {
+
+                // lets try classes derived from this toType
+                Set<Map.Entry<TypeMapping, TypeConverter>> entries = typeMappings.entrySet();
+                for (Map.Entry<TypeMapping, TypeConverter> entry : entries) {
+                    TypeMapping key = entry.getKey();
+                    Class aToType = key.getToType();
+                    if (toType.isAssignableFrom(aToType)) {
+                        Class aFromType = key.getFromType();
+                        // skip Object based we do them last
+                        if (!aFromType.equals(Object.class) && aFromType.isAssignableFrom(fromType)) {
+                            return entry.getValue();
+                        }
                     }
                 }
-            }
 
-            // lets test for Object based converters
-            if (!fromType.equals(Object.class)) {
+                // lets test for Object based converters as last resort
                 TypeConverter converter = getTypeConverter(toType, Object.class);
                 if (converter != null) {
                     return converter;
@@ -323,21 +334,7 @@
             }
         }
 
-        // lets try classes derived from this toType
-        if (fromType != null) {
-            Set<Map.Entry<TypeMapping, TypeConverter>> entries = typeMappings.entrySet();
-            for (Map.Entry<TypeMapping, TypeConverter> entry : entries) {
-                TypeMapping key = entry.getKey();
-                Class aToType = key.getToType();
-                if (toType.isAssignableFrom(aToType)) {
-                    if (key.getFromType().isAssignableFrom(fromType)) {
-                        return entry.getValue();
-                    }
-                }
-            }
-        }
-
-        // TODO look at constructors of toType?
+        // none found
         return null;
     }