[jOOQ/jOOQ#16083] jOOQ-gradle-plugin multi execution configuration shouldn't require an explicit default configuration

This includes:

- [jOOQ/jOOQ#16084] Wrong order of MiniJAXB.append() calls in jOOQ-codegen-gradle
This commit is contained in:
Lukas Eder 2024-01-16 10:41:57 +01:00
parent 4d77894b4a
commit 4516607284
4 changed files with 43 additions and 21 deletions

View File

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

View File

@ -40,6 +40,7 @@ package org.jooq.codegen.gradle;
import org.gradle.api.DefaultTask;
import org.gradle.api.GradleException;
import org.gradle.api.file.Directory;
import org.gradle.api.file.DirectoryProperty;
import org.gradle.api.file.FileCollection;
import org.gradle.api.file.ProjectLayout;
import org.gradle.api.provider.Property;
@ -56,6 +57,7 @@ import java.io.File;
import java.net.URL;
import java.net.URLClassLoader;
import java.util.ArrayList;
import java.util.Arrays;
import java.util.List;
import java.util.concurrent.atomic.AtomicBoolean;
@ -118,9 +120,12 @@ public class CodegenTask extends DefaultTask {
return codegenClasspath;
}
@OutputDirectory @Optional
public Property<Directory> getOutputDirectory() {
return configuration.outputDirectory;
@OutputDirectories
public List<DirectoryProperty> getOutputDirectory() {
if (named.isEmpty() && configuration.outputDirectorySet)
return Arrays.asList(configuration.outputDirectory);
else
return Arrays.asList();
}
private URLClassLoader getClassLoader() {

View File

@ -40,6 +40,7 @@ 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.gradle.api.provider.Property;
@ -66,7 +67,8 @@ public class NamedConfiguration {
final String name;
boolean unnamed;
Configuration configuration;
Property<Directory> outputDirectory;
DirectoryProperty outputDirectory;
boolean outputDirectorySet;
@Inject
public NamedConfiguration(
@ -80,12 +82,12 @@ public class NamedConfiguration {
this.layout = layout;
this.name = name;
this.unnamed = false;
this.configuration = newConfiguration();
this.configuration = init(new Configuration());
this.outputDirectory = objects.directoryProperty();
}
static final Configuration newConfiguration() {
return new Configuration()
static final Configuration init(Configuration configuration) {
return configuration
.withGenerator(new Generator()
.withTarget(new Target()));
}
@ -100,9 +102,9 @@ public class NamedConfiguration {
void configuration0(Configuration configuration) {
if (!unnamed)
MiniJAXB.append(this.configuration, copy(project.getExtensions().getByType(CodegenPluginExtension.class).defaultConfiguration().configuration));
this.configuration = MiniJAXB.append(copy(project.getExtensions().getByType(CodegenPluginExtension.class).defaultConfiguration().configuration), copy(this.configuration));
MiniJAXB.append(this.configuration, configuration);
this.configuration = MiniJAXB.append(copy(configuration), copy(this.configuration));
}
static Configuration copy(Configuration configuration) {
@ -111,6 +113,7 @@ public class NamedConfiguration {
public void configuration(Action<ConfigurationExtension> action) {
ConfigurationExtension c = objects.newInstance(ConfigurationExtension.class, objects);
init(c);
action.execute(c);
configuration0(c);
@ -124,6 +127,7 @@ public class NamedConfiguration {
configuration.getGenerator().getTarget().setDirectory("build/generated-sources/jooq");
outputDirectory.value(layout.getProjectDirectory().dir(target.getDirectory()));
outputDirectorySet = true;
}
boolean defaultTarget() {

View File

@ -50,6 +50,7 @@ import java.io.Reader;
import java.io.StringReader;
import java.io.StringWriter;
import java.io.Writer;
import java.lang.annotation.Annotation;
import java.lang.reflect.Field;
import java.lang.reflect.InvocationTargetException;
import java.lang.reflect.Method;
@ -138,7 +139,7 @@ public final class MiniJAXB {
public static void marshal(XMLAppendable object, Writer out) {
try {
XMLBuilder builder = XMLBuilder.formatting();
XmlRootElement e = object.getClass().getAnnotation(XmlRootElement.class);
XmlRootElement e = getAnnotation(object.getClass(), XmlRootElement.class);
if (e != null) {
out.write("<?xml version=\"1.0\" encoding=\"UTF-8\" standalone=\"yes\"?>\n");
builder.append(e.name(), object);
@ -300,10 +301,10 @@ public final class MiniJAXB {
List<Object> list = new ArrayList<Object>(asList(childElement.getTextContent().split(" +")));
Reflect.on(result).set(childName, Convert.convert(list, (Class<?>) ((ParameterizedType) child.getGenericType()).getActualTypeArguments()[0]));
}
else if (childType.getAnnotation(XmlEnum.class) != null) {
else if (getAnnotation(childType, XmlEnum.class) != null) {
Reflect.on(result).set(childName, Reflect.onClass(childType).call("fromValue", textContent.trim()));
}
else if (childType.getAnnotation(XmlType.class) != null) {
else if (getAnnotation(childType, XmlType.class) != null) {
Object object = Reflect.on(childType).create().get();
Reflect.on(result).set(childName, object);
@ -324,7 +325,7 @@ public final class MiniJAXB {
return;
// [#13897] Distinguish between lists of xs:complexType and xs:simpleType
boolean isComplexType = type.getAnnotation(XmlType.class) != null;
boolean isComplexType = getAnnotation(type, XmlType.class) != null;
NodeList list = element.getChildNodes();
for (int i = 0; i < list.getLength(); i++) {
Node item = list.item(i);
@ -446,6 +447,7 @@ public final class MiniJAXB {
private static String getNamespace(Class<?> type) {
if (type != null && type.getPackage() != null && type.getPackage().isAnnotationPresent(XmlSchema.class))
return type.getPackage().getAnnotation(XmlSchema.class).namespace();
return null;
}
@ -495,13 +497,7 @@ public final class MiniJAXB {
// We're assuming that XJC generated objects are all in the same package
Package pkg = firstClass.getPackage();
try {
// [#12985] [#15974] [#15966] Gradle generates a subclass for our configuration extensions, which
// will accept an injected argument. We shouldn't use that subclass here.
Class<T> defaultsClass = firstClass;
while (defaultsClass.getName().startsWith("org.jooq.codegen.gradle"))
defaultsClass = (Class<T>) defaultsClass.getSuperclass();
Class<T> defaultsClass = nonGradleExtensionClass(firstClass);
T defaults = defaultsClass.getDeclaredConstructor().newInstance();
methodLoop:
@ -554,4 +550,21 @@ public final class MiniJAXB {
return first;
}
/**
* [#12985] [#15974] [#15966] Gradle generates a subclass for our
* configuration extensions, which will accept an injected argument. We
* shouldn't use that subclass here.
*/
@SuppressWarnings("unchecked")
private static <T> Class<T> nonGradleExtensionClass(Class<T> klass) {
while (klass.getName().startsWith("org.jooq.codegen.gradle"))
klass = (Class<T>) klass.getSuperclass();
return klass;
}
private static <A extends Annotation> A getAnnotation(Class<?> klass, Class<A> annotation) {
return nonGradleExtensionClass(klass).getAnnotation(annotation);
}
}