From 58a538fb956061318fbc83754ba6911febbfc6ad Mon Sep 17 00:00:00 2001 From: lukaseder Date: Thu, 26 Apr 2018 16:04:25 +0200 Subject: [PATCH] [#7441] JavaGenerator should allow for overriding POJO constructor generation --- .../java/org/jooq/codegen/JavaGenerator.java | 206 ++++++++++-------- 1 file changed, 117 insertions(+), 89 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 924ab21a48..daef1f5c87 100644 --- a/jOOQ-codegen/src/main/java/org/jooq/codegen/JavaGenerator.java +++ b/jOOQ-codegen/src/main/java/org/jooq/codegen/JavaGenerator.java @@ -3137,35 +3137,101 @@ public class JavaGenerator extends AbstractGenerator { // --------------------------------------------------------------------- // Default constructor - if (!generateImmutablePojos()) { - out.println(); - - if (scala) { - - // [#3010] Invalid UDTs may have no attributes. Avoid generating this constructor in that case - int size = getTypedElements(tableOrUDT).size(); - if (size > 0) { - List nulls = new ArrayList(); - for (TypedElementDefinition column : getTypedElements(tableOrUDT)) - - // Avoid ambiguities between a single-T-value constructor - // and the copy constructor - if (size == 1) - nulls.add("null : " + out.ref(getJavaType(column.getType(resolver(Mode.POJO)), Mode.POJO))); - else - nulls.add("null"); - - out.tab(1).println("def this() = {", className); - out.tab(2).println("this([[%s]])", nulls); - out.tab(1).println("}"); - } - } - else { - out.tab(1).println("public %s() {}", className); - } - } + if (!generateImmutablePojos()) + generatePojoDefaultConstructor(tableOrUDT, out); // [#1363] [#7055] copy constructor + generatePojoCopyConstructor(tableOrUDT, out); + + // Multi-constructor + generatePojoMultiConstructor(tableOrUDT, out); + + List> elements = getTypedElements(tableOrUDT); + for (int i = 0; i < elements.size(); i++) { + TypedElementDefinition column = elements.get(i); + + if (tableOrUDT instanceof TableDefinition) + generatePojoGetter(column, i, out); + else + generateUDTPojoGetter(column, i, out); + + // Setter + if (!generateImmutablePojos()) + if (tableOrUDT instanceof TableDefinition) + generatePojoSetter(column, i, out); + else + generateUDTPojoSetter(column, i, out); + } + + if (generatePojosEqualsAndHashCode()) + generatePojoEqualsAndHashCode(tableOrUDT, out); + + if (generatePojosToString()) + generatePojoToString(tableOrUDT, out); + + if (generateInterfaces() && !generateImmutablePojos()) + printFromAndInto(out, tableOrUDT); + + if (tableOrUDT instanceof TableDefinition) + generatePojoClassFooter((TableDefinition) tableOrUDT, out); + else + generateUDTPojoClassFooter((UDTDefinition) tableOrUDT, out); + + out.println("}"); + closeJavaWriter(out); + } + /** + * Subclasses may override this method to provide their own pojo copy constructors. + */ + private void generatePojoMultiConstructor(Definition tableOrUDT, JavaWriter out) { + final String className = getStrategy().getJavaClassName(tableOrUDT, Mode.POJO); + + int maxLength = 0; + for (TypedElementDefinition column : getTypedElements(tableOrUDT)) + maxLength = Math.max(maxLength, out.ref(getJavaType(column.getType(resolver(Mode.POJO)), Mode.POJO)).length()); + + if (scala) { + } + + // [#3010] Invalid UDTs may have no attributes. Avoid generating this constructor in that case + // [#3176] Avoid generating constructors for tables with more than 255 columns (Java's method argument limit) + else if (getTypedElements(tableOrUDT).size() > 0 && + getTypedElements(tableOrUDT).size() < 256) { + out.println(); + out.tab(1).print("public %s(", className); + + String separator1 = ""; + for (TypedElementDefinition column : getTypedElements(tableOrUDT)) { + out.println(separator1); + + out.tab(2).print("%s %s", + StringUtils.rightPad(out.ref(getJavaType(column.getType(resolver(Mode.POJO)), Mode.POJO)), maxLength), + getStrategy().getJavaMemberName(column, Mode.POJO)); + separator1 = ","; + } + + out.println(); + out.tab(1).println(") {"); + + for (TypedElementDefinition column : getTypedElements(tableOrUDT)) { + final String columnMember = getStrategy().getJavaMemberName(column, Mode.POJO); + + out.tab(2).println("this.%s = %s;", columnMember, columnMember); + } + + out.tab(1).println("}"); + } + } + + /** + * Subclasses may override this method to provide their own pojo copy constructors. + */ + protected void generatePojoCopyConstructor(Definition tableOrUDT, JavaWriter out) { + final String className = getStrategy().getJavaClassName(tableOrUDT, Mode.POJO); + final String interfaceName = generateInterfaces() + ? out.ref(getStrategy().getFullJavaClassName(tableOrUDT, Mode.INTERFACE)) + : ""; + out.println(); if (scala) { @@ -3203,77 +3269,39 @@ public class JavaGenerator extends AbstractGenerator { out.tab(1).println("}"); } + } - // Multi-constructor + /** + * Subclasses may override this method to provide their own pojo default constructors. + */ + protected void generatePojoDefaultConstructor(Definition tableOrUDT, JavaWriter out) { + final String className = getStrategy().getJavaClassName(tableOrUDT, Mode.POJO); + + out.println(); if (scala) { - } - // [#3010] Invalid UDTs may have no attributes. Avoid generating this constructor in that case - // [#3176] Avoid generating constructors for tables with more than 255 columns (Java's method argument limit) - else if (getTypedElements(tableOrUDT).size() > 0 && - getTypedElements(tableOrUDT).size() < 256) { - out.println(); - out.tab(1).print("public %s(", className); + // [#3010] Invalid UDTs may have no attributes. Avoid generating this constructor in that case + int size = getTypedElements(tableOrUDT).size(); + if (size > 0) { + List nulls = new ArrayList(); + for (TypedElementDefinition column : getTypedElements(tableOrUDT)) - String separator1 = ""; - for (TypedElementDefinition column : getTypedElements(tableOrUDT)) { - out.println(separator1); + // Avoid ambiguities between a single-T-value constructor + // and the copy constructor + if (size == 1) + nulls.add("null : " + out.ref(getJavaType(column.getType(resolver(Mode.POJO)), Mode.POJO))); + else + nulls.add("null"); - out.tab(2).print("%s %s", - StringUtils.rightPad(out.ref(getJavaType(column.getType(resolver(Mode.POJO)), Mode.POJO)), maxLength), - getStrategy().getJavaMemberName(column, Mode.POJO)); - separator1 = ","; + out.tab(1).println("def this() = {", className); + out.tab(2).println("this([[%s]])", nulls); + out.tab(1).println("}"); } - - out.println(); - out.tab(1).println(") {"); - - for (TypedElementDefinition column : getTypedElements(tableOrUDT)) { - final String columnMember = getStrategy().getJavaMemberName(column, Mode.POJO); - - out.tab(2).println("this.%s = %s;", columnMember, columnMember); - } - - out.tab(1).println("}"); } - - List> elements = getTypedElements(tableOrUDT); - for (int i = 0; i < elements.size(); i++) { - TypedElementDefinition column = elements.get(i); - - if (tableOrUDT instanceof TableDefinition) - generatePojoGetter(column, i, out); - else - generateUDTPojoGetter(column, i, out); - - // Setter - if (!generateImmutablePojos()) - if (tableOrUDT instanceof TableDefinition) - generatePojoSetter(column, i, out); - else - generateUDTPojoSetter(column, i, out); + else { + out.tab(1).println("public %s() {}", className); } - - if (generatePojosEqualsAndHashCode()) { - generatePojoEqualsAndHashCode(tableOrUDT, out); - } - - if (generatePojosToString()) { - generatePojoToString(tableOrUDT, out); - } - - if (generateInterfaces() && !generateImmutablePojos()) { - printFromAndInto(out, tableOrUDT); - } - - if (tableOrUDT instanceof TableDefinition) - generatePojoClassFooter((TableDefinition) tableOrUDT, out); - else - generateUDTPojoClassFooter((UDTDefinition) tableOrUDT, out); - - out.println("}"); - closeJavaWriter(out); } /**