Skip to content

Commit 5711cbe

Browse files
committed
HBX-3038: Gradle 'generateJava' task should generate annotated entities by default
- Add 'generateAnnotations' configuration to the Hibernate Tools Gradle extension with default value 'true' - Use the 'generateAnnotations' configuration above to set the 'ejb' property when creating the JavaExporter - Add a functional test that checks this behavior Signed-off-by: Koen Aers <[email protected]>
1 parent 90e64dd commit 5711cbe

File tree

5 files changed

+171
-2
lines changed

5 files changed

+171
-2
lines changed
Lines changed: 166 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,166 @@
1+
package org.hibernate.tool.gradle.java;
2+
3+
import static org.junit.jupiter.api.Assertions.assertEquals;
4+
import static org.junit.jupiter.api.Assertions.assertFalse;
5+
import static org.junit.jupiter.api.Assertions.assertTrue;
6+
7+
import java.io.File;
8+
import java.nio.file.Files;
9+
import java.sql.Connection;
10+
import java.sql.DriverManager;
11+
import java.sql.ResultSet;
12+
import java.sql.Statement;
13+
import java.util.List;
14+
15+
import org.gradle.testkit.runner.BuildResult;
16+
import org.gradle.testkit.runner.GradleRunner;
17+
import org.junit.jupiter.api.Test;
18+
import org.junit.jupiter.api.io.TempDir;
19+
20+
public class JpaDefaultTest {
21+
22+
private static final List<String> GRADLE_INIT_PROJECT_ARGUMENTS = List.of(
23+
"init", "--type", "java-application", "--dsl", "groovy", "--test-framework", "junit-jupiter", "--java-version", "17");
24+
25+
@TempDir
26+
private File projectDir;
27+
28+
private File gradlePropertiesFile;
29+
private File gradleBuildFile;
30+
private File databaseFile;
31+
32+
@Test
33+
public void testTutorial() throws Exception {
34+
assertTrue(projectDir.exists());
35+
createGradleProject();
36+
editGradleBuildFile();
37+
editGradlePropertiesFile();
38+
createDatabase();
39+
createHibernatePropertiesFile();
40+
verifyDatabase();
41+
executeGenerateJavaTask();
42+
verifyProject();
43+
}
44+
45+
private void verifyDatabase() throws Exception {
46+
Connection connection = DriverManager.getConnection(constructJdbcConnectionString());
47+
ResultSet resultSet = connection.createStatement().executeQuery("select * from PERSON");
48+
assertTrue(resultSet.next());
49+
assertEquals(1, resultSet.getInt(1));
50+
assertEquals("foo", resultSet.getString(2));
51+
}
52+
53+
private void createGradleProject() throws Exception {
54+
GradleRunner runner = GradleRunner.create();
55+
runner.withArguments(GRADLE_INIT_PROJECT_ARGUMENTS);
56+
runner.forwardOutput();
57+
runner.withProjectDir(projectDir);
58+
BuildResult buildResult = runner.build();
59+
assertTrue(buildResult.getOutput().contains("BUILD SUCCESSFUL"));
60+
gradlePropertiesFile = new File(projectDir, "gradle.properties");
61+
assertTrue(gradlePropertiesFile.exists());
62+
assertTrue(gradlePropertiesFile.isFile());
63+
File appDir = new File(projectDir, "app");
64+
assertTrue(appDir.exists());
65+
assertTrue(appDir.isDirectory());
66+
gradleBuildFile = new File(appDir, "build.gradle");
67+
assertTrue(gradleBuildFile.exists());
68+
assertTrue(gradleBuildFile.isFile());
69+
databaseFile = new File(projectDir, "database/test.mv.db");
70+
assertFalse(databaseFile.exists());
71+
}
72+
73+
private void editGradleBuildFile() throws Exception {
74+
StringBuffer gradleBuildFileContents = new StringBuffer(
75+
new String(Files.readAllBytes(gradleBuildFile.toPath())));
76+
addHibernateToolsPluginLine(gradleBuildFileContents);
77+
addH2DatabaseDependencyLine(gradleBuildFileContents);
78+
Files.writeString(gradleBuildFile.toPath(), gradleBuildFileContents.toString());
79+
}
80+
81+
private void editGradlePropertiesFile() throws Exception {
82+
// The Hibernate Tools Gradle plugin does not support the configuration cache.
83+
// As this is enabled by default when initializing a new Gradle project, the setting needs to be commented out
84+
// in the gradle.properties file.
85+
StringBuffer gradlePropertiesFileContents = new StringBuffer(
86+
new String(Files.readAllBytes(gradlePropertiesFile.toPath())));
87+
int pos = gradlePropertiesFileContents.indexOf("org.gradle.configuration-cache=true");
88+
gradlePropertiesFileContents.insert(pos, "#");
89+
Files.writeString(gradlePropertiesFile.toPath(), gradlePropertiesFileContents.toString());
90+
}
91+
92+
private void createDatabase() throws Exception {
93+
String CREATE_PERSON_TABLE = "create table PERSON (ID int not null, NAME varchar(20), primary key (ID))";
94+
Connection connection = DriverManager.getConnection(constructJdbcConnectionString());
95+
Statement statement = connection.createStatement();
96+
statement.execute(CREATE_PERSON_TABLE);
97+
statement.execute("insert into PERSON values (1, 'foo')");
98+
statement.close();
99+
connection.close();
100+
assertTrue(databaseFile.exists());
101+
assertTrue(databaseFile.isFile());
102+
}
103+
104+
private void createHibernatePropertiesFile() throws Exception {
105+
File hibernatePropertiesFile = new File(projectDir, "app/src/main/resources/hibernate.properties");
106+
StringBuffer hibernatePropertiesFileContents = new StringBuffer();
107+
hibernatePropertiesFileContents
108+
.append("hibernate.connection.driver_class=org.h2.Driver\n")
109+
.append("hibernate.connection.url=" + constructJdbcConnectionString() + "\n")
110+
.append("hibernate.connection.username=\n")
111+
.append("hibernate.connection.password=\n")
112+
.append("hibernate.default_catalog=TEST\n")
113+
.append("hibernate.default_schema=PUBLIC\n");
114+
Files.writeString(hibernatePropertiesFile.toPath(), hibernatePropertiesFileContents.toString());
115+
assertTrue(hibernatePropertiesFile.exists());
116+
}
117+
118+
private void executeGenerateJavaTask() throws Exception {
119+
GradleRunner gradleRunner = GradleRunner.create();
120+
gradleRunner.forwardOutput();
121+
gradleRunner.withProjectDir(projectDir);
122+
gradleRunner.withPluginClasspath();
123+
gradleRunner.withArguments("generateJava");
124+
BuildResult buildResult = gradleRunner.build();
125+
assertTrue(buildResult.getOutput().contains("BUILD SUCCESSFUL"));
126+
}
127+
128+
private void verifyProject() throws Exception {
129+
File generatedOutputFolder = new File(projectDir, "app/generated-sources");
130+
assertTrue(generatedOutputFolder.exists());
131+
assertTrue(generatedOutputFolder.isDirectory());
132+
assertEquals(1, generatedOutputFolder.list().length);
133+
File generatedPersonJavaFile = new File(generatedOutputFolder, "Person.java");
134+
assertTrue(generatedPersonJavaFile.exists());
135+
assertTrue(generatedPersonJavaFile.isFile());
136+
String generatedPersonJavaFileContents = new String(
137+
Files.readAllBytes(generatedPersonJavaFile.toPath()));
138+
assertTrue(generatedPersonJavaFileContents.contains("import jakarta.persistence.Entity;"));
139+
}
140+
141+
private void addHibernateToolsPluginLine(StringBuffer gradleBuildFileContents) {
142+
int pos = gradleBuildFileContents.indexOf("plugins {");
143+
pos = gradleBuildFileContents.indexOf("}", pos);
144+
gradleBuildFileContents.insert(pos, constructHibernateToolsPluginLine() + "\n");
145+
}
146+
147+
private void addH2DatabaseDependencyLine(StringBuffer gradleBuildFileContents) {
148+
int pos = gradleBuildFileContents.indexOf("dependencies {");
149+
pos = gradleBuildFileContents.indexOf("}", pos);
150+
gradleBuildFileContents.insert(pos, constructH2DatabaseDependencyLine() + "\n");
151+
}
152+
153+
private String constructJdbcConnectionString() {
154+
return "jdbc:h2:" + projectDir.getAbsolutePath() + "/database/test;AUTO_SERVER=TRUE";
155+
}
156+
157+
private String constructHibernateToolsPluginLine() {
158+
return " id 'org.hibernate.tool.hibernate-tools-gradle' version '"
159+
+ System.getenv("HIBERNATE_TOOLS_VERSION") + "'";
160+
}
161+
162+
private String constructH2DatabaseDependencyLine() {
163+
return " implementation 'com.h2database:h2:" + System.getenv("H2_VERSION") + "'";
164+
}
165+
166+
}

