[jOOQ/jOOQ#10654 Make the generation of the serialVersionUID configurable

This commit is contained in:
Lukas Eder 2020-09-25 15:50:27 +02:00
parent c77c7abd4e
commit f541eda04d
8 changed files with 154 additions and 15 deletions

View File

@ -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;

View File

@ -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)

View File

@ -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 <code>serialVersionUID</code> that should be generated.
*/
GeneratedSerialVersionUID generatedSerialVersionUID();
/**
* The type of <code>serialVersionUID</code> that should be generated.
*/
void setGenerateGeneratedSerialVersionUID(GeneratedSerialVersionUID generatedSerialVersionUID);
/**
* Whether global object references should be generated
*/

View File

@ -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);

View File

@ -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<JavaWriter> {
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<String> refConflicts;
private final Set<String> qualifiedTypes = new TreeSet<>(qualifiedTypeComparator());
private final Map<String, String> 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<String> refConflicts;
private final Set<String> qualifiedTypes = new TreeSet<>(qualifiedTypeComparator());
private final Map<String, String> 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<JavaWriter> {
}
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<JavaWriter> {
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<JavaWriter> {
}
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<JavaWriter> {
}
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;
}

View File

@ -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.
* <p>
@ -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.
* <p>
@ -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()));

View File

@ -0,0 +1,40 @@
package org.jooq.meta.jaxb;
import javax.xml.bind.annotation.XmlEnum;
import javax.xml.bind.annotation.XmlType;
/**
* <p>Java class for GeneratedSerialVersionUID.
*
* <p>The following schema fragment specifies the expected content contained within this class.
* <p>
* <pre>
* &lt;simpleType name="GeneratedSerialVersionUID"&gt;
* &lt;restriction base="{http://www.w3.org/2001/XMLSchema}string"&gt;
* &lt;enumeration value="HASH"/&gt;
* &lt;enumeration value="CONSTANT"/&gt;
* &lt;enumeration value="OFF"/&gt;
* &lt;/restriction&gt;
* &lt;/simpleType&gt;
* </pre>
*
*/
@XmlType(name = "GeneratedSerialVersionUID")
@XmlEnum
public enum GeneratedSerialVersionUID {
HASH,
CONSTANT,
OFF;
public String value() {
return name();
}
public static GeneratedSerialVersionUID fromValue(String v) {
return valueOf(v);
}
}

View File

@ -1739,6 +1739,10 @@ Custom GeneratorStrategy implementations are unaffected]]></jxb:javadoc></jxb:pr
<p>
This may lead to compilation warnings in current Java versions.]]></jxb:javadoc></jxb:property></appinfo></annotation>
</element>
<element name="generatedSerialVersionUID" type="tns:GeneratedSerialVersionUID" default="CONSTANT" minOccurs="0" maxOccurs="1">
<annotation><appinfo><jxb:property><jxb:javadoc><![CDATA[The serial version UID to be generated in all files.]]></jxb:javadoc></jxb:property></appinfo></annotation>
</element>
<element name="fullyQualifiedTypes" type="string" default="" minOccurs="0" maxOccurs="1">
<annotation><appinfo><jxb:property><jxb:javadoc><![CDATA[A regular expression matching all the types in generated code that should be fully qualified.
@ -1843,4 +1847,12 @@ e.g. org.jooq.generated.schema1, org.jooq.generated.schema2]]></jxb:javadoc></jx
<enumeration value="JAVAX_ANNOTATION_PROCESSING_GENERATED"/>
</restriction>
</simpleType>
<simpleType name="GeneratedSerialVersionUID">
<restriction base="string">
<enumeration value="HASH"/>
<enumeration value="CONSTANT"/>
<enumeration value="OFF"/>
</restriction>
</simpleType>
</schema>