From ed778cf7b359f980e664d174b2457b99b09a6e89 Mon Sep 17 00:00:00 2001 From: Lukas Eder Date: Wed, 9 Mar 2022 10:40:29 +0100 Subject: [PATCH] [jOOQ/jOOQ#13143] Add code generation flags to turn off the recognition of jOOQ-specific types --- .../org/jooq/codegen/AbstractGenerator.java | 44 +++++ .../java/org/jooq/codegen/GenerationTool.java | 8 + .../main/java/org/jooq/codegen/Generator.java | 51 ++++++ .../java/org/jooq/codegen/JavaGenerator.java | 17 +- .../java/org/jooq/meta/jaxb/Generate.java | 168 ++++++++++++++++++ .../org/jooq/meta/xsd/jooq-codegen-3.17.0.xsd | 16 ++ 6 files changed, 300 insertions(+), 4 deletions(-) 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 0d7b69c79e..a39be12283 100644 --- a/jOOQ-codegen/src/main/java/org/jooq/codegen/AbstractGenerator.java +++ b/jOOQ-codegen/src/main/java/org/jooq/codegen/AbstractGenerator.java @@ -153,6 +153,10 @@ abstract class AbstractGenerator implements Generator { boolean generateVarargsSetters = true; String generateFullyQualifiedTypes = ""; boolean generateJavaTimeTypes = true; + boolean generateSpatialTypes = true; + boolean generateXmlTypes = true; + boolean generateJsonTypes = true; + boolean generateIntervalTypes = true; boolean generateTableValuedFunctions = false; boolean generateEmptyCatalogs = false; boolean generateEmptySchemas = false; @@ -1183,6 +1187,46 @@ abstract class AbstractGenerator implements Generator { this.generateJavaTimeTypes = generateJavaTimeTypes; } + @Override + public boolean generateSpatialTypes() { + return generateSpatialTypes; + } + + @Override + public void setGenerateSpatialTypes(boolean generateSpatialTypes) { + this.generateSpatialTypes = generateSpatialTypes; + } + + @Override + public boolean generateXmlTypes() { + return generateXmlTypes; + } + + @Override + public void setGenerateXmlTypes(boolean generateXmlTypes) { + this.generateXmlTypes = generateXmlTypes; + } + + @Override + public boolean generateJsonTypes() { + return generateJsonTypes; + } + + @Override + public void setGenerateJsonTypes(boolean generateJsonTypes) { + this.generateJsonTypes = generateJsonTypes; + } + + @Override + public boolean generateIntervalTypes() { + return generateIntervalTypes; + } + + @Override + public void setGenerateIntervalTypes(boolean generateIntervalTypes) { + this.generateIntervalTypes = generateIntervalTypes; + } + @Override public boolean generateEmptyCatalogs() { return generateEmptyCatalogs; 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 e45438cba5..8045784f22 100644 --- a/jOOQ-codegen/src/main/java/org/jooq/codegen/GenerationTool.java +++ b/jOOQ-codegen/src/main/java/org/jooq/codegen/GenerationTool.java @@ -877,6 +877,14 @@ public class GenerationTool { generator.setGenerateFullyQualifiedTypes(g.getGenerate().getFullyQualifiedTypes()); if (g.getGenerate().isJavaTimeTypes() != null) generator.setGenerateJavaTimeTypes(g.getGenerate().isJavaTimeTypes()); + if (g.getGenerate().isSpatialTypes() != null) + generator.setGenerateSpatialTypes(g.getGenerate().isSpatialTypes()); + if (g.getGenerate().isXmlTypes() != null) + generator.setGenerateXmlTypes(g.getGenerate().isXmlTypes()); + if (g.getGenerate().isJsonTypes() != null) + generator.setGenerateJsonTypes(g.getGenerate().isJsonTypes()); + if (g.getGenerate().isIntervalTypes() != null) + generator.setGenerateIntervalTypes(g.getGenerate().isIntervalTypes()); if (g.getGenerate().isEmptyCatalogs() != null) generator.setGenerateEmptyCatalogs(g.getGenerate().isEmptyCatalogs()); if (g.getGenerate().isEmptySchemas() != 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 aa31fd0d1c..9731d5312c 100644 --- a/jOOQ-codegen/src/main/java/org/jooq/codegen/Generator.java +++ b/jOOQ-codegen/src/main/java/org/jooq/codegen/Generator.java @@ -42,10 +42,15 @@ import java.io.Serializable; import java.util.Locale; import org.jooq.Constants; +import org.jooq.JSON; +import org.jooq.JSONB; +import org.jooq.Spatial; +import org.jooq.XML; import org.jooq.meta.Database; import org.jooq.meta.jaxb.GeneratedAnnotationType; import org.jooq.meta.jaxb.GeneratedSerialVersionUID; import org.jooq.meta.jaxb.VisibilityModifier; +import org.jooq.types.Interval; /** * The Generator provides a basic interface for java code generation @@ -1065,6 +1070,52 @@ public interface Generator { */ void setGenerateJavaTimeTypes(boolean generateJavaTimeTypes); + /** + * A flag indicating whether the {@link Spatial} type support should be + * enabled. + */ + boolean generateSpatialTypes(); + + /** + * A flag indicating whether the {@link Spatial} type support should be + * enabled. + */ + void setGenerateSpatialTypes(boolean generateSpatialTypes); + + /** + * A flag indicating whether the {@link XML} type support should be enabled. + */ + boolean generateXmlTypes(); + + /** + * A flag indicating whether the {@link XML} type support should be enabled. + */ + void setGenerateXmlTypes(boolean generateXmlTypes); + + /** + * A flag indicating whether the {@link JSON} and {@link JSONB} type support + * should be enabled. + */ + boolean generateJsonTypes(); + + /** + * A flag indicating whether the {@link JSON} and {@link JSONB} type support + * should be enabled. + */ + void setGenerateJsonTypes(boolean generateJsonTypes); + + /** + * A flag indicating whether the {@link Interval} type support should be + * enabled. + */ + boolean generateIntervalTypes(); + + /** + * A flag indicating whether the {@link Interval} type support should be + * enabled. + */ + void setGenerateIntervalTypes(boolean generateJsonTypes); + /** * Whether empty catalogs should still be generated. */ 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 066d4153de..7c8418f0dc 100644 --- a/jOOQ-codegen/src/main/java/org/jooq/codegen/JavaGenerator.java +++ b/jOOQ-codegen/src/main/java/org/jooq/codegen/JavaGenerator.java @@ -8998,7 +8998,7 @@ public class JavaGenerator extends AbstractGenerator { // Try finding a basic standard SQL type according to the current dialect else { try { - Class clazz = mapJavaTimeTypes(getDataType(db, t, p, s)).getType(); + Class clazz = mapTypes(getDataType(db, t, p, s)).getType(); if (scala && clazz == byte[].class) type = "scala.Array[scala.Byte]"; else if (kotlin && clazz == byte[].class) @@ -9086,7 +9086,7 @@ public class JavaGenerator extends AbstractGenerator { String sqlDataTypeRef; try { - dataType = mapJavaTimeTypes(getDataType(db, t, p, s)); + dataType = mapTypes(getDataType(db, t, p, s)); } // Mostly because of unsupported data types. @@ -9218,11 +9218,11 @@ public class JavaGenerator extends AbstractGenerator { return typed.getType().isNullable() ? "?" : ""; } - private DataType mapJavaTimeTypes(DataType dataType) { + private DataType mapTypes(DataType dataType) { DataType result = dataType; // [#4429] [#5713] This logic should be implemented in Configuration - if (dataType.isDateTime() && generateJavaTimeTypes) { + if (dataType.isDateTime() && generateJavaTimeTypes()) { if (dataType.getType() == Date.class) result = SQLDataType.LOCALDATE; else if (dataType.getType() == Time.class) @@ -9231,6 +9231,15 @@ public class JavaGenerator extends AbstractGenerator { result = SQLDataType.LOCALDATETIME; } + // [#13143] Turn off support for some types + else if ( + dataType.isSpatial() && !generateSpatialTypes() || + dataType.isJSON() && !generateJsonTypes() || + dataType.isXML() && !generateXmlTypes() || + dataType.isInterval() && !generateIntervalTypes() + ) + result = SQLDataType.OTHER; + return result; } 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 4f1665ed57..f7613fecb4 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 @@ -212,6 +212,14 @@ public class Generate implements Serializable, XMLAppendable protected Boolean emptySchemas = false; @XmlElement(defaultValue = "true") protected Boolean javaTimeTypes = true; + @XmlElement(defaultValue = "true") + protected Boolean spatialTypes = true; + @XmlElement(defaultValue = "true") + protected Boolean xmlTypes = true; + @XmlElement(defaultValue = "true") + protected Boolean jsonTypes = true; + @XmlElement(defaultValue = "true") + protected Boolean intervalTypes = true; @XmlElement(defaultValue = "\\n") @XmlJavaTypeAdapter(StringAdapter.class) protected String newline = "\\n"; @@ -2338,6 +2346,102 @@ public class Generate implements Serializable, XMLAppendable this.javaTimeTypes = value; } + /** + * A flag indicating whether the spatial type support should be enabled. + * + * @return + * possible object is + * {@link Boolean } + * + */ + public Boolean isSpatialTypes() { + return spatialTypes; + } + + /** + * Sets the value of the spatialTypes property. + * + * @param value + * allowed object is + * {@link Boolean } + * + */ + public void setSpatialTypes(Boolean value) { + this.spatialTypes = value; + } + + /** + * A flag indicating whether the XML type support should be enabled. + * + * @return + * possible object is + * {@link Boolean } + * + */ + public Boolean isXmlTypes() { + return xmlTypes; + } + + /** + * Sets the value of the xmlTypes property. + * + * @param value + * allowed object is + * {@link Boolean } + * + */ + public void setXmlTypes(Boolean value) { + this.xmlTypes = value; + } + + /** + * A flag indicating whether the JSON type support should be enabled. + * + * @return + * possible object is + * {@link Boolean } + * + */ + public Boolean isJsonTypes() { + return jsonTypes; + } + + /** + * Sets the value of the jsonTypes property. + * + * @param value + * allowed object is + * {@link Boolean } + * + */ + public void setJsonTypes(Boolean value) { + this.jsonTypes = value; + } + + /** + * A flag indicating whether the INTERVAL type support should be enabled. + * + * @return + * possible object is + * {@link Boolean } + * + */ + public Boolean isIntervalTypes() { + return intervalTypes; + } + + /** + * Sets the value of the intervalTypes property. + * + * @param value + * allowed object is + * {@link Boolean } + * + */ + public void setIntervalTypes(Boolean value) { + this.intervalTypes = value; + } + /** * The newline characters to be used in generated code. Whitespace characters can be used, e.g. \n, \r\n * @@ -2868,6 +2972,26 @@ public class Generate implements Serializable, XMLAppendable return this; } + public Generate withSpatialTypes(Boolean value) { + setSpatialTypes(value); + return this; + } + + public Generate withXmlTypes(Boolean value) { + setXmlTypes(value); + return this; + } + + public Generate withJsonTypes(Boolean value) { + setJsonTypes(value); + return this; + } + + public Generate withIntervalTypes(Boolean value) { + setIntervalTypes(value); + return this; + } + /** * The newline characters to be used in generated code. Whitespace characters can be used, e.g. \n, \r\n * @@ -2986,6 +3110,10 @@ public class Generate implements Serializable, XMLAppendable builder.append("emptyCatalogs", emptyCatalogs); builder.append("emptySchemas", emptySchemas); builder.append("javaTimeTypes", javaTimeTypes); + builder.append("spatialTypes", spatialTypes); + builder.append("xmlTypes", xmlTypes); + builder.append("jsonTypes", jsonTypes); + builder.append("intervalTypes", intervalTypes); builder.append("newline", newline); builder.append("indentation", indentation); builder.append("printMarginForBlockComment", printMarginForBlockComment); @@ -3811,6 +3939,42 @@ public class Generate implements Serializable, XMLAppendable return false; } } + if (spatialTypes == null) { + if (other.spatialTypes!= null) { + return false; + } + } else { + if (!spatialTypes.equals(other.spatialTypes)) { + return false; + } + } + if (xmlTypes == null) { + if (other.xmlTypes!= null) { + return false; + } + } else { + if (!xmlTypes.equals(other.xmlTypes)) { + return false; + } + } + if (jsonTypes == null) { + if (other.jsonTypes!= null) { + return false; + } + } else { + if (!jsonTypes.equals(other.jsonTypes)) { + return false; + } + } + if (intervalTypes == null) { + if (other.intervalTypes!= null) { + return false; + } + } else { + if (!intervalTypes.equals(other.intervalTypes)) { + return false; + } + } if (newline == null) { if (other.newline!= null) { return false; @@ -3934,6 +4098,10 @@ public class Generate implements Serializable, XMLAppendable result = ((prime*result)+((emptyCatalogs == null)? 0 :emptyCatalogs.hashCode())); result = ((prime*result)+((emptySchemas == null)? 0 :emptySchemas.hashCode())); result = ((prime*result)+((javaTimeTypes == null)? 0 :javaTimeTypes.hashCode())); + result = ((prime*result)+((spatialTypes == null)? 0 :spatialTypes.hashCode())); + result = ((prime*result)+((xmlTypes == null)? 0 :xmlTypes.hashCode())); + result = ((prime*result)+((jsonTypes == null)? 0 :jsonTypes.hashCode())); + result = ((prime*result)+((intervalTypes == null)? 0 :intervalTypes.hashCode())); result = ((prime*result)+((newline == null)? 0 :newline.hashCode())); result = ((prime*result)+((indentation == null)? 0 :indentation.hashCode())); result = ((prime*result)+((printMarginForBlockComment == null)? 0 :printMarginForBlockComment.hashCode())); diff --git a/jOOQ-meta/src/main/resources/org/jooq/meta/xsd/jooq-codegen-3.17.0.xsd b/jOOQ-meta/src/main/resources/org/jooq/meta/xsd/jooq-codegen-3.17.0.xsd index 5bb7b8eb04..f5601c517a 100644 --- a/jOOQ-meta/src/main/resources/org/jooq/meta/xsd/jooq-codegen-3.17.0.xsd +++ b/jOOQ-meta/src/main/resources/org/jooq/meta/xsd/jooq-codegen-3.17.0.xsd @@ -1999,6 +1999,22 @@ source code generator, rather than JDBC's java.sql types.

This flag is ignored in the commercial Java 6 distribution of jOOQ 3.9+ ]]> + + + + + + + + + + + + + + + +