diff --git a/jOOQ-codegen/src/main/java/org/jooq/codegen/JavaGenerator.java b/jOOQ-codegen/src/main/java/org/jooq/codegen/JavaGenerator.java index 64f8641945..aac7f364f7 100644 --- a/jOOQ-codegen/src/main/java/org/jooq/codegen/JavaGenerator.java +++ b/jOOQ-codegen/src/main/java/org/jooq/codegen/JavaGenerator.java @@ -52,6 +52,8 @@ import static org.jooq.SQLDialect.MYSQL; import static org.jooq.SQLDialect.POSTGRES; import static org.jooq.SQLDialect.YUGABYTEDB; import static org.jooq.SortOrder.DESC; +import static org.jooq.codegen.GeneratorStrategy.Mode.POJO; +import static org.jooq.codegen.GeneratorStrategy.Mode.RECORD; import static org.jooq.codegen.Language.JAVA; import static org.jooq.codegen.Language.KOTLIN; import static org.jooq.codegen.Language.SCALA; @@ -89,6 +91,7 @@ import java.util.Set; import java.util.function.BiConsumer; import java.util.function.Consumer; import java.util.function.Function; +import java.util.function.Supplier; import java.util.regex.Matcher; import java.util.regex.Pattern; import java.util.stream.Collectors; @@ -1602,14 +1605,14 @@ public class JavaGenerator extends AbstractGenerator { protected void generateRecord(TableDefinition table) { - JavaWriter out = newJavaWriter(getFile(table, Mode.RECORD)); + JavaWriter out = newJavaWriter(table, Mode.RECORD); log.info("Generating record", out.file().getName()); generateRecord0(table, out); closeJavaWriter(out); } protected void generateUDTRecord(UDTDefinition udt) { - JavaWriter out = newJavaWriter(getFile(udt, Mode.RECORD)); + JavaWriter out = newJavaWriter(udt, Mode.RECORD); log.info("Generating record", out.file().getName()); generateRecord0(udt, out); closeJavaWriter(out); @@ -2988,21 +2991,21 @@ public class JavaGenerator extends AbstractGenerator { } protected void generateInterface(TableDefinition table) { - JavaWriter out = newJavaWriter(getFile(table, Mode.INTERFACE)); + JavaWriter out = newJavaWriter(table, Mode.INTERFACE); log.info("Generating interface", out.file().getName()); generateInterface(table, out); closeJavaWriter(out); } protected void generateUDTInterface(UDTDefinition udt) { - JavaWriter out = newJavaWriter(getFile(udt, Mode.INTERFACE)); + JavaWriter out = newJavaWriter(udt, Mode.INTERFACE); log.info("Generating interface", out.file().getName()); generateInterface0(udt, out); closeJavaWriter(out); } protected void generateEmbeddableInterface(EmbeddableDefinition embeddable) { - JavaWriter out = newJavaWriter(getFile(embeddable, Mode.INTERFACE)); + JavaWriter out = newJavaWriter(embeddable, Mode.INTERFACE); log.info("Generating interface", out.file().getName()); generateInterface0(embeddable, out); closeJavaWriter(out); @@ -3271,7 +3274,7 @@ public class JavaGenerator extends AbstractGenerator { @SuppressWarnings("unused") protected void generateUDT(SchemaDefinition schema, UDTDefinition udt) { - JavaWriter out = newJavaWriter(getFile(udt)); + JavaWriter out = newJavaWriter(udt); out.refConflicts(getStrategy().getJavaIdentifiers(udt.getAttributes())); log.info("Generating UDT ", out.file().getName()); @@ -3440,7 +3443,7 @@ public class JavaGenerator extends AbstractGenerator { @SuppressWarnings("unused") protected void generateUDTPath(SchemaDefinition schema, UDTDefinition udt) { - JavaWriter out = newJavaWriter(getFile(udt, Mode.PATH)); + JavaWriter out = newJavaWriter(udt, Mode.PATH); out.refConflicts(getStrategy().getJavaIdentifiers(udt.getAttributes())); log.info("Generating UDT Path", out.file().getName()); @@ -3894,7 +3897,7 @@ public class JavaGenerator extends AbstractGenerator { @SuppressWarnings("unused") protected void generateArray(SchemaDefinition schema, ArrayDefinition array) { - JavaWriter out = newJavaWriter(getFile(array, Mode.RECORD)); + JavaWriter out = newJavaWriter(getFile(array, Mode.RECORD), Mode.RECORD); log.info("Generating ARRAY", out.file().getName()); generateArray(array, out); closeJavaWriter(out); @@ -4063,7 +4066,7 @@ public class JavaGenerator extends AbstractGenerator { getStrategy().setTargetLanguage(language); } - JavaWriter out = newJavaWriter(getFile(e, Mode.ENUM)); + JavaWriter out = newJavaWriter(e, Mode.ENUM); log.info("Generating ENUM", out.file().getName()); generateEnum(e, out); closeJavaWriter(out); @@ -4586,7 +4589,7 @@ public class JavaGenerator extends AbstractGenerator { } protected void generateSyntheticDao(DefaultSyntheticDaoDefinition dao) { - JavaWriter out = newJavaWriter(getFile(dao, Mode.SYNTHETIC_DAO)); + JavaWriter out = newJavaWriter(dao, Mode.SYNTHETIC_DAO); log.info("Generating Synthetic DAO", out.file().getName()); generateSyntheticDao(dao, out); closeJavaWriter(out); @@ -5043,7 +5046,7 @@ public class JavaGenerator extends AbstractGenerator { protected void generateSpringDaoClassFooter(CatalogDefinition catalog, JavaWriter out) {} protected void generateDao(TableDefinition table) { - JavaWriter out = newJavaWriter(getFile(table, Mode.DAO)); + JavaWriter out = newJavaWriter(table, Mode.DAO); log.info("Generating DAO", out.file().getName()); generateDao(table, out); closeJavaWriter(out); @@ -5388,21 +5391,21 @@ public class JavaGenerator extends AbstractGenerator { } protected void generatePojo(TableDefinition table) { - JavaWriter out = newJavaWriter(getFile(table, Mode.POJO)); + JavaWriter out = newJavaWriter(table, Mode.POJO); log.info("Generating POJO", out.file().getName()); generatePojo(table, out); closeJavaWriter(out); } protected void generateEmbeddablePojo(EmbeddableDefinition embeddable) { - JavaWriter out = newJavaWriter(getFile(embeddable, Mode.POJO)); + JavaWriter out = newJavaWriter(embeddable, Mode.POJO); log.info("Generating POJO", out.file().getName()); generatePojo0(embeddable, out); closeJavaWriter(out); } protected void generateUDTPojo(UDTDefinition udt) { - JavaWriter out = newJavaWriter(getFile(udt, Mode.POJO)); + JavaWriter out = newJavaWriter(udt, Mode.POJO); log.info("Generating POJO", out.file().getName()); generatePojo0(udt, out); closeJavaWriter(out); @@ -6322,7 +6325,7 @@ public class JavaGenerator extends AbstractGenerator { @SuppressWarnings("unused") protected void generateTable(SchemaDefinition schema, TableDefinition table) { - JavaWriter out = newJavaWriter(getFile(table)); + JavaWriter out = newJavaWriter(table); out.refConflicts(getStrategy().getJavaIdentifiers(table.getColumns())); out.refConflicts(getStrategy().getJavaIdentifiers(table.getReferencedEmbeddables())); @@ -7865,7 +7868,7 @@ public class JavaGenerator extends AbstractGenerator { @SuppressWarnings("unused") protected void generateEmbeddable(SchemaDefinition schema, EmbeddableDefinition embeddable) { - JavaWriter out = newJavaWriter(getFile(embeddable, Mode.RECORD)); + JavaWriter out = newJavaWriter(embeddable, Mode.RECORD); log.info("Generating embeddable", out.file().getName()); generateRecord0(embeddable, out); closeJavaWriter(out); @@ -8419,7 +8422,7 @@ public class JavaGenerator extends AbstractGenerator { } protected void generateCatalog(CatalogDefinition catalog) { - JavaWriter out = newJavaWriter(getFile(catalog)); + JavaWriter out = newJavaWriter(catalog); log.info(""); log.info("Generating catalog", out.file().getName()); log.info("=========================================================="); @@ -8546,7 +8549,7 @@ public class JavaGenerator extends AbstractGenerator { } protected void generateSchema(SchemaDefinition schema) { - JavaWriter out = newJavaWriter(getFile(schema)); + JavaWriter out = newJavaWriter(schema); log.info("Generating schema", out.file().getName()); log.info("----------------------------------------------------------"); generateSchema(schema, out); @@ -9244,7 +9247,7 @@ public class JavaGenerator extends AbstractGenerator { @SuppressWarnings("unused") protected void generateRoutine(SchemaDefinition schema, RoutineDefinition routine) { - JavaWriter out = newJavaWriter(getFile(routine)); + JavaWriter out = newJavaWriter(routine); log.info("Generating routine", out.file().getName()); if (log.isDebugEnabled()) @@ -10449,6 +10452,27 @@ public class JavaGenerator extends AbstractGenerator { public String ref(Class type) { return out.ref(type); } + + @Override + public T resolveDefinedType(Supplier supplier) { + + // [#15553] Converter and Binding related imports shouldn't appear here + if (ignoreImports(mode) || mode == null && ignoreImports(out.mode())) { + try { + out.ignoreImports(true); + return supplier.get(); + } + finally { + out.ignoreImports(false); + } + } + else + return supplier.get(); + } + + private boolean ignoreImports(Mode m) { + return m == POJO || m == RECORD; + } } protected JavaTypeResolver resolver(JavaWriter out) { @@ -10968,8 +10992,22 @@ public class JavaGenerator extends AbstractGenerator { // [#3880] Users may need to call this method protected JavaWriter newJavaWriter(File file) { + return newJavaWriter(file, null); + } + + // [#3880] Users may need to call this method + protected JavaWriter newJavaWriter(Definition definition) { + return newJavaWriter(getFile(definition)); + } + + // [#3880] Users may need to call this method + protected JavaWriter newJavaWriter(Definition definition, Mode mode) { + return newJavaWriter(getFile(definition, mode), mode); + } + + protected JavaWriter newJavaWriter(File file, Mode mode) { file = fixSuffix(file); - JavaWriter result = new JavaWriter(file, generateFullyQualifiedTypes(), targetEncoding, generateJavadoc(), fileCache, generatedSerialVersionUID()); + JavaWriter result = new JavaWriter(file, generateFullyQualifiedTypes(), targetEncoding, generateJavadoc(), fileCache, generatedSerialVersionUID(), mode); if (generateIndentation != null) result.tabString(generateIndentation); diff --git a/jOOQ-codegen/src/main/java/org/jooq/codegen/JavaWriter.java b/jOOQ-codegen/src/main/java/org/jooq/codegen/JavaWriter.java index 09a286c5c7..351783f0f9 100644 --- a/jOOQ-codegen/src/main/java/org/jooq/codegen/JavaWriter.java +++ b/jOOQ-codegen/src/main/java/org/jooq/codegen/JavaWriter.java @@ -19,6 +19,7 @@ import java.util.regex.Matcher; import java.util.regex.Pattern; import java.util.stream.Collectors; +import org.jooq.codegen.GeneratorStrategy.Mode; import org.jooq.meta.jaxb.GeneratedSerialVersionUID; import org.jooq.tools.StringUtils; @@ -46,6 +47,8 @@ public class JavaWriter extends GeneratorWriter { private final boolean isScala; private final boolean isKotlin; private final GeneratedSerialVersionUID generatedSerialVersionUID; + private final Mode mode; + private boolean ignoreImports; public JavaWriter(File file, String fullyQualifiedTypes) { this(file, fullyQualifiedTypes, null); @@ -64,6 +67,10 @@ public class JavaWriter extends GeneratorWriter { } public JavaWriter(File file, String fullyQualifiedTypes, String encoding, boolean javadoc, Files files, GeneratedSerialVersionUID generatedSerialVersionUID) { + this(file, fullyQualifiedTypes, encoding, javadoc, files, generatedSerialVersionUID, null); + } + + public JavaWriter(File file, String fullyQualifiedTypes, String encoding, boolean javadoc, Files files, GeneratedSerialVersionUID generatedSerialVersionUID, Mode mode) { super(file, encoding, files); this.className = file.getName().replaceAll("\\.(java|scala|kt)$", ""); @@ -74,6 +81,7 @@ public class JavaWriter extends GeneratorWriter { this.fullyQualifiedTypes = fullyQualifiedTypes == null ? null : Pattern.compile(fullyQualifiedTypes); this.javadoc = javadoc; this.generatedSerialVersionUID = generatedSerialVersionUID; + this.mode = mode; if (isJava || isKotlin) tabString(" "); @@ -131,6 +139,10 @@ public class JavaWriter extends GeneratorWriter { .replace("\\u002a\\u002f", "\\u002a \\u002f"); } + public Mode mode() { + return mode; + } + public JavaWriter header(String header, Object... args) { println(); println("// -------------------------------------------------------------------------"); @@ -261,6 +273,9 @@ public class JavaWriter extends GeneratorWriter { @Override protected List ref(List clazz, int keepSegments) { + if (ignoreImports) + return super.ref(clazz, keepSegments); + List result = new ArrayList<>(clazz == null ? 0 : clazz.size()); if (clazz != null) { @@ -358,4 +373,8 @@ public class JavaWriter extends GeneratorWriter { return c; } + + public void ignoreImports(boolean ignoreImports) { + this.ignoreImports = ignoreImports; + } } diff --git a/jOOQ-meta/src/main/java/org/jooq/meta/AbstractTypedElementDefinition.java b/jOOQ-meta/src/main/java/org/jooq/meta/AbstractTypedElementDefinition.java index ae7c4dd530..19718b8bb3 100644 --- a/jOOQ-meta/src/main/java/org/jooq/meta/AbstractTypedElementDefinition.java +++ b/jOOQ-meta/src/main/java/org/jooq/meta/AbstractTypedElementDefinition.java @@ -147,10 +147,7 @@ public abstract class AbstractTypedElementDefinition @Override public DataTypeDefinition getType(JavaTypeResolver resolver) { - if (resolvedType == null) - resolvedType = mapDefinedType(container, this, definedType, resolver); - - return resolvedType; + return mapDefinedType(container, this, definedType, resolver); } @Override @@ -182,6 +179,10 @@ public abstract class AbstractTypedElementDefinition } public static final DataTypeDefinition mapDefinedType(Definition container, Definition child, DataTypeDefinition definedType, JavaTypeResolver resolver) { + return resolver.resolveDefinedType(() -> mapDefinedType0(container, child, definedType, resolver)); + } + + static final DataTypeDefinition mapDefinedType0(Definition container, Definition child, DataTypeDefinition definedType, JavaTypeResolver resolver) { DataTypeDefinition result = definedType; Database db = container.getDatabase(); diff --git a/jOOQ-meta/src/main/java/org/jooq/meta/DefaultJavaTypeResolver.java b/jOOQ-meta/src/main/java/org/jooq/meta/DefaultJavaTypeResolver.java index 32604b581a..1aa3b1d5b1 100644 --- a/jOOQ-meta/src/main/java/org/jooq/meta/DefaultJavaTypeResolver.java +++ b/jOOQ-meta/src/main/java/org/jooq/meta/DefaultJavaTypeResolver.java @@ -37,6 +37,8 @@ */ package org.jooq.meta; +import java.util.function.Supplier; + import org.jooq.Name; final class DefaultJavaTypeResolver implements JavaTypeResolver { @@ -72,4 +74,9 @@ final class DefaultJavaTypeResolver implements JavaTypeResolver { public String constructorCall(String type) { return "new " + type; } + + @Override + public T resolveDefinedType(Supplier supplier) { + return supplier.get(); + } } \ No newline at end of file diff --git a/jOOQ-meta/src/main/java/org/jooq/meta/JavaTypeResolver.java b/jOOQ-meta/src/main/java/org/jooq/meta/JavaTypeResolver.java index b45ea51b55..74e75512de 100644 --- a/jOOQ-meta/src/main/java/org/jooq/meta/JavaTypeResolver.java +++ b/jOOQ-meta/src/main/java/org/jooq/meta/JavaTypeResolver.java @@ -37,6 +37,8 @@ */ package org.jooq.meta; +import java.util.function.Supplier; + import org.jooq.Name; /** @@ -95,4 +97,10 @@ public interface JavaTypeResolver { * type, if necessary. */ String ref(Class type); + + /** + * Map a defined type to a user type, resolving converters and bindings, + * which may not need imports in some output modes. + */ + T resolveDefinedType(Supplier supplier); }