This commit is contained in:
Keith Donald 2009-04-09 14:01:40 +00:00
parent 7e3e79ca22
commit a0cab10ccc
3 changed files with 101 additions and 21 deletions

View File

@ -50,17 +50,15 @@ class CollectionToArray extends AbstractCollectionConverter {
int i = 0;
ConversionExecutor elementConverter = getElementConverter(collection);
for (Iterator<?> it = collection.iterator(); it.hasNext(); i++) {
Object value = it.next();
value = elementConverter.execute(value);
Array.set(array, i, value);
Array.set(array, i, elementConverter.execute(it.next()));
}
return array;
}
private ConversionExecutor getElementConverter(Collection<?> target) {
private ConversionExecutor getElementConverter(Collection<?> source) {
ConversionExecutor elementConverter = getElementConverter();
if (elementConverter == NoOpConversionExecutor.INSTANCE && !target.isEmpty()) {
Iterator<?> it = target.iterator();
if (elementConverter == NoOpConversionExecutor.INSTANCE && !source.isEmpty()) {
Iterator<?> it = source.iterator();
while (it.hasNext()) {
Object value = it.next();
if (value != null) {

View File

@ -37,26 +37,29 @@ class CollectionToCollection extends AbstractCollectionConverter {
@SuppressWarnings("unchecked")
protected Object doExecute(Object source) throws Exception {
Collection sourceCollection = (Collection) source;
Class targetCollectionType = getTargetCollectionType();
Class implClass = CollectionConversionUtils.getImpl(targetCollectionType);
Class implClass = CollectionConversionUtils.getImpl(getTargetCollectionType());
Collection targetCollection = (Collection) implClass.newInstance();
ConversionExecutor elementConverter = getElementConverter();
Class elementType;
if (elementConverter == null) {
elementType = getTargetElementType();
} else {
elementType = null;
}
ConversionExecutor elementConverter = getElementConverter(sourceCollection);
Iterator it = sourceCollection.iterator();
while (it.hasNext()) {
Object value = it.next();
if (elementConverter == null && elementType != null) {
elementConverter = getConversionService().getConversionExecutor(value.getClass(), TypeDescriptor.valueOf(elementType));
}
value = elementConverter.execute(value);
targetCollection.add(value);
targetCollection.add(elementConverter.execute(it.next()));
}
return targetCollection;
}
private ConversionExecutor getElementConverter(Collection<?> source) {
ConversionExecutor elementConverter = getElementConverter();
if (elementConverter == NoOpConversionExecutor.INSTANCE && !source.isEmpty() && getTargetElementType() != null) {
Iterator<?> it = source.iterator();
while (it.hasNext()) {
Object value = it.next();
if (value != null) {
elementConverter = getConversionService().getConversionExecutor(value.getClass(), TypeDescriptor.valueOf(getTargetElementType()));
break;
}
}
}
return elementConverter;
}
}

View File

@ -0,0 +1,79 @@
package org.springframework.core.convert.service;
import static org.junit.Assert.assertEquals;
import java.util.ArrayList;
import java.util.Collection;
import java.util.List;
import org.junit.Test;
import org.springframework.core.convert.TypeDescriptor;
public class CollectionToCollectionTests {
@Test
public void testCollectionToCollectionConversion() throws Exception {
DefaultConversionService service = new DefaultConversionService();
CollectionToCollection c = new CollectionToCollection(new TypeDescriptor(getClass().getField("bindTarget")),
new TypeDescriptor(getClass().getField("integerTarget")), service);
bindTarget.add("1");
bindTarget.add("2");
bindTarget.add("3");
List result = (List) c.execute(bindTarget);
assertEquals(new Integer(1), result.get(0));
assertEquals(new Integer(2), result.get(1));
assertEquals(new Integer(3), result.get(2));
}
@Test
public void testCollectionToCollectionConversionNoGenericInfo() throws Exception {
DefaultConversionService service = new DefaultConversionService();
CollectionToCollection c = new CollectionToCollection(TypeDescriptor.valueOf(Collection.class),
TypeDescriptor.valueOf(List.class), service);
bindTarget.add("1");
bindTarget.add("2");
bindTarget.add("3");
List result = (List) c.execute(bindTarget);
assertEquals("1", result.get(0));
assertEquals("2", result.get(1));
assertEquals("3", result.get(2));
}
@Test
public void testCollectionToCollectionConversionNoGenericInfoSource() throws Exception {
DefaultConversionService service = new DefaultConversionService();
CollectionToCollection c = new CollectionToCollection(TypeDescriptor.valueOf(Collection.class),
new TypeDescriptor(getClass().getField("integerTarget")), service);
bindTarget.add("1");
bindTarget.add("2");
bindTarget.add("3");
List result = (List) c.execute(bindTarget);
assertEquals(new Integer(1), result.get(0));
assertEquals(new Integer(2), result.get(1));
assertEquals(new Integer(3), result.get(2));
}
@Test
public void testCollectionToCollectionConversionNoGenericInfoSourceNullValues() throws Exception {
DefaultConversionService service = new DefaultConversionService();
CollectionToCollection c = new CollectionToCollection(TypeDescriptor.valueOf(Collection.class),
new TypeDescriptor(getClass().getField("integerTarget")), service);
bindTarget.add(null);
bindTarget.add("1");
bindTarget.add("2");
bindTarget.add(null);
bindTarget.add("3");
List result = (List) c.execute(bindTarget);
assertEquals(null, result.get(0));
assertEquals(new Integer(1), result.get(1));
assertEquals(new Integer(2), result.get(2));
assertEquals(null, result.get(3));
assertEquals(new Integer(3), result.get(4));
}
public Collection<String> bindTarget = new ArrayList<String>();
public List<Integer> integerTarget = new ArrayList<Integer>();
}