Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

HHH-19283: Hibernate Gradle Plugin configuration cache support #9895

Open
wants to merge 2 commits into
base: main
Choose a base branch
from
Open
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
Original file line number Diff line number Diff line change
Expand Up @@ -62,6 +62,8 @@ test {
if ( project.hasProperty( 'excludeTests' ) ) {
exclude project.property( 'excludeTests' ) as String
}
jvmArgs("--add-opens", "java.base/java.lang.invoke=ALL-UNNAMED",
"--add-opens", "java.base/java.util=ALL-UNNAMED")
}

def releasePrepareTask = tasks.register("releasePrepare") {
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -15,10 +15,7 @@
import java.util.Set;

import org.gradle.api.GradleException;
import org.gradle.api.Project;
import org.gradle.api.artifacts.Configuration;
import org.gradle.api.file.FileCollection;
import org.gradle.api.tasks.SourceSet;

import org.hibernate.bytecode.enhance.spi.Enhancer;

Expand All @@ -27,18 +24,13 @@
*/
public class Helper {

public static ClassLoader toClassLoader(SourceSet sourceSet, Project project) {
public static ClassLoader toClassLoader(FileCollection classesDirs, Set<File> dependencyFiles) {
final List<URL> urls = new ArrayList<>();

final FileCollection classesDirs = sourceSet.getOutput().getClassesDirs();
for ( File classesDir : classesDirs ) {
urls.add( toUrl( classesDir ) );
}

final Configuration compileConfig = project
.getConfigurations()
.getByName( sourceSet.getCompileClasspathConfigurationName() );
final Set<File> dependencyFiles = compileConfig.getResolvedConfiguration().getFiles();
for ( File dependencyFile : dependencyFiles ) {
urls.add( toUrl( dependencyFile ) );
}
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -4,14 +4,19 @@
*/
package org.hibernate.orm.tooling.gradle;

import java.io.File;
import java.lang.reflect.Method;
import java.util.Set;

import org.gradle.api.Action;
import org.gradle.api.Plugin;
import org.gradle.api.Project;
import org.gradle.api.Task;
import org.gradle.api.artifacts.Configuration;
import org.gradle.api.file.DirectoryProperty;
import org.gradle.api.file.FileCollection;
import org.gradle.api.logging.Logger;
import org.gradle.api.plugins.JavaPluginExtension;
import org.gradle.api.tasks.SourceSet;

import org.hibernate.orm.tooling.gradle.enhance.EnhancementHelper;
Expand All @@ -27,8 +32,7 @@ public void apply(Project project) {
project.getLogger().debug( "Adding Hibernate extensions to the build [{}]", project.getPath() );
final HibernateOrmSpec ormDsl = project.getExtensions().create(
HibernateOrmSpec.DSL_NAME,
HibernateOrmSpec.class,
project
HibernateOrmSpec.class
);

prepareEnhancement( ormDsl, project );
Expand All @@ -52,7 +56,8 @@ private void prepareEnhancement(HibernateOrmSpec ormDsl, Project project) {
return;
}

final SourceSet sourceSet = ormDsl.getSourceSet().get();
Injected injected = project.getObjects().newInstance(Injected.class);
SourceSet sourceSet = resolveSourceSet( ormDsl.getSourceSet().get(), project );
final Set<String> languages = ormDsl.getLanguages().getOrNull();
if ( languages == null ) {
return;
Expand All @@ -65,15 +70,21 @@ private void prepareEnhancement(HibernateOrmSpec ormDsl, Project project) {
continue;
}

FileCollection classesDirs = sourceSet.getOutput().getClassesDirs();
Configuration compileConfig = project
.getConfigurations()
.getByName( sourceSet.getCompileClasspathConfigurationName() );
Set<File> dependencyFiles = compileConfig.getFiles();
Logger logger = project.getLogger();
//noinspection Convert2Lambda
languageCompileTask.doLast(new Action<>() {
@Override
public void execute(Task t) {
try {
final Method getDestinationDirectory = languageCompileTask.getClass().getMethod("getDestinationDirectory");
final DirectoryProperty classesDirectory = (DirectoryProperty) getDestinationDirectory.invoke(languageCompileTask);
final ClassLoader classLoader = Helper.toClassLoader(sourceSet, project);
EnhancementHelper.enhance(classesDirectory, classLoader, ormDsl, project);
final ClassLoader classLoader = Helper.toClassLoader(classesDirs, dependencyFiles);
EnhancementHelper.enhance(classesDirectory, classLoader, ormDsl, logger, injected.getFileOperations());
}
catch (Exception e) {
throw new RuntimeException(e);
Expand All @@ -84,6 +95,11 @@ public void execute(Task t) {
} );
}

private SourceSet resolveSourceSet(String name, Project project) {
final JavaPluginExtension javaPluginExtension = project.getExtensions().getByType( JavaPluginExtension.class );
return javaPluginExtension.getSourceSets().getByName( name );
}

private void prepareHbmTransformation(HibernateOrmSpec ormDsl, Project project) {

}
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -5,68 +5,35 @@
package org.hibernate.orm.tooling.gradle;

import java.util.Arrays;
import javax.inject.Inject;

import org.gradle.api.Action;
import org.gradle.api.Project;
import org.gradle.api.plugins.ExtensionAware;
import org.gradle.api.plugins.ExtensionContainer;
import org.gradle.api.plugins.JavaPluginExtension;
import org.gradle.api.provider.Property;
import org.gradle.api.provider.Provider;
import org.gradle.api.provider.SetProperty;
import org.gradle.api.tasks.Nested;
import org.gradle.api.tasks.SourceSet;

import org.hibernate.orm.tooling.gradle.enhance.EnhancementSpec;

/**
* Main DSL extension for Hibernate ORM. Available as `project.hibernate`
*/
public abstract class HibernateOrmSpec implements ExtensionAware {
public static final String HIBERNATE = "hibernate";
public abstract class HibernateOrmSpec {
public static final String DSL_NAME = "hibernate";

public static final String DSL_NAME = HIBERNATE;
private boolean enhancementConfigured = false;

private final Project project;

private EnhancementSpec enhancementDsl;

private final Property<Boolean> useSameVersion;
private final Property<SourceSet> sourceSet;
private final SetProperty<String> languages;

private final Provider<EnhancementSpec> enhancementDslAccess;


@Inject
public HibernateOrmSpec(Project project) {
this.project = project;

useSameVersion = project.getObjects().property( Boolean.class );
useSameVersion.convention( true );

sourceSet = project.getObjects().property( SourceSet.class );
sourceSet.convention( mainSourceSet( project ) );

languages = project.getObjects().setProperty( String.class );
languages.convention( Arrays.asList( "java", "kotlin" ) );

enhancementDslAccess = project.provider( () -> enhancementDsl );
public HibernateOrmSpec() {
getUseSameVersion().convention( true );
getSourceSet().convention( SourceSet.MAIN_SOURCE_SET_NAME );
getLanguages().convention( Arrays.asList( "java", "kotlin" ) );
}

private static SourceSet mainSourceSet(Project project) {
return resolveSourceSet( SourceSet.MAIN_SOURCE_SET_NAME, project );
}

private static SourceSet resolveSourceSet(String name, Project project) {
final JavaPluginExtension javaPluginExtension = project.getExtensions().getByType( JavaPluginExtension.class );
return javaPluginExtension.getSourceSets().getByName( name );
}

@Override
public abstract ExtensionContainer getExtensions();


/**
* DSL extension for configuring bytecode enhancement. Also acts as the trigger for
* opting into bytecode enhancement
*/
@Nested
abstract public EnhancementSpec getEnhancement();

/**
* Should the plugin inject a dependency on the same version of `hibernate-core`
Expand All @@ -77,137 +44,29 @@ private static SourceSet resolveSourceSet(String name, Project project) {
* that Hibernate generally only supports using classes enhanced using matching
* versions between tooling and runtime. In other words, be careful.
*/
public Property<Boolean> getUseSameVersion() {
return useSameVersion;
}
abstract public Property<Boolean> getUseSameVersion();

/**
* The source-set containing the domain model. Defaults to the `main` source-set
* The source-set name containing the domain model. Defaults to the `main` source-set
*/
public Property<SourceSet> getSourceSet() {
return sourceSet;
}
abstract public Property<String> getSourceSet();

/**
* The languages used in the project
*/
public SetProperty<String> getLanguages() {
return languages;
}


/**
* DSL extension for configuring bytecode enhancement. Also acts as the trigger for
* opting into bytecode enhancement
*/
public EnhancementSpec getEnhancement() {
if ( enhancementDsl == null ) {
enhancementDsl = getExtensions().create( EnhancementSpec.DSL_NAME, EnhancementSpec.class, this, project );
}

return enhancementDsl;
}
abstract public SetProperty<String> getLanguages();

/**
* @see #getEnhancement()
*/
@SuppressWarnings("unused")
public void enhancement(Action<EnhancementSpec> action) {
enhancementConfigured = true;
action.execute( getEnhancement() );
}


public boolean isEnhancementEnabled() {
return enhancementDsl != null;
}


/**
* @see #getUseSameVersion()
*
* @deprecated See the Gradle property naming <a href="https://docs.gradle.org/current/userguide/lazy_configuration.html#lazy_configuration_faqs">guidelines</a>
*/
@Deprecated(forRemoval = true)
public void setUseSameVersion(boolean value) {
useSameVersion.set( value );
}

/**
* @see #getUseSameVersion()
*
* @deprecated See the Gradle property naming <a href="https://docs.gradle.org/current/userguide/lazy_configuration.html#lazy_configuration_faqs">guidelines</a>
*/
@Deprecated(forRemoval = true)
public void useSameVersion() {
useSameVersion.set( true );
}

/**
* @see #getSourceSet()
*
* @deprecated See the Gradle property naming <a href="https://docs.gradle.org/current/userguide/lazy_configuration.html#lazy_configuration_faqs">guidelines</a>
*/
@Deprecated(forRemoval = true)
public void setSourceSet(String name) {
setSourceSet( resolveSourceSet( name, project ) );
}

/**
* @see #getSourceSet()
*
* @deprecated See the Gradle property naming <a href="https://docs.gradle.org/current/userguide/lazy_configuration.html#lazy_configuration_faqs">guidelines</a>
*/
@Deprecated(forRemoval = true)
public void setSourceSet(SourceSet sourceSet) {
this.sourceSet.set( sourceSet );
}

/**
* @see #getSourceSet()
*
* @deprecated See the Gradle property naming <a href="https://docs.gradle.org/current/userguide/lazy_configuration.html#lazy_configuration_faqs">guidelines</a>
*/
@Deprecated(forRemoval = true)
public void sourceSet(String name) {
setSourceSet( resolveSourceSet( name, project ) );
}

/**
* @see #getSourceSet()
*
* @deprecated See the Gradle property naming <a href="https://docs.gradle.org/current/userguide/lazy_configuration.html#lazy_configuration_faqs">guidelines</a>
*/
@Deprecated(forRemoval = true)
public void sourceSet(SourceSet sourceSet) {
setSourceSet( sourceSet );
}

/**
* @see #getLanguages()
*
* @deprecated See the Gradle property naming <a href="https://docs.gradle.org/current/userguide/lazy_configuration.html#lazy_configuration_faqs">guidelines</a>
*/
@Deprecated(forRemoval = true)
public void setLanguages(Iterable<String> languages) {
this.languages.set( languages );
}

/**
* @see #getLanguages()
*
* @deprecated See the Gradle property naming <a href="https://docs.gradle.org/current/userguide/lazy_configuration.html#lazy_configuration_faqs">guidelines</a>
*/
@Deprecated
public void languages(String language) {
this.languages.add( language );
}

/**
* Provider access to {@link #getEnhancement()}
*
* @deprecated See the Gradle property naming <a href="https://docs.gradle.org/current/userguide/lazy_configuration.html#lazy_configuration_faqs">guidelines</a>
*/
@Deprecated
public Provider<EnhancementSpec> getEnhancementDslAccess() {
return enhancementDslAccess;
return enhancementConfigured;
}
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,14 @@
/*
* SPDX-License-Identifier: Apache-2.0
* Copyright Red Hat Inc. and Hibernate Authors
*/
package org.hibernate.orm.tooling.gradle;

import org.gradle.api.internal.file.FileOperations;

import javax.inject.Inject;

public interface Injected {
@Inject
FileOperations getFileOperations();
}
Loading