SPR-8364
git-svn-id: https://src.springframework.org/svn/spring-framework/trunk@4348 50f2f4bb-b051-0410-bef5-90022cba6387
This commit is contained in:
parent
888da26094
commit
02d58b6a97
|
|
@ -59,11 +59,20 @@ final class ArrayToCollectionConverter implements ConditionalGenericConverter {
|
|||
}
|
||||
int length = Array.getLength(source);
|
||||
Collection<Object> target = CollectionFactory.createCollection(targetType.getType(), length);
|
||||
for (int i = 0; i < length; i++) {
|
||||
Object sourceElement = Array.get(source, i);
|
||||
Object targetElement = this.conversionService.convert(sourceElement, sourceType.getElementTypeDescriptor(), targetType.getElementTypeDescriptor());
|
||||
target.add(targetElement);
|
||||
}
|
||||
TypeDescriptor sourceElementType = sourceType.getElementTypeDescriptor();
|
||||
TypeDescriptor targetElementType = targetType.getElementTypeDescriptor();
|
||||
if (Object.class.equals(targetElementType.getType())) {
|
||||
for (int i = 0; i < length; i++) {
|
||||
Object sourceElement = Array.get(source, i);
|
||||
target.add(sourceElement);
|
||||
}
|
||||
} else {
|
||||
for (int i = 0; i < length; i++) {
|
||||
Object sourceElement = Array.get(source, i);
|
||||
Object targetElement = this.conversionService.convert(sourceElement, sourceElementType, targetElementType);
|
||||
target.add(targetElement);
|
||||
}
|
||||
}
|
||||
return target;
|
||||
}
|
||||
|
||||
|
|
|
|||
|
|
@ -61,9 +61,17 @@ final class CollectionToCollectionConverter implements ConditionalGenericConvert
|
|||
}
|
||||
Collection<?> sourceCollection = (Collection<?>) source;
|
||||
Collection<Object> target = CollectionFactory.createCollection(targetType.getType(), sourceCollection.size());
|
||||
for (Object sourceElement : sourceCollection) {
|
||||
Object targetElement = this.conversionService.convert(sourceElement, sourceType.getElementTypeDescriptor(), targetType.getElementTypeDescriptor());
|
||||
target.add(targetElement);
|
||||
TypeDescriptor sourceElementType = sourceType.getElementTypeDescriptor();
|
||||
TypeDescriptor targetElementType = targetType.getElementTypeDescriptor();
|
||||
if (Object.class.equals(targetElementType.getType())) {
|
||||
for (Object sourceElement : sourceCollection) {
|
||||
target.add(sourceElement);
|
||||
}
|
||||
} else {
|
||||
for (Object sourceElement : sourceCollection) {
|
||||
Object targetElement = this.conversionService.convert(sourceElement, sourceElementType, targetElementType);
|
||||
target.add(targetElement);
|
||||
}
|
||||
}
|
||||
return target;
|
||||
}
|
||||
|
|
|
|||
|
|
@ -60,7 +60,9 @@ final class MapToMapConverter implements ConditionalGenericConverter {
|
|||
}
|
||||
Map<Object, Object> sourceMap = (Map<Object, Object>) source;
|
||||
Map<Object, Object> targetMap = CollectionFactory.createMap(targetType.getType(), sourceMap.size());
|
||||
TypeDescriptor sourceKeyType = sourceType.getMapKeyTypeDescriptor();
|
||||
TypeDescriptor targetKeyType = targetType.getMapKeyTypeDescriptor();
|
||||
TypeDescriptor sourceValueType = sourceType.getMapValueTypeDescriptor();
|
||||
TypeDescriptor targetValueType = targetType.getMapValueTypeDescriptor();
|
||||
if (Object.class.equals(targetKeyType.getType()) && Object.class.equals(targetValueType.getType())) {
|
||||
for (Map.Entry<Object, Object> entry : sourceMap.entrySet()) {
|
||||
|
|
@ -70,8 +72,8 @@ final class MapToMapConverter implements ConditionalGenericConverter {
|
|||
for (Map.Entry<Object, Object> entry : sourceMap.entrySet()) {
|
||||
Object sourceKey = entry.getKey();
|
||||
Object sourceValue = entry.getValue();
|
||||
Object targetKey = this.conversionService.convert(sourceKey, sourceType.getMapKeyTypeDescriptor(), targetType.getMapKeyTypeDescriptor());
|
||||
Object targetValue = this.conversionService.convert(sourceValue, sourceType.getMapValueTypeDescriptor(), targetType.getMapValueTypeDescriptor());
|
||||
Object targetKey = this.conversionService.convert(sourceKey, sourceKeyType, targetKeyType);
|
||||
Object targetValue = this.conversionService.convert(sourceValue, sourceValueType, targetValueType);
|
||||
targetMap.put(targetKey, targetValue);
|
||||
}
|
||||
}
|
||||
|
|
|
|||
|
|
@ -55,13 +55,12 @@ final class ObjectToCollectionConverter implements ConditionalGenericConverter {
|
|||
return null;
|
||||
}
|
||||
Collection<Object> target = CollectionFactory.createCollection(targetType.getType(), 1);
|
||||
TypeDescriptor elementType = targetType.getElementTypeDescriptor();
|
||||
// Avoid potential recursion...
|
||||
if (!Collection.class.isAssignableFrom(elementType.getType())) {
|
||||
target.add(this.conversionService.convert(source, sourceType, elementType));
|
||||
}
|
||||
else {
|
||||
target.add(source);
|
||||
TypeDescriptor targetElementType = targetType.getElementTypeDescriptor();
|
||||
// Avoid potential recursion....
|
||||
if (targetElementType.isCollection()) {
|
||||
target.add(source);
|
||||
} else {
|
||||
target.add(this.conversionService.convert(source, sourceType, targetElementType));
|
||||
}
|
||||
return target;
|
||||
}
|
||||
|
|
|
|||
|
|
@ -1,7 +1,8 @@
|
|||
package org.springframework.core.convert.support;
|
||||
|
||||
import static org.junit.Assert.assertEquals;
|
||||
import static org.junit.Assert.assertNull;
|
||||
import static org.junit.Assert.assertFalse;
|
||||
import static org.junit.Assert.assertTrue;
|
||||
|
||||
import java.io.File;
|
||||
import java.io.IOException;
|
||||
|
|
@ -9,6 +10,8 @@ import java.io.InputStream;
|
|||
import java.net.URI;
|
||||
import java.net.URL;
|
||||
import java.util.ArrayList;
|
||||
import java.util.Arrays;
|
||||
import java.util.LinkedList;
|
||||
import java.util.List;
|
||||
|
||||
import org.junit.Before;
|
||||
|
|
@ -28,6 +31,114 @@ public class CollectionToCollectionConverterTests {
|
|||
conversionService.addConverter(new CollectionToCollectionConverter(conversionService));
|
||||
}
|
||||
|
||||
@Test
|
||||
public void scalarList() throws Exception {
|
||||
List<String> list = new ArrayList<String>();
|
||||
list.add("9");
|
||||
list.add("37");
|
||||
TypeDescriptor sourceType = TypeDescriptor.forObject(list);
|
||||
TypeDescriptor targetType = new TypeDescriptor(getClass().getField("scalarListTarget"));
|
||||
assertFalse(conversionService.canConvert(sourceType, targetType));
|
||||
conversionService.addConverterFactory(new StringToNumberConverterFactory());
|
||||
assertTrue(conversionService.canConvert(sourceType, targetType));
|
||||
@SuppressWarnings("unchecked")
|
||||
List<String> result = (List<String>) conversionService.convert(list, sourceType, targetType);
|
||||
assertFalse(list.equals(result));
|
||||
assertEquals((Integer) 9, result.get(0));
|
||||
assertEquals((Integer) 37, result.get(1));
|
||||
}
|
||||
|
||||
public List<Integer> scalarListTarget;
|
||||
|
||||
@Test
|
||||
public void emptyListToList() throws Exception {
|
||||
conversionService.addConverter(new CollectionToCollectionConverter(conversionService));
|
||||
conversionService.addConverterFactory(new StringToNumberConverterFactory());
|
||||
List<String> list = new ArrayList<String>();
|
||||
TypeDescriptor sourceType = TypeDescriptor.forObject(list);
|
||||
TypeDescriptor targetType = new TypeDescriptor(getClass().getField("emptyListTarget"));
|
||||
assertTrue(conversionService.canConvert(sourceType, targetType));
|
||||
assertEquals(list, conversionService.convert(list, sourceType, targetType));
|
||||
}
|
||||
|
||||
public List<Integer> emptyListTarget;
|
||||
|
||||
@Test
|
||||
public void emptyListToListDifferentTargetType() throws Exception {
|
||||
conversionService.addConverter(new CollectionToCollectionConverter(conversionService));
|
||||
conversionService.addConverterFactory(new StringToNumberConverterFactory());
|
||||
List<String> list = new ArrayList<String>();
|
||||
TypeDescriptor sourceType = TypeDescriptor.forObject(list);
|
||||
TypeDescriptor targetType = new TypeDescriptor(getClass().getField("emptyListDifferentTarget"));
|
||||
assertTrue(conversionService.canConvert(sourceType, targetType));
|
||||
@SuppressWarnings("unchecked")
|
||||
LinkedList<Integer> result = (LinkedList<Integer>) conversionService.convert(list, sourceType, targetType);
|
||||
assertEquals(LinkedList.class, result.getClass());
|
||||
assertTrue(result.isEmpty());
|
||||
}
|
||||
|
||||
public LinkedList<Integer> emptyListDifferentTarget;
|
||||
|
||||
@Test
|
||||
public void collectionToObjectInteraction() throws Exception {
|
||||
List<List<String>> list = new ArrayList<List<String>>();
|
||||
list.add(Arrays.asList("9", "12"));
|
||||
list.add(Arrays.asList("37", "23"));
|
||||
conversionService.addConverter(new CollectionToObjectConverter(conversionService));
|
||||
assertTrue(conversionService.canConvert(List.class, List.class));
|
||||
assertEquals(list, conversionService.convert(list, List.class));
|
||||
}
|
||||
|
||||
@Test
|
||||
public void arrayCollectionToObjectInteraction() throws Exception {
|
||||
List<String>[] array = new List[2];
|
||||
array[0] = Arrays.asList("9", "12");
|
||||
array[1] = Arrays.asList("37", "23");
|
||||
conversionService.addConverter(new ArrayToCollectionConverter(conversionService));
|
||||
conversionService.addConverter(new CollectionToObjectConverter(conversionService));
|
||||
assertTrue(conversionService.canConvert(String[].class, List.class));
|
||||
assertEquals(Arrays.asList(array), conversionService.convert(array, List.class));
|
||||
}
|
||||
|
||||
@Test
|
||||
public void objectToCollection() throws Exception {
|
||||
List<List<String>> list = new ArrayList<List<String>>();
|
||||
list.add(Arrays.asList("9", "12"));
|
||||
list.add(Arrays.asList("37", "23"));
|
||||
conversionService.addConverterFactory(new StringToNumberConverterFactory());
|
||||
conversionService.addConverter(new ObjectToCollectionConverter(conversionService));
|
||||
conversionService.addConverter(new CollectionToObjectConverter(conversionService));
|
||||
TypeDescriptor sourceType = TypeDescriptor.forObject(list);
|
||||
TypeDescriptor targetType = new TypeDescriptor(getClass().getField("objectToCollection"));
|
||||
assertTrue(conversionService.canConvert(sourceType, targetType));
|
||||
List<List<List<Integer>>> result = (List<List<List<Integer>>>) conversionService.convert(list, sourceType, targetType);
|
||||
assertEquals((Integer)9, result.get(0).get(0).get(0));
|
||||
assertEquals((Integer)12, result.get(0).get(1).get(0));
|
||||
assertEquals((Integer)37, result.get(1).get(0).get(0));
|
||||
assertEquals((Integer)23, result.get(1).get(1).get(0));
|
||||
}
|
||||
|
||||
public List<List<List<Integer>>> objectToCollection;
|
||||
|
||||
@Test
|
||||
public void stringToCollection() throws Exception {
|
||||
List<List<String>> list = new ArrayList<List<String>>();
|
||||
list.add(Arrays.asList("9,12"));
|
||||
list.add(Arrays.asList("37,23"));
|
||||
conversionService.addConverterFactory(new StringToNumberConverterFactory());
|
||||
conversionService.addConverter(new StringToCollectionConverter(conversionService));
|
||||
conversionService.addConverter(new ObjectToCollectionConverter(conversionService));
|
||||
conversionService.addConverter(new CollectionToObjectConverter(conversionService));
|
||||
TypeDescriptor sourceType = TypeDescriptor.forObject(list);
|
||||
TypeDescriptor targetType = new TypeDescriptor(getClass().getField("objectToCollection"));
|
||||
assertTrue(conversionService.canConvert(sourceType, targetType));
|
||||
List<List<List<Integer>>> result = (List<List<List<Integer>>>) conversionService.convert(list, sourceType, targetType);
|
||||
assertEquals((Integer)9, result.get(0).get(0).get(0));
|
||||
assertEquals((Integer)12, result.get(0).get(0).get(1));
|
||||
assertEquals((Integer)37, result.get(1).get(0).get(0));
|
||||
assertEquals((Integer)23, result.get(1).get(0).get(1));
|
||||
}
|
||||
|
||||
@Test
|
||||
public void differentImpls() throws Exception {
|
||||
List<Resource> resources = new ArrayList<Resource>();
|
||||
|
|
@ -69,7 +180,7 @@ public class CollectionToCollectionConverterTests {
|
|||
|
||||
public List<Resource> resources;
|
||||
|
||||
public static abstract class BaseResource implements Resource {
|
||||
public static abstract class BaseResource implements Resource {
|
||||
|
||||
public InputStream getInputStream() throws IOException {
|
||||
// TODO Auto-generated method stub
|
||||
|
|
|
|||
|
|
@ -16,7 +16,16 @@
|
|||
|
||||
package org.springframework.core.convert.support;
|
||||
|
||||
import static org.junit.Assert.assertEquals;
|
||||
import static org.junit.Assert.assertFalse;
|
||||
import static org.junit.Assert.assertNotNull;
|
||||
import static org.junit.Assert.assertNull;
|
||||
import static org.junit.Assert.assertSame;
|
||||
import static org.junit.Assert.assertTrue;
|
||||
import static org.junit.Assert.fail;
|
||||
|
||||
import java.util.ArrayList;
|
||||
import java.util.Arrays;
|
||||
import java.util.Collections;
|
||||
import java.util.HashMap;
|
||||
import java.util.LinkedHashMap;
|
||||
|
|
@ -24,9 +33,7 @@ import java.util.LinkedList;
|
|||
import java.util.List;
|
||||
import java.util.Map;
|
||||
|
||||
import static org.junit.Assert.*;
|
||||
import org.junit.Test;
|
||||
|
||||
import org.springframework.core.convert.ConversionFailedException;
|
||||
import org.springframework.core.convert.ConverterNotFoundException;
|
||||
import org.springframework.core.convert.TypeDescriptor;
|
||||
|
|
@ -261,8 +268,13 @@ public class GenericConversionServiceTests {
|
|||
@Test
|
||||
public void testListOfList() {
|
||||
GenericConversionService service = new DefaultConversionService();
|
||||
List<List<String>> list = Collections.singletonList(Collections.singletonList("Foo"));
|
||||
assertNotNull(service.convert(list, String.class));
|
||||
List<String> list1 = Arrays.asList("Foo", "Bar");
|
||||
List<String> list2 = Arrays.asList("Baz", "Boop");
|
||||
@SuppressWarnings("unchecked")
|
||||
List<List<String>> list = Arrays.asList(list1, list2);
|
||||
String result = service.convert(list, String.class);
|
||||
assertNotNull(result);
|
||||
assertEquals("Foo,Bar,Baz,Boop", result);
|
||||
}
|
||||
|
||||
@Test
|
||||
|
|
@ -360,36 +372,6 @@ public class GenericConversionServiceTests {
|
|||
|
||||
public static Map<String, Integer> map;
|
||||
|
||||
|
||||
@Test
|
||||
public void emptyListToList() throws Exception {
|
||||
conversionService.addConverter(new CollectionToCollectionConverter(conversionService));
|
||||
conversionService.addConverterFactory(new StringToNumberConverterFactory());
|
||||
List<String> list = new ArrayList<String>();
|
||||
TypeDescriptor sourceType = TypeDescriptor.forObject(list);
|
||||
TypeDescriptor targetType = new TypeDescriptor(getClass().getField("emptyListTarget"));
|
||||
assertTrue(conversionService.canConvert(sourceType, targetType));
|
||||
assertEquals(list, conversionService.convert(list, sourceType, targetType));
|
||||
}
|
||||
|
||||
public List<Integer> emptyListTarget;
|
||||
|
||||
@Test
|
||||
public void emptyListToListDifferentTargetType() throws Exception {
|
||||
conversionService.addConverter(new CollectionToCollectionConverter(conversionService));
|
||||
conversionService.addConverterFactory(new StringToNumberConverterFactory());
|
||||
List<String> list = new ArrayList<String>();
|
||||
TypeDescriptor sourceType = TypeDescriptor.forObject(list);
|
||||
TypeDescriptor targetType = new TypeDescriptor(getClass().getField("emptyListDifferentTarget"));
|
||||
assertTrue(conversionService.canConvert(sourceType, targetType));
|
||||
@SuppressWarnings("unchecked")
|
||||
LinkedList<Integer> result = (LinkedList<Integer>) conversionService.convert(list, sourceType, targetType);
|
||||
assertEquals(LinkedList.class, result.getClass());
|
||||
assertTrue(result.isEmpty());
|
||||
}
|
||||
|
||||
public LinkedList<Integer> emptyListDifferentTarget;
|
||||
|
||||
@Test
|
||||
public void emptyListToArray() throws Exception {
|
||||
conversionService.addConverter(new CollectionToArrayConverter(conversionService));
|
||||
|
|
|
|||
|
|
@ -52,7 +52,7 @@ public class MapToMapConverterTests {
|
|||
}
|
||||
|
||||
@Test
|
||||
public void scalarMapNotGenericSource() throws Exception {
|
||||
public void scalarMapNotGenericSourceField() throws Exception {
|
||||
Map<String, String> map = new HashMap<String, String>();
|
||||
map.put("1", "9");
|
||||
map.put("2", "37");
|
||||
|
|
@ -117,6 +117,7 @@ public class MapToMapConverterTests {
|
|||
Map<String, List<String>> map = new HashMap<String, List<String>>();
|
||||
map.put("1", Arrays.asList("9", "12"));
|
||||
map.put("2", Arrays.asList("37", "23"));
|
||||
conversionService.addConverter(new CollectionToCollectionConverter(conversionService));
|
||||
conversionService.addConverter(new CollectionToObjectConverter(conversionService));
|
||||
assertTrue(conversionService.canConvert(Map.class, Map.class));
|
||||
assertEquals(map, conversionService.convert(map, Map.class));
|
||||
|
|
@ -127,7 +128,7 @@ public class MapToMapConverterTests {
|
|||
Map<String, String> map = new HashMap<String, String>();
|
||||
TypeDescriptor sourceType = TypeDescriptor.forObject(map);
|
||||
TypeDescriptor targetType = new TypeDescriptor(getClass().getField("emptyMapTarget"));
|
||||
//assertTrue(conversionService.canConvert(sourceType, targetType));
|
||||
assertTrue(conversionService.canConvert(sourceType, targetType));
|
||||
assertEquals(map, conversionService.convert(map, sourceType, targetType));
|
||||
}
|
||||
|
||||
|
|
|
|||
|
|
@ -11,7 +11,7 @@
|
|||
</layout>
|
||||
</appender>
|
||||
|
||||
<logger name="org.springframework.core">
|
||||
<logger name="org.springframework.core.convert">
|
||||
<level value="warn" />
|
||||
</logger>
|
||||
|
||||
|
|
|
|||
Loading…
Reference in New Issue