From 82d210d0d4ae3a07fc1d190ab5253241333decbe Mon Sep 17 00:00:00 2001 From: Lukas Eder Date: Thu, 5 Sep 2024 14:00:39 +0200 Subject: [PATCH] [jOOQ/jOOQ#644] KotlinGenerator fixes for POJO hierarchy In Kotlin, classes and attributes have to be open to be overridden, and their overriding attributes have to declare this. Also, the super constructor must be called explicitly --- .../java/org/jooq/codegen/JavaGenerator.java | 25 +++++++++++++++---- 1 file changed, 20 insertions(+), 5 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 a57dd5d41b..f6524feefd 100644 --- a/jOOQ-codegen/src/main/java/org/jooq/codegen/JavaGenerator.java +++ b/jOOQ-codegen/src/main/java/org/jooq/codegen/JavaGenerator.java @@ -2302,7 +2302,7 @@ public class JavaGenerator extends AbstractGenerator { } } - private final boolean udtAttributeOverride(TypedElementDefinition column) { + private final boolean udtAttributeOverride(Definition column) { if (column instanceof AttributeDefinition a) { UDTDefinition s = a.getContainer().getSupertype(); @@ -2317,6 +2317,10 @@ public class JavaGenerator extends AbstractGenerator { return definition instanceof UDTDefinition u ? u.getSupertype() : null; } + private final List udtSubtypes(Definition definition) { + return definition instanceof UDTDefinition u ? u.getSubtypes() : Collections.emptyList(); + } + @FunctionalInterface private interface EmbeddableFilter { void accept(List result, Set duplicates, int index, EmbeddableDefinition embeddable); @@ -5795,9 +5799,17 @@ public class JavaGenerator extends AbstractGenerator { : ""; final String superName = udtSupertype(tableUdtOrEmbeddable) != null - ? out.ref(getStrategy().getFullJavaClassName(udtSupertype(tableUdtOrEmbeddable), Mode.POJO)) + ? out.ref(getStrategy().getFullJavaClassName(udtSupertype(tableUdtOrEmbeddable), Mode.POJO)) + (kotlin + ? "(" + udtSupertype(tableUdtOrEmbeddable) + .getAttributes() + .stream() + .map(a -> getStrategy().getJavaMemberName(a, Mode.POJO)) + .collect(joining(", ")) + + ")" + : "") : out.ref(getStrategy().getJavaClassExtends(tableUdtOrEmbeddable, Mode.POJO)); final List interfaces = out.ref(getStrategy().getJavaClassImplements(tableUdtOrEmbeddable, Mode.POJO)); + final boolean open = !udtSubtypes(tableUdtOrEmbeddable).isEmpty(); final String abstract_ = ""; // [#644] TODO Get this to work // tableUdtOrEmbeddable instanceof UDTDefinition && !((UDTDefinition) tableUdtOrEmbeddable).isInstantiable() ? "abstract " : ""; @@ -5839,12 +5851,14 @@ public class JavaGenerator extends AbstractGenerator { out.println(")[[before= extends ][%s]][[before= with ][separator= with ][%s]] {", first(superTypes), remaining(superTypes)); } else if (kotlin) { - out.println("%s%s%sclass %s(", visibility(), abstract_, (generatePojosAsKotlinDataClasses() ? "data " : ""), className); + out.println("%s%s%s%sclass %s(", visibility(), abstract_, open ? "open " : "", (generatePojosAsKotlinDataClasses() ? "data " : ""), className); forEach(replacingEmbeddablesAndUnreplacedColumns, (column, separator) -> { final String member = getStrategy().getJavaMemberName(column, Mode.POJO); final String nullability = kotlinNullability(out, column, Mode.POJO); - final boolean override = getStrategy().getJavaMemberOverride(column, Mode.POJO); + final boolean override = + udtAttributeOverride(column) + || getStrategy().getJavaMemberOverride(column, Mode.POJO); if (column instanceof ColumnDefinition) printColumnJPAAnnotation(out, (ColumnDefinition) column); @@ -5855,9 +5869,10 @@ public class JavaGenerator extends AbstractGenerator { printKotlinSetterAnnotation(out, ted, Mode.POJO); } - out.println("%s%s%s %s: %s%s%s%s", + out.println("%s%s%s%s %s: %s%s%s%s", visibility(generateInterfaces()), generateInterfaces() || override ? "override " : "", + open && !override ? "open " : "", generateImmutablePojos() ? "val" : "var", member, getJavaTypeRef(column, out, Mode.POJO),