From cb5ba5cdace4620e73742155265669027358f53e Mon Sep 17 00:00:00 2001 From: Lukas Eder Date: Fri, 25 Sep 2020 11:16:58 +0200 Subject: [PATCH] [jOOQ/jOOQ#10688] Add Converter.forArrays() to turn a Converter into a Converter --- jOOQ/src/main/java/org/jooq/Converter.java | 8 +++ jOOQ/src/main/java/org/jooq/Converters.java | 60 ++++++++++++--------- 2 files changed, 43 insertions(+), 25 deletions(-) diff --git a/jOOQ/src/main/java/org/jooq/Converter.java b/jOOQ/src/main/java/org/jooq/Converter.java index d063829e63..2236a81828 100644 --- a/jOOQ/src/main/java/org/jooq/Converter.java +++ b/jOOQ/src/main/java/org/jooq/Converter.java @@ -137,6 +137,14 @@ public interface Converter extends Serializable { return Converters.of(this, converter); } + /** + * Turn this converter into a converter for arrays. + */ + @NotNull + default Converter forArrays() { + return Converters.forArrays(this); + } + /** * Construct a new converter from functions. * diff --git a/jOOQ/src/main/java/org/jooq/Converters.java b/jOOQ/src/main/java/org/jooq/Converters.java index ff1ad3ab80..f2adf9f605 100644 --- a/jOOQ/src/main/java/org/jooq/Converters.java +++ b/jOOQ/src/main/java/org/jooq/Converters.java @@ -37,9 +37,13 @@ */ package org.jooq; +import static org.jooq.tools.Convert.convertArray; + +import java.lang.reflect.Array; + +import org.jooq.impl.AbstractConverter; import org.jooq.impl.IdentityConverter; import org.jooq.impl.SQLDataType; - import org.jetbrains.annotations.NotNull; /** @@ -51,7 +55,7 @@ import org.jetbrains.annotations.NotNull; * @author Lukas Eder */ @SuppressWarnings({ "rawtypes", "unchecked" }) -public class Converters implements Converter { +public class Converters extends AbstractConverter { /** * Generated UID @@ -112,7 +116,7 @@ public class Converters implements Converter { * Inverse a converter. */ public static Converter inverse(final Converter converter) { - return new Converter() { + return new AbstractConverter(converter.toType(), converter.fromType()) { /** * Generated UID @@ -129,16 +133,6 @@ public class Converters implements Converter { return converter.from(t); } - @Override - public Class fromType() { - return converter.toType(); - } - - @Override - public Class toType() { - return converter.fromType(); - } - @Override public String toString() { return "InverseConverter [ " + fromType().getName() + " -> " + toType().getName() + " ]"; @@ -146,8 +140,34 @@ public class Converters implements Converter { }; } + public static Converter forArrays(final Converter converter) { + return new AbstractConverter( + (Class) Array.newInstance(converter.fromType(), 0).getClass(), + (Class) Array.newInstance(converter.toType(), 0).getClass() + ) { + + /** + * Generated UID + */ + private static final long serialVersionUID = -4307758248063822630L; + private final Converter inverse = Converters.inverse(converter); + + @Override + public U[] from(T[] t) { + return convertArray(t, converter); + } + + @Override + public T[] to(U[] u) { + return convertArray(u, inverse); + } + }; + } + Converters(Converter... chain) { - this.chain = chain == null ? new Converter[0] : chain; + super(chain[0].fromType(), chain[chain.length - 1].toType()); + + this.chain = chain; } @Override @@ -170,23 +190,13 @@ public class Converters implements Converter { return (T) result; } - @Override - public final Class fromType() { - return chain[0].fromType(); - } - - @Override - public final Class toType() { - return chain[chain.length - 1].toType(); - } - @Override public String toString() { StringBuilder sb = new StringBuilder(); String separator = " -> "; sb.append("Converters [ "); - sb.append(chain[0].fromType().getName()); + sb.append(fromType().getName()); for (Converter converter : chain) { sb.append(separator);