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) {