diff --git a/jOOQ-codegen/src/main/java/org/jooq/codegen/AbstractGenerator.java b/jOOQ-codegen/src/main/java/org/jooq/codegen/AbstractGenerator.java index ea25ec0464..d4ad451079 100644 --- a/jOOQ-codegen/src/main/java/org/jooq/codegen/AbstractGenerator.java +++ b/jOOQ-codegen/src/main/java/org/jooq/codegen/AbstractGenerator.java @@ -38,6 +38,9 @@ package org.jooq.codegen; import static java.lang.Boolean.TRUE; +import static org.jooq.codegen.AbstractGenerator.Language.JAVA; +import static org.jooq.codegen.AbstractGenerator.Language.KOTLIN; +import static org.jooq.codegen.AbstractGenerator.Language.SCALA; import java.io.File; import java.sql.Connection; @@ -87,6 +90,9 @@ abstract class AbstractGenerator implements Generator { boolean generateRecords = true; boolean generateRecordsImplementingRecordN = true; boolean generatePojos = false; + boolean generatePojosAsJavaRecordClasses = false; + boolean generatePojosAsScalaCaseClasses = true; + boolean generatePojosAsKotlinDataClasses = true; boolean generatePojosEqualsAndHashCode = false; boolean generatePojosToString = true; boolean generateImmutablePojos = false; @@ -500,7 +506,15 @@ abstract class AbstractGenerator implements Generator { // [#1339] When immutable POJOs are generated, POJOs must be generated // [#1280] When DAOs are generated, POJOs must be generated, too - return generatePojos || generateImmutablePojos || generateDaos; + // [#3713] Scala case classes + // [#10287] Java records + // [#10288] Kotlin data classes + return generatePojos + || generatePojosAsJavaRecordClasses && language == JAVA + || generatePojosAsScalaCaseClasses && language == SCALA + || generatePojosAsKotlinDataClasses && language == KOTLIN + || generateImmutablePojos + || generateDaos; } @Override @@ -508,6 +522,36 @@ abstract class AbstractGenerator implements Generator { this.generatePojos = generatePojos; } + @Override + public boolean generatePojosAsJavaRecordClasses() { + return generatePojosAsJavaRecordClasses; + } + + @Override + public void setGeneratePojosAsJavaRecordClasses(boolean pojosAsJavaRecordClasses) { + this.generatePojosAsJavaRecordClasses = pojosAsJavaRecordClasses; + } + + @Override + public boolean generatePojosAsScalaCaseClasses() { + return generatePojosAsScalaCaseClasses; + } + + @Override + public void setGeneratePojosAsScalaCaseClasses(boolean pojosAsScalaCaseClasses) { + this.generatePojosAsScalaCaseClasses = pojosAsScalaCaseClasses; + } + + @Override + public boolean generatePojosAsKotlinDataClasses() { + return generatePojosAsKotlinDataClasses; + } + + @Override + public void setGeneratePojosAsKotlinDataClasses(boolean pojosAsKotlinDataClasses) { + this.generatePojosAsKotlinDataClasses = pojosAsKotlinDataClasses; + } + @Override public boolean generateImmutablePojos() { return generateImmutablePojos; diff --git a/jOOQ-codegen/src/main/java/org/jooq/codegen/GenerationTool.java b/jOOQ-codegen/src/main/java/org/jooq/codegen/GenerationTool.java index 35ed10cc82..fecf737d4f 100644 --- a/jOOQ-codegen/src/main/java/org/jooq/codegen/GenerationTool.java +++ b/jOOQ-codegen/src/main/java/org/jooq/codegen/GenerationTool.java @@ -709,6 +709,12 @@ public class GenerationTool { generator.setGenerateRecordsImplementingRecordN(g.getGenerate().isRecordsImplementingRecordN()); if (g.getGenerate().isPojos() != null) generator.setGeneratePojos(g.getGenerate().isPojos()); + if (g.getGenerate().isPojosAsJavaRecordClasses() != null) + generator.setGeneratePojosAsJavaRecordClasses(g.getGenerate().isPojosAsJavaRecordClasses()); + if (g.getGenerate().isPojosAsScalaCaseClasses() != null) + generator.setGeneratePojosAsScalaCaseClasses(g.getGenerate().isPojosAsScalaCaseClasses()); + if (g.getGenerate().isPojosAsKotlinDataClasses() != null) + generator.setGeneratePojosAsKotlinDataClasses(g.getGenerate().isPojosAsKotlinDataClasses()); if (g.getGenerate().isImmutablePojos() != null) generator.setGenerateImmutablePojos(g.getGenerate().isImmutablePojos()); if (g.getGenerate().isSerializablePojos() != null) diff --git a/jOOQ-codegen/src/main/java/org/jooq/codegen/Generator.java b/jOOQ-codegen/src/main/java/org/jooq/codegen/Generator.java index d6576db29d..fb0ea4ae12 100644 --- a/jOOQ-codegen/src/main/java/org/jooq/codegen/Generator.java +++ b/jOOQ-codegen/src/main/java/org/jooq/codegen/Generator.java @@ -362,6 +362,42 @@ public interface Generator { */ void setGeneratePojos(boolean generatePojos); + /** + * Whether POJOs should be generated as Java records by the + * {@link JavaGenerator}. + */ + boolean generatePojosAsJavaRecordClasses(); + + /** + * Whether POJOs should be generated as Java records by the + * {@link JavaGenerator}. + */ + void setGeneratePojosAsJavaRecordClasses(boolean pojosAsJavaRecordClasses); + + /** + * Whether POJOs should be generated as Scala case classes by the + * {@link ScalaGenerator}. + */ + boolean generatePojosAsScalaCaseClasses(); + + /** + * Whether POJOs should be generated as Scala case classes by the + * {@link ScalaGenerator}. + */ + void setGeneratePojosAsScalaCaseClasses(boolean pojosAsScalaCaseClasses); + + /** + * Whether POJOs should be generated as Kotlin data classes by the + * {@link KotlinGenerator}. + */ + boolean generatePojosAsKotlinDataClasses(); + + /** + * Whether POJOs should be generated as Kotlin data classes by the + * {@link KotlinGenerator}. + */ + void setGeneratePojosAsKotlinDataClasses(boolean pojosAsKotlinDataClasses); + /** * Whether immutable POJO's should be generated in addition to records */ diff --git a/jOOQ-meta/src/main/java/org/jooq/meta/jaxb/Generate.java b/jOOQ-meta/src/main/java/org/jooq/meta/jaxb/Generate.java index 0f70bbcefa..48569b0207 100644 --- a/jOOQ-meta/src/main/java/org/jooq/meta/jaxb/Generate.java +++ b/jOOQ-meta/src/main/java/org/jooq/meta/jaxb/Generate.java @@ -92,6 +92,12 @@ public class Generate implements Serializable, XMLAppendable @XmlElement(defaultValue = "true") protected Boolean pojosToString = true; @XmlElement(defaultValue = "false") + protected Boolean pojosAsJavaRecordClasses = false; + @XmlElement(defaultValue = "true") + protected Boolean pojosAsScalaCaseClasses = true; + @XmlElement(defaultValue = "true") + protected Boolean pojosAsKotlinDataClasses = true; + @XmlElement(defaultValue = "false") protected Boolean immutablePojos = false; @XmlElement(defaultValue = "true") protected Boolean serializablePojos = true; @@ -896,6 +902,78 @@ public class Generate implements Serializable, XMLAppendable this.pojosToString = value; } + /** + * Generate POJOs as records, when using the JavaGenerator. + * + * @return + * possible object is + * {@link Boolean } + * + */ + public Boolean isPojosAsJavaRecordClasses() { + return pojosAsJavaRecordClasses; + } + + /** + * Sets the value of the pojosAsJavaRecordClasses property. + * + * @param value + * allowed object is + * {@link Boolean } + * + */ + public void setPojosAsJavaRecordClasses(Boolean value) { + this.pojosAsJavaRecordClasses = value; + } + + /** + * Generate POJOs as case classes, when using the ScalaGenerator. + * + * @return + * possible object is + * {@link Boolean } + * + */ + public Boolean isPojosAsScalaCaseClasses() { + return pojosAsScalaCaseClasses; + } + + /** + * Sets the value of the pojosAsScalaCaseClasses property. + * + * @param value + * allowed object is + * {@link Boolean } + * + */ + public void setPojosAsScalaCaseClasses(Boolean value) { + this.pojosAsScalaCaseClasses = value; + } + + /** + * Generate POJOs as data classes, when using the KotlinGenerator. + * + * @return + * possible object is + * {@link Boolean } + * + */ + public Boolean isPojosAsKotlinDataClasses() { + return pojosAsKotlinDataClasses; + } + + /** + * Sets the value of the pojosAsKotlinDataClasses property. + * + * @param value + * allowed object is + * {@link Boolean } + * + */ + public void setPojosAsKotlinDataClasses(Boolean value) { + this.pojosAsKotlinDataClasses = value; + } + /** * Generate immutable POJOs. * @@ -2233,6 +2311,21 @@ public class Generate implements Serializable, XMLAppendable return this; } + public Generate withPojosAsJavaRecordClasses(Boolean value) { + setPojosAsJavaRecordClasses(value); + return this; + } + + public Generate withPojosAsScalaCaseClasses(Boolean value) { + setPojosAsScalaCaseClasses(value); + return this; + } + + public Generate withPojosAsKotlinDataClasses(Boolean value) { + setPojosAsKotlinDataClasses(value); + return this; + } + public Generate withImmutablePojos(Boolean value) { setImmutablePojos(value); return this; @@ -2530,6 +2623,9 @@ public class Generate implements Serializable, XMLAppendable builder.append("pojos", pojos); builder.append("pojosEqualsAndHashCode", pojosEqualsAndHashCode); builder.append("pojosToString", pojosToString); + builder.append("pojosAsJavaRecordClasses", pojosAsJavaRecordClasses); + builder.append("pojosAsScalaCaseClasses", pojosAsScalaCaseClasses); + builder.append("pojosAsKotlinDataClasses", pojosAsKotlinDataClasses); builder.append("immutablePojos", immutablePojos); builder.append("serializablePojos", serializablePojos); builder.append("interfaces", interfaces); @@ -2870,6 +2966,33 @@ public class Generate implements Serializable, XMLAppendable return false; } } + if (pojosAsJavaRecordClasses == null) { + if (other.pojosAsJavaRecordClasses!= null) { + return false; + } + } else { + if (!pojosAsJavaRecordClasses.equals(other.pojosAsJavaRecordClasses)) { + return false; + } + } + if (pojosAsScalaCaseClasses == null) { + if (other.pojosAsScalaCaseClasses!= null) { + return false; + } + } else { + if (!pojosAsScalaCaseClasses.equals(other.pojosAsScalaCaseClasses)) { + return false; + } + } + if (pojosAsKotlinDataClasses == null) { + if (other.pojosAsKotlinDataClasses!= null) { + return false; + } + } else { + if (!pojosAsKotlinDataClasses.equals(other.pojosAsKotlinDataClasses)) { + return false; + } + } if (immutablePojos == null) { if (other.immutablePojos!= null) { return false; @@ -3348,6 +3471,9 @@ public class Generate implements Serializable, XMLAppendable result = ((prime*result)+((pojos == null)? 0 :pojos.hashCode())); result = ((prime*result)+((pojosEqualsAndHashCode == null)? 0 :pojosEqualsAndHashCode.hashCode())); result = ((prime*result)+((pojosToString == null)? 0 :pojosToString.hashCode())); + result = ((prime*result)+((pojosAsJavaRecordClasses == null)? 0 :pojosAsJavaRecordClasses.hashCode())); + result = ((prime*result)+((pojosAsScalaCaseClasses == null)? 0 :pojosAsScalaCaseClasses.hashCode())); + result = ((prime*result)+((pojosAsKotlinDataClasses == null)? 0 :pojosAsKotlinDataClasses.hashCode())); result = ((prime*result)+((immutablePojos == null)? 0 :immutablePojos.hashCode())); result = ((prime*result)+((serializablePojos == null)? 0 :serializablePojos.hashCode())); result = ((prime*result)+((interfaces == null)? 0 :interfaces.hashCode())); diff --git a/jOOQ-meta/src/main/resources/xsd/jooq-codegen-3.14.0.xsd b/jOOQ-meta/src/main/resources/xsd/jooq-codegen-3.14.0.xsd index dc7f8ef12f..4cf93aac66 100644 --- a/jOOQ-meta/src/main/resources/xsd/jooq-codegen-3.14.0.xsd +++ b/jOOQ-meta/src/main/resources/xsd/jooq-codegen-3.14.0.xsd @@ -1223,6 +1223,18 @@ jOOQ version used for source code.]]> + + + + + + + + + + + +