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.
This commit is contained in:
Lukas Eder 2024-01-11 09:03:39 +01:00
parent 9d8d793c97
commit ab8b9dff1e
4 changed files with 36 additions and 37 deletions

View File

@ -83,41 +83,40 @@ public class CodegenPlugin implements Plugin<Project> {
configuration.configuration = NamedConfiguration.newConfiguration();
});
AtomicReference<CodegenTask> all = new AtomicReference<>();
List<NamedConfiguration> 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<CodegenTask> configureTask(SourceSetContainer source, NamedConfiguration configuration) {
private static Action<CodegenTask> configureTask(
List<NamedConfiguration> 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());
});
};

View File

@ -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;

View File

@ -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<NamedConfiguration> 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<Directory> getOutputDirectory() {
return configuration.outputDirectory;
}

View File

@ -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<Directory> 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() {