From 45c298a4bca8acd2253b3cdd2ff1a2483c46aa02 Mon Sep 17 00:00:00 2001 From: Lukas Eder Date: Tue, 18 Jun 2019 16:48:44 +0200 Subject: [PATCH] [jOOQ/jOOQ#5412] Generate a Record to POJO mapper on generated records --- .../org/jooq/codegen/AbstractGenerator.java | 11 +++++ .../java/org/jooq/codegen/GenerationTool.java | 2 + .../main/java/org/jooq/codegen/Generator.java | 10 ++++ .../java/org/jooq/codegen/JavaGenerator.java | 48 +++++++++++++++++++ .../java/org/jooq/meta/jaxb/Generate.java | 46 ++++++++++++++++++ .../resources/xsd/jooq-codegen-3.12.0.xsd | 4 ++ 6 files changed, 121 insertions(+) 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 ad8b13fbde..3224f512ae 100644 --- a/jOOQ-codegen/src/main/java/org/jooq/codegen/AbstractGenerator.java +++ b/jOOQ-codegen/src/main/java/org/jooq/codegen/AbstractGenerator.java @@ -75,6 +75,7 @@ abstract class AbstractGenerator implements Generator { boolean generateEmbeddables = true; boolean generateRecords = true; boolean generateRecordsImplementingRecordN = true; + boolean generateRecordToPojoMappers = true; boolean generatePojos = false; boolean generatePojosEqualsAndHashCode = false; boolean generatePojosToString = true; @@ -389,6 +390,16 @@ abstract class AbstractGenerator implements Generator { this.generateRecordsImplementingRecordN = generateRecordsImplementingRecordN; } + @Override + public boolean generateRecordToPojoMappers() { + return generateRecords() && generatePojos() && generateRecordToPojoMappers; + } + + @Override + public void setGenerateRecordToPojoMappers(boolean generateRecordToPojoMappers) { + this.generateRecordToPojoMappers = generateRecordToPojoMappers; + } + @Override public boolean generatePojos() { 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 bda73ae416..d2d8a5c0c0 100644 --- a/jOOQ-codegen/src/main/java/org/jooq/codegen/GenerationTool.java +++ b/jOOQ-codegen/src/main/java/org/jooq/codegen/GenerationTool.java @@ -668,6 +668,8 @@ public class GenerationTool { generator.setGenerateRecords(g.getGenerate().isRecords()); if (g.getGenerate().isRecordsImplementingRecordN() != null) generator.setGenerateRecordsImplementingRecordN(g.getGenerate().isRecordsImplementingRecordN()); + if (g.getGenerate().isRecordToPojoMappers() != null) + generator.setGenerateRecordToPojoMappers(g.getGenerate().isRecordToPojoMappers()); if (g.getGenerate().isPojos() != null) generator.setGeneratePojos(g.getGenerate().isPojos()); if (g.getGenerate().isImmutablePojos() != 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 1fff111744..a2764d4513 100644 --- a/jOOQ-codegen/src/main/java/org/jooq/codegen/Generator.java +++ b/jOOQ-codegen/src/main/java/org/jooq/codegen/Generator.java @@ -232,6 +232,16 @@ public interface Generator { */ void setGenerateRecordsImplementingRecordN(boolean generateRecordsImplementingRecordN); + /** + * Whether out of the box record to POJO mappers should be generated. + */ + boolean generateRecordToPojoMappers(); + + /** + * Whether out of the box record to POJO mappers should be generated. + */ + void setGenerateRecordToPojoMappers(boolean generateRecordToPojoMappers); + /** * Whether POJO's should be generated in addition to records */ 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 147014fa11..0cbb100aea 100644 --- a/jOOQ-codegen/src/main/java/org/jooq/codegen/JavaGenerator.java +++ b/jOOQ-codegen/src/main/java/org/jooq/codegen/JavaGenerator.java @@ -94,6 +94,7 @@ import org.jooq.OrderField; import org.jooq.Package; import org.jooq.Parameter; import org.jooq.Record; +import org.jooq.RecordMapper; import org.jooq.Result; import org.jooq.Row; import org.jooq.Schema; @@ -1589,6 +1590,53 @@ public class JavaGenerator extends AbstractGenerator { out.tab(1).println("}"); } + if (generateRecordToPojoMappers()) { + final String pojoName = out.ref(getStrategy().getFullJavaClassName(tableUdtOrEmbeddable, Mode.POJO)); + + // Feature not supported in the Scala generator + if (scala) { + } + else { + out.println(); + out.tab(1).println("public %s<%s, %s> mapper() {", RecordMapper.class, className, pojoName); + out.tab(2).println("return new %s<%s, %s>() {", RecordMapper.class, className, pojoName); + out.tab(3).override(); + out.tab(3).println("public %s map(%s record) {", pojoName, className); + + if (generateImmutablePojos()) { + out.tab(4).println("return new %s(", pojoName); + + for (int i = 0; i < degree; i++) { + final TypedElementDefinition column = columns.get(i); + final String columnGetter = getStrategy().getJavaGetterName(column, Mode.RECORD); + + out.tab(5).println("%s()[[%s]]", columnGetter, list(i == degree - 1 ? null : ",")); + } + + out.tab(4).println(");"); + } + else { + out.tab(4).println("%s result = new %s();", pojoName, pojoName); + out.println(); + + for (int i = 0; i < degree; i++) { + final TypedElementDefinition column = columns.get(i); + final String columnGetter = getStrategy().getJavaGetterName(column, Mode.RECORD); + final String columnSetter = getStrategy().getJavaSetterName(column, Mode.POJO); + + out.tab(4).println("result.%s(%s());", columnSetter, columnGetter); + } + + out.println(); + out.tab(4).println("return result;"); + } + + out.tab(3).println("}"); + out.tab(2).println("};"); + out.tab(1).println("}"); + } + } + if (tableUdtOrEmbeddable instanceof TableDefinition) generateRecordClassFooter((TableDefinition) tableUdtOrEmbeddable, out); else if (tableUdtOrEmbeddable instanceof EmbeddableDefinition) 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 bf6d795392..1fee595c7f 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 @@ -65,6 +65,8 @@ public class Generate implements Serializable protected Boolean records = true; @XmlElement(defaultValue = "true") protected Boolean recordsImplementingRecordN = true; + @XmlElement(defaultValue = "true") + protected Boolean recordToPojoMappers = true; @XmlElement(defaultValue = "false") protected Boolean pojos = false; @XmlElement(defaultValue = "false") @@ -601,6 +603,30 @@ public class Generate implements Serializable this.recordsImplementingRecordN = value; } + /** + * If both {@link #records} and {@link #pojos} are generated, then an auxiliary default {@link org.jooq.RecordMapper} can be generated as well, that bypasses reflection. + * + * @return + * possible object is + * {@link Boolean } + * + */ + public Boolean isRecordToPojoMappers() { + return recordToPojoMappers; + } + + /** + * Sets the value of the recordToPojoMappers property. + * + * @param value + * allowed object is + * {@link Boolean } + * + */ + public void setRecordToPojoMappers(Boolean value) { + this.recordToPojoMappers = value; + } + /** * Generate POJOs. * @@ -1869,6 +1895,11 @@ public class Generate implements Serializable return this; } + public Generate withRecordToPojoMappers(Boolean value) { + setRecordToPojoMappers(value); + return this; + } + public Generate withPojos(Boolean value) { setPojos(value); return this; @@ -2202,6 +2233,11 @@ public class Generate implements Serializable sb.append(recordsImplementingRecordN); sb.append(""); } + if (recordToPojoMappers!= null) { + sb.append(""); + sb.append(recordToPojoMappers); + sb.append(""); + } if (pojos!= null) { sb.append(""); sb.append(pojos); @@ -2619,6 +2655,15 @@ public class Generate implements Serializable return false; } } + if (recordToPojoMappers == null) { + if (other.recordToPojoMappers!= null) { + return false; + } + } else { + if (!recordToPojoMappers.equals(other.recordToPojoMappers)) { + return false; + } + } if (pojos == null) { if (other.pojos!= null) { return false; @@ -3076,6 +3121,7 @@ public class Generate implements Serializable result = ((prime*result)+((embeddables == null)? 0 :embeddables.hashCode())); result = ((prime*result)+((records == null)? 0 :records.hashCode())); result = ((prime*result)+((recordsImplementingRecordN == null)? 0 :recordsImplementingRecordN.hashCode())); + result = ((prime*result)+((recordToPojoMappers == null)? 0 :recordToPojoMappers.hashCode())); result = ((prime*result)+((pojos == null)? 0 :pojos.hashCode())); result = ((prime*result)+((pojosEqualsAndHashCode == null)? 0 :pojosEqualsAndHashCode.hashCode())); result = ((prime*result)+((pojosToString == null)? 0 :pojosToString.hashCode())); diff --git a/jOOQ-meta/src/main/resources/xsd/jooq-codegen-3.12.0.xsd b/jOOQ-meta/src/main/resources/xsd/jooq-codegen-3.12.0.xsd index 2ee4024ad7..192642f4c2 100644 --- a/jOOQ-meta/src/main/resources/xsd/jooq-codegen-3.12.0.xsd +++ b/jOOQ-meta/src/main/resources/xsd/jooq-codegen-3.12.0.xsd @@ -1075,6 +1075,10 @@ jOOQ version used for source code.]]> + + + +