Author: davidb
Date: Thu Oct 26 13:29:15 2017
New Revision: 1813397

URL: http://svn.apache.org/viewvc?rev=1813397&view=rev
Log:
Small refactoring on the Converter

Modified:
    
felix/trunk/converter/converter/src/main/java/org/apache/felix/converter/impl/ConvertingImpl.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=1813397&r1=1813396&r2=1813397&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 Oct 26 13:29:15 2017
@@ -138,9 +138,7 @@ public class ConvertingImpl extends Abst
             return convertToArray();
         } else if (Collection.class.isAssignableFrom(targetAsClass)) {
             return convertToCollection();
-        } else if (targetAsDTO || DTOUtil.isDTOType(targetAsClass)) {
-            return convertToDTO();
-        } else if (isMapType(targetAsClass, targetAsJavaBean)) {
+        } else if (targetAsDTO || targetAsJavaBean || isMapType(targetAsClass, 
targetAsJavaBean)) {
             return convertToMapType();
         }
 
@@ -251,14 +249,11 @@ public class ConvertingImpl extends Abst
     }
 
     @SuppressWarnings({ "rawtypes", "unchecked" })
-    private <T> T convertToDTO() {
-        Map m = mapView(object, sourceClass, converter);
+    private <T> T convertToDTO(Class<?> sourceCls, Class<?> targetAsCls) {
+        Map m = mapView(object, sourceCls, converter);
 
-        Class<?> cls = targetAsClass;
-        if (targetAsDTO)
-            cls = targetClass;
         try {
-            String prefix = Util.getPrefix(cls);
+            String prefix = Util.getPrefix(targetAsCls);
 
             T dto = (T) targetClass.newInstance();
 
@@ -273,15 +268,15 @@ public class ConvertingImpl extends Abst
 
                 Field f = null;
                 try {
-                    f = cls.getDeclaredField(fieldName);
+                    f = targetAsCls.getDeclaredField(fieldName);
                 } catch (NoSuchFieldException e) {
                     try {
-                        f = cls.getField(fieldName);
+                        f = targetAsCls.getField(fieldName);
                     } catch (NoSuchFieldException | NullPointerException e1) {
                         // There is no field with this name
                         if (keysIgnoreCase) {
                             // If enabled, try again but now ignore case
-                            for (Field fs : cls.getDeclaredFields()) {
+                            for (Field fs : targetAsCls.getDeclaredFields()) {
                                 if (fs.getName().equalsIgnoreCase(fieldName)) {
                                     f = fs;
                                     break;
@@ -289,7 +284,7 @@ public class ConvertingImpl extends Abst
                             }
 
                             if (f == null) {
-                                for (Field fs : cls.getFields()) {
+                                for (Field fs : targetAsCls.getFields()) {
                                     if 
(fs.getName().equalsIgnoreCase(fieldName)) {
                                         f = fs;
                                         break;
@@ -354,8 +349,7 @@ public class ConvertingImpl extends Abst
                 if (isCopyRequiredType(cls)) {
                     cls = getConstructableType(cls);
                 }
-                // NOTE (dml): I think this should be an "OR", not an "AND"
-                // TODO: confirm with some additional tests (all tests pass 
for now)
+
                 if (sourceAsDTO || DTOUtil.isDTOType(cls))
                     value = converter.convert(value).sourceAsDTO().to(cls);
                 else
@@ -383,7 +377,7 @@ public class ConvertingImpl extends Abst
         return MapDelegate.forInterface(object, this);
     }
 
-    @SuppressWarnings({ "unchecked", "rawtypes" })
+    @SuppressWarnings("rawtypes")
     private Object convertToMapType() {
         if (Map.class.equals(targetClass) && !forceCopy) {
             Map res = convertToMapDelegate();
@@ -394,25 +388,34 @@ public class ConvertingImpl extends Abst
         if (Map.class.isAssignableFrom(targetAsClass))
             return convertToMap();
         else if (Dictionary.class.isAssignableFrom(targetAsClass))
-            return new Hashtable((Map) converter.convert(object).to(new 
ParameterizedType() {
-                @Override
-                public Type getRawType() {
-                    return HashMap.class;
-                }
-
-                @Override
-                public Type getOwnerType() {
-                    return null;
-                }
-
-                @Override
-                public Type[] getActualTypeArguments() {
-                    return typeArguments;
-                }
-            }));
+            return convertToDictionary();
+        else if (targetAsDTO || DTOUtil.isDTOType(targetAsClass))
+            return convertToDTO(sourceClass, targetAsClass);
         else if (targetAsClass.isInterface())
             return createInterface(sourceClass, targetAsClass);
-        return createJavaBean(sourceClass, targetAsClass);
+        else if (targetAsJavaBean)
+            return createJavaBean(sourceClass, targetAsClass);
+        throw new ConversionException("Cannot convert " + object + " to " + 
targetAsClass);
+    }
+
+    @SuppressWarnings({ "unchecked", "rawtypes" })
+    private Object convertToDictionary() {
+        return new Hashtable((Map) converter.convert(object).to(new 
ParameterizedType() {
+            @Override
+            public Type getRawType() {
+                return HashMap.class;
+            }
+
+            @Override
+            public Type getOwnerType() {
+                return null;
+            }
+
+            @Override
+            public Type[] getActualTypeArguments() {
+                return typeArguments;
+            }
+        }));
     }
 
     private Object createJavaBean(Class<?> sourceCls, Class<?> targetCls) {


Reply via email to