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