From f541eda04d69a7227f8a9859b9ba3496760e25b9 Mon Sep 17 00:00:00 2001 From: Lukas Eder Date: Fri, 25 Sep 2020 15:50:27 +0200 Subject: [PATCH] [jOOQ/jOOQ#10654 Make the generation of the serialVersionUID configurable --- .../org/jooq/codegen/AbstractGenerator.java | 12 +++++ .../java/org/jooq/codegen/GenerationTool.java | 2 + .../main/java/org/jooq/codegen/Generator.java | 11 ++++ .../java/org/jooq/codegen/JavaGenerator.java | 2 +- .../java/org/jooq/codegen/JavaWriter.java | 51 ++++++++++++++----- .../java/org/jooq/meta/jaxb/Generate.java | 39 ++++++++++++++ .../meta/jaxb/GeneratedSerialVersionUID.java | 40 +++++++++++++++ .../resources/xsd/jooq-codegen-3.14.0.xsd | 12 +++++ 8 files changed, 154 insertions(+), 15 deletions(-) create mode 100644 jOOQ-meta/src/main/java/org/jooq/meta/jaxb/GeneratedSerialVersionUID.java 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 eea7013574..7027fd2576 100644 --- a/jOOQ-codegen/src/main/java/org/jooq/codegen/AbstractGenerator.java +++ b/jOOQ-codegen/src/main/java/org/jooq/codegen/AbstractGenerator.java @@ -49,6 +49,7 @@ import java.util.Set; import org.jooq.meta.Database; import org.jooq.meta.jaxb.GeneratedAnnotationType; +import org.jooq.meta.jaxb.GeneratedSerialVersionUID; import org.jooq.tools.JooqLogger; @@ -103,6 +104,7 @@ abstract class AbstractGenerator implements Generator { String generateJPAVersion = ""; boolean generateValidationAnnotations = false; boolean generateSpringAnnotations = false; + GeneratedSerialVersionUID generatedSerialVersionUID = GeneratedSerialVersionUID.CONSTANT; boolean generateQueues = true; boolean generateLinks = true; boolean generateKeys = true; @@ -645,6 +647,16 @@ abstract class AbstractGenerator implements Generator { this.generateSpringAnnotations = generateSpringAnnotations; } + @Override + public GeneratedSerialVersionUID generatedSerialVersionUID() { + return generatedSerialVersionUID; + } + + @Override + public void setGenerateGeneratedSerialVersionUID(GeneratedSerialVersionUID generatedSerialVersionUID) { + this.generatedSerialVersionUID = generatedSerialVersionUID; + } + @Override public boolean generateGlobalObjectReferences() { return generateGlobalObjectReferences; 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 9df7d2efdb..1bdf887537 100644 --- a/jOOQ-codegen/src/main/java/org/jooq/codegen/GenerationTool.java +++ b/jOOQ-codegen/src/main/java/org/jooq/codegen/GenerationTool.java @@ -747,6 +747,8 @@ public class GenerationTool { generator.setGenerateValidationAnnotations(g.getGenerate().isValidationAnnotations()); if (g.getGenerate().isSpringAnnotations() != null) generator.setGenerateSpringAnnotations(g.getGenerate().isSpringAnnotations()); + if (g.getGenerate().getGeneratedSerialVersionUID() != null) + generator.setGenerateGeneratedSerialVersionUID(g.getGenerate().getGeneratedSerialVersionUID()); if (g.getGenerate().isQueues() != null) generator.setGenerateQueues(g.getGenerate().isQueues()); if (g.getGenerate().isLinks() != 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 8597b69785..9e5f13dd55 100644 --- a/jOOQ-codegen/src/main/java/org/jooq/codegen/Generator.java +++ b/jOOQ-codegen/src/main/java/org/jooq/codegen/Generator.java @@ -43,6 +43,7 @@ import java.util.Locale; import org.jooq.meta.Database; import org.jooq.meta.jaxb.GeneratedAnnotationType; +import org.jooq.meta.jaxb.GeneratedSerialVersionUID; /** * The Generator provides a basic interface for java code generation @@ -505,6 +506,16 @@ public interface Generator { */ void setGenerateSpringAnnotations(boolean generateSpringAnnotations); + /** + * The type of serialVersionUID that should be generated. + */ + GeneratedSerialVersionUID generatedSerialVersionUID(); + + /** + * The type of serialVersionUID that should be generated. + */ + void setGenerateGeneratedSerialVersionUID(GeneratedSerialVersionUID generatedSerialVersionUID); + /** * Whether global object references should 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 c0b88df4d4..7fac00896a 100644 --- a/jOOQ-codegen/src/main/java/org/jooq/codegen/JavaGenerator.java +++ b/jOOQ-codegen/src/main/java/org/jooq/codegen/JavaGenerator.java @@ -8315,7 +8315,7 @@ public class JavaGenerator extends AbstractGenerator { // [#3880] Users may need to call this method protected JavaWriter newJavaWriter(File file) { file = fixSuffix(file); - JavaWriter result = new JavaWriter(file, generateFullyQualifiedTypes(), targetEncoding, generateJavadoc(), fileCache); + JavaWriter result = new JavaWriter(file, generateFullyQualifiedTypes(), targetEncoding, generateJavadoc(), fileCache, generatedSerialVersionUID()); if (generateIndentation != null) result.tabString(generateIndentation); diff --git a/jOOQ-codegen/src/main/java/org/jooq/codegen/JavaWriter.java b/jOOQ-codegen/src/main/java/org/jooq/codegen/JavaWriter.java index f942b473d3..05dd9caad0 100644 --- a/jOOQ-codegen/src/main/java/org/jooq/codegen/JavaWriter.java +++ b/jOOQ-codegen/src/main/java/org/jooq/codegen/JavaWriter.java @@ -17,6 +17,7 @@ import java.util.TreeSet; import java.util.regex.Matcher; import java.util.regex.Pattern; +import org.jooq.meta.jaxb.GeneratedSerialVersionUID; import org.jooq.tools.StringUtils; /** @@ -29,19 +30,20 @@ import org.jooq.tools.StringUtils; */ public class JavaWriter extends GeneratorWriter { - private static final String SERIAL_STATEMENT = "__SERIAL_STATEMENT__"; - private static final String IMPORT_STATEMENT = "__IMPORT_STATEMENT__"; + private static final String SERIAL_STATEMENT = "__SERIAL_STATEMENT__"; + private static final String IMPORT_STATEMENT = "__IMPORT_STATEMENT__"; - private final Pattern fullyQualifiedTypes; - private final boolean javadoc; - private final Set refConflicts; - private final Set qualifiedTypes = new TreeSet<>(qualifiedTypeComparator()); - private final Map unqualifiedTypes = new TreeMap<>(); - private final String className; - private String packageName; - private final boolean isJava; - private final boolean isScala; - private final boolean isKotlin; + private final Pattern fullyQualifiedTypes; + private final boolean javadoc; + private final Set refConflicts; + private final Set qualifiedTypes = new TreeSet<>(qualifiedTypeComparator()); + private final Map unqualifiedTypes = new TreeMap<>(); + private final String className; + private String packageName; + private final boolean isJava; + private final boolean isScala; + private final boolean isKotlin; + private final GeneratedSerialVersionUID generatedSerialVersionUID; public JavaWriter(File file, String fullyQualifiedTypes) { this(file, fullyQualifiedTypes, null); @@ -56,6 +58,10 @@ public class JavaWriter extends GeneratorWriter { } public JavaWriter(File file, String fullyQualifiedTypes, String encoding, boolean javadoc, Files files) { + this(file, fullyQualifiedTypes, encoding, javadoc, files, GeneratedSerialVersionUID.CONSTANT); + } + + public JavaWriter(File file, String fullyQualifiedTypes, String encoding, boolean javadoc, Files files, GeneratedSerialVersionUID generatedSerialVersionUID) { super(file, encoding, files); this.className = file.getName().replaceAll("\\.(java|scala|kt)$", ""); @@ -65,6 +71,7 @@ public class JavaWriter extends GeneratorWriter { this.refConflicts = new HashSet<>(); this.fullyQualifiedTypes = fullyQualifiedTypes == null ? null : Pattern.compile(fullyQualifiedTypes); this.javadoc = javadoc; + this.generatedSerialVersionUID = generatedSerialVersionUID; if (isJava || isKotlin) tabString(" "); @@ -165,7 +172,7 @@ public class JavaWriter extends GeneratorWriter { } public void printSerial() { - if (isJava) { + if (isJava && generatedSerialVersionUID != GeneratedSerialVersionUID.OFF) { println(); println("private static final long serialVersionUID = %s;", SERIAL_STATEMENT); } @@ -233,7 +240,23 @@ public class JavaWriter extends GeneratorWriter { } string = string.replaceAll(IMPORT_STATEMENT, Matcher.quoteReplacement(importString.toString())); - string = string.replaceAll(SERIAL_STATEMENT, Matcher.quoteReplacement(String.valueOf(string.hashCode()))); + + if (isJava) { + switch (StringUtils.defaultIfNull(generatedSerialVersionUID, GeneratedSerialVersionUID.CONSTANT)) { + case HASH: + string = string.replaceAll(SERIAL_STATEMENT, Matcher.quoteReplacement(String.valueOf(string.hashCode()))); + break; + + case OFF: + break; + + case CONSTANT: + default: + string = string.replaceAll(SERIAL_STATEMENT, Matcher.quoteReplacement("1L")); + break; + } + } + return string; } 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 96b9081852..46b8c6fccc 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 @@ -183,6 +183,9 @@ public class Generate implements Serializable, XMLAppendable protected Boolean javaBeansGettersAndSetters = false; @XmlElement(defaultValue = "false") protected Boolean varargSetters = false; + @XmlElement(defaultValue = "CONSTANT") + @XmlSchemaType(name = "string") + protected GeneratedSerialVersionUID generatedSerialVersionUID = GeneratedSerialVersionUID.CONSTANT; @XmlElement(defaultValue = "") @XmlJavaTypeAdapter(StringAdapter.class) protected String fullyQualifiedTypes = ""; @@ -2017,6 +2020,22 @@ public class Generate implements Serializable, XMLAppendable this.varargSetters = value; } + /** + * The serial version UID to be generated in all files. + * + */ + public GeneratedSerialVersionUID getGeneratedSerialVersionUID() { + return generatedSerialVersionUID; + } + + /** + * The serial version UID to be generated in all files. + * + */ + public void setGeneratedSerialVersionUID(GeneratedSerialVersionUID value) { + this.generatedSerialVersionUID = value; + } + /** * A regular expression matching all the types in generated code that should be fully qualified. *

@@ -2545,6 +2564,15 @@ public class Generate implements Serializable, XMLAppendable return this; } + /** + * The serial version UID to be generated in all files. + * + */ + public Generate withGeneratedSerialVersionUID(GeneratedSerialVersionUID value) { + setGeneratedSerialVersionUID(value); + return this; + } + /** * A regular expression matching all the types in generated code that should be fully qualified. *

@@ -2669,6 +2697,7 @@ public class Generate implements Serializable, XMLAppendable builder.append("fluentSetters", fluentSetters); builder.append("javaBeansGettersAndSetters", javaBeansGettersAndSetters); builder.append("varargSetters", varargSetters); + builder.append("generatedSerialVersionUID", generatedSerialVersionUID); builder.append("fullyQualifiedTypes", fullyQualifiedTypes); builder.append("emptyCatalogs", emptyCatalogs); builder.append("emptySchemas", emptySchemas); @@ -3380,6 +3409,15 @@ public class Generate implements Serializable, XMLAppendable return false; } } + if (generatedSerialVersionUID == null) { + if (other.generatedSerialVersionUID!= null) { + return false; + } + } else { + if (!generatedSerialVersionUID.equals(other.generatedSerialVersionUID)) { + return false; + } + } if (fullyQualifiedTypes == null) { if (other.fullyQualifiedTypes!= null) { return false; @@ -3517,6 +3555,7 @@ public class Generate implements Serializable, XMLAppendable result = ((prime*result)+((fluentSetters == null)? 0 :fluentSetters.hashCode())); result = ((prime*result)+((javaBeansGettersAndSetters == null)? 0 :javaBeansGettersAndSetters.hashCode())); result = ((prime*result)+((varargSetters == null)? 0 :varargSetters.hashCode())); + result = ((prime*result)+((generatedSerialVersionUID == null)? 0 :generatedSerialVersionUID.hashCode())); result = ((prime*result)+((fullyQualifiedTypes == null)? 0 :fullyQualifiedTypes.hashCode())); result = ((prime*result)+((emptyCatalogs == null)? 0 :emptyCatalogs.hashCode())); result = ((prime*result)+((emptySchemas == null)? 0 :emptySchemas.hashCode())); diff --git a/jOOQ-meta/src/main/java/org/jooq/meta/jaxb/GeneratedSerialVersionUID.java b/jOOQ-meta/src/main/java/org/jooq/meta/jaxb/GeneratedSerialVersionUID.java new file mode 100644 index 0000000000..a35b0ddf9f --- /dev/null +++ b/jOOQ-meta/src/main/java/org/jooq/meta/jaxb/GeneratedSerialVersionUID.java @@ -0,0 +1,40 @@ + +package org.jooq.meta.jaxb; + +import javax.xml.bind.annotation.XmlEnum; +import javax.xml.bind.annotation.XmlType; + + +/** + *

Java class for GeneratedSerialVersionUID. + * + *

The following schema fragment specifies the expected content contained within this class. + *

+ *

+ * <simpleType name="GeneratedSerialVersionUID">
+ *   <restriction base="{http://www.w3.org/2001/XMLSchema}string">
+ *     <enumeration value="HASH"/>
+ *     <enumeration value="CONSTANT"/>
+ *     <enumeration value="OFF"/>
+ *   </restriction>
+ * </simpleType>
+ * 
+ * + */ +@XmlType(name = "GeneratedSerialVersionUID") +@XmlEnum +public enum GeneratedSerialVersionUID { + + HASH, + CONSTANT, + OFF; + + public String value() { + return name(); + } + + public static GeneratedSerialVersionUID fromValue(String v) { + return valueOf(v); + } + +} 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 66409feeea..439f29497d 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 @@ -1739,6 +1739,10 @@ Custom GeneratorStrategy implementations are unaffected]]> This may lead to compilation warnings in current Java versions.]]> + + + + + + + + + + + +