HHH-15558 - Hibernate's Gradle plugin does not work with three-part source set names

This commit is contained in:
Steve Ebersole 2022-10-18 09:18:19 -05:00
parent 0baefce734
commit 5cf5f5adbd
15 changed files with 514 additions and 274 deletions

View File

@ -6,6 +6,8 @@
*/ */
package org.hibernate.orm.tooling.gradle; package org.hibernate.orm.tooling.gradle;
import java.util.Set;
import org.gradle.api.Action; import org.gradle.api.Action;
import org.gradle.api.Plugin; import org.gradle.api.Plugin;
import org.gradle.api.Project; import org.gradle.api.Project;
@ -22,7 +24,6 @@ import org.gradle.api.tasks.compile.JavaCompile;
import org.hibernate.orm.tooling.gradle.enhance.EnhancementHelper; import org.hibernate.orm.tooling.gradle.enhance.EnhancementHelper;
import org.hibernate.orm.tooling.gradle.metamodel.JpaMetamodelGenerationTask; import org.hibernate.orm.tooling.gradle.metamodel.JpaMetamodelGenerationTask;
import static org.hibernate.orm.tooling.gradle.Helper.determineCompileSourceSetName;
import static org.hibernate.orm.tooling.gradle.HibernateOrmSpec.HIBERNATE; import static org.hibernate.orm.tooling.gradle.HibernateOrmSpec.HIBERNATE;
import static org.hibernate.orm.tooling.gradle.metamodel.JpaMetamodelGenerationTask.COMPILE_META_TASK_NAME; import static org.hibernate.orm.tooling.gradle.metamodel.JpaMetamodelGenerationTask.COMPILE_META_TASK_NAME;
import static org.hibernate.orm.tooling.gradle.metamodel.JpaMetamodelGenerationTask.GEN_TASK_NAME; import static org.hibernate.orm.tooling.gradle.metamodel.JpaMetamodelGenerationTask.GEN_TASK_NAME;
@ -60,28 +61,30 @@ public class HibernateOrmPlugin implements Plugin<Project> {
return; return;
} }
graph.getAllTasks().forEach( (task) -> { final SourceSet sourceSet = ormDsl.getSourceSet().get();
if ( task instanceof AbstractCompile ) { final Set<String> languages = ormDsl.getLanguages().getOrNull();
final SourceSet sourceSetLocal = ormDsl.getSourceSet().get(); if ( languages == null ) {
return;
}
final String compiledSourceSetName = determineCompileSourceSetName( task.getName() ); for ( String language : languages ) {
if ( !sourceSetLocal.getName().equals( compiledSourceSetName ) ) { final String languageCompileTaskName = sourceSet.getCompileTaskName( language );
return; final AbstractCompile languageCompileTask = (AbstractCompile) project.getTasks().findByName( languageCompileTaskName );
} if ( languageCompileTask == null ) {
continue;
final AbstractCompile compileTask = (AbstractCompile) task;
//noinspection Convert2Lambda,NullableProblems
task.doLast( new Action<>() {
@Override
public void execute(Task t) {
final DirectoryProperty classesDirectory = compileTask.getDestinationDirectory();
final ClassLoader classLoader = Helper.toClassLoader( sourceSetLocal.getOutput().getClassesDirs() );
EnhancementHelper.enhance( classesDirectory, classLoader, ormDsl, project );
}
} );
} }
} );
//noinspection Convert2Lambda
languageCompileTask.doLast( new Action<>() {
@Override
public void execute(Task t) {
final DirectoryProperty classesDirectory = languageCompileTask.getDestinationDirectory();
final ClassLoader classLoader = Helper.toClassLoader( sourceSet.getOutput().getClassesDirs() );
EnhancementHelper.enhance( classesDirectory, classLoader, ormDsl, project );
}
} );
}
} ); } );
} }

View File

