From 43d89b6bbed960b4dd5a8677fa1aa576fd437074 Mon Sep 17 00:00:00 2001 From: Lukas Eder Date: Tue, 14 Jul 2020 16:08:59 +0200 Subject: [PATCH] [jOOQ/jOOQ#10394] and related flags implemented incorrectly in JavaGenerator --- .../java/org/jooq/codegen/JavaGenerator.java | 105 +++++++----------- .../java/org/jooq/codegen/JavaWriter.java | 20 +++- 2 files changed, 61 insertions(+), 64 deletions(-) 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 6894c78c0d..425133a4a4 100644 --- a/jOOQ-codegen/src/main/java/org/jooq/codegen/JavaGenerator.java +++ b/jOOQ-codegen/src/main/java/org/jooq/codegen/JavaGenerator.java @@ -50,8 +50,7 @@ import static org.jooq.codegen.AbstractGenerator.Language.SCALA; import static org.jooq.codegen.GenerationUtil.convertToIdentifier; import static org.jooq.impl.DSL.name; import static org.jooq.meta.AbstractTypedElementDefinition.getDataType; -import static org.jooq.tools.StringUtils.defaultIfBlank; -import static org.jooq.tools.StringUtils.defaultString; +import static org.jooq.tools.StringUtils.isBlank; import java.beans.ConstructorProperties; import java.io.File; @@ -1836,7 +1835,6 @@ public class JavaGenerator extends AbstractGenerator { } private final void generateRecordSetter0(TypedElementDefinition column, int index, JavaWriter out) { - final String comment = StringUtils.defaultString(column.getComment()); final String className = getStrategy().getJavaClassName(column.getContainer(), Mode.RECORD); final String setterReturnType = generateFluentSetters() ? className : tokenVoid; final String setter = getStrategy().getJavaSetterName(column, Mode.RECORD); @@ -1851,7 +1849,7 @@ public class JavaGenerator extends AbstractGenerator { // We cannot have covariant setters for arrays because of type erasure if (!(generateInterfaces() && isArray)) { if (!printDeprecationIfUnknownType(out, typeFull)) - out.javadoc("Setter for %s.%s", name, columnComment(column, comment)); + out.javadoc("Setter for %s.[[before= ][%s]]", name, list(escapeEntities(comment(column)))); if (scala) { out.println("def %s(value: %s): %s = {", setter, type, setterReturnType); @@ -1892,7 +1890,7 @@ public class JavaGenerator extends AbstractGenerator { final String columnTypeInterface = out.ref(getJavaType(column.getType(resolver(Mode.INTERFACE)), Mode.INTERFACE)); if (!printDeprecationIfUnknownType(out, columnTypeFull)) - out.javadoc("Setter for %s.%s", name, defaultIfBlank(" " + comment, "")); + out.javadoc("Setter for %s.[[before= ][%s]]", name, list(escapeEntities(comment(column)))); out.override(); @@ -1974,14 +1972,13 @@ public class JavaGenerator extends AbstractGenerator { } private final void generateRecordGetter0(TypedElementDefinition column, int index, JavaWriter out) { - final String comment = StringUtils.defaultString(column.getComment()); final String getter = getStrategy().getJavaGetterName(column, Mode.RECORD); final String typeFull = getJavaType(column.getType(resolver())); final String type = out.ref(typeFull); final String name = column.getQualifiedOutputName(); if (!printDeprecationIfUnknownType(out, typeFull)) - out.javadoc("Getter for %s.%s", name, columnComment(column, comment)); + out.javadoc("Getter for %s.[[before= ][%s]]", name, list(escapeEntities(comment(column)))); if (column instanceof ColumnDefinition) printColumnJPAAnnotation(out, (ColumnDefinition) column); @@ -2210,7 +2207,6 @@ public class JavaGenerator extends AbstractGenerator { private final void generateInterfaceSetter0(TypedElementDefinition column, @SuppressWarnings("unused") int index, JavaWriter out) { final String className = getStrategy().getJavaClassName(column.getContainer(), Mode.INTERFACE); - final String comment = StringUtils.defaultString(column.getComment()); final String setterReturnType = generateFluentSetters() ? className : tokenVoid; final String setter = getStrategy().getJavaSetterName(column, Mode.INTERFACE); final String typeFull = getJavaType(column.getType(resolver(Mode.INTERFACE)), Mode.INTERFACE); @@ -2218,7 +2214,7 @@ public class JavaGenerator extends AbstractGenerator { final String name = column.getQualifiedOutputName(); if (!printDeprecationIfUnknownType(out, typeFull)) - out.javadoc("Setter for %s.%s", name, columnComment(column, comment)); + out.javadoc("Setter for %s.[[before= ][%s]]", name, list(escapeEntities(comment(column)))); if (scala) { out.println("def %s(value: %s): %s", setter, type, setterReturnType); @@ -2248,14 +2244,13 @@ public class JavaGenerator extends AbstractGenerator { } private final void generateInterfaceGetter0(TypedElementDefinition column, @SuppressWarnings("unused") int index, JavaWriter out) { - final String comment = StringUtils.defaultString(column.getComment()); final String getter = getStrategy().getJavaGetterName(column, Mode.INTERFACE); final String typeFull = getJavaType(column.getType(resolver(Mode.INTERFACE)), Mode.INTERFACE); final String type = out.ref(typeFull); final String name = column.getQualifiedOutputName(); if (!printDeprecationIfUnknownType(out, typeFull)) - out.javadoc("Getter for %s.%s", name, columnComment(column, comment)); + out.javadoc("Getter for %s.[[before= ][%s]]", name, list(escapeEntities(comment(column)))); if (column instanceof ColumnDefinition) printColumnJPAAnnotation(out, (ColumnDefinition) column); @@ -2271,19 +2266,6 @@ public class JavaGenerator extends AbstractGenerator { out.println("public %s %s();", type, getter); } - private String columnComment(TypedElementDefinition column, String comment) { - return column instanceof ColumnDefinition && generateCommentsOnColumns() - || column instanceof AttributeDefinition && generateCommentsOnAttributes() - ? defaultIfBlank(" " + escapeEntities(comment), "") - : ""; - } - - private String parameterComment(String comment) { - return generateCommentsOnParameters() - ? defaultIfBlank(" " + escapeEntities(comment), "") - : ""; - } - /** * Subclasses may override this method to provide interface class footer * code. @@ -2342,9 +2324,8 @@ public class JavaGenerator extends AbstractGenerator { for (AttributeDefinition attribute : udt.getAttributes()) { final String attrId = out.ref(getStrategy().getJavaIdentifier(attribute), 2); - final String attrComment = StringUtils.defaultString(attribute.getComment()); - out.javadoc("The attribute %s.%s", attribute.getQualifiedOutputName(), columnComment(attribute, attrComment)); + out.javadoc("The attribute %s.[[before= ][%s]]", attribute.getQualifiedOutputName(), list(escapeEntities(comment(attribute)))); out.println("val %s = %s.%s", attrId, udtId, attrId); } @@ -2378,7 +2359,6 @@ public class JavaGenerator extends AbstractGenerator { final String attrTypeRef = getJavaTypeReference(attribute.getDatabase(), attribute.getType(resolver())); final String attrId = out.ref(getStrategy().getJavaIdentifier(attribute), 2); final String attrName = attribute.getName(); - final String attrComment = StringUtils.defaultString(attribute.getComment()); final List converter = out.ref(list(attribute.getType(resolver()).getConverter())); final List binding = out.ref(list(attribute.getType(resolver()).getBinding())); @@ -2389,7 +2369,7 @@ public class JavaGenerator extends AbstractGenerator { } else { if (!printDeprecationIfUnknownType(out, attrTypeFull)) - out.javadoc("The attribute %s.%s", attribute.getQualifiedOutputName(), columnComment(attribute, attrComment)); + out.javadoc("The attribute %s.[[before= ][%s]]", attribute.getQualifiedOutputName(), list(escapeEntities(comment(attribute)))); out.println("public static final %s<%s, %s> %s = createField(%s.name(\"%s\"), %s, %s, \"%s\"" + converterTemplate(converter) + converterTemplate(binding) + ");", UDTField.class, recordType, attrType, attrId, DSL.class, attrName, attrTypeRef, udtId, escapeString(""), converter, binding); @@ -3264,11 +3244,9 @@ public class JavaGenerator extends AbstractGenerator { final String referencedId = className.equals(id) ? getStrategy().getFullJavaIdentifier(table) : out.ref(getStrategy().getFullJavaIdentifier(table), 2); - final String comment = !StringUtils.isBlank(table.getComment()) && generateCommentsOnTables() - ? escapeEntities(table.getComment()) - : "The table " + table.getQualifiedOutputName() + "."; + final String comment = escapeEntities(comment(table)); - out.javadoc(comment); + out.javadoc(isBlank(comment) ? "The table " + table.getQualifiedOutputName() + "." : comment); if (scala || kotlin) out.println("val %s = %s", id, referencedId); @@ -3856,7 +3834,6 @@ public class JavaGenerator extends AbstractGenerator { } private final void generatePojoGetter0(TypedElementDefinition column, @SuppressWarnings("unused") int index, JavaWriter out) { - final String comment = StringUtils.defaultString(column.getComment()); final String columnTypeFull = getJavaType(column.getType(resolver(Mode.POJO)), Mode.POJO); final String columnType = out.ref(columnTypeFull); final String columnGetter = getStrategy().getJavaGetterName(column, Mode.POJO); @@ -3865,7 +3842,7 @@ public class JavaGenerator extends AbstractGenerator { // Getter if (!printDeprecationIfUnknownType(out, columnTypeFull)) - out.javadoc("Getter for %s.%s", name, columnComment(column, comment)); + out.javadoc("Getter for %s.[[before= ][%s]]", name, list(escapeEntities(comment(column)))); if (column instanceof ColumnDefinition) printColumnJPAAnnotation(out, (ColumnDefinition) column); @@ -3899,7 +3876,6 @@ public class JavaGenerator extends AbstractGenerator { } private final void generatePojoSetter0(TypedElementDefinition column, @SuppressWarnings("unused") int index, JavaWriter out) { - final String comment = StringUtils.defaultString(column.getComment()); final String className = getStrategy().getJavaClassName(column.getContainer(), Mode.POJO); final String columnTypeFull = getJavaType(column.getType(resolver(Mode.POJO)), Mode.POJO); final String columnType = out.ref(columnTypeFull); @@ -3913,7 +3889,7 @@ public class JavaGenerator extends AbstractGenerator { // We cannot have covariant setters for arrays because of type erasure if (!(generateInterfaces() && isUDTArray)) { if (!printDeprecationIfUnknownType(out, columnTypeFull)) - out.javadoc("Setter for %s.%s", name, columnComment(column, comment)); + out.javadoc("Setter for %s.[[before= ][%s]]", name, list(escapeEntities(comment(column)))); if (scala) { out.println("def %s(%s: %s): %s = {", columnSetter, columnMember, columnType, columnSetterReturnType); @@ -4303,7 +4279,6 @@ public class JavaGenerator extends AbstractGenerator { final String recordType = out.ref(getStrategy().getFullJavaClassName(table, Mode.RECORD)); final List interfaces = out.ref(getStrategy().getJavaClassImplements(table, Mode.DEFAULT)); final String schemaId = out.ref(getStrategy().getFullJavaIdentifier(schema), 2); - final String comment = defaultString(table.getComment()); final String tableType = table.isTemporary() ? "temporaryTable" : table.isView() @@ -4348,7 +4323,7 @@ public class JavaGenerator extends AbstractGenerator { out.println("path,"); out.println("aliased,"); out.println("parameters,"); - out.println("%s.comment(\"%s\"),", DSL.class, escapeString(comment)); + out.println("%s.comment(\"%s\"),", DSL.class, escapeString(comment(table))); if (generateSourcesOnViews() && table.isView() && table.getSource() != null) out.println("%s.%s(\"%s\")", TableOptions.class, tableType, escapeString(table.getSource())); @@ -4371,7 +4346,7 @@ public class JavaGenerator extends AbstractGenerator { out.println("path,"); out.println("aliased,"); out.println("parameters,"); - out.println("%s.comment(\"%s\"),", DSL.class, escapeString(comment)); + out.println("%s.comment(\"%s\"),", DSL.class, escapeString(comment(table))); if (generateSourcesOnViews() && table.isView() && table.getSource() != null) out.println("%s.%s(\"%s\")", TableOptions.class, tableType, escapeString(table.getSource())); @@ -4398,27 +4373,26 @@ public class JavaGenerator extends AbstractGenerator { final String columnTypeRef = getJavaTypeReference(column.getDatabase(), column.getType(resolver())); final String columnId = out.ref(getStrategy().getJavaIdentifier(column), colRefSegments(column)); final String columnName = column.getName(); - final String columnComment = StringUtils.defaultString(column.getComment()); final List converter = out.ref(list(column.getType(resolver()).getConverter())); final List binding = out.ref(list(column.getType(resolver()).getBinding())); if (!printDeprecationIfUnknownType(out, columnTypeFull)) - out.javadoc("The column %s.%s", column.getQualifiedOutputName(), columnComment(column, columnComment)); + out.javadoc("The column %s.[[before= ][%s]]", column.getQualifiedOutputName(), list(escapeEntities(comment(column)))); if (scala) { out.println("val %s: %s[%s, %s] = createField(%s.name(\"%s\"), %s, \"%s\"" + converterTemplate(converter) + converterTemplate(binding) + ")", - columnId, TableField.class, recordType, columnType, DSL.class, columnName, columnTypeRef, escapeString(columnComment), converter, binding); + columnId, TableField.class, recordType, columnType, DSL.class, columnName, columnTypeRef, escapeString(comment(column)), converter, binding); } else if (kotlin) { out.println("val %s: %s<%s, %s?> = createField(%s.name(\"%s\"), %s, this, \"%s\"" + converterTemplate(converter) + converterTemplate(binding) + ")", - columnId, TableField.class, recordType, columnType, DSL.class, columnName, columnTypeRef, escapeString(columnComment), converter, binding); + columnId, TableField.class, recordType, columnType, DSL.class, columnName, columnTypeRef, escapeString(comment(column)), converter, binding); } else { String isStatic = generateInstanceFields() ? "" : "static "; String tableRef = generateInstanceFields() ? "this" : out.ref(getStrategy().getJavaIdentifier(table), 2); out.println("public %sfinal %s<%s, %s> %s = createField(%s.name(\"%s\"), %s, %s, \"%s\"" + converterTemplate(converter) + converterTemplate(binding) + ");", - isStatic, TableField.class, recordType, columnType, columnId, DSL.class, columnName, columnTypeRef, tableRef, escapeString(columnComment), converter, binding); + isStatic, TableField.class, recordType, columnType, columnId, DSL.class, columnName, columnTypeRef, tableRef, escapeString(comment(column)), converter, binding); } } @@ -4480,9 +4454,9 @@ public class JavaGenerator extends AbstractGenerator { out.println("private %s(%s alias, %s<%s> aliased, %s[] parameters) {", className, Name.class, Table.class, recordType, Field.class); if (generateSourcesOnViews() && table.isView() && table.getSource() != null) - out.println("super(alias, null, aliased, parameters, %s.comment(\"%s\"), %s.%s(\"%s\"));", DSL.class, escapeString(comment), TableOptions.class, tableType, escapeString(table.getSource())); + out.println("super(alias, null, aliased, parameters, %s.comment(\"%s\"), %s.%s(\"%s\"));", DSL.class, escapeString(comment(table)), TableOptions.class, tableType, escapeString(table.getSource())); else - out.println("super(alias, null, aliased, parameters, %s.comment(\"%s\"), %s.%s());", DSL.class, escapeString(comment), TableOptions.class, tableType); + out.println("super(alias, null, aliased, parameters, %s.comment(\"%s\"), %s.%s());", DSL.class, escapeString(comment(table)), TableOptions.class, tableType); out.println("}"); } @@ -5464,11 +5438,9 @@ public class JavaGenerator extends AbstractGenerator { String schemaShortId = out.ref(getStrategy().getFullJavaIdentifier(schema), 2); if (fieldNames.contains(schemaShortId.substring(0, schemaShortId.indexOf('.')))) schemaShortId = schemaFullId; - final String schemaComment = !StringUtils.isBlank(schema.getComment()) && generateCommentsOnSchemas() - ? escapeEntities(schema.getComment()) - : "The schema " + (!schema.getQualifiedOutputName().isEmpty() ? schema.getQualifiedOutputName() : schemaId) + "."; + final String schemaComment = escapeEntities(comment(schema)); - out.javadoc(schemaComment); + out.javadoc(isBlank(schemaComment) ? ("The schema " + (!schema.getQualifiedOutputName().isEmpty() ? schema.getQualifiedOutputName() : schemaId) + ".") : schemaComment); if (scala) out.println("val %s = %s", schemaId, schemaShortId); @@ -5573,11 +5545,9 @@ public class JavaGenerator extends AbstractGenerator { final String tableClassName = out.ref(getStrategy().getFullJavaClassName(table)); final String tableId = getStrategy().getJavaIdentifier(table); final String tableShortId = getShortId(out, memberNames, table); - final String tableComment = !StringUtils.isBlank(table.getComment()) && generateCommentsOnTables() - ? escapeEntities(table.getComment()) - : "The table " + table.getQualifiedOutputName() + "."; + final String tableComment = escapeEntities(comment(table)); - out.javadoc(tableComment); + out.javadoc(isBlank(tableComment) ? "The table " + table.getQualifiedOutputName() + "." : tableComment); if (scala) out.println("val %s = %s", tableId, tableShortId); @@ -6136,14 +6106,13 @@ public class JavaGenerator extends AbstractGenerator { final String paramTypeRef = getJavaTypeReference(parameter.getDatabase(), parameter.getType(resolver())); final String paramId = out.ref(getStrategy().getJavaIdentifier(parameter), 2); final String paramName = parameter.getName(); - final String paramComment = StringUtils.defaultString(parameter.getComment()); final String isDefaulted = parameter.isDefaulted() ? "true" : "false"; final String isUnnamed = parameter.isUnnamed() ? "true" : "false"; final List converter = out.ref(list(parameter.getType(resolver()).getConverter())); final List binding = out.ref(list(parameter.getType(resolver()).getBinding())); if (!printDeprecationIfUnknownType(out, paramTypeFull)) - out.javadoc("The parameter %s.%s", parameter.getQualifiedOutputName(), parameterComment(paramComment)); + out.javadoc("The parameter %s.[[before= ][%s]]", parameter.getQualifiedOutputName(), list(escapeEntities(comment(parameter)))); out.println("val %s: %s[%s] = %s.createParameter(\"%s\", %s, %s, %s" + converterTemplate(converter) + converterTemplate(binding) + ")", paramId, Parameter.class, paramType, Internal.class, escapeString(paramName), paramTypeRef, isDefaulted, isUnnamed, converter, binding); @@ -6182,14 +6151,13 @@ public class JavaGenerator extends AbstractGenerator { final String paramTypeRef = getJavaTypeReference(parameter.getDatabase(), parameter.getType(resolver())); final String paramId = getStrategy().getJavaIdentifier(parameter); final String paramName = parameter.getName(); - final String paramComment = StringUtils.defaultString(parameter.getComment()); final String isDefaulted = parameter.isDefaulted() ? "true" : "false"; final String isUnnamed = parameter.isUnnamed() ? "true" : "false"; final List converter = out.ref(list(parameter.getType(resolver()).getConverter())); final List binding = out.ref(list(parameter.getType(resolver()).getBinding())); if (!printDeprecationIfUnknownType(out, paramTypeFull)) - out.javadoc("The parameter %s.%s", parameter.getQualifiedOutputName(), parameterComment(paramComment)); + out.javadoc("The parameter %s.[[before= ][%s]]", parameter.getQualifiedOutputName(), list(escapeEntities(comment(parameter)))); if (kotlin) out.println("val %s: %s<%s?> = %s.createParameter(\"%s\", %s, %s, %s" + converterTemplate(converter) + converterTemplate(binding) + ")", @@ -6942,16 +6910,29 @@ public class JavaGenerator extends AbstractGenerator { printClassJavadoc(out, escapeEntities(definition.getComment())); } + private String comment(Definition definition) { + return definition instanceof CatalogDefinition && generateCommentsOnCatalogs() + || definition instanceof SchemaDefinition && generateCommentsOnSchemas() + || definition instanceof TableDefinition && generateCommentsOnTables() + || definition instanceof ColumnDefinition && generateCommentsOnColumns() + || definition instanceof UDTDefinition && generateCommentsOnUDTs() + || definition instanceof AttributeDefinition && generateCommentsOnAttributes() + || definition instanceof PackageDefinition && generateCommentsOnPackages() + || definition instanceof RoutineDefinition && generateCommentsOnRoutines() + || definition instanceof ParameterDefinition && generateCommentsOnParameters() + || definition instanceof SequenceDefinition && generateCommentsOnSequences() + ? StringUtils.defaultIfBlank(definition.getComment(), "") + : ""; + } + protected void printClassJavadoc(JavaWriter out, String comment) { if (generateJavadoc()) { out.println("/**"); - if (comment != null && comment.length() > 0) { + if (comment != null && comment.length() > 0) printJavadocParagraph(out, comment, ""); - } - else { + else out.println(" * This class is generated by jOOQ."); - } out.println(" */"); } 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 abf1c1a7bb..9d27dfac02 100644 --- a/jOOQ-codegen/src/main/java/org/jooq/codegen/JavaWriter.java +++ b/jOOQ-codegen/src/main/java/org/jooq/codegen/JavaWriter.java @@ -88,8 +88,7 @@ public class JavaWriter extends GeneratorWriter { String escaped = escapeJavadoc(string); Object[] escapedArgs = Arrays.copyOf(args, args.length); for (int i = 0; i < escapedArgs.length; i++) - if (escapedArgs[i] instanceof String) - escapedArgs[i] = escapeJavadoc((String) escapedArgs[i]); + escapedArgs[i] = escapeJavadoc(escapedArgs[i]); println("/**"); println(" * " + escaped, escapedArgs); @@ -99,6 +98,23 @@ public class JavaWriter extends GeneratorWriter { return this; } + @SuppressWarnings("unchecked") + static Object escapeJavadoc(Object object) { + if (object instanceof String) { + return escapeJavadoc((String) object); + } + else if (object instanceof List) { + List result = new ArrayList<>(); + + for (Object o : (List) object) + result.add(escapeJavadoc(o)); + + return result; + } + else + return object; + } + static String escapeJavadoc(String string) { // [#3450] [#4880] [#7693] Must not print */ inside Javadoc