diff --git a/jOOQ/src/main/java/org/jooq/tools/Convert.java b/jOOQ/src/main/java/org/jooq/tools/Convert.java index ba0e1a650b..60504ce218 100644 --- a/jOOQ/src/main/java/org/jooq/tools/Convert.java +++ b/jOOQ/src/main/java/org/jooq/tools/Convert.java @@ -291,6 +291,10 @@ public final class Convert { } } + public static final U[] convertCollection(Collection from, Class to){ + return new ConvertAll(to).from(from); + } + /** * Convert an object to a type. * @@ -499,16 +503,43 @@ public final class Convert { } } else if (fromClass.isArray()) { + Object[] fromArray = (Object[]) from; + + // [#3062] Default collections if no specific collection type was requested + if (Collection.class.isAssignableFrom(toClass) && + toClass.isAssignableFrom(ArrayList.class)) { + return (U) new ArrayList(Arrays.asList(fromArray)); + } + else if (Collection.class.isAssignableFrom(toClass) && + toClass.isAssignableFrom(LinkedHashSet.class)) { + return (U) new LinkedHashSet(Arrays.asList(fromArray)); + } // [#3443] Conversion from Object[] to JDBC Array if (toClass == java.sql.Array.class) { - return (U) new MockArray(null, (Object[]) from, fromClass); + return (U) new MockArray(null, fromArray, fromClass); } else { - return (U) convertArray((Object[]) from, toClass); + return (U) convertArray(fromArray, toClass); } } + else if (toClass.isArray() + && Collection.class.isAssignableFrom(fromClass)){ + Collection f = (Collection) from; + Class componentType = toClass.getComponentType(); + + Object[] dest = (Object[]) Array.newInstance(componentType, f.size()); + Object[] list = f.stream() + .map(e -> { + if (!componentType.isAssignableFrom(e.getClass())) + return convert(e, componentType); + return e; + }).toArray(); + System.arraycopy(list, 0, dest, 0, dest.length); + + return (U) dest; + } else if (toClass == Optional.class) { return (U) Optional.of(from); diff --git a/jOOQ/src/test/java/org/jooq/tools/ConvertTest.java b/jOOQ/src/test/java/org/jooq/tools/ConvertTest.java new file mode 100644 index 0000000000..9158950ea6 --- /dev/null +++ b/jOOQ/src/test/java/org/jooq/tools/ConvertTest.java @@ -0,0 +1,42 @@ +package org.jooq.tools; + +import org.junit.Test; + +import java.util.*; + +import static java.util.Arrays.asList; +import static org.junit.Assert.assertEquals; +import static org.junit.Assert.assertTrue; + +/** + * Created by nfischer on 9/24/2016. + */ +public class ConvertTest { + + @Test + public void testFromArray(){ + String[] arr = new String[]{"Hello", "World", "!"}; + List convertedList = Convert.convert(arr, List.class); + assertEquals(ArrayList.class, convertedList.getClass()); + assertTrue(Arrays.equals(arr, convertedList.toArray())); + + Set convertedSet = Convert.convert(arr, Set.class); + assertEquals(LinkedHashSet.class, convertedSet.getClass()); + assertTrue(Arrays.equals(arr, convertedSet.toArray())); + } + + @Test + public void testFromCollection(){ + List list = asList("Hello", "world", "!"); + String[] arr = Convert.convertCollection(list, String[].class); + assertEquals(list, asList(arr)); + + String[] numStrings = new String[]{"1", "2", "3"}; + List integerList = asList(1, 2, 3); + + String[] convertedNumString = Convert.convertCollection(integerList, String[].class); + assertTrue(Arrays.equals(numStrings, convertedNumString)); + + assertTrue(Arrays.equals(new String[0], Convert.convertCollection(new LinkedList(), String[].class))); + } +}