From 0877a37084254cc628450c9d8d80cb6666e33541 Mon Sep 17 00:00:00 2001 From: Lukas Eder Date: Fri, 5 Sep 2014 17:05:49 +0200 Subject: [PATCH] [#2155] [#3624] Add Converter support to Routines and UDTs - Updated API and code generator to fix compilation issues - Integration tests not yet implemented --- .../java/org/jooq/util/JavaGenerator.java | 44 +++++++++++++++---- .../java/org/jooq/impl/AbstractRoutine.java | 37 +++++++++++++--- .../java/org/jooq/impl/ArrayRecordImpl.java | 31 +++++++++++-- .../java/org/jooq/impl/ParameterImpl.java | 8 +++- .../main/java/org/jooq/impl/UDTFieldImpl.java | 5 ++- jOOQ/src/main/java/org/jooq/impl/UDTImpl.java | 32 +++++++++++++- 6 files changed, 135 insertions(+), 22 deletions(-) diff --git a/jOOQ-codegen/src/main/java/org/jooq/util/JavaGenerator.java b/jOOQ-codegen/src/main/java/org/jooq/util/JavaGenerator.java index 829f5244e1..7b72e8fdd5 100644 --- a/jOOQ-codegen/src/main/java/org/jooq/util/JavaGenerator.java +++ b/jOOQ-codegen/src/main/java/org/jooq/util/JavaGenerator.java @@ -1075,10 +1075,18 @@ public class JavaGenerator extends AbstractGenerator { final String attrId = getStrategy().getJavaIdentifier(attribute); final String attrName = attribute.getName(); final String attrComment = StringUtils.defaultString(attribute.getComment()); + final String attrConverterType = attribute.getType().getConverter(); out.tab(1).javadoc("The attribute %s.%s", attribute.getQualifiedOutputName(), defaultIfBlank(" " + attrComment, "")); - out.tab(1).println("public static final %s<%s, %s> %s = createField(\"%s\", %s, %s);", - UDTField.class, recordType, attrType, attrId, attrName, attrTypeRef, udtId); + + if (attrConverterType != null) { + out.tab(1).println("public static final %s<%s, %s> %s = createField(\"%s\", %s, %s, \"%s\", new %s());", + UDTField.class, recordType, attrType, attrId, attrName, attrTypeRef, udtId, escapeString(""), attrConverterType); + } + else { + out.tab(1).println("public static final %s<%s, %s> %s = createField(\"%s\", %s, %s, \"%s\");", + UDTField.class, recordType, attrType, attrId, attrName, attrTypeRef, udtId, escapeString("")); + } } // [#799] Oracle UDT's can have member procedures @@ -1295,6 +1303,7 @@ public class JavaGenerator extends AbstractGenerator { xxxxx xxxxxxxxxxxx xxxxxxxxxx x xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx xxxxxxxxxxxxx xxxxx xxxxxx xxxxxxxxx x xxxxxxxxxxxxxxxxxxxxxx xxxxx xxxxxx xxxxxxxx x xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx + xxxxx xxxxxx xxxxxxxxxxxxxxxxxxxx x xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx xxxxxxxxxx xxx x xxx xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx xxxxxxxxxxxxxx xxxxxxxxxxxxxxxxx xxxxxx xxxxxxxxxxxxx @@ -1308,7 +1317,12 @@ public class JavaGenerator extends AbstractGenerator { xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx x xxxxx x xxxxxxx x xxx xxx xxxxxx xxxxxx xxxxxxxxxxx xxxxxxxxx xxxxxxxxxxx xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx xxxxxxxxxxxxxxxxxxxxxxxxxx xxxxx xxxxxxxxxxxxxx xxx xxxxxxxxxx xxxxxxxxxxxxxxxxxxxxx - xxxxxxxxxxxxxxxxxxxxxxxxxxxxx xxxxxxx xxx xxxxxxxxxxxxxxxxx xxxxxxxxx xxxxxxxxxx xxxxxxxxxxxxxxxx + + xx xxxxxxxxxxxxxxxxxxxxx xx xxxxx + xxxxxxxxxxxxxxxxxxxxxxxxxxxxx xxxxxxx xxx xxxxxxxxxxxxxx xxx xxxxxxxx xxxxxxxxx xxxxxxxxxx xxxxxxxxxxxxxxx xxxxxxxxxxxxxxxxxxxxxx + xxxx + xxxxxxxxxxxxxxxxxxxxxxxxxxxxx xxxxxxx xxx xxxxxxxxxxxxxxxxx xxxxxxxxx xxxxxxxxxx xxxxxxxxxxxxxxxx + xxxxxxxxxxxxxxxxxxxxxxxx xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx x xxxxx x xxxxxxx x xxx xxx xxxxxx xxxxxx xxxxxxxxxxx xxxxxxxxx xxxxxxxxxxx @@ -1328,7 +1342,12 @@ public class JavaGenerator extends AbstractGenerator { xxxxxxxxxxxxxxxxxxxxxxxxxx x xxx xxxxxxxxxxxxxxx xxxxxxxx xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx xxxxxxxxxxxxxxxxxxxxxxxxxx xxxx xxx xxxxxxxxxxx - xxxxxxxxxxxxxxxxxxxxxxxxxxxxx xxxxxxx xxxxxx xxxxxxxxx xxxxxxxxxx xxxxxxxxxxxxxxxx + + xx xxxxxxxxxxxxxxxxxxxxx xx xxxxx + xxxxxxxxxxxxxxxxxxxxxxxxxxxxx xxxxxxx xxx xxx xxxxxxxx xxxxxxxxx xxxxxxxxxx xxxxxxxxxxxxxxx xxxxxxxxxxxxxxxxxxxxxx + xxxx + xxxxxxxxxxxxxxxxxxxxxxxxxxxxx xxxxxxx xxxxxx xxxxxxxxx xxxxxxxxxx xxxxxxxxxxxxxxxx + xxxxxxxxxxxxxxxxxxxxxxxx xxxxxxxxxxxxxxxxxxxxxxxxxx x xxx xxxxxxxxxxxxxxx xxxxxxxx xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx @@ -2543,6 +2562,9 @@ public class JavaGenerator extends AbstractGenerator { final List returnTypeRef = list((routine.getReturnValue() != null) ? getJavaTypeReference(database, routine.getReturnType()) : null); + final List returnConverterType = list((routine.getReturnValue() != null) + ? routine.getReturnType().getConverter() + : null); final List interfaces = getStrategy().getJavaClassImplements(routine, Mode.DEFAULT); final String schemaId = getStrategy().getFullJavaIdentifier(schema); final List packageId = getStrategy().getFullJavaIdentifiers(routine.getPackage()); @@ -2561,16 +2583,22 @@ public class JavaGenerator extends AbstractGenerator { final String paramId = getStrategy().getJavaIdentifier(parameter); final String paramName = parameter.getName(); final String paramComment = StringUtils.defaultString(parameter.getComment()); - final List isDefaulted = list(parameter.isDefaulted() ? "true" : null); + final String isDefaulted = parameter.isDefaulted() ? "true" : "false"; + final String paramConverterType = parameter.getType().getConverter(); out.tab(1).javadoc("The parameter %s.%s", parameter.getQualifiedOutputName(), defaultIfBlank(" " + paramComment, "")); - out.tab(1).println("public static final %s<%s> %s = createParameter(\"%s\", %s[[before=, ][%s]]);", - Parameter.class, paramType, paramId, paramName, paramTypeRef, isDefaulted); + + if (paramConverterType != null) + out.tab(2).println("public static final %s<%s> %s = createParameter(\"%s\", %s, %s, new %s());", + Parameter.class, paramType, paramId, paramName, paramTypeRef, isDefaulted, paramConverterType); + else + out.tab(2).println("public static final %s<%s> %s = createParameter(\"%s\", %s, %s);", + Parameter.class, paramType, paramId, paramName, paramTypeRef, isDefaulted); } out.tab(1).javadoc("Create a new routine call instance"); out.tab(1).println("public %s() {", className); - out.tab(2).println("super(\"%s\", %s[[before=, ][%s]][[before=, ][%s]]);", routine.getName(), schemaId, packageId, returnTypeRef); + out.tab(2).println("super(\"%s\", %s[[before=, ][%s]][[before=, ][%s]][[before=, ][new %s()]]);", routine.getName(), schemaId, packageId, returnTypeRef, returnConverterType); if (routine.getAllParameters().size() > 0) { out.println(); diff --git a/jOOQ/src/main/java/org/jooq/impl/AbstractRoutine.java b/jOOQ/src/main/java/org/jooq/impl/AbstractRoutine.java index 1e9dc4ab22..e41262f8ad 100644 --- a/jOOQ/src/main/java/org/jooq/impl/AbstractRoutine.java +++ b/jOOQ/src/main/java/org/jooq/impl/AbstractRoutine.java @@ -73,6 +73,7 @@ import org.jooq.BindContext; import org.jooq.Clause; import org.jooq.Configuration; import org.jooq.Context; +import org.jooq.Converter; import org.jooq.DSLContext; import org.jooq.DataType; import org.jooq.ExecuteContext; @@ -137,18 +138,27 @@ public abstract class AbstractRoutine extends AbstractQueryPart implements Ro // ------------------------------------------------------------------------ protected AbstractRoutine(String name, Schema schema) { - this(name, schema, null, null); + this(name, schema, null, null, null); } protected AbstractRoutine(String name, Schema schema, Package pkg) { - this(name, schema, pkg, null); + this(name, schema, pkg, null, null); } protected AbstractRoutine(String name, Schema schema, DataType type) { - this(name, schema, null, type); + this(name, schema, null, type, null); + } + + protected AbstractRoutine(String name, Schema schema, DataType type, Converter converter) { + this(name, schema, null, type, converter); } protected AbstractRoutine(String name, Schema schema, Package pkg, DataType type) { + this(name, schema, pkg, type, null); + } + + @SuppressWarnings({ "unchecked", "rawtypes" }) + protected AbstractRoutine(String name, Schema schema, Package pkg, DataType type, Converter converter) { this.parameterIndexes = new HashMap, Integer>(); this.schema = schema; @@ -161,7 +171,9 @@ public abstract class AbstractRoutine extends AbstractQueryPart implements Ro this.inValuesDefaulted = new HashSet>(); this.inValuesNonDefaulted = new HashSet>(); this.results = new HashMap, Object>(); - this.type = type; + this.type = converter == null + ? (DataType) type + : type.asConvertedDataType((Converter) converter); } // ------------------------------------------------------------------------ @@ -752,7 +764,7 @@ public abstract class AbstractRoutine extends AbstractQueryPart implements Ro * @param type The data type of the field */ protected static final Parameter createParameter(String name, DataType type) { - return createParameter(name, type, false); + return createParameter(name, type, false, null); } /** @@ -765,7 +777,20 @@ public abstract class AbstractRoutine extends AbstractQueryPart implements Ro * {@link Parameter#isDefaulted()} */ protected static final Parameter createParameter(String name, DataType type, boolean isDefaulted) { - return new ParameterImpl(name, type, isDefaulted); + return createParameter(name, type, isDefaulted, null); + } + + /** + * Subclasses may call this method to create {@link UDTField} objects that + * are linked to this table. + * + * @param name The name of the field (case-sensitive!) + * @param type The data type of the field + * @param isDefaulted Whether the parameter is defaulted (see + * {@link Parameter#isDefaulted()} + */ + protected static final Parameter createParameter(String name, DataType type, boolean isDefaulted, Converter converter) { + return new ParameterImpl(name, type, isDefaulted, converter); } /** diff --git a/jOOQ/src/main/java/org/jooq/impl/ArrayRecordImpl.java b/jOOQ/src/main/java/org/jooq/impl/ArrayRecordImpl.java index db783fb526..ee904d0ad7 100644 --- a/jOOQ/src/main/java/org/jooq/impl/ArrayRecordImpl.java +++ b/jOOQ/src/main/java/org/jooq/impl/ArrayRecordImpl.java @@ -54,6 +54,7 @@ xxxxxx xxxxxxxxxxxxxxx xxxxxx xxxxxxxxxxxxxxxxxxxxx xxxxxx xxxxxxxxxxxxxxxxxxxx xxxxxx xxxxxxxxxxxxxxxxxxxxxxx +xxxxxx xxxxxxxxxxxxxxxxxxx xxxxxx xxxxxxxxxxxxxxxxxx xxxxxx xxxxxxxxxxxxxxxx @@ -81,6 +82,8 @@ xxxxxx xxxxx xxxxxxxxxxxxxxxxxx xxxxxxx xxxxxxxxxxxxx xxxxxxxxxx xxxxxxxxxxxxxx x xxxxxx xx xxxxx xxxxx xxxxxx x x xxxxxxxxxxx x xxxxx x xxxxxxx x xxx xxx + x xxxxxx xxxxxxxxxxxxxxxxxxxxxxxx xxxxxxx xxxxxxxxxx + x xxxxxxxxxxx xxxxxxx xx xxxxxxxxxxxxxxxxxxxxxxxxxxx xxxxxxxxxxx @@ -88,19 +91,41 @@ xxxxxx xxxxx xxxxxxxxxxxxxxxxxx xxxxxxx xxxxxxxxxxxxx xxxxxxxxxx xxxxxxxxxxxxxx xxxxxxxxxxxx xxxxx xxxxxx x + xxx + x xxxxxx xx xxxxx xxxxx xxxxxx + x + x xxxxxxxxxxx x xxxxx x xxxxxxx x xxx xxx + x xxxxxx xxxxxxxxxxxxxxxxxxxxxxxx xxxxxxx xxxxxxxxx xxxxxxxxxxx + x xxxxxxxxxxx xxxxxxxx + xx + xxxxxxxxxxxxxxxxxxxxxxxxxxx + xxxxxxxxxxx + xxxxxxxxx xxxxxxxxxxxxxxxxxxxxxx xxxxxxx xxxxxx xxxxx xxxxxxxxxxx xxxxx xxxxxxxxxxxxx xxxxxxxxxxxxxx xxxxxxxxxxxx xx xxxxxxxxxx x + xxxxxxxxxxxx xxxxx xxxxx xxxxxxxxxxx + x + xxx x xxxxxx xx xxxxx xxxxx xxxxxx xx - xxxxxxxxxxxxxxxxxxxxxxxxxxxxxx xxxxxxxxx xxxxxxxxxxxxxxxxxxxxxx xxxxxxx xxxxxx xxxxx xxxxxxxxxxx xxxxx x + xxxxxxxxxxxx xxxxx xxxxx xxxxxxxxxxxxx xxx xxxxxx + x + + xxx + x xxxxxx xx xxxxx xxxxx xxxxxx + xx + xxxxxxxxxxxxxxxxxxx xxxxxxxxxxxx xxxxxxxxxx xx + xxxxxxxxx xxxxxxxxxxxxxxxxxxxxxx xxxxxxx xxxxxx xxxxx xxxxxxxxxxx xxxxx xxxxxxxxxxxx xx xxxxxxxxxx x xxxxxxxxxxxx xxxxxxxxxxx x xxxxxxx xxxxxxxxx x xxxxx - xxxxxxxxxxxxx x xxxxx + xxxxxxxxxxxxx x xxxxxxxxx xx xxxx + x xxxxxxxxxxxxx xxxx + x xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx xxxxxxxxxxx xx xxxxx xxxx xxxx xxxxxxxxxxxxxx - xxxxxxxxx x xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx + xxxxxxxxx x xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx x xx xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx diff --git a/jOOQ/src/main/java/org/jooq/impl/ParameterImpl.java b/jOOQ/src/main/java/org/jooq/impl/ParameterImpl.java index 13266858aa..b088fb78c9 100644 --- a/jOOQ/src/main/java/org/jooq/impl/ParameterImpl.java +++ b/jOOQ/src/main/java/org/jooq/impl/ParameterImpl.java @@ -44,6 +44,7 @@ package org.jooq.impl; import org.jooq.Clause; import org.jooq.Configuration; import org.jooq.Context; +import org.jooq.Converter; import org.jooq.DataType; import org.jooq.Parameter; import org.jooq.tools.StringUtils; @@ -61,10 +62,13 @@ class ParameterImpl extends AbstractQueryPart implements Parameter { private final DataType type; private final boolean isDefaulted; - ParameterImpl(String name, DataType type, boolean isDefaulted) { + @SuppressWarnings({ "unchecked", "rawtypes" }) + ParameterImpl(String name, DataType type, boolean isDefaulted, Converter converter) { this.name = name; - this.type = type; this.isDefaulted = isDefaulted; + this.type = converter == null + ? (DataType) type + : type.asConvertedDataType((Converter) converter); } @Override diff --git a/jOOQ/src/main/java/org/jooq/impl/UDTFieldImpl.java b/jOOQ/src/main/java/org/jooq/impl/UDTFieldImpl.java index b68757ca8e..df6e5288d8 100644 --- a/jOOQ/src/main/java/org/jooq/impl/UDTFieldImpl.java +++ b/jOOQ/src/main/java/org/jooq/impl/UDTFieldImpl.java @@ -42,6 +42,7 @@ package org.jooq.impl; import org.jooq.Context; +import org.jooq.Converter; import org.jooq.DataType; import org.jooq.UDT; import org.jooq.UDTField; @@ -58,8 +59,8 @@ class UDTFieldImpl, T> extends AbstractField implement private final UDT udt; - UDTFieldImpl(String name, DataType type, UDT udt) { - super(name, type); + UDTFieldImpl(String name, DataType type, UDT udt, String comment, Converter converter) { + super(name, type, comment, converter); this.udt = udt; diff --git a/jOOQ/src/main/java/org/jooq/impl/UDTImpl.java b/jOOQ/src/main/java/org/jooq/impl/UDTImpl.java index 5e5c0f80ae..1a770c59a3 100644 --- a/jOOQ/src/main/java/org/jooq/impl/UDTImpl.java +++ b/jOOQ/src/main/java/org/jooq/impl/UDTImpl.java @@ -42,6 +42,7 @@ package org.jooq.impl; import org.jooq.Clause; import org.jooq.Context; +import org.jooq.Converter; import org.jooq.DataType; import org.jooq.Field; import org.jooq.Record; @@ -156,7 +157,36 @@ public class UDTImpl> extends AbstractQueryPart implement * @param type The data type of the field */ protected static final , T> UDTField createField(String name, DataType type, UDT udt) { - return new UDTFieldImpl(name, type, udt); + return createField(name, type, udt, "", null); + } + + /** + * Subclasses may call this method to create {@link UDTField} objects that + * are linked to this table. + * + * @param name The name of the field (case-sensitive!) + * @param type The data type of the field + */ + protected static final , T> UDTField createField(String name, DataType type, UDT udt, String comment) { + return createField(name, type, udt, comment, null); + } + + /** + * Subclasses may call this method to create {@link UDTField} objects that + * are linked to this table. + * + * @param name The name of the field (case-sensitive!) + * @param type The data type of the field + */ + @SuppressWarnings("unchecked") + protected static final , T, U> UDTField createField(String name, DataType type, UDT udt, String comment, Converter converter) { + final DataType actualType = converter == null + ? (DataType) type + : type.asConvertedDataType(converter); + + final UDTFieldImpl udtField = new UDTFieldImpl(name, actualType, udt, comment, converter); + + return udtField; } // ------------------------------------------------------------------------