Skip to content

Commit 55464ed

Browse files
committed
HBX-3044: Gradle 'generateJava' task should use generics by default
- Change the 'GenerateJavaTask' to explicitly set property 'jdk5' - Add a 'useGenerics' property to the Hibernate Tools Gradle extension which defaults to 'true' - Add a functional test that verifies the default behavior is using generics Signed-off-by: Koen Aers <[email protected]>
1 parent f81952d commit 55464ed

File tree

3 files changed

+170
-0
lines changed

3 files changed

+170
-0
lines changed
Lines changed: 168 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,168 @@
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 UseGenerics {
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+
executeGenerateJavaTask();
41+
verifyProject();
42+
}
43+
44+
private void createGradleProject() throws Exception {
45+
GradleRunner runner = GradleRunner.create();
46+
runner.withArguments(GRADLE_INIT_PROJECT_ARGUMENTS);
47+
runner.forwardOutput();
48+
runner.withProjectDir(projectDir);
49+
BuildResult buildResult = runner.build();
50+
assertTrue(buildResult.getOutput().contains("BUILD SUCCESSFUL"));
51+
gradlePropertiesFile = new File(projectDir, "gradle.properties");
52+
assertTrue(gradlePropertiesFile.exists());
53+
assertTrue(gradlePropertiesFile.isFile());
54+
File appDir = new File(projectDir, "app");
55+
assertTrue(appDir.exists());
56+
assertTrue(appDir.isDirectory());
57+
gradleBuildFile = new File(appDir, "build.gradle");
58+
assertTrue(gradleBuildFile.exists());
59+
assertTrue(gradleBuildFile.isFile());
60+
databaseFile = new File(projectDir, "database/test.mv.db");
61+
assertFalse(databaseFile.exists());
62+
}
63+
64+
private void editGradleBuildFile() throws Exception {
65+
StringBuffer gradleBuildFileContents = new StringBuffer(
66+
new String(Files.readAllBytes(gradleBuildFile.toPath())));
67+
addHibernateToolsPluginLine(gradleBuildFileContents);
68+
addH2DatabaseDependencyLine(gradleBuildFileContents);
69+
Files.writeString(gradleBuildFile.toPath(), gradleBuildFileContents.toString());
70+
}
71+
72+
private void editGradlePropertiesFile() throws Exception {
73+
// The Hibernate Tools Gradle plugin does not support the configuration cache.
74+
// As this is enabled by default when initializing a new Gradle project, the setting needs to be commented out
75+
// in the gradle.properties file.
76+
StringBuffer gradlePropertiesFileContents = new StringBuffer(
77+
new String(Files.readAllBytes(gradlePropertiesFile.toPath())));
78+
int pos = gradlePropertiesFileContents.indexOf("org.gradle.configuration-cache=true");
79+
gradlePropertiesFileContents.insert(pos, "#");
80+
Files.writeString(gradlePropertiesFile.toPath(), gradlePropertiesFileContents.toString());
81+
}
82+
83+
private void createDatabase() throws Exception {
84+
String CREATE_PERSON_TABLE =
85+
"create table PERSON (ID int not null, NAME varchar(20), primary key (ID))";
86+
String CREATE_ITEM_TABLE =
87+
"create table ITEM (ID int not null, NAME varchar(20), OWNER_ID int not null, " +
88+
" primary key (ID), foreign key (OWNER_ID) references PERSON(ID))";
89+
Connection connection = DriverManager.getConnection(constructJdbcConnectionString());
90+
Statement statement = connection.createStatement();
91+
statement.execute(CREATE_PERSON_TABLE);
92+
statement.execute(CREATE_ITEM_TABLE);
93+
statement.close();
94+
connection.close();
95+
assertTrue(databaseFile.exists());
96+
assertTrue(databaseFile.isFile());
97+
}
98+
99+
private void createHibernatePropertiesFile() throws Exception {
100+
File hibernatePropertiesFile = new File(projectDir, "app/src/main/resources/hibernate.properties");
101+
StringBuffer hibernatePropertiesFileContents = new StringBuffer();
102+
hibernatePropertiesFileContents
103+
.append("hibernate.connection.driver_class=org.h2.Driver\n")
104+
.append("hibernate.connection.url=" + constructJdbcConnectionString() + "\n")
105+
.append("hibernate.connection.username=\n")
106+
.append("hibernate.connection.password=\n")
107+
.append("hibernate.default_catalog=TEST\n")
108+
.append("hibernate.default_schema=PUBLIC\n");
109+
Files.writeString(hibernatePropertiesFile.toPath(), hibernatePropertiesFileContents.toString());
110+
assertTrue(hibernatePropertiesFile.exists());
111+
}
112+
113+
private void executeGenerateJavaTask() throws Exception {
114+
GradleRunner gradleRunner = GradleRunner.create();
115+
gradleRunner.forwardOutput();
116+
gradleRunner.withProjectDir(projectDir);
117+
gradleRunner.withPluginClasspath();
118+
gradleRunner.withArguments("generateJava");
119+
BuildResult buildResult = gradleRunner.build();
120+
assertTrue(buildResult.getOutput().contains("BUILD SUCCESSFUL"));
121+
}
122+
123+
private void verifyProject() throws Exception {
124+
File generatedOutputFolder = new File(projectDir, "app/generated-sources");
125+
assertTrue(generatedOutputFolder.exists());
126+
assertTrue(generatedOutputFolder.isDirectory());
127+
assertEquals(2, generatedOutputFolder.list().length);
128+
File generatedPersonJavaFile = new File(generatedOutputFolder, "Person.java");
129+
assertTrue(generatedPersonJavaFile.exists());
130+
assertTrue(generatedPersonJavaFile.isFile());
131+
String generatedPersonJavaFileContents = new String(
132+
Files.readAllBytes(generatedPersonJavaFile.toPath()));
133+
assertTrue(generatedPersonJavaFileContents.contains("public class Person "));
134+
assertTrue(generatedPersonJavaFileContents.contains("Set<Item>"));
135+
File generatedItemJavaFile = new File(generatedOutputFolder, "Item.java");
136+
assertTrue(generatedItemJavaFile.exists());
137+
assertTrue(generatedItemJavaFile.isFile());
138+
String generatedItemJavaFileContents = new String(
139+
Files.readAllBytes(generatedItemJavaFile.toPath()));
140+
assertTrue(generatedItemJavaFileContents.contains("public class Item "));
141+
}
142+
143+
private void addHibernateToolsPluginLine(StringBuffer gradleBuildFileContents) {
144+
int pos = gradleBuildFileContents.indexOf("plugins {");
145+
pos = gradleBuildFileContents.indexOf("}", pos);
146+
gradleBuildFileContents.insert(pos, constructHibernateToolsPluginLine() + "\n");
147+
}
148+
149+
private void addH2DatabaseDependencyLine(StringBuffer gradleBuildFileContents) {
150+
int pos = gradleBuildFileContents.indexOf("dependencies {");
151+
pos = gradleBuildFileContents.indexOf("}", pos);
152+
gradleBuildFileContents.insert(pos, constructH2DatabaseDependencyLine() + "\n");
153+
}
154+
155+
private String constructJdbcConnectionString() {
156+
return "jdbc:h2:" + projectDir.getAbsolutePath() + "/database/test;AUTO_SERVER=TRUE";
157+
}
158+
159+
private String constructHibernateToolsPluginLine() {
160+
return " id 'org.hibernate.tool.hibernate-tools-gradle' version '"
161+
+ System.getenv("HIBERNATE_TOOLS_VERSION") + "'";
162+
}
163+
164+
private String constructH2DatabaseDependencyLine() {
165+
return " implementation 'com.h2database:h2:" + System.getenv("H2_VERSION") + "'";
166+
}
167+
168+
}

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
@@ -27,6 +27,7 @@ public class Extension {
2727
public String packageName = "";
2828
public String revengStrategy = null;
2929
public Boolean generateAnnotations = true;
30+
public Boolean useGenerics = true;
3031

3132
public Extension(Project project) {}
3233

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

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -36,6 +36,7 @@ void doWork() {
3636
getLogger().lifecycle("Creating Java exporter");
3737
Exporter pojoExporter = ExporterFactory.createExporter(ExporterType.JAVA);
3838
pojoExporter.getProperties().setProperty("ejb3", String.valueOf(getExtension().generateAnnotations));
39+
pojoExporter.getProperties().setProperty("jdk5", String.valueOf(getExtension().useGenerics));
3940
File outputFolder = getOutputFolder();
4041
pojoExporter.getProperties().put(ExporterConstants.METADATA_DESCRIPTOR, createJdbcDescriptor());
4142
pojoExporter.getProperties().put(ExporterConstants.DESTINATION_FOLDER, outputFolder);

0 commit comments

Comments
 (0)