From 97311cafda219288dfecfa290f5cd7b5d87aa7cd Mon Sep 17 00:00:00 2001 From: Lukas Eder Date: Mon, 12 Jun 2023 17:26:09 +0200 Subject: [PATCH] [jOOQ/jOOQ#15209] Support ad-hoc compilation of programmatic objects in the code generator - Add support for GeneratorStrategy --- .../java/org/jooq/codegen/GenerationTool.java | 9 +++++ .../java/org/jooq/meta/jaxb/Strategy.java | 39 +++++++++++++++++++ .../org/jooq/meta/xsd/jooq-codegen-3.19.0.xsd | 4 ++ 3 files changed, 52 insertions(+) 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 d935233784..cd4ac83c7b 100644 --- a/jOOQ-codegen/src/main/java/org/jooq/codegen/GenerationTool.java +++ b/jOOQ-codegen/src/main/java/org/jooq/codegen/GenerationTool.java @@ -96,6 +96,7 @@ import org.jooq.meta.jaxb.Target; import org.jooq.tools.JooqLogger; import org.jooq.tools.StringUtils; import org.jooq.tools.jdbc.JDBCUtils; +import org.jooq.tools.reflect.Reflect; import org.jooq.util.jaxb.tools.MiniJAXB; @@ -412,6 +413,14 @@ public class GenerationTool { g.getStrategy().setName(null); } } + else if (!isBlank(g.getStrategy().getJava())) { + Object o = Reflect.compile(g.getStrategy().getName(), g.getStrategy().getJava()).create().get(); + + if (o instanceof GeneratorStrategy s) + strategy = s; + else + throw new GeneratorException("GeneratorStrategy must implement org.jooq.codegen.GeneratorStrategy"); + } else { Class strategyClass = (Class) (!isBlank(g.getStrategy().getName()) ? loadClass(trim(g.getStrategy().getName())) diff --git a/jOOQ-meta/src/main/java/org/jooq/meta/jaxb/Strategy.java b/jOOQ-meta/src/main/java/org/jooq/meta/jaxb/Strategy.java index 2e9019040e..632a601f73 100644 --- a/jOOQ-meta/src/main/java/org/jooq/meta/jaxb/Strategy.java +++ b/jOOQ-meta/src/main/java/org/jooq/meta/jaxb/Strategy.java @@ -21,6 +21,7 @@ import org.jooq.util.jaxb.tools.XMLBuilder; @XmlAccessorType(XmlAccessType.FIELD) @XmlType(name = "Strategy", propOrder = { "name", + "java", "matchers" }) @SuppressWarnings({ @@ -33,6 +34,8 @@ public class Strategy implements Serializable, XMLAppendable @XmlElement(defaultValue = "org.jooq.codegen.DefaultGeneratorStrategy") @XmlJavaTypeAdapter(StringAdapter.class) protected String name = "org.jooq.codegen.DefaultGeneratorStrategy"; + @XmlJavaTypeAdapter(StringAdapter.class) + protected String java; protected Matchers matchers; /** @@ -51,6 +54,22 @@ public class Strategy implements Serializable, XMLAppendable this.name = value; } + /** + * A self-contained, inline implementation of {@link org.jooq.codegen.GeneratorStrategy} that will be compiled and class-loaded on the fly by the code generator. + * + */ + public String getJava() { + return java; + } + + /** + * A self-contained, inline implementation of {@link org.jooq.codegen.GeneratorStrategy} that will be compiled and class-loaded on the fly by the code generator. + * + */ + public void setJava(String value) { + this.java = value; + } + /** * The matcher strategy configuration used when applying an XML-based strategy. This cannot be combined with a named strategy configuration. * @@ -76,6 +95,15 @@ public class Strategy implements Serializable, XMLAppendable return this; } + /** + * A self-contained, inline implementation of {@link org.jooq.codegen.GeneratorStrategy} that will be compiled and class-loaded on the fly by the code generator. + * + */ + public Strategy withJava(String value) { + setJava(value); + return this; + } + /** * The matcher strategy configuration used when applying an XML-based strategy. This cannot be combined with a named strategy configuration. * @@ -88,6 +116,7 @@ public class Strategy implements Serializable, XMLAppendable @Override public final void appendTo(XMLBuilder builder) { builder.append("name", name); + builder.append("java", java); builder.append("matchers", matchers); } @@ -119,6 +148,15 @@ public class Strategy implements Serializable, XMLAppendable return false; } } + if (java == null) { + if (other.java!= null) { + return false; + } + } else { + if (!java.equals(other.java)) { + return false; + } + } if (matchers == null) { if (other.matchers!= null) { return false; @@ -136,6 +174,7 @@ public class Strategy implements Serializable, XMLAppendable final int prime = 31; int result = 1; result = ((prime*result)+((name == null)? 0 :name.hashCode())); + result = ((prime*result)+((java == null)? 0 :java.hashCode())); result = ((prime*result)+((matchers == null)? 0 :matchers.hashCode())); return result; } diff --git a/jOOQ-meta/src/main/resources/org/jooq/meta/xsd/jooq-codegen-3.19.0.xsd b/jOOQ-meta/src/main/resources/org/jooq/meta/xsd/jooq-codegen-3.19.0.xsd index 7ddadb2006..98f62d208e 100644 --- a/jOOQ-meta/src/main/resources/org/jooq/meta/xsd/jooq-codegen-3.19.0.xsd +++ b/jOOQ-meta/src/main/resources/org/jooq/meta/xsd/jooq-codegen-3.19.0.xsd @@ -157,6 +157,10 @@ + + + +