This commit is contained in:
Keith Donald 2011-06-27 21:36:48 +00:00
parent 1fd8f77989
commit c9d73e2bde
3 changed files with 37 additions and 8 deletions

View File

@ -16,14 +16,13 @@
package org.springframework.core.convert.support; package org.springframework.core.convert.support;
import java.util.Arrays; import java.lang.reflect.Array;
import java.util.Collections; import java.util.Collections;
import java.util.Set; import java.util.Set;
import org.springframework.core.convert.ConversionService; import org.springframework.core.convert.ConversionService;
import org.springframework.core.convert.TypeDescriptor; import org.springframework.core.convert.TypeDescriptor;
import org.springframework.core.convert.converter.ConditionalGenericConverter; import org.springframework.core.convert.converter.ConditionalGenericConverter;
import org.springframework.util.ObjectUtils;
/** /**
* Converts an Array to an Object by returning the first array element after converting it to the desired targetType. * Converts an Array to an Object by returning the first array element after converting it to the desired targetType.
@ -34,10 +33,10 @@ import org.springframework.util.ObjectUtils;
*/ */
final class ArrayToObjectConverter implements ConditionalGenericConverter { final class ArrayToObjectConverter implements ConditionalGenericConverter {
private final CollectionToObjectConverter helperConverter; private final ConversionService conversionService;
public ArrayToObjectConverter(ConversionService conversionService) { public ArrayToObjectConverter(ConversionService conversionService) {
this.helperConverter = new CollectionToObjectConverter(conversionService); this.conversionService = conversionService;
} }
public Set<ConvertiblePair> getConvertibleTypes() { public Set<ConvertiblePair> getConvertibleTypes() {
@ -45,11 +44,21 @@ final class ArrayToObjectConverter implements ConditionalGenericConverter {
} }
public boolean matches(TypeDescriptor sourceType, TypeDescriptor targetType) { public boolean matches(TypeDescriptor sourceType, TypeDescriptor targetType) {
return this.helperConverter.matches(sourceType, targetType); return ConversionUtils.canConvertElements(sourceType.getElementTypeDescriptor(), targetType, conversionService);
} }
public Object convert(Object source, TypeDescriptor sourceType, TypeDescriptor targetType) { public Object convert(Object source, TypeDescriptor sourceType, TypeDescriptor targetType) {
return this.helperConverter.convert(Arrays.asList(ObjectUtils.toObjectArray(source)), sourceType, targetType); if (source == null) {
return null;
}
if (sourceType.isAssignableTo(targetType)) {
return source;
}
if (Array.getLength(source) == 0) {
return null;
}
Object firstElement = Array.get(source, 0);
return this.conversionService.convert(firstElement, sourceType.elementTypeDescriptor(firstElement), targetType);
} }
} }

View File

@ -50,6 +50,9 @@ final class CollectionToObjectConverter implements ConditionalGenericConverter {
if (source == null) { if (source == null) {
return null; return null;
} }
if (sourceType.isAssignableTo(targetType)) {
return source;
}
Collection<?> sourceCollection = (Collection<?>) source; Collection<?> sourceCollection = (Collection<?>) source;
if (sourceCollection.size() == 0) { if (sourceCollection.size() == 0) {
return null; return null;

View File

@ -388,7 +388,7 @@ public class DefaultConversionTests {
@Test @Test
public void convertArrayToObject() { public void convertArrayToObject() {
Object[] array = new Object[] { 3L }; Object[] array = new Object[] { 3L };
Object result = conversionService.convert(array, Object.class); Object result = conversionService.convert(array, Long.class);
assertEquals(3L, result); assertEquals(3L, result);
} }
@ -399,6 +399,13 @@ public class DefaultConversionTests {
assertEquals(new Integer(3), result); assertEquals(new Integer(3), result);
} }
@Test
public void convertArrayToObjectAssignableTargetType() {
Long[] array = new Long[] { 3L };
Long[] result = (Long[]) conversionService.convert(array, Object.class);
assertEquals(array, result);
}
@Test @Test
public void convertObjectToArray() { public void convertObjectToArray() {
Object[] result = conversionService.convert(3L, Object[].class); Object[] result = conversionService.convert(3L, Object[].class);
@ -491,6 +498,14 @@ public class DefaultConversionTests {
assertEquals(new Integer(3), result); assertEquals(new Integer(3), result);
} }
@Test
public void convertCollectionToObjectAssignableTarget() throws Exception {
Collection<String> source = new ArrayList<String>();
source.add("foo");
Object result = conversionService.convert(source, new TypeDescriptor(getClass().getField("assignableTarget")));
assertEquals(source, result);
}
@Test @Test
public void convertObjectToCollection() { public void convertObjectToCollection() {
List<String> result = (List<String>) conversionService.convert(3L, List.class); List<String> result = (List<String>) conversionService.convert(3L, List.class);
@ -671,6 +686,8 @@ public class DefaultConversionTests {
conversionService.convert(new Long(3), SSN.class); conversionService.convert(new Long(3), SSN.class);
} }
public Object assignableTarget;
private static class SSN { private static class SSN {
private String value; private String value;