Skip to content

Commit 2c5257f

Browse files
VladoKurucbeikov
authored andcommitted
HHH-19283: Hibernate Gradle Plugin configuration cache support
1 parent 19893b8 commit 2c5257f

File tree

16 files changed

+146
-476
lines changed

16 files changed

+146
-476
lines changed

tooling/hibernate-gradle-plugin/hibernate-gradle-plugin.gradle

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -62,6 +62,8 @@ test {
6262
if ( project.hasProperty( 'excludeTests' ) ) {
6363
exclude project.property( 'excludeTests' ) as String
6464
}
65+
jvmArgs("--add-opens", "java.base/java.lang.invoke=ALL-UNNAMED",
66+
"--add-opens", "java.base/java.util=ALL-UNNAMED")
6567
}
6668

6769
def releasePrepareTask = tasks.register("releasePrepare") {

tooling/hibernate-gradle-plugin/src/main/java/org/hibernate/orm/tooling/gradle/Helper.java

Lines changed: 1 addition & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -15,10 +15,7 @@
1515
import java.util.Set;
1616

1717
import org.gradle.api.GradleException;
18-
import org.gradle.api.Project;
19-
import org.gradle.api.artifacts.Configuration;
2018
import org.gradle.api.file.FileCollection;
21-
import org.gradle.api.tasks.SourceSet;
2219

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

@@ -27,18 +24,13 @@
2724
*/
2825
public class Helper {
2926

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

33-
final FileCollection classesDirs = sourceSet.getOutput().getClassesDirs();
3430
for ( File classesDir : classesDirs ) {
3531
urls.add( toUrl( classesDir ) );
3632
}
3733

38-
final Configuration compileConfig = project
39-
.getConfigurations()
40-
.getByName( sourceSet.getCompileClasspathConfigurationName() );
41-
final Set<File> dependencyFiles = compileConfig.getResolvedConfiguration().getFiles();
4234
for ( File dependencyFile : dependencyFiles ) {
4335
urls.add( toUrl( dependencyFile ) );
4436
}

tooling/hibernate-gradle-plugin/src/main/java/org/hibernate/orm/tooling/gradle/HibernateOrmPlugin.java

Lines changed: 21 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -4,14 +4,19 @@
44
*/
55
package org.hibernate.orm.tooling.gradle;
66

7+
import java.io.File;
78
import java.lang.reflect.Method;
89
import java.util.Set;
910

1011
import org.gradle.api.Action;
1112
import org.gradle.api.Plugin;
1213
import org.gradle.api.Project;
1314
import org.gradle.api.Task;
15+
import org.gradle.api.artifacts.Configuration;
1416
import org.gradle.api.file.DirectoryProperty;
17+
import org.gradle.api.file.FileCollection;
18+
import org.gradle.api.logging.Logger;
19+
import org.gradle.api.plugins.JavaPluginExtension;
1520
import org.gradle.api.tasks.SourceSet;
1621

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

3438
prepareEnhancement( ormDsl, project );
@@ -52,7 +56,8 @@ private void prepareEnhancement(HibernateOrmSpec ormDsl, Project project) {
5256
return;
5357
}
5458

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

73+
FileCollection classesDirs = sourceSet.getOutput().getClassesDirs();
74+
Configuration compileConfig = project
75+
.getConfigurations()
76+
.getByName( sourceSet.getCompileClasspathConfigurationName() );
77+
Set<File> dependencyFiles = compileConfig.getResolvedConfiguration().getFiles();
78+
Logger logger = project.getLogger();
6879
//noinspection Convert2Lambda
6980
languageCompileTask.doLast(new Action<>() {
7081
@Override
7182
public void execute(Task t) {
7283
try {
7384
final Method getDestinationDirectory = languageCompileTask.getClass().getMethod("getDestinationDirectory");
7485
final DirectoryProperty classesDirectory = (DirectoryProperty) getDestinationDirectory.invoke(languageCompileTask);
75-
final ClassLoader classLoader = Helper.toClassLoader(sourceSet, project);
76-
EnhancementHelper.enhance(classesDirectory, classLoader, ormDsl, project);
86+
final ClassLoader classLoader = Helper.toClassLoader(classesDirs, dependencyFiles);
87+
EnhancementHelper.enhance(classesDirectory, classLoader, ormDsl, logger, injected.getFileOperations());
7788
}
7889
catch (Exception e) {
7990
throw new RuntimeException(e);
@@ -84,6 +95,11 @@ public void execute(Task t) {
8495
} );
8596
}
8697

98+
private SourceSet resolveSourceSet(String name, Project project) {
99+
final JavaPluginExtension javaPluginExtension = project.getExtensions().getByType( JavaPluginExtension.class );
100+
return javaPluginExtension.getSourceSets().getByName( name );
101+
}
102+
87103
private void prepareHbmTransformation(HibernateOrmSpec ormDsl, Project project) {
88104

89105
}

tooling/hibernate-gradle-plugin/src/main/java/org/hibernate/orm/tooling/gradle/HibernateOrmSpec.java

Lines changed: 21 additions & 162 deletions
Original file line numberDiff line numberDiff line change
@@ -5,68 +5,35 @@
55
package org.hibernate.orm.tooling.gradle;
66

77
import java.util.Arrays;
8-
import javax.inject.Inject;
98

109
import org.gradle.api.Action;
11-
import org.gradle.api.Project;
12-
import org.gradle.api.plugins.ExtensionAware;
13-
import org.gradle.api.plugins.ExtensionContainer;
14-
import org.gradle.api.plugins.JavaPluginExtension;
1510
import org.gradle.api.provider.Property;
16-
import org.gradle.api.provider.Provider;
1711
import org.gradle.api.provider.SetProperty;
12+
import org.gradle.api.tasks.Nested;
1813
import org.gradle.api.tasks.SourceSet;
1914

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

2217
/**
2318
* Main DSL extension for Hibernate ORM. Available as `project.hibernate`
2419
*/
25-
public abstract class HibernateOrmSpec implements ExtensionAware {
26-
public static final String HIBERNATE = "hibernate";
20+
public abstract class HibernateOrmSpec {
21+
public static final String DSL_NAME = "hibernate";
2722

28-
public static final String DSL_NAME = HIBERNATE;
23+
private boolean enhancementConfigured = false;
2924

30-
private final Project project;
31-
32-
private EnhancementSpec enhancementDsl;
33-
34-
private final Property<Boolean> useSameVersion;
35-
private final Property<SourceSet> sourceSet;
36-
private final SetProperty<String> languages;
37-
38-
private final Provider<EnhancementSpec> enhancementDslAccess;
39-
40-
41-
@Inject
42-
public HibernateOrmSpec(Project project) {
43-
this.project = project;
44-
45-
useSameVersion = project.getObjects().property( Boolean.class );
46-
useSameVersion.convention( true );
47-
48-
sourceSet = project.getObjects().property( SourceSet.class );
49-
sourceSet.convention( mainSourceSet( project ) );
50-
51-
languages = project.getObjects().setProperty( String.class );
52-
languages.convention( Arrays.asList( "java", "kotlin" ) );
53-
54-
enhancementDslAccess = project.provider( () -> enhancementDsl );
25+
public HibernateOrmSpec() {
26+
getUseSameVersion().convention( true );
27+
getSourceSet().convention( SourceSet.MAIN_SOURCE_SET_NAME );
28+
getLanguages().convention( Arrays.asList( "java", "kotlin" ) );
5529
}
5630

57-
private static SourceSet mainSourceSet(Project project) {
58-
return resolveSourceSet( SourceSet.MAIN_SOURCE_SET_NAME, project );
59-
}
60-
61-
private static SourceSet resolveSourceSet(String name, Project project) {
62-
final JavaPluginExtension javaPluginExtension = project.getExtensions().getByType( JavaPluginExtension.class );
63-
return javaPluginExtension.getSourceSets().getByName( name );
64-
}
65-
66-
@Override
67-
public abstract ExtensionContainer getExtensions();
68-
69-
31+
/**
32+
* DSL extension for configuring bytecode enhancement. Also acts as the trigger for
33+
* opting into bytecode enhancement
34+
*/
35+
@Nested
36+
abstract public EnhancementSpec getEnhancement();
7037

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

8449
/**
85-
* The source-set containing the domain model. Defaults to the `main` source-set
50+
* The source-set name containing the domain model. Defaults to the `main` source-set
8651
*/
87-
public Property<SourceSet> getSourceSet() {
88-
return sourceSet;
89-
}
52+
abstract public Property<String> getSourceSet();
9053

9154
/**
9255
* The languages used in the project
9356
*/
94-
public SetProperty<String> getLanguages() {
95-
return languages;
96-
}
97-
98-
99-
/**
100-
* DSL extension for configuring bytecode enhancement. Also acts as the trigger for
101-
* opting into bytecode enhancement
102-
*/
103-
public EnhancementSpec getEnhancement() {
104-
if ( enhancementDsl == null ) {
105-
enhancementDsl = getExtensions().create( EnhancementSpec.DSL_NAME, EnhancementSpec.class, this, project );
106-
}
107-
108-
return enhancementDsl;
109-
}
57+
abstract public SetProperty<String> getLanguages();
11058

11159
/**
11260
* @see #getEnhancement()
11361
*/
62+
@SuppressWarnings("unused")
11463
public void enhancement(Action<EnhancementSpec> action) {
64+
enhancementConfigured = true;
11565
action.execute( getEnhancement() );
11666
}
11767

11868

11969
public boolean isEnhancementEnabled() {
120-
return enhancementDsl != null;
121-
}
122-
123-
124-
/**
125-
* @see #getUseSameVersion()
126-
*
127-
* @deprecated See the Gradle property naming <a href="https://docs.gradle.org/current/userguide/lazy_configuration.html#lazy_configuration_faqs">guidelines</a>
128-
*/
129-
@Deprecated(forRemoval = true)
130-
public void setUseSameVersion(boolean value) {
131-
useSameVersion.set( value );
132-
}
133-
134-
/**
135-
* @see #getUseSameVersion()
136-
*
137-
* @deprecated See the Gradle property naming <a href="https://docs.gradle.org/current/userguide/lazy_configuration.html#lazy_configuration_faqs">guidelines</a>
138-
*/
139-
@Deprecated(forRemoval = true)
140-
public void useSameVersion() {
141-
useSameVersion.set( true );
142-
}
143-
144-
/**
145-
* @see #getSourceSet()
146-
*
147-
* @deprecated See the Gradle property naming <a href="https://docs.gradle.org/current/userguide/lazy_configuration.html#lazy_configuration_faqs">guidelines</a>
148-
*/
149-
@Deprecated(forRemoval = true)
150-
public void setSourceSet(String name) {
151-
setSourceSet( resolveSourceSet( name, project ) );
152-
}
153-
154-
/**
155-
* @see #getSourceSet()
156-
*
157-
* @deprecated See the Gradle property naming <a href="https://docs.gradle.org/current/userguide/lazy_configuration.html#lazy_configuration_faqs">guidelines</a>
158-
*/
159-
@Deprecated(forRemoval = true)
160-
public void setSourceSet(SourceSet sourceSet) {
161-
this.sourceSet.set( sourceSet );
162-
}
163-
164-
/**
165-
* @see #getSourceSet()
166-
*
167-
* @deprecated See the Gradle property naming <a href="https://docs.gradle.org/current/userguide/lazy_configuration.html#lazy_configuration_faqs">guidelines</a>
168-
*/
169-
@Deprecated(forRemoval = true)
170-
public void sourceSet(String name) {
171-
setSourceSet( resolveSourceSet( name, project ) );
172-
}
173-
174-
/**
175-
* @see #getSourceSet()
176-
*
177-
* @deprecated See the Gradle property naming <a href="https://docs.gradle.org/current/userguide/lazy_configuration.html#lazy_configuration_faqs">guidelines</a>
178-
*/
179-
@Deprecated(forRemoval = true)
180-
public void sourceSet(SourceSet sourceSet) {
181-
setSourceSet( sourceSet );
182-
}
183-
184-
/**
185-
* @see #getLanguages()
186-
*
187-
* @deprecated See the Gradle property naming <a href="https://docs.gradle.org/current/userguide/lazy_configuration.html#lazy_configuration_faqs">guidelines</a>
188-
*/
189-
@Deprecated(forRemoval = true)
190-
public void setLanguages(Iterable<String> languages) {
191-
this.languages.set( languages );
192-
}
193-
194-
/**
195-
* @see #getLanguages()
196-
*
197-
* @deprecated See the Gradle property naming <a href="https://docs.gradle.org/current/userguide/lazy_configuration.html#lazy_configuration_faqs">guidelines</a>
198-
*/
199-
@Deprecated
200-
public void languages(String language) {
201-
this.languages.add( language );
202-
}
203-
204-
/**
205-
* Provider access to {@link #getEnhancement()}
206-
*
207-
* @deprecated See the Gradle property naming <a href="https://docs.gradle.org/current/userguide/lazy_configuration.html#lazy_configuration_faqs">guidelines</a>
208-
*/
209-
@Deprecated
210-
public Provider<EnhancementSpec> getEnhancementDslAccess() {
211-
return enhancementDslAccess;
70+
return enhancementConfigured;
21271
}
21372
}
Lines changed: 14 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,14 @@
1+
/*
2+
* SPDX-License-Identifier: Apache-2.0
3+
* Copyright Red Hat Inc. and Hibernate Authors
4+
*/
5+
package org.hibernate.orm.tooling.gradle;
6+
7+
import org.gradle.api.internal.file.FileOperations;
8+
9+
import javax.inject.Inject;
10+
11+
public interface Injected {
12+
@Inject
13+
FileOperations getFileOperations();
14+
}

0 commit comments

Comments
 (0)