diff --git a/tooling/hibernate-ant/src/main/java/org/hibernate/tool/ant/Hbm2JavaExporterTask.java b/tooling/hibernate-ant/src/main/java/org/hibernate/tool/ant/Hbm2JavaExporterTask.java index 02027228de1d..4a41014c5aab 100644 --- a/tooling/hibernate-ant/src/main/java/org/hibernate/tool/ant/Hbm2JavaExporterTask.java +++ b/tooling/hibernate-ant/src/main/java/org/hibernate/tool/ant/Hbm2JavaExporterTask.java @@ -18,6 +18,8 @@ public class Hbm2JavaExporterTask extends ExporterTask { boolean jdk5 = true; + boolean useSchemaAnnotations = false; + public Hbm2JavaExporterTask(HibernateToolTask parent) { super( parent ); } @@ -30,10 +32,19 @@ public void setJdk5(boolean b) { jdk5 = b; } + public void setUseSchemaAnnotations(boolean b) { + useSchemaAnnotations = b; + } + + public void setSchemaPackage(String schemaPackage) { + properties.put( "schemaPackage", schemaPackage ); + } + protected Exporter configureExporter(Exporter exp) { super.configureExporter( exp ); exp.getProperties().setProperty("ejb3", ""+ejb3); exp.getProperties().setProperty("jdk5", ""+jdk5); + exp.getProperties().setProperty("useSchemaAnnotations", ""+useSchemaAnnotations); return exp; } diff --git a/tooling/hibernate-ant/src/main/java/org/hibernate/tool/ant/HibernateToolTask.java b/tooling/hibernate-ant/src/main/java/org/hibernate/tool/ant/HibernateToolTask.java index 5d73ff9c9fef..886dfd7c7b1a 100644 --- a/tooling/hibernate-ant/src/main/java/org/hibernate/tool/ant/HibernateToolTask.java +++ b/tooling/hibernate-ant/src/main/java/org/hibernate/tool/ant/HibernateToolTask.java @@ -129,6 +129,12 @@ public HbmLintExporterTask createHbmLint() { return generator; } + public ExporterTask createSchemaAnnotations() { + ExporterTask generator = new SchemaAnnotationExporterTask(this); + addGenerator( generator ); + return generator; + } + /** * Set the classpath to be used when running the Java class diff --git a/tooling/hibernate-ant/src/main/java/org/hibernate/tool/ant/SchemaAnnotationExporterTask.java b/tooling/hibernate-ant/src/main/java/org/hibernate/tool/ant/SchemaAnnotationExporterTask.java new file mode 100644 index 000000000000..e48883cca30c --- /dev/null +++ b/tooling/hibernate-ant/src/main/java/org/hibernate/tool/ant/SchemaAnnotationExporterTask.java @@ -0,0 +1,28 @@ +/* + * SPDX-License-Identifier: Apache-2.0 + * Copyright Red Hat Inc. and Hibernate Authors + */ +package org.hibernate.tool.ant; + +import org.hibernate.tool.reveng.api.export.Exporter; +import org.hibernate.tool.reveng.api.export.ExporterFactory; +import org.hibernate.tool.reveng.api.export.ExporterType; + +public class SchemaAnnotationExporterTask extends ExporterTask { + + public SchemaAnnotationExporterTask(HibernateToolTask parent) { + super( parent ); + } + + public void setSchemaPackage(String schemaPackage) { + properties.put( "schemaPackage", schemaPackage ); + } + + protected Exporter createExporter() { + return ExporterFactory.createExporter(ExporterType.SCHEMA); + } + + String getName() { + return "schemaAnnotations (Generates schema annotation classes)"; + } +} diff --git a/tooling/hibernate-ant/src/test/java/org/hibernate/tool/ant/SchemaAnnotationExporterTaskTest.java b/tooling/hibernate-ant/src/test/java/org/hibernate/tool/ant/SchemaAnnotationExporterTaskTest.java new file mode 100644 index 000000000000..38abb0b1239b --- /dev/null +++ b/tooling/hibernate-ant/src/test/java/org/hibernate/tool/ant/SchemaAnnotationExporterTaskTest.java @@ -0,0 +1,27 @@ +/* + * SPDX-License-Identifier: Apache-2.0 + * Copyright Red Hat Inc. and Hibernate Authors + */ +package org.hibernate.tool.ant; + +import org.junit.jupiter.api.Test; + +import static org.junit.jupiter.api.Assertions.assertEquals; + +public class SchemaAnnotationExporterTaskTest { + + @Test + public void testGetName() { + HibernateToolTask parent = new HibernateToolTask(); + SchemaAnnotationExporterTask task = new SchemaAnnotationExporterTask(parent); + assertEquals("schemaAnnotations (Generates schema annotation classes)", task.getName()); + } + + @Test + public void testSetSchemaPackage() { + HibernateToolTask parent = new HibernateToolTask(); + SchemaAnnotationExporterTask task = new SchemaAnnotationExporterTask(parent); + task.setSchemaPackage("org.example.schema"); + assertEquals("org.example.schema", task.properties.get("schemaPackage")); + } +} diff --git a/tooling/hibernate-ant/src/test/java/org/hibernate/tool/ant/SchemaAnnotationTestIT.java b/tooling/hibernate-ant/src/test/java/org/hibernate/tool/ant/SchemaAnnotationTestIT.java new file mode 100644 index 000000000000..05a22da2222b --- /dev/null +++ b/tooling/hibernate-ant/src/test/java/org/hibernate/tool/ant/SchemaAnnotationTestIT.java @@ -0,0 +1,82 @@ +/* + * SPDX-License-Identifier: Apache-2.0 + * Copyright Red Hat Inc. and Hibernate Authors + */ +package org.hibernate.tool.ant; + +import org.junit.jupiter.api.Test; + +import static org.junit.jupiter.api.Assertions.assertFalse; +import static org.junit.jupiter.api.Assertions.assertTrue; + +public class SchemaAnnotationTestIT extends TestTemplate { + + @Test + public void testGenerateSchemaAnnotations() throws Exception { + setHibernateToolTaskXml( + """ + \s + \s + \s + \s + """ + ); + 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"); + assertFileExists("generated/ITEM.java"); + String personContents = getFileContents("generated/PERSON.java"); + assertTrue(personContents.contains("@TableMapping")); + assertTrue(personContents.contains("@ColumnMapping")); + String itemContents = getFileContents("generated/ITEM.java"); + assertTrue(itemContents.contains("@TableMapping")); + assertTrue(itemContents.contains("@JoinColumnMapping")); + } + + @Test + public void testGenerateSchemaAnnotationsWithPackage() throws Exception { + setHibernateToolTaskXml( + """ + \s + \s + \s + \s + """ + ); + setDatabaseCreationScript(new String[] { + "create table PERSON (ID int not null, NAME varchar(20), primary key (ID))" + }); + createProjectAndBuild(); + assertFolderExists("generated/org/example/schema", 1); + assertFileExists("generated/org/example/schema/PERSON.java"); + String personContents = getFileContents("generated/org/example/schema/PERSON.java"); + assertTrue(personContents.contains("package org.example.schema;")); + assertTrue(personContents.contains("@TableMapping")); + } + + @Test + public void testGenerateSchemaAnnotationsWithoutPackage() throws Exception { + setHibernateToolTaskXml( + """ + \s + \s + \s + \s + """ + ); + setDatabaseCreationScript(new String[] { + "create table PERSON (ID int not null, NAME varchar(20), primary key (ID))" + }); + createProjectAndBuild(); + assertFileExists("generated/PERSON.java"); + String personContents = getFileContents("generated/PERSON.java"); + assertFalse(personContents.contains("package ")); + assertTrue(personContents.contains("@TableMapping")); + } + +} diff --git a/tooling/hibernate-gradle-plugin/src/main/java/org/hibernate/orm/tooling/gradle/reveng/GenerateJavaTask.java b/tooling/hibernate-gradle-plugin/src/main/java/org/hibernate/orm/tooling/gradle/reveng/GenerateJavaTask.java index dde4704a7050..3849c9c6b0cf 100644 --- a/tooling/hibernate-gradle-plugin/src/main/java/org/hibernate/orm/tooling/gradle/reveng/GenerateJavaTask.java +++ b/tooling/hibernate-gradle-plugin/src/main/java/org/hibernate/orm/tooling/gradle/reveng/GenerateJavaTask.java @@ -26,6 +26,10 @@ void doWork() { Exporter pojoExporter = ExporterFactory.createExporter(ExporterType.JAVA); pojoExporter.getProperties().setProperty("ejb3", String.valueOf(getRevengSpec().generateAnnotations)); pojoExporter.getProperties().setProperty("jdk5", String.valueOf(getRevengSpec().useGenerics)); + pojoExporter.getProperties().setProperty("useSchemaAnnotations", String.valueOf(getRevengSpec().useSchemaAnnotations)); + if (getRevengSpec().schemaPackage != null) { + pojoExporter.getProperties().put("schemaPackage", getRevengSpec().schemaPackage); + } File outputFolder = getOutputFolder(); pojoExporter.getProperties().put(ExporterConstants.METADATA_DESCRIPTOR, createJdbcDescriptor()); pojoExporter.getProperties().put(ExporterConstants.DESTINATION_FOLDER, outputFolder); diff --git a/tooling/hibernate-gradle-plugin/src/main/java/org/hibernate/orm/tooling/gradle/reveng/GenerateSchemaAnnotationsTask.java b/tooling/hibernate-gradle-plugin/src/main/java/org/hibernate/orm/tooling/gradle/reveng/GenerateSchemaAnnotationsTask.java index 68a1ce438592..4e1a48cd0b2e 100644 --- a/tooling/hibernate-gradle-plugin/src/main/java/org/hibernate/orm/tooling/gradle/reveng/GenerateSchemaAnnotationsTask.java +++ b/tooling/hibernate-gradle-plugin/src/main/java/org/hibernate/orm/tooling/gradle/reveng/GenerateSchemaAnnotationsTask.java @@ -4,6 +4,13 @@ */ package org.hibernate.orm.tooling.gradle.reveng; +import java.io.File; +import java.io.IOException; +import java.net.MalformedURLException; +import java.net.URL; +import java.net.URLClassLoader; +import java.util.Properties; + import org.apache.tools.ant.BuildException; import org.gradle.api.DefaultTask; import org.gradle.api.GradleException; @@ -11,48 +18,22 @@ import org.gradle.api.file.DirectoryProperty; import org.gradle.api.provider.Property; import org.gradle.api.tasks.Input; -import org.gradle.api.tasks.Internal; import org.gradle.api.tasks.Optional; import org.gradle.api.tasks.OutputDirectory; import org.gradle.api.tasks.TaskAction; import org.gradle.work.DisableCachingByDefault; -import org.hibernate.mapping.ForeignKey; import org.hibernate.tool.reveng.api.core.RevengSettings; import org.hibernate.tool.reveng.api.core.RevengStrategy; import org.hibernate.tool.reveng.api.core.RevengStrategyFactory; -import org.hibernate.tool.reveng.api.core.TableIdentifier; +import org.hibernate.tool.reveng.api.export.Exporter; +import org.hibernate.tool.reveng.api.export.ExporterConstants; +import org.hibernate.tool.reveng.api.export.ExporterFactory; +import org.hibernate.tool.reveng.api.export.ExporterType; +import org.hibernate.tool.reveng.api.metadata.MetadataConstants; +import org.hibernate.tool.reveng.api.metadata.MetadataDescriptor; +import org.hibernate.tool.reveng.api.metadata.MetadataDescriptorFactory; +import org.hibernate.tool.reveng.internal.core.strategy.TableSelectorStrategy; -import java.io.File; -import java.io.IOException; -import java.lang.reflect.Proxy; -import java.net.MalformedURLException; -import java.net.URL; -import java.net.URLClassLoader; -import java.nio.file.Files; -import java.nio.file.Path; -import java.sql.Connection; -import java.sql.DatabaseMetaData; -import java.sql.Driver; -import java.sql.DriverManager; -import java.sql.JDBCType; -import java.sql.ResultSet; -import java.sql.SQLException; -import java.util.ArrayList; -import java.util.Comparator; -import java.util.HashMap; -import java.util.HashSet; -import java.util.List; -import java.util.Locale; -import java.util.Map; -import java.util.Objects; -import java.util.Properties; -import java.util.Set; - -import static java.lang.Character.isJavaIdentifierPart; -import static java.lang.Character.isJavaIdentifierStart; -import static java.lang.System.lineSeparator; -import static java.nio.charset.StandardCharsets.UTF_8; -import static java.util.Comparator.comparingInt; import static org.hibernate.orm.tooling.gradle.reveng.RevengFileHelper.findRequiredResourceFile; import static org.hibernate.orm.tooling.gradle.reveng.RevengFileHelper.loadPropertiesFile; @@ -85,8 +66,7 @@ * {@code build/generated/sources/schemaAnnotations/org/example/schema/BOOK.java}. *

* The task can read JDBC configuration from a {@code hibernate.properties} file in the main resource - * set. Direct task properties override values read from {@code hibernate.properties}. - * A Hibernate Tools reverse-engineering file can be used for schema selection, table filters, + * set. A Hibernate Tools reverse-engineering file can be used for schema selection, table filters, * table exclusions, column exclusions, and user-defined foreign keys. *