[#4888] [#7210] Serializable on generated POJOs and interfaces

- [#4888] Add <serializablePojos/> to allow for POJOs not to be Serializable
- [#7210] Add <serializableInterfaces/> to allow for interfaces not to be Serializable
This commit is contained in:
lukaseder 2018-02-20 13:28:02 +01:00
parent b63f64e03b
commit a1f9d3afbf
7 changed files with 160 additions and 13 deletions

View File

@ -75,8 +75,10 @@ abstract class AbstractGenerator implements Generator {
boolean generatePojosEqualsAndHashCode = false;
boolean generatePojosToString = true;
boolean generateImmutablePojos = false;
boolean generateSerializablePojos = true;
boolean generateInterfaces = false;
boolean generateImmutableInterfaces = false;
boolean generateSerializableInterfaces = true;
boolean generateDaos = false;
boolean generateJPAAnnotations = false;
String generateJPAVersion = "";
@ -383,6 +385,16 @@ abstract class AbstractGenerator implements Generator {
this.generateImmutablePojos = generateImmutablePojos;
}
@Override
public boolean generateSerializablePojos() {
return generateSerializablePojos && generatePojos();
}
@Override
public void setGenerateSerializablePojos(boolean generateSerializablePojos) {
this.generateSerializablePojos = generateSerializablePojos;
}
@Override
public boolean generateInterfaces() {
return generateInterfaces || generateImmutableInterfaces;
@ -403,6 +415,16 @@ abstract class AbstractGenerator implements Generator {
this.generateImmutableInterfaces = generateImmutableInterfaces;
}
@Override
public boolean generateSerializableInterfaces() {
return generateSerializableInterfaces && generateInterfaces();
}
@Override
public void setGenerateSerializableInterfaces(boolean generateSerializableInterfaces) {
this.generateSerializableInterfaces = generateSerializableInterfaces;
}
@Override
public boolean generateDaos() {
return generateDaos;

View File

@ -607,10 +607,14 @@ public class GenerationTool {
generator.setGeneratePojos(g.getGenerate().isPojos());
if (g.getGenerate().isImmutablePojos() != null)
generator.setGenerateImmutablePojos(g.getGenerate().isImmutablePojos());
if (g.getGenerate().isSerializablePojos() != null)
generator.setGenerateSerializablePojos(g.getGenerate().isSerializablePojos());
if (g.getGenerate().isInterfaces() != null)
generator.setGenerateInterfaces(g.getGenerate().isInterfaces());
if (g.getGenerate().isImmutableInterfaces() != null)
generator.setGenerateImmutableInterfaces(g.getGenerate().isImmutableInterfaces());
if (g.getGenerate().isSerializableInterfaces() != null)
generator.setGenerateSerializableInterfaces(g.getGenerate().isSerializableInterfaces());
if (g.getGenerate().isDaos() != null)
generator.setGenerateDaos(g.getGenerate().isDaos());
if (g.getGenerate().isJpaAnnotations() != null)

View File

@ -38,6 +38,8 @@
package org.jooq.util;
import java.io.Serializable;
import javax.annotation.Generated;
/**
@ -229,6 +231,16 @@ public interface Generator {
*/
void setGenerateImmutablePojos(boolean generateImmutablePojos);
/**
* Whether generated POJO's should be {@link Serializable}.
*/
boolean generateSerializablePojos();
/**
* Whether generated POJO's should be {@link Serializable}.
*/
void setGenerateSerializablePojos(boolean generateSerializablePojos);
/**
* Whether interfaces should be generated to be implemented by records and
* POJO's
@ -251,6 +263,16 @@ public interface Generator {
*/
void setGenerateImmutableInterfaces(boolean generateImmutableInterfaces);
/**
* Whether generated interfaces should extend {@link Serializable}.
*/
boolean generateSerializableInterfaces();
/**
* Whether generated interfaces should extend {@link Serializable}.
*/
void setGenerateSerializableInterfaces(boolean generateSerializableInterfaces);
/**
* Whether DAO's should be generated in addition to pojos
*/

View File

@ -289,17 +289,18 @@ class GeneratorStrategyWrapper extends AbstractGeneratorStrategy {
// [#1243] All generation modes can accept interfaces
Set<String> result = new LinkedHashSet<String>(delegate.getJavaClassImplements(definition, mode));
// [#1528] Generated interfaces (implemented by RECORD and POJO) are
// always Serializable
if (mode == Mode.INTERFACE) {
// [#1528] [#7210] Generated interfaces (implemented by RECORD and POJO) are
// Serializable by default
if (mode == Mode.INTERFACE
&& generator.generateSerializableInterfaces())
result.add(Serializable.class.getName());
}
// [#1528] POJOs only implement Serializable if they don't inherit
// Serializable from INTERFACE already
else if (mode == Mode.POJO && !generator.generateInterfaces()) {
// [#1528] [#4888] POJOs only implement Serializable by default if they don't inherit
// Serializable from INTERFACE already
else if (mode == Mode.POJO
&& generator.generateSerializablePojos()
&& (!generator.generateInterfaces() || !generator.generateSerializableInterfaces()))
result.add(Serializable.class.getName());
}
return new ArrayList<String>(result);
}

View File

@ -1727,9 +1727,9 @@ public class JavaGenerator extends AbstractGenerator {
printTableJPAAnnotation(out, (TableDefinition) tableOrUDT);
if (scala)
out.println("trait %s [[before=extends ][%s]] {", className, interfaces);
out.println("trait %s[[before= extends ][%s]] {", className, interfaces);
else
out.println("public interface %s [[before=extends ][%s]] {", className, interfaces);
out.println("public interface %s[[before= extends ][%s]] {", className, interfaces);
List<? extends TypedElementDefinition<?>> typedElements = getTypedElements(tableOrUDT);
for (int i = 0; i < typedElements.size(); i++) {
@ -3070,9 +3070,8 @@ public class JavaGenerator extends AbstractGenerator {
printTableJPAAnnotation(out, (TableDefinition) tableOrUDT);
int maxLength = 0;
for (TypedElementDefinition<?> column : getTypedElements(tableOrUDT)) {
for (TypedElementDefinition<?> column : getTypedElements(tableOrUDT))
maxLength = Math.max(maxLength, out.ref(getJavaType(column.getType(resolver(Mode.POJO)), Mode.POJO)).length());
}
if (scala) {
out.println("%sclass %s(", (generateImmutablePojos() ? "case " : ""), className);
@ -3092,7 +3091,10 @@ public class JavaGenerator extends AbstractGenerator {
}
else {
out.println("public class %s[[before= extends ][%s]][[before= implements ][%s]] {", className, list(superName), interfaces);
out.printSerial();
if (generateSerializablePojos() || generateSerializableInterfaces())
out.printSerial();
out.println();
for (TypedElementDefinition<?> column : getTypedElements(tableOrUDT)) {

View File

@ -74,10 +74,14 @@ public class Generate implements Serializable
protected Boolean pojosToString = true;
@XmlElement(defaultValue = "false")
protected Boolean immutablePojos = false;
@XmlElement(defaultValue = "true")
protected Boolean serializablePojos = true;
@XmlElement(defaultValue = "false")
protected Boolean interfaces = false;
@XmlElement(defaultValue = "false")
protected Boolean immutableInterfaces = false;
@XmlElement(defaultValue = "true")
protected Boolean serializableInterfaces = true;
@XmlElement(defaultValue = "false")
protected Boolean daos = false;
@XmlElement(defaultValue = "false")
@ -640,6 +644,30 @@ public class Generate implements Serializable
this.immutablePojos = value;
}
/**
* Generate serializable POJOs.
*
* @return
* possible object is
* {@link Boolean }
*
*/
public Boolean isSerializablePojos() {
return serializablePojos;
}
/**
* Sets the value of the serializablePojos property.
*
* @param value
* allowed object is
* {@link Boolean }
*
*/
public void setSerializablePojos(Boolean value) {
this.serializablePojos = value;
}
/**
* Generated interfaces to be implemented by records and/or POJOs.
*
@ -688,6 +716,30 @@ public class Generate implements Serializable
this.immutableInterfaces = value;
}
/**
* Generate serializable interfaces.
*
* @return
* possible object is
* {@link Boolean }
*
*/
public Boolean isSerializableInterfaces() {
return serializableInterfaces;
}
/**
* Sets the value of the serializableInterfaces property.
*
* @param value
* allowed object is
* {@link Boolean }
*
*/
public void setSerializableInterfaces(Boolean value) {
this.serializableInterfaces = value;
}
/**
* Generate DAOs.
*
@ -1726,6 +1778,11 @@ public class Generate implements Serializable
return this;
}
public Generate withSerializablePojos(Boolean value) {
setSerializablePojos(value);
return this;
}
public Generate withInterfaces(Boolean value) {
setInterfaces(value);
return this;
@ -1736,6 +1793,11 @@ public class Generate implements Serializable
return this;
}
public Generate withSerializableInterfaces(Boolean value) {
setSerializableInterfaces(value);
return this;
}
public Generate withDaos(Boolean value) {
setDaos(value);
return this;
@ -1989,12 +2051,18 @@ public class Generate implements Serializable
sb.append("<immutablePojos>");
sb.append(immutablePojos);
sb.append("</immutablePojos>");
sb.append("<serializablePojos>");
sb.append(serializablePojos);
sb.append("</serializablePojos>");
sb.append("<interfaces>");
sb.append(interfaces);
sb.append("</interfaces>");
sb.append("<immutableInterfaces>");
sb.append(immutableInterfaces);
sb.append("</immutableInterfaces>");
sb.append("<serializableInterfaces>");
sb.append(serializableInterfaces);
sb.append("</serializableInterfaces>");
sb.append("<daos>");
sb.append(daos);
sb.append("</daos>");
@ -2304,6 +2372,15 @@ public class Generate implements Serializable
return false;
}
}
if (serializablePojos == null) {
if (other.serializablePojos!= null) {
return false;
}
} else {
if (!serializablePojos.equals(other.serializablePojos)) {
return false;
}
}
if (interfaces == null) {
if (other.interfaces!= null) {
return false;
@ -2322,6 +2399,15 @@ public class Generate implements Serializable
return false;
}
}
if (serializableInterfaces == null) {
if (other.serializableInterfaces!= null) {
return false;
}
} else {
if (!serializableInterfaces.equals(other.serializableInterfaces)) {
return false;
}
}
if (daos == null) {
if (other.daos!= null) {
return false;
@ -2691,8 +2777,10 @@ public class Generate implements Serializable
result = ((prime*result)+((pojosEqualsAndHashCode == null)? 0 :pojosEqualsAndHashCode.hashCode()));
result = ((prime*result)+((pojosToString == null)? 0 :pojosToString.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()));
result = ((prime*result)+((immutableInterfaces == null)? 0 :immutableInterfaces.hashCode()));
result = ((prime*result)+((serializableInterfaces == null)? 0 :serializableInterfaces.hashCode()));
result = ((prime*result)+((daos == null)? 0 :daos.hashCode()));
result = ((prime*result)+((jpaAnnotations == null)? 0 :jpaAnnotations.hashCode()));
result = ((prime*result)+((jpaVersion == null)? 0 :jpaVersion.hashCode()));

View File

@ -908,6 +908,10 @@ jOOQ version used for source code]]></jxb:javadoc></jxb:property></appinfo></ann
<annotation><appinfo><jxb:property><jxb:javadoc><![CDATA[Generate immutable POJOs.]]></jxb:javadoc></jxb:property></appinfo></annotation>
</element>
<element name="serializablePojos" type="boolean" default="true" minOccurs="0" maxOccurs="1">
<annotation><appinfo><jxb:property><jxb:javadoc><![CDATA[Generate serializable POJOs.]]></jxb:javadoc></jxb:property></appinfo></annotation>
</element>
<element name="interfaces" type="boolean" default="false" minOccurs="0" maxOccurs="1">
<annotation><appinfo><jxb:property><jxb:javadoc><![CDATA[Generated interfaces to be implemented by records and/or POJOs.]]></jxb:javadoc></jxb:property></appinfo></annotation>
</element>
@ -916,6 +920,10 @@ jOOQ version used for source code]]></jxb:javadoc></jxb:property></appinfo></ann
<annotation><appinfo><jxb:property><jxb:javadoc><![CDATA[Generate immutable interfaces.]]></jxb:javadoc></jxb:property></appinfo></annotation>
</element>
<element name="serializableInterfaces" type="boolean" default="true" minOccurs="0" maxOccurs="1">
<annotation><appinfo><jxb:property><jxb:javadoc><![CDATA[Generate serializable interfaces.]]></jxb:javadoc></jxb:property></appinfo></annotation>
</element>
<element name="daos" type="boolean" default="false" minOccurs="0" maxOccurs="1">
<annotation><appinfo><jxb:property><jxb:javadoc><![CDATA[Generate DAOs.]]></jxb:javadoc></jxb:property></appinfo></annotation>
</element>