From 8693b2fa0ddcee9b25bfe8ff604510ca19ae7b9d Mon Sep 17 00:00:00 2001 From: Lukas Eder Date: Mon, 12 Aug 2024 09:16:41 +0200 Subject: [PATCH] [jOOQ/jOOQ#16997] jOOQ-codegen-gradle plugin doesn't work with Gradle's configuration cache feature --- .../jooq/codegen/gradle/CodegenPlugin.java | 16 +++++++++-- .../gradle/CodegenPluginExtension.java | 19 +++++-------- .../org/jooq/codegen/gradle/CodegenTask.java | 20 +------------ .../codegen/gradle/NamedConfiguration.java | 28 ++++++++++--------- 4 files changed, 37 insertions(+), 46 deletions(-) diff --git a/jOOQ-codegen-gradle/src/main/java/org/jooq/codegen/gradle/CodegenPlugin.java b/jOOQ-codegen-gradle/src/main/java/org/jooq/codegen/gradle/CodegenPlugin.java index d8d51933eb..3ee0b84448 100644 --- a/jOOQ-codegen-gradle/src/main/java/org/jooq/codegen/gradle/CodegenPlugin.java +++ b/jOOQ-codegen-gradle/src/main/java/org/jooq/codegen/gradle/CodegenPlugin.java @@ -41,6 +41,8 @@ import org.gradle.api.Action; import org.gradle.api.Plugin; import org.gradle.api.Project; import org.gradle.api.artifacts.Configuration; +import org.gradle.api.tasks.SourceSet; +import org.gradle.api.tasks.SourceSetContainer; import java.util.ArrayList; import java.util.List; @@ -95,8 +97,18 @@ public class CodegenPlugin implements Plugin { task.setDescription("jOOQ code generation" + (configuration.unnamed ? " for all executions" : " for the " + configuration.name + " execution")); task.setGroup("jOOQ"); - if (task.configuration.action == null) - CodegenTask.registerSourceSet(task); + if (task.configuration.action == null) { + SourceSetContainer source = task.getProject() + .getExtensions() + .findByType(SourceSetContainer.class); + + if (source != null) { + SourceSet main = source.findByName("main"); + + if (main != null) + main.getJava().srcDir(task.getOutputDirectory()); + } + } }; } } diff --git a/jOOQ-codegen-gradle/src/main/java/org/jooq/codegen/gradle/CodegenPluginExtension.java b/jOOQ-codegen-gradle/src/main/java/org/jooq/codegen/gradle/CodegenPluginExtension.java index 892f86228c..b0dd5583b8 100644 --- a/jOOQ-codegen-gradle/src/main/java/org/jooq/codegen/gradle/CodegenPluginExtension.java +++ b/jOOQ-codegen-gradle/src/main/java/org/jooq/codegen/gradle/CodegenPluginExtension.java @@ -53,33 +53,28 @@ import javax.inject.Inject; public class CodegenPluginExtension { final ObjectFactory objects; - final Project project; final NamedDomainObjectContainer executions; + final NamedConfiguration defaultExecution; @Inject public CodegenPluginExtension( ObjectFactory objects, - Project project, - ProviderFactory providers, ProjectLayout layout ) { this.objects = objects; - this.project = project; - this.executions = objects.domainObjectContainer(NamedConfiguration.class, - name -> objects.newInstance(NamedConfiguration.class, objects, name) + this.defaultExecution = new NamedConfiguration(objects, layout, "", null); + this.executions = objects.domainObjectContainer(NamedConfiguration.class, name -> "".equals(name) + ? defaultExecution + : objects.newInstance(NamedConfiguration.class, objects, name, defaultExecution) ); } - NamedConfiguration defaultConfiguration() { - return executions.getByName(""); - } - public void configuration(Action action) { - defaultConfiguration().configuration(action); + defaultExecution.configuration(action); } public void delayedConfiguration(Action action) { - defaultConfiguration().delayedConfiguration(action); + defaultExecution.delayedConfiguration(action); } public NamedDomainObjectContainer getExecutions() { diff --git a/jOOQ-codegen-gradle/src/main/java/org/jooq/codegen/gradle/CodegenTask.java b/jOOQ-codegen-gradle/src/main/java/org/jooq/codegen/gradle/CodegenTask.java index 455d2158cb..842af98d7d 100644 --- a/jOOQ-codegen-gradle/src/main/java/org/jooq/codegen/gradle/CodegenTask.java +++ b/jOOQ-codegen-gradle/src/main/java/org/jooq/codegen/gradle/CodegenTask.java @@ -39,7 +39,6 @@ package org.jooq.codegen.gradle; import org.gradle.api.DefaultTask; import org.gradle.api.GradleException; -import org.gradle.api.Project; import org.gradle.api.Task; import org.gradle.api.file.DirectoryProperty; import org.gradle.api.file.FileCollection; @@ -91,24 +90,7 @@ public class CodegenTask extends DefaultTask { // [#16318] When the task is up-to-date, we still have to register our source set contributions, which // apparently aren't being cached by gradle's build cache. - getOutputs().upToDateWhen(task -> registerSourceSet(task) && upToDate(task)); - } - - static boolean registerSourceSet(Task t) { - if (t instanceof CodegenTask task) { - SourceSetContainer source = task.getProject() - .getExtensions() - .findByType(SourceSetContainer.class); - - if (source != null) { - SourceSet main = source.findByName("main"); - - if (main != null) - main.getJava().srcDir(task.getOutputDirectory()); - } - } - - return true; + getOutputs().upToDateWhen(task -> upToDate(task)); } @SuppressWarnings("unchecked") diff --git a/jOOQ-codegen-gradle/src/main/java/org/jooq/codegen/gradle/NamedConfiguration.java b/jOOQ-codegen-gradle/src/main/java/org/jooq/codegen/gradle/NamedConfiguration.java index f24af1ff6b..a5c3fe60c2 100644 --- a/jOOQ-codegen-gradle/src/main/java/org/jooq/codegen/gradle/NamedConfiguration.java +++ b/jOOQ-codegen-gradle/src/main/java/org/jooq/codegen/gradle/NamedConfiguration.java @@ -38,14 +38,14 @@ package org.jooq.codegen.gradle; import org.gradle.api.Action; -import org.gradle.api.Project; -import org.gradle.api.file.Directory; import org.gradle.api.file.DirectoryProperty; +import org.gradle.api.file.ProjectLayout; import org.gradle.api.model.ObjectFactory; import org.jooq.codegen.GenerationTool; import org.jooq.meta.jaxb.Configuration; import org.jooq.meta.jaxb.Generator; import org.jooq.meta.jaxb.Target; +import org.jooq.tools.JooqLogger; import org.jooq.util.jaxb.tools.MiniJAXB; import org.jooq.codegen.gradle.MetaExtensions.*; @@ -58,29 +58,32 @@ import java.io.File; */ public class NamedConfiguration { + static final JooqLogger log = JooqLogger.getLogger(NamedConfiguration.class); + final ObjectFactory objects; - final Project project; + final ProjectLayout projectLayout; final String name; + final NamedConfiguration defaultConfiguration; Action action; boolean unnamed; private Configuration configuration; private DirectoryProperty outputDirectory; - private Directory projectDirectory; private boolean outputDirectorySet; @Inject public NamedConfiguration( ObjectFactory objects, - Project project, - String name + ProjectLayout projectLayout, + String name, + NamedConfiguration defaultConfiguration ) { this.objects = objects; - this.project = project; + this.projectLayout = projectLayout; this.name = name; this.unnamed = false; this.configuration = init(new Configuration()); this.outputDirectory = objects.directoryProperty(); - this.projectDirectory = project.getLayout().getProjectDirectory(); + this.defaultConfiguration = defaultConfiguration == null ? this : defaultConfiguration; } static final Configuration init(Configuration configuration) { @@ -105,7 +108,6 @@ public class NamedConfiguration { void configuration0(Configuration configuration) { if (!unnamed) { - NamedConfiguration defaultConfiguration = project.getExtensions().getByType(CodegenPluginExtension.class).defaultConfiguration(); defaultConfiguration.executeAction(); this.configuration = MiniJAXB.append(copy(defaultConfiguration.configuration), copy(this.configuration)); } @@ -123,7 +125,7 @@ public class NamedConfiguration { } public void delayedConfiguration(Action action) { - project.getLogger().info("Delayed configuration is an experimental feature, which is subject to change in the future. Please illustrate your use-case here to help better understand why this is needed: https://github.com/jOOQ/jOOQ/issues/16821"); + log.info("Delayed configuration is an experimental feature, which is subject to change in the future. Please illustrate your use-case here to help better understand why this is needed: https://github.com/jOOQ/jOOQ/issues/16821"); this.action = action; } @@ -132,6 +134,7 @@ public class NamedConfiguration { ConfigurationExtension c = objects.newInstance(ConfigurationExtension.class, objects); init(c); action.execute(c); + action = null; configuration0(c); // [#15944] Override default target directory @@ -144,13 +147,12 @@ public class NamedConfiguration { // [#16133] Make sure the CodegenTask's OutputDirectory takes into account any basedir config if (configuration.getBasedir() == null) - configuration.setBasedir(projectDirectory.getAsFile().getAbsolutePath()); + configuration.setBasedir(projectLayout.getProjectDirectory().getAsFile().getAbsolutePath()); else if (!new File(directory).isAbsolute()) directory = new File(configuration.getBasedir(), directory).getAbsolutePath(); - outputDirectory.value(projectDirectory.dir(directory)); + outputDirectory.value(projectLayout.getProjectDirectory().dir(directory)); outputDirectorySet = true; - action = null; } }