@ -6,6 +6,7 @@
*/ */
package org.hibernate.orm.tooling.gradle; package org.hibernate.orm.tooling.gradle;
import java.util.Arrays;
import javax.inject.Inject; import javax.inject.Inject;
import org.gradle.api.Action; import org.gradle.api.Action;
@ -15,6 +16,7 @@ import org.gradle.api.plugins.ExtensionContainer;
import org.gradle.api.plugins.JavaPluginExtension; import org.gradle.api.plugins.JavaPluginExtension;
import org.gradle.api.provider.Property; import org.gradle.api.provider.Property;
import org.gradle.api.provider.Provider; import org.gradle.api.provider.Provider;
import org.gradle.api.provider.SetProperty;
import org.gradle.api.tasks.SourceSet; import org.gradle.api.tasks.SourceSet;
import org.hibernate.orm.tooling.gradle.enhance.EnhancementSpec; import org.hibernate.orm.tooling.gradle.enhance.EnhancementSpec;
@ -35,6 +37,7 @@ public abstract class HibernateOrmSpec implements ExtensionAware {
private final Property<Boolean> useSameVersion; private final Property<Boolean> useSameVersion;
private final Property<SourceSet> sourceSet; private final Property<SourceSet> sourceSet;
private final SetProperty<String> languages;
private final Provider<EnhancementSpec> enhancementDslAccess; private final Provider<EnhancementSpec> enhancementDslAccess;
private final Provider<JpaMetamodelGenerationSpec> jpaMetamodelDslAccess; private final Provider<JpaMetamodelGenerationSpec> jpaMetamodelDslAccess;
@ -50,6 +53,9 @@ public abstract class HibernateOrmSpec implements ExtensionAware {
sourceSet = project.getObjects().property( SourceSet.class ); sourceSet = project.getObjects().property( SourceSet.class );
sourceSet.convention( mainSourceSet( project ) ); sourceSet.convention( mainSourceSet( project ) );
languages = project.getObjects().setProperty( String.class );
languages.convention( Arrays.asList( "java", "kotlin" ) );
enhancementDslAccess = project.provider( () -> enhancementDsl ); enhancementDslAccess = project.provider( () -> enhancementDsl );
jpaMetamodelDslAccess = project.provider( () -> jpaMetamodelDsl ); jpaMetamodelDslAccess = project.provider( () -> jpaMetamodelDsl );
} }
@ -125,6 +131,21 @@ public abstract class HibernateOrmSpec implements ExtensionAware {
setSourceSet( sourceSet ); setSourceSet( sourceSet );
} }
/**
* The languages used in the project
*/
public SetProperty<String> getLanguages() {
return languages;
}
public void setLanguages(Iterable<String> languages) {
this.languages.set( languages );
}
public void languages(String language) {
this.languages.add( language );
}
/** /**
* DSL extension for configuring bytecode enhancement. Also acts as the trigger for * DSL extension for configuring bytecode enhancement. Also acts as the trigger for
* opting into bytecode enhancement * opting into bytecode enhancement

View File

@ -6,147 +6,59 @@
*/ */
package org.hibernate.orm.tooling.gradle; package org.hibernate.orm.tooling.gradle;
import java.io.File;
import java.nio.file.Path; import java.nio.file.Path;
import org.gradle.testkit.runner.BuildResult;
import org.gradle.testkit.runner.BuildTask;
import org.gradle.testkit.runner.GradleRunner;
import org.gradle.testkit.runner.TaskOutcome;
import org.junit.jupiter.api.Test; import org.junit.jupiter.api.Test;
import org.junit.jupiter.api.io.TempDir; import org.junit.jupiter.api.io.TempDir;
import static org.assertj.core.api.AssertionsForClassTypes.assertThat;
/** /**
* Basic functional tests * Basic functional tests
* *
* @author Steve Ebersole * @author Steve Ebersole
*/ */
class JavaProjectTests { class JavaProjectTests extends TestsBase {
@Override
protected String getProjectName() {
return "simple";
}
@Override
protected String getSourceSetName() {
return "main";
}
@Override
protected String getLanguageName() {
return "java";
}
@Override
protected String getCompileTaskName() {
return "compileJava";
}
@Test @Test
@Override
public void testEnhancement(@TempDir Path projectDir) throws Exception { public void testEnhancement(@TempDir Path projectDir) throws Exception {
Copier.copyProject( "simple/build.gradle", projectDir ); super.testEnhancement( projectDir );
System.out.println( "First execution ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~" );
final GradleRunner gradleRunner = GradleRunner.create()
.withProjectDir( projectDir.toFile() )
.withPluginClasspath()
.withDebug( true )
.withArguments( "clean", "compileJava", "--stacktrace", "--no-build-cache" )
.forwardOutput();
final BuildResult result = gradleRunner.build();
final BuildTask task = result.task( ":compileJava" );
assertThat( task ).isNotNull();
assertThat( task.getOutcome() ).isEqualTo( TaskOutcome.SUCCESS );
// make sure the class is enhanced
final File classesDir = new File( projectDir.toFile(), "build/classes/java/main" );
final ClassLoader classLoader = Helper.toClassLoader( classesDir );
TestHelper.verifyEnhanced( classLoader, "TheEmbeddable" );
TestHelper.verifyEnhanced( classLoader, "TheEntity" );
} }
@Test @Test
@Override
public void testEnhancementUpToDate(@TempDir Path projectDir) throws Exception { public void testEnhancementUpToDate(@TempDir Path projectDir) throws Exception {
Copier.copyProject( "simple/build.gradle", projectDir ); super.testEnhancementUpToDate( projectDir );
{
System.out.println( "First execution ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~" );
final GradleRunner gradleRunner = GradleRunner.create()
.withProjectDir( projectDir.toFile() )
.withPluginClasspath()
.withDebug( true )
.withArguments( "clean", "compileJava", "--stacktrace", "--no-build-cache" )
.forwardOutput();
final BuildResult result = gradleRunner.build();
final BuildTask task = result.task( ":compileJava" );
assertThat( task ).isNotNull();
assertThat( task.getOutcome() ).isEqualTo( TaskOutcome.SUCCESS );
// make sure the class is enhanced
final File classesDir = new File( projectDir.toFile(), "build/classes/java/main" );
final ClassLoader classLoader = Helper.toClassLoader( classesDir );
TestHelper.verifyEnhanced( classLoader, "TheEntity" );
}
{
System.out.println( "Second execution ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~" );
final GradleRunner gradleRunner = GradleRunner.create()
.withProjectDir( projectDir.toFile() )
.withPluginClasspath()
.withDebug( true )
.withArguments( "compileJava", "--stacktrace", "--no-build-cache" )
.forwardOutput();
final BuildResult result = gradleRunner.build();
final BuildTask task = result.task( ":compileJava" );
assertThat( task ).isNotNull();
assertThat( task.getOutcome() ).isEqualTo( TaskOutcome.UP_TO_DATE );
// and again
final File classesDir = new File( projectDir.toFile(), "build/classes/java/main" );
final ClassLoader classLoader = Helper.toClassLoader( classesDir );
TestHelper.verifyEnhanced( classLoader, "TheEntity" );
}
} }
@Test @Test
@Override
public void testJpaMetamodelGen(@TempDir Path projectDir) { public void testJpaMetamodelGen(@TempDir Path projectDir) {
Copier.copyProject( "simple/build.gradle", projectDir ); super.testJpaMetamodelGen( projectDir );
final GradleRunner gradleRunner = GradleRunner.create()
.withProjectDir( projectDir.toFile() )
.withPluginClasspath()
.withDebug( true )
.withArguments( "clean", "generateJpaMetamodel", "--stacktrace", "--no-build-cache" )
.forwardOutput();
final BuildResult result = gradleRunner.build();
final BuildTask task = result.task( ":generateJpaMetamodel" );
assertThat( task ).isNotNull();
assertThat( task.getOutcome() ).isEqualTo( TaskOutcome.SUCCESS );
assertThat( new File( projectDir.toFile(), "build/classes/java/jpaMetamodel" ) ).exists();
} }
@Test @Test
public void testJpaMetamodelGenUpToDate(@TempDir Path projectDir) { public void testJpaMetamodelGenUpToDate(@TempDir Path projectDir) {
Copier.copyProject( "simple/build.gradle", projectDir ); super.testJpaMetamodelGenUpToDate( projectDir );
{
System.out.println( "First execution ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~" );
final GradleRunner gradleRunner = GradleRunner.create()
.withProjectDir( projectDir.toFile() )
.withPluginClasspath()
.withDebug( true )
.withArguments( "clean", "generateJpaMetamodel", "--stacktrace", "--no-build-cache" )
.forwardOutput();
final BuildResult result = gradleRunner.build();
final BuildTask task = result.task( ":generateJpaMetamodel" );
assertThat( task ).isNotNull();
assertThat( task.getOutcome() ).isEqualTo( TaskOutcome.SUCCESS );
assertThat( new File( projectDir.toFile(), "build/classes/java/jpaMetamodel" ) ).exists();
}
{
System.out.println( "Second execution ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~" );
final GradleRunner gradleRunner2 = GradleRunner.create()
.withProjectDir( projectDir.toFile() )
.withPluginClasspath()
.withDebug( true )
.withArguments( "generateJpaMetamodel", "--stacktrace", "--no-build-cache" )
.forwardOutput();
final BuildResult result2 = gradleRunner2.build();
final BuildTask task2 = result2.task( ":generateJpaMetamodel" );
assertThat( task2 ).isNotNull();
assertThat( task2.getOutcome() ).isEqualTo( TaskOutcome.UP_TO_DATE );
assertThat( new File( projectDir.toFile(), "build/classes/java/jpaMetamodel" ) ).exists();
}
} }
} }

