You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@ofbiz.apache.org by do...@apache.org on 2010/02/10 23:40:16 UTC

svn commit: r908698 - in /ofbiz/trunk/framework/base/src/org/ofbiz/base/conversion: Converters.java test/MiscTests.java

Author: doogie
Date: Wed Feb 10 22:40:16 2010
New Revision: 908698

URL: http://svn.apache.org/viewvc?rev=908698&view=rev
Log:
Check the super class and interfaces of the source and target,
attempting to find a match.

Modified:
    ofbiz/trunk/framework/base/src/org/ofbiz/base/conversion/Converters.java
    ofbiz/trunk/framework/base/src/org/ofbiz/base/conversion/test/MiscTests.java

Modified: ofbiz/trunk/framework/base/src/org/ofbiz/base/conversion/Converters.java
URL: http://svn.apache.org/viewvc/ofbiz/trunk/framework/base/src/org/ofbiz/base/conversion/Converters.java?rev=908698&r1=908697&r2=908698&view=diff
==============================================================================
--- ofbiz/trunk/framework/base/src/org/ofbiz/base/conversion/Converters.java (original)
+++ ofbiz/trunk/framework/base/src/org/ofbiz/base/conversion/Converters.java Wed Feb 10 22:40:16 2010
@@ -92,6 +92,10 @@
                             return UtilGenerics.cast(value);
                         }
                     }
+                    result = checkExtendsImplements(sourceClass, targetClass);
+                    if (result != null) {
+                        return UtilGenerics.cast(result);
+                    }
                     // Null converter must be checked last
                     if (nullConverter.canConvert(sourceClass, targetClass)) {
                         Converter passThruConverter = new PassThruConverter<S>(sourceClass);
@@ -110,6 +114,37 @@
         return UtilGenerics.cast(result);
     }
 
+    private static <S, T> Converter<S, T> checkExtendsImplements(Class<S> sourceClass, Class<T> targetClass) throws ClassNotFoundException {
+        if (targetClass == null || sourceClass == null) {
+            return null;
+        }
+        String key = sourceClass.getName().concat(DELIMITER).concat(targetClass.getName());
+        Converter<?, ?> result = converterMap.get(key);
+        if (result == null) {
+            result = checkExtendsImplements(sourceClass, targetClass.getSuperclass());
+            if (result == null) {
+                for (Class<?> intf: targetClass.getInterfaces()) {
+                    result = checkExtendsImplements(sourceClass, intf);
+                    if (result != null) {
+                        break;
+                    }
+                }
+                if (result == null) {
+                    result = checkExtendsImplements(sourceClass.getSuperclass(), targetClass);
+                    if (result == null) {
+                        for (Class<?> intf: sourceClass.getInterfaces()) {
+                            result = checkExtendsImplements(intf, targetClass);
+                            if (result != null) {
+                                break;
+                            }
+                        }
+                    }
+                }
+            }
+        }
+        return UtilGenerics.cast(result);
+    }
+
     /** Load all classes that implement <code>Converter</code> and are
      * contained in <code>containerClass</code>.
      *

Modified: ofbiz/trunk/framework/base/src/org/ofbiz/base/conversion/test/MiscTests.java
URL: http://svn.apache.org/viewvc/ofbiz/trunk/framework/base/src/org/ofbiz/base/conversion/test/MiscTests.java?rev=908698&r1=908697&r2=908698&view=diff
==============================================================================
--- ofbiz/trunk/framework/base/src/org/ofbiz/base/conversion/test/MiscTests.java (original)
+++ ofbiz/trunk/framework/base/src/org/ofbiz/base/conversion/test/MiscTests.java Wed Feb 10 22:40:16 2010
@@ -20,6 +20,7 @@
 
 import java.math.BigDecimal;
 import java.net.URL;
+import java.util.Arrays;
 import java.util.ArrayList;
 import java.util.HashMap;
 import java.util.List;
@@ -35,6 +36,7 @@
 import org.ofbiz.base.conversion.Converters;
 import org.ofbiz.base.test.GenericTestCaseBase;
 import org.ofbiz.base.util.UtilMisc;
+import org.ofbiz.base.util.collections.LRUMap;
 
 public class MiscTests extends GenericTestCaseBase {
 
@@ -42,6 +44,24 @@
         super(name);
     }
 
+    public void testExtendsImplements() throws Exception {
+        List<String> arraysList = Arrays.asList("a", "b", "c");
+        Converter converter = Converters.getConverter(arraysList.getClass(), String.class);
+        assertEquals("", "[a, b, c]", converter.convert(arraysList));
+        Exception caught = null;
+        try {
+            Converters.getConverter(MiscTests.class, String.class);
+        } catch (ClassNotFoundException e) {
+            caught = e;
+        } finally {
+            assertNotNull("ClassNotFoundException thrown for MiscTests.class", caught);
+        }
+        LRUMap<String, String> map = new LRUMap<String, String>();
+        map.put("a", "1");
+        converter = Converters.getConverter(LRUMap.class, String.class);
+        assertEquals("", "{a=1}", converter.convert(map));
+    }
+
     public void testPassthru() throws Exception {
         String string = "ofbiz";
         BigDecimal bigDecimal = new BigDecimal("1.234");