diff --git a/documentation/documentation.gradle b/documentation/documentation.gradle index 290a51f6ad5c..0a648f52b52a 100644 --- a/documentation/documentation.gradle +++ b/documentation/documentation.gradle @@ -2,12 +2,13 @@ * SPDX-License-Identifier: Apache-2.0 * Copyright Red Hat Inc. and Hibernate Authors */ -import java.util.function.Function import org.asciidoctor.gradle.jvm.AsciidoctorTask import org.asciidoctor.gradle.jvm.pdf.AsciidoctorPdfTask import org.ysb33r.grolifant.api.core.jvm.ExecutionMode +import java.util.function.Function + buildscript { configurations.configureEach { resolutionStrategy.dependencySubstitution { @@ -714,16 +715,14 @@ settingsDocumentation { def generateSettingsDocTask = tasks.named( "generateSettingsDoc" ) { dependsOn aggregateJavadocsTask - doFirst { - def javadoc = aggregateJavadocsTask.get() - def javaLanguageVersion = javadoc.javadocTool.present - ? javadoc.javadocTool.get().metadata.languageVersion - : JavaLanguageVersion.of( JavaVersion.current().name ) + def javadoc = aggregateJavadocsTask.get() + def javaLanguageVersion = javadoc.javadocTool.present + ? javadoc.javadocTool.get().metadata.languageVersion + : JavaLanguageVersion.of( JavaVersion.current().name ) - if ( javaLanguageVersion.asInt() > 11 ) { - println "Aggregated Javadocs was built using a JDK newer than version 11; generating the settings User Guide fragment will not succeed" - } - } + if ( javaLanguageVersion.asInt() > 11 ) { + println "Aggregated Javadocs was built using a JDK newer than version 11; generating the settings User Guide fragment will not succeed" + } } def renderUserGuideHtmlTask = tasks.register( 'renderUserGuideHtml', AsciidoctorTask ) { task -> @@ -969,7 +968,8 @@ def buildDocsForPublishingTask = tasks.register( 'buildDocsForPublishing' ) { ta // ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ -tasks.withType(AsciidoctorTask).configureEach { +tasks.withType( AsciidoctorTask ).configureEach { + notCompatibleWithConfigurationCache( "AsciiDoctor v4 is not compatible with CC yet, remove with stable release of v5" ) baseDirFollowsSourceDir() outputOptions { separateOutputDirs = false @@ -981,7 +981,8 @@ tasks.withType(AsciidoctorTask).configureEach { dependsOn 'unpackTheme' } -tasks.withType(AsciidoctorPdfTask).configureEach { +tasks.withType( AsciidoctorPdfTask ).configureEach { + notCompatibleWithConfigurationCache( "AsciiDoctor v4 is not compatible with CC yet, remove with stable release of v5" ) // See https://docs.asciidoctor.org/gradle-plugin/latest/common-task-configuration/#choosing-an-execution-mode-for-asciidoctorj executionMode = ExecutionMode.JAVA_EXEC diff --git a/gradle.properties b/gradle.properties index 2ff3f882adb8..adefe24b4ebb 100644 --- a/gradle.properties +++ b/gradle.properties @@ -13,6 +13,8 @@ org.gradle.parallel=true # enable Gradle's Task Cache. worst case: # > rm -rf ~/.gradle/caches/build-cache-1 org.gradle.caching=true +org.gradle.configuration-cache=true +org.gradle.configureondemand=true # JDK auto-detection is not quite ready yet in Gradle 6.7. # On Fedora in particular, if you have the package java-1.8.0-openjdk-headless-1.8.0.265.b01-1.fc32.x86_64 installed, diff --git a/hibernate-core/hibernate-core.gradle b/hibernate-core/hibernate-core.gradle index 191bdb8e9041..6d0963777cd5 100644 --- a/hibernate-core/hibernate-core.gradle +++ b/hibernate-core/hibernate-core.gradle @@ -295,3 +295,7 @@ tasks.sourcesJar.dependsOn ':hibernate-core:generateGraphParser' tasks.sourcesJar.dependsOn ':hibernate-core:generateHqlParser' tasks.sourcesJar.dependsOn ':hibernate-core:generateSqlScriptParser' tasks.sourcesJar.dependsOn ':hibernate-core:generateOrderingParser' + +tasks.named( "compileJava", JavaCompile ) { + notCompatibleWithConfigurationCache( "org.hibernate.build.version-injection plugin call project in execution time" ) +} diff --git a/local-build-plugins/build.gradle b/local-build-plugins/build.gradle index 2afd5a17741a..74b772b46487 100644 --- a/local-build-plugins/build.gradle +++ b/local-build-plugins/build.gradle @@ -49,43 +49,35 @@ tasks.compileJava { gradlePlugin { plugins { - databaseServicePlugin { + register( "databaseServicePlugin" ) { id = 'org.hibernate.orm.database-service' implementationClass = 'org.hibernate.orm.db.DatabaseServicePlugin' } - antlrPlugin { + register( "antlrPlugin" ) { id = 'org.hibernate.orm.antlr' implementationClass = 'org.hibernate.orm.antlr.AntlrPlugin' } - jakartaPlugin { - id = 'org.hibernate.orm.jakarta' - implementationClass = 'org.hibernate.orm.jakarta.JakartaPlugin' - } - jakartaPublishPlugin { - id = 'org.hibernate.orm.jakarta-publish' - implementationClass = 'org.hibernate.orm.jakarta.JakartaPublishingPlugin' - } - reportsPlugin { + register( "reportsPlugin" ) { id = 'org.hibernate.orm.build.reports' implementationClass = 'org.hibernate.orm.post.ReportGenerationPlugin' } - envSettings { + register( "envSettings" ) { id = 'org.hibernate.orm.build.env-settings' implementationClass = 'org.hibernate.orm.env.EnvironmentSettingsPlugin' } - jdkVersionSettings { + register( "jdkVersionSettings" ) { id = 'org.hibernate.orm.build.jdks-settings' implementationClass = 'org.hibernate.orm.toolchains.JdkVersionSettingsPlugin' } - settingsDocumentationPlugin { + register( "settingsDocumentationPlugin" ) { id = 'org.hibernate.orm.build.settings-doc' implementationClass = 'org.hibernate.orm.properties.SettingsDocumentationPlugin' } - jdkVersionsPlugin { + register( "jdkVersionsPlugin" ) { id = 'org.hibernate.orm.build.jdks' implementationClass = 'org.hibernate.orm.toolchains.JdkVersionPlugin' } - javaModulePlugin { + register( "javaModulePlugin" ) { id = 'org.hibernate.orm.build.java-module' implementationClass = 'org.hibernate.orm.toolchains.JavaModulePlugin' } diff --git a/local-build-plugins/src/main/groovy/local.java-module.gradle b/local-build-plugins/src/main/groovy/local.java-module.gradle index ac895043ac1a..aeb33081ba87 100644 --- a/local-build-plugins/src/main/groovy/local.java-module.gradle +++ b/local-build-plugins/src/main/groovy/local.java-module.gradle @@ -291,7 +291,10 @@ tasks.withType(Jar).configureEach { } } -tasks.named("jar") { +tasks.named( "jar", Jar ) { + // Remove when https://github.com/bndtools/bnd/issues/6346 is fixed + notCompatibleWithConfigurationCache( "Bnd plugin access to project at execution time" ) + manifest { attributes( // Java 9 module name diff --git a/local-build-plugins/src/main/java/org/hibernate/build/OrmBuildDetails.java b/local-build-plugins/src/main/java/org/hibernate/build/OrmBuildDetails.java index 06ddb4589da7..dd19cf4132ae 100644 --- a/local-build-plugins/src/main/java/org/hibernate/build/OrmBuildDetails.java +++ b/local-build-plugins/src/main/java/org/hibernate/build/OrmBuildDetails.java @@ -6,6 +6,10 @@ import org.gradle.api.Project; import org.gradle.api.provider.Provider; +import org.gradle.api.tasks.Input; +import org.gradle.api.tasks.InputFile; +import org.gradle.api.tasks.Internal; +import org.gradle.api.tasks.Nested; import javax.inject.Inject; import java.io.File; @@ -39,43 +43,53 @@ public OrmBuildDetails(Project project) { databaseName = (String) project.property( "db" ); } + @InputFile public Provider getVersionFileAccess() { return versionFileAccess; } - public HibernateVersion getHibernateVersion() { - return hibernateVersion; + @Nested + public ReleaseDetails getReleaseDetails() { + return releaseDetails; } + @Input public String getHibernateVersionName() { return getHibernateVersion().getFullName(); } + @Input public String getHibernateVersionFamily() { return getHibernateVersion().getFamily(); } + @Input public String getHibernateVersionNameOsgi() { return getHibernateVersion().getOsgiVersion(); } - public ReleaseDetails getReleaseDetails() { - return releaseDetails; - } - - public JpaVersion getJpaVersion() { - return jpaVersion; - } - + @Input public String getJpaVersionName() { return getJpaVersion().getName(); } + @Input public String getJpaVersionNameOsgi() { return getJpaVersion().getOsgiName(); } + @Input public String getDatabaseName() { return databaseName; } + + @Internal + public HibernateVersion getHibernateVersion() { + return hibernateVersion; + } + + @Internal + public JpaVersion getJpaVersion() { + return jpaVersion; + } } diff --git a/local-build-plugins/src/main/java/org/hibernate/build/ReleaseDetails.java b/local-build-plugins/src/main/java/org/hibernate/build/ReleaseDetails.java index bee4dcd5285c..e33bcfa1869a 100644 --- a/local-build-plugins/src/main/java/org/hibernate/build/ReleaseDetails.java +++ b/local-build-plugins/src/main/java/org/hibernate/build/ReleaseDetails.java @@ -6,6 +6,9 @@ import org.gradle.api.Project; import org.gradle.api.provider.Provider; +import org.gradle.api.tasks.Input; +import org.gradle.api.tasks.Internal; +import org.gradle.api.tasks.Optional; /** * @author Steve Ebersole @@ -36,14 +39,17 @@ public ReleaseDetails(Project project) { createTagAccess = project.provider( () -> !project.hasProperty( "noTag" ) ); } + @Internal public HibernateVersion getReleaseVersion() { return releaseVersion; } + @Internal public HibernateVersion getDevelopmentVersion() { return developmentVersion; } + @Input public Provider getCreateTagAccess() { return createTagAccess; } @@ -52,10 +58,13 @@ public boolean shouldCreateTag() { return getCreateTagAccess().get(); } + @Input + @Optional public Provider getTagNameAccess() { return tagNameAccess; } + @Internal public String getTagNameToUse() { return getTagNameAccess().get(); } diff --git a/local-build-plugins/src/main/java/org/hibernate/build/xjc/XjcListenerImpl.java b/local-build-plugins/src/main/java/org/hibernate/build/xjc/XjcListenerImpl.java index 6c6a94f38385..1942953fe937 100644 --- a/local-build-plugins/src/main/java/org/hibernate/build/xjc/XjcListenerImpl.java +++ b/local-build-plugins/src/main/java/org/hibernate/build/xjc/XjcListenerImpl.java @@ -5,7 +5,7 @@ package org.hibernate.build.xjc; import com.sun.tools.xjc.XJCListener; -import org.gradle.api.Project; +import org.gradle.api.logging.Logger; import org.xml.sax.SAXParseException; /** @@ -15,12 +15,12 @@ */ public class XjcListenerImpl extends XJCListener { private final String schemaName; - private final Project project; + private final Logger logger; private boolean hadErrors; - public XjcListenerImpl(String schemaName, Project project) { + public XjcListenerImpl(String schemaName, Logger logger) { this.schemaName = schemaName; - this.project = project; + this.logger = logger; } public boolean hadErrors() { @@ -29,33 +29,33 @@ public boolean hadErrors() { @Override public void generatedFile(String fileName, int current, int total) { - project.getLogger().info( "XJC generated file ({}) : {}", schemaName, fileName ); + logger.info( "XJC generated file ({}) : {}", schemaName, fileName ); } @Override public void message(String msg) { - project.getLogger().info( "XJC message ({}) : {}", schemaName, msg ); + logger.info( "XJC message ({}) : {}", schemaName, msg ); } @Override public void info(SAXParseException exception) { - project.getLogger().info( "XJC info ({})", schemaName, exception ); + logger.info( "XJC info ({})", schemaName, exception ); } @Override public void warning(SAXParseException exception) { - project.getLogger().warn( "XJC warning ({})",schemaName, exception ); + logger.warn( "XJC warning ({})",schemaName, exception ); } @Override public void error(SAXParseException exception) { hadErrors = true; - project.getLogger().error( "XJC error ({})", schemaName, exception ); + logger.error( "XJC error ({})", schemaName, exception ); } @Override public void fatalError(SAXParseException exception) { hadErrors = true; - project.getLogger().error( "XJC fatal error ({})", schemaName, exception ); + logger.error( "XJC fatal error ({})", schemaName, exception ); } } diff --git a/local-build-plugins/src/main/java/org/hibernate/build/xjc/XjcTask.java b/local-build-plugins/src/main/java/org/hibernate/build/xjc/XjcTask.java index de38970a8d47..9a3900e552e7 100644 --- a/local-build-plugins/src/main/java/org/hibernate/build/xjc/XjcTask.java +++ b/local-build-plugins/src/main/java/org/hibernate/build/xjc/XjcTask.java @@ -15,11 +15,13 @@ import org.gradle.api.tasks.Input; import org.gradle.api.tasks.InputFile; import org.gradle.api.tasks.Internal; +import org.gradle.api.tasks.Optional; import org.gradle.api.tasks.OutputDirectory; import org.gradle.api.tasks.PathSensitive; import org.gradle.api.tasks.PathSensitivity; import org.gradle.api.tasks.TaskAction; +import javax.inject.Inject; import java.util.ArrayList; import java.util.Collections; import java.util.Set; @@ -30,57 +32,33 @@ * @author Steve Ebersole */ @CacheableTask -public class XjcTask extends DefaultTask { - private final Property schemaName; - private final DirectoryProperty outputDirectory; - private final RegularFileProperty xsdFile; - private final RegularFileProperty xjcBindingFile; - private final SetProperty xjcPlugins; +public abstract class XjcTask extends DefaultTask { + @Inject public XjcTask() { - schemaName = getProject().getObjects().property( String.class ); - - xsdFile = getProject().getObjects().fileProperty(); - xjcBindingFile = getProject().getObjects().fileProperty(); - xjcPlugins = getProject().getObjects().setProperty( String.class ); - - outputDirectory = getProject().getObjects().directoryProperty(); - - schemaName.convention( xsdFile.map( regularFile -> regularFile.getAsFile().getName() ) ); } @Internal - public Property getSchemaName() { - return schemaName; - } + public abstract Property getSchemaName(); @InputFile @PathSensitive(PathSensitivity.RELATIVE) - public RegularFileProperty getXsdFile() { - return xsdFile; - } + public abstract RegularFileProperty getXsdFile(); + @Optional @InputFile @PathSensitive(PathSensitivity.RELATIVE) - public RegularFileProperty getXjcBindingFile() { - return xjcBindingFile; - } + public abstract RegularFileProperty getXjcBindingFile(); @Input - public SetProperty getXjcPlugins() { - return xjcPlugins; - } + public abstract SetProperty getXjcPlugins(); @OutputDirectory - public DirectoryProperty getOutputDirectory() { - return outputDirectory; - } + public abstract DirectoryProperty getOutputDirectory(); @TaskAction public void generateJaxbBindings() { - getProject().delete( outputDirectory.get().getAsFileTree() ); - - final XjcListenerImpl listener = new XjcListenerImpl( schemaName.get(), getProject() ); + final XjcListenerImpl listener = new XjcListenerImpl( getSchemaName().get(), getLogger() ); final String[] args = buildXjcArgs(); try { @@ -94,15 +72,15 @@ public void generateJaxbBindings() { private String[] buildXjcArgs() { final ArrayList argsList = new ArrayList<>(); - Collections.addAll( argsList, "-d", outputDirectory.get().getAsFile().getAbsolutePath() ); - Collections.addAll( argsList, "-b", xjcBindingFile.get().getAsFile().getAbsolutePath()); + Collections.addAll( argsList, "-d", getOutputDirectory().get().getAsFile().getAbsolutePath() ); + Collections.addAll( argsList, "-b", getXjcBindingFile().get().getAsFile().getAbsolutePath()); argsList.add( "-extension" ); argsList.add( "-no-header" ); argsList.add( "-npa" ); - if ( xjcPlugins.isPresent() ) { - final Set xjcPluginsToEnable = xjcPlugins.get(); + if ( getXjcPlugins().isPresent() ) { + final Set xjcPluginsToEnable = getXjcPlugins().get(); if ( !xjcPluginsToEnable.isEmpty() ) { xjcPluginsToEnable.forEach( (ext) -> { argsList.add( "-X" + ext ); @@ -110,7 +88,7 @@ private String[] buildXjcArgs() { } } - argsList.add( xsdFile.get().getAsFile().getAbsolutePath() ); + argsList.add( getXsdFile().get().getAsFile().getAbsolutePath() ); return argsList.toArray( new String[0] ); } diff --git a/local-build-plugins/src/main/java/org/hibernate/orm/antlr/AntlrHelper.java b/local-build-plugins/src/main/java/org/hibernate/orm/antlr/AntlrHelper.java index 1ec73679fe41..72ce3348c2be 100644 --- a/local-build-plugins/src/main/java/org/hibernate/orm/antlr/AntlrHelper.java +++ b/local-build-plugins/src/main/java/org/hibernate/orm/antlr/AntlrHelper.java @@ -4,6 +4,8 @@ */ package org.hibernate.orm.antlr; +import org.gradle.api.logging.Logger; + import java.io.BufferedReader; import java.io.BufferedWriter; import java.io.File; @@ -11,8 +13,6 @@ import java.io.FileWriter; import java.io.IOException; -import org.gradle.api.Project; - /** * This is intended to deal with this Antlr issue * @@ -36,7 +36,7 @@ private AntlrHelper() { public static void stripSillyGeneratedFromLines( File generationDirectory, File outputDirectory, - Project project) { + Logger logger) { final File[] generatedJavaFiles = generationDirectory.listFiles( (dir, name) -> name.endsWith( ".java" ) ); if ( generatedJavaFiles == null ) { // warn? @@ -44,15 +44,15 @@ public static void stripSillyGeneratedFromLines( } for ( int i = 0; i < generatedJavaFiles.length; i++ ) { - stripSillyGeneratedFromLineFromFile( generatedJavaFiles[i], outputDirectory, project ); + stripSillyGeneratedFromLineFromFile( generatedJavaFiles[i], outputDirectory, logger ); } } private static void stripSillyGeneratedFromLineFromFile( File generatedJavaFile, File outputDirectory, - Project project) { - project.getLogger().lifecycle( "Stripping silly generated-from line from {} into {}", + Logger logger) { + logger.lifecycle( "Stripping silly generated-from line from {} into {}", generatedJavaFile.getAbsolutePath(), outputDirectory.getAbsolutePath() ); @@ -73,7 +73,7 @@ private static void stripSillyGeneratedFromLineFromFile( } } catch (IOException e) { - project.getLogger().lifecycle( "Unable to remove the generated-from line added by Antlr to the generated file: {}", e.getMessage() ); + logger.lifecycle( "Unable to remove the generated-from line added by Antlr to the generated file: {}", e.getMessage() ); } } } diff --git a/local-build-plugins/src/main/java/org/hibernate/orm/antlr/AntlrPlugin.java b/local-build-plugins/src/main/java/org/hibernate/orm/antlr/AntlrPlugin.java index fb135ec77e77..0962b1f567e7 100644 --- a/local-build-plugins/src/main/java/org/hibernate/orm/antlr/AntlrPlugin.java +++ b/local-build-plugins/src/main/java/org/hibernate/orm/antlr/AntlrPlugin.java @@ -37,12 +37,8 @@ public void apply(Project project) { task.setGroup( ANTLR ); } ); - final AntlrSpec antlrSpec = project.getExtensions().create( - AntlrSpec.REGISTRATION_NAME, - AntlrSpec.class, - project, - groupingTask - ); + final AntlrSpec antlrSpec = new AntlrSpec( project.getLayout(), project.getObjects(), groupingTask, project ); + project.getExtensions().add( AntlrSpec.class, AntlrSpec.REGISTRATION_NAME, antlrSpec ); final Configuration antlrDependencies = project.getConfigurations().maybeCreate( ANTLR ); diff --git a/local-build-plugins/src/main/java/org/hibernate/orm/antlr/AntlrSpec.java b/local-build-plugins/src/main/java/org/hibernate/orm/antlr/AntlrSpec.java index f12c234d3470..5532ea30846c 100644 --- a/local-build-plugins/src/main/java/org/hibernate/orm/antlr/AntlrSpec.java +++ b/local-build-plugins/src/main/java/org/hibernate/orm/antlr/AntlrSpec.java @@ -4,8 +4,6 @@ */ package org.hibernate.orm.antlr; -import javax.inject.Inject; - import org.gradle.api.NamedDomainObjectContainer; import org.gradle.api.Project; import org.gradle.api.Task; @@ -25,12 +23,7 @@ public class AntlrSpec { private final NamedDomainObjectContainer grammarDescriptors; - @Inject - @SuppressWarnings("UnstableApiUsage") - public AntlrSpec(Project project, TaskProvider groupingTask) { - final ObjectFactory objectFactory = project.getObjects(); - final ProjectLayout layout = project.getLayout(); - + public AntlrSpec(ProjectLayout layout, ObjectFactory objectFactory, TaskProvider groupingTask, Project project) { grammarBaseDirectory = objectFactory.directoryProperty(); grammarBaseDirectory.convention( layout.getProjectDirectory().dir( "src/main/antlr" ) ); diff --git a/local-build-plugins/src/main/java/org/hibernate/orm/antlr/GrammarDescriptorFactory.java b/local-build-plugins/src/main/java/org/hibernate/orm/antlr/GrammarDescriptorFactory.java index af0ad45ea0ae..28bd6041bb62 100644 --- a/local-build-plugins/src/main/java/org/hibernate/orm/antlr/GrammarDescriptorFactory.java +++ b/local-build-plugins/src/main/java/org/hibernate/orm/antlr/GrammarDescriptorFactory.java @@ -25,16 +25,19 @@ public GrammarDescriptorFactory(AntlrSpec antlrSpec, TaskProvider grouping @Override public SplitGrammarDescriptor create(String name) { - final SplitGrammarDescriptor descriptor = new SplitGrammarDescriptor( name, antlrSpec, project.getObjects() ); + final SplitGrammarDescriptor descriptor = new SplitGrammarDescriptor( name, project.getObjects() ); - final SplitGrammarGenerationTask generatorTask = project.getTasks().create( + final TaskProvider generatorTask = project.getTasks().register( determineTaskName( name ), SplitGrammarGenerationTask.class, descriptor, antlrSpec ); - generatorTask.setDescription( "Performs Antlr grammar generation for the `" + name + "` grammar" ); - generatorTask.setGroup( "antlr" ); + generatorTask.configure( (task) -> { + task.setDescription( "Performs Antlr grammar generation for the `" + name + "` grammar" ); + task.setGroup( AntlrPlugin.ANTLR ); + task.getAntlrClasspath().from( project.getConfigurations().named( "antlr" ) ); + } ); groupingTask.configure( (task) -> task.dependsOn( generatorTask ) ); return descriptor; diff --git a/local-build-plugins/src/main/java/org/hibernate/orm/antlr/SplitGrammarDescriptor.java b/local-build-plugins/src/main/java/org/hibernate/orm/antlr/SplitGrammarDescriptor.java index afffea83c5c3..d53862cdd621 100644 --- a/local-build-plugins/src/main/java/org/hibernate/orm/antlr/SplitGrammarDescriptor.java +++ b/local-build-plugins/src/main/java/org/hibernate/orm/antlr/SplitGrammarDescriptor.java @@ -4,8 +4,6 @@ */ package org.hibernate.orm.antlr; -import javax.inject.Inject; - import org.gradle.api.Named; import org.gradle.api.model.ObjectFactory; import org.gradle.api.provider.Property; @@ -15,8 +13,6 @@ */ public class SplitGrammarDescriptor implements Named { private final String name; - private final AntlrSpec antlrSpec; - private final Property packageName; private final Property lexerFileName; private final Property parserFileName; @@ -24,10 +20,8 @@ public class SplitGrammarDescriptor implements Named { private final Property generateVisitor; private final Property generateListener; - @Inject - public SplitGrammarDescriptor(String name, AntlrSpec antlrSpec, ObjectFactory objectFactory) { + public SplitGrammarDescriptor(String name, ObjectFactory objectFactory) { this.name = name; - this.antlrSpec = antlrSpec; packageName = objectFactory.property( String.class ); lexerFileName = objectFactory.property( String.class ); diff --git a/local-build-plugins/src/main/java/org/hibernate/orm/antlr/SplitGrammarGenerationTask.java b/local-build-plugins/src/main/java/org/hibernate/orm/antlr/SplitGrammarGenerationTask.java index 9a50f5544eb8..6d062e95d7f7 100644 --- a/local-build-plugins/src/main/java/org/hibernate/orm/antlr/SplitGrammarGenerationTask.java +++ b/local-build-plugins/src/main/java/org/hibernate/orm/antlr/SplitGrammarGenerationTask.java @@ -4,22 +4,26 @@ */ package org.hibernate.orm.antlr; -import java.io.File; - -import javax.inject.Inject; - import org.gradle.api.DefaultTask; +import org.gradle.api.file.ConfigurableFileCollection; import org.gradle.api.file.Directory; +import org.gradle.api.file.ProjectLayout; import org.gradle.api.file.RegularFile; import org.gradle.api.provider.Provider; +import org.gradle.api.provider.ProviderFactory; import org.gradle.api.tasks.CacheableTask; +import org.gradle.api.tasks.Classpath; import org.gradle.api.tasks.InputFile; +import org.gradle.api.tasks.InputFiles; import org.gradle.api.tasks.OutputDirectory; import org.gradle.api.tasks.PathSensitive; import org.gradle.api.tasks.PathSensitivity; import org.gradle.api.tasks.TaskAction; import org.gradle.process.ExecOperations; +import javax.inject.Inject; +import java.io.File; + import static org.hibernate.orm.antlr.AntlrHelper.stripSillyGeneratedFromLines; /** @@ -40,33 +44,37 @@ public abstract class SplitGrammarGenerationTask extends DefaultTask { public SplitGrammarGenerationTask( SplitGrammarDescriptor grammarDescriptor, AntlrSpec antlrSpec, - ExecOperations execOperations) { + ExecOperations execOperations, + ProjectLayout layout, + ProviderFactory providers + ) { this.grammarDescriptor = grammarDescriptor; this.execOperations = execOperations; - lexerGrammarFile = getProject().provider( () -> { + lexerGrammarFile = providers.provider( () -> { final Directory grammarBaseDirectory = antlrSpec.getGrammarBaseDirectory().get(); final Directory grammarDirectory = grammarBaseDirectory.dir( grammarDescriptor.getPackageName().get().replace( '.', '/' ) ); return grammarDirectory.file( grammarDescriptor.getLexerFileName().get() ); } ); - parserGrammarFile = getProject().provider( () -> { + parserGrammarFile = providers.provider( () -> { final Directory grammarBaseDirectory = antlrSpec.getGrammarBaseDirectory().get(); final Directory grammarDirectory = grammarBaseDirectory.dir( grammarDescriptor.getPackageName().get().replace( '.', '/' ) ); return grammarDirectory.file( grammarDescriptor.getParserFileName().get() ); } ); - generationDirectory = getProject().provider( () -> { - final Directory baseDirectory = getProject().getLayout().getBuildDirectory().dir( "tmp/antlr" ).get(); - return baseDirectory.dir( grammarDescriptor.getPackageName().get().replace( '.', '/' ) ); - } ); + generationDirectory = layout.getBuildDirectory() + .dir( "tmp/antlr" ) + .map(dir -> dir.dir(grammarDescriptor.getPackageName().get().replace('.', '/'))); - outputDirectory = getProject().provider( () -> { - final Directory outputBaseDirectory = antlrSpec.getOutputBaseDirectory().get(); - return outputBaseDirectory.dir( grammarDescriptor.getPackageName().get().replace( '.', '/' ) ); - } ); + outputDirectory = antlrSpec.getOutputBaseDirectory() + .map(dir -> dir.dir(grammarDescriptor.getPackageName().get().replace('.', '/'))); } + @InputFiles + @Classpath + public abstract ConfigurableFileCollection getAntlrClasspath(); + @InputFile @PathSensitive( PathSensitivity.RELATIVE ) public Provider getLexerGrammarFile() { @@ -100,14 +108,14 @@ public void generateLexerAndParser() { generateLexer( generationDir ); generateParser( generationDir ); - stripSillyGeneratedFromLines( generationDir, outputDir, getProject() ); + stripSillyGeneratedFromLines( generationDir, outputDir, getLogger() ); } private void generateLexer(File outputDir) { final File lexerFile = getLexerGrammarFile().get().getAsFile(); - getProject().getLogger().lifecycle( + getLogger().lifecycle( "Starting Antlr lexer grammar generation `{}` : `{}` -> `{}`", grammarDescriptor.getName(), lexerFile.getAbsolutePath(), @@ -118,9 +126,9 @@ private void generateLexer(File outputDir) { execOperations.javaexec( (javaExecSpec) -> { javaExecSpec.getMainClass().set( "org.antlr.v4.Tool" ); - javaExecSpec.classpath( getProject().getConfigurations().getByName( "antlr" ) ); + javaExecSpec.classpath( getAntlrClasspath() ); javaExecSpec.args( - "-o", getProject().relativePath( outputDir.getAbsolutePath() ), + "-o", outputDir.getAbsolutePath(), "-long-messages", lexerFile.getAbsolutePath() ); @@ -131,7 +139,7 @@ private void generateLexer(File outputDir) { private void generateParser(File outputDir) { final File parserFile = getParserGrammarFile().get().getAsFile(); - getProject().getLogger().lifecycle( + getLogger().lifecycle( "Starting Antlr parser grammar generation `{}` : `{}` -> `{}`", grammarDescriptor.getName(), parserFile.getAbsolutePath(), @@ -142,9 +150,9 @@ private void generateParser(File outputDir) { execOperations.javaexec( (javaExecSpec) -> { javaExecSpec.getMainClass().set( "org.antlr.v4.Tool" ); - javaExecSpec.classpath( getProject().getConfigurations().named( "antlr" ) ); + javaExecSpec.classpath( getAntlrClasspath() ); javaExecSpec.args( - "-o", getProject().relativePath( outputDir.getAbsolutePath() ), + "-o", outputDir.getAbsolutePath(), "-long-messages", parserFile.getAbsolutePath() ); diff --git a/local-build-plugins/src/main/java/org/hibernate/orm/post/AbstractJandexAwareTask.java b/local-build-plugins/src/main/java/org/hibernate/orm/post/AbstractJandexAwareTask.java index d09b4695f0af..879adbf6d21c 100644 --- a/local-build-plugins/src/main/java/org/hibernate/orm/post/AbstractJandexAwareTask.java +++ b/local-build-plugins/src/main/java/org/hibernate/orm/post/AbstractJandexAwareTask.java @@ -4,22 +4,15 @@ */ package org.hibernate.orm.post; -import java.io.File; -import java.io.FileNotFoundException; -import java.io.FileOutputStream; -import java.io.IOException; -import java.io.OutputStreamWriter; -import java.util.List; -import java.util.TreeSet; -import java.util.function.Consumer; - import org.gradle.api.DefaultTask; import org.gradle.api.file.RegularFile; +import org.gradle.api.model.ObjectFactory; +import org.gradle.api.provider.Property; import org.gradle.api.provider.Provider; import org.gradle.api.tasks.InputFile; import org.gradle.api.tasks.Internal; +import org.gradle.api.tasks.Nested; import org.gradle.api.tasks.OutputFile; - import org.hibernate.build.OrmBuildDetails; import org.jboss.jandex.AnnotationInstance; import org.jboss.jandex.AnnotationTarget; @@ -28,32 +21,46 @@ import org.jboss.jandex.Index; import org.jboss.jandex.MethodInfo; +import javax.inject.Inject; +import java.io.File; +import java.io.FileNotFoundException; +import java.io.FileOutputStream; +import java.io.IOException; +import java.io.OutputStreamWriter; +import java.util.List; +import java.util.TreeSet; +import java.util.function.Consumer; + import static org.hibernate.orm.post.ReportGenerationPlugin.TASK_GROUP_NAME; /** * @author Steve Ebersole */ public abstract class AbstractJandexAwareTask extends DefaultTask { - private final Provider indexManager; + private final Property ormBuildDetails; - public AbstractJandexAwareTask() { + @Inject + public AbstractJandexAwareTask(ObjectFactory objects) { setGroup( TASK_GROUP_NAME ); + ormBuildDetails = objects.property( OrmBuildDetails.class ); - this.indexManager = getProject().provider( () -> getProject().getExtensions().getByType( IndexManager.class ) ); - getInputs().property( "version", getProject().getExtensions().getByType( OrmBuildDetails.class ).getHibernateVersion() ); + getInputs().property( "version", ormBuildDetails.map( OrmBuildDetails::getHibernateVersion ) ); } @Internal protected abstract Provider getTaskReportFileReference(); @Internal - protected IndexManager getIndexManager() { - return indexManager.get(); + protected abstract Property getIndexManager(); + + @Nested + public Property getOrmBuildDetails() { + return ormBuildDetails; } @InputFile public Provider getIndexFileReference() { - return indexManager.get().getIndexFileReferenceAccess(); + return getIndexManager().get().getIndexFileReferenceAccess(); } @OutputFile @@ -94,7 +101,7 @@ protected void processAnnotations(DotName annotationName, TreeSet inc } protected void processAnnotations(Consumer inclusions, DotName... annotationNames) { - final Index index = getIndexManager().getIndex(); + final Index index = getIndexManager().get().getIndex(); for ( int i = 0; i < annotationNames.length; i++ ) { final DotName annotationName = annotationNames[ i ]; diff --git a/local-build-plugins/src/main/java/org/hibernate/orm/post/DeprecationReportTask.java b/local-build-plugins/src/main/java/org/hibernate/orm/post/DeprecationReportTask.java index 3828820cadbd..5ac149785d6c 100644 --- a/local-build-plugins/src/main/java/org/hibernate/orm/post/DeprecationReportTask.java +++ b/local-build-plugins/src/main/java/org/hibernate/orm/post/DeprecationReportTask.java @@ -4,32 +4,36 @@ */ package org.hibernate.orm.post; -import java.io.IOException; -import java.io.OutputStreamWriter; -import java.util.Comparator; -import java.util.TreeSet; - +import org.gradle.api.file.ProjectLayout; import org.gradle.api.file.RegularFile; +import org.gradle.api.model.ObjectFactory; import org.gradle.api.provider.Property; import org.gradle.api.provider.Provider; import org.gradle.api.tasks.TaskAction; - import org.jboss.jandex.DotName; +import javax.inject.Inject; +import java.io.IOException; +import java.io.OutputStreamWriter; +import java.util.Comparator; +import java.util.TreeSet; + /** * @author Steve Ebersole */ -public class DeprecationReportTask extends AbstractJandexAwareTask { +public abstract class DeprecationReportTask extends AbstractJandexAwareTask { public static final String REMOVE_ANN_NAME = "org.hibernate.Remove"; public static final String DEPRECATED_ANN_NAME = Deprecated.class.getName(); private final Property reportFile; - public DeprecationReportTask() { + @Inject + public DeprecationReportTask(ProjectLayout layout, ObjectFactory objects) { + super( objects ); setDescription( "Generates a report for things considered deprecated" ); - reportFile = getProject().getObjects().fileProperty(); - reportFile.convention( getProject().getLayout().getBuildDirectory().file( "orm/reports/deprecated.txt" ) ); + reportFile = objects.fileProperty(); + reportFile.convention( layout.getBuildDirectory().file( "orm/reports/deprecated.txt" ) ); } @Override diff --git a/local-build-plugins/src/main/java/org/hibernate/orm/post/DialectReportTask.java b/local-build-plugins/src/main/java/org/hibernate/orm/post/DialectReportTask.java index 2bb37e757022..ccf625b7ed7b 100644 --- a/local-build-plugins/src/main/java/org/hibernate/orm/post/DialectReportTask.java +++ b/local-build-plugins/src/main/java/org/hibernate/orm/post/DialectReportTask.java @@ -6,6 +6,7 @@ import org.gradle.api.file.ConfigurableFileCollection; import org.gradle.api.file.RegularFile; +import org.gradle.api.model.ObjectFactory; import org.gradle.api.provider.Property; import org.gradle.api.provider.Provider; import org.gradle.api.tasks.Input; @@ -15,6 +16,7 @@ import org.jboss.jandex.ClassInfo; import org.jboss.jandex.Index; +import javax.inject.Inject; import java.io.File; import java.io.FileNotFoundException; import java.io.FileOutputStream; @@ -37,11 +39,14 @@ public abstract class DialectReportTask extends AbstractJandexAwareTask { private final Property sourcePackage; private final Property reportFile; - public DialectReportTask() { + @Inject + public DialectReportTask(ObjectFactory objects) { + super( objects ); setDescription( "Generates a report of the supported Dialects" ); - dialectReportSources = getProject().getObjects().fileCollection(); - sourcePackage = getProject().getObjects().property(String.class); - reportFile = getProject().getObjects().fileProperty(); + + dialectReportSources = objects.fileCollection(); + sourcePackage = objects.property( String.class ); + reportFile = objects.fileProperty(); } @Input @@ -69,7 +74,7 @@ public void generateDialectReport() { final ClassLoader classLoader = Helper.asClassLoader( dialectReportSources ); final DialectClassDelegate dialectClassDelegate = new DialectClassDelegate( classLoader ); - final Index index = getIndexManager().getIndex(); + final Index index = getIndexManager().get().getIndex(); final Collection allDialectClasses = index.getAllKnownSubclasses( DialectClassDelegate.DIALECT_CLASS_NAME ); String sourcePackagePrefix = this.sourcePackage.get() + "."; allDialectClasses.removeIf( c -> !c.name().toString().startsWith( sourcePackagePrefix ) ); diff --git a/local-build-plugins/src/main/java/org/hibernate/orm/post/IncubationReportTask.java b/local-build-plugins/src/main/java/org/hibernate/orm/post/IncubationReportTask.java index 7035e6229ce9..b557fe469bf1 100644 --- a/local-build-plugins/src/main/java/org/hibernate/orm/post/IncubationReportTask.java +++ b/local-build-plugins/src/main/java/org/hibernate/orm/post/IncubationReportTask.java @@ -4,19 +4,20 @@ */ package org.hibernate.orm.post; -import java.io.IOException; -import java.io.OutputStreamWriter; -import java.util.Comparator; -import java.util.TreeSet; -import javax.inject.Inject; - +import org.gradle.api.file.ProjectLayout; import org.gradle.api.file.RegularFile; +import org.gradle.api.model.ObjectFactory; import org.gradle.api.provider.Property; import org.gradle.api.provider.Provider; import org.gradle.api.tasks.TaskAction; - import org.jboss.jandex.DotName; +import javax.inject.Inject; +import java.io.IOException; +import java.io.OutputStreamWriter; +import java.util.Comparator; +import java.util.TreeSet; + /** * @author Steve Ebersole @@ -27,10 +28,11 @@ public abstract class IncubationReportTask extends AbstractJandexAwareTask { private final Property reportFile; @Inject - public IncubationReportTask() { + public IncubationReportTask(ProjectLayout layout, ObjectFactory objects) { + super( objects ); setDescription( "Generates a report for things considered incubating" ); - reportFile = getProject().getObjects().fileProperty(); - reportFile.convention( getProject().getLayout().getBuildDirectory().file( "orm/reports/incubating.txt" ) ); + reportFile = objects.fileProperty(); + reportFile.convention( layout.getBuildDirectory().file( "orm/reports/incubating.txt" ) ); } @Override diff --git a/local-build-plugins/src/main/java/org/hibernate/orm/post/IndexManager.java b/local-build-plugins/src/main/java/org/hibernate/orm/post/IndexManager.java index cdbb1790a8fb..25f1084d3b67 100644 --- a/local-build-plugins/src/main/java/org/hibernate/orm/post/IndexManager.java +++ b/local-build-plugins/src/main/java/org/hibernate/orm/post/IndexManager.java @@ -4,74 +4,86 @@ */ package org.hibernate.orm.post; -import java.io.File; -import java.io.FileInputStream; -import java.io.FileNotFoundException; -import java.io.FileOutputStream; -import java.io.FileWriter; -import java.io.IOException; -import java.nio.file.Files; -import java.util.Comparator; -import java.util.List; -import java.util.Set; -import java.util.TreeSet; - -import org.gradle.api.Project; -import org.gradle.api.artifacts.Configuration; +import org.gradle.api.file.ArchiveOperations; +import org.gradle.api.file.ConfigurableFileCollection; import org.gradle.api.file.FileTree; import org.gradle.api.file.FileVisitDetails; import org.gradle.api.file.FileVisitor; +import org.gradle.api.file.ProjectLayout; import org.gradle.api.file.RegularFile; import org.gradle.api.file.RelativePath; +import org.gradle.api.logging.Logger; +import org.gradle.api.model.ObjectFactory; import org.gradle.api.provider.Provider; - +import org.gradle.api.tasks.InputFiles; +import org.gradle.api.tasks.Internal; +import org.gradle.api.tasks.OutputFile; +import org.gradle.api.tasks.SkipWhenEmpty; import org.jboss.jandex.ClassSummary; import org.jboss.jandex.Index; import org.jboss.jandex.IndexReader; import org.jboss.jandex.IndexWriter; import org.jboss.jandex.Indexer; +import javax.inject.Inject; +import java.io.File; +import java.io.FileInputStream; +import java.io.FileNotFoundException; +import java.io.FileOutputStream; +import java.io.FileWriter; +import java.io.IOException; +import java.nio.file.Files; +import java.util.Comparator; +import java.util.List; +import java.util.Set; +import java.util.TreeSet; + /** * Encapsulates and manages a Jandex Index * * @author Steve Ebersole */ public class IndexManager { - private final Configuration artifactsToProcess; + private final ConfigurableFileCollection artifactsToProcess; private final Provider indexFileReferenceAccess; private final Provider packageFileReferenceAccess; - private final Project project; - private Index index; private TreeSet internalPackageNames; - public IndexManager(Configuration artifactsToProcess, Project project) { - this.artifactsToProcess = artifactsToProcess; - this.indexFileReferenceAccess = project.getLayout() + @Inject + public IndexManager(ObjectFactory objects, ProjectLayout layout) { + this.artifactsToProcess = objects.fileCollection(); + this.indexFileReferenceAccess = layout .getBuildDirectory() .file( "orm/reports/indexing/jandex.idx" ); - this.packageFileReferenceAccess = project.getLayout() + this.packageFileReferenceAccess = layout .getBuildDirectory() .file( "orm/reports/indexing/internal-packages.txt" ); - this.project = project; } - public Configuration getArtifactsToProcess() { + + @InputFiles + @SkipWhenEmpty + public ConfigurableFileCollection getArtifactsToProcess() { return artifactsToProcess; } + @OutputFile public Provider getIndexFileReferenceAccess() { return indexFileReferenceAccess; } + @OutputFile public Provider getPackageFileReferenceAccess() { return packageFileReferenceAccess; } + @Internal public TreeSet getInternalPackageNames() { return internalPackageNames; } + @Internal public Index getIndex() { if ( index == null ) { index = loadIndex( indexFileReferenceAccess ); @@ -125,7 +137,7 @@ private static TreeSet loadInternalPackageNames(Provider /** * Used from {@link IndexerTask} as its action */ - void index() { + void index(ArchiveOperations archiveOperations, Logger logger) { if ( index != null ) { throw new IllegalStateException( "Index was already created or loaded" ); } @@ -134,10 +146,10 @@ void index() { internalPackageNames = new TreeSet<>( Comparator.comparing( Inclusion::getPath ) ); // note: each of `artifacts` is a jar-file - final Set artifacts = artifactsToProcess.resolve(); + final Set artifacts = artifactsToProcess.getFiles(); artifacts.forEach( (jar) -> { - final FileTree jarFileTree = project.zipTree( jar ); + final FileTree jarFileTree = archiveOperations.zipTree( jar ); jarFileTree.visit( new FileVisitor() { private boolean isInOrmPackage(RelativePath relativePath) { @@ -169,8 +181,7 @@ public void visitFile(FileVisitDetails details) { try (final FileInputStream stream = new FileInputStream( details.getFile() )) { final ClassSummary classSummary = indexer.indexWithSummary( stream ); if ( classSummary == null ) { - project.getLogger() - .lifecycle( "Problem indexing class file - " + details.getFile() + logger.lifecycle( "Problem indexing class file - {}", details.getFile() .getAbsolutePath() ); } } diff --git a/local-build-plugins/src/main/java/org/hibernate/orm/post/IndexerTask.java b/local-build-plugins/src/main/java/org/hibernate/orm/post/IndexerTask.java index 64b779b5dc99..de14f659b936 100644 --- a/local-build-plugins/src/main/java/org/hibernate/orm/post/IndexerTask.java +++ b/local-build-plugins/src/main/java/org/hibernate/orm/post/IndexerTask.java @@ -5,14 +5,13 @@ package org.hibernate.orm.post; import org.gradle.api.DefaultTask; -import org.gradle.api.artifacts.Configuration; -import org.gradle.api.file.RegularFile; -import org.gradle.api.provider.Provider; -import org.gradle.api.tasks.InputFiles; -import org.gradle.api.tasks.OutputFile; -import org.gradle.api.tasks.SkipWhenEmpty; +import org.gradle.api.file.ArchiveOperations; +import org.gradle.api.provider.Property; +import org.gradle.api.tasks.Nested; import org.gradle.api.tasks.TaskAction; +import javax.inject.Inject; + import static org.hibernate.orm.post.ReportGenerationPlugin.AGGREGATE_CONFIG_NAME; import static org.hibernate.orm.post.ReportGenerationPlugin.TASK_GROUP_NAME; @@ -22,33 +21,20 @@ * @author Steve Ebersole */ public abstract class IndexerTask extends DefaultTask { - private final Provider indexManager; + private final ArchiveOperations archiveOperations; - public IndexerTask() { + @Inject + public IndexerTask(ArchiveOperations archiveOperations) { + this.archiveOperations = archiveOperations; setGroup( TASK_GROUP_NAME ); setDescription( String.format( "Builds a Jandex Index from the artifacts attached to the `%s` Configuration", AGGREGATE_CONFIG_NAME ) ); - - indexManager = getProject().provider( () -> getProject().getExtensions().getByType( IndexManager.class ) ); - } - - @InputFiles - @SkipWhenEmpty - public Configuration getArtifactsToProcess() { - return indexManager.get().getArtifactsToProcess(); } - @OutputFile - public Provider getIndexFileReference() { - return indexManager.get().getIndexFileReferenceAccess(); - } - - @OutputFile - public Provider getPackageFileReferenceAccess() { - return indexManager.get().getPackageFileReferenceAccess(); - } + @Nested + public abstract Property getIndexManager(); @TaskAction public void createIndex() { - indexManager.get().index(); + getIndexManager().get().index( archiveOperations, getLogger() ); } } diff --git a/local-build-plugins/src/main/java/org/hibernate/orm/post/InternalsReportTask.java b/local-build-plugins/src/main/java/org/hibernate/orm/post/InternalsReportTask.java index 2d8ec8caf96f..dea1a8576e27 100644 --- a/local-build-plugins/src/main/java/org/hibernate/orm/post/InternalsReportTask.java +++ b/local-build-plugins/src/main/java/org/hibernate/orm/post/InternalsReportTask.java @@ -4,18 +4,20 @@ */ package org.hibernate.orm.post; -import java.io.IOException; -import java.io.OutputStreamWriter; -import java.util.Comparator; -import java.util.TreeSet; - +import org.gradle.api.file.ProjectLayout; import org.gradle.api.file.RegularFile; +import org.gradle.api.model.ObjectFactory; import org.gradle.api.provider.Property; import org.gradle.api.provider.Provider; import org.gradle.api.tasks.TaskAction; - import org.jboss.jandex.DotName; +import javax.inject.Inject; +import java.io.IOException; +import java.io.OutputStreamWriter; +import java.util.Comparator; +import java.util.TreeSet; + /** * @author Steve Ebersole @@ -25,10 +27,12 @@ public abstract class InternalsReportTask extends AbstractJandexAwareTask { private final Property reportFile; - public InternalsReportTask() { + @Inject + public InternalsReportTask(ProjectLayout layout, ObjectFactory objects) { + super( objects ); setDescription( "Generates a report of things consider internal" ); - reportFile = getProject().getObjects().fileProperty(); - reportFile.convention( getProject().getLayout().getBuildDirectory().file( "orm/reports/internal.txt" ) ); + reportFile = objects.fileProperty(); + reportFile.convention( layout.getBuildDirectory().file( "orm/reports/internal.txt" ) ); } @Override @@ -39,7 +43,7 @@ protected Provider getTaskReportFileReference() { @TaskAction public void generateInternalsReport() { final TreeSet internals = new TreeSet<>( Comparator.comparing( Inclusion::getPath ) ); - internals.addAll( getIndexManager().getInternalPackageNames() ); + internals.addAll( getIndexManager().get().getInternalPackageNames() ); processAnnotations( DotName.createSimple( INTERNAL_ANN_NAME ), internals ); writeReport( internals ); diff --git a/local-build-plugins/src/main/java/org/hibernate/orm/post/LoggingReportTask.java b/local-build-plugins/src/main/java/org/hibernate/orm/post/LoggingReportTask.java index d6a0d92fe7b7..1e91bfb5f63f 100644 --- a/local-build-plugins/src/main/java/org/hibernate/orm/post/LoggingReportTask.java +++ b/local-build-plugins/src/main/java/org/hibernate/orm/post/LoggingReportTask.java @@ -4,6 +4,19 @@ */ package org.hibernate.orm.post; +import org.gradle.api.file.ProjectLayout; +import org.gradle.api.file.RegularFile; +import org.gradle.api.model.ObjectFactory; +import org.gradle.api.provider.Property; +import org.gradle.api.provider.Provider; +import org.gradle.api.tasks.TaskAction; +import org.jboss.jandex.AnnotationInstance; +import org.jboss.jandex.AnnotationValue; +import org.jboss.jandex.ClassInfo; +import org.jboss.jandex.DotName; +import org.jboss.jandex.Index; + +import javax.inject.Inject; import java.io.File; import java.io.FileNotFoundException; import java.io.FileOutputStream; @@ -15,17 +28,6 @@ import java.util.TreeMap; import java.util.TreeSet; -import org.gradle.api.file.RegularFile; -import org.gradle.api.provider.Property; -import org.gradle.api.provider.Provider; -import org.gradle.api.tasks.TaskAction; - -import org.jboss.jandex.AnnotationInstance; -import org.jboss.jandex.AnnotationValue; -import org.jboss.jandex.ClassInfo; -import org.jboss.jandex.DotName; -import org.jboss.jandex.Index; - import static org.jboss.jandex.DotName.createSimple; /** @@ -46,10 +48,12 @@ public abstract class LoggingReportTask extends AbstractJandexAwareTask { private final Property reportFile; - public LoggingReportTask() { + @Inject + public LoggingReportTask(ProjectLayout layout, ObjectFactory objects) { + super( objects ); setDescription( "Generates a report of \"system\" logging" ); - reportFile = getProject().getObjects().fileProperty(); - reportFile.convention( getProject().getLayout().getBuildDirectory().file( "orm/generated/logging/index.adoc" ) ); + reportFile = objects.fileProperty(); + reportFile.convention( layout.getBuildDirectory().file( "orm/generated/logging/index.adoc" ) ); } @Override @@ -62,7 +66,7 @@ public void generateLoggingReport() { final TreeMap subSystemByName = new TreeMap<>(); final TreeSet idRanges = new TreeSet<>( Comparator.comparing( IdRange::getMinValue ) ); - final Index index = getIndexManager().getIndex(); + final Index index = getIndexManager().get().getIndex(); final List subSysAnnUsages = index.getAnnotations( SUB_SYS_ANN_NAME ); final List msgLoggerAnnUsages = index.getAnnotations( MSG_LOGGER_ANN_NAME ); @@ -118,7 +122,7 @@ public void generateLoggingReport() { private IdRange calculateIdRange(AnnotationInstance msgLoggerAnnUsage, SubSystem subSystem) { final ClassInfo loggerClassInfo = msgLoggerAnnUsage.target().asClass(); - getProject().getLogger().lifecycle( "MessageLogger (`{}`) missing id-range", loggerClassInfo.simpleName() ); + getLogger().lifecycle( "MessageLogger (`{}`) missing id-range", loggerClassInfo.simpleName() ); final List messageAnnUsages = loggerClassInfo.annotations( MSG_ANN_NAME ); if ( messageAnnUsages.isEmpty() ) { diff --git a/local-build-plugins/src/main/java/org/hibernate/orm/post/ReportGenerationPlugin.java b/local-build-plugins/src/main/java/org/hibernate/orm/post/ReportGenerationPlugin.java index b5ff4cf22dcf..c5e3e45d8008 100644 --- a/local-build-plugins/src/main/java/org/hibernate/orm/post/ReportGenerationPlugin.java +++ b/local-build-plugins/src/main/java/org/hibernate/orm/post/ReportGenerationPlugin.java @@ -7,6 +7,7 @@ import org.gradle.api.Plugin; import org.gradle.api.Project; import org.gradle.api.artifacts.Configuration; +import org.hibernate.build.OrmBuildDetails; /** * @author Steve Ebersole @@ -23,36 +24,41 @@ public void apply(Project project) { .maybeCreate( AGGREGATE_CONFIG_NAME ) .setDescription( "Used to collect the jars with classes files to be used in the aggregation reports for `@Internal`, `@Incubating`, etc" ); - final var indexManager = new IndexManager( artifactsToProcess, project ); - project.getExtensions().add( "indexManager", indexManager ); + final var indexManager = project.getExtensions().create( "indexManager", IndexManager.class ); + indexManager.getArtifactsToProcess().from( artifactsToProcess ); final var indexerTask = project.getTasks().register( "buildAggregatedIndex", - IndexerTask.class + IndexerTask.class, + task -> task.getIndexManager().set( indexManager ) ); + final var details = project.getExtensions().getByType( OrmBuildDetails.class ); + project.getTasks().withType( AbstractJandexAwareTask.class ) + .configureEach(task -> { + task.getOrmBuildDetails().set( details ); + task.getIndexManager().set( indexManager ); + task.dependsOn( indexerTask ); + }); + final var incubatingTask = project.getTasks().register( "generateIncubationReport", - IncubationReportTask.class, - (task) -> task.dependsOn( indexerTask ) + IncubationReportTask.class ); final var deprecationTask = project.getTasks().register( "generateDeprecationReport", - DeprecationReportTask.class, - (task) -> task.dependsOn( indexerTask ) + DeprecationReportTask.class ); final var internalsTask = project.getTasks().register( "generateInternalsReport", - InternalsReportTask.class, - (task) -> task.dependsOn( indexerTask ) + InternalsReportTask.class ); final var loggingTask = project.getTasks().register( "generateLoggingReport", - LoggingReportTask.class, - (task) -> task.dependsOn( indexerTask ) + LoggingReportTask.class ); final var dialectConfig = project.getConfigurations() @@ -62,7 +68,6 @@ public void apply(Project project) { "generateDialectTableReport", DialectReportTask.class, (task) -> { - task.dependsOn( indexerTask ); task.getDialectReportSources().from( dialectConfig ); task.getSourcePackage().set( "org.hibernate.dialect" ); task.getReportFile().set( project.getLayout().getBuildDirectory().file( "orm/generated/dialect/dialect-table.adoc" ) ); @@ -76,21 +81,23 @@ public void apply(Project project) { "generateCommunityDialectTableReport", DialectReportTask.class, (task) -> { - task.dependsOn( indexerTask ); task.getDialectReportSources().from( communityDialectConfig ); task.getSourcePackage().set( "org.hibernate.community.dialect" ); task.getReportFile().set( project.getLayout().getBuildDirectory().file( "orm/generated/dialect/dialect-table-community.adoc" ) ); } ); - final var groupingTask = project.getTasks().maybeCreate( "generateReports" ); - groupingTask.setGroup( TASK_GROUP_NAME ); - groupingTask.dependsOn( indexerTask ); - groupingTask.dependsOn( incubatingTask ); - groupingTask.dependsOn( deprecationTask ); - groupingTask.dependsOn( internalsTask ); - groupingTask.dependsOn( loggingTask ); - groupingTask.dependsOn( dialectTableTask ); - groupingTask.dependsOn( communityDialectTableTask ); + project.getTasks().register( "generateReports", groupingTask -> { + groupingTask.setGroup( TASK_GROUP_NAME ); + groupingTask.dependsOn( + indexerTask, + incubatingTask, + deprecationTask, + internalsTask, + loggingTask, + dialectTableTask, + communityDialectTableTask + ); + } ); } } diff --git a/local-build-plugins/src/main/java/org/hibernate/orm/properties/AsciiDocWriter.java b/local-build-plugins/src/main/java/org/hibernate/orm/properties/AsciiDocWriter.java index 2f4e3be27de7..a8772177261b 100644 --- a/local-build-plugins/src/main/java/org/hibernate/orm/properties/AsciiDocWriter.java +++ b/local-build-plugins/src/main/java/org/hibernate/orm/properties/AsciiDocWriter.java @@ -5,6 +5,8 @@ package org.hibernate.orm.properties; +import org.gradle.api.file.RegularFile; + import java.io.File; import java.io.FileWriter; import java.io.IOException; @@ -14,9 +16,6 @@ import java.util.Map; import java.util.SortedSet; -import org.gradle.api.Project; -import org.gradle.api.file.RegularFile; - /** * @author Marko Bekhta */ @@ -25,8 +24,8 @@ public class AsciiDocWriter { public static void writeToFile( String anchorNameBase, Map> settingDescriptorMap, - RegularFile outputFile, - Project project) { + RegularFile outputFile + ) { final File outputFileAsFile = outputFile.getAsFile(); try { Files.createDirectories( outputFileAsFile.getParentFile().toPath() ); @@ -36,7 +35,7 @@ public static void writeToFile( } try ( FileWriter fileWriter = new FileWriter( outputFileAsFile ) ) { - write( anchorNameBase, settingDescriptorMap, fileWriter, project ); + write( anchorNameBase, settingDescriptorMap, fileWriter ); } catch (IOException e) { throw new RuntimeException( "Failed to produce asciidoc output for collected properties", e ); @@ -46,8 +45,8 @@ public static void writeToFile( private static void write( String anchorNameBase, Map> settingDescriptorMap, - FileWriter writer, - Project project) throws IOException { + FileWriter writer + ) throws IOException { for ( Map.Entry> entry : settingDescriptorMap.entrySet() ) { final SettingsDocSection sectionDescriptor = entry.getKey(); final SortedSet sectionSettingDescriptors = entry.getValue(); diff --git a/local-build-plugins/src/main/java/org/hibernate/orm/properties/SettingsDocExtension.java b/local-build-plugins/src/main/java/org/hibernate/orm/properties/SettingsDocExtension.java index 1a2f93a78435..f9743856215d 100644 --- a/local-build-plugins/src/main/java/org/hibernate/orm/properties/SettingsDocExtension.java +++ b/local-build-plugins/src/main/java/org/hibernate/orm/properties/SettingsDocExtension.java @@ -4,17 +4,14 @@ */ package org.hibernate.orm.properties; -import javax.inject.Inject; - import org.gradle.api.Action; import org.gradle.api.NamedDomainObjectContainer; -import org.gradle.api.Project; import org.gradle.api.file.DirectoryProperty; import org.gradle.api.file.RegularFileProperty; +import org.gradle.api.model.ObjectFactory; import org.gradle.api.provider.Property; -import org.gradle.util.internal.ConfigureUtil; -import groovy.lang.Closure; +import javax.inject.Inject; /** * DSL extension for configuring aspects of the settings documentation process @@ -32,13 +29,13 @@ public class SettingsDocExtension { private final RegularFileProperty outputFile; @Inject - public SettingsDocExtension(Project project) { - javadocDirectory = project.getObjects().directoryProperty(); - publishedDocsUrl = project.getObjects().property( String.class ); - anchorNameBase = project.getObjects().property( String.class ); - sections = project.getObjects().domainObjectContainer( SettingsDocSection.class, SettingsDocSection::create ); + public SettingsDocExtension(ObjectFactory objects) { + javadocDirectory = objects.directoryProperty(); + publishedDocsUrl = objects.property( String.class ); + anchorNameBase = objects.property( String.class ); + sections = objects.domainObjectContainer( SettingsDocSection.class, SettingsDocSection::create ); - outputFile = project.getObjects().fileProperty(); + outputFile = objects.fileProperty(); } /** @@ -82,13 +79,6 @@ public void sections(Action> acti action.execute( getSections() ); } - /** - * @see #getSections() - */ - public void sections(Closure> closure) { - ConfigureUtil.configure( closure, getSections() ); - } - /** * The file where the settings doc should be written *

diff --git a/local-build-plugins/src/main/java/org/hibernate/orm/properties/SettingsDocGenerationTask.java b/local-build-plugins/src/main/java/org/hibernate/orm/properties/SettingsDocGenerationTask.java index 4e7ab98ca5d7..a52c1e7360fd 100644 --- a/local-build-plugins/src/main/java/org/hibernate/orm/properties/SettingsDocGenerationTask.java +++ b/local-build-plugins/src/main/java/org/hibernate/orm/properties/SettingsDocGenerationTask.java @@ -6,9 +6,9 @@ import org.gradle.api.DefaultTask; import org.gradle.api.NamedDomainObjectContainer; -import org.gradle.api.Project; import org.gradle.api.file.DirectoryProperty; import org.gradle.api.file.RegularFileProperty; +import org.gradle.api.model.ObjectFactory; import org.gradle.api.provider.Property; import org.gradle.api.tasks.IgnoreEmptyDirectories; import org.gradle.api.tasks.Input; @@ -33,28 +33,30 @@ public class SettingsDocGenerationTask extends DefaultTask { private final Property publishedDocsUrl; private final Property anchorNameBase; private final NamedDomainObjectContainer sections; + private final Property ormBuildDetails; private final RegularFileProperty outputFile; @Inject - public SettingsDocGenerationTask(SettingsDocExtension dslExtension, Project project) { + public SettingsDocGenerationTask(SettingsDocExtension dslExtension, ObjectFactory objects) { setGroup( TASK_GROUP_NAME ); setDescription( "Collects descriptions of Hibernate configuration properties in preparation for inclusion in the User Guide" ); - getInputs().property( "ormVersion", getProject().getExtensions().getByType( OrmBuildDetails.class ).getHibernateVersion() ); + ormBuildDetails = objects.property( OrmBuildDetails.class ); + getInputs().property( "ormVersion", ormBuildDetails.map( OrmBuildDetails::getHibernateVersion ) ); - javadocDirectory = project.getObjects().directoryProperty(); + javadocDirectory = objects.directoryProperty(); javadocDirectory.convention( dslExtension.getJavadocDirectory() ); - publishedDocsUrl = project.getObjects().property( String.class ); + publishedDocsUrl = objects.property( String.class ); publishedDocsUrl.convention( dslExtension.getPublishedDocsUrl() ); - anchorNameBase = project.getObjects().property( String.class ); + anchorNameBase = objects.property( String.class ); anchorNameBase.convention( dslExtension.getAnchorNameBase() ); sections = dslExtension.getSections(); - outputFile = project.getObjects().fileProperty(); + outputFile = objects.fileProperty(); outputFile.convention( dslExtension.getOutputFile() ); } @@ -79,6 +81,11 @@ public NamedDomainObjectContainer getSections() { return sections; } + @Nested + public Property getOrmBuildDetails() { + return ormBuildDetails; + } + @OutputFile public RegularFileProperty getOutputFile() { return outputFile; @@ -88,7 +95,7 @@ public RegularFileProperty getOutputFile() { public void generateSettingsDocumentation() { final String publishedJavadocUrl = publishedDocsUrl.get() + "/" - + getProject().getExtensions().getByType( OrmBuildDetails.class ).getHibernateVersionFamily() + + ormBuildDetails.get().getHibernateVersionFamily() + "/javadocs/"; AsciiDocWriter.writeToFile( @@ -98,8 +105,7 @@ public void generateSettingsDocumentation() { sections.getAsMap(), publishedJavadocUrl ), - outputFile.get(), - getProject() + outputFile.get() ); } } diff --git a/local-build-plugins/src/main/java/org/hibernate/orm/properties/SettingsDocumentationPlugin.java b/local-build-plugins/src/main/java/org/hibernate/orm/properties/SettingsDocumentationPlugin.java index 7635d4cfcc53..b820a22f6a4d 100644 --- a/local-build-plugins/src/main/java/org/hibernate/orm/properties/SettingsDocumentationPlugin.java +++ b/local-build-plugins/src/main/java/org/hibernate/orm/properties/SettingsDocumentationPlugin.java @@ -6,6 +6,8 @@ import org.gradle.api.Plugin; import org.gradle.api.Project; +import org.gradle.api.tasks.TaskProvider; +import org.hibernate.build.OrmBuildDetails; import org.hibernate.build.aspects.ModuleAspect; import static org.hibernate.orm.properties.SettingsDocExtension.EXTENSION_NAME; @@ -25,13 +27,16 @@ public void apply(Project project) { project.getPluginManager().apply( ModuleAspect.class ); // create and register the DSL extension - final SettingsDocExtension dslExtension = new SettingsDocExtension( project ); - project.getExtensions().add( EXTENSION_NAME, dslExtension ); + final SettingsDocExtension dslExtension = project.getExtensions() + .create( SettingsDocExtension.class, EXTENSION_NAME, SettingsDocExtension.class ); dslExtension.getJavadocDirectory().convention( project.getLayout().getBuildDirectory().dir( "javadocs" ) ); dslExtension.getPublishedDocsUrl().convention( "https://docs.jboss.org/hibernate/orm" ); dslExtension.getOutputFile().convention( project.getLayout().getBuildDirectory().file( "asciidoc/fragments/config-settings.adoc" ) ); // create the generation task - project.getTasks().register( TASK_NAME, SettingsDocGenerationTask.class, dslExtension, project ); + final OrmBuildDetails details = project.getExtensions().getByType( OrmBuildDetails.class ); + final TaskProvider settingsDocGenerationTask = project.getTasks() + .register( TASK_NAME, SettingsDocGenerationTask.class, dslExtension ); + settingsDocGenerationTask.configure( task -> task.getOrmBuildDetails().set( details ) ); } } diff --git a/tooling/hibernate-ant/hibernate-ant.gradle b/tooling/hibernate-ant/hibernate-ant.gradle index a6af63b9a823..ea18471b4847 100644 --- a/tooling/hibernate-ant/hibernate-ant.gradle +++ b/tooling/hibernate-ant/hibernate-ant.gradle @@ -11,4 +11,8 @@ dependencies { compileOnly libs.ant implementation project( ':hibernate-core' ) testImplementation libs.ant -} \ No newline at end of file +} + +tasks.named( "compileJava", JavaCompile ) { + notCompatibleWithConfigurationCache( "org.hibernate.build.version-injection plugin call project in execution time" ) +} diff --git a/tooling/metamodel-generator/hibernate-processor.gradle b/tooling/metamodel-generator/hibernate-processor.gradle index 78ce0fde9b79..a444ef91aad7 100644 --- a/tooling/metamodel-generator/hibernate-processor.gradle +++ b/tooling/metamodel-generator/hibernate-processor.gradle @@ -168,3 +168,7 @@ tasks.forbiddenApisQuarkusOrmPanache { tasks.forbiddenApisQuarkusHrPanache { enabled = false } + +tasks.named( "compileJava", JavaCompile ) { + notCompatibleWithConfigurationCache( "org.hibernate.build.version-injection plugin call project in execution time" ) +}