From f7e72cd17db3c0177af97f506bb374a78d51567a Mon Sep 17 00:00:00 2001 From: Lukas Eder Date: Thu, 7 Apr 2022 14:56:07 +0200 Subject: [PATCH] [jOOQ/jOOQ#13432] Add code generation option to --- .../org/jooq/codegen/AbstractGenerator.java | 5 +- .../java/org/jooq/codegen/JavaGenerator.java | 50 ++++++++++------- .../java/org/jooq/meta/AbstractDatabase.java | 30 ++++++++-- .../meta/AbstractTypedElementDefinition.java | 1 + .../java/org/jooq/meta/jaxb/CustomType.java | 42 ++++++++++++++ .../java/org/jooq/meta/jaxb/ForcedType.java | 56 +++++++++++++++++++ .../jooq/meta/jaxb/VisibilityModifier.java | 4 +- .../org/jooq/meta/xsd/jooq-codegen-3.17.0.xsd | 23 ++++++++ 8 files changed, 186 insertions(+), 25 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 a3d36d7ce3..d0d32f68a3 100644 --- a/jOOQ-codegen/src/main/java/org/jooq/codegen/AbstractGenerator.java +++ b/jOOQ-codegen/src/main/java/org/jooq/codegen/AbstractGenerator.java @@ -347,7 +347,10 @@ abstract class AbstractGenerator implements Generator { @Override public void setGenerateVisibilityModifier(VisibilityModifier generateVisibilityModifier) { - this.generateVisibilityModifier = generateVisibilityModifier; + if (generateVisibilityModifier == VisibilityModifier.PRIVATE) + log.warn("Visibility", "The private visibility modifier cannot be used globally, to be applied to classes. It can only be used on configurations."); + else + this.generateVisibilityModifier = generateVisibilityModifier; } @Override 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 6580fd2a06..9af0383a7d 100644 --- a/jOOQ-codegen/src/main/java/org/jooq/codegen/JavaGenerator.java +++ b/jOOQ-codegen/src/main/java/org/jooq/codegen/JavaGenerator.java @@ -179,7 +179,9 @@ import org.jooq.meta.TableDefinition; import org.jooq.meta.TypedElementDefinition; import org.jooq.meta.UDTDefinition; import org.jooq.meta.UniqueKeyDefinition; +import org.jooq.meta.jaxb.ForcedType; import org.jooq.meta.jaxb.GeneratedAnnotationType; +import org.jooq.meta.jaxb.VisibilityModifier; // ... // ... // ... @@ -369,27 +371,28 @@ public class JavaGenerator extends AbstractGenerator { } private String visibility() { - if (visibility == null) { - switch (generateVisibilityModifier()) { - case NONE: - visibility = ""; - break; - case PUBLIC: - visibility = scala ? "" : "public "; - break; - case INTERNAL: - visibility = scala ? "" : kotlin ? "internal " : "public "; - break; - case DEFAULT: - default: - visibility = scala || kotlin ? "" : "public "; - break; - } - } + if (visibility == null) + visibility = visibility(generateVisibilityModifier()); return visibility; } + private String visibility(VisibilityModifier modifier) { + switch (modifier) { + case NONE: + return ""; + case PUBLIC: + return scala ? "" : "public "; + case INTERNAL: + return scala ? "" : kotlin ? "internal " : "public "; + case PRIVATE: + return "private "; + case DEFAULT: + default: + return scala || kotlin ? "" : "public "; + } + } + @Override public final void generate0(Database db) { this.isoDate = Instant.now().toString(); @@ -5808,12 +5811,21 @@ public class JavaGenerator extends AbstractGenerator { - final String columnVisibility = + + + final String columnVisibility; - visibility(); + + + + + + + + columnVisibility = visibility(); if (!printDeprecationIfUnknownType(out, columnTypeFull)) out.javadoc("The column %s.[[before= ][%s]]", column.getQualifiedOutputName(), list(escapeEntities(comment(column)))); diff --git a/jOOQ-meta/src/main/java/org/jooq/meta/AbstractDatabase.java b/jOOQ-meta/src/main/java/org/jooq/meta/AbstractDatabase.java index 3250dab59b..5a3d0714a8 100644 --- a/jOOQ-meta/src/main/java/org/jooq/meta/AbstractDatabase.java +++ b/jOOQ-meta/src/main/java/org/jooq/meta/AbstractDatabase.java @@ -329,6 +329,18 @@ public abstract class AbstractDatabase implements Database { return connection; } + public boolean commercial() { + return create().configuration().commercial(); + } + + public boolean commercial(Supplier logMessage) { + return create().configuration().commercial(logMessage); + } + + public boolean requireCommercial(Supplier logMessage) { + return create().configuration().requireCommercial(logMessage); + } + @Override public final DSLContext create() { return create(false); @@ -1404,17 +1416,27 @@ public abstract class AbstractDatabase implements Database { if (StringUtils.isBlank(type.getName())) { if (StringUtils.isBlank(type.getUserType()) && StringUtils.isBlank(type.getGenerator())) { - log.warn("Bad configuration for . Either , , or is required: " + type); + if (type.getVisibilityModifier() == null) { + log.warn("Bad configuration for . Either , , , or is required: " + type); - it2.remove(); - continue; + it2.remove(); + continue; + } + else if (!commercial()) { + log.warn(" is a commercial only feature. Please upgrade to the jOOQ Professional Edition or jOOQ Enterprise Edition: " + type); + + it2.remove(); + continue; + } } if (StringUtils.isBlank(type.getBinding()) && StringUtils.isBlank(type.getConverter()) && StringUtils.isBlank(type.getGenerator()) && + type.getVisibilityModifier() == null && !Boolean.TRUE.equals(type.isEnumConverter()) && - type.getLambdaConverter() == null) { + type.getLambdaConverter() == null + ) { log.warn("Bad configuration for . Either , , , , or is required: " + type); it2.remove(); diff --git a/jOOQ-meta/src/main/java/org/jooq/meta/AbstractTypedElementDefinition.java b/jOOQ-meta/src/main/java/org/jooq/meta/AbstractTypedElementDefinition.java index 3dbfd806da..812f7a64cf 100644 --- a/jOOQ-meta/src/main/java/org/jooq/meta/AbstractTypedElementDefinition.java +++ b/jOOQ-meta/src/main/java/org/jooq/meta/AbstractTypedElementDefinition.java @@ -348,6 +348,7 @@ public abstract class AbstractTypedElementDefinition .withBinding(forcedType.getBinding()) .withEnumConverter(forcedType.isEnumConverter()) .withLambdaConverter(forcedType.getLambdaConverter()) + .withVisibilityModifier(forcedType.getVisibilityModifier()) .withGenerator(forcedType.getGenerator()) .withConverter(forcedType.getConverter()) .withName(name) diff --git a/jOOQ-meta/src/main/java/org/jooq/meta/jaxb/CustomType.java b/jOOQ-meta/src/main/java/org/jooq/meta/jaxb/CustomType.java index 1ee884684e..05693d9d90 100644 --- a/jOOQ-meta/src/main/java/org/jooq/meta/jaxb/CustomType.java +++ b/jOOQ-meta/src/main/java/org/jooq/meta/jaxb/CustomType.java @@ -5,6 +5,7 @@ import java.io.Serializable; import jakarta.xml.bind.annotation.XmlAccessType; import jakarta.xml.bind.annotation.XmlAccessorType; import jakarta.xml.bind.annotation.XmlElement; +import jakarta.xml.bind.annotation.XmlSchemaType; import jakarta.xml.bind.annotation.XmlType; import jakarta.xml.bind.annotation.adapters.XmlJavaTypeAdapter; import org.jooq.util.jaxb.tools.StringAdapter; @@ -35,6 +36,8 @@ public class CustomType implements Serializable, XMLAppendable protected String name; @XmlJavaTypeAdapter(StringAdapter.class) protected String type; + @XmlSchemaType(name = "string") + protected VisibilityModifier visibilityModifier; @XmlJavaTypeAdapter(StringAdapter.class) protected String generator; @XmlJavaTypeAdapter(StringAdapter.class) @@ -80,6 +83,24 @@ public class CustomType implements Serializable, XMLAppendable this.type = value; } + /** + * @deprecated Use ForcedType only + * + */ + @Deprecated + public VisibilityModifier getVisibilityModifier() { + return visibilityModifier; + } + + /** + * @deprecated Use ForcedType only + * + */ + @Deprecated + public void setVisibilityModifier(VisibilityModifier value) { + this.visibilityModifier = value; + } + /** * @deprecated Use ForcedType only * @@ -198,6 +219,16 @@ public class CustomType implements Serializable, XMLAppendable return this; } + /** + * @deprecated Use ForcedType only + * + */ + @Deprecated + public CustomType withVisibilityModifier(VisibilityModifier value) { + setVisibilityModifier(value); + return this; + } + /** * @deprecated Use ForcedType only * @@ -247,6 +278,7 @@ public class CustomType implements Serializable, XMLAppendable public final void appendTo(XMLBuilder builder) { builder.append("name", name); builder.append("type", type); + builder.append("visibilityModifier", visibilityModifier); builder.append("generator", generator); builder.append("converter", converter); builder.append("enumConverter", enumConverter); @@ -291,6 +323,15 @@ public class CustomType implements Serializable, XMLAppendable return false; } } + if (visibilityModifier == null) { + if (other.visibilityModifier!= null) { + return false; + } + } else { + if (!visibilityModifier.equals(other.visibilityModifier)) { + return false; + } + } if (generator == null) { if (other.generator!= null) { return false; @@ -345,6 +386,7 @@ public class CustomType implements Serializable, XMLAppendable int result = 1; result = ((prime*result)+((name == null)? 0 :name.hashCode())); result = ((prime*result)+((type == null)? 0 :type.hashCode())); + result = ((prime*result)+((visibilityModifier == null)? 0 :visibilityModifier.hashCode())); result = ((prime*result)+((generator == null)? 0 :generator.hashCode())); result = ((prime*result)+((converter == null)? 0 :converter.hashCode())); result = ((prime*result)+((enumConverter == null)? 0 :enumConverter.hashCode())); diff --git a/jOOQ-meta/src/main/java/org/jooq/meta/jaxb/ForcedType.java b/jOOQ-meta/src/main/java/org/jooq/meta/jaxb/ForcedType.java index 9594bc8667..052010f30d 100644 --- a/jOOQ-meta/src/main/java/org/jooq/meta/jaxb/ForcedType.java +++ b/jOOQ-meta/src/main/java/org/jooq/meta/jaxb/ForcedType.java @@ -36,6 +36,8 @@ public class ForcedType implements Serializable, XMLAppendable protected String name; @XmlJavaTypeAdapter(StringAdapter.class) protected String userType; + @XmlSchemaType(name = "string") + protected VisibilityModifier visibilityModifier; @XmlJavaTypeAdapter(StringAdapter.class) protected String generator; @XmlJavaTypeAdapter(StringAdapter.class) @@ -121,9 +123,35 @@ public class ForcedType implements Serializable, XMLAppendable this.userType = value; } + /** + * The visibility modifier to be used in generated code for the column that is matched by this forced type, if applicable. + *

+ * This has no effect on matched objects that are not columns. + *

+ * This feature is available in the commercial distribution only. + * + */ + public VisibilityModifier getVisibilityModifier() { + return visibilityModifier; + } + + /** + * The visibility modifier to be used in generated code for the column that is matched by this forced type, if applicable. + *

+ * This has no effect on matched objects that are not columns. + *

+ * This feature is available in the commercial distribution only. + * + */ + public void setVisibilityModifier(VisibilityModifier value) { + this.visibilityModifier = value; + } + /** * A {@link org.jooq.Generator} implementation used for client-side computed columns. *

+ * This has no effect on matched objects that are not columns. + *

* This feature is available in the commercial distribution only. * */ @@ -134,6 +162,8 @@ public class ForcedType implements Serializable, XMLAppendable /** * A {@link org.jooq.Generator} implementation used for client-side computed columns. *

+ * This has no effect on matched objects that are not columns. + *

* This feature is available in the commercial distribution only. * */ @@ -417,9 +447,24 @@ public class ForcedType implements Serializable, XMLAppendable return this; } + /** + * The visibility modifier to be used in generated code for the column that is matched by this forced type, if applicable. + *

+ * This has no effect on matched objects that are not columns. + *

+ * This feature is available in the commercial distribution only. + * + */ + public ForcedType withVisibilityModifier(VisibilityModifier value) { + setVisibilityModifier(value); + return this; + } + /** * A {@link org.jooq.Generator} implementation used for client-side computed columns. *

+ * This has no effect on matched objects that are not columns. + *

* This feature is available in the commercial distribution only. * */ @@ -562,6 +607,7 @@ public class ForcedType implements Serializable, XMLAppendable builder.append("priority", priority); builder.append("name", name); builder.append("userType", userType); + builder.append("visibilityModifier", visibilityModifier); builder.append("generator", generator); builder.append("converter", converter); builder.append("enumConverter", enumConverter); @@ -625,6 +671,15 @@ public class ForcedType implements Serializable, XMLAppendable return false; } } + if (visibilityModifier == null) { + if (other.visibilityModifier!= null) { + return false; + } + } else { + if (!visibilityModifier.equals(other.visibilityModifier)) { + return false; + } + } if (generator == null) { if (other.generator!= null) { return false; @@ -770,6 +825,7 @@ public class ForcedType implements Serializable, XMLAppendable result = ((prime*result)+((priority == null)? 0 :priority.hashCode())); result = ((prime*result)+((name == null)? 0 :name.hashCode())); result = ((prime*result)+((userType == null)? 0 :userType.hashCode())); + result = ((prime*result)+((visibilityModifier == null)? 0 :visibilityModifier.hashCode())); result = ((prime*result)+((generator == null)? 0 :generator.hashCode())); result = ((prime*result)+((converter == null)? 0 :converter.hashCode())); result = ((prime*result)+((enumConverter == null)? 0 :enumConverter.hashCode())); diff --git a/jOOQ-meta/src/main/java/org/jooq/meta/jaxb/VisibilityModifier.java b/jOOQ-meta/src/main/java/org/jooq/meta/jaxb/VisibilityModifier.java index 7ea7c549b3..0fcd65a3e9 100644 --- a/jOOQ-meta/src/main/java/org/jooq/meta/jaxb/VisibilityModifier.java +++ b/jOOQ-meta/src/main/java/org/jooq/meta/jaxb/VisibilityModifier.java @@ -16,6 +16,7 @@ import jakarta.xml.bind.annotation.XmlType; * <enumeration value="NONE"/> * <enumeration value="PUBLIC"/> * <enumeration value="INTERNAL"/> + * <enumeration value="PRIVATE"/> * </restriction> * </simpleType> * @@ -28,7 +29,8 @@ public enum VisibilityModifier { DEFAULT, NONE, PUBLIC, - INTERNAL; + INTERNAL, + PRIVATE; public String value() { return name(); 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 78ee4f6951..f4f35a4440 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 @@ -1339,6 +1339,18 @@ This feature is available in the commercial distribution only.]]>< + + + + + + + @java.lang.Deprecated + @java.lang.Deprecated + + + + @@ -1486,9 +1498,19 @@ If provided, {@link #getName()} will be ignored, and either {@link #getConverter or {@link #getBinding()} is required]]> + + +This has no effect on matched objects that are not columns. +

+This feature is available in the commercial distribution only.]]> + + +This has no effect on matched objects that are not columns. +

This feature is available in the commercial distribution only.]]> @@ -2121,6 +2143,7 @@ e.g. org.jooq.generated.schema1, org.jooq.generated.schema2]]> +