From 5e627a2507feef6a0924f5826cd97f3accd25cae Mon Sep 17 00:00:00 2001 From: Koen Aers Date: Thu, 5 Jun 2025 16:32:13 +0200 Subject: [PATCH] HBX-3000: Maven GenerateJava Mojo should generate annotated entities by default Signed-off-by: Koen Aers --- maven/pom.xml | 10 ++ .../tool/maven/GenerateJavaMojo.java | 4 +- .../tool/maven/GenerateJavaMojoTest.java | 118 ++++++++++++++++++ 3 files changed, 130 insertions(+), 2 deletions(-) create mode 100644 maven/src/test/java/org/hibernate/tool/maven/GenerateJavaMojoTest.java diff --git a/maven/pom.xml b/maven/pom.xml index 7c39ef849f..f04fb70711 100644 --- a/maven/pom.xml +++ b/maven/pom.xml @@ -92,6 +92,16 @@ jakarta.xml.bind jakarta.xml.bind-api + + org.junit.jupiter + junit-jupiter-engine + test + + + com.h2database + h2 + test + org.apache.maven diff --git a/maven/src/main/java/org/hibernate/tool/maven/GenerateJavaMojo.java b/maven/src/main/java/org/hibernate/tool/maven/GenerateJavaMojo.java index 7fa2ec3eca..8f92184a8a 100644 --- a/maven/src/main/java/org/hibernate/tool/maven/GenerateJavaMojo.java +++ b/maven/src/main/java/org/hibernate/tool/maven/GenerateJavaMojo.java @@ -47,8 +47,8 @@ public class GenerateJavaMojo extends AbstractGenerationMojo { /** Code will contain JPA features, e.g. using annotations from jakarta.persistence * and org.hibernate.annotations. */ - @Parameter(defaultValue = "false") - private boolean ejb3; + @Parameter(defaultValue = "true") + private boolean ejb3 = true; /** Code will contain JDK 5 constructs such as generics and static imports. */ @Parameter(defaultValue = "false") diff --git a/maven/src/test/java/org/hibernate/tool/maven/GenerateJavaMojoTest.java b/maven/src/test/java/org/hibernate/tool/maven/GenerateJavaMojoTest.java new file mode 100644 index 0000000000..34c59d1ca8 --- /dev/null +++ b/maven/src/test/java/org/hibernate/tool/maven/GenerateJavaMojoTest.java @@ -0,0 +1,118 @@ +package org.hibernate.tool.maven; + +import static org.junit.jupiter.api.Assertions.assertFalse; +import static org.junit.jupiter.api.Assertions.assertTrue; + +import java.io.File; +import java.io.FileWriter; +import java.lang.reflect.Field; +import java.nio.file.Files; +import java.sql.DriverManager; + +import org.apache.maven.project.MavenProject; +import org.junit.jupiter.api.AfterEach; +import org.junit.jupiter.api.BeforeEach; +import org.junit.jupiter.api.Test; +import org.junit.jupiter.api.io.TempDir; + +public class GenerateJavaMojoTest { + + private static final String JDBC_CONNECTION = "jdbc:h2:mem:test"; + private static final String CREATE_PERSON_TABLE = + "create table PERSON (ID int not null, NAME varchar(20), primary key (ID))"; + private static final String DROP_PERSON_TABLE = + "drop table PERSON"; + + @TempDir + private File tempDir; + + private File outputDirectory; + private GenerateJavaMojo generateJavaMojo; + + @BeforeEach + public void beforeEach() throws Exception { + createDatabase(); + createPropertiesFile(); + createOutputDirectory(); + createGenerateJavaMojo(); + } + + @AfterEach + public void afterEach() throws Exception { + dropDatabase(); + } + + @Test + public void testGenerateAnnotatedJava() throws Exception { + File personJavaFile = new File(outputDirectory, "Person.java"); + // Person.java should not exist + assertFalse(personJavaFile.exists()); + // Execute mojo with default value of 'ejb3' field which is 'true' + generateJavaMojo.execute(); + // Person.java should exist + assertTrue(personJavaFile.exists()); + // Person.java should be an annotated entity + byte[] raw = Files.readAllBytes(personJavaFile.toPath()); + assertTrue(new String(raw).contains("import jakarta.persistence.Entity;")); + } + + @Test + public void testGenerateNonAnnotatedJava() throws Exception { + File personJavaFile = new File(outputDirectory, "Person.java"); + // Person.java should not exist + assertFalse(personJavaFile.exists()); + // Set value of field 'ejb3' to 'false' and execute mojo + Field ejb3Field = GenerateJavaMojo.class.getDeclaredField("ejb3"); + ejb3Field.setAccessible(true); + ejb3Field.set(generateJavaMojo, false); + generateJavaMojo.execute(); + // Person.java should exist + assertTrue(personJavaFile.exists()); + // Person.java should be an annotated entity + byte[] raw = Files.readAllBytes(personJavaFile.toPath()); + assertFalse(new String(raw).contains("import jakarta.persistence.Entity;")); + } + + private void createDatabase() throws Exception { + DriverManager + .getConnection(JDBC_CONNECTION) + .createStatement() + .execute(CREATE_PERSON_TABLE); + } + + private void dropDatabase() throws Exception { + DriverManager + .getConnection(JDBC_CONNECTION) + .createStatement() + .execute(DROP_PERSON_TABLE); + } + + private void createPropertiesFile() throws Exception { + File propertiesFile = new File(tempDir, "hibernate.properties"); + try (FileWriter fileWriter = new FileWriter(propertiesFile)) { + fileWriter.write("hibernate.connection.url=" + JDBC_CONNECTION + '\n'); + fileWriter.write("hibernate.default_catalog=TEST\n"); + fileWriter.write("hibernate.default_schema=PUBLIC\n"); + } + } + + private void createGenerateJavaMojo() throws Exception { + generateJavaMojo = new GenerateJavaMojo(); + Field projectField = AbstractGenerationMojo.class.getDeclaredField("project"); + projectField.setAccessible(true); + projectField.set(generateJavaMojo, new MavenProject()); + Field propertyFileField = AbstractGenerationMojo.class.getDeclaredField("propertyFile"); + propertyFileField.setAccessible(true); + propertyFileField.set(generateJavaMojo, new File(tempDir, "hibernate.properties")); + Field outputDirectoryField = GenerateJavaMojo.class.getDeclaredField("outputDirectory"); + outputDirectoryField.setAccessible(true); + outputDirectoryField.set(generateJavaMojo, outputDirectory); + } + + private void createOutputDirectory() { + outputDirectory = new File(tempDir, "generated"); + outputDirectory.mkdir(); + } + + +}