View File

@ -6,145 +6,57 @@
*/ */
package org.hibernate.orm.tooling.gradle; package org.hibernate.orm.tooling.gradle;
import java.io.File;
import java.nio.file.Path; import java.nio.file.Path;
import org.gradle.testkit.runner.BuildResult;
import org.gradle.testkit.runner.BuildTask;
import org.gradle.testkit.runner.GradleRunner;
import org.gradle.testkit.runner.TaskOutcome;
import org.junit.jupiter.api.Test; import org.junit.jupiter.api.Test;
import org.junit.jupiter.api.io.TempDir; import org.junit.jupiter.api.io.TempDir;
import static org.assertj.core.api.AssertionsForClassTypes.assertThat;
import static org.hibernate.orm.tooling.gradle.TestHelper.verifyEnhanced;
/** /**
* @author Steve Ebersole * @author Steve Ebersole
*/ */
public class KotlinProjectTests { public class KotlinProjectTests extends TestsBase {
@Test @Override
public void testEnhanceModel(@TempDir Path projectDir) throws Exception { protected String getProjectName() {
Copier.copyProject( "simple-kotlin/build.gradle", projectDir ); return "simple-kotlin";
}
final GradleRunner gradleRunner = GradleRunner.create() @Override
.withProjectDir( projectDir.toFile() ) protected String getSourceSetName() {
.withPluginClasspath() return "main";
.withDebug( true ) }
.withArguments( "clean", "compileKotlin", "--stacktrace", "--no-build-cache" )
.forwardOutput();
final BuildResult result = gradleRunner.build(); @Override
final BuildTask task = result.task( ":compileKotlin" ); protected String getLanguageName() {
assertThat( task ).isNotNull(); return "kotlin";
assertThat( task.getOutcome() ).isEqualTo( TaskOutcome.SUCCESS ); }
// make sure the class is enhanced @Override
final File classesDir = new File( projectDir.toFile(), "build/classes/kotlin/main" ); protected String getCompileTaskName() {
final ClassLoader classLoader = Helper.toClassLoader( classesDir ); return "compileKotlin";
verifyEnhanced( classLoader, "TheEntity" );
} }
@Test @Test
public void testEnhanceModelUpToDate(@TempDir Path projectDir) throws Exception { @Override
Copier.copyProject( "simple-kotlin/build.gradle", projectDir ); public void testEnhancement(@TempDir Path projectDir) throws Exception {
super.testEnhancement( projectDir );
{
System.out.println( "First execution ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~" );
final GradleRunner gradleRunner = GradleRunner.create()
.withProjectDir( projectDir.toFile() )
.withPluginClasspath()
.withDebug( true )
.withArguments( "clean", "compileKotlin", "--stacktrace", "--no-build-cache" )
.forwardOutput();
final BuildResult result = gradleRunner.build();
final BuildTask task = result.task( ":compileKotlin" );
assertThat( task ).isNotNull();
assertThat( task.getOutcome() ).isEqualTo( TaskOutcome.SUCCESS );
// make sure the class is enhanced
final File classesDir = new File( projectDir.toFile(), "build/classes/kotlin/main" );
final ClassLoader classLoader = Helper.toClassLoader( classesDir );
verifyEnhanced( classLoader, "TheEntity" );
}
{
System.out.println( "Second execution ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~" );
final GradleRunner gradleRunner = GradleRunner.create()
.withProjectDir( projectDir.toFile() )
.withPluginClasspath()
.withDebug( true )
.withArguments( "compileKotlin", "--stacktrace", "--no-build-cache" )
.forwardOutput();
final BuildResult result = gradleRunner.build();
final BuildTask task = result.task( ":compileKotlin" );
assertThat( task ).isNotNull();
assertThat( task.getOutcome() ).isEqualTo( TaskOutcome.UP_TO_DATE );
// make sure the class is enhanced
final File classesDir = new File( projectDir.toFile(), "build/classes/kotlin/main" );
final ClassLoader classLoader = Helper.toClassLoader( classesDir );
verifyEnhanced( classLoader, "TheEntity" );
}
} }
@Test @Test
@Override
public void testEnhancementUpToDate(@TempDir Path projectDir) throws Exception {
super.testEnhancementUpToDate( projectDir );
}
@Test
@Override
public void testJpaMetamodelGen(@TempDir Path projectDir) { public void testJpaMetamodelGen(@TempDir Path projectDir) {
Copier.copyProject( "simple-kotlin/build.gradle", projectDir ); super.testJpaMetamodelGen( projectDir );
final GradleRunner gradleRunner = GradleRunner.create()
.withProjectDir( projectDir.toFile() )
.withPluginClasspath()
.withDebug( true )
.withArguments( "clean", "generateJpaMetamodel", "--stacktrace", "--no-build-cache" )
.forwardOutput();
final BuildResult result = gradleRunner.build();
final BuildTask task = result.task( ":generateJpaMetamodel" );
assertThat( task ).isNotNull();
assertThat( task.getOutcome() ).isEqualTo( TaskOutcome.SUCCESS );
assertThat( new File( projectDir.toFile(), "build/classes/java/jpaMetamodel" ) ).exists();
} }
@Test @Test
@Override
public void testJpaMetamodelGenUpToDate(@TempDir Path projectDir) { public void testJpaMetamodelGenUpToDate(@TempDir Path projectDir) {
Copier.copyProject( "simple-kotlin/build.gradle", projectDir ); super.testJpaMetamodelGenUpToDate( projectDir );
{
System.out.println( "First execution ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~" );
final GradleRunner gradleRunner = GradleRunner.create()
.withProjectDir( projectDir.toFile() )
.withPluginClasspath()
.withDebug( true )
.withArguments( "clean", "generateJpaMetamodel", "--stacktrace", "--no-build-cache" )
.forwardOutput();
final BuildResult result = gradleRunner.build();
final BuildTask task = result.task( ":generateJpaMetamodel" );
assertThat( task ).isNotNull();
assertThat( task.getOutcome() ).isEqualTo( TaskOutcome.SUCCESS );
assertThat( new File( projectDir.toFile(), "build/classes/java/jpaMetamodel" ) ).exists();
}
{
System.out.println( "Second execution ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~" );
final GradleRunner gradleRunner2 = GradleRunner.create()
.withProjectDir( projectDir.toFile() )
.withPluginClasspath()
.withDebug( true )
.withArguments( "generateJpaMetamodel", "--stacktrace", "--no-build-cache" )
.forwardOutput();
final BuildResult result2 = gradleRunner2.build();
final BuildTask task2 = result2.task( ":generateJpaMetamodel" );
assertThat( task2 ).isNotNull();
assertThat( task2.getOutcome() ).isEqualTo( TaskOutcome.UP_TO_DATE );
assertThat( new File( projectDir.toFile(), "build/classes/java/jpaMetamodel" ) ).exists();
}
} }
} }

