From 300c63f54428c57858bf1f2481093b189da581e3 Mon Sep 17 00:00:00 2001 From: Jonas Matter Date: Tue, 3 Dec 2024 12:53:01 +0100 Subject: [PATCH 1/2] add pojo and fluent setters to default configuration for metamodel generator --- .../util/AdamJooqMetamodelGenerator.java | 106 +++++++++--------- 1 file changed, 51 insertions(+), 55 deletions(-) diff --git a/gradle-plugin/src/main/java/ch/ergon/adam/gradleplugin/util/AdamJooqMetamodelGenerator.java b/gradle-plugin/src/main/java/ch/ergon/adam/gradleplugin/util/AdamJooqMetamodelGenerator.java index 82409c7..44dbcaa 100644 --- a/gradle-plugin/src/main/java/ch/ergon/adam/gradleplugin/util/AdamJooqMetamodelGenerator.java +++ b/gradle-plugin/src/main/java/ch/ergon/adam/gradleplugin/util/AdamJooqMetamodelGenerator.java @@ -4,63 +4,59 @@ import java.nio.file.Path; import org.jooq.codegen.GenerationTool; -import org.jooq.meta.jaxb.Configuration; -import org.jooq.meta.jaxb.Database; -import org.jooq.meta.jaxb.Generate; -import org.jooq.meta.jaxb.Generator; -import org.jooq.meta.jaxb.Property; -import org.jooq.meta.jaxb.Strategy; -import org.jooq.meta.jaxb.Target; +import org.jooq.meta.jaxb.*; public class AdamJooqMetamodelGenerator { - private String packageName; - private Path outputPath; - private String source; - private String jooqConfig; - - public AdamJooqMetamodelGenerator(String packageName, Path outputPath, String source, String jooqConfig) { - this.packageName = packageName; - this.outputPath = outputPath; - this.source = source; - this.jooqConfig = jooqConfig; - } - - public void run() throws Exception { - Configuration configuration; - if (jooqConfig != null) { - configuration = GenerationTool.load(new ByteArrayInputStream(jooqConfig.getBytes("UTF-8"))); - } else { - configuration = buildConfiguration(); - } - GenerationTool.generate(configuration); - } - - private Configuration buildConfiguration() { - Configuration configuration; - configuration = new Configuration(); - - Generator generator = new Generator(); - Database database = new Database(); - database.setName(AdamDatabase.class.getName()); - database.getProperties().add(new Property().withKey(AdamDatabase.SOURCE_PROPERTY).withValue(source)); - generator.setDatabase(database); - - Strategy strategy = new Strategy(); - strategy.setName(TableSuffixGeneratorStrategy.class.getName()); - generator.setStrategy(strategy); - - Generate generate = new Generate(); - generate.setGlobalObjectReferences(true); - generate.setJavaTimeTypes(true); - generator.setGenerate(generate); - - Target target = new Target(); - target.setPackageName(packageName); - target.setDirectory(outputPath.toString()); - generator.setTarget(target); - configuration.setGenerator(generator); - return configuration; - } + private final String packageName; + private final Path outputPath; + private final String source; + private final String jooqConfig; + + public AdamJooqMetamodelGenerator(String packageName, Path outputPath, String source, String jooqConfig) { + this.packageName = packageName; + this.outputPath = outputPath; + this.source = source; + this.jooqConfig = jooqConfig; + } + + public void run() throws Exception { + Configuration configuration; + if (jooqConfig != null) { + configuration = GenerationTool.load(new ByteArrayInputStream(jooqConfig.getBytes("UTF-8"))); + } else { + configuration = buildConfiguration(); + } + GenerationTool.generate(configuration); + } + + private Configuration buildConfiguration() { + Configuration configuration; + configuration = new Configuration(); + + Generator generator = new Generator(); + Database database = new Database(); + database.setName(AdamDatabase.class.getName()); + database.getProperties().add(new Property().withKey(AdamDatabase.SOURCE_PROPERTY).withValue(source)); + generator.setDatabase(database); + + Strategy strategy = new Strategy(); + strategy.setName(TableSuffixGeneratorStrategy.class.getName()); + generator.setStrategy(strategy); + + Generate generate = new Generate(); + generate.setGlobalObjectReferences(true); + generate.setJavaTimeTypes(true); + generate.setPojos(true); + generate.setFluentSetters(true); + generator.setGenerate(generate); + + Target target = new Target(); + target.setPackageName(packageName); + target.setDirectory(outputPath.toString()); + generator.setTarget(target); + configuration.setGenerator(generator); + return configuration; + } } From 81d1de2fd9a54314fd1c5f88288c3682bd742950 Mon Sep 17 00:00:00 2001 From: Jonas Matter Date: Tue, 3 Dec 2024 13:01:39 +0100 Subject: [PATCH 2/2] add enum as user types to be correctly used in generated pojos --- .../util/AdamTableDefinition.java | 17 ++++--- .../src/main/resources/adam/schema/enums.yml | 5 ++ .../main/resources/adam/schema/test.table.yml | 4 ++ .../plugin/GenerateJooqMetamodelTest.java | 48 +++++++++++-------- 4 files changed, 47 insertions(+), 27 deletions(-) create mode 100644 integration-test-db/src/main/resources/adam/schema/enums.yml diff --git a/gradle-plugin/src/main/java/ch/ergon/adam/gradleplugin/util/AdamTableDefinition.java b/gradle-plugin/src/main/java/ch/ergon/adam/gradleplugin/util/AdamTableDefinition.java index 1d10278..2846888 100644 --- a/gradle-plugin/src/main/java/ch/ergon/adam/gradleplugin/util/AdamTableDefinition.java +++ b/gradle-plugin/src/main/java/ch/ergon/adam/gradleplugin/util/AdamTableDefinition.java @@ -5,6 +5,7 @@ import java.util.List; import org.jooq.Name; +import org.jooq.impl.DSL; import org.jooq.impl.SQLDataType; import org.jooq.meta.AbstractTableDefinition; import org.jooq.meta.ColumnDefinition; @@ -19,7 +20,7 @@ public class AdamTableDefinition extends AbstractTableDefinition { - private Table table; + private final Table table; public AdamTableDefinition(SchemaDefinition schema, Table table) { super(schema, table.getName(), null); @@ -37,11 +38,9 @@ protected List getElements0() throws SQLException { } private DataTypeDefinition dataTypeDefinition(Field field) { - DataTypeDefinition dataType = new DefaultDataTypeDefinition(getDatabase(), getSchema(), - typeName(field.getDataType()), field.getLength(), field.getPrecision(), field.getScale(), - field.isNullable(), field.getDefaultValue(), (Name) null); - - return dataType; + return new DefaultDataTypeDefinition(getDatabase(), getSchema(), + typeName(field.getDataType()), field.getLength(), field.getPrecision(), field.getScale(), + field.isNullable(), field.getDefaultValue(), getUserType(field)); } private String typeName(DataType type) { @@ -97,4 +96,10 @@ private boolean isIdentity(Field field) { return field.isSequence(); } + private Name getUserType(Field field) { + if (field.getDbEnum() != null) { + return DSL.name(field.getDbEnum().getName()); + } + return null; + } } diff --git a/integration-test-db/src/main/resources/adam/schema/enums.yml b/integration-test-db/src/main/resources/adam/schema/enums.yml new file mode 100644 index 0000000..2f69539 --- /dev/null +++ b/integration-test-db/src/main/resources/adam/schema/enums.yml @@ -0,0 +1,5 @@ +- name: test_status + values: + - CANCELLED + - ORDERED + - SHIPPED diff --git a/integration-test-db/src/main/resources/adam/schema/test.table.yml b/integration-test-db/src/main/resources/adam/schema/test.table.yml index 6b8afcc..84ccf32 100644 --- a/integration-test-db/src/main/resources/adam/schema/test.table.yml +++ b/integration-test-db/src/main/resources/adam/schema/test.table.yml @@ -21,6 +21,10 @@ fields: - name: "col5" dataType: "VARCHAR" nullable: true + - name: "col6" + dataType: ENUM + enumName: test_status + nullable: true foreignKeys: [] indexes: - name: "test_table_col1_key" diff --git a/integration-test/src/test/java/ch/ergon/adam/integrationtest/plugin/GenerateJooqMetamodelTest.java b/integration-test/src/test/java/ch/ergon/adam/integrationtest/plugin/GenerateJooqMetamodelTest.java index be0d19c..b8595be 100644 --- a/integration-test/src/test/java/ch/ergon/adam/integrationtest/plugin/GenerateJooqMetamodelTest.java +++ b/integration-test/src/test/java/ch/ergon/adam/integrationtest/plugin/GenerateJooqMetamodelTest.java @@ -15,25 +15,31 @@ public class GenerateJooqMetamodelTest { - private static Path tempFolder; - - @BeforeAll - public static void setupTempFolder() throws IOException { - tempFolder = Files.createTempDirectory("MetamodelTest"); - tempFolder.toFile().deleteOnExit(); - } - - @Test - public void testMetamodelGeneration() { - AdamJooqMetamodelGenerator generator = new AdamJooqMetamodelGenerator("test", tempFolder, - "yml-classpath://" + DEFAULT_SCHEMA_PACKAGE, null); - try { - generator.run(); - Path generated = tempFolder.resolve("test").resolve("tables").resolve("TestTableTable.java"); - assertTrue(generated.toFile().exists(), "Metamodel for test table must be generated"); - } catch (Exception e) { - e.printStackTrace(); - fail(e.getMessage()); - } - } + private static Path tempFolder; + + @BeforeAll + public static void setupTempFolder() throws IOException { + tempFolder = Files.createTempDirectory("MetamodelTest"); + tempFolder.toFile().deleteOnExit(); + } + + @Test + public void testMetamodelGeneration() { + AdamJooqMetamodelGenerator generator = new AdamJooqMetamodelGenerator("test", tempFolder, + "yml-classpath://" + DEFAULT_SCHEMA_PACKAGE, null); + try { + generator.run(); + Path tableFilePath = tempFolder.resolve("test").resolve("tables").resolve("TestTableTable.java"); + assertTrue(tableFilePath.toFile().exists(), "Metamodel for test table must be generated"); + + Path pojoFilePath = tempFolder.resolve("test").resolve("tables").resolve("pojos").resolve("TestTable.java"); + assertTrue(pojoFilePath.toFile().exists(), "Metamodel for test table pojo must be generated"); + + Path enumFilePath = tempFolder.resolve("test").resolve("enums").resolve("TestStatus.java"); + assertTrue(enumFilePath.toFile().exists(), "Metamodel for enums must be generated"); + } catch (Exception e) { + e.printStackTrace(); + fail(e.getMessage()); + } + } }