gradle/plugin/src/functionalTest/java/org/hibernate/tool/gradle/tutorial/TutorialTest.java

Lines changed: 0 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -113,7 +113,6 @@ private void createHibernatePropertiesFile() throws Exception {
113113
.append("hibernate.default_schema=PUBLIC\n");
114114
Files.writeString(hibernatePropertiesFile.toPath(), hibernatePropertiesFileContents.toString());
115115
assertTrue(hibernatePropertiesFile.exists());
116-
System.out.println(hibernatePropertiesFileContents.toString());
117116
}
118117

119118
private void executeGenerateJavaTask() throws Exception {

gradle/plugin/src/main/java/org/hibernate/tool/gradle/Extension.java

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -9,6 +9,7 @@ public class Extension {
99
public String outputFolder = "generated-sources";
1010
public String packageName = "";
1111
public String revengStrategy = null;
12+
public Boolean generateAnnotations = true;
1213

1314
public Extension(Project project) {}
1415

gradle/plugin/src/main/java/org/hibernate/tool/gradle/task/GenerateJavaTask.java

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -18,12 +18,13 @@ public void performTask() {
1818
void doWork() {
1919
getLogger().lifecycle("Creating Java exporter");
2020
Exporter pojoExporter = ExporterFactory.createExporter(ExporterType.JAVA);
21+
pojoExporter.getProperties().setProperty("ejb3", String.valueOf(getExtension().generateAnnotations));
2122
File outputFolder = getOutputFolder();
2223
pojoExporter.getProperties().put(ExporterConstants.METADATA_DESCRIPTOR, createJdbcDescriptor());
2324
pojoExporter.getProperties().put(ExporterConstants.DESTINATION_FOLDER, outputFolder);
2425
getLogger().lifecycle("Starting Java export to directory: " + outputFolder + "...");
2526
pojoExporter.start();
2627
getLogger().lifecycle("Java export finished");
2728
}
28-
29+
2930
}

orm/src/main/java/org/hibernate/tool/internal/export/java/JavaExporter.java

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -34,6 +34,8 @@ protected void setupContext() {
3434
if(!getProperties().containsKey("jdk5")) {
3535
getProperties().put("jdk5", "false");
3636
}
37+
System.out.println("value of 'ejb3' is : " + getProperties().getProperty("ejb3"));
38+
System.out.println("value of 'jdk5' is : " + getProperties().getProperty("jdk5"));
3739
super.setupContext();
3840
}
3941
}

0 commit comments

Comments
 (0)