From ab8b9dff1edd85403e73329a3faa171bd1d10fa0 Mon Sep 17 00:00:00 2001 From: Lukas Eder Date: Thu, 11 Jan 2024 09:03:39 +0100 Subject: [PATCH] [jOOQ/jOOQ#15966] [jOOQ/jOOQ#15974] Another iteration Correct order of registering tasks and configuring them. We mustn't rely on any implicit ordering of the NamedDomainObjectContainer as that might be an implementation detail subject to change at any time. --- .../jooq/codegen/gradle/CodegenPlugin.java | 47 +++++++++---------- .../gradle/CodegenPluginExtension.java | 5 +- .../org/jooq/codegen/gradle/CodegenTask.java | 15 +++--- .../codegen/gradle/NamedConfiguration.java | 6 ++- 4 files changed, 36 insertions(+), 37 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 1c8a2885cb..846199e333 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 @@ -83,41 +83,40 @@ public class CodegenPlugin implements Plugin { configuration.configuration = NamedConfiguration.newConfiguration(); }); - AtomicReference all = new AtomicReference<>(); + List named = new ArrayList<>(); jooq.getExecutions().configureEach(configuration -> { - if (configuration.unnamed) { - all.set(project.getTasks().create( - CodegenTask.taskName(configuration), - CodegenTask.class, - configuration, - runtimeClasspath, - codegenClasspath - )); - configureTask(source, configuration).execute(all.get()); - } - else { - project.getTasks().register( - CodegenTask.taskName(configuration), - CodegenTask.class, - configuration, - runtimeClasspath, - codegenClasspath - ).configure(configureTask(source, configuration)); + if (!configuration.unnamed) + named.add(configuration); - all.get().dependsOn(CodegenTask.taskName(configuration)); - all.get().allTask.set(true); - } + project.getTasks().register( + CodegenTask.taskName(configuration), + CodegenTask.class, + configuration, + runtimeClasspath, + codegenClasspath + ).configure(configureTask(named, source, configuration)); }); } - private static Action configureTask(SourceSetContainer source, NamedConfiguration configuration) { + private static Action configureTask( + List named, + SourceSetContainer source, + NamedConfiguration configuration + ) { return task -> { + if (configuration.unnamed) { + task.named.addAll(named); + + for (NamedConfiguration other : named) + task.dependsOn(CodegenTask.taskName(other)); + } + task.setDescription("jOOQ code generation" + (configuration.unnamed ? " for all executions" : " for the " + configuration.name + " execution")); task.setGroup("jOOQ"); source.configureEach(sourceSet -> { - if (sourceSet.getName().equals("main") && task.getOutputDirectory() != null) + if (sourceSet.getName().equals("main")) sourceSet.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 00124536c9..7d59664590 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 @@ -37,10 +37,7 @@ */ package org.jooq.codegen.gradle; -import org.gradle.api.Action; -import org.gradle.api.Named; -import org.gradle.api.NamedDomainObjectContainer; -import org.gradle.api.Project; +import org.gradle.api.*; import org.gradle.api.file.ProjectLayout; import org.gradle.api.model.ObjectFactory; import org.gradle.api.provider.ProviderFactory; 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 ea67c5ad67..0d16229d57 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 @@ -65,11 +65,11 @@ import java.util.concurrent.atomic.AtomicBoolean; @CacheableTask public class CodegenTask extends DefaultTask { - private final NamedConfiguration configuration; - private final FileCollection runtimeClasspath; - private final FileCollection codegenClasspath; - private final ProviderFactory providers; - AtomicBoolean allTask = new AtomicBoolean(); + final NamedConfiguration configuration; + final FileCollection runtimeClasspath; + final FileCollection codegenClasspath; + final ProviderFactory providers; + final List named; @Inject public CodegenTask( @@ -82,6 +82,7 @@ public class CodegenTask extends DefaultTask { this.providers = providers; this.runtimeClasspath = runtimeClasspath; this.codegenClasspath = codegenClasspath; + this.named = new ArrayList<>(); // TODO: Can we optimise this without using internals? getOutputs().upToDateWhen(task -> false); @@ -89,7 +90,7 @@ public class CodegenTask extends DefaultTask { @TaskAction public void execute(InputChanges changes) throws Exception { - if (!allTask.get()) { + if (named.isEmpty()) { ClassLoader oldCL = Thread.currentThread().getContextClassLoader(); URLClassLoader pluginClassLoader = getClassLoader(); @@ -121,7 +122,7 @@ public class CodegenTask extends DefaultTask { } @OutputDirectory @Optional - public Directory getOutputDirectory() { + public Property getOutputDirectory() { return configuration.outputDirectory; } 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 ff2cf56305..c69a65edb7 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 @@ -42,6 +42,7 @@ import org.gradle.api.Project; import org.gradle.api.file.Directory; import org.gradle.api.file.ProjectLayout; import org.gradle.api.model.ObjectFactory; +import org.gradle.api.provider.Property; import org.jooq.codegen.GenerationTool; import org.jooq.meta.jaxb.Configuration; import org.jooq.meta.jaxb.Generator; @@ -65,7 +66,7 @@ public class NamedConfiguration { final String name; boolean unnamed; Configuration configuration; - Directory outputDirectory; + Property outputDirectory; @Inject public NamedConfiguration( @@ -80,6 +81,7 @@ public class NamedConfiguration { this.name = name; this.unnamed = false; this.configuration = newConfiguration(); + this.outputDirectory = objects.directoryProperty(); } static final Configuration newConfiguration() { @@ -117,7 +119,7 @@ public class NamedConfiguration { if (defaultTarget()) configuration.getGenerator().getTarget().setDirectory("build/generated-sources/jooq"); - outputDirectory = layout.getProjectDirectory().dir(target.getDirectory()); + outputDirectory.value(layout.getProjectDirectory().dir(target.getDirectory())); } boolean defaultTarget() {