From d0385c90f398b83b0b104627d2517e853c1bbb03 Mon Sep 17 00:00:00 2001 From: Nathan Fischer Date: Sat, 24 Sep 2016 13:07:29 -0700 Subject: [PATCH 1/2] #3062 Work on adding ability to convert between collections and arrays. --- .../src/main/java/org/jooq/tools/Convert.java | 21 +++++++++-- .../test/java/org/jooq/tools/ConvertTest.java | 35 +++++++++++++++++++ 2 files changed, 53 insertions(+), 3 deletions(-) create mode 100644 jOOQ/src/test/java/org/jooq/tools/ConvertTest.java diff --git a/jOOQ/src/main/java/org/jooq/tools/Convert.java b/jOOQ/src/main/java/org/jooq/tools/Convert.java index 59c2b54a83..e455c3eec4 100644 --- a/jOOQ/src/main/java/org/jooq/tools/Convert.java +++ b/jOOQ/src/main/java/org/jooq/tools/Convert.java @@ -430,7 +430,7 @@ public final class Convert { /** * The converter to convert them all. */ - private static class ConvertAll implements Converter { + static class ConvertAll implements Converter { /** * Generated UID @@ -494,16 +494,31 @@ public final class Convert { return convert(Arrays.toString((byte[]) from), toClass); } else if (fromClass.isArray()) { + Object[] fromArray = (Object[]) from; + + 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; + return (U) f.toArray(); + } 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..3ef136e993 --- /dev/null +++ b/jOOQ/src/test/java/org/jooq/tools/ConvertTest.java @@ -0,0 +1,35 @@ +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 = new Convert.ConvertAll<>(String[].class).from(list); + assertEquals(list, asList(arr)); + } +} From b77fb5b0a6016541b21acb3ab55c74b5f95701c8 Mon Sep 17 00:00:00 2001 From: Nathan Fischer Date: Tue, 11 Oct 2016 19:15:35 -0700 Subject: [PATCH 2/2] addressed issues Added convertCollection method --- .../src/main/java/org/jooq/tools/Convert.java | 20 +++++++++++++++++-- .../test/java/org/jooq/tools/ConvertTest.java | 11 ++++++++-- 2 files changed, 27 insertions(+), 4 deletions(-) diff --git a/jOOQ/src/main/java/org/jooq/tools/Convert.java b/jOOQ/src/main/java/org/jooq/tools/Convert.java index e455c3eec4..0b24fbe2a8 100644 --- a/jOOQ/src/main/java/org/jooq/tools/Convert.java +++ b/jOOQ/src/main/java/org/jooq/tools/Convert.java @@ -296,6 +296,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. * @@ -430,7 +434,7 @@ public final class Convert { /** * The converter to convert them all. */ - static class ConvertAll implements Converter { + private static class ConvertAll implements Converter { /** * Generated UID @@ -496,6 +500,7 @@ 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)); @@ -517,7 +522,18 @@ public final class Convert { else if (toClass.isArray() && Collection.class.isAssignableFrom(fromClass)){ Collection f = (Collection) from; - return (U) f.toArray(); + 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) { diff --git a/jOOQ/src/test/java/org/jooq/tools/ConvertTest.java b/jOOQ/src/test/java/org/jooq/tools/ConvertTest.java index 3ef136e993..9158950ea6 100644 --- a/jOOQ/src/test/java/org/jooq/tools/ConvertTest.java +++ b/jOOQ/src/test/java/org/jooq/tools/ConvertTest.java @@ -28,8 +28,15 @@ public class ConvertTest { @Test public void testFromCollection(){ List list = asList("Hello", "world", "!"); - - String[] arr = new Convert.ConvertAll<>(String[].class).from(list); + 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))); } }