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;
}
}