From b91ae5e4a7b9757a0e641d3e5f8658cc256121cd Mon Sep 17 00:00:00 2001 From: alberlau Date: Thu, 21 Dec 2023 19:32:44 +0200 Subject: [PATCH] Add support for LocalDate --- java-pojo-generator-mojo-example/pom.xml | 10 +++---- .../testpkg/TestTable1RepositoryTest.java | 8 ++---- .../generator/java/pojo/mojo/PojoMojo.java | 10 ++++--- .../generator/java/pojo/ExecutorParams.java | 10 ++++++- .../java/pojo/GeneratorExecutor.java | 8 +++++- .../generator/java/pojo/adapter/DateImpl.java | 6 ++++ .../java/pojo/adapter/JavaClassAdapter.java | 6 ++-- .../pojo/adapter/JavaDatabaseAdapter.java | 7 +++-- .../pojo/adapter/JavaPropertyAdapter.java | 28 +++++++++++++++++-- .../src/main/resources/spring-data.mustache | 8 ++++-- .../java/pojo/GeneratorExecutorTest.java | 4 ++- 11 files changed, 76 insertions(+), 29 deletions(-) create mode 100644 java-pojo-generator/src/main/java/org/db2code/generator/java/pojo/adapter/DateImpl.java diff --git a/java-pojo-generator-mojo-example/pom.xml b/java-pojo-generator-mojo-example/pom.xml index 251aa2e..91fee19 100644 --- a/java-pojo-generator-mojo-example/pom.xml +++ b/java-pojo-generator-mojo-example/pom.xml @@ -70,8 +70,7 @@ generatePojo - jdbc:h2:mem:test;DB_CLOSE_DELAY=-1;INIT=RUNSCRIPT FROM '${project.basedir}/init.sql' - + jdbc:h2:mem:test;DB_CLOSE_DELAY=-1;INIT=RUNSCRIPT FROM '${project.basedir}/init.sql' org.h2.Driver @@ -91,8 +90,8 @@ generatePojo - jdbc:h2:mem:test;DB_CLOSE_DELAY=-1;INIT=RUNSCRIPT FROM '${project.basedir}/init.sql' - + jdbc:h2:mem:test;DB_CLOSE_DELAY=-1;INIT=RUNSCRIPT FROM '${project.basedir}/init.sql' + LOCAL_DATE org.h2.Driver @@ -114,8 +113,7 @@ generatePojo - jdbc:h2:mem:test;DB_CLOSE_DELAY=-1;INIT=RUNSCRIPT FROM '${project.basedir}/init.sql' - + jdbc:h2:mem:test;DB_CLOSE_DELAY=-1;INIT=RUNSCRIPT FROM '${project.basedir}/init.sql' org.h2.Driver diff --git a/java-pojo-generator-mojo-example/src/test/java/testpkg/TestTable1RepositoryTest.java b/java-pojo-generator-mojo-example/src/test/java/testpkg/TestTable1RepositoryTest.java index 6d4ec14..8a1deaa 100644 --- a/java-pojo-generator-mojo-example/src/test/java/testpkg/TestTable1RepositoryTest.java +++ b/java-pojo-generator-mojo-example/src/test/java/testpkg/TestTable1RepositoryTest.java @@ -5,8 +5,6 @@ import java.math.BigDecimal; import java.time.LocalDate; -import java.time.ZoneId; -import java.util.Date; import org.junit.jupiter.api.Test; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.boot.test.context.SpringBootTest; @@ -27,10 +25,8 @@ public void testSaveAndFind() { TestTable1 entity = new TestTable1(); entity.setTestVarchar("Test Name"); entity.setTestNumeric(BigDecimal.ONE); - entity.setTestDate( - Date.from(LocalDate.now().atStartOfDay(ZoneId.systemDefault()).toInstant())); - entity.setTestDatetime( - Date.from(LocalDate.now().atStartOfDay(ZoneId.systemDefault()).toInstant())); + entity.setTestDate(LocalDate.now()); + entity.setTestDatetime(LocalDate.now().atStartOfDay()); TestTable1 savedEntity = repository.save(entity); assertThat(savedEntity).isNotNull(); diff --git a/java-pojo-generator-mojo/src/main/java/org/db2code/generator/java/pojo/mojo/PojoMojo.java b/java-pojo-generator-mojo/src/main/java/org/db2code/generator/java/pojo/mojo/PojoMojo.java index 99a268d..f4b340c 100644 --- a/java-pojo-generator-mojo/src/main/java/org/db2code/generator/java/pojo/mojo/PojoMojo.java +++ b/java-pojo-generator-mojo/src/main/java/org/db2code/generator/java/pojo/mojo/PojoMojo.java @@ -3,8 +3,6 @@ import java.util.Collections; import java.util.List; import org.apache.maven.plugin.AbstractMojo; -import org.apache.maven.plugin.MojoExecutionException; -import org.apache.maven.plugin.MojoFailureException; import org.apache.maven.plugins.annotations.LifecyclePhase; import org.apache.maven.plugins.annotations.Mojo; import org.apache.maven.plugins.annotations.Parameter; @@ -15,6 +13,7 @@ import org.db2code.generator.java.pojo.ExecutorParams; import org.db2code.generator.java.pojo.Generator; import org.db2code.generator.java.pojo.GeneratorExecutor; +import org.db2code.generator.java.pojo.adapter.DateImpl; @Mojo(name = "generatePojo", defaultPhase = LifecyclePhase.GENERATE_SOURCES) public class PojoMojo extends AbstractMojo { @@ -38,7 +37,9 @@ public class PojoMojo extends AbstractMojo { @Parameter private String ext; - public void execute() throws MojoExecutionException, MojoFailureException { + @Parameter private DateImpl dateImpl; + + public void execute() { if (isWindows()) { jdbcUrl = jdbcUrl.replace("\\", "\\\\"); } @@ -64,7 +65,8 @@ public void execute() throws MojoExecutionException, MojoFailureException { this.targetPackage, this.targetFolder, this.baseDir, - ext)); + ext, + dateImpl)); } public static boolean isWindows() { diff --git a/java-pojo-generator/src/main/java/org/db2code/generator/java/pojo/ExecutorParams.java b/java-pojo-generator/src/main/java/org/db2code/generator/java/pojo/ExecutorParams.java index c4fe2a5..77d7c36 100644 --- a/java-pojo-generator/src/main/java/org/db2code/generator/java/pojo/ExecutorParams.java +++ b/java-pojo-generator/src/main/java/org/db2code/generator/java/pojo/ExecutorParams.java @@ -2,6 +2,7 @@ import java.util.Collection; import org.db2code.extractors.ExtractionParameters; +import org.db2code.generator.java.pojo.adapter.DateImpl; public class ExecutorParams { private final Collection extractionParameters; @@ -10,6 +11,7 @@ public class ExecutorParams { private final String targetFolder; private final String baseDir; private final String ext; + private final DateImpl dateImpl; public ExecutorParams( Collection extractionParameters, @@ -17,13 +19,15 @@ public ExecutorParams( String targetPackage, String targetFolder, String baseDir, - String ext) { + String ext, + DateImpl dateImpl) { this.extractionParameters = extractionParameters; this.templates = templates; this.targetPackage = targetPackage; this.targetFolder = targetFolder; this.baseDir = baseDir; this.ext = ext; + this.dateImpl = dateImpl; } public Collection getExtractionParameters() { @@ -49,4 +53,8 @@ public Collection getTemplates() { public String getExt() { return ext; } + + public DateImpl getDateImpl() { + return dateImpl; + } } diff --git a/java-pojo-generator/src/main/java/org/db2code/generator/java/pojo/GeneratorExecutor.java b/java-pojo-generator/src/main/java/org/db2code/generator/java/pojo/GeneratorExecutor.java index a781e85..8e26d4b 100644 --- a/java-pojo-generator/src/main/java/org/db2code/generator/java/pojo/GeneratorExecutor.java +++ b/java-pojo-generator/src/main/java/org/db2code/generator/java/pojo/GeneratorExecutor.java @@ -1,6 +1,7 @@ package org.db2code.generator.java.pojo; import org.db2code.MetadataExtractor; +import org.db2code.generator.java.pojo.adapter.DateImpl; import org.db2code.generator.java.pojo.adapter.JavaClassAdapter; import org.db2code.generator.java.pojo.adapter.JavaDatabaseAdapter; import org.db2code.rawmodel.RawDatabaseMetadata; @@ -24,7 +25,12 @@ public void execute(ExecutorParams params) { param -> { RawDatabaseMetadata metadata = metadataExtractor.extract(param); - new JavaDatabaseAdapter(metadata, params.getTargetPackage()) + DateImpl dateImpl = params.getDateImpl(); + if (dateImpl == null) { + dateImpl = DateImpl.UTIL_DATE; + } + + new JavaDatabaseAdapter(metadata, params.getTargetPackage(), dateImpl) .getClasses() .forEach( javaClass -> diff --git a/java-pojo-generator/src/main/java/org/db2code/generator/java/pojo/adapter/DateImpl.java b/java-pojo-generator/src/main/java/org/db2code/generator/java/pojo/adapter/DateImpl.java new file mode 100644 index 0000000..74965cd --- /dev/null +++ b/java-pojo-generator/src/main/java/org/db2code/generator/java/pojo/adapter/DateImpl.java @@ -0,0 +1,6 @@ +package org.db2code.generator.java.pojo.adapter; + +public enum DateImpl { + UTIL_DATE, + LOCAL_DATE +} diff --git a/java-pojo-generator/src/main/java/org/db2code/generator/java/pojo/adapter/JavaClassAdapter.java b/java-pojo-generator/src/main/java/org/db2code/generator/java/pojo/adapter/JavaClassAdapter.java index ec9637a..54adfa9 100644 --- a/java-pojo-generator/src/main/java/org/db2code/generator/java/pojo/adapter/JavaClassAdapter.java +++ b/java-pojo-generator/src/main/java/org/db2code/generator/java/pojo/adapter/JavaClassAdapter.java @@ -8,10 +8,12 @@ public class JavaClassAdapter { private final RawTable rawTable; private final String targetPackage; + private final DateImpl dateImpl; - public JavaClassAdapter(RawTable rawTable, String targetPackage) { + public JavaClassAdapter(RawTable rawTable, String targetPackage, DateImpl dateImpl) { this.rawTable = rawTable; this.targetPackage = targetPackage; + this.dateImpl = dateImpl; } public String getClassName() { @@ -28,7 +30,7 @@ public String getPackage() { public Collection getProperties() { return rawTable.getColumns().stream() - .map(rawColumn -> new JavaPropertyAdapter(rawTable, rawColumn)) + .map(rawColumn -> new JavaPropertyAdapter(rawTable, rawColumn, dateImpl)) .collect(Collectors.toList()); } } diff --git a/java-pojo-generator/src/main/java/org/db2code/generator/java/pojo/adapter/JavaDatabaseAdapter.java b/java-pojo-generator/src/main/java/org/db2code/generator/java/pojo/adapter/JavaDatabaseAdapter.java index 1bb8263..0f2c9e2 100644 --- a/java-pojo-generator/src/main/java/org/db2code/generator/java/pojo/adapter/JavaDatabaseAdapter.java +++ b/java-pojo-generator/src/main/java/org/db2code/generator/java/pojo/adapter/JavaDatabaseAdapter.java @@ -8,15 +8,18 @@ public class JavaDatabaseAdapter { private final RawDatabaseMetadata rawDatabaseMetadata; private final String targetPackage; + private final DateImpl dateImpl; - public JavaDatabaseAdapter(RawDatabaseMetadata rawDatabaseMetadata, String targetPackage) { + public JavaDatabaseAdapter( + RawDatabaseMetadata rawDatabaseMetadata, String targetPackage, DateImpl dateImpl) { this.rawDatabaseMetadata = rawDatabaseMetadata; this.targetPackage = targetPackage; + this.dateImpl = dateImpl; } public Collection getClasses() { return rawDatabaseMetadata.getTables().stream() - .map((RawTable rawTable) -> new JavaClassAdapter(rawTable, targetPackage)) + .map((RawTable rawTable) -> new JavaClassAdapter(rawTable, targetPackage, dateImpl)) .collect(Collectors.toList()); } } diff --git a/java-pojo-generator/src/main/java/org/db2code/generator/java/pojo/adapter/JavaPropertyAdapter.java b/java-pojo-generator/src/main/java/org/db2code/generator/java/pojo/adapter/JavaPropertyAdapter.java index a9e46a9..c473297 100644 --- a/java-pojo-generator/src/main/java/org/db2code/generator/java/pojo/adapter/JavaPropertyAdapter.java +++ b/java-pojo-generator/src/main/java/org/db2code/generator/java/pojo/adapter/JavaPropertyAdapter.java @@ -1,5 +1,6 @@ package org.db2code.generator.java.pojo.adapter; +import java.util.Objects; import java.util.Set; import java.util.stream.Collectors; import org.db2code.convert.JavaPropertyConverter; @@ -14,16 +15,20 @@ public class JavaPropertyAdapter { private final String JAVA_CHAR = "Char"; private final String JAVA_STRING = "String"; private final String JAVA_DATE = "java.util.Date"; + private final String JAVA_LOCAL_DATE = "java.time.LocalDate"; + private final String JAVA_LOCAL_DATE_TIME = "java.time.LocalDateTime"; private final String JAVA_BYTE_ARRAY = "byte[]"; private final String JAVA_CHAR_ARRAY = "char[]"; private final String JAVA_OBJECT = "Object"; private final String JAVA_BOOLEAN = "Boolean"; private final RawTable rawTable; private final Set primaryKeyColumns; + private final DateImpl dateImpl; - public JavaPropertyAdapter(RawTable rawTable, RawColumn rawColumn) { + public JavaPropertyAdapter(RawTable rawTable, RawColumn rawColumn, DateImpl dateImpl) { this.rawTable = rawTable; this.rawColumn = rawColumn; + this.dateImpl = dateImpl; this.primaryKeyColumns = rawTable.getPrimaryKey().stream() .map(RawTable.RawPrimaryKey::getColumnName) @@ -53,7 +58,7 @@ public Boolean getIsNullable() { } public Integer getSize() { - if (getJavaType() == JAVA_STRING) { + if (Objects.equals(getJavaType(), JAVA_STRING)) { return rawColumn.getColumnSize(); } else { return null; @@ -84,11 +89,12 @@ public String getJavaType() { case -16: return JAVA_STRING; case 91: + return resolveDateImpl(); case 92: case 93: case 2013: case 2014: - return JAVA_DATE; + return resolveTimeImpl(); case -2: case -3: case -4: @@ -117,4 +123,20 @@ public String getJavaType() { + rawColumn.getTableName()); } } + + private String resolveDateImpl() { + if (dateImpl == DateImpl.UTIL_DATE) { + return JAVA_DATE; + } else { + return JAVA_LOCAL_DATE; + } + } + + private String resolveTimeImpl() { + if (dateImpl == DateImpl.UTIL_DATE) { + return JAVA_DATE; + } else { + return JAVA_LOCAL_DATE_TIME; + } + } } diff --git a/java-pojo-generator/src/main/resources/spring-data.mustache b/java-pojo-generator/src/main/resources/spring-data.mustache index 125c8ed..2250643 100644 --- a/java-pojo-generator/src/main/resources/spring-data.mustache +++ b/java-pojo-generator/src/main/resources/spring-data.mustache @@ -14,9 +14,11 @@ public class {{className}} { /** {{rawColumn.remarks}} {{rawColumn.columnName}} {{rawColumn.typeName}}({{rawColumn.columnSize}}) Nullable={{rawColumn.isNullable}} */ - {{^isNullable}}@jakarta.validation.constraints.NotNull{{/isNullable}}{{#isNullable}} - {{/isNullable}}{{#size}}@jakarta.validation.constraints.Size(max = {{size}}){{/size}} - @Column("{{rawColumn.columnName}}") {{#isId}}@Id{{/isId}} + @Column("{{rawColumn.columnName}}") {{#isId}}@Id{{/isId}}{{^isNullable}} + + @jakarta.validation.constraints.NotNull{{/isNullable}}{{#size}} + + @jakarta.validation.constraints.Size(max = {{size}}){{/size}} private {{javaType}} {{propertyName}}; {{/properties}} {{#properties}} diff --git a/java-pojo-generator/src/test/java/org/db2code/generator/java/pojo/GeneratorExecutorTest.java b/java-pojo-generator/src/test/java/org/db2code/generator/java/pojo/GeneratorExecutorTest.java index aaf8bf6..bfca6d0 100644 --- a/java-pojo-generator/src/test/java/org/db2code/generator/java/pojo/GeneratorExecutorTest.java +++ b/java-pojo-generator/src/test/java/org/db2code/generator/java/pojo/GeneratorExecutorTest.java @@ -16,6 +16,7 @@ import org.apache.commons.io.IOUtils; import org.db2code.MetadataExtractor; import org.db2code.extractors.ExtractionParameters; +import org.db2code.generator.java.pojo.adapter.DateImpl; import org.db2code.rawmodel.RawDatabaseMetadata; import org.junit.jupiter.api.AfterEach; import org.junit.jupiter.api.Assertions; @@ -69,7 +70,8 @@ public void test() throws IOException { TESTPKG, TARGET_FOLDER, dir, - null)); + null, + DateImpl.UTIL_DATE)); Arrays.stream( Objects.requireNonNull(