From b3ff31a04a926a0a69139b840bb3fe320b5c7c3a Mon Sep 17 00:00:00 2001 From: Keith Donald Date: Fri, 13 Feb 2009 13:58:23 +0000 Subject: [PATCH] collection to collection --- .../converters/CollectionToCollection.java | 79 +++++++++++++++++++ 1 file changed, 79 insertions(+) create mode 100644 spring-binding/src/main/java/org/springframework/binding/convert/converters/CollectionToCollection.java diff --git a/spring-binding/src/main/java/org/springframework/binding/convert/converters/CollectionToCollection.java b/spring-binding/src/main/java/org/springframework/binding/convert/converters/CollectionToCollection.java new file mode 100644 index 00000000..6ea8ea34 --- /dev/null +++ b/spring-binding/src/main/java/org/springframework/binding/convert/converters/CollectionToCollection.java @@ -0,0 +1,79 @@ +package org.springframework.binding.convert.converters; + +import java.util.ArrayList; +import java.util.Collection; +import java.util.Iterator; +import java.util.LinkedHashSet; +import java.util.List; +import java.util.Set; +import java.util.SortedSet; +import java.util.TreeSet; + +import org.springframework.binding.convert.ConversionExecutor; +import org.springframework.binding.convert.ConversionService; +import org.springframework.core.GenericCollectionTypeResolver; +import org.springframework.core.JdkVersion; + +public class CollectionToCollection implements Converter { + + private ConversionService conversionService; + + public CollectionToCollection(ConversionService conversionService) { + this.conversionService = conversionService; + } + + public Class getSourceClass() { + return Collection.class; + } + + public Class getTargetClass() { + return Collection.class; + } + + public Object convertSourceToTargetClass(Object source, Class targetClass) throws Exception { + if (source == null) { + return null; + } + Class targetCollectionImpl = getCollectionImplClass(targetClass); + Collection targetCollection = (Collection) targetCollectionImpl.getConstructor(null).newInstance(null); + ConversionExecutor elementConverter = getElementConverter(source, targetClass); + Collection sourceCollection = (Collection) source; + Iterator it = sourceCollection.iterator(); + while (it.hasNext()) { + Object value = it.next(); + if (elementConverter != null) { + value = elementConverter.execute(value); + } + targetCollection.add(value); + } + return targetCollection; + } + + private Class getCollectionImplClass(Class targetClass) { + if (targetClass.isInterface()) { + if (List.class.equals(targetClass)) { + return ArrayList.class; + } else if (Set.class.equals(targetClass)) { + return LinkedHashSet.class; + } else if (SortedSet.class.equals(targetClass)) { + return TreeSet.class; + } else { + throw new IllegalArgumentException("Unsupported collection interface [" + targetClass.getName() + "]"); + } + } else { + return targetClass; + } + } + + private ConversionExecutor getElementConverter(Object source, Class targetClass) { + if (JdkVersion.isAtLeastJava15()) { + Class elementType = GenericCollectionTypeResolver.getCollectionType(targetClass); + if (elementType != null) { + Class componentType = source.getClass().getComponentType(); + return conversionService.getConversionExecutor(componentType, elementType); + } + } + return null; + } + +} \ No newline at end of file