View File

@ -0,0 +1,53 @@
package org.hibernate.orm.tooling.gradle;
import java.nio.file.Path;
import org.junit.jupiter.api.Test;
import org.junit.jupiter.api.io.TempDir;
/**
* @author Steve Ebersole
*/
public class MultiPartNameTests extends TestsBase {
@Override
protected String getProjectName() {
return "multi-part-source-set-name";
}
@Override
protected String getSourceSetName() {
return "mySpecialSourceSet";
}
@Override
protected String getLanguageName() {
return "java";
}
@Override
protected String getCompileTaskName() {
return "compileMySpecialSourceSetJava";
}
@Test
@Override
public void testEnhancement(@TempDir Path projectDir) throws Exception {
super.testEnhancement( projectDir );
}
@Test
public void testEnhancementUpToDate(@TempDir Path projectDir) throws Exception {
super.testEnhancementUpToDate( projectDir );
}
@Test
public void testJpaMetamodelGen(@TempDir Path projectDir) {
super.testJpaMetamodelGen( projectDir );
}
@Test
public void testJpaMetamodelGenUpToDate(@TempDir Path projectDir) {
super.testJpaMetamodelGenUpToDate( projectDir );
}
}

View File

@ -6,26 +6,14 @@
*/ */
package org.hibernate.orm.tooling.gradle; package org.hibernate.orm.tooling.gradle;
import org.gradle.testkit.runner.TaskOutcome;
import org.hibernate.engine.spi.Managed; import org.hibernate.engine.spi.Managed;
import org.assertj.core.api.Condition;
import static org.assertj.core.api.AssertionsForClassTypes.assertThat; import static org.assertj.core.api.AssertionsForClassTypes.assertThat;
/** /**
* @author Steve Ebersole * @author Steve Ebersole
*/ */
public class TestHelper { public class TestHelper {
private static final Condition<TaskOutcome> SUCCESS = new Condition<>(
(taskOutcome) -> taskOutcome == TaskOutcome.SUCCESS,
"task succeeded"
);
private static final Condition<TaskOutcome> UP_TO_DATE = new Condition<>(
(taskOutcome) -> taskOutcome == TaskOutcome.UP_TO_DATE,
"task up-to-date"
);
public static void verifyEnhanced(ClassLoader classLoader, String className) throws Exception { public static void verifyEnhanced(ClassLoader classLoader, String className) throws Exception {
final Class<?> loadedClass = classLoader.loadClass( className ); final Class<?> loadedClass = classLoader.loadClass( className );

View File

@ -0,0 +1,160 @@
package org.hibernate.orm.tooling.gradle;
import java.io.File;
import java.nio.file.Path;
import org.gradle.testkit.runner.BuildResult;
import org.gradle.testkit.runner.BuildTask;
import org.gradle.testkit.runner.GradleRunner;
import org.gradle.testkit.runner.TaskOutcome;
import org.junit.jupiter.api.Test;
import org.junit.jupiter.api.io.TempDir;
import static org.assertj.core.api.AssertionsForClassTypes.assertThat;
/**
* @author Steve Ebersole
*/
public abstract class TestsBase {
protected abstract String getProjectName();
protected abstract String getSourceSetName();
protected abstract String getLanguageName();
protected abstract String getCompileTaskName();
public void testEnhancement(Path projectDir) throws Exception {
final String buildFilePath = getProjectName() + "/build.gradle";
final String sourceSetName = getSourceSetName();
final String compileTaskName = getCompileTaskName();
final File classesDir = new File( projectDir.toFile(), "build/classes/" + getLanguageName() + "/" + sourceSetName );
Copier.copyProject( buildFilePath, projectDir );
System.out.println( "Starting execution ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~" );
final GradleRunner gradleRunner = GradleRunner.create()
.withProjectDir( projectDir.toFile() )
.withPluginClasspath()
.withDebug( true )
.withArguments( "clean", compileTaskName, "--stacktrace", "--no-build-cache" )
.forwardOutput();
final BuildResult result = gradleRunner.build();
final BuildTask task = result.task( ":" + compileTaskName );
assertThat( task ).isNotNull();
assertThat( task.getOutcome() ).isEqualTo( TaskOutcome.SUCCESS );
// make sure the class is enhanced
final ClassLoader classLoader = Helper.toClassLoader( classesDir );
TestHelper.verifyEnhanced( classLoader, "TheEmbeddable" );
TestHelper.verifyEnhanced( classLoader, "TheEntity" );
}
@Test
public void testEnhancementUpToDate(Path projectDir) throws Exception {
final String buildFilePath = getProjectName() + "/build.gradle";
final String sourceSetName = getSourceSetName();
final String compileTaskName = getCompileTaskName();
final File classesDir = new File( projectDir.toFile(), "build/classes/" + getLanguageName() + "/" + sourceSetName );
Copier.copyProject( buildFilePath, projectDir );
{
System.out.println( "Starting first execution ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~" );
final GradleRunner gradleRunner = GradleRunner.create()
.withProjectDir( projectDir.toFile() )
.withPluginClasspath()
.withDebug( true )
.withArguments( "clean", compileTaskName, "--stacktrace", "--no-build-cache" )
.forwardOutput();
final BuildResult result = gradleRunner.build();
final BuildTask task = result.task( ":" + compileTaskName );
assertThat( task ).isNotNull();
assertThat( task.getOutcome() ).isEqualTo( TaskOutcome.SUCCESS );
// make sure the class is enhanced
final ClassLoader classLoader = Helper.toClassLoader( classesDir );
TestHelper.verifyEnhanced( classLoader, "TheEntity" );
}
{
System.out.println( "Starting second execution ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~" );
final GradleRunner gradleRunner = GradleRunner.create()
.withProjectDir( projectDir.toFile() )
.withPluginClasspath()
.withDebug( true )
.withArguments( compileTaskName, "--stacktrace", "--no-build-cache" )
.forwardOutput();
final BuildResult result = gradleRunner.build();
final BuildTask task = result.task( ":" + compileTaskName );
assertThat( task ).isNotNull();
assertThat( task.getOutcome() ).isEqualTo( TaskOutcome.UP_TO_DATE );
// and again
final ClassLoader classLoader = Helper.toClassLoader( classesDir );
TestHelper.verifyEnhanced( classLoader, "TheEntity" );
}
}
@Test
public void testJpaMetamodelGen(@TempDir Path projectDir) {
final String buildFilePath = getProjectName() + "/build.gradle";
Copier.copyProject( buildFilePath, projectDir );
System.out.println( "Starting execution ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~" );
final GradleRunner gradleRunner = GradleRunner.create()
.withProjectDir( projectDir.toFile() )
.withPluginClasspath()
.withDebug( true )
.withArguments( "clean", "generateJpaMetamodel", "--stacktrace", "--no-build-cache" )
.forwardOutput();
final BuildResult result = gradleRunner.build();
final BuildTask task = result.task( ":generateJpaMetamodel" );
assertThat( task ).isNotNull();
assertThat( task.getOutcome() ).isEqualTo( TaskOutcome.SUCCESS );
assertThat( new File( projectDir.toFile(), "build/classes/java/jpaMetamodel" ) ).exists();
}
@Test
public void testJpaMetamodelGenUpToDate(@TempDir Path projectDir) {
final String buildFilePath = getProjectName() + "/build.gradle";
Copier.copyProject( buildFilePath, projectDir );
{
System.out.println( "Starting first execution ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~" );
final GradleRunner gradleRunner = GradleRunner.create()
.withProjectDir( projectDir.toFile() )
.withPluginClasspath()
.withDebug( true )
.withArguments( "clean", "generateJpaMetamodel", "--stacktrace", "--no-build-cache" )
.forwardOutput();
final BuildResult result = gradleRunner.build();
final BuildTask task = result.task( ":generateJpaMetamodel" );
assertThat( task ).isNotNull();
assertThat( task.getOutcome() ).isEqualTo( TaskOutcome.SUCCESS );
assertThat( new File( projectDir.toFile(), "build/classes/java/jpaMetamodel" ) ).exists();
}
{
System.out.println( "Starting second execution ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~" );
final GradleRunner gradleRunner2 = GradleRunner.create()
.withProjectDir( projectDir.toFile() )
.withPluginClasspath()
.withDebug( true )
.withArguments( "generateJpaMetamodel", "--stacktrace", "--no-build-cache" )
.forwardOutput();
final BuildResult result2 = gradleRunner2.build();
final BuildTask task2 = result2.task( ":generateJpaMetamodel" );
assertThat( task2 ).isNotNull();
assertThat( task2.getOutcome() ).isEqualTo( TaskOutcome.UP_TO_DATE );
assertThat( new File( projectDir.toFile(), "build/classes/java/jpaMetamodel" ) ).exists();
}
}
}

View File

@ -0,0 +1,49 @@
/*
* Hibernate, Relational Persistence for Idiomatic Java
*
* License: GNU Lesser General Public License (LGPL), version 2.1 or later
* See the lgpl.txt file in the root directory or http://www.gnu.org/licenses/lgpl-2.1.html
*/
plugins {
id 'java'
id 'org.hibernate.orm'
}
repositories {
mavenCentral()
maven {
name 'jboss-snapshots-repository'
url 'https://repository.jboss.org/nexus/content/repositories/snapshots'
}
}
dependencies {
// NOTE : The version used here is irrelevant in terms of testing the plugin.
// We just need a resolvable version
implementation 'org.hibernate.orm:hibernate-core:6.1.0.Final'
}
sourceSets {
mySpecialSourceSet {
java {
srcDirs "src/mySpecialSourceSet/java"
}
}
}
hibernate {
useSameVersion = false
sourceSet = 'mySpecialSourceSet'
enhancement {
lazyInitialization( true )
dirtyTracking = true
}
jpaMetamodel {
}
}
tasks.withType(JavaCompile).forEach {
logger.lifecycle " - compile task : " + it.name
}

View File

@ -0,0 +1,29 @@
/*
* Hibernate, Relational Persistence for Idiomatic Java
*
* License: GNU Lesser General Public License (LGPL), version 2.1 or later.
* See the lgpl.txt file in the root directory or http://www.gnu.org/licenses/lgpl-2.1.html.
*/
import jakarta.persistence.Embeddable;
@Embeddable
public class TheEmbeddable {
private String valueOne;
private String valueTwo;
public String getValueOne() {
return valueOne;
}
public void setValueOne(String valueOne) {
this.valueOne = valueOne;
}
public String getValueTwo() {
return valueTwo;
}
public void setValueTwo(String valueTwo) {
this.valueTwo = valueTwo;
}
}

View File

@ -0,0 +1,88 @@
/*
* Hibernate, Relational Persistence for Idiomatic Java
*
* License: GNU Lesser General Public License (LGPL), version 2.1 or later.
* See the lgpl.txt file in the root directory or http://www.gnu.org/licenses/lgpl-2.1.html.
*/
import jakarta.persistence.ElementCollection;
import jakarta.persistence.Embedded;
import jakarta.persistence.Entity;
import jakarta.persistence.Id;
import jakarta.persistence.JoinColumn;
import jakarta.persistence.ManyToOne;
import jakarta.persistence.OneToMany;
import org.hibernate.annotations.BatchSize;
import java.util.Set;
@Entity
@BatchSize( size = 20 )
public class TheEntity {
@Id
private Integer id;
private String name;
@Embedded
private TheEmbeddable theEmbeddable;
@ManyToOne
@JoinColumn
private TheEntity theManyToOne;
@OneToMany( mappedBy = "theManyToOne" )
private Set<TheEntity> theOneToMany;
@ElementCollection
@JoinColumn( name = "owner_id" )
private Set<TheEmbeddable> theEmbeddableCollection;
public Integer getId() {
return id;
}
public void setId(Integer id) {
this.id = id;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public TheEmbeddable getTheEmbeddable() {
return theEmbeddable;
}
public void setTheEmbeddable(TheEmbeddable theEmbeddable) {
this.theEmbeddable = theEmbeddable;
}
public TheEntity getTheManyToOne() {
return theManyToOne;
}
public void setTheManyToOne(TheEntity theManyToOne) {
this.theManyToOne = theManyToOne;
}
public Set<TheEntity> getTheOneToMany() {
return theOneToMany;
}
public void setTheOneToMany(Set<TheEntity> theOneToMany) {
this.theOneToMany = theOneToMany;
}
public Set<TheEmbeddable> getTheEmbeddableCollection() {
return theEmbeddableCollection;
}
public void setTheEmbeddableCollection(Set<TheEmbeddable> theEmbeddableCollection) {
this.theEmbeddableCollection = theEmbeddableCollection;
}
}

View File

@ -20,12 +20,12 @@ repositories {
} }
dependencies { dependencies {
// NOTE : The version used here is irrelevant in terms of testing the plugin.
// We just need a resolvable version
implementation 'org.hibernate.orm:hibernate-core:6.1.0.Final' implementation 'org.hibernate.orm:hibernate-core:6.1.0.Final'
} }
hibernate { hibernate {
// to get using the same version to work, we'd have to install hibernate-core into maven local prior to running these.
// suck we won't be able to adequately test this part, but
useSameVersion = false useSameVersion = false
enhancement { enhancement {
lazyInitialization( true ) lazyInitialization( true )

View File

@ -0,0 +1,13 @@
/*
* Hibernate, Relational Persistence for Idiomatic Java
*
* License: GNU Lesser General Public License (LGPL), version 2.1 or later.
* See the lgpl.txt file in the root directory or http://www.gnu.org/licenses/lgpl-2.1.html.
*/
import jakarta.persistence.Embeddable;
@Embeddable
class TheEmbeddable {
var valueOne: String? = null
var valueTwo: String? = null
}

View File

@ -1,5 +1,4 @@
import jakarta.persistence.Entity; import jakarta.persistence.*
import jakarta.persistence.Id;
import org.hibernate.annotations.BatchSize import org.hibernate.annotations.BatchSize
@Entity @Entity
@ -8,4 +7,18 @@ class TheEntity (
@Id @Id
var id: Long? = null, var id: Long? = null,
var name: String? = null, var name: String? = null,
@Embedded
var theEmbeddable: TheEmbeddable? = null,
@ManyToOne
@JoinColumn
val theManyToOne: TheEntity? = null,
@OneToMany(mappedBy = "theManyToOne")
val theOneToMany: Set<TheEntity>? = null,
@ElementCollection
@JoinColumn(name = "owner_id")
val theEmbeddableCollection: Set<TheEmbeddable>? = null
) )

View File

@ -20,13 +20,12 @@ repositories {
} }
dependencies { dependencies {
implementation 'jakarta.persistence:jakarta.persistence-api:3.0.0' // NOTE : The version used here is irrelevant in terms of testing the plugin.
// We just need a resolvable version
implementation 'org.hibernate.orm:hibernate-core:6.1.0.Final' implementation 'org.hibernate.orm:hibernate-core:6.1.0.Final'
} }
hibernate { hibernate {
// to get using the same version to work, we'd have to install hibernate-core into maven local prior to running these.
// suck we won't be able to adequately test this part, but
useSameVersion = false useSameVersion = false
enhancement { enhancement {
lazyInitialization( true ) lazyInitialization( true )