[jOOQ/jOOQ#16188] jOOQ-codegen-gradle should lazily evaluate its configuration

This commit is contained in:
Lukas Eder 2024-03-01 14:07:15 +01:00
parent 8fd072bd72
commit b55b0bcc40
3 changed files with 53 additions and 37 deletions

View File

@ -75,7 +75,6 @@ public class CodegenPlugin implements Plugin<Project> {
jooq.getExecutions().create("", configuration -> {
configuration.unnamed = true;
configuration.configuration = NamedConfiguration.init(new org.jooq.meta.jaxb.Configuration());
});
List<NamedConfiguration> named = new ArrayList<>();

View File

@ -98,7 +98,7 @@ public class CodegenTask extends DefaultTask {
// This is the approach that worked well for the Maven plugin.
// There's probably a better way in Gradle.
Thread.currentThread().setContextClassLoader(pluginClassLoader);
GenerationTool.generate(configuration.configuration);
GenerationTool.generate(configuration.getConfiguration());
}
finally {
@ -111,7 +111,7 @@ public class CodegenTask extends DefaultTask {
@Input
public Provider<String> getInput() {
return providers.provider(() ->
configuration.configuration.toString()
configuration.getConfiguration().toString()
);
}
@ -122,8 +122,8 @@ public class CodegenTask extends DefaultTask {
@OutputDirectories
public List<DirectoryProperty> getOutputDirectory() {
if (named.isEmpty() && configuration.outputDirectorySet)
return Arrays.asList(configuration.outputDirectory);
if (named.isEmpty() && configuration.getOutputDirectory() != null)
return Arrays.asList(configuration.getOutputDirectory());
else
return Arrays.asList();
}

View File

@ -63,14 +63,15 @@ import java.io.File;
*/
public class NamedConfiguration {
final ObjectFactory objects;
final Project project;
final ProjectLayout layout;
final String name;
boolean unnamed;
Configuration configuration;
DirectoryProperty outputDirectory;
boolean outputDirectorySet;
final ObjectFactory objects;
final Project project;
final ProjectLayout layout;
final String name;
Action<ConfigurationExtension> action;
boolean unnamed;
private Configuration configuration;
private DirectoryProperty outputDirectory;
private boolean outputDirectorySet;
@Inject
public NamedConfiguration(
@ -98,13 +99,22 @@ public class NamedConfiguration {
return name;
}
DirectoryProperty getOutputDirectory() {
executeAction();
return outputDirectorySet ? outputDirectory : null;
}
public Configuration getConfiguration() {
executeAction();
return configuration;
}
void configuration0(Configuration configuration) {
if (!unnamed)
this.configuration = MiniJAXB.append(copy(project.getExtensions().getByType(CodegenPluginExtension.class).defaultConfiguration().configuration), copy(this.configuration));
if (!unnamed) {
NamedConfiguration defaultConfiguration = project.getExtensions().getByType(CodegenPluginExtension.class).defaultConfiguration();
defaultConfiguration.executeAction();
this.configuration = MiniJAXB.append(copy(defaultConfiguration.configuration), copy(this.configuration));
}
this.configuration = MiniJAXB.append(copy(configuration), copy(this.configuration));
}
@ -114,30 +124,37 @@ public class NamedConfiguration {
}
public void configuration(Action<ConfigurationExtension> action) {
ConfigurationExtension c = objects.newInstance(ConfigurationExtension.class, objects);
init(c);
action.execute(c);
configuration0(c);
// [#15944] Override default target directory
Target target = configuration.getGenerator().getTarget();
if (defaultTarget())
target.setDirectory("build/generated-sources/jooq");
String directory = target.getDirectory();
// [#16133] Make sure the CodegenTask's OutputDirectory takes into account any basedir config
if (configuration.getBasedir() == null)
configuration.setBasedir(layout.getProjectDirectory().getAsFile().getAbsolutePath());
else if (!new File(directory).isAbsolute())
directory = new File(configuration.getBasedir(), directory).getAbsolutePath();
outputDirectory.value(layout.getProjectDirectory().dir(directory));
outputDirectorySet = true;
this.action = action;
}
boolean defaultTarget() {
void executeAction() {
if (action != null) {
ConfigurationExtension c = objects.newInstance(ConfigurationExtension.class, objects);
init(c);
action.execute(c);
configuration0(c);
// [#15944] Override default target directory
Target target = configuration.getGenerator().getTarget();
if (defaultTarget())
target.setDirectory("build/generated-sources/jooq");
String directory = target.getDirectory();
// [#16133] Make sure the CodegenTask's OutputDirectory takes into account any basedir config
if (configuration.getBasedir() == null)
configuration.setBasedir(layout.getProjectDirectory().getAsFile().getAbsolutePath());
else if (!new File(directory).isAbsolute())
directory = new File(configuration.getBasedir(), directory).getAbsolutePath();
outputDirectory.value(layout.getProjectDirectory().dir(directory));
outputDirectorySet = true;
action = null;
}
}
private boolean defaultTarget() {
// [#15944] Override default target directory
Target target = configuration.getGenerator().getTarget();