diff --git a/.github/dependabot.yml b/.github/dependabot.yml
new file mode 100644
index 0000000000..2bd7143061
--- /dev/null
+++ b/.github/dependabot.yml
@@ -0,0 +1,17 @@
+# To get started with Dependabot version updates, you'll need to specify which
+# package ecosystems to update and where the package manifests are located.
+# Please see the documentation for all configuration options:
+# https://docs.github.com/github/administering-a-repository/configuration-options-for-dependency-updates
+
+version: 2
+updates:
+ - package-ecosystem: "github-actions"
+ directory: "/"
+ schedule:
+ interval: "monthly"
+ groups:
+ workflow-actions:
+ patterns:
+ - "*"
+ allow:
+ - dependency-name: "actions/*"
diff --git a/.github/workflows/build_test.yml b/.github/workflows/build_test.yml
index 109aede3b3..38b3308676 100644
--- a/.github/workflows/build_test.yml
+++ b/.github/workflows/build_test.yml
@@ -9,20 +9,18 @@ jobs:
steps:
- name: Checkout PR Branch
- uses: actions/checkout@v2
+ uses: actions/checkout@11bd71901bbe5b1630ceea73d27597364c9af683 # v4.2.2
with:
ref: ${{ github.event.pull_request.head.sha }}
fetch-depth: 0
- name: Setup Java 11
- uses: actions/setup-java@v1
+ uses: actions/setup-java@3a4f6e1af504cf6a31855fa899c6aa5355ba6c12 # v4.7.0
with:
java-version: 11
- java-package: jdk
- architecture: x64
+ distribution: temurin
- name: Build and Test
- uses: GabrielBB/xvfb-action@v1
- with:
- run: mvn clean install
-
+ uses: GabrielBB/xvfb-action@b706e4e27b14669b486812790492dc50ca16b465 # v1.7
+ with:
+ run: ./mvnw clean install
diff --git a/.mvn/wrapper/maven-wrapper.jar b/.mvn/wrapper/maven-wrapper.jar
new file mode 100644
index 0000000000..7967f30dd1
Binary files /dev/null and b/.mvn/wrapper/maven-wrapper.jar differ
diff --git a/.mvn/wrapper/maven-wrapper.properties b/.mvn/wrapper/maven-wrapper.properties
new file mode 100644
index 0000000000..f5b763a229
--- /dev/null
+++ b/.mvn/wrapper/maven-wrapper.properties
@@ -0,0 +1,20 @@
+# Licensed to the Apache Software Foundation (ASF) under one
+# or more contributor license agreements. See the NOTICE file
+# distributed with this work for additional information
+# regarding copyright ownership. The ASF licenses this file
+# to you under the Apache License, Version 2.0 (the
+# "License"); you may not use this file except in compliance
+# with the License. You may obtain a copy of the License at
+#
+# http://www.apache.org/licenses/LICENSE-2.0
+#
+# Unless required by applicable law or agreed to in writing,
+# software distributed under the License is distributed on an
+# "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+# KIND, either express or implied. See the License for the
+# specific language governing permissions and limitations
+# under the License.
+wrapperVersion=3.3.2
+distributionType=bin
+distributionUrl=https://repo.maven.apache.org/maven2/org/apache/maven/apache-maven/3.9.7/apache-maven-3.9.7-bin.zip
+wrapperUrl=https://repo.maven.apache.org/maven2/org/apache/maven/wrapper/maven-wrapper/3.3.2/maven-wrapper-3.3.2.jar
diff --git a/.release/.gitignore b/.release/.gitignore
new file mode 100644
index 0000000000..cdd9a17d6b
--- /dev/null
+++ b/.release/.gitignore
@@ -0,0 +1,3 @@
+# The folder into which we checkout our release scripts into
+*
+!.gitignore
\ No newline at end of file
diff --git a/ant/pom.xml b/ant/pom.xml
index 5b08096009..d69d021f64 100644
--- a/ant/pom.xml
+++ b/ant/pom.xml
@@ -21,7 +21,7 @@
org.hibernate.tool
hibernate-tools-parent
- 6.5.0.Final
+ 6.6.27-SNAPSHOT
hibernate-tools-ant
@@ -30,6 +30,11 @@
Hibernate Tools Ant Tasks
jar
+
+
+ false
+
+
org.apache.ant
@@ -48,6 +53,47 @@
hibernate-tools-tests-utils
test
+
+ com.h2database
+ h2
+ test
+
+
+
+
+ org.codehaus.mojo
+ build-helper-maven-plugin
+
+
+ add-test-source
+ generate-test-sources
+
+ add-test-source
+
+
+
+ src/it/java
+
+
+
+
+
+
+
+ org.apache.maven.plugins
+ maven-failsafe-plugin
+
+
+
+ integration-test
+ verify
+
+
+
+
+
+
+
diff --git a/ant/src/it/java/org/hibernate/tool/ant/Hbm2JavaTestIT.java b/ant/src/it/java/org/hibernate/tool/ant/Hbm2JavaTestIT.java
new file mode 100644
index 0000000000..b372bba6b8
--- /dev/null
+++ b/ant/src/it/java/org/hibernate/tool/ant/Hbm2JavaTestIT.java
@@ -0,0 +1,99 @@
+package org.hibernate.tool.ant;
+
+import org.hibernate.tool.it.ant.TestTemplate;
+import org.junit.jupiter.api.Test;
+
+import static org.junit.jupiter.api.Assertions.assertFalse;
+import static org.junit.jupiter.api.Assertions.assertTrue;
+
+public class Hbm2JavaTestIT extends TestTemplate {
+
+ @Test
+ public void testJpaDefault() throws Exception {
+ setHibernateToolTaskXml(
+ " \n" +
+ " \n" +
+ " \n" +
+ " \n"
+ );
+ setDatabaseCreationScript(new String[] {
+ "create table PERSON (ID int not null, NAME varchar(20), primary key (ID))"
+ });
+ createProjectAndBuild();
+ assertFolderExists("generated", 1);
+ assertFileExists("generated/Person.java");
+ String generatedPersonJavaFileContents = getFileContents("generated/Person.java");
+ assertTrue(generatedPersonJavaFileContents.contains("import jakarta.persistence.Entity;"));
+ assertTrue(generatedPersonJavaFileContents.contains("public class Person "));
+ }
+
+ @Test
+ public void testNoAnnotations() throws Exception {
+ setHibernateToolTaskXml(
+ " \n" +
+ " \n" +
+ " \n" +
+ " \n"
+ );
+ setDatabaseCreationScript(new String[] {
+ "create table PERSON (ID int not null, NAME varchar(20), primary key (ID))"
+ });
+ createProjectAndBuild();
+ assertFolderExists("generated", 1);
+ assertFileExists("generated/Person.java");
+ String generatedPersonJavaFileContents = getFileContents("generated/Person.java");
+ assertFalse(generatedPersonJavaFileContents.contains("import jakarta.persistence.Entity;"));
+ assertTrue(generatedPersonJavaFileContents.contains("public class Person "));
+ }
+
+ @Test
+ public void testNoGenerics() throws Exception {
+ setHibernateToolTaskXml(
+ " \n" +
+ " \n" +
+ " \n" +
+ " \n"
+ );
+ setDatabaseCreationScript(new String[] {
+ "create table PERSON (ID int not null, NAME varchar(20), " +
+ "primary key (ID))",
+ "create table ITEM (ID int not null, NAME varchar(20), OWNER_ID int not null, " +
+ "primary key (ID), foreign key (OWNER_ID) references PERSON(ID))"
+ });
+ createProjectAndBuild();
+ assertFolderExists("generated", 2);
+ assertFileExists("generated/Person.java");
+ String generatedPersonJavaFileContents = getFileContents("generated/Person.java");
+ assertTrue(generatedPersonJavaFileContents.contains("public class Person "));
+ assertFalse(generatedPersonJavaFileContents.contains("Set- "));
+ assertFileExists("generated/Item.java");
+ String generatedItemJavaFileContents = getFileContents("generated/Item.java");
+ assertTrue(generatedItemJavaFileContents.contains("public class Item "));
+ }
+
+ @Test
+ public void testUseGenerics() throws Exception {
+ setHibernateToolTaskXml(
+ " \n" +
+ " \n" +
+ " \n" +
+ " \n"
+ );
+ setDatabaseCreationScript(new String[] {
+ "create table PERSON (ID int not null, NAME varchar(20), " +
+ "primary key (ID))",
+ "create table ITEM (ID int not null, NAME varchar(20), OWNER_ID int not null, " +
+ "primary key (ID), foreign key (OWNER_ID) references PERSON(ID))"
+ });
+ createProjectAndBuild();
+ assertFolderExists("generated", 2);
+ assertFileExists("generated/Person.java");
+ String generatedPersonJavaFileContents = getFileContents("generated/Person.java");
+ assertTrue(generatedPersonJavaFileContents.contains("public class Person "));
+ assertTrue(generatedPersonJavaFileContents.contains("Set
- "));
+ assertFileExists("generated/Item.java");
+ String generatedItemJavaFileContents = getFileContents("generated/Item.java");
+ assertTrue(generatedItemJavaFileContents.contains("public class Item "));
+ }
+
+}
diff --git a/ant/src/it/java/org/hibernate/tool/ant/TutorialTestIT.java b/ant/src/it/java/org/hibernate/tool/ant/TutorialTestIT.java
new file mode 100644
index 0000000000..232c5a004b
--- /dev/null
+++ b/ant/src/it/java/org/hibernate/tool/ant/TutorialTestIT.java
@@ -0,0 +1,26 @@
+package org.hibernate.tool.ant;
+
+import org.hibernate.tool.it.ant.TestTemplate;
+import org.junit.jupiter.api.Test;
+
+public class TutorialTestIT extends TestTemplate {
+
+ @Test
+ public void testTutorial() throws Exception {
+ setHibernateToolTaskXml(
+ " \n" +
+ " \n" +
+ " \n" +
+ " \n"
+ );
+ setDatabaseCreationScript(new String[] {
+ "create table PERSON (ID int not null, NAME varchar(20), primary key (ID))"
+ });
+ createProjectAndBuild();
+ assertFolderExists("generated-sources", 1);
+ assertFileExists("generated-sources/Person.java");
+
+
+ }
+
+}
diff --git a/ant/src/it/java/org/hibernate/tool/it/ant/TestTemplate.java b/ant/src/it/java/org/hibernate/tool/it/ant/TestTemplate.java
new file mode 100644
index 0000000000..d0d111a020
--- /dev/null
+++ b/ant/src/it/java/org/hibernate/tool/it/ant/TestTemplate.java
@@ -0,0 +1,134 @@
+package org.hibernate.tool.it.ant;
+
+import org.apache.tools.ant.DefaultLogger;
+import org.apache.tools.ant.Project;
+import org.apache.tools.ant.ProjectHelper;
+import org.junit.jupiter.api.io.TempDir;
+
+import java.io.File;
+import java.nio.file.Files;
+import java.sql.Connection;
+import java.sql.DriverManager;
+import java.sql.Statement;
+import java.util.Objects;
+
+import static org.junit.jupiter.api.Assertions.*;
+
+public abstract class TestTemplate {
+
+ @TempDir
+ private File projectDir;
+
+ private String hibernateToolTaskXml;
+ private String[] databaseCreationScript;
+
+ protected File getProjectDir() {
+ return projectDir;
+ }
+
+ protected void setHibernateToolTaskXml(String xml) {
+ this.hibernateToolTaskXml = xml;
+ }
+
+ protected void setDatabaseCreationScript(String[] sqls) {
+ this.databaseCreationScript = sqls;
+ }
+
+ protected String constructBuildXmlFileContents() {
+ assertNotNull(hibernateToolTaskXml);
+ return buildXmlFileContents.replace("@hibernateToolTaskXml@", hibernateToolTaskXml);
+ }
+
+ protected String getFileContents(String path) throws Exception {
+ return new String(
+ Files.readAllBytes(
+ new File(getProjectDir(), path).toPath()));
+ }
+
+ protected void createProjectAndBuild() throws Exception {
+ createBuildXmlFile();
+ createDatabase();
+ createHibernatePropertiesFile();
+ runAntBuild();
+ }
+
+ protected void assertFolderExists(String path, int amountOfChildren) {
+ File generatedOutputFolder = new File(getProjectDir(), path);
+ assertTrue(generatedOutputFolder.exists());
+ assertTrue(generatedOutputFolder.isDirectory());
+ assertEquals(amountOfChildren, Objects.requireNonNull(generatedOutputFolder.list()).length);
+ }
+
+ protected void assertFileExists(String path) {
+ File generatedPersonJavaFile = new File(getProjectDir(), path);
+ assertTrue(generatedPersonJavaFile.exists());
+ assertTrue(generatedPersonJavaFile.isFile());
+ }
+
+ private void runAntBuild() {
+ File buildXmlFile = new File(getProjectDir(), "build.xml");
+ Project project = new Project();
+ project.setBaseDir(getProjectDir());
+ project.addBuildListener(getConsoleLogger());
+ ProjectHelper.getProjectHelper().parse(project, buildXmlFile);
+ project.executeTarget(project.getDefaultTarget());
+ }
+
+ private void createBuildXmlFile() throws Exception {
+ File buildXmlFile = new File(getProjectDir(), "build.xml");
+ assertFalse(buildXmlFile.exists());
+ Files.writeString(buildXmlFile.toPath(), constructBuildXmlFileContents());
+ assertTrue(buildXmlFile.exists());
+ }
+
+ private String constructJdbcConnectionString() {
+ return "jdbc:h2:" + getProjectDir().getAbsolutePath() + "/database/test;AUTO_SERVER=TRUE";
+ }
+
+ private void createDatabase() throws Exception {
+ File databaseFile = new File(getProjectDir(), "database/test.mv.db");
+ assertFalse(databaseFile.exists());
+ assertFalse(databaseFile.isFile());
+ Connection connection = DriverManager.getConnection(constructJdbcConnectionString());
+ Statement statement = connection.createStatement();
+ for (String sql : databaseCreationScript) {
+ statement.execute(sql);
+ }
+ statement.close();
+ connection.close();
+ assertTrue(databaseFile.exists());
+ assertTrue(databaseFile.isFile());
+ }
+
+ private void createHibernatePropertiesFile() throws Exception {
+ File hibernatePropertiesFile = new File(getProjectDir(), "hibernate.properties");
+ String hibernatePropertiesFileContents =
+ "hibernate.connection.driver_class=org.h2.Driver\n" +
+ "hibernate.connection.url=" + constructJdbcConnectionString() + "\n" +
+ "hibernate.connection.username=\n" +
+ "hibernate.connection.password=\n" +
+ "hibernate.default_catalog=TEST\n" +
+ "hibernate.default_schema=PUBLIC\n";
+ Files.writeString(hibernatePropertiesFile.toPath(), hibernatePropertiesFileContents);
+ assertTrue(hibernatePropertiesFile.exists());
+ }
+
+ private DefaultLogger getConsoleLogger() {
+ DefaultLogger consoleLogger = new DefaultLogger();
+ consoleLogger.setErrorPrintStream(System.err);
+ consoleLogger.setOutputPrintStream(System.out);
+ consoleLogger.setMessageOutputLevel(Project.MSG_INFO);
+ return consoleLogger;
+ }
+
+ private static final String buildXmlFileContents =
+ " \n" +
+ " \n" +
+ " \n" +
+ "@hibernateToolTaskXml@" +
+ " \n" +
+ " \n" ;
+
+}
diff --git a/ant/src/main/java/org/hibernate/tool/ant/Hbm2JavaExporterTask.java b/ant/src/main/java/org/hibernate/tool/ant/Hbm2JavaExporterTask.java
index 67faeb5ef2..06b7926bcc 100644
--- a/ant/src/main/java/org/hibernate/tool/ant/Hbm2JavaExporterTask.java
+++ b/ant/src/main/java/org/hibernate/tool/ant/Hbm2JavaExporterTask.java
@@ -29,9 +29,9 @@
*/
public class Hbm2JavaExporterTask extends ExporterTask {
- boolean ejb3 = false;
+ boolean ejb3 = true;
- boolean jdk5 = false;
+ boolean jdk5 = true;
public Hbm2JavaExporterTask(HibernateToolTask parent) {
super( parent );
diff --git a/ci/release/Jenkinsfile b/ci/release/Jenkinsfile
new file mode 100644
index 0000000000..fca39280c1
--- /dev/null
+++ b/ci/release/Jenkinsfile
@@ -0,0 +1,120 @@
+/*
+ * Hibernate Tools, Tooling for your Hibernate Projects
+ *
+ * Copyright 2016-2024 Red Hat, Inc.
+ *
+ * Licensed under the GNU Lesser General Public License (LGPL),
+ * version 2.1 or later (the "License").
+ * You may not use this file except in compliance with the License.
+ * You may read the licence in the 'lgpl.txt' file in the root folder of
+ * project or obtain a copy at
+ *
+ * http://www.gnu.org/licenses/lgpl-2.1.html
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" basis,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+@Library('hibernate-jenkins-pipeline-helpers') _
+
+import org.hibernate.jenkins.pipeline.helpers.version.Version
+
+pipeline {
+ agent {
+ label 'Release'
+ }
+ tools {
+ maven 'Apache Maven 3.9'
+ jdk 'OpenJDK 11 Latest'
+ }
+ options {
+ buildDiscarder logRotator(daysToKeepStr: '30', numToKeepStr: '10')
+ disableConcurrentBuilds(abortPrevious: false)
+ }
+ parameters {
+ string(
+ name: 'RELEASE_VERSION',
+ defaultValue: '6.6.27.Final',
+ description: 'The version to be released, e.g. 6.6.27.Final.',
+ trim: true
+ )
+ string(
+ name: 'DEVELOPMENT_VERSION',
+ defaultValue: '6.6.28-SNAPSHOT',
+ description: 'The next version to be used after the release, e.g. 6.6.28-SNAPSHOT.',
+ trim: true
+ )
+ booleanParam(
+ name: 'RELEASE_DRY_RUN',
+ defaultValue: true,
+ description: 'If true, just simulate the release, without pushing any commits or tags, and without uploading any artifacts or documentation.'
+ )
+ booleanParam(
+ name: 'RELEASE_PUBLISH_AUTOMATICALLY',
+ defaultValue: false,
+ description: 'If true, staging repository will get closed and published automatically, otherwise the artifacts will only be uploaded and the publishing (releasing the staging repository) has to be performed manually at Maven Central portal.'
+ )
+ }
+ stages {
+ stage('Release') {
+ when {
+ beforeAgent true
+ // Releases must be triggered explicitly
+ // This is just for safety; normally the Jenkins job for this pipeline
+ // should be configured to "Suppress automatic SCM triggering"
+ // See https://stackoverflow.com/questions/58259326/prevent-jenkins-multibranch-pipeline-from-triggering-builds-for-new-branches
+ triggeredBy cause: "UserIdCause"
+ }
+ steps {
+ script {
+ // Check that all the necessary parameters are set
+ if (!params.RELEASE_VERSION) {
+ throw new IllegalArgumentException("Missing value for parameter RELEASE_VERSION.")
+ }
+ if (!params.DEVELOPMENT_VERSION) {
+ throw new IllegalArgumentException("Missing value for parameter DEVELOPMENT_VERSION.")
+ }
+
+ def releaseVersion = Version.parseReleaseVersion(params.RELEASE_VERSION)
+ def developmentVersion = Version.parseDevelopmentVersion(params.DEVELOPMENT_VERSION)
+ env.JRELEASER_DRY_RUN = params.RELEASE_DRY_RUN
+ if (!params.RELEASE_PUBLISH_AUTOMATICALLY) {
+ env.JRELEASER_DEPLOY_MAVEN_MAVENCENTRAL_STAGE='UPLOAD'
+ }
+ echo "Performing full release for version ${releaseVersion.toString()}"
+
+ withMaven(mavenSettingsConfig: params.RELEASE_DRY_RUN ? null : 'ci-hibernate.deploy.settings.maven',
+ mavenLocalRepo: env.WORKSPACE_TMP + '/.m2repository') {
+ configFileProvider([configFile(fileId: 'release.config.ssh', targetLocation: env.HOME + '/.ssh/config'),
+ configFile(fileId: 'release.config.ssh.knownhosts', targetLocation: env.HOME + '/.ssh/known_hosts')]) {
+ // using MAVEN_GPG_PASSPHRASE (the default env variable name for passphrase in maven gpg plugin)
+ withCredentials([file(credentialsId: 'release.gpg.private-key', variable: 'RELEASE_GPG_PRIVATE_KEY_PATH'),
+ string(credentialsId: 'release.gpg.passphrase', variable: 'JRELEASER_GPG_PASSPHRASE'),
+ usernamePassword(credentialsId: 'central.sonatype.com', passwordVariable: 'JRELEASER_MAVENCENTRAL_TOKEN', usernameVariable: 'JRELEASER_MAVENCENTRAL_USERNAME'),
+ usernamePassword(credentialsId: 'gradle-plugin-portal-api-key', passwordVariable: 'GRADLE_PUBLISH_SECRET', usernameVariable: 'GRADLE_PUBLISH_KEY'),
+ string(credentialsId: 'Hibernate-CI.github.com', variable: 'JRELEASER_GITHUB_TOKEN')]) {
+ sshagent(['ed25519.Hibernate-CI.github.com', 'hibernate.filemgmt.jboss.org', 'hibernate-ci.frs.sourceforge.net']) {
+ sh 'cat $HOME/.ssh/config'
+ dir('.release/scripts') {
+ sh 'git clone https://github.com/hibernate/hibernate-release-scripts.git .'
+ }
+ sh """
+ bash -xe .release/scripts/release.sh -j ${params.RELEASE_DRY_RUN ? '-d' : ''} \
+ tools ${releaseVersion.toString()} ${developmentVersion.toString()}
+ """
+ }
+ }
+ }
+ }
+ }
+ }
+ }
+ }
+ post {
+ always {
+ notifyBuildResult notifySuccessAfterSuccess: true, maintainers: 'koen@hibernate.org'
+ }
+ }
+}
diff --git a/gradle/.gitattributes b/gradle/.gitattributes
new file mode 100644
index 0000000000..097f9f98d9
--- /dev/null
+++ b/gradle/.gitattributes
@@ -0,0 +1,9 @@
+#
+# https://help.github.com/articles/dealing-with-line-endings/
+#
+# Linux start script should use lf
+/gradlew text eol=lf
+
+# These are Windows script files and should use crlf
+*.bat text eol=crlf
+
diff --git a/gradle/.gitignore b/gradle/.gitignore
new file mode 100644
index 0000000000..1b6985c009
--- /dev/null
+++ b/gradle/.gitignore
@@ -0,0 +1,5 @@
+# Ignore Gradle project-specific cache directory
+.gradle
+
+# Ignore Gradle build output directory
+build
diff --git a/gradle/README.md b/gradle/README.md
new file mode 100644
index 0000000000..ae406d1031
--- /dev/null
+++ b/gradle/README.md
@@ -0,0 +1,23 @@
+
+
+[](https://tools.hibernate.org)
+
+# Hibernate Tools Gradle Plugin
+
+## Overview
+
+This [Gradle](https://gradle.org/) plugin brings the power of the [Hibernate Tools API](../orm) to your Gradle build. If you are looking for a quick tutorial on the use of the Hibernate Tools Gradle plugin, we can refer you to the [5 minute tutorial](docs/5-minute-tutorial.md).
diff --git a/gradle/docs/5-minute-tutorial.md b/gradle/docs/5-minute-tutorial.md
new file mode 100644
index 0000000000..e389b300fd
--- /dev/null
+++ b/gradle/docs/5-minute-tutorial.md
@@ -0,0 +1,181 @@
+
+
+[](https://tools.hibernate.org)
+
+# Hibernate Tools Gradle : 5 Minute Tutorial
+
+The best way to get to know the Hibernate Tools Gradle plugin is to start to use it.
+Hence we will provide a quick tutorial that gives you the first taste of it.
+Before tackling this tutorial, make sure you have the [Gradle](https://gradle.org) build tool
+[installed](https://gradle.org/install/) and available on your machine.
+
+## Create a Gradle Java Project
+
+Let’s assume in this case that we start off with a very simple default Gradle Java application
+that we create from a command-line window with the instruction below.
+
+```shell
+gradle init --type java-application --dsl groovy
+```
+
+Gradle will ask you some details about your application. The conversation is shown below
+for completenes but of course you can make your own choices.
+
+```shell
+Enter target Java version (min: 7, default: 21):
+
+Project name (default: 5-minute-tutorial):
+
+Select application structure:
+ 1: Single application project
+ 2: Application and library project
+Enter selection (default: Single application project) [1..2] 1
+
+Select test framework:
+ 1: JUnit 4
+ 2: TestNG
+ 3: Spock
+ 4: JUnit Jupiter
+Enter selection (default: JUnit Jupiter) [1..4] 4
+
+Generate build using new APIs and behavior (some features may change in the next minor release)? (default: no) [yes, no]
+
+
+> Task :init
+Learn more about Gradle by exploring our Samples at https://docs.gradle.org/8.13/samples/sample_building_java_applications.html
+
+BUILD SUCCESSFUL in 19s
+1 actionable task: 1 executed
+```
+
+Now you should see two folders along with a number of Gradle specific files that have
+been created. It is beyond the scope of this short tutorial to explain all these artefacts.
+We will focus mainly on the `build.gradle` file in the `app` folder. But to make the plugin work
+you will need to modify the file `gradle.properties` that was generated in the root folder.
+
+## Disable the Configuration Cache
+
+Currently the Hibernate Tools Gradle plugin does not support the configuration cache.
+As the Gradle init task generates a `gradle.properties` file in the root folder that
+explicitly enables the use of the configuration cache, you will need to comment out
+or delete the line where this happens.
+
+```properties
+#org.gradle.configuration-cache=true
+```
+
+You could also get rid of the entire `gradle.properties` file as we don't need it for the purpose of this
+tutorial. Now we can tackle the `build.gradle` file.
+
+## Modify the generated `app\build.gradle` file
+
+We have to specify the use of the Gradle plugin in the `plugin` section of the `build.gradle` file.
+So we add `id 'org.hibernate.tool.hibernate-tools-gradle' version '6.6.27.Final'` to that section.
+
+```groovy
+...
+plugins {
+ ...
+ id 'org.hibernate.tool.hibernate-tools-gradle' version '6.6.27.Final'
+}
+...
+```
+
+Also we need to depend on the java library containing the [H2 database]() drivers.
+This is done in the `dependencies` section of the `gradle.build` file,
+to which we add `implementation 'com.h2database:h2:2.3.232'`.
+
+```groovy
+...
+dependencies {
+ ...
+ implementation 'com.h2database:h2:2.3.232'
+}
+...
+```
+
+You could as an alternative also replace the entire `gradle.build` file
+with the contents as shown below.
+
+```groovy
+plugins {
+ id 'application'
+ id 'org.hibernate.tool.hibernate-tools-gradle' version '6.6.27.Final'
+}
+
+repositories {
+ mavenCentral()
+}
+
+dependencies {
+ implementation('com.h2database:h2:2.3.232')
+}
+```
+
+With this in place, we need to make sure that the Hibernate Tools Gradle plugin knows where
+to find the database from which to generate the artefacts. This is done by spefifying the
+Hibernate properties in the file `hibernate.properties`.
+
+## Specify the Hibernate Properties
+
+For the purpose of this tutorial introduction, let's assume that you have a database running, e.g.
+[H2 Sakila database](https://github.com/hibernate/sakila-h2) reacheable at the following JDBC URL:
+`jdbc:h2:tcp://localhost/./sakila`.
+
+With this set up, the `hibernate.properties` file should contain the properties as specified below.
+
+```properties
+hibernate.connection.driver_class=org.h2.Driver
+hibernate.connection.url=jdbc:h2:tcp://localhost/./sakila
+hibernate.connection.username=sa
+hibernate.default_catalog=SAKILA
+hibernate.default_schema=PUBLIC
+```
+
+For the file to be found by the plugin, add it as a resource to the project in the
+`app/src/main/resources` subfolder.
+
+## Run the Reverse Engineering
+
+With all the previous elements in place, generating the Java classes from the Sakila database
+becomes as simple as issuing `./gradlew generateJava` in your command line window.
+
+```shell
+me@machine 5-minute-tutorial % ./gradlew generateJava
+
+> Task :app:generateJava
+Starting Task 'generateJava'
+Creating Java exporter
+Loading the properties file : path/to/5-minute-tutorial/app/src/main/resources/hibernate.properties
+Properties file is loaded
+Starting Java export to directory: path/to/5-minute-tutorial/app/generated-sources...
+...
+Java export finished
+Ending Task 'generateJava'
+```
+
+By default, you will find the files in the folder `app/generated-sources`.
+
+```
+koen@Lateralus generated-sources % ls
+Actor.java City.java Film.java FilmCategory.java Inventory.java Rental.java
+Address.java Country.java FilmActor.java FilmCategoryId.java Language.java Staff.java
+Category.java Customer.java FilmActorId.java FilmText.java Payment.java Store.java
+```
+
+Congratulations! You have succesfully created Java classes for the Sakila database... Now it's
+probably time to dive somewhat deeper in the available functionality.
\ No newline at end of file
diff --git a/gradle/docs/examples/5-minute-tutorial/.gitattributes b/gradle/docs/examples/5-minute-tutorial/.gitattributes
new file mode 100644
index 0000000000..f91f64602e
--- /dev/null
+++ b/gradle/docs/examples/5-minute-tutorial/.gitattributes
@@ -0,0 +1,12 @@
+#
+# https://help.github.com/articles/dealing-with-line-endings/
+#
+# Linux start script should use lf
+/gradlew text eol=lf
+
+# These are Windows script files and should use crlf
+*.bat text eol=crlf
+
+# Binary files should be left untouched
+*.jar binary
+
diff --git a/gradle/docs/examples/5-minute-tutorial/.gitignore b/gradle/docs/examples/5-minute-tutorial/.gitignore
new file mode 100644
index 0000000000..2cff1e80a7
--- /dev/null
+++ b/gradle/docs/examples/5-minute-tutorial/.gitignore
@@ -0,0 +1,8 @@
+# Ignore Gradle project-specific cache directory
+.gradle
+
+# Ignore Gradle build output directory
+build
+
+# Ignore the output generated by the Hibernate Tools plugin
+generated-sources
\ No newline at end of file
diff --git a/gradle/docs/examples/5-minute-tutorial/app/build.gradle b/gradle/docs/examples/5-minute-tutorial/app/build.gradle
new file mode 100644
index 0000000000..11c50b2db8
--- /dev/null
+++ b/gradle/docs/examples/5-minute-tutorial/app/build.gradle
@@ -0,0 +1,45 @@
+/*
+ * This file was generated by the Gradle 'init' task.
+ *
+ * This generated file contains a sample Java application project to get you started.
+ * For more details on building Java & JVM projects, please refer to https://docs.gradle.org/8.13/userguide/building_java_projects.html in the Gradle documentation.
+ */
+
+plugins {
+ // Apply the application plugin to add support for building a CLI application in Java.
+ id 'application'
+ id 'org.hibernate.tool.hibernate-tools-gradle' version '6.6.27.Final'
+}
+
+repositories {
+ // Use Maven Central for resolving dependencies.
+ mavenCentral()
+}
+
+dependencies {
+ // Use JUnit Jupiter for testing.
+ testImplementation libs.junit.jupiter
+
+ testRuntimeOnly 'org.junit.platform:junit-platform-launcher'
+
+ // This dependency is used by the application.
+ implementation libs.guava
+ implementation 'com.h2database:h2:2.3.232'
+}
+
+// Apply a specific Java toolchain to ease working on different environments.
+java {
+ toolchain {
+ languageVersion = JavaLanguageVersion.of(21)
+ }
+}
+
+application {
+ // Define the main class for the application.
+ mainClass = 'org.example.App'
+}
+
+tasks.named('test') {
+ // Use JUnit Platform for unit tests.
+ useJUnitPlatform()
+}
diff --git a/gradle/docs/examples/5-minute-tutorial/app/src/main/java/org/example/App.java b/gradle/docs/examples/5-minute-tutorial/app/src/main/java/org/example/App.java
new file mode 100644
index 0000000000..e7e1af9398
--- /dev/null
+++ b/gradle/docs/examples/5-minute-tutorial/app/src/main/java/org/example/App.java
@@ -0,0 +1,14 @@
+/*
+ * This source file was generated by the Gradle 'init' task
+ */
+package org.example;
+
+public class App {
+ public String getGreeting() {
+ return "Hello World!";
+ }
+
+ public static void main(String[] args) {
+ System.out.println(new App().getGreeting());
+ }
+}
diff --git a/gradle/docs/examples/5-minute-tutorial/app/src/main/resources/hibernate.properties b/gradle/docs/examples/5-minute-tutorial/app/src/main/resources/hibernate.properties
new file mode 100644
index 0000000000..60b2483a2f
--- /dev/null
+++ b/gradle/docs/examples/5-minute-tutorial/app/src/main/resources/hibernate.properties
@@ -0,0 +1,23 @@
+############################################################################
+# Hibernate Tools, Tooling for your Hibernate Projects #
+# #
+# Copyright 2004-2025 Red Hat, Inc. #
+# #
+# Licensed under the Apache License, Version 2.0 (the "License"); #
+# you may not use this file except in compliance with the License. #
+# You may obtain a copy of the License at #
+# #
+# http://www.apache.org/licenses/LICENSE-2.0 #
+# #
+# Unless required by applicable law or agreed to in writing, software #
+# distributed under the License is distributed on an "AS IS" basis, #
+# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. #
+# See the License for the specific language governing permissions and #
+# limitations under the License. #
+############################################################################
+hibernate.connection.driver_class=org.h2.Driver
+hibernate.connection.url=jdbc:h2:tcp://localhost/./sakila
+hibernate.connection.username=sa
+hibernate.default_catalog=SAKILA
+hibernate.default_schema=PUBLIC
+
diff --git a/gradle/docs/examples/5-minute-tutorial/app/src/test/java/org/example/AppTest.java b/gradle/docs/examples/5-minute-tutorial/app/src/test/java/org/example/AppTest.java
new file mode 100644
index 0000000000..f5ce33d353
--- /dev/null
+++ b/gradle/docs/examples/5-minute-tutorial/app/src/test/java/org/example/AppTest.java
@@ -0,0 +1,14 @@
+/*
+ * This source file was generated by the Gradle 'init' task
+ */
+package org.example;
+
+import org.junit.jupiter.api.Test;
+import static org.junit.jupiter.api.Assertions.*;
+
+class AppTest {
+ @Test void appHasAGreeting() {
+ App classUnderTest = new App();
+ assertNotNull(classUnderTest.getGreeting(), "app should have a greeting");
+ }
+}
diff --git a/gradle/docs/examples/5-minute-tutorial/gradle.properties b/gradle/docs/examples/5-minute-tutorial/gradle.properties
new file mode 100644
index 0000000000..c7e3d0408a
--- /dev/null
+++ b/gradle/docs/examples/5-minute-tutorial/gradle.properties
@@ -0,0 +1,5 @@
+# This file was generated by the Gradle 'init' task.
+# https://docs.gradle.org/current/userguide/build_environment.html#sec:gradle_configuration_properties
+
+#org.gradle.configuration-cache=true
+
diff --git a/gradle/docs/examples/5-minute-tutorial/gradle/libs.versions.toml b/gradle/docs/examples/5-minute-tutorial/gradle/libs.versions.toml
new file mode 100644
index 0000000000..afde0223fa
--- /dev/null
+++ b/gradle/docs/examples/5-minute-tutorial/gradle/libs.versions.toml
@@ -0,0 +1,10 @@
+# This file was generated by the Gradle 'init' task.
+# https://docs.gradle.org/current/userguide/platforms.html#sub::toml-dependencies-format
+
+[versions]
+guava = "33.3.1-jre"
+junit-jupiter = "5.11.3"
+
+[libraries]
+guava = { module = "com.google.guava:guava", version.ref = "guava" }
+junit-jupiter = { module = "org.junit.jupiter:junit-jupiter", version.ref = "junit-jupiter" }
diff --git a/gradle/docs/examples/5-minute-tutorial/gradle/wrapper/gradle-wrapper.jar b/gradle/docs/examples/5-minute-tutorial/gradle/wrapper/gradle-wrapper.jar
new file mode 100644
index 0000000000..9bbc975c74
Binary files /dev/null and b/gradle/docs/examples/5-minute-tutorial/gradle/wrapper/gradle-wrapper.jar differ
diff --git a/gradle/docs/examples/5-minute-tutorial/gradle/wrapper/gradle-wrapper.properties b/gradle/docs/examples/5-minute-tutorial/gradle/wrapper/gradle-wrapper.properties
new file mode 100644
index 0000000000..37f853b1c8
--- /dev/null
+++ b/gradle/docs/examples/5-minute-tutorial/gradle/wrapper/gradle-wrapper.properties
@@ -0,0 +1,7 @@
+distributionBase=GRADLE_USER_HOME
+distributionPath=wrapper/dists
+distributionUrl=https\://services.gradle.org/distributions/gradle-8.13-bin.zip
+networkTimeout=10000
+validateDistributionUrl=true
+zipStoreBase=GRADLE_USER_HOME
+zipStorePath=wrapper/dists
diff --git a/gradle/docs/examples/5-minute-tutorial/gradlew b/gradle/docs/examples/5-minute-tutorial/gradlew
new file mode 100755
index 0000000000..faf93008b7
--- /dev/null
+++ b/gradle/docs/examples/5-minute-tutorial/gradlew
@@ -0,0 +1,251 @@
+#!/bin/sh
+
+#
+# Copyright © 2015-2021 the original authors.
+#
+# Licensed under the Apache License, Version 2.0 (the "License");
+# you may not use this file except in compliance with the License.
+# You may obtain a copy of the License at
+#
+# https://www.apache.org/licenses/LICENSE-2.0
+#
+# Unless required by applicable law or agreed to in writing, software
+# distributed under the License is distributed on an "AS IS" BASIS,
+# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+# See the License for the specific language governing permissions and
+# limitations under the License.
+#
+# SPDX-License-Identifier: Apache-2.0
+#
+
+##############################################################################
+#
+# Gradle start up script for POSIX generated by Gradle.
+#
+# Important for running:
+#
+# (1) You need a POSIX-compliant shell to run this script. If your /bin/sh is
+# noncompliant, but you have some other compliant shell such as ksh or
+# bash, then to run this script, type that shell name before the whole
+# command line, like:
+#
+# ksh Gradle
+#
+# Busybox and similar reduced shells will NOT work, because this script
+# requires all of these POSIX shell features:
+# * functions;
+# * expansions «$var», «${var}», «${var:-default}», «${var+SET}»,
+# «${var#prefix}», «${var%suffix}», and «$( cmd )»;
+# * compound commands having a testable exit status, especially «case»;
+# * various built-in commands including «command», «set», and «ulimit».
+#
+# Important for patching:
+#
+# (2) This script targets any POSIX shell, so it avoids extensions provided
+# by Bash, Ksh, etc; in particular arrays are avoided.
+#
+# The "traditional" practice of packing multiple parameters into a
+# space-separated string is a well documented source of bugs and security
+# problems, so this is (mostly) avoided, by progressively accumulating
+# options in "$@", and eventually passing that to Java.
+#
+# Where the inherited environment variables (DEFAULT_JVM_OPTS, JAVA_OPTS,
+# and GRADLE_OPTS) rely on word-splitting, this is performed explicitly;
+# see the in-line comments for details.
+#
+# There are tweaks for specific operating systems such as AIX, CygWin,
+# Darwin, MinGW, and NonStop.
+#
+# (3) This script is generated from the Groovy template
+# https://github.com/gradle/gradle/blob/HEAD/platforms/jvm/plugins-application/src/main/resources/org/gradle/api/internal/plugins/unixStartScript.txt
+# within the Gradle project.
+#
+# You can find Gradle at https://github.com/gradle/gradle/.
+#
+##############################################################################
+
+# Attempt to set APP_HOME
+
+# Resolve links: $0 may be a link
+app_path=$0
+
+# Need this for daisy-chained symlinks.
+while
+ APP_HOME=${app_path%"${app_path##*/}"} # leaves a trailing /; empty if no leading path
+ [ -h "$app_path" ]
+do
+ ls=$( ls -ld "$app_path" )
+ link=${ls#*' -> '}
+ case $link in #(
+ /*) app_path=$link ;; #(
+ *) app_path=$APP_HOME$link ;;
+ esac
+done
+
+# This is normally unused
+# shellcheck disable=SC2034
+APP_BASE_NAME=${0##*/}
+# Discard cd standard output in case $CDPATH is set (https://github.com/gradle/gradle/issues/25036)
+APP_HOME=$( cd -P "${APP_HOME:-./}" > /dev/null && printf '%s\n' "$PWD" ) || exit
+
+# Use the maximum available, or set MAX_FD != -1 to use that value.
+MAX_FD=maximum
+
+warn () {
+ echo "$*"
+} >&2
+
+die () {
+ echo
+ echo "$*"
+ echo
+ exit 1
+} >&2
+
+# OS specific support (must be 'true' or 'false').
+cygwin=false
+msys=false
+darwin=false
+nonstop=false
+case "$( uname )" in #(
+ CYGWIN* ) cygwin=true ;; #(
+ Darwin* ) darwin=true ;; #(
+ MSYS* | MINGW* ) msys=true ;; #(
+ NONSTOP* ) nonstop=true ;;
+esac
+
+CLASSPATH=$APP_HOME/gradle/wrapper/gradle-wrapper.jar
+
+
+# Determine the Java command to use to start the JVM.
+if [ -n "$JAVA_HOME" ] ; then
+ if [ -x "$JAVA_HOME/jre/sh/java" ] ; then
+ # IBM's JDK on AIX uses strange locations for the executables
+ JAVACMD=$JAVA_HOME/jre/sh/java
+ else
+ JAVACMD=$JAVA_HOME/bin/java
+ fi
+ if [ ! -x "$JAVACMD" ] ; then
+ die "ERROR: JAVA_HOME is set to an invalid directory: $JAVA_HOME
+
+Please set the JAVA_HOME variable in your environment to match the
+location of your Java installation."
+ fi
+else
+ JAVACMD=java
+ if ! command -v java >/dev/null 2>&1
+ then
+ die "ERROR: JAVA_HOME is not set and no 'java' command could be found in your PATH.
+
+Please set the JAVA_HOME variable in your environment to match the
+location of your Java installation."
+ fi
+fi
+
+# Increase the maximum file descriptors if we can.
+if ! "$cygwin" && ! "$darwin" && ! "$nonstop" ; then
+ case $MAX_FD in #(
+ max*)
+ # In POSIX sh, ulimit -H is undefined. That's why the result is checked to see if it worked.
+ # shellcheck disable=SC2039,SC3045
+ MAX_FD=$( ulimit -H -n ) ||
+ warn "Could not query maximum file descriptor limit"
+ esac
+ case $MAX_FD in #(
+ '' | soft) :;; #(
+ *)
+ # In POSIX sh, ulimit -n is undefined. That's why the result is checked to see if it worked.
+ # shellcheck disable=SC2039,SC3045
+ ulimit -n "$MAX_FD" ||
+ warn "Could not set maximum file descriptor limit to $MAX_FD"
+ esac
+fi
+
+# Collect all arguments for the java command, stacking in reverse order:
+# * args from the command line
+# * the main class name
+# * -classpath
+# * -D...appname settings
+# * --module-path (only if needed)
+# * DEFAULT_JVM_OPTS, JAVA_OPTS, and GRADLE_OPTS environment variables.
+
+# For Cygwin or MSYS, switch paths to Windows format before running java
+if "$cygwin" || "$msys" ; then
+ APP_HOME=$( cygpath --path --mixed "$APP_HOME" )
+ CLASSPATH=$( cygpath --path --mixed "$CLASSPATH" )
+
+ JAVACMD=$( cygpath --unix "$JAVACMD" )
+
+ # Now convert the arguments - kludge to limit ourselves to /bin/sh
+ for arg do
+ if
+ case $arg in #(
+ -*) false ;; # don't mess with options #(
+ /?*) t=${arg#/} t=/${t%%/*} # looks like a POSIX filepath
+ [ -e "$t" ] ;; #(
+ *) false ;;
+ esac
+ then
+ arg=$( cygpath --path --ignore --mixed "$arg" )
+ fi
+ # Roll the args list around exactly as many times as the number of
+ # args, so each arg winds up back in the position where it started, but
+ # possibly modified.
+ #
+ # NB: a `for` loop captures its iteration list before it begins, so
+ # changing the positional parameters here affects neither the number of
+ # iterations, nor the values presented in `arg`.
+ shift # remove old arg
+ set -- "$@" "$arg" # push replacement arg
+ done
+fi
+
+
+# Add default JVM options here. You can also use JAVA_OPTS and GRADLE_OPTS to pass JVM options to this script.
+DEFAULT_JVM_OPTS='"-Xmx64m" "-Xms64m"'
+
+# Collect all arguments for the java command:
+# * DEFAULT_JVM_OPTS, JAVA_OPTS, and optsEnvironmentVar are not allowed to contain shell fragments,
+# and any embedded shellness will be escaped.
+# * For example: A user cannot expect ${Hostname} to be expanded, as it is an environment variable and will be
+# treated as '${Hostname}' itself on the command line.
+
+set -- \
+ "-Dorg.gradle.appname=$APP_BASE_NAME" \
+ -classpath "$CLASSPATH" \
+ org.gradle.wrapper.GradleWrapperMain \
+ "$@"
+
+# Stop when "xargs" is not available.
+if ! command -v xargs >/dev/null 2>&1
+then
+ die "xargs is not available"
+fi
+
+# Use "xargs" to parse quoted args.
+#
+# With -n1 it outputs one arg per line, with the quotes and backslashes removed.
+#
+# In Bash we could simply go:
+#
+# readarray ARGS < <( xargs -n1 <<<"$var" ) &&
+# set -- "${ARGS[@]}" "$@"
+#
+# but POSIX shell has neither arrays nor command substitution, so instead we
+# post-process each arg (as a line of input to sed) to backslash-escape any
+# character that might be a shell metacharacter, then use eval to reverse
+# that process (while maintaining the separation between arguments), and wrap
+# the whole thing up as a single "set" statement.
+#
+# This will of course break if any of these variables contains a newline or
+# an unmatched quote.
+#
+
+eval "set -- $(
+ printf '%s\n' "$DEFAULT_JVM_OPTS $JAVA_OPTS $GRADLE_OPTS" |
+ xargs -n1 |
+ sed ' s~[^-[:alnum:]+,./:=@_]~\\&~g; ' |
+ tr '\n' ' '
+ )" '"$@"'
+
+exec "$JAVACMD" "$@"
diff --git a/gradle/docs/examples/5-minute-tutorial/gradlew.bat b/gradle/docs/examples/5-minute-tutorial/gradlew.bat
new file mode 100644
index 0000000000..9d21a21834
--- /dev/null
+++ b/gradle/docs/examples/5-minute-tutorial/gradlew.bat
@@ -0,0 +1,94 @@
+@rem
+@rem Copyright 2015 the original author or authors.
+@rem
+@rem Licensed under the Apache License, Version 2.0 (the "License");
+@rem you may not use this file except in compliance with the License.
+@rem You may obtain a copy of the License at
+@rem
+@rem https://www.apache.org/licenses/LICENSE-2.0
+@rem
+@rem Unless required by applicable law or agreed to in writing, software
+@rem distributed under the License is distributed on an "AS IS" BASIS,
+@rem WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+@rem See the License for the specific language governing permissions and
+@rem limitations under the License.
+@rem
+@rem SPDX-License-Identifier: Apache-2.0
+@rem
+
+@if "%DEBUG%"=="" @echo off
+@rem ##########################################################################
+@rem
+@rem Gradle startup script for Windows
+@rem
+@rem ##########################################################################
+
+@rem Set local scope for the variables with windows NT shell
+if "%OS%"=="Windows_NT" setlocal
+
+set DIRNAME=%~dp0
+if "%DIRNAME%"=="" set DIRNAME=.
+@rem This is normally unused
+set APP_BASE_NAME=%~n0
+set APP_HOME=%DIRNAME%
+
+@rem Resolve any "." and ".." in APP_HOME to make it shorter.
+for %%i in ("%APP_HOME%") do set APP_HOME=%%~fi
+
+@rem Add default JVM options here. You can also use JAVA_OPTS and GRADLE_OPTS to pass JVM options to this script.
+set DEFAULT_JVM_OPTS="-Xmx64m" "-Xms64m"
+
+@rem Find java.exe
+if defined JAVA_HOME goto findJavaFromJavaHome
+
+set JAVA_EXE=java.exe
+%JAVA_EXE% -version >NUL 2>&1
+if %ERRORLEVEL% equ 0 goto execute
+
+echo. 1>&2
+echo ERROR: JAVA_HOME is not set and no 'java' command could be found in your PATH. 1>&2
+echo. 1>&2
+echo Please set the JAVA_HOME variable in your environment to match the 1>&2
+echo location of your Java installation. 1>&2
+
+goto fail
+
+:findJavaFromJavaHome
+set JAVA_HOME=%JAVA_HOME:"=%
+set JAVA_EXE=%JAVA_HOME%/bin/java.exe
+
+if exist "%JAVA_EXE%" goto execute
+
+echo. 1>&2
+echo ERROR: JAVA_HOME is set to an invalid directory: %JAVA_HOME% 1>&2
+echo. 1>&2
+echo Please set the JAVA_HOME variable in your environment to match the 1>&2
+echo location of your Java installation. 1>&2
+
+goto fail
+
+:execute
+@rem Setup the command line
+
+set CLASSPATH=%APP_HOME%\gradle\wrapper\gradle-wrapper.jar
+
+
+@rem Execute Gradle
+"%JAVA_EXE%" %DEFAULT_JVM_OPTS% %JAVA_OPTS% %GRADLE_OPTS% "-Dorg.gradle.appname=%APP_BASE_NAME%" -classpath "%CLASSPATH%" org.gradle.wrapper.GradleWrapperMain %*
+
+:end
+@rem End local scope for the variables with windows NT shell
+if %ERRORLEVEL% equ 0 goto mainEnd
+
+:fail
+rem Set variable GRADLE_EXIT_CONSOLE if you need the _script_ return code instead of
+rem the _cmd.exe /c_ return code!
+set EXIT_CODE=%ERRORLEVEL%
+if %EXIT_CODE% equ 0 set EXIT_CODE=1
+if not ""=="%GRADLE_EXIT_CONSOLE%" exit %EXIT_CODE%
+exit /b %EXIT_CODE%
+
+:mainEnd
+if "%OS%"=="Windows_NT" endlocal
+
+:omega
diff --git a/gradle/docs/examples/5-minute-tutorial/settings.gradle b/gradle/docs/examples/5-minute-tutorial/settings.gradle
new file mode 100644
index 0000000000..458084916d
--- /dev/null
+++ b/gradle/docs/examples/5-minute-tutorial/settings.gradle
@@ -0,0 +1,14 @@
+/*
+ * This file was generated by the Gradle 'init' task.
+ *
+ * The settings file is used to specify which projects to include in your build.
+ * For more detailed information on multi-project builds, please refer to https://docs.gradle.org/8.13/userguide/multi_project_builds.html in the Gradle documentation.
+ */
+
+plugins {
+ // Apply the foojay-resolver plugin to allow automatic download of JDKs
+ id 'org.gradle.toolchains.foojay-resolver-convention' version '0.9.0'
+}
+
+rootProject.name = '5-minute-tutorial'
+include('app')
diff --git a/gradle/gradle/libs.versions.toml b/gradle/gradle/libs.versions.toml
new file mode 100644
index 0000000000..a008468ff8
--- /dev/null
+++ b/gradle/gradle/libs.versions.toml
@@ -0,0 +1,8 @@
+# This file was generated by the Gradle 'init' task.
+# https://docs.gradle.org/current/userguide/platforms.html#sub::toml-dependencies-format
+
+[versions]
+junit-jupiter = "5.13.3"
+
+[libraries]
+junit-jupiter = { module = "org.junit.jupiter:junit-jupiter", version.ref = "junit-jupiter" }
diff --git a/gradle/gradle/wrapper/gradle-wrapper.jar b/gradle/gradle/wrapper/gradle-wrapper.jar
new file mode 100644
index 0000000000..e6441136f3
Binary files /dev/null and b/gradle/gradle/wrapper/gradle-wrapper.jar differ
diff --git a/gradle/gradle/wrapper/gradle-wrapper.properties b/gradle/gradle/wrapper/gradle-wrapper.properties
new file mode 100644
index 0000000000..d4081da476
--- /dev/null
+++ b/gradle/gradle/wrapper/gradle-wrapper.properties
@@ -0,0 +1,7 @@
+distributionBase=GRADLE_USER_HOME
+distributionPath=wrapper/dists
+distributionUrl=https\://services.gradle.org/distributions/gradle-8.14.3-bin.zip
+networkTimeout=10000
+validateDistributionUrl=true
+zipStoreBase=GRADLE_USER_HOME
+zipStorePath=wrapper/dists
diff --git a/gradle/gradlew b/gradle/gradlew
new file mode 100755
index 0000000000..b740cf1339
--- /dev/null
+++ b/gradle/gradlew
@@ -0,0 +1,249 @@
+#!/bin/sh
+
+#
+# Copyright © 2015-2021 the original authors.
+#
+# Licensed under the Apache License, Version 2.0 (the "License");
+# you may not use this file except in compliance with the License.
+# You may obtain a copy of the License at
+#
+# https://www.apache.org/licenses/LICENSE-2.0
+#
+# Unless required by applicable law or agreed to in writing, software
+# distributed under the License is distributed on an "AS IS" BASIS,
+# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+# See the License for the specific language governing permissions and
+# limitations under the License.
+#
+
+##############################################################################
+#
+# Gradle start up script for POSIX generated by Gradle.
+#
+# Important for running:
+#
+# (1) You need a POSIX-compliant shell to run this script. If your /bin/sh is
+# noncompliant, but you have some other compliant shell such as ksh or
+# bash, then to run this script, type that shell name before the whole
+# command line, like:
+#
+# ksh Gradle
+#
+# Busybox and similar reduced shells will NOT work, because this script
+# requires all of these POSIX shell features:
+# * functions;
+# * expansions «$var», «${var}», «${var:-default}», «${var+SET}»,
+# «${var#prefix}», «${var%suffix}», and «$( cmd )»;
+# * compound commands having a testable exit status, especially «case»;
+# * various built-in commands including «command», «set», and «ulimit».
+#
+# Important for patching:
+#
+# (2) This script targets any POSIX shell, so it avoids extensions provided
+# by Bash, Ksh, etc; in particular arrays are avoided.
+#
+# The "traditional" practice of packing multiple parameters into a
+# space-separated string is a well documented source of bugs and security
+# problems, so this is (mostly) avoided, by progressively accumulating
+# options in "$@", and eventually passing that to Java.
+#
+# Where the inherited environment variables (DEFAULT_JVM_OPTS, JAVA_OPTS,
+# and GRADLE_OPTS) rely on word-splitting, this is performed explicitly;
+# see the in-line comments for details.
+#
+# There are tweaks for specific operating systems such as AIX, CygWin,
+# Darwin, MinGW, and NonStop.
+#
+# (3) This script is generated from the Groovy template
+# https://github.com/gradle/gradle/blob/HEAD/platforms/jvm/plugins-application/src/main/resources/org/gradle/api/internal/plugins/unixStartScript.txt
+# within the Gradle project.
+#
+# You can find Gradle at https://github.com/gradle/gradle/.
+#
+##############################################################################
+
+# Attempt to set APP_HOME
+
+# Resolve links: $0 may be a link
+app_path=$0
+
+# Need this for daisy-chained symlinks.
+while
+ APP_HOME=${app_path%"${app_path##*/}"} # leaves a trailing /; empty if no leading path
+ [ -h "$app_path" ]
+do
+ ls=$( ls -ld "$app_path" )
+ link=${ls#*' -> '}
+ case $link in #(
+ /*) app_path=$link ;; #(
+ *) app_path=$APP_HOME$link ;;
+ esac
+done
+
+# This is normally unused
+# shellcheck disable=SC2034
+APP_BASE_NAME=${0##*/}
+# Discard cd standard output in case $CDPATH is set (https://github.com/gradle/gradle/issues/25036)
+APP_HOME=$( cd "${APP_HOME:-./}" > /dev/null && pwd -P ) || exit
+
+# Use the maximum available, or set MAX_FD != -1 to use that value.
+MAX_FD=maximum
+
+warn () {
+ echo "$*"
+} >&2
+
+die () {
+ echo
+ echo "$*"
+ echo
+ exit 1
+} >&2
+
+# OS specific support (must be 'true' or 'false').
+cygwin=false
+msys=false
+darwin=false
+nonstop=false
+case "$( uname )" in #(
+ CYGWIN* ) cygwin=true ;; #(
+ Darwin* ) darwin=true ;; #(
+ MSYS* | MINGW* ) msys=true ;; #(
+ NONSTOP* ) nonstop=true ;;
+esac
+
+CLASSPATH=$APP_HOME/gradle/wrapper/gradle-wrapper.jar
+
+
+# Determine the Java command to use to start the JVM.
+if [ -n "$JAVA_HOME" ] ; then
+ if [ -x "$JAVA_HOME/jre/sh/java" ] ; then
+ # IBM's JDK on AIX uses strange locations for the executables
+ JAVACMD=$JAVA_HOME/jre/sh/java
+ else
+ JAVACMD=$JAVA_HOME/bin/java
+ fi
+ if [ ! -x "$JAVACMD" ] ; then
+ die "ERROR: JAVA_HOME is set to an invalid directory: $JAVA_HOME
+
+Please set the JAVA_HOME variable in your environment to match the
+location of your Java installation."
+ fi
+else
+ JAVACMD=java
+ if ! command -v java >/dev/null 2>&1
+ then
+ die "ERROR: JAVA_HOME is not set and no 'java' command could be found in your PATH.
+
+Please set the JAVA_HOME variable in your environment to match the
+location of your Java installation."
+ fi
+fi
+
+# Increase the maximum file descriptors if we can.
+if ! "$cygwin" && ! "$darwin" && ! "$nonstop" ; then
+ case $MAX_FD in #(
+ max*)
+ # In POSIX sh, ulimit -H is undefined. That's why the result is checked to see if it worked.
+ # shellcheck disable=SC2039,SC3045
+ MAX_FD=$( ulimit -H -n ) ||
+ warn "Could not query maximum file descriptor limit"
+ esac
+ case $MAX_FD in #(
+ '' | soft) :;; #(
+ *)
+ # In POSIX sh, ulimit -n is undefined. That's why the result is checked to see if it worked.
+ # shellcheck disable=SC2039,SC3045
+ ulimit -n "$MAX_FD" ||
+ warn "Could not set maximum file descriptor limit to $MAX_FD"
+ esac
+fi
+
+# Collect all arguments for the java command, stacking in reverse order:
+# * args from the command line
+# * the main class name
+# * -classpath
+# * -D...appname settings
+# * --module-path (only if needed)
+# * DEFAULT_JVM_OPTS, JAVA_OPTS, and GRADLE_OPTS environment variables.
+
+# For Cygwin or MSYS, switch paths to Windows format before running java
+if "$cygwin" || "$msys" ; then
+ APP_HOME=$( cygpath --path --mixed "$APP_HOME" )
+ CLASSPATH=$( cygpath --path --mixed "$CLASSPATH" )
+
+ JAVACMD=$( cygpath --unix "$JAVACMD" )
+
+ # Now convert the arguments - kludge to limit ourselves to /bin/sh
+ for arg do
+ if
+ case $arg in #(
+ -*) false ;; # don't mess with options #(
+ /?*) t=${arg#/} t=/${t%%/*} # looks like a POSIX filepath
+ [ -e "$t" ] ;; #(
+ *) false ;;
+ esac
+ then
+ arg=$( cygpath --path --ignore --mixed "$arg" )
+ fi
+ # Roll the args list around exactly as many times as the number of
+ # args, so each arg winds up back in the position where it started, but
+ # possibly modified.
+ #
+ # NB: a `for` loop captures its iteration list before it begins, so
+ # changing the positional parameters here affects neither the number of
+ # iterations, nor the values presented in `arg`.
+ shift # remove old arg
+ set -- "$@" "$arg" # push replacement arg
+ done
+fi
+
+
+# Add default JVM options here. You can also use JAVA_OPTS and GRADLE_OPTS to pass JVM options to this script.
+DEFAULT_JVM_OPTS='"-Xmx64m" "-Xms64m"'
+
+# Collect all arguments for the java command:
+# * DEFAULT_JVM_OPTS, JAVA_OPTS, JAVA_OPTS, and optsEnvironmentVar are not allowed to contain shell fragments,
+# and any embedded shellness will be escaped.
+# * For example: A user cannot expect ${Hostname} to be expanded, as it is an environment variable and will be
+# treated as '${Hostname}' itself on the command line.
+
+set -- \
+ "-Dorg.gradle.appname=$APP_BASE_NAME" \
+ -classpath "$CLASSPATH" \
+ org.gradle.wrapper.GradleWrapperMain \
+ "$@"
+
+# Stop when "xargs" is not available.
+if ! command -v xargs >/dev/null 2>&1
+then
+ die "xargs is not available"
+fi
+
+# Use "xargs" to parse quoted args.
+#
+# With -n1 it outputs one arg per line, with the quotes and backslashes removed.
+#
+# In Bash we could simply go:
+#
+# readarray ARGS < <( xargs -n1 <<<"$var" ) &&
+# set -- "${ARGS[@]}" "$@"
+#
+# but POSIX shell has neither arrays nor command substitution, so instead we
+# post-process each arg (as a line of input to sed) to backslash-escape any
+# character that might be a shell metacharacter, then use eval to reverse
+# that process (while maintaining the separation between arguments), and wrap
+# the whole thing up as a single "set" statement.
+#
+# This will of course break if any of these variables contains a newline or
+# an unmatched quote.
+#
+
+eval "set -- $(
+ printf '%s\n' "$DEFAULT_JVM_OPTS $JAVA_OPTS $GRADLE_OPTS" |
+ xargs -n1 |
+ sed ' s~[^-[:alnum:]+,./:=@_]~\\&~g; ' |
+ tr '\n' ' '
+ )" '"$@"'
+
+exec "$JAVACMD" "$@"
diff --git a/gradle/gradlew.bat b/gradle/gradlew.bat
new file mode 100644
index 0000000000..25da30dbde
--- /dev/null
+++ b/gradle/gradlew.bat
@@ -0,0 +1,92 @@
+@rem
+@rem Copyright 2015 the original author or authors.
+@rem
+@rem Licensed under the Apache License, Version 2.0 (the "License");
+@rem you may not use this file except in compliance with the License.
+@rem You may obtain a copy of the License at
+@rem
+@rem https://www.apache.org/licenses/LICENSE-2.0
+@rem
+@rem Unless required by applicable law or agreed to in writing, software
+@rem distributed under the License is distributed on an "AS IS" BASIS,
+@rem WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+@rem See the License for the specific language governing permissions and
+@rem limitations under the License.
+@rem
+
+@if "%DEBUG%"=="" @echo off
+@rem ##########################################################################
+@rem
+@rem Gradle startup script for Windows
+@rem
+@rem ##########################################################################
+
+@rem Set local scope for the variables with windows NT shell
+if "%OS%"=="Windows_NT" setlocal
+
+set DIRNAME=%~dp0
+if "%DIRNAME%"=="" set DIRNAME=.
+@rem This is normally unused
+set APP_BASE_NAME=%~n0
+set APP_HOME=%DIRNAME%
+
+@rem Resolve any "." and ".." in APP_HOME to make it shorter.
+for %%i in ("%APP_HOME%") do set APP_HOME=%%~fi
+
+@rem Add default JVM options here. You can also use JAVA_OPTS and GRADLE_OPTS to pass JVM options to this script.
+set DEFAULT_JVM_OPTS="-Xmx64m" "-Xms64m"
+
+@rem Find java.exe
+if defined JAVA_HOME goto findJavaFromJavaHome
+
+set JAVA_EXE=java.exe
+%JAVA_EXE% -version >NUL 2>&1
+if %ERRORLEVEL% equ 0 goto execute
+
+echo. 1>&2
+echo ERROR: JAVA_HOME is not set and no 'java' command could be found in your PATH. 1>&2
+echo. 1>&2
+echo Please set the JAVA_HOME variable in your environment to match the 1>&2
+echo location of your Java installation. 1>&2
+
+goto fail
+
+:findJavaFromJavaHome
+set JAVA_HOME=%JAVA_HOME:"=%
+set JAVA_EXE=%JAVA_HOME%/bin/java.exe
+
+if exist "%JAVA_EXE%" goto execute
+
+echo. 1>&2
+echo ERROR: JAVA_HOME is set to an invalid directory: %JAVA_HOME% 1>&2
+echo. 1>&2
+echo Please set the JAVA_HOME variable in your environment to match the 1>&2
+echo location of your Java installation. 1>&2
+
+goto fail
+
+:execute
+@rem Setup the command line
+
+set CLASSPATH=%APP_HOME%\gradle\wrapper\gradle-wrapper.jar
+
+
+@rem Execute Gradle
+"%JAVA_EXE%" %DEFAULT_JVM_OPTS% %JAVA_OPTS% %GRADLE_OPTS% "-Dorg.gradle.appname=%APP_BASE_NAME%" -classpath "%CLASSPATH%" org.gradle.wrapper.GradleWrapperMain %*
+
+:end
+@rem End local scope for the variables with windows NT shell
+if %ERRORLEVEL% equ 0 goto mainEnd
+
+:fail
+rem Set variable GRADLE_EXIT_CONSOLE if you need the _script_ return code instead of
+rem the _cmd.exe /c_ return code!
+set EXIT_CODE=%ERRORLEVEL%
+if %EXIT_CODE% equ 0 set EXIT_CODE=1
+if not ""=="%GRADLE_EXIT_CONSOLE%" exit %EXIT_CODE%
+exit /b %EXIT_CODE%
+
+:mainEnd
+if "%OS%"=="Windows_NT" endlocal
+
+:omega
diff --git a/gradle/plugin/bin/.gitignore b/gradle/plugin/bin/.gitignore
new file mode 100644
index 0000000000..dc141cdac9
--- /dev/null
+++ b/gradle/plugin/bin/.gitignore
@@ -0,0 +1,3 @@
+/functionalTest/
+/main/
+/test/
diff --git a/gradle/plugin/build.gradle b/gradle/plugin/build.gradle
new file mode 100644
index 0000000000..837bba02a3
--- /dev/null
+++ b/gradle/plugin/build.gradle
@@ -0,0 +1,145 @@
+plugins {
+ id 'java-gradle-plugin'
+ id 'maven-publish'
+ id 'com.gradle.plugin-publish' version '1.2.1'
+}
+
+group = 'org.hibernate.tool'
+project.description = 'Gradle plugin to provide hibernate-tools reverse engineering and code/schema generation abilities.'
+project.version = "$projectVersion"
+
+java {
+ toolchain {
+ languageVersion = JavaLanguageVersion.of(11)
+ }
+}
+
+repositories {
+ mavenCentral()
+ mavenLocal()
+}
+
+dependencies {
+
+ implementation "org.hibernate.tool:hibernate-tools-orm:$projectVersion"
+
+ testImplementation libs.junit.jupiter
+
+ testRuntimeOnly 'org.junit.platform:junit-platform-launcher'
+ testRuntimeOnly "com.h2database:h2:$h2Version"
+}
+
+rootProject.ext.set("gradle.publish.key", System.env.PLUGIN_PORTAL_USERNAME)
+rootProject.ext.set("gradle.publish.secret", System.env.PLUGIN_PORTAL_PASSWORD)
+
+gradlePlugin {
+ website = 'https://github.com/hibernate/hibernate-tools/tree/main/gradle/plugin'
+ vcsUrl = 'https://github.com/hibernate/hibernate-tools/tree/main/gradle/plugin'
+ plugins {
+ hibernate {
+ id = 'org.hibernate.tool.hibernate-tools-gradle'
+ implementationClass = 'org.hibernate.tool.gradle.Plugin'
+ displayName = 'Hibernate Tools Gradle Plugin'
+ description = project.description
+ tags = ['hibernate','tools','reverse engineering','reveng','generation']
+ }
+ }
+}
+
+sourceSets {
+ functionalTest {
+ }
+}
+
+configurations.functionalTestImplementation.extendsFrom(configurations.testImplementation)
+configurations.functionalTestRuntimeOnly.extendsFrom(configurations.testRuntimeOnly)
+
+tasks.register('functionalTest', Test) {
+ testClassesDirs = sourceSets.functionalTest.output.classesDirs
+ classpath = sourceSets.functionalTest.runtimeClasspath
+ useJUnitPlatform()
+ environment("HIBERNATE_TOOLS_VERSION", projectVersion);
+ environment("H2_VERSION", h2Version);
+}
+
+gradlePlugin.testSourceSets.add(sourceSets.functionalTest)
+
+tasks.named('check') {
+ dependsOn(tasks.functionalTest)
+}
+
+tasks.named('test') {
+ useJUnitPlatform()
+}
+
+tasks.named('publishPlugins') {
+ onlyIf {
+ def isDryRun = System.getenv('JRELEASER_DRY_RUN')
+ !Boolean.parseBoolean(isDryRun)
+ }
+}
+
+publishing {
+ publications {
+ pluginMaven(MavenPublication) {
+ pom {
+ name = project.name
+ groupId = 'org.hibernate.tool'
+ artifactId = project.name
+ version = project.version
+
+ description = project.description
+ url = 'https://hibernate.org/tools'
+
+ organization {
+ name = 'Hibernate.org'
+ url = 'https://hibernate.org'
+ }
+
+ licenses {
+ license {
+ name = 'Apache License, version 2.0'
+ url = 'https://www.apache.org/licenses/LICENSE-2.0'
+ }
+ }
+
+ scm {
+ url = 'https://github.com/hibernate/hibernate-tools'
+ connection = 'scm:git:https://github.com/hibernate/hibernate-tools.git'
+ developerConnection = 'scm:git:git@github.com:hibernate/hibernate-tools.git'
+ }
+
+ developers {
+ developer {
+ id = 'maxandersen'
+ name = 'Max Andersen'
+ email = 'max@hibernate.org'
+ url = 'https://in.relation.to/Bloggers/Max'
+ }
+ developer {
+ id = 'koentsje'
+ name = 'Koen Aers'
+ email = 'koen@hibernate.org'
+ url = 'https://koentsje.blogspot.be'
+ }
+ }
+
+ issueManagement {
+ system = 'jira'
+ url = 'https://hibernate.atlassian.net/browse/HBX'
+ }
+ }
+ }
+ }
+ repositories {
+ maven {
+ name = "staging"
+ var mavenPath = findProperty("mavenStagingDirectory")
+ if (mavenPath == null) {
+ url = rootProject.layout.buildDirectory.dir("staging-deploy${File.separator}maven")
+ } else {
+ url = URI.create(mavenPath).toURL()
+ }
+ }
+ }
+}
diff --git a/gradle/plugin/src/functionalTest/java/org/hibernate/tool/gradle/GenerateCfgTest.java b/gradle/plugin/src/functionalTest/java/org/hibernate/tool/gradle/GenerateCfgTest.java
new file mode 100644
index 0000000000..aee4e698e2
--- /dev/null
+++ b/gradle/plugin/src/functionalTest/java/org/hibernate/tool/gradle/GenerateCfgTest.java
@@ -0,0 +1,38 @@
+package org.hibernate.tool.gradle;
+
+import static org.junit.jupiter.api.Assertions.assertTrue;
+
+import java.io.File;
+import java.io.IOException;
+import java.nio.file.Files;
+
+import org.gradle.testkit.runner.BuildResult;
+import org.hibernate.tool.gradle.test.func.utils.FuncTestConstants;
+import org.hibernate.tool.gradle.test.func.utils.FuncTestTemplate;
+import org.junit.jupiter.api.Test;
+
+class GenerateCfgTest extends FuncTestTemplate implements FuncTestConstants {
+
+ @Test
+ void testGenerateCfg() throws IOException {
+ performTask("generateCfg", true);
+ }
+
+ @Override
+ public void verifyBuild(BuildResult buildResult) {
+ try {
+ File generatedSourcesFolder = new File(projectDir, "generated-sources");
+ assertTrue(buildResult.getOutput().contains("Starting CFG export to directory: " + generatedSourcesFolder.getCanonicalPath()));
+ assertTrue(generatedSourcesFolder.exists());
+ assertTrue(generatedSourcesFolder.isDirectory());
+ File cfgFile = new File(generatedSourcesFolder, "hibernate.cfg.xml");
+ assertTrue(cfgFile.exists());
+ assertTrue(cfgFile.isFile());
+ String cfgContents = Files.readString(cfgFile.toPath());
+ assertTrue(cfgContents.contains(""));
+ } catch (Exception e) {
+ throw new RuntimeException(e);
+ }
+ }
+
+ }
diff --git a/gradle/plugin/src/functionalTest/java/org/hibernate/tool/gradle/GenerateDaoTest.java b/gradle/plugin/src/functionalTest/java/org/hibernate/tool/gradle/GenerateDaoTest.java
new file mode 100644
index 0000000000..4b87877980
--- /dev/null
+++ b/gradle/plugin/src/functionalTest/java/org/hibernate/tool/gradle/GenerateDaoTest.java
@@ -0,0 +1,46 @@
+package org.hibernate.tool.gradle;
+
+import static org.junit.jupiter.api.Assertions.assertTrue;
+
+import java.io.File;
+import java.io.IOException;
+
+import org.gradle.testkit.runner.BuildResult;
+import org.hibernate.tool.gradle.test.func.utils.FuncTestConstants;
+import org.hibernate.tool.gradle.test.func.utils.FuncTestTemplate;
+import org.junit.jupiter.api.Test;
+
+class GenerateDaoTest extends FuncTestTemplate implements FuncTestConstants {
+
+ private static final String BUILD_FILE_HIBERNATE_TOOLS_SECTION =
+ "hibernateTools {\n" +
+ " packageName = 'foo.model'\n" +
+ "}\n";
+
+ @Override
+ public String getBuildFileHibernateToolsSection() {
+ return BUILD_FILE_HIBERNATE_TOOLS_SECTION;
+ }
+
+ @Test
+ void testGenerateJava() throws IOException {
+ performTask("generateDao", true);
+ }
+
+ @Override
+ protected void verifyBuild(BuildResult buildResult) {
+ try {
+ File generatedSourcesFolder = new File(projectDir, "generated-sources");
+ assertTrue(buildResult.getOutput().contains(
+ "Starting DAO export to directory: " + generatedSourcesFolder.getCanonicalPath()));
+ assertTrue(generatedSourcesFolder.exists());
+ assertTrue(generatedSourcesFolder.isDirectory());
+ File fooFile = new File(generatedSourcesFolder, "foo/model/FooHome.java");
+ assertTrue(fooFile.exists());
+ assertTrue(fooFile.isFile());
+ } catch (Exception e) {
+ throw new RuntimeException(e);
+ }
+ }
+
+ }
diff --git a/gradle/plugin/src/functionalTest/java/org/hibernate/tool/gradle/GenerateHbmTest.java b/gradle/plugin/src/functionalTest/java/org/hibernate/tool/gradle/GenerateHbmTest.java
new file mode 100644
index 0000000000..0697a1c382
--- /dev/null
+++ b/gradle/plugin/src/functionalTest/java/org/hibernate/tool/gradle/GenerateHbmTest.java
@@ -0,0 +1,46 @@
+package org.hibernate.tool.gradle;
+
+import static org.junit.jupiter.api.Assertions.assertTrue;
+
+import java.io.File;
+import java.io.IOException;
+
+import org.gradle.testkit.runner.BuildResult;
+import org.hibernate.tool.gradle.test.func.utils.FuncTestConstants;
+import org.hibernate.tool.gradle.test.func.utils.FuncTestTemplate;
+import org.junit.jupiter.api.Test;
+
+class GenerateHbmTest extends FuncTestTemplate implements FuncTestConstants {
+
+ private static final String BUILD_FILE_HIBERNATE_TOOLS_SECTION =
+ "hibernateTools {\n" +
+ " packageName = 'foo.model'\n" +
+ "}\n";
+
+ @Override
+ public String getBuildFileHibernateToolsSection() {
+ return BUILD_FILE_HIBERNATE_TOOLS_SECTION;
+ }
+
+ @Test
+ void testGenerateHbm() throws IOException {
+ performTask("generateHbm", true);
+ }
+
+ @Override
+ protected void verifyBuild(BuildResult buildResult) {
+ try {
+ File generatedSourcesFolder = new File(projectDir, "generated-sources");
+ assertTrue(buildResult.getOutput().contains(
+ "Starting HBM export to directory: " + generatedSourcesFolder.getCanonicalPath()));
+ assertTrue(generatedSourcesFolder.exists());
+ assertTrue(generatedSourcesFolder.isDirectory());
+ File fooFile = new File(generatedSourcesFolder, "foo/model/Foo.hbm.xml");
+ assertTrue(fooFile.exists());
+ assertTrue(fooFile.isFile());
+ } catch (Exception e) {
+ throw new RuntimeException(e);
+ }
+ }
+
+ }
diff --git a/gradle/plugin/src/functionalTest/java/org/hibernate/tool/gradle/GenerateJavaTest.java b/gradle/plugin/src/functionalTest/java/org/hibernate/tool/gradle/GenerateJavaTest.java
new file mode 100644
index 0000000000..d6bc58734c
--- /dev/null
+++ b/gradle/plugin/src/functionalTest/java/org/hibernate/tool/gradle/GenerateJavaTest.java
@@ -0,0 +1,46 @@
+package org.hibernate.tool.gradle;
+
+import static org.junit.jupiter.api.Assertions.assertTrue;
+
+import java.io.File;
+import java.io.IOException;
+
+import org.gradle.testkit.runner.BuildResult;
+import org.hibernate.tool.gradle.test.func.utils.FuncTestConstants;
+import org.hibernate.tool.gradle.test.func.utils.FuncTestTemplate;
+import org.junit.jupiter.api.Test;
+
+class GenerateJavaTest extends FuncTestTemplate implements FuncTestConstants {
+
+ private static final String BUILD_FILE_HIBERNATE_TOOLS_SECTION =
+ "hibernateTools {\n" +
+ " packageName = 'foo.model'\n" +
+ "}\n";
+
+ @Override
+ public String getBuildFileHibernateToolsSection() {
+ return BUILD_FILE_HIBERNATE_TOOLS_SECTION;
+ }
+
+ @Test
+ void testGenerateJava() throws IOException {
+ performTask("generateJava", true);
+ }
+
+ @Override
+ protected void verifyBuild(BuildResult buildResult) {
+ try {
+ File generatedSourcesFolder = new File(projectDir, "generated-sources");
+ assertTrue(buildResult.getOutput().contains(
+ "Starting Java export to directory: " + generatedSourcesFolder.getCanonicalPath()));
+ assertTrue(generatedSourcesFolder.exists());
+ assertTrue(generatedSourcesFolder.isDirectory());
+ File fooFile = new File(generatedSourcesFolder, "foo/model/Foo.java");
+ assertTrue(fooFile.exists());
+ assertTrue(fooFile.isFile());
+ } catch (Exception e) {
+ throw new RuntimeException(e);
+ }
+ }
+
+ }
diff --git a/gradle/plugin/src/functionalTest/java/org/hibernate/tool/gradle/RunSqlTest.java b/gradle/plugin/src/functionalTest/java/org/hibernate/tool/gradle/RunSqlTest.java
new file mode 100644
index 0000000000..796597a6ac
--- /dev/null
+++ b/gradle/plugin/src/functionalTest/java/org/hibernate/tool/gradle/RunSqlTest.java
@@ -0,0 +1,45 @@
+/*
+ * This source file was generated by the Gradle 'init' task
+ */
+package org.hibernate.tool.gradle;
+
+import static org.junit.jupiter.api.Assertions.assertTrue;
+
+import java.io.File;
+import java.io.IOException;
+
+import org.gradle.testkit.runner.BuildResult;
+import org.hibernate.tool.gradle.test.func.utils.FuncTestConstants;
+import org.hibernate.tool.gradle.test.func.utils.FuncTestTemplate;
+import org.junit.jupiter.api.Test;
+
+class RunSqlTest extends FuncTestTemplate implements FuncTestConstants {
+
+ private static final String BUILD_FILE_HIBERNATE_TOOLS_SECTION =
+ "hibernateTools {\n" +
+ " sqlToRun = 'create table foo (id int not null primary key, baz varchar(256))'\n" +
+ " hibernateProperties = 'foo.bar'" +
+ "}\n";
+
+ @Override
+ public String getBuildFileHibernateToolsSection() {
+ return BUILD_FILE_HIBERNATE_TOOLS_SECTION;
+ }
+
+ @Override
+ public String getHibernatePropertiesFileName() {
+ return "foo.bar";
+ }
+
+ @Test
+ void testRunSql() throws IOException {
+ performTask("runSql", false);
+ }
+
+ @Override
+ protected void verifyBuild(BuildResult buildResult) {
+ assertTrue(buildResult.getOutput().contains("Running SQL: create table foo (id int not null primary key, baz varchar(256))"));
+ assertTrue(new File(projectDir, DATABASE_FOLDER_NAME + "/" + DATABASE_FILE_NAME).exists());
+ }
+
+ }
\ No newline at end of file
diff --git a/gradle/plugin/src/functionalTest/java/org/hibernate/tool/gradle/java/JpaDefaultTest.java b/gradle/plugin/src/functionalTest/java/org/hibernate/tool/gradle/java/JpaDefaultTest.java
new file mode 100644
index 0000000000..d6754e11fc
--- /dev/null
+++ b/gradle/plugin/src/functionalTest/java/org/hibernate/tool/gradle/java/JpaDefaultTest.java
@@ -0,0 +1,167 @@
+package org.hibernate.tool.gradle.java;
+
+import static org.junit.jupiter.api.Assertions.assertEquals;
+import static org.junit.jupiter.api.Assertions.assertFalse;
+import static org.junit.jupiter.api.Assertions.assertTrue;
+
+import java.io.File;
+import java.nio.file.Files;
+import java.sql.Connection;
+import java.sql.DriverManager;
+import java.sql.ResultSet;
+import java.sql.Statement;
+import java.util.List;
+
+import org.gradle.testkit.runner.BuildResult;
+import org.gradle.testkit.runner.GradleRunner;
+import org.junit.jupiter.api.Test;
+import org.junit.jupiter.api.io.TempDir;
+
+public class JpaDefaultTest {
+
+ private static final List GRADLE_INIT_PROJECT_ARGUMENTS = List.of(
+ "init", "--type", "java-application", "--dsl", "groovy", "--test-framework", "junit-jupiter", "--java-version", "11");
+
+ @TempDir
+ private File projectDir;
+
+ private File gradlePropertiesFile;
+ private File gradleBuildFile;
+ private File databaseFile;
+
+ @Test
+ public void testTutorial() throws Exception {
+ assertTrue(projectDir.exists());
+ createGradleProject();
+ editGradleBuildFile();
+ editGradlePropertiesFile();
+ createDatabase();
+ createHibernatePropertiesFile();
+ verifyDatabase();
+ executeGenerateJavaTask();
+ verifyProject();
+ }
+
+ private void verifyDatabase() throws Exception {
+ Connection connection = DriverManager.getConnection(constructJdbcConnectionString());
+ ResultSet resultSet = connection.createStatement().executeQuery("select * from PERSON");
+ assertTrue(resultSet.next());
+ assertEquals(1, resultSet.getInt(1));
+ assertEquals("foo", resultSet.getString(2));
+ }
+
+ private void createGradleProject() throws Exception {
+ GradleRunner runner = GradleRunner.create();
+ runner.withArguments(GRADLE_INIT_PROJECT_ARGUMENTS);
+ runner.forwardOutput();
+ runner.withProjectDir(projectDir);
+ BuildResult buildResult = runner.build();
+ assertTrue(buildResult.getOutput().contains("BUILD SUCCESSFUL"));
+ gradlePropertiesFile = new File(projectDir, "gradle.properties");
+ assertTrue(gradlePropertiesFile.exists());
+ assertTrue(gradlePropertiesFile.isFile());
+ File appDir = new File(projectDir, "app");
+ assertTrue(appDir.exists());
+ assertTrue(appDir.isDirectory());
+ gradleBuildFile = new File(appDir, "build.gradle");
+ assertTrue(gradleBuildFile.exists());
+ assertTrue(gradleBuildFile.isFile());
+ databaseFile = new File(projectDir, "database/test.mv.db");
+ assertFalse(databaseFile.exists());
+ }
+
+ private void editGradleBuildFile() throws Exception {
+ StringBuffer gradleBuildFileContents = new StringBuffer(
+ new String(Files.readAllBytes(gradleBuildFile.toPath())));
+ addHibernateToolsPluginLine(gradleBuildFileContents);
+ addH2DatabaseDependencyLine(gradleBuildFileContents);
+ Files.writeString(gradleBuildFile.toPath(), gradleBuildFileContents.toString());
+ }
+
+ private void editGradlePropertiesFile() throws Exception {
+ // The Hibernate Tools Gradle plugin does not support the configuration cache.
+ // As this is enabled by default when initializing a new Gradle project, the setting needs to be commented out
+ // in the gradle.properties file.
+ StringBuffer gradlePropertiesFileContents = new StringBuffer(
+ new String(Files.readAllBytes(gradlePropertiesFile.toPath())));
+ int pos = gradlePropertiesFileContents.indexOf("org.gradle.configuration-cache=true");
+ gradlePropertiesFileContents.insert(pos, "#");
+ Files.writeString(gradlePropertiesFile.toPath(), gradlePropertiesFileContents.toString());
+ }
+
+ private void createDatabase() throws Exception {
+ String CREATE_PERSON_TABLE = "create table PERSON (ID int not null, NAME varchar(20), primary key (ID))";
+ Connection connection = DriverManager.getConnection(constructJdbcConnectionString());
+ Statement statement = connection.createStatement();
+ statement.execute(CREATE_PERSON_TABLE);
+ statement.execute("insert into PERSON values (1, 'foo')");
+ statement.close();
+ connection.close();
+ assertTrue(databaseFile.exists());
+ assertTrue(databaseFile.isFile());
+ }
+
+ private void createHibernatePropertiesFile() throws Exception {
+ File hibernatePropertiesFile = new File(projectDir, "app/src/main/resources/hibernate.properties");
+ StringBuffer hibernatePropertiesFileContents = new StringBuffer();
+ hibernatePropertiesFileContents
+ .append("hibernate.connection.driver_class=org.h2.Driver\n")
+ .append("hibernate.connection.url=" + constructJdbcConnectionString() + "\n")
+ .append("hibernate.connection.username=\n")
+ .append("hibernate.connection.password=\n")
+ .append("hibernate.default_catalog=TEST\n")
+ .append("hibernate.default_schema=PUBLIC\n");
+ Files.writeString(hibernatePropertiesFile.toPath(), hibernatePropertiesFileContents.toString());
+ assertTrue(hibernatePropertiesFile.exists());
+ }
+
+ private void executeGenerateJavaTask() throws Exception {
+ GradleRunner gradleRunner = GradleRunner.create();
+ gradleRunner.forwardOutput();
+ gradleRunner.withProjectDir(projectDir);
+ gradleRunner.withPluginClasspath();
+ gradleRunner.withArguments("generateJava");
+ BuildResult buildResult = gradleRunner.build();
+ assertTrue(buildResult.getOutput().contains("BUILD SUCCESSFUL"));
+ }
+
+ private void verifyProject() throws Exception {
+ File generatedOutputFolder = new File(projectDir, "app/generated-sources");
+ assertTrue(generatedOutputFolder.exists());
+ assertTrue(generatedOutputFolder.isDirectory());
+ assertEquals(1, generatedOutputFolder.list().length);
+ File generatedPersonJavaFile = new File(generatedOutputFolder, "Person.java");
+ assertTrue(generatedPersonJavaFile.exists());
+ assertTrue(generatedPersonJavaFile.isFile());
+ String generatedPersonJavaFileContents = new String(
+ Files.readAllBytes(generatedPersonJavaFile.toPath()));
+ assertTrue(generatedPersonJavaFileContents.contains("import jakarta.persistence.Entity;"));
+ assertTrue(generatedPersonJavaFileContents.contains("public class Person "));
+ }
+
+ private void addHibernateToolsPluginLine(StringBuffer gradleBuildFileContents) {
+ int pos = gradleBuildFileContents.indexOf("plugins {");
+ pos = gradleBuildFileContents.indexOf("}", pos);
+ gradleBuildFileContents.insert(pos, constructHibernateToolsPluginLine() + "\n");
+ }
+
+ private void addH2DatabaseDependencyLine(StringBuffer gradleBuildFileContents) {
+ int pos = gradleBuildFileContents.indexOf("dependencies {");
+ pos = gradleBuildFileContents.indexOf("}", pos);
+ gradleBuildFileContents.insert(pos, constructH2DatabaseDependencyLine() + "\n");
+ }
+
+ private String constructJdbcConnectionString() {
+ return "jdbc:h2:" + projectDir.getAbsolutePath() + "/database/test;AUTO_SERVER=TRUE";
+ }
+
+ private String constructHibernateToolsPluginLine() {
+ return " id 'org.hibernate.tool.hibernate-tools-gradle' version '"
+ + System.getenv("HIBERNATE_TOOLS_VERSION") + "'";
+ }
+
+ private String constructH2DatabaseDependencyLine() {
+ return " implementation 'com.h2database:h2:" + System.getenv("H2_VERSION") + "'";
+ }
+
+}
diff --git a/gradle/plugin/src/functionalTest/java/org/hibernate/tool/gradle/java/NoAnnotationsTest.java b/gradle/plugin/src/functionalTest/java/org/hibernate/tool/gradle/java/NoAnnotationsTest.java
new file mode 100644
index 0000000000..c848ba2a02
--- /dev/null
+++ b/gradle/plugin/src/functionalTest/java/org/hibernate/tool/gradle/java/NoAnnotationsTest.java
@@ -0,0 +1,181 @@
+package org.hibernate.tool.gradle.java;
+
+import static org.junit.jupiter.api.Assertions.assertEquals;
+import static org.junit.jupiter.api.Assertions.assertFalse;
+import static org.junit.jupiter.api.Assertions.assertTrue;
+
+import java.io.File;
+import java.nio.file.Files;
+import java.sql.Connection;
+import java.sql.DriverManager;
+import java.sql.ResultSet;
+import java.sql.Statement;
+import java.util.List;
+
+import org.gradle.testkit.runner.BuildResult;
+import org.gradle.testkit.runner.GradleRunner;
+import org.junit.jupiter.api.Test;
+import org.junit.jupiter.api.io.TempDir;
+
+public class NoAnnotationsTest {
+
+ private static final List GRADLE_INIT_PROJECT_ARGUMENTS = List.of(
+ "init", "--type", "java-application", "--dsl", "groovy", "--test-framework", "junit-jupiter", "--java-version", "11");
+
+ @TempDir
+ private File projectDir;
+
+ private File gradlePropertiesFile;
+ private File gradleBuildFile;
+ private File databaseFile;
+
+ @Test
+ public void testTutorial() throws Exception {
+ assertTrue(projectDir.exists());
+ createGradleProject();
+ editGradleBuildFile();
+ editGradlePropertiesFile();
+ createDatabase();
+ createHibernatePropertiesFile();
+ verifyDatabase();
+ executeGenerateJavaTask();
+ verifyProject();
+ }
+
+ private void verifyDatabase() throws Exception {
+ Connection connection = DriverManager.getConnection(constructJdbcConnectionString());
+ ResultSet resultSet = connection.createStatement().executeQuery("select * from PERSON");
+ assertTrue(resultSet.next());
+ assertEquals(1, resultSet.getInt(1));
+ assertEquals("foo", resultSet.getString(2));
+ }
+
+ private void createGradleProject() throws Exception {
+ GradleRunner runner = GradleRunner.create();
+ runner.withArguments(GRADLE_INIT_PROJECT_ARGUMENTS);
+ runner.forwardOutput();
+ runner.withProjectDir(projectDir);
+ BuildResult buildResult = runner.build();
+ assertTrue(buildResult.getOutput().contains("BUILD SUCCESSFUL"));
+ gradlePropertiesFile = new File(projectDir, "gradle.properties");
+ assertTrue(gradlePropertiesFile.exists());
+ assertTrue(gradlePropertiesFile.isFile());
+ File appDir = new File(projectDir, "app");
+ assertTrue(appDir.exists());
+ assertTrue(appDir.isDirectory());
+ gradleBuildFile = new File(appDir, "build.gradle");
+ assertTrue(gradleBuildFile.exists());
+ assertTrue(gradleBuildFile.isFile());
+ databaseFile = new File(projectDir, "database/test.mv.db");
+ assertFalse(databaseFile.exists());
+ }
+
+ private void editGradleBuildFile() throws Exception {
+ StringBuffer gradleBuildFileContents = new StringBuffer(
+ new String(Files.readAllBytes(gradleBuildFile.toPath())));
+ addHibernateToolsPluginLine(gradleBuildFileContents);
+ addH2DatabaseDependencyLine(gradleBuildFileContents);
+ addHibernateToolsExtension(gradleBuildFileContents);
+ Files.writeString(gradleBuildFile.toPath(), gradleBuildFileContents.toString());
+ }
+
+ private void editGradlePropertiesFile() throws Exception {
+ // The Hibernate Tools Gradle plugin does not support the configuration cache.
+ // As this is enabled by default when initializing a new Gradle project, the setting needs to be commented out
+ // in the gradle.properties file.
+ StringBuffer gradlePropertiesFileContents = new StringBuffer(
+ new String(Files.readAllBytes(gradlePropertiesFile.toPath())));
+ int pos = gradlePropertiesFileContents.indexOf("org.gradle.configuration-cache=true");
+ gradlePropertiesFileContents.insert(pos, "#");
+ Files.writeString(gradlePropertiesFile.toPath(), gradlePropertiesFileContents.toString());
+ }
+
+ private void createDatabase() throws Exception {
+ String CREATE_PERSON_TABLE = "create table PERSON (ID int not null, NAME varchar(20), primary key (ID))";
+ Connection connection = DriverManager.getConnection(constructJdbcConnectionString());
+ Statement statement = connection.createStatement();
+ statement.execute(CREATE_PERSON_TABLE);
+ statement.execute("insert into PERSON values (1, 'foo')");
+ statement.close();
+ connection.close();
+ assertTrue(databaseFile.exists());
+ assertTrue(databaseFile.isFile());
+ }
+
+ private void createHibernatePropertiesFile() throws Exception {
+ File hibernatePropertiesFile = new File(projectDir, "app/src/main/resources/hibernate.properties");
+ StringBuffer hibernatePropertiesFileContents = new StringBuffer();
+ hibernatePropertiesFileContents
+ .append("hibernate.connection.driver_class=org.h2.Driver\n")
+ .append("hibernate.connection.url=" + constructJdbcConnectionString() + "\n")
+ .append("hibernate.connection.username=\n")
+ .append("hibernate.connection.password=\n")
+ .append("hibernate.default_catalog=TEST\n")
+ .append("hibernate.default_schema=PUBLIC\n");
+ Files.writeString(hibernatePropertiesFile.toPath(), hibernatePropertiesFileContents.toString());
+ assertTrue(hibernatePropertiesFile.exists());
+ }
+
+ private void executeGenerateJavaTask() throws Exception {
+ GradleRunner gradleRunner = GradleRunner.create();
+ gradleRunner.forwardOutput();
+ gradleRunner.withProjectDir(projectDir);
+ gradleRunner.withPluginClasspath();
+ gradleRunner.withArguments("generateJava");
+ BuildResult buildResult = gradleRunner.build();
+ assertTrue(buildResult.getOutput().contains("BUILD SUCCESSFUL"));
+ }
+
+ private void verifyProject() throws Exception {
+ File generatedOutputFolder = new File(projectDir, "app/generated-sources");
+ assertTrue(generatedOutputFolder.exists());
+ assertTrue(generatedOutputFolder.isDirectory());
+ assertEquals(1, generatedOutputFolder.list().length);
+ File generatedPersonJavaFile = new File(generatedOutputFolder, "Person.java");
+ assertTrue(generatedPersonJavaFile.exists());
+ assertTrue(generatedPersonJavaFile.isFile());
+ String generatedPersonJavaFileContents = new String(
+ Files.readAllBytes(generatedPersonJavaFile.toPath()));
+ assertFalse(generatedPersonJavaFileContents.contains("import jakarta.persistence.Entity;"));
+ assertTrue(generatedPersonJavaFileContents.contains("public class Person "));
+ }
+
+ private void addHibernateToolsPluginLine(StringBuffer gradleBuildFileContents) {
+ int pos = gradleBuildFileContents.indexOf("plugins {");
+ pos = gradleBuildFileContents.indexOf("}", pos);
+ gradleBuildFileContents.insert(pos, constructHibernateToolsPluginLine() + "\n");
+ }
+
+ private void addH2DatabaseDependencyLine(StringBuffer gradleBuildFileContents) {
+ int pos = gradleBuildFileContents.indexOf("dependencies {");
+ pos = gradleBuildFileContents.indexOf("}", pos);
+ gradleBuildFileContents.insert(pos, constructH2DatabaseDependencyLine() + "\n");
+ }
+
+ private void addHibernateToolsExtension(StringBuffer gradleBuildFileContents) {
+ int pos = gradleBuildFileContents.indexOf("dependencies {");
+ pos = gradleBuildFileContents.indexOf("}", pos);
+ StringBuffer hibernateToolsExtension = new StringBuffer();
+ hibernateToolsExtension
+ .append("\n")
+ .append("\n")
+ .append("hibernateTools { \n")
+ .append(" generateAnnotations=false \n")
+ .append("}");
+ gradleBuildFileContents.insert(pos + 1, hibernateToolsExtension.toString());
+ }
+
+ private String constructJdbcConnectionString() {
+ return "jdbc:h2:" + projectDir.getAbsolutePath() + "/database/test;AUTO_SERVER=TRUE";
+ }
+
+ private String constructHibernateToolsPluginLine() {
+ return " id 'org.hibernate.tool.hibernate-tools-gradle' version '"
+ + System.getenv("HIBERNATE_TOOLS_VERSION") + "'";
+ }
+
+ private String constructH2DatabaseDependencyLine() {
+ return " implementation 'com.h2database:h2:" + System.getenv("H2_VERSION") + "'";
+ }
+
+}
diff --git a/gradle/plugin/src/functionalTest/java/org/hibernate/tool/gradle/java/NoGenerics.java b/gradle/plugin/src/functionalTest/java/org/hibernate/tool/gradle/java/NoGenerics.java
new file mode 100644
index 0000000000..fccf951273
--- /dev/null
+++ b/gradle/plugin/src/functionalTest/java/org/hibernate/tool/gradle/java/NoGenerics.java
@@ -0,0 +1,181 @@
+package org.hibernate.tool.gradle.java;
+
+import static org.junit.jupiter.api.Assertions.assertEquals;
+import static org.junit.jupiter.api.Assertions.assertFalse;
+import static org.junit.jupiter.api.Assertions.assertTrue;
+
+import java.io.File;
+import java.nio.file.Files;
+import java.sql.Connection;
+import java.sql.DriverManager;
+import java.sql.Statement;
+import java.util.List;
+
+import org.gradle.testkit.runner.BuildResult;
+import org.gradle.testkit.runner.GradleRunner;
+import org.junit.jupiter.api.Test;
+import org.junit.jupiter.api.io.TempDir;
+
+public class NoGenerics {
+
+ private static final List GRADLE_INIT_PROJECT_ARGUMENTS = List.of(
+ "init", "--type", "java-application", "--dsl", "groovy", "--test-framework", "junit-jupiter", "--java-version", "11");
+
+ @TempDir
+ private File projectDir;
+
+ private File gradlePropertiesFile;
+ private File gradleBuildFile;
+ private File databaseFile;
+
+ @Test
+ public void testTutorial() throws Exception {
+ assertTrue(projectDir.exists());
+ createGradleProject();
+ editGradleBuildFile();
+ editGradlePropertiesFile();
+ createDatabase();
+ createHibernatePropertiesFile();
+ executeGenerateJavaTask();
+ verifyProject();
+ }
+
+ private void createGradleProject() throws Exception {
+ GradleRunner runner = GradleRunner.create();
+ runner.withArguments(GRADLE_INIT_PROJECT_ARGUMENTS);
+ runner.forwardOutput();
+ runner.withProjectDir(projectDir);
+ BuildResult buildResult = runner.build();
+ assertTrue(buildResult.getOutput().contains("BUILD SUCCESSFUL"));
+ gradlePropertiesFile = new File(projectDir, "gradle.properties");
+ assertTrue(gradlePropertiesFile.exists());
+ assertTrue(gradlePropertiesFile.isFile());
+ File appDir = new File(projectDir, "app");
+ assertTrue(appDir.exists());
+ assertTrue(appDir.isDirectory());
+ gradleBuildFile = new File(appDir, "build.gradle");
+ assertTrue(gradleBuildFile.exists());
+ assertTrue(gradleBuildFile.isFile());
+ databaseFile = new File(projectDir, "database/test.mv.db");
+ assertFalse(databaseFile.exists());
+ }
+
+ private void editGradleBuildFile() throws Exception {
+ StringBuffer gradleBuildFileContents = new StringBuffer(
+ new String(Files.readAllBytes(gradleBuildFile.toPath())));
+ addHibernateToolsPluginLine(gradleBuildFileContents);
+ addH2DatabaseDependencyLine(gradleBuildFileContents);
+ addHibernateToolsExtension(gradleBuildFileContents);
+ Files.writeString(gradleBuildFile.toPath(), gradleBuildFileContents.toString());
+ }
+
+ private void editGradlePropertiesFile() throws Exception {
+ // The Hibernate Tools Gradle plugin does not support the configuration cache.
+ // As this is enabled by default when initializing a new Gradle project, the setting needs to be commented out
+ // in the gradle.properties file.
+ StringBuffer gradlePropertiesFileContents = new StringBuffer(
+ new String(Files.readAllBytes(gradlePropertiesFile.toPath())));
+ int pos = gradlePropertiesFileContents.indexOf("org.gradle.configuration-cache=true");
+ gradlePropertiesFileContents.insert(pos, "#");
+ Files.writeString(gradlePropertiesFile.toPath(), gradlePropertiesFileContents.toString());
+ }
+
+ private void createDatabase() throws Exception {
+ String CREATE_PERSON_TABLE =
+ "create table PERSON (ID int not null, NAME varchar(20), primary key (ID))";
+ String CREATE_ITEM_TABLE =
+ "create table ITEM (ID int not null, NAME varchar(20), OWNER_ID int not null, " +
+ " primary key (ID), foreign key (OWNER_ID) references PERSON(ID))";
+ Connection connection = DriverManager.getConnection(constructJdbcConnectionString());
+ Statement statement = connection.createStatement();
+ statement.execute(CREATE_PERSON_TABLE);
+ statement.execute(CREATE_ITEM_TABLE);
+ statement.close();
+ connection.close();
+ assertTrue(databaseFile.exists());
+ assertTrue(databaseFile.isFile());
+ }
+
+ private void createHibernatePropertiesFile() throws Exception {
+ File hibernatePropertiesFile = new File(projectDir, "app/src/main/resources/hibernate.properties");
+ StringBuffer hibernatePropertiesFileContents = new StringBuffer();
+ hibernatePropertiesFileContents
+ .append("hibernate.connection.driver_class=org.h2.Driver\n")
+ .append("hibernate.connection.url=" + constructJdbcConnectionString() + "\n")
+ .append("hibernate.connection.username=\n")
+ .append("hibernate.connection.password=\n")
+ .append("hibernate.default_catalog=TEST\n")
+ .append("hibernate.default_schema=PUBLIC\n");
+ Files.writeString(hibernatePropertiesFile.toPath(), hibernatePropertiesFileContents.toString());
+ assertTrue(hibernatePropertiesFile.exists());
+ }
+
+ private void executeGenerateJavaTask() throws Exception {
+ GradleRunner gradleRunner = GradleRunner.create();
+ gradleRunner.forwardOutput();
+ gradleRunner.withProjectDir(projectDir);
+ gradleRunner.withPluginClasspath();
+ gradleRunner.withArguments("generateJava");
+ BuildResult buildResult = gradleRunner.build();
+ assertTrue(buildResult.getOutput().contains("BUILD SUCCESSFUL"));
+ }
+
+ private void verifyProject() throws Exception {
+ File generatedOutputFolder = new File(projectDir, "app/generated-sources");
+ assertTrue(generatedOutputFolder.exists());
+ assertTrue(generatedOutputFolder.isDirectory());
+ assertEquals(2, generatedOutputFolder.list().length);
+ File generatedPersonJavaFile = new File(generatedOutputFolder, "Person.java");
+ assertTrue(generatedPersonJavaFile.exists());
+ assertTrue(generatedPersonJavaFile.isFile());
+ String generatedPersonJavaFileContents = new String(
+ Files.readAllBytes(generatedPersonJavaFile.toPath()));
+ assertTrue(generatedPersonJavaFileContents.contains("public class Person "));
+ assertFalse(generatedPersonJavaFileContents.contains("Set
- "));
+ File generatedItemJavaFile = new File(generatedOutputFolder, "Item.java");
+ assertTrue(generatedItemJavaFile.exists());
+ assertTrue(generatedItemJavaFile.isFile());
+ String generatedItemJavaFileContents = new String(
+ Files.readAllBytes(generatedItemJavaFile.toPath()));
+ assertTrue(generatedItemJavaFileContents.contains("public class Item "));
+ }
+
+ private void addHibernateToolsPluginLine(StringBuffer gradleBuildFileContents) {
+ int pos = gradleBuildFileContents.indexOf("plugins {");
+ pos = gradleBuildFileContents.indexOf("}", pos);
+ gradleBuildFileContents.insert(pos, constructHibernateToolsPluginLine() + "\n");
+ }
+
+ private void addH2DatabaseDependencyLine(StringBuffer gradleBuildFileContents) {
+ int pos = gradleBuildFileContents.indexOf("dependencies {");
+ pos = gradleBuildFileContents.indexOf("}", pos);
+ gradleBuildFileContents.insert(pos, constructH2DatabaseDependencyLine() + "\n");
+ }
+
+ private void addHibernateToolsExtension(StringBuffer gradleBuildFileContents) {
+ int pos = gradleBuildFileContents.indexOf("dependencies {");
+ pos = gradleBuildFileContents.indexOf("}", pos);
+ StringBuffer hibernateToolsExtension = new StringBuffer();
+ hibernateToolsExtension
+ .append("\n")
+ .append("\n")
+ .append("hibernateTools { \n")
+ .append(" useGenerics=false \n")
+ .append("}");
+ gradleBuildFileContents.insert(pos + 1, hibernateToolsExtension.toString());
+ }
+
+ private String constructJdbcConnectionString() {
+ return "jdbc:h2:" + projectDir.getAbsolutePath() + "/database/test;AUTO_SERVER=TRUE";
+ }
+
+ private String constructHibernateToolsPluginLine() {
+ return " id 'org.hibernate.tool.hibernate-tools-gradle' version '"
+ + System.getenv("HIBERNATE_TOOLS_VERSION") + "'";
+ }
+
+ private String constructH2DatabaseDependencyLine() {
+ return " implementation 'com.h2database:h2:" + System.getenv("H2_VERSION") + "'";
+ }
+
+}
diff --git a/gradle/plugin/src/functionalTest/java/org/hibernate/tool/gradle/java/UseGenerics.java b/gradle/plugin/src/functionalTest/java/org/hibernate/tool/gradle/java/UseGenerics.java
new file mode 100644
index 0000000000..ecb9a10c97
--- /dev/null
+++ b/gradle/plugin/src/functionalTest/java/org/hibernate/tool/gradle/java/UseGenerics.java
@@ -0,0 +1,167 @@
+package org.hibernate.tool.gradle.java;
+
+import static org.junit.jupiter.api.Assertions.assertEquals;
+import static org.junit.jupiter.api.Assertions.assertFalse;
+import static org.junit.jupiter.api.Assertions.assertTrue;
+
+import java.io.File;
+import java.nio.file.Files;
+import java.sql.Connection;
+import java.sql.DriverManager;
+import java.sql.Statement;
+import java.util.List;
+
+import org.gradle.testkit.runner.BuildResult;
+import org.gradle.testkit.runner.GradleRunner;
+import org.junit.jupiter.api.Test;
+import org.junit.jupiter.api.io.TempDir;
+
+public class UseGenerics {
+
+ private static final List GRADLE_INIT_PROJECT_ARGUMENTS = List.of(
+ "init", "--type", "java-application", "--dsl", "groovy", "--test-framework", "junit-jupiter", "--java-version", "11");
+
+ @TempDir
+ private File projectDir;
+
+ private File gradlePropertiesFile;
+ private File gradleBuildFile;
+ private File databaseFile;
+
+ @Test
+ public void testTutorial() throws Exception {
+ assertTrue(projectDir.exists());
+ createGradleProject();
+ editGradleBuildFile();
+ editGradlePropertiesFile();
+ createDatabase();
+ createHibernatePropertiesFile();
+ executeGenerateJavaTask();
+ verifyProject();
+ }
+
+ private void createGradleProject() throws Exception {
+ GradleRunner runner = GradleRunner.create();
+ runner.withArguments(GRADLE_INIT_PROJECT_ARGUMENTS);
+ runner.forwardOutput();
+ runner.withProjectDir(projectDir);
+ BuildResult buildResult = runner.build();
+ assertTrue(buildResult.getOutput().contains("BUILD SUCCESSFUL"));
+ gradlePropertiesFile = new File(projectDir, "gradle.properties");
+ assertTrue(gradlePropertiesFile.exists());
+ assertTrue(gradlePropertiesFile.isFile());
+ File appDir = new File(projectDir, "app");
+ assertTrue(appDir.exists());
+ assertTrue(appDir.isDirectory());
+ gradleBuildFile = new File(appDir, "build.gradle");
+ assertTrue(gradleBuildFile.exists());
+ assertTrue(gradleBuildFile.isFile());
+ databaseFile = new File(projectDir, "database/test.mv.db");
+ assertFalse(databaseFile.exists());
+ }
+
+ private void editGradleBuildFile() throws Exception {
+ StringBuffer gradleBuildFileContents = new StringBuffer(
+ new String(Files.readAllBytes(gradleBuildFile.toPath())));
+ addHibernateToolsPluginLine(gradleBuildFileContents);
+ addH2DatabaseDependencyLine(gradleBuildFileContents);
+ Files.writeString(gradleBuildFile.toPath(), gradleBuildFileContents.toString());
+ }
+
+ private void editGradlePropertiesFile() throws Exception {
+ // The Hibernate Tools Gradle plugin does not support the configuration cache.
+ // As this is enabled by default when initializing a new Gradle project, the setting needs to be commented out
+ // in the gradle.properties file.
+ StringBuffer gradlePropertiesFileContents = new StringBuffer(
+ new String(Files.readAllBytes(gradlePropertiesFile.toPath())));
+ int pos = gradlePropertiesFileContents.indexOf("org.gradle.configuration-cache=true");
+ gradlePropertiesFileContents.insert(pos, "#");
+ Files.writeString(gradlePropertiesFile.toPath(), gradlePropertiesFileContents.toString());
+ }
+
+ private void createDatabase() throws Exception {
+ String CREATE_PERSON_TABLE =
+ "create table PERSON (ID int not null, NAME varchar(20), primary key (ID))";
+ String CREATE_ITEM_TABLE =
+ "create table ITEM (ID int not null, NAME varchar(20), OWNER_ID int not null, " +
+ " primary key (ID), foreign key (OWNER_ID) references PERSON(ID))";
+ Connection connection = DriverManager.getConnection(constructJdbcConnectionString());
+ Statement statement = connection.createStatement();
+ statement.execute(CREATE_PERSON_TABLE);
+ statement.execute(CREATE_ITEM_TABLE);
+ statement.close();
+ connection.close();
+ assertTrue(databaseFile.exists());
+ assertTrue(databaseFile.isFile());
+ }
+
+ private void createHibernatePropertiesFile() throws Exception {
+ File hibernatePropertiesFile = new File(projectDir, "app/src/main/resources/hibernate.properties");
+ StringBuffer hibernatePropertiesFileContents = new StringBuffer();
+ hibernatePropertiesFileContents
+ .append("hibernate.connection.driver_class=org.h2.Driver\n")
+ .append("hibernate.connection.url=" + constructJdbcConnectionString() + "\n")
+ .append("hibernate.connection.username=\n")
+ .append("hibernate.connection.password=\n")
+ .append("hibernate.default_catalog=TEST\n")
+ .append("hibernate.default_schema=PUBLIC\n");
+ Files.writeString(hibernatePropertiesFile.toPath(), hibernatePropertiesFileContents.toString());
+ assertTrue(hibernatePropertiesFile.exists());
+ }
+
+ private void executeGenerateJavaTask() throws Exception {
+ GradleRunner gradleRunner = GradleRunner.create();
+ gradleRunner.forwardOutput();
+ gradleRunner.withProjectDir(projectDir);
+ gradleRunner.withPluginClasspath();
+ gradleRunner.withArguments("generateJava");
+ BuildResult buildResult = gradleRunner.build();
+ assertTrue(buildResult.getOutput().contains("BUILD SUCCESSFUL"));
+ }
+
+ private void verifyProject() throws Exception {
+ File generatedOutputFolder = new File(projectDir, "app/generated-sources");
+ assertTrue(generatedOutputFolder.exists());
+ assertTrue(generatedOutputFolder.isDirectory());
+ assertEquals(2, generatedOutputFolder.list().length);
+ File generatedPersonJavaFile = new File(generatedOutputFolder, "Person.java");
+ assertTrue(generatedPersonJavaFile.exists());
+ assertTrue(generatedPersonJavaFile.isFile());
+ String generatedPersonJavaFileContents = new String(
+ Files.readAllBytes(generatedPersonJavaFile.toPath()));
+ assertTrue(generatedPersonJavaFileContents.contains("public class Person "));
+ assertTrue(generatedPersonJavaFileContents.contains("Set
- "));
+ File generatedItemJavaFile = new File(generatedOutputFolder, "Item.java");
+ assertTrue(generatedItemJavaFile.exists());
+ assertTrue(generatedItemJavaFile.isFile());
+ String generatedItemJavaFileContents = new String(
+ Files.readAllBytes(generatedItemJavaFile.toPath()));
+ assertTrue(generatedItemJavaFileContents.contains("public class Item "));
+ }
+
+ private void addHibernateToolsPluginLine(StringBuffer gradleBuildFileContents) {
+ int pos = gradleBuildFileContents.indexOf("plugins {");
+ pos = gradleBuildFileContents.indexOf("}", pos);
+ gradleBuildFileContents.insert(pos, constructHibernateToolsPluginLine() + "\n");
+ }
+
+ private void addH2DatabaseDependencyLine(StringBuffer gradleBuildFileContents) {
+ int pos = gradleBuildFileContents.indexOf("dependencies {");
+ pos = gradleBuildFileContents.indexOf("}", pos);
+ gradleBuildFileContents.insert(pos, constructH2DatabaseDependencyLine() + "\n");
+ }
+
+ private String constructJdbcConnectionString() {
+ return "jdbc:h2:" + projectDir.getAbsolutePath() + "/database/test;AUTO_SERVER=TRUE";
+ }
+
+ private String constructHibernateToolsPluginLine() {
+ return " id 'org.hibernate.tool.hibernate-tools-gradle' version '"
+ + System.getenv("HIBERNATE_TOOLS_VERSION") + "'";
+ }
+
+ private String constructH2DatabaseDependencyLine() {
+ return " implementation 'com.h2database:h2:" + System.getenv("H2_VERSION") + "'";
+ }
+
+}
diff --git a/gradle/plugin/src/functionalTest/java/org/hibernate/tool/gradle/test/func/utils/FuncTestConstants.java b/gradle/plugin/src/functionalTest/java/org/hibernate/tool/gradle/test/func/utils/FuncTestConstants.java
new file mode 100644
index 0000000000..d1620d2e45
--- /dev/null
+++ b/gradle/plugin/src/functionalTest/java/org/hibernate/tool/gradle/test/func/utils/FuncTestConstants.java
@@ -0,0 +1,65 @@
+package org.hibernate.tool.gradle.test.func.utils;
+
+public interface FuncTestConstants {
+
+ public static final String DATABASE_NAME = "bardb";
+ public static final String DATABASE_FILE_NAME = DATABASE_NAME + ".mv.db";
+ public static final String DATABASE_FOLDER_NAME = "database";
+ public static final String DATABASE_PATH = DATABASE_FOLDER_NAME + "/" + DATABASE_NAME;
+ public static final String HIBERNATE_PROPERTIES_FILE_NAME = "hibernate.properties";
+ public static final String RESOURCES_FOLDER_PATH = "src/main/resources";
+ public static final String GRADLE_BUILD_FILE_NAME = "build.gradle";
+ public static final String GRADLE_SETTINGS_FILE_NAME = "settions.gradle";
+ public static final String PROJECT_DIR_PLACEHOLDER = "${projectDir}";
+
+ public static final String HIBERNATE_PROPERTIES_CONTENTS =
+ "hibernate.connection.driver_class=org.h2.Driver\n" +
+ "hibernate.connection.url=jdbc:h2:" + PROJECT_DIR_PLACEHOLDER + "/" + DATABASE_PATH + "\n" +
+ "hibernate.connection.username=sa\n" +
+ "hibernate.connection.password=\n"
+ ;
+
+ public static final String BUILD_FILE_PLUGINS_SECTION =
+ "plugins {\n" +
+ " id('application')\n" +
+ " id('org.hibernate.tool.hibernate-tools-gradle')\n" +
+ "}\n";
+
+ public static final String BUILD_FILE_REPOSITORIES_SECTION =
+ "repositories {\n" +
+ " mavenCentral()\n" +
+ "}\n";
+
+ public static final String BUILD_FILE_DEPENDENCIES_SECTION =
+ "dependencies {\n" +
+ " implementation('com.h2database:h2:2.1.214')\n" +
+ "}\n";
+
+ default String getBuildFilePluginsSection() {
+ return BUILD_FILE_PLUGINS_SECTION;
+ }
+
+ default String getBuildFileRepositoriesSection() {
+ return BUILD_FILE_REPOSITORIES_SECTION;
+ }
+
+ default String getBuildFileDependenciesSection() {
+ return BUILD_FILE_DEPENDENCIES_SECTION;
+ }
+
+ default String getBuildFileHibernateToolsSection() {
+ return "";
+ }
+
+ default String getBuildFileContents() {
+ return getBuildFilePluginsSection() +
+ getBuildFileRepositoriesSection() +
+ getBuildFileDependenciesSection() +
+ getBuildFileHibernateToolsSection();
+ }
+
+ default String getHibernatePropertiesFileName() {
+ return HIBERNATE_PROPERTIES_FILE_NAME;
+ }
+
+}
diff --git a/gradle/plugin/src/functionalTest/java/org/hibernate/tool/gradle/test/func/utils/FuncTestTemplate.java b/gradle/plugin/src/functionalTest/java/org/hibernate/tool/gradle/test/func/utils/FuncTestTemplate.java
new file mode 100644
index 0000000000..e274eb8d18
--- /dev/null
+++ b/gradle/plugin/src/functionalTest/java/org/hibernate/tool/gradle/test/func/utils/FuncTestTemplate.java
@@ -0,0 +1,86 @@
+package org.hibernate.tool.gradle.test.func.utils;
+
+import java.io.File;
+import java.io.FileWriter;
+import java.io.IOException;
+import java.io.Writer;
+import java.net.URISyntaxException;
+import java.nio.file.Files;
+
+import org.gradle.testkit.runner.BuildResult;
+import org.gradle.testkit.runner.GradleRunner;
+import org.junit.jupiter.api.io.TempDir;
+
+public class FuncTestTemplate implements FuncTestConstants {
+
+ @TempDir
+ protected File projectDir;
+
+ protected File getBuildFile() {
+ return new File(projectDir, GRADLE_BUILD_FILE_NAME);
+ }
+
+ protected File getSettingsFile() {
+ return new File(projectDir, GRADLE_SETTINGS_FILE_NAME);
+ }
+
+ protected File getDatabaseFile() {
+ File databaseDir = new File(projectDir, DATABASE_FOLDER_NAME);
+ databaseDir.mkdirs();
+ return new File(databaseDir, DATABASE_FILE_NAME);
+ }
+
+ protected File getHibernatePropertiesFile() {
+ File resourcesDir = new File(projectDir, RESOURCES_FOLDER_PATH);
+ resourcesDir.mkdirs();
+ return new File(resourcesDir, getHibernatePropertiesFileName());
+ }
+
+ protected String getHibernatePropertiesContents() {
+ return HIBERNATE_PROPERTIES_CONTENTS.replace("${projectDir}", projectDir.getAbsolutePath());
+ }
+
+ protected void copyDatabase() {
+ try {
+ Files.copy(
+ new File(getClass().getClassLoader().getResource(DATABASE_FILE_NAME).toURI()).toPath(),
+ getDatabaseFile().toPath());
+ } catch (URISyntaxException | IOException e) {
+ throw new RuntimeException(e);
+ }
+ }
+
+ protected void writeString(File file, String string) {
+ try (Writer writer = new FileWriter(file)) {
+ writer.write(string);
+ } catch (IOException e) {
+ throw new RuntimeException(e);
+ }
+ }
+
+ protected void performTask(String taskName, boolean needDatabase) {
+ prepareBuild(needDatabase);
+ verifyBuild(runBuild(taskName));
+ }
+
+ protected void prepareBuild(boolean needDatabase) {
+ writeString(getSettingsFile(), "");
+ writeString(getBuildFile(),getBuildFileContents());
+ writeString(getHibernatePropertiesFile(), getHibernatePropertiesContents());
+ if (needDatabase) {
+ copyDatabase();
+ }
+ }
+
+ protected BuildResult runBuild(String taskName) {
+ GradleRunner runner = GradleRunner.create();
+ runner.forwardOutput();
+ runner.withPluginClasspath();
+ runner.withArguments(taskName);
+ runner.withProjectDir(projectDir);
+ return runner.build();
+ }
+
+ protected void verifyBuild(BuildResult buildResult) {}
+
+}
diff --git a/gradle/plugin/src/functionalTest/java/org/hibernate/tool/gradle/tutorial/TutorialTest.java b/gradle/plugin/src/functionalTest/java/org/hibernate/tool/gradle/tutorial/TutorialTest.java
new file mode 100644
index 0000000000..b2b6cd4870
--- /dev/null
+++ b/gradle/plugin/src/functionalTest/java/org/hibernate/tool/gradle/tutorial/TutorialTest.java
@@ -0,0 +1,163 @@
+package org.hibernate.tool.gradle.tutorial;
+
+import static org.junit.jupiter.api.Assertions.assertEquals;
+import static org.junit.jupiter.api.Assertions.assertFalse;
+import static org.junit.jupiter.api.Assertions.assertTrue;
+
+import java.io.File;
+import java.nio.file.Files;
+import java.sql.Connection;
+import java.sql.DriverManager;
+import java.sql.ResultSet;
+import java.sql.Statement;
+import java.util.List;
+
+import org.gradle.testkit.runner.BuildResult;
+import org.gradle.testkit.runner.GradleRunner;
+import org.junit.jupiter.api.Test;
+import org.junit.jupiter.api.io.TempDir;
+
+public class TutorialTest {
+
+ private static final List GRADLE_INIT_PROJECT_ARGUMENTS = List.of(
+ "init", "--type", "java-application", "--dsl", "groovy", "--test-framework", "junit-jupiter", "--java-version", "11");
+
+ @TempDir
+ private File projectDir;
+
+ private File gradlePropertiesFile;
+ private File gradleBuildFile;
+ private File databaseFile;
+
+ @Test
+ public void testTutorial() throws Exception {
+ assertTrue(projectDir.exists());
+ createGradleProject();
+ editGradleBuildFile();
+ editGradlePropertiesFile();
+ createDatabase();
+ createHibernatePropertiesFile();
+ verifyDatabase();
+ executeGenerateJavaTask();
+ verifyProject();
+ }
+
+ private void verifyDatabase() throws Exception {
+ Connection connection = DriverManager.getConnection(constructJdbcConnectionString());
+ ResultSet resultSet = connection.createStatement().executeQuery("select * from PERSON");
+ assertTrue(resultSet.next());
+ assertEquals(1, resultSet.getInt(1));
+ assertEquals("foo", resultSet.getString(2));
+ }
+
+ private void createGradleProject() throws Exception {
+ GradleRunner runner = GradleRunner.create();
+ runner.withArguments(GRADLE_INIT_PROJECT_ARGUMENTS);
+ runner.forwardOutput();
+ runner.withProjectDir(projectDir);
+ BuildResult buildResult = runner.build();
+ assertTrue(buildResult.getOutput().contains("BUILD SUCCESSFUL"));
+ gradlePropertiesFile = new File(projectDir, "gradle.properties");
+ assertTrue(gradlePropertiesFile.exists());
+ assertTrue(gradlePropertiesFile.isFile());
+ File appDir = new File(projectDir, "app");
+ assertTrue(appDir.exists());
+ assertTrue(appDir.isDirectory());
+ gradleBuildFile = new File(appDir, "build.gradle");
+ assertTrue(gradleBuildFile.exists());
+ assertTrue(gradleBuildFile.isFile());
+ databaseFile = new File(projectDir, "database/test.mv.db");
+ assertFalse(databaseFile.exists());
+ }
+
+ private void editGradleBuildFile() throws Exception {
+ StringBuffer gradleBuildFileContents = new StringBuffer(
+ new String(Files.readAllBytes(gradleBuildFile.toPath())));
+ addHibernateToolsPluginLine(gradleBuildFileContents);
+ addH2DatabaseDependencyLine(gradleBuildFileContents);
+ Files.writeString(gradleBuildFile.toPath(), gradleBuildFileContents.toString());
+ }
+
+ private void editGradlePropertiesFile() throws Exception {
+ // The Hibernate Tools Gradle plugin does not support the configuration cache.
+ // As this is enabled by default when initializing a new Gradle project, the setting needs to be commented out
+ // in the gradle.properties file.
+ StringBuffer gradlePropertiesFileContents = new StringBuffer(
+ new String(Files.readAllBytes(gradlePropertiesFile.toPath())));
+ int pos = gradlePropertiesFileContents.indexOf("org.gradle.configuration-cache=true");
+ gradlePropertiesFileContents.insert(pos, "#");
+ Files.writeString(gradlePropertiesFile.toPath(), gradlePropertiesFileContents.toString());
+ }
+
+ private void createDatabase() throws Exception {
+ String CREATE_PERSON_TABLE = "create table PERSON (ID int not null, NAME varchar(20), primary key (ID))";
+ Connection connection = DriverManager.getConnection(constructJdbcConnectionString());
+ Statement statement = connection.createStatement();
+ statement.execute(CREATE_PERSON_TABLE);
+ statement.execute("insert into PERSON values (1, 'foo')");
+ statement.close();
+ connection.close();
+ assertTrue(databaseFile.exists());
+ assertTrue(databaseFile.isFile());
+ }
+
+ private void createHibernatePropertiesFile() throws Exception {
+ File hibernatePropertiesFile = new File(projectDir, "app/src/main/resources/hibernate.properties");
+ StringBuffer hibernatePropertiesFileContents = new StringBuffer();
+ hibernatePropertiesFileContents
+ .append("hibernate.connection.driver_class=org.h2.Driver\n")
+ .append("hibernate.connection.url=" + constructJdbcConnectionString() + "\n")
+ .append("hibernate.connection.username=\n")
+ .append("hibernate.connection.password=\n")
+ .append("hibernate.default_catalog=TEST\n")
+ .append("hibernate.default_schema=PUBLIC\n");
+ Files.writeString(hibernatePropertiesFile.toPath(), hibernatePropertiesFileContents.toString());
+ assertTrue(hibernatePropertiesFile.exists());
+ }
+
+ private void executeGenerateJavaTask() throws Exception {
+ GradleRunner gradleRunner = GradleRunner.create();
+ gradleRunner.forwardOutput();
+ gradleRunner.withProjectDir(projectDir);
+ gradleRunner.withPluginClasspath();
+ gradleRunner.withArguments("generateJava");
+ BuildResult buildResult = gradleRunner.build();
+ assertTrue(buildResult.getOutput().contains("BUILD SUCCESSFUL"));
+ }
+
+ private void verifyProject() {
+ File generatedOutputFolder = new File(projectDir, "app/generated-sources");
+ assertTrue(generatedOutputFolder.exists());
+ assertTrue(generatedOutputFolder.isDirectory());
+ assertEquals(1, generatedOutputFolder.list().length);
+ File generatedPersonJavaFile = new File(generatedOutputFolder, "Person.java");
+ assertTrue(generatedPersonJavaFile.exists());
+ assertTrue(generatedPersonJavaFile.isFile());
+ }
+
+ private void addHibernateToolsPluginLine(StringBuffer gradleBuildFileContents) {
+ int pos = gradleBuildFileContents.indexOf("plugins {");
+ pos = gradleBuildFileContents.indexOf("}", pos);
+ gradleBuildFileContents.insert(pos, constructHibernateToolsPluginLine() + "\n");
+ }
+
+ private void addH2DatabaseDependencyLine(StringBuffer gradleBuildFileContents) {
+ int pos = gradleBuildFileContents.indexOf("dependencies {");
+ pos = gradleBuildFileContents.indexOf("}", pos);
+ gradleBuildFileContents.insert(pos, constructH2DatabaseDependencyLine() + "\n");
+ }
+
+ private String constructJdbcConnectionString() {
+ return "jdbc:h2:" + projectDir.getAbsolutePath() + "/database/test;AUTO_SERVER=TRUE";
+ }
+
+ private String constructHibernateToolsPluginLine() {
+ return " id 'org.hibernate.tool.hibernate-tools-gradle' version '"
+ + System.getenv("HIBERNATE_TOOLS_VERSION") + "'";
+ }
+
+ private String constructH2DatabaseDependencyLine() {
+ return " implementation 'com.h2database:h2:" + System.getenv("H2_VERSION") + "'";
+ }
+
+}
diff --git a/gradle/plugin/src/functionalTest/resources/bardb.mv.db b/gradle/plugin/src/functionalTest/resources/bardb.mv.db
new file mode 100644
index 0000000000..fbe5bee5da
Binary files /dev/null and b/gradle/plugin/src/functionalTest/resources/bardb.mv.db differ
diff --git a/gradle/plugin/src/main/java/org/hibernate/tool/gradle/Extension.java b/gradle/plugin/src/main/java/org/hibernate/tool/gradle/Extension.java
new file mode 100644
index 0000000000..75c585525d
--- /dev/null
+++ b/gradle/plugin/src/main/java/org/hibernate/tool/gradle/Extension.java
@@ -0,0 +1,17 @@
+package org.hibernate.tool.gradle;
+
+import org.gradle.api.Project;
+
+public class Extension {
+
+ public String sqlToRun = "";
+ public String hibernateProperties = "hibernate.properties";
+ public String outputFolder = "generated-sources";
+ public String packageName = "";
+ public String revengStrategy = null;
+ public Boolean generateAnnotations = true;
+ public Boolean useGenerics = true;
+
+ public Extension(Project project) {}
+
+}
diff --git a/gradle/plugin/src/main/java/org/hibernate/tool/gradle/Plugin.java b/gradle/plugin/src/main/java/org/hibernate/tool/gradle/Plugin.java
new file mode 100644
index 0000000000..f796a9176d
--- /dev/null
+++ b/gradle/plugin/src/main/java/org/hibernate/tool/gradle/Plugin.java
@@ -0,0 +1,34 @@
+package org.hibernate.tool.gradle;
+
+import java.util.Map;
+
+import org.gradle.api.Project;
+import org.hibernate.tool.gradle.task.AbstractTask;
+import org.hibernate.tool.gradle.task.GenerateCfgTask;
+import org.hibernate.tool.gradle.task.GenerateDaoTask;
+import org.hibernate.tool.gradle.task.GenerateHbmTask;
+import org.hibernate.tool.gradle.task.GenerateJavaTask;
+import org.hibernate.tool.gradle.task.RunSqlTask;
+
+public class Plugin implements org.gradle.api.Plugin {
+
+ private static Map> PLUGIN_TASK_MAP = Map.of(
+ "runSql", RunSqlTask.class,
+ "generateJava", GenerateJavaTask.class,
+ "generateCfg", GenerateCfgTask.class,
+ "generateHbm", GenerateHbmTask.class,
+ "generateDao", GenerateDaoTask.class
+ );
+
+ @SuppressWarnings("unchecked")
+ public void apply(Project project) {
+ Extension extension = project.getExtensions().create("hibernateTools", Extension.class, project);
+ for (String key : PLUGIN_TASK_MAP.keySet()) {
+ Class> taskClass = PLUGIN_TASK_MAP.get(key);
+ project.getTasks().register(key, (Class)taskClass);
+ AbstractTask task = (AbstractTask)project.getTasks().getByName(key);
+ task.doFirst(w -> task.initialize(extension));
+ }
+ }
+
+}
diff --git a/gradle/plugin/src/main/java/org/hibernate/tool/gradle/task/AbstractTask.java b/gradle/plugin/src/main/java/org/hibernate/tool/gradle/task/AbstractTask.java
new file mode 100644
index 0000000000..e3c4bad9f7
--- /dev/null
+++ b/gradle/plugin/src/main/java/org/hibernate/tool/gradle/task/AbstractTask.java
@@ -0,0 +1,142 @@
+package org.hibernate.tool.gradle.task;
+
+import java.io.File;
+import java.io.FileInputStream;
+import java.io.FileNotFoundException;
+import java.io.IOException;
+import java.net.MalformedURLException;
+import java.net.URL;
+import java.net.URLClassLoader;
+import java.util.Properties;
+import java.util.Set;
+
+import org.apache.tools.ant.BuildException;
+import org.gradle.api.DefaultTask;
+import org.gradle.api.artifacts.Configuration;
+import org.gradle.api.artifacts.ConfigurationContainer;
+import org.gradle.api.artifacts.ResolvedArtifact;
+import org.gradle.api.artifacts.ResolvedConfiguration;
+import org.gradle.api.file.SourceDirectorySet;
+import org.gradle.api.tasks.Internal;
+import org.gradle.api.tasks.SourceSet;
+import org.gradle.api.tasks.SourceSetContainer;
+import org.hibernate.tool.api.metadata.MetadataConstants;
+import org.hibernate.tool.api.metadata.MetadataDescriptor;
+import org.hibernate.tool.api.metadata.MetadataDescriptorFactory;
+import org.hibernate.tool.api.reveng.RevengSettings;
+import org.hibernate.tool.api.reveng.RevengStrategy;
+import org.hibernate.tool.api.reveng.RevengStrategyFactory;
+import org.hibernate.tool.gradle.Extension;
+
+public abstract class AbstractTask extends DefaultTask {
+
+ @Internal
+ private Extension extension = null;
+
+ @Internal
+ private Properties hibernateProperties = null;
+
+ public void initialize(Extension extension) {
+ this.extension = extension;
+ }
+
+ Extension getExtension() {
+ return this.extension;
+ }
+
+ void perform() {
+ getLogger().lifecycle("Starting Task '" + getName() + "'");
+ ClassLoader oldLoader = Thread.currentThread().getContextClassLoader();
+ try {
+ Thread.currentThread().setContextClassLoader(
+ new URLClassLoader(
+ resolveProjectClassPath(),
+ oldLoader));
+ doWork();
+ } finally {
+ Thread.currentThread().setContextClassLoader(oldLoader);
+ getLogger().lifecycle("Ending Task '" + getName() + "'");
+ }
+ }
+
+ URL[] resolveProjectClassPath() {
+ try {
+ ConfigurationContainer cc = getProject().getConfigurations();
+ Configuration defaultConf = cc.getByName("compileClasspath");
+ ResolvedConfiguration resolvedConf = defaultConf.getResolvedConfiguration();
+ Set ras = resolvedConf.getResolvedArtifacts();
+ ResolvedArtifact[] resolvedArtifacts = ras.toArray(new ResolvedArtifact[ras.size()]);
+ URL[] urls = new URL[ras.size()];
+ for (int i = 0; i < ras.size(); i++) {
+ urls[i] = resolvedArtifacts[i].getFile().toURI().toURL();
+ }
+ return urls;
+ } catch (MalformedURLException e) {
+ getLogger().error("MalformedURLException while compiling project classpath");
+ throw new BuildException(e);
+ }
+ }
+
+ Properties getHibernateProperties() {
+ if (hibernateProperties == null) {
+ loadPropertiesFile(getPropertyFile());
+ }
+ return hibernateProperties;
+ }
+
+ String getHibernateProperty(String name) {
+ return getHibernateProperties().getProperty(name);
+ }
+
+ MetadataDescriptor createJdbcDescriptor() {
+ RevengStrategy strategy = setupReverseEngineeringStrategy();
+ Properties hibernateProperties = getHibernateProperties();
+ hibernateProperties.put(MetadataConstants.PREFER_BASIC_COMPOSITE_IDS, true);
+ return MetadataDescriptorFactory.createReverseEngineeringDescriptor(strategy, hibernateProperties);
+ }
+
+ @Internal
+ File getOutputFolder() {
+ return new File(getProject().getProjectDir(), getExtension().outputFolder);
+ }
+
+ RevengStrategy setupReverseEngineeringStrategy() {
+ RevengStrategy result = RevengStrategyFactory
+ .createReverseEngineeringStrategy(getExtension().revengStrategy);
+ RevengSettings settings = new RevengSettings(result);
+ settings.setDefaultPackageName(getExtension().packageName);
+ result.setSettings(settings);
+ return result;
+ }
+
+ private File getPropertyFile() {
+ String hibernatePropertiesFile = getExtension().hibernateProperties;
+ SourceSetContainer ssc = getProject().getExtensions().getByType(SourceSetContainer.class);
+ SourceSet ss = ssc.getByName(SourceSet.MAIN_SOURCE_SET_NAME);
+ SourceDirectorySet sds = ss.getResources();
+ for (File f : sds.getFiles()) {
+ if (hibernatePropertiesFile.equals(f.getName())) {
+ return f;
+ }
+ }
+ throw new BuildException("File '" + hibernatePropertiesFile + "' could not be found");
+ }
+
+ private void loadPropertiesFile(File propertyFile) {
+ getLogger().lifecycle("Loading the properties file : " + propertyFile.getPath());
+ try (FileInputStream is = new FileInputStream(propertyFile)) {
+ hibernateProperties = new Properties();
+ hibernateProperties.load(is);
+ getLogger().lifecycle("Properties file is loaded");
+ } catch (FileNotFoundException e) {
+ e.printStackTrace();
+ throw new BuildException(propertyFile + " not found.", e);
+ } catch (IOException e) {
+ e.printStackTrace();
+ throw new BuildException("Problem while loading " + propertyFile, e);
+ }
+ }
+
+ abstract void doWork();
+
+}
diff --git a/gradle/plugin/src/main/java/org/hibernate/tool/gradle/task/GenerateCfgTask.java b/gradle/plugin/src/main/java/org/hibernate/tool/gradle/task/GenerateCfgTask.java
new file mode 100644
index 0000000000..08e3e79baa
--- /dev/null
+++ b/gradle/plugin/src/main/java/org/hibernate/tool/gradle/task/GenerateCfgTask.java
@@ -0,0 +1,29 @@
+package org.hibernate.tool.gradle.task;
+
+import java.io.File;
+
+import org.gradle.api.tasks.TaskAction;
+import org.hibernate.tool.api.export.Exporter;
+import org.hibernate.tool.api.export.ExporterConstants;
+import org.hibernate.tool.api.export.ExporterFactory;
+import org.hibernate.tool.api.export.ExporterType;
+
+public class GenerateCfgTask extends AbstractTask {
+
+ @TaskAction
+ public void performTask() {
+ super.perform();
+ }
+
+ void doWork() {
+ getLogger().lifecycle("Creating CFG exporter");
+ Exporter cfgExporter = ExporterFactory.createExporter(ExporterType.CFG);
+ File outputFolder = getOutputFolder();
+ cfgExporter.getProperties().put(ExporterConstants.METADATA_DESCRIPTOR, createJdbcDescriptor());
+ cfgExporter.getProperties().put(ExporterConstants.DESTINATION_FOLDER, outputFolder);
+ getLogger().lifecycle("Starting CFG export to directory: " + outputFolder + "...");
+ cfgExporter.start();
+ getLogger().lifecycle("CFG export finished");
+ }
+
+}
diff --git a/gradle/plugin/src/main/java/org/hibernate/tool/gradle/task/GenerateDaoTask.java b/gradle/plugin/src/main/java/org/hibernate/tool/gradle/task/GenerateDaoTask.java
new file mode 100644
index 0000000000..74edc40101
--- /dev/null
+++ b/gradle/plugin/src/main/java/org/hibernate/tool/gradle/task/GenerateDaoTask.java
@@ -0,0 +1,29 @@
+package org.hibernate.tool.gradle.task;
+
+import java.io.File;
+
+import org.gradle.api.tasks.TaskAction;
+import org.hibernate.tool.api.export.Exporter;
+import org.hibernate.tool.api.export.ExporterConstants;
+import org.hibernate.tool.api.export.ExporterFactory;
+import org.hibernate.tool.api.export.ExporterType;
+
+public class GenerateDaoTask extends AbstractTask {
+
+ @TaskAction
+ public void performTask() {
+ super.perform();
+ }
+
+ void doWork() {
+ getLogger().lifecycle("Creating DAO exporter");
+ Exporter hbmExporter = ExporterFactory.createExporter(ExporterType.DAO);
+ File outputFolder = getOutputFolder();
+ hbmExporter.getProperties().put(ExporterConstants.METADATA_DESCRIPTOR, createJdbcDescriptor());
+ hbmExporter.getProperties().put(ExporterConstants.DESTINATION_FOLDER, outputFolder);
+ getLogger().lifecycle("Starting DAO export to directory: " + outputFolder + "...");
+ hbmExporter.start();
+ getLogger().lifecycle("DAO export finished");
+ }
+
+}
diff --git a/gradle/plugin/src/main/java/org/hibernate/tool/gradle/task/GenerateHbmTask.java b/gradle/plugin/src/main/java/org/hibernate/tool/gradle/task/GenerateHbmTask.java
new file mode 100644
index 0000000000..495a4cefe1
--- /dev/null
+++ b/gradle/plugin/src/main/java/org/hibernate/tool/gradle/task/GenerateHbmTask.java
@@ -0,0 +1,29 @@
+package org.hibernate.tool.gradle.task;
+
+import java.io.File;
+
+import org.gradle.api.tasks.TaskAction;
+import org.hibernate.tool.api.export.Exporter;
+import org.hibernate.tool.api.export.ExporterConstants;
+import org.hibernate.tool.api.export.ExporterFactory;
+import org.hibernate.tool.api.export.ExporterType;
+
+public class GenerateHbmTask extends AbstractTask {
+
+ @TaskAction
+ public void performTask() {
+ super.perform();
+ }
+
+ void doWork() {
+ getLogger().lifecycle("Creating HBM exporter");
+ Exporter hbmExporter = ExporterFactory.createExporter(ExporterType.HBM);
+ File outputFolder = getOutputFolder();
+ hbmExporter.getProperties().put(ExporterConstants.METADATA_DESCRIPTOR, createJdbcDescriptor());
+ hbmExporter.getProperties().put(ExporterConstants.DESTINATION_FOLDER, outputFolder);
+ getLogger().lifecycle("Starting HBM export to directory: " + outputFolder + "...");
+ hbmExporter.start();
+ getLogger().lifecycle("HBM export finished");
+ }
+
+}
diff --git a/gradle/plugin/src/main/java/org/hibernate/tool/gradle/task/GenerateJavaTask.java b/gradle/plugin/src/main/java/org/hibernate/tool/gradle/task/GenerateJavaTask.java
new file mode 100644
index 0000000000..75b15884aa
--- /dev/null
+++ b/gradle/plugin/src/main/java/org/hibernate/tool/gradle/task/GenerateJavaTask.java
@@ -0,0 +1,31 @@
+package org.hibernate.tool.gradle.task;
+
+import java.io.File;
+
+import org.gradle.api.tasks.TaskAction;
+import org.hibernate.tool.api.export.Exporter;
+import org.hibernate.tool.api.export.ExporterConstants;
+import org.hibernate.tool.api.export.ExporterFactory;
+import org.hibernate.tool.api.export.ExporterType;
+
+public class GenerateJavaTask extends AbstractTask {
+
+ @TaskAction
+ public void performTask() {
+ super.perform();
+ }
+
+ void doWork() {
+ getLogger().lifecycle("Creating Java exporter");
+ Exporter pojoExporter = ExporterFactory.createExporter(ExporterType.JAVA);
+ pojoExporter.getProperties().setProperty("ejb3", String.valueOf(getExtension().generateAnnotations));
+ pojoExporter.getProperties().setProperty("jdk5", String.valueOf(getExtension().useGenerics));
+ File outputFolder = getOutputFolder();
+ pojoExporter.getProperties().put(ExporterConstants.METADATA_DESCRIPTOR, createJdbcDescriptor());
+ pojoExporter.getProperties().put(ExporterConstants.DESTINATION_FOLDER, outputFolder);
+ getLogger().lifecycle("Starting Java export to directory: " + outputFolder + "...");
+ pojoExporter.start();
+ getLogger().lifecycle("Java export finished");
+ }
+
+}
diff --git a/gradle/plugin/src/main/java/org/hibernate/tool/gradle/task/RunSqlTask.java b/gradle/plugin/src/main/java/org/hibernate/tool/gradle/task/RunSqlTask.java
new file mode 100644
index 0000000000..d5b4a35e2f
--- /dev/null
+++ b/gradle/plugin/src/main/java/org/hibernate/tool/gradle/task/RunSqlTask.java
@@ -0,0 +1,70 @@
+package org.hibernate.tool.gradle.task;
+
+import java.lang.reflect.Constructor;
+import java.lang.reflect.InvocationHandler;
+import java.lang.reflect.Method;
+import java.lang.reflect.Proxy;
+import java.sql.Connection;
+import java.sql.Driver;
+import java.sql.DriverManager;
+import java.sql.SQLException;
+import java.sql.Statement;
+
+import org.gradle.api.tasks.TaskAction;
+
+public class RunSqlTask extends AbstractTask {
+
+ @TaskAction
+ public void performTask() {
+ super.perform();
+ }
+
+ void doWork() {
+ registerDriver();
+ runSql();
+ }
+
+ private void registerDriver() {
+ String driverClassName = getHibernateProperty("hibernate.connection.driver_class");
+ getLogger().lifecycle("Registering the database driver: " + driverClassName);
+ try {
+ Class> driverClass = Thread.currentThread().getContextClassLoader().loadClass(driverClassName);
+ Constructor> constructor = driverClass.getDeclaredConstructor();
+ DriverManager.registerDriver(createDelegatingDriver((Driver)constructor.newInstance()));
+ getLogger().lifecycle("Database driver is registered");
+ } catch (Exception e) {
+ getLogger().error("Exception while registering the database driver: " + e.getMessage());
+ throw new RuntimeException(e);
+ }
+ }
+
+ private void runSql() {
+ try {
+ String databaseUrl = getHibernateProperty("hibernate.connection.url");
+ getLogger().lifecycle("Connecting to database: " + databaseUrl);
+ Connection connection = DriverManager
+ .getConnection(databaseUrl, "sa", "");
+ Statement statement = connection.createStatement();
+ getLogger().lifecycle("Running SQL: " + getExtension().sqlToRun);
+ statement.execute(getExtension().sqlToRun);
+ statement.close();
+ connection.close();
+ } catch (SQLException e) {
+ getLogger().error("SQLException");
+ throw new RuntimeException(e);
+ }
+ }
+
+ private Driver createDelegatingDriver(Driver driver) {
+ return (Driver)Proxy.newProxyInstance(
+ DriverManager.class.getClassLoader(),
+ new Class[] { Driver.class},
+ new InvocationHandler() {
+ @Override
+ public Object invoke(Object proxy, Method method, Object[] args) throws Throwable {
+ return method.invoke(driver, args);
+ }
+ });
+ }
+
+}
diff --git a/gradle/plugin/src/test/java/org/hibernate/tool/gradle/ExtensionTest.java b/gradle/plugin/src/test/java/org/hibernate/tool/gradle/ExtensionTest.java
new file mode 100644
index 0000000000..981689a872
--- /dev/null
+++ b/gradle/plugin/src/test/java/org/hibernate/tool/gradle/ExtensionTest.java
@@ -0,0 +1,22 @@
+package org.hibernate.tool.gradle;
+
+import static org.junit.jupiter.api.Assertions.assertNotNull;
+
+import java.lang.reflect.Field;
+import java.util.HashMap;
+import java.util.Map;
+
+import org.junit.jupiter.api.Test;
+
+public class ExtensionTest {
+
+ @Test
+ void testExtension() {
+ Map extensionFieldMap = new HashMap();
+ for(Field field : Extension.class.getDeclaredFields()) {
+ extensionFieldMap.put(field.getName(), field);
+ }
+ assertNotNull(extensionFieldMap.get("sqlToRun"));
+ }
+
+}
diff --git a/gradle/plugin/src/test/java/org/hibernate/tool/gradle/PluginTest.java b/gradle/plugin/src/test/java/org/hibernate/tool/gradle/PluginTest.java
new file mode 100644
index 0000000000..7a1848137f
--- /dev/null
+++ b/gradle/plugin/src/test/java/org/hibernate/tool/gradle/PluginTest.java
@@ -0,0 +1,25 @@
+package org.hibernate.tool.gradle;
+
+import org.gradle.testfixtures.ProjectBuilder;
+import org.gradle.api.Project;
+import org.junit.jupiter.api.Test;
+import static org.junit.jupiter.api.Assertions.*;
+
+class PluginTest {
+
+ @Test
+ void testApply() {
+ // Create a test project and apply the plugin
+ Project project = ProjectBuilder.builder().build();
+ project.getPlugins().apply("org.hibernate.tool.hibernate-tools-gradle");
+
+ // Verify the result
+ assertNotNull(project.getTasks().findByName("generateJava"));
+ assertNotNull(project.getTasks().findByName("runSql"));
+
+ Object extension = project.getExtensions().getByName("hibernateTools");
+ assertNotNull(extension);
+ assertTrue(extension instanceof Extension);
+ }
+
+}
diff --git a/gradle/plugin/src/test/java/org/hibernate/tool/gradle/task/AbstractTaskTest.java b/gradle/plugin/src/test/java/org/hibernate/tool/gradle/task/AbstractTaskTest.java
new file mode 100644
index 0000000000..4f890dbc7c
--- /dev/null
+++ b/gradle/plugin/src/test/java/org/hibernate/tool/gradle/task/AbstractTaskTest.java
@@ -0,0 +1,87 @@
+package org.hibernate.tool.gradle.task;
+
+import static org.junit.jupiter.api.Assertions.assertNotNull;
+import static org.junit.jupiter.api.Assertions.assertNotSame;
+import static org.junit.jupiter.api.Assertions.assertNull;
+import static org.junit.jupiter.api.Assertions.assertSame;
+import static org.junit.jupiter.api.Assertions.assertTrue;
+
+import java.lang.reflect.Field;
+import java.net.URL;
+
+import org.gradle.api.Project;
+import org.gradle.testfixtures.ProjectBuilder;
+import org.hibernate.tool.api.reveng.RevengStrategy;
+import org.hibernate.tool.gradle.Extension;
+import org.hibernate.tool.internal.reveng.strategy.AbstractStrategy;
+import org.junit.jupiter.api.BeforeEach;
+import org.junit.jupiter.api.Test;
+
+public class AbstractTaskTest {
+
+ private static ClassLoader USED_CLASS_LOADER;
+ private static URL[] URLS = new URL[] {};
+
+ private AbstractTask abstractTask = null;
+
+ private Field extensionField = null;
+ private Extension extension = null;
+
+ @BeforeEach
+ void beforeEach() throws Exception {
+ USED_CLASS_LOADER = null;
+ Project project = ProjectBuilder.builder().build();
+ abstractTask = project.getTasks().create("foo", FooTask.class);
+ extensionField = AbstractTask.class.getDeclaredField("extension");
+ extensionField.setAccessible(true);
+ extension = new Extension(project);
+ }
+
+ @Test
+ void testInitialize() throws Exception {
+ assertNull(extensionField.get(abstractTask));
+ abstractTask.initialize(extension);
+ assertSame(extension, extensionField.get(abstractTask));
+ }
+
+ @Test
+ void testGetExtension() throws Exception {
+ assertNull(abstractTask.getExtension());
+ extensionField.set(abstractTask, extension);
+ assertSame(extension, abstractTask.getExtension());
+ }
+
+ @Test
+ void testPerform() {
+ ClassLoader contextClassLoader = Thread.currentThread().getContextClassLoader();
+ assertNull(USED_CLASS_LOADER);
+ abstractTask.perform();
+ assertNotNull(USED_CLASS_LOADER);
+ assertNotSame(contextClassLoader, USED_CLASS_LOADER);
+ }
+
+ @Test
+ void testResolveProjectClassPath() {
+ assertSame(URLS, abstractTask.resolveProjectClassPath());
+ }
+
+ @Test
+ public void testSetupReverseEngineeringStrategy() throws Exception {
+ extension.revengStrategy = FooStrategy.class.getName();
+ extensionField.set(abstractTask, extension);
+ RevengStrategy revengStrategy = abstractTask.setupReverseEngineeringStrategy();
+ assertTrue(revengStrategy instanceof FooStrategy);
+ }
+
+ public static class FooStrategy extends AbstractStrategy {}
+
+ public static class FooTask extends AbstractTask {
+ void doWork() {
+ USED_CLASS_LOADER = Thread.currentThread().getContextClassLoader();
+ }
+ URL[] resolveProjectClassPath() {
+ return URLS;
+ }
+ }
+
+}
diff --git a/gradle/pom.xml b/gradle/pom.xml
new file mode 100644
index 0000000000..35ff2b2b3f
--- /dev/null
+++ b/gradle/pom.xml
@@ -0,0 +1,140 @@
+
+
+
+
+ 4.0.0
+
+
+ org.hibernate.tool
+ hibernate-tools-parent
+ 6.6.27-SNAPSHOT
+
+
+ hibernate-tools-gradle
+ pom
+
+ Hibernate Tools Gradle Plugin
+ Gradle plugin to provide hibernate-tools reverse engineering and code/schema generation abilities.
+ https://hibernate.org/tools/
+
+
+ JIRA
+ https://hibernate.atlassian.net/projects/HBX
+
+
+
+
+ false
+
+ ./gradlew
+
+
+
+
+
+
+ org.apache.maven.plugins
+ maven-deploy-plugin
+
+ true
+
+
+
+
+ org.codehaus.mojo
+ exec-maven-plugin
+
+
+ gradle-package
+ prepare-package
+
+ ${gradle.executable}
+
+ clean
+ build
+ -PprojectVersion=${project.version}
+ -Ph2Version=${h2.version}
+ -Dmaven.repo.local=${settings.localRepository}
+
+
+
+ exec
+
+
+
+ gradle-clean
+ clean
+
+ ${gradle.executable}
+
+ clean
+ -PprojectVersion=${project.version}
+ -Ph2Version=${h2.version}
+
+
+
+ exec
+
+
+
+
+
+
+
+
+
+ release
+
+
+ performRelease
+ true
+
+
+
+
+
+ org.codehaus.mojo
+ exec-maven-plugin
+
+
+ gradle-publish-to-plugin-portal
+ deploy
+
+ ${gradle.executable}
+
+ publishPlugins
+ publishPluginMavenPublicationToStagingRepository
+ -PprojectVersion=${project.version}
+ -Ph2Version=${h2.version}
+ -Dmaven.repo.local=${settings.localRepository}
+ -PmavenStagingDirectory=${local.staging.releases.repo.url}
+
+
+
+ exec
+
+
+
+
+
+
+
+
+
+
+
diff --git a/gradle/settings.gradle b/gradle/settings.gradle
new file mode 100644
index 0000000000..696921961c
--- /dev/null
+++ b/gradle/settings.gradle
@@ -0,0 +1,10 @@
+/*
+ * This file was generated by the Gradle 'init' task.
+ *
+ * The settings file is used to specify which projects to include in your build.
+ * For more detailed information on multi-project builds, please refer to https://docs.gradle.org/8.8/userguide/multi_project_builds.html in the Gradle documentation.
+ */
+
+rootProject.name = 'hibernate-tools-gradle'
+include('plugin')
+project( ':plugin' ).name = 'hibernate-tools-gradle'
diff --git a/jbt/pom.xml b/jbt/pom.xml
index 3fbfd24c27..dc985db51b 100644
--- a/jbt/pom.xml
+++ b/jbt/pom.xml
@@ -25,7 +25,7 @@
org.hibernate.tool
hibernate-tools-parent
- 6.5.0.Final
+ 6.6.27-SNAPSHOT
hibernate-tools-orm-jbt
@@ -35,6 +35,11 @@
Hibernate Tools ORM - JBoss Tools Adapter
Hibernate Tools ORM - JBoss Tools Adapter
+
+
+ false
+
+
com.h2database
diff --git a/jbt/src/main/java/org/hibernate/tool/hbm2x/DAOExporter.java b/jbt/src/main/java/org/hibernate/tool/hbm2x/DAOExporter.java
new file mode 100644
index 0000000000..263e564e9a
--- /dev/null
+++ b/jbt/src/main/java/org/hibernate/tool/hbm2x/DAOExporter.java
@@ -0,0 +1,5 @@
+package org.hibernate.tool.hbm2x;
+
+import org.hibernate.tool.internal.export.dao.DaoExporter;
+
+public class DAOExporter extends DaoExporter {}
diff --git a/jbt/src/main/java/org/hibernate/tool/hbm2x/DocExporter.java b/jbt/src/main/java/org/hibernate/tool/hbm2x/DocExporter.java
new file mode 100644
index 0000000000..01ea56276e
--- /dev/null
+++ b/jbt/src/main/java/org/hibernate/tool/hbm2x/DocExporter.java
@@ -0,0 +1,3 @@
+package org.hibernate.tool.hbm2x;
+
+public class DocExporter extends org.hibernate.tool.internal.export.doc.DocExporter {}
diff --git a/jbt/src/main/java/org/hibernate/tool/hbm2x/GenericExporter.java b/jbt/src/main/java/org/hibernate/tool/hbm2x/GenericExporter.java
new file mode 100644
index 0000000000..3ae36af92d
--- /dev/null
+++ b/jbt/src/main/java/org/hibernate/tool/hbm2x/GenericExporter.java
@@ -0,0 +1,3 @@
+package org.hibernate.tool.hbm2x;
+
+public class GenericExporter extends org.hibernate.tool.internal.export.common.GenericExporter {}
diff --git a/jbt/src/main/java/org/hibernate/tool/hbm2x/Hbm2DDLExporter.java b/jbt/src/main/java/org/hibernate/tool/hbm2x/Hbm2DDLExporter.java
new file mode 100644
index 0000000000..ce5334e854
--- /dev/null
+++ b/jbt/src/main/java/org/hibernate/tool/hbm2x/Hbm2DDLExporter.java
@@ -0,0 +1,5 @@
+package org.hibernate.tool.hbm2x;
+
+import org.hibernate.tool.internal.export.ddl.DdlExporter;
+
+public class Hbm2DDLExporter extends DdlExporter {}
diff --git a/jbt/src/main/java/org/hibernate/tool/hbm2x/QueryExporter.java b/jbt/src/main/java/org/hibernate/tool/hbm2x/QueryExporter.java
new file mode 100644
index 0000000000..cb199780c0
--- /dev/null
+++ b/jbt/src/main/java/org/hibernate/tool/hbm2x/QueryExporter.java
@@ -0,0 +1,3 @@
+package org.hibernate.tool.hbm2x;
+
+public class QueryExporter extends org.hibernate.tool.internal.export.query.QueryExporter {}
diff --git a/jbt/src/main/java/org/hibernate/tool/orm/jbt/api/ArtifactCollectorWrapper.java b/jbt/src/main/java/org/hibernate/tool/orm/jbt/api/ArtifactCollectorWrapper.java
deleted file mode 100644
index a9097fb70e..0000000000
--- a/jbt/src/main/java/org/hibernate/tool/orm/jbt/api/ArtifactCollectorWrapper.java
+++ /dev/null
@@ -1,15 +0,0 @@
-package org.hibernate.tool.orm.jbt.api;
-
-import java.io.File;
-import java.util.Set;
-
-import org.hibernate.tool.api.export.ArtifactCollector;
-import org.hibernate.tool.orm.jbt.wrp.Wrapper;
-
-public interface ArtifactCollectorWrapper extends Wrapper {
-
- default Set getFileTypes() { return ((ArtifactCollector)getWrappedObject()).getFileTypes(); }
- default void formatFiles() { ((ArtifactCollector)getWrappedObject()).formatFiles(); }
- default File[] getFiles(String string) { return ((ArtifactCollector)getWrappedObject()).getFiles(string); }
-
-}
diff --git a/jbt/src/main/java/org/hibernate/tool/orm/jbt/api/Cfg2HbmToolWrapper.java b/jbt/src/main/java/org/hibernate/tool/orm/jbt/api/Cfg2HbmToolWrapper.java
deleted file mode 100644
index 567ce63370..0000000000
--- a/jbt/src/main/java/org/hibernate/tool/orm/jbt/api/Cfg2HbmToolWrapper.java
+++ /dev/null
@@ -1,40 +0,0 @@
-package org.hibernate.tool.orm.jbt.api;
-
-import org.hibernate.mapping.PersistentClass;
-import org.hibernate.mapping.Property;
-import org.hibernate.mapping.SimpleValue;
-import org.hibernate.tool.internal.export.hbm.Cfg2HbmTool;
-import org.hibernate.tool.internal.export.hbm.HBMTagForValueVisitor;
-import org.hibernate.tool.orm.jbt.wrp.Wrapper;
-
-public interface Cfg2HbmToolWrapper extends Wrapper {
-
- default String getTag(PersistentClass pc) {
- return ((Cfg2HbmTool)getWrappedObject()).getTag(pc);
- }
- default String getTag(Property p) {
- if (p instanceof Wrapper) {
- p = (Property)((Wrapper)p).getWrappedObject();
- }
- PersistentClass persistentClass = p.getPersistentClass();
- if(persistentClass!=null) {
- Property v = persistentClass.getVersion();
- if (v instanceof Wrapper) {
- v = (Property)((Wrapper)v).getWrappedObject();
- }
- if(v==p) {
- String typeName = ((SimpleValue)p.getValue()).getTypeName();
- if("timestamp".equals(typeName) || "dbtimestamp".equals(typeName)) {
- return "timestamp";
- } else {
- return "version";
- }
- }
- }
- String toolTag = (String) p.getValue().accept(HBMTagForValueVisitor.INSTANCE);
- if ("component".equals(toolTag) && "embedded".equals(p.getPropertyAccessorName())){
- toolTag = "properties";
- }
- return toolTag;
- }
-}
diff --git a/jbt/src/main/java/org/hibernate/tool/orm/jbt/api/ClassMetadataWrapper.java b/jbt/src/main/java/org/hibernate/tool/orm/jbt/api/ClassMetadataWrapper.java
deleted file mode 100644
index 346faaeb8a..0000000000
--- a/jbt/src/main/java/org/hibernate/tool/orm/jbt/api/ClassMetadataWrapper.java
+++ /dev/null
@@ -1,25 +0,0 @@
-package org.hibernate.tool.orm.jbt.api;
-
-import org.hibernate.Session;
-import org.hibernate.engine.spi.SharedSessionContractImplementor;
-import org.hibernate.persister.entity.AbstractEntityPersister;
-import org.hibernate.persister.entity.EntityPersister;
-import org.hibernate.tool.orm.jbt.wrp.Wrapper;
-import org.hibernate.type.Type;
-
-public interface ClassMetadataWrapper extends Wrapper {
-
- default String getEntityName() { return ((EntityPersister)getWrappedObject()).getEntityName(); }
- default String getIdentifierPropertyName() { return ((EntityPersister)getWrappedObject()).getIdentifierPropertyName(); }
- default String[] getPropertyNames() { return ((EntityPersister)getWrappedObject()).getPropertyNames(); }
- default Type[] getPropertyTypes() { return ((EntityPersister)getWrappedObject()).getPropertyTypes(); }
- default Class> getMappedClass() { return ((EntityPersister)getWrappedObject()).getMappedClass(); }
- default Type getIdentifierType() { return ((EntityPersister)getWrappedObject()).getIdentifierType(); }
- default Object getPropertyValue(Object object, String name) { return ((EntityPersister)getWrappedObject()).getPropertyValue(object, name); }
- default boolean hasIdentifierProperty() { return ((EntityPersister)getWrappedObject()).hasIdentifierProperty(); }
- default Object getIdentifier(Object object, Session session) { return ((EntityPersister)getWrappedObject()).getIdentifier(object, (SharedSessionContractImplementor)session); }
- default boolean isInstanceOfAbstractEntityPersister() { return (EntityPersister)getWrappedObject() instanceof AbstractEntityPersister; }
- default Integer getPropertyIndexOrNull(String id) { return ((EntityPersister)getWrappedObject()).getEntityMetamodel().getPropertyIndexOrNull(id); }
- default Object getTuplizerPropertyValue(Object entity, int i) { return ((EntityPersister)getWrappedObject()).getValue(entity, i); }
-
-}
diff --git a/jbt/src/main/java/org/hibernate/tool/orm/jbt/api/CollectionMetadataWrapper.java b/jbt/src/main/java/org/hibernate/tool/orm/jbt/api/CollectionMetadataWrapper.java
deleted file mode 100644
index ef272a5e7c..0000000000
--- a/jbt/src/main/java/org/hibernate/tool/orm/jbt/api/CollectionMetadataWrapper.java
+++ /dev/null
@@ -1,11 +0,0 @@
-package org.hibernate.tool.orm.jbt.api;
-
-import org.hibernate.persister.collection.CollectionPersister;
-import org.hibernate.tool.orm.jbt.wrp.Wrapper;
-import org.hibernate.type.Type;
-
-public interface CollectionMetadataWrapper extends Wrapper {
-
- default Type getElementType() { return ((CollectionPersister)getWrappedObject()).getElementType(); }
-
-}
diff --git a/jbt/src/main/java/org/hibernate/tool/orm/jbt/api/ColumnWrapper.java b/jbt/src/main/java/org/hibernate/tool/orm/jbt/api/ColumnWrapper.java
deleted file mode 100644
index 71e873fe86..0000000000
--- a/jbt/src/main/java/org/hibernate/tool/orm/jbt/api/ColumnWrapper.java
+++ /dev/null
@@ -1,41 +0,0 @@
-package org.hibernate.tool.orm.jbt.api;
-
-import org.hibernate.cfg.Configuration;
-import org.hibernate.mapping.Column;
-import org.hibernate.mapping.Value;
-import org.hibernate.tool.orm.jbt.util.MetadataHelper;
-import org.hibernate.tool.orm.jbt.wrp.Wrapper;
-
-public interface ColumnWrapper extends Wrapper {
-
- static final int DEFAULT_LENGTH = 255;
- static final int DEFAULT_PRECISION = 19;
- static final int DEFAULT_SCALE = 2;
-
- default String getName() { return ((Column)getWrappedObject()).getName(); }
- default Integer getSqlTypeCode() { return ((Column)getWrappedObject()).getSqlTypeCode(); }
- default String getSqlType() { return ((Column)getWrappedObject()).getSqlType(); }
- default String getSqlType(Configuration configuration) {
- return ((Column)getWrappedObject()).getSqlType(MetadataHelper.getMetadata(configuration));
- }
- default long getLength() {
- Long length = ((Column)getWrappedObject()).getLength();
- return length == null ? Integer.MIN_VALUE : length;
- }
- default int getDefaultLength() { return DEFAULT_LENGTH; }
- default int getPrecision() {
- Integer precision = ((Column)getWrappedObject()).getPrecision();
- return precision == null ? Integer.MIN_VALUE : precision;
- }
- default int getDefaultPrecision() { return DEFAULT_PRECISION; }
- default int getScale() {
- Integer scale = ((Column)getWrappedObject()).getScale();
- return scale == null ? Integer.MIN_VALUE : scale;
- }
- default int getDefaultScale() { return DEFAULT_SCALE; }
- default boolean isNullable() { return ((Column)getWrappedObject()).isNullable(); }
- default Value getValue() { return ((Column)getWrappedObject()).getValue(); }
- default boolean isUnique() { return ((Column)getWrappedObject()).isUnique(); }
- default void setSqlType(String sqlType) { ((Column)getWrappedObject()).setSqlType(sqlType); }
-
-}
diff --git a/jbt/src/main/java/org/hibernate/tool/orm/jbt/api/ConfigurationWrapper.java b/jbt/src/main/java/org/hibernate/tool/orm/jbt/api/ConfigurationWrapper.java
deleted file mode 100644
index 2d25d8f531..0000000000
--- a/jbt/src/main/java/org/hibernate/tool/orm/jbt/api/ConfigurationWrapper.java
+++ /dev/null
@@ -1,111 +0,0 @@
-package org.hibernate.tool.orm.jbt.api;
-
-import java.io.File;
-import java.util.Iterator;
-import java.util.Properties;
-
-import org.hibernate.SessionFactory;
-import org.hibernate.cfg.Configuration;
-import org.hibernate.cfg.NamingStrategy;
-import org.hibernate.mapping.PersistentClass;
-import org.hibernate.mapping.Table;
-import org.hibernate.tool.api.reveng.RevengStrategy;
-import org.hibernate.tool.orm.jbt.util.JpaConfiguration;
-import org.hibernate.tool.orm.jbt.util.NativeConfiguration;
-import org.hibernate.tool.orm.jbt.util.RevengConfiguration;
-import org.hibernate.tool.orm.jbt.wrp.Wrapper;
-import org.w3c.dom.Document;
-import org.xml.sax.EntityResolver;
-
-public interface ConfigurationWrapper extends Wrapper {
-
- default String getProperty(String property) { return ((Configuration)getWrappedObject()).getProperty(property); }
- default ConfigurationWrapper addFile(File file) { ((Configuration)getWrappedObject()).addFile(file); return this; }
- default void setProperty(String name, String value) { ((Configuration)getWrappedObject()).setProperty(name, value); }
- default ConfigurationWrapper setProperties(Properties properties) { ((Configuration)getWrappedObject()).setProperties(properties); return this; }
- default void setEntityResolver(EntityResolver entityResolver) {
- Object wrappedObject = getWrappedObject();
- if (wrappedObject instanceof NativeConfiguration) ((NativeConfiguration)wrappedObject).setEntityResolver(entityResolver);
- if (wrappedObject instanceof RevengConfiguration) ((RevengConfiguration)wrappedObject).setEntityResolver(entityResolver);
- if (wrappedObject instanceof JpaConfiguration) ((JpaConfiguration)wrappedObject).setEntityResolver(entityResolver);
- }
- default void setNamingStrategy(NamingStrategy namingStrategy) {
- Object wrappedObject = getWrappedObject();
- if (wrappedObject instanceof NativeConfiguration) ((NativeConfiguration)wrappedObject).setNamingStrategy(namingStrategy);
- if (wrappedObject instanceof RevengConfiguration) ((RevengConfiguration)wrappedObject).setNamingStrategy(namingStrategy);
- if (wrappedObject instanceof JpaConfiguration) ((JpaConfiguration)wrappedObject).setNamingStrategy(namingStrategy);
- }
- default Properties getProperties() { return ((Configuration)getWrappedObject()).getProperties(); }
- default void addProperties(Properties properties) { ((Configuration)getWrappedObject()).addProperties(properties); }
- default ConfigurationWrapper configure(Document document) {
- Object wrappedObject = getWrappedObject();
- if (wrappedObject instanceof NativeConfiguration) ((NativeConfiguration)wrappedObject).configure(document);
- if (wrappedObject instanceof RevengConfiguration) ((RevengConfiguration)wrappedObject).configure(document);
- if (wrappedObject instanceof JpaConfiguration) ((JpaConfiguration)wrappedObject).configure(document);
- return this;
- }
- default ConfigurationWrapper configure(File file) { ((Configuration)getWrappedObject()).configure(file); return this; }
- default ConfigurationWrapper configure() { ((Configuration)getWrappedObject()).configure(); return this; }
- default void addClass(Class> clazz) { ((Configuration)getWrappedObject()).addClass(clazz); }
- default void buildMappings() {
- Object wrappedObject = getWrappedObject();
- if (wrappedObject instanceof NativeConfiguration) ((NativeConfiguration)wrappedObject).buildMappings();
- if (wrappedObject instanceof RevengConfiguration) ((RevengConfiguration)wrappedObject).buildMappings();
- if (wrappedObject instanceof JpaConfiguration) ((JpaConfiguration)wrappedObject).buildMappings();
- }
- default SessionFactory buildSessionFactory() { return ((Configuration)getWrappedObject()).buildSessionFactory(); }
- default Iterator getClassMappings() {
- Object wrappedObject = getWrappedObject();
- if (wrappedObject instanceof NativeConfiguration) return ((NativeConfiguration)wrappedObject).getClassMappings();
- if (wrappedObject instanceof RevengConfiguration) return ((RevengConfiguration)wrappedObject).getClassMappings();
- if (wrappedObject instanceof JpaConfiguration) return ((JpaConfiguration)wrappedObject).getClassMappings();
- return null;
- }
- default void setPreferBasicCompositeIds(boolean b) {
- Object wrappedObject = getWrappedObject();
- if (wrappedObject instanceof NativeConfiguration) ((NativeConfiguration)wrappedObject).setPreferBasicCompositeIds(b);
- if (wrappedObject instanceof RevengConfiguration) ((RevengConfiguration)wrappedObject).setPreferBasicCompositeIds(b);
- if (wrappedObject instanceof JpaConfiguration) ((JpaConfiguration)wrappedObject).setPreferBasicCompositeIds(b);
- }
- default void setReverseEngineeringStrategy(RevengStrategy strategy) {
- Object wrappedObject = getWrappedObject();
- if (wrappedObject instanceof NativeConfiguration) ((NativeConfiguration)wrappedObject).setReverseEngineeringStrategy(strategy);
- if (wrappedObject instanceof RevengConfiguration) ((RevengConfiguration)wrappedObject).setReverseEngineeringStrategy(strategy);
- if (wrappedObject instanceof JpaConfiguration) ((JpaConfiguration)wrappedObject).setReverseEngineeringStrategy(strategy);
- }
- default void readFromJDBC() {
- Object wrappedObject = getWrappedObject();
- if (wrappedObject instanceof NativeConfiguration) ((NativeConfiguration)wrappedObject).readFromJDBC();
- if (wrappedObject instanceof RevengConfiguration) ((RevengConfiguration)wrappedObject).readFromJDBC();
- if (wrappedObject instanceof JpaConfiguration) ((JpaConfiguration)wrappedObject).readFromJDBC();
- }
- default PersistentClass getClassMapping(String string) {
- Object wrappedObject = getWrappedObject();
- if (wrappedObject instanceof NativeConfiguration) return ((NativeConfiguration)wrappedObject).getClassMapping(string);
- if (wrappedObject instanceof RevengConfiguration) return ((RevengConfiguration)wrappedObject).getClassMapping(string);
- if (wrappedObject instanceof JpaConfiguration) return ((JpaConfiguration)wrappedObject).getClassMapping(string);
- return null;
- }
- default NamingStrategy getNamingStrategy() {
- Object wrappedObject = getWrappedObject();
- if (wrappedObject instanceof NativeConfiguration) return ((NativeConfiguration)wrappedObject).getNamingStrategy();
- if (wrappedObject instanceof RevengConfiguration) return ((RevengConfiguration)wrappedObject).getNamingStrategy();
- if (wrappedObject instanceof JpaConfiguration) return ((JpaConfiguration)wrappedObject).getNamingStrategy();
- return null;
- }
- default EntityResolver getEntityResolver() {
- Object wrappedObject = getWrappedObject();
- if (wrappedObject instanceof NativeConfiguration) return ((NativeConfiguration)wrappedObject).getEntityResolver();
- if (wrappedObject instanceof RevengConfiguration) return ((RevengConfiguration)wrappedObject).getEntityResolver();
- if (wrappedObject instanceof JpaConfiguration) return ((JpaConfiguration)wrappedObject).getEntityResolver();
- return null;
- }
- default Iterator
getTableMappings() {
- Object wrappedObject = getWrappedObject();
- if (wrappedObject instanceof NativeConfiguration) return ((NativeConfiguration)wrappedObject).getTableMappings();
- if (wrappedObject instanceof RevengConfiguration) return ((RevengConfiguration)wrappedObject).getTableMappings();
- if (wrappedObject instanceof JpaConfiguration) return ((JpaConfiguration)wrappedObject).getTableMappings();
- return null;
- }
-
-}
diff --git a/jbt/src/main/java/org/hibernate/tool/orm/jbt/api/CriteriaWrapper.java b/jbt/src/main/java/org/hibernate/tool/orm/jbt/api/CriteriaWrapper.java
deleted file mode 100644
index 34244aaba6..0000000000
--- a/jbt/src/main/java/org/hibernate/tool/orm/jbt/api/CriteriaWrapper.java
+++ /dev/null
@@ -1,14 +0,0 @@
-package org.hibernate.tool.orm.jbt.api;
-
-import java.util.List;
-
-import org.hibernate.tool.orm.jbt.wrp.Wrapper;
-
-import jakarta.persistence.Query;
-
-public interface CriteriaWrapper extends Wrapper {
-
- default void setMaxResults(int intValue) { ((Query)getWrappedObject()).setMaxResults(intValue); }
- default List> list() { return ((Query)getWrappedObject()).getResultList(); }
-
-}
diff --git a/jbt/src/main/java/org/hibernate/tool/orm/jbt/api/DdlExporterWrapper.java b/jbt/src/main/java/org/hibernate/tool/orm/jbt/api/DdlExporterWrapper.java
deleted file mode 100644
index 856f32bf3e..0000000000
--- a/jbt/src/main/java/org/hibernate/tool/orm/jbt/api/DdlExporterWrapper.java
+++ /dev/null
@@ -1,20 +0,0 @@
-package org.hibernate.tool.orm.jbt.api;
-
-import java.util.Properties;
-
-import org.hibernate.tool.api.export.ExporterConstants;
-import org.hibernate.tool.internal.export.ddl.DdlExporter;
-import org.hibernate.tool.orm.jbt.wrp.Wrapper;
-
-public interface DdlExporterWrapper extends Wrapper {
-
- default void setExport(boolean b) {
- ((DdlExporter)getWrappedObject()).getProperties().put(
- ExporterConstants.EXPORT_TO_DATABASE, b);
- }
-
- default Properties getProperties() {
- return ((DdlExporter)getWrappedObject()).getProperties();
- }
-
-}
diff --git a/jbt/src/main/java/org/hibernate/tool/orm/jbt/api/EnvironmentWrapper.java b/jbt/src/main/java/org/hibernate/tool/orm/jbt/api/EnvironmentWrapper.java
deleted file mode 100644
index 0eb05b77ae..0000000000
--- a/jbt/src/main/java/org/hibernate/tool/orm/jbt/api/EnvironmentWrapper.java
+++ /dev/null
@@ -1,34 +0,0 @@
-package org.hibernate.tool.orm.jbt.api;
-
-import org.hibernate.cfg.Environment;
-import org.hibernate.tool.orm.jbt.wrp.Wrapper;
-
-public interface EnvironmentWrapper extends Wrapper {
-
- default String getTransactionManagerStrategy() { return "hibernate.transaction.coordinator_class"; }
-
- default String getDriver() { return Environment.DRIVER; }
-
- default String getHBM2DDLAuto() { return Environment.HBM2DDL_AUTO; }
-
- default String getDialect() { return Environment.DIALECT; }
-
- default String getDataSource() { return Environment.DATASOURCE; }
-
- default String getConnectionProvider() { return Environment.CONNECTION_PROVIDER; }
-
- default String getURL() { return Environment.URL; }
-
- default String getUser() { return Environment.USER; }
-
- default String getPass() { return Environment.PASS; }
-
- default String getSessionFactoryName() { return Environment.SESSION_FACTORY_NAME; }
-
- default String getDefaultCatalog() { return Environment.DEFAULT_CATALOG; }
-
- default String getDefaultSchema() { return Environment.DEFAULT_SCHEMA; }
-
- default Class getWrappedClass() { return Environment.class; }
-
-}
diff --git a/jbt/src/main/java/org/hibernate/tool/orm/jbt/api/ExporterWrapper.java b/jbt/src/main/java/org/hibernate/tool/orm/jbt/api/ExporterWrapper.java
deleted file mode 100644
index 6f8623f9cb..0000000000
--- a/jbt/src/main/java/org/hibernate/tool/orm/jbt/api/ExporterWrapper.java
+++ /dev/null
@@ -1,86 +0,0 @@
-package org.hibernate.tool.orm.jbt.api;
-
-import java.io.File;
-import java.io.StringWriter;
-import java.util.Properties;
-
-import org.hibernate.cfg.Configuration;
-import org.hibernate.tool.api.export.Exporter;
-import org.hibernate.tool.api.export.ExporterConstants;
-import org.hibernate.tool.internal.export.cfg.CfgExporter;
-import org.hibernate.tool.internal.export.common.GenericExporter;
-import org.hibernate.tool.internal.export.ddl.DdlExporter;
-import org.hibernate.tool.internal.export.query.QueryExporter;
-import org.hibernate.tool.orm.jbt.util.ConfigurationMetadataDescriptor;
-import org.hibernate.tool.orm.jbt.wrp.Wrapper;
-
-public interface ExporterWrapper extends Wrapper {
-
- default void setConfiguration(Configuration configuration) {
- if (CfgExporter.class.isAssignableFrom(getWrappedObject().getClass())) {
- ((CfgExporter)getWrappedObject()).setCustomProperties(configuration.getProperties());
- }
- ((Exporter)getWrappedObject()).getProperties().put(
- ExporterConstants.METADATA_DESCRIPTOR,
- new ConfigurationMetadataDescriptor(configuration));
- }
-
- default void setArtifactCollector(ArtifactCollectorWrapper artifactCollectorWrapper) {
- ((Exporter)getWrappedObject()).getProperties().put(
- ExporterConstants.ARTIFACT_COLLECTOR,
- artifactCollectorWrapper.getWrappedObject());
- }
-
- default void setOutputDirectory(File dir) {
- ((Exporter)getWrappedObject()).getProperties().put(ExporterConstants.DESTINATION_FOLDER, dir);
- }
-
- default void setTemplatePath(String[] templatePath) {
- ((Exporter)getWrappedObject()).getProperties().put(ExporterConstants.TEMPLATE_PATH, templatePath);
- }
-
- default void start() {
- ((Exporter)getWrappedObject()).start();
- }
-
- default Properties getProperties() {
- return ((Exporter)getWrappedObject()).getProperties();
- }
-
- default GenericExporter getGenericExporter() {
- if (getWrappedObject() instanceof GenericExporter) {
- return (GenericExporter)getWrappedObject();
- } else {
- return null;
- }
- }
-
- default DdlExporter getHbm2DDLExporter() {
- if (getWrappedObject() instanceof DdlExporter) {
- return (DdlExporter)getWrappedObject();
- } else {
- return null;
- }
- }
-
- default QueryExporter getQueryExporter() {
- if (getWrappedObject() instanceof QueryExporter) {
- return (QueryExporter)getWrappedObject();
- } else {
- return null;
- }
- }
-
- default void setCustomProperties(Properties properties) {
- if (getWrappedObject() instanceof CfgExporter) {
- ((CfgExporter)getWrappedObject()).setCustomProperties(properties);
- }
- }
-
- default void setOutput(StringWriter stringWriter) {
- if (getWrappedObject() instanceof CfgExporter) {
- ((CfgExporter)getWrappedObject()).setOutput(stringWriter);
- }
- }
-
-}
diff --git a/jbt/src/main/java/org/hibernate/tool/orm/jbt/api/ForeignKeyWrapper.java b/jbt/src/main/java/org/hibernate/tool/orm/jbt/api/ForeignKeyWrapper.java
deleted file mode 100644
index bf525f37f0..0000000000
--- a/jbt/src/main/java/org/hibernate/tool/orm/jbt/api/ForeignKeyWrapper.java
+++ /dev/null
@@ -1,23 +0,0 @@
-package org.hibernate.tool.orm.jbt.api;
-
-import java.util.Iterator;
-import java.util.List;
-
-import org.hibernate.mapping.Column;
-import org.hibernate.mapping.ForeignKey;
-import org.hibernate.mapping.Table;
-import org.hibernate.tool.orm.jbt.wrp.Wrapper;
-
-public interface ForeignKeyWrapper extends Wrapper {
-
- default Table getReferencedTable() { return ((ForeignKey)getWrappedObject()).getReferencedTable(); }
-
- default Iterator columnIterator() { return ((ForeignKey)getWrappedObject()).getColumns().iterator(); }
-
- default boolean isReferenceToPrimaryKey() { return ((ForeignKey)getWrappedObject()).isReferenceToPrimaryKey(); }
-
- default List getReferencedColumns() { return ((ForeignKey)getWrappedObject()).getReferencedColumns(); }
-
- default boolean containsColumn(Column column) { return ((ForeignKey)getWrappedObject()).containsColumn(column); }
-
-}
diff --git a/jbt/src/main/java/org/hibernate/tool/orm/jbt/api/GenericExporterWrapper.java b/jbt/src/main/java/org/hibernate/tool/orm/jbt/api/GenericExporterWrapper.java
deleted file mode 100644
index 0e9a1b9a1a..0000000000
--- a/jbt/src/main/java/org/hibernate/tool/orm/jbt/api/GenericExporterWrapper.java
+++ /dev/null
@@ -1,34 +0,0 @@
-package org.hibernate.tool.orm.jbt.api;
-
-import org.hibernate.tool.api.export.ExporterConstants;
-import org.hibernate.tool.internal.export.common.GenericExporter;
-import org.hibernate.tool.orm.jbt.wrp.Wrapper;
-
-public interface GenericExporterWrapper extends Wrapper {
-
- default void setFilePattern(String filePattern) {
- ((GenericExporter)getWrappedObject()).getProperties().setProperty(
- ExporterConstants.FILE_PATTERN, filePattern);
- }
-
- default void setTemplateName(String templateName) {
- ((GenericExporter)getWrappedObject()).getProperties().setProperty(
- ExporterConstants.TEMPLATE_NAME, templateName);
- }
-
- default void setForEach(String forEach) {
- ((GenericExporter)getWrappedObject()).getProperties().setProperty(
- ExporterConstants.FOR_EACH, forEach);
- }
-
- default String getFilePattern() {
- return ((GenericExporter)getWrappedObject()).getProperties().getProperty(
- ExporterConstants.FILE_PATTERN);
- }
-
- default String getTemplateName() {
- return ((GenericExporter)getWrappedObject()).getProperties().getProperty(
- ExporterConstants.TEMPLATE_NAME);
- }
-
-}
diff --git a/jbt/src/main/java/org/hibernate/tool/orm/jbt/api/HbmExporterWrapper.java b/jbt/src/main/java/org/hibernate/tool/orm/jbt/api/HbmExporterWrapper.java
deleted file mode 100644
index e0e78a9102..0000000000
--- a/jbt/src/main/java/org/hibernate/tool/orm/jbt/api/HbmExporterWrapper.java
+++ /dev/null
@@ -1,34 +0,0 @@
-package org.hibernate.tool.orm.jbt.api;
-
-import java.io.File;
-import java.util.Map;
-
-import org.hibernate.tool.api.export.ExporterConstants;
-import org.hibernate.tool.internal.export.hbm.HbmExporter;
-import org.hibernate.tool.internal.export.java.POJOClass;
-import org.hibernate.tool.orm.jbt.internal.factory.HbmExporterWrapperFactory.HbmExporterExtension;
-import org.hibernate.tool.orm.jbt.wrp.Wrapper;
-
-public interface HbmExporterWrapper extends Wrapper {
-
- default void start() {
- ((HbmExporter)getWrappedObject()).start();
- }
-
- default File getOutputDirectory() {
- return (File)((HbmExporter)getWrappedObject()).getProperties().get(ExporterConstants.DESTINATION_FOLDER);
- }
-
- default void setOutputDirectory(File f) {
- ((HbmExporter)getWrappedObject()).getProperties().put(ExporterConstants.DESTINATION_FOLDER, f);
- }
-
- default void exportPOJO(Map