updated formatter conversion service adapter to work with type descriptor
This commit is contained in:
@@ -31,23 +31,24 @@ import org.springframework.core.convert.TypeDescriptor;
|
||||
class CollectionToCollectionGenericConverter implements GenericConverter {
|
||||
|
||||
private GenericConversionService conversionService;
|
||||
|
||||
|
||||
public CollectionToCollectionGenericConverter(GenericConversionService conversionService) {
|
||||
this.conversionService = conversionService;
|
||||
}
|
||||
|
||||
|
||||
public Object convert(Object source, TypeDescriptor targetType) {
|
||||
Collection sourceCollection = (Collection) source;
|
||||
Object firstNotNullElement = getFirstNotNullElement(sourceCollection);
|
||||
if (firstNotNullElement == null) {
|
||||
return compatibleCollectionWithoutElementConversion(sourceCollection, targetType);
|
||||
}
|
||||
Class targetElementType = targetType.getElementType();
|
||||
Class targetElementType = targetType.getElementType();
|
||||
if (targetElementType == null || targetElementType.isAssignableFrom(firstNotNullElement.getClass())) {
|
||||
return compatibleCollectionWithoutElementConversion(sourceCollection, targetType);
|
||||
}
|
||||
Collection targetCollection = CollectionFactory.createCollection(targetType.getType(), sourceCollection.size());
|
||||
GenericConverter elementConverter = conversionService.getConverter(firstNotNullElement.getClass(), targetElementType);
|
||||
GenericConverter elementConverter = conversionService.getConverter(firstNotNullElement.getClass(),
|
||||
TypeDescriptor.valueOf(targetElementType));
|
||||
for (Object element : sourceCollection) {
|
||||
targetCollection.add(elementConverter.convert(element, TypeDescriptor.valueOf(targetElementType)));
|
||||
}
|
||||
@@ -65,7 +66,7 @@ class CollectionToCollectionGenericConverter implements GenericConverter {
|
||||
return target;
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
private Object getFirstNotNullElement(Collection collection) {
|
||||
for (Object element : collection) {
|
||||
if (element != null) {
|
||||
@@ -74,5 +75,5 @@ class CollectionToCollectionGenericConverter implements GenericConverter {
|
||||
}
|
||||
return null;
|
||||
}
|
||||
|
||||
|
||||
}
|
||||
|
||||
@@ -54,10 +54,6 @@ public class GenericConversionService implements ConversionService, ConverterReg
|
||||
|
||||
private ConversionService parent;
|
||||
|
||||
/**
|
||||
* An indexed map of Converters. Each Map.Entry key is a source class (S) that can be converted from.
|
||||
* Each Map.Entry value is a Map that defines the targetType-to-Converter mappings for that source.
|
||||
*/
|
||||
private final Map<Class, Map<Class, GenericConverter>> sourceTypeConverters = new HashMap<Class, Map<Class, GenericConverter>>();
|
||||
|
||||
public GenericConversionService() {
|
||||
@@ -143,7 +139,7 @@ public class GenericConversionService implements ConversionService, ConverterReg
|
||||
}
|
||||
Class sourceClass = ClassUtils.resolvePrimitiveIfNecessary(sourceType);
|
||||
Class targetClass = targetType.getObjectType();
|
||||
return getConverter(sourceClass, targetType.getObjectType()) != null || this.parent != null
|
||||
return getConverter(sourceClass, targetType) != null || this.parent != null
|
||||
&& this.parent.canConvert(sourceClass, targetClass);
|
||||
}
|
||||
|
||||
@@ -161,7 +157,7 @@ public class GenericConversionService implements ConversionService, ConverterReg
|
||||
return null;
|
||||
}
|
||||
Class sourceType = ClassUtils.resolvePrimitiveIfNecessary(source.getClass());
|
||||
GenericConverter converter = getConverter(sourceType, targetType.getObjectType());
|
||||
GenericConverter converter = getConverter(sourceType, targetType);
|
||||
if (converter != null) {
|
||||
try {
|
||||
return converter.convert(source, targetType);
|
||||
@@ -181,7 +177,7 @@ public class GenericConversionService implements ConversionService, ConverterReg
|
||||
|
||||
// subclassing hooks
|
||||
|
||||
protected GenericConverter getConverter(Class<?> sourceType, Class<?> targetType) {
|
||||
protected GenericConverter getConverter(Class sourceType, TypeDescriptor targetType) {
|
||||
if (sourceType.isInterface()) {
|
||||
LinkedList<Class> classQueue = new LinkedList<Class>();
|
||||
classQueue.addFirst(sourceType);
|
||||
@@ -223,7 +219,7 @@ public class GenericConversionService implements ConversionService, ConverterReg
|
||||
|
||||
// internal helpers
|
||||
|
||||
private void addGenericConverter(Class<?> sourceType, Class<?> targetType, GenericConverter converter) {
|
||||
private void addGenericConverter(Class sourceType, Class targetType, GenericConverter converter) {
|
||||
getSourceMap(sourceType).put(targetType, converter);
|
||||
}
|
||||
|
||||
@@ -287,7 +283,7 @@ public class GenericConversionService implements ConversionService, ConverterReg
|
||||
return sourceMap;
|
||||
}
|
||||
|
||||
private Map<Class, GenericConverter> getConvertersForSource(Class<?> sourceType) {
|
||||
private Map<Class, GenericConverter> getConvertersForSource(Class sourceType) {
|
||||
Map<Class, GenericConverter> converters = this.sourceTypeConverters.get(sourceType);
|
||||
if (converters == null) {
|
||||
converters = Collections.emptyMap();
|
||||
@@ -295,10 +291,11 @@ public class GenericConversionService implements ConversionService, ConverterReg
|
||||
return converters;
|
||||
}
|
||||
|
||||
private GenericConverter getConverter(Map<Class, GenericConverter> converters, Class<?> targetType) {
|
||||
if (targetType.isInterface()) {
|
||||
private GenericConverter getConverter(Map<Class, GenericConverter> converters, TypeDescriptor targetType) {
|
||||
Class targetClass = targetType.getObjectType();
|
||||
if (targetClass.isInterface()) {
|
||||
LinkedList<Class> classQueue = new LinkedList<Class>();
|
||||
classQueue.addFirst(targetType);
|
||||
classQueue.addFirst(targetClass);
|
||||
while (!classQueue.isEmpty()) {
|
||||
Class currentClass = classQueue.removeLast();
|
||||
GenericConverter converter = converters.get(currentClass);
|
||||
@@ -313,7 +310,7 @@ public class GenericConversionService implements ConversionService, ConverterReg
|
||||
return converters.get(Object.class);
|
||||
} else {
|
||||
LinkedList<Class> classQueue = new LinkedList<Class>();
|
||||
classQueue.addFirst(targetType);
|
||||
classQueue.addFirst(targetClass);
|
||||
while (!classQueue.isEmpty()) {
|
||||
Class currentClass = classQueue.removeLast();
|
||||
GenericConverter converter = converters.get(currentClass);
|
||||
|
||||
@@ -2,7 +2,7 @@ package org.springframework.core.convert.support;
|
||||
|
||||
import org.springframework.core.convert.TypeDescriptor;
|
||||
|
||||
interface GenericConverter {
|
||||
public interface GenericConverter {
|
||||
|
||||
Object convert(Object source, TypeDescriptor type);
|
||||
|
||||
|
||||
Reference in New Issue
Block a user