From 96b0d3dc0e9c1c5b8d15138d1d3f619bd9d267b2 Mon Sep 17 00:00:00 2001 From: Guillaume Smet Date: Thu, 15 Feb 2024 15:03:45 +0100 Subject: [PATCH 01/43] Reimplement the extension annotation processor The idea is the following: - we collect the config properties and dump them into a file that is local to the module - this will help with Develocity caching and a lot of other issues. - ideally the descriptor will be also consumable by IDEs - when generating the documentation, we will gather all the descriptors in the tree and transform them to Asciidoc files. For now, we keep the old way of doing things around for compatibility. --- core/processor/pom.xml | 4 + .../ExtensionAnnotationProcessor.java | 1059 ++--------------- .../processor/ExtensionProcessor.java | 19 + .../quarkus/annotation/processor/Options.java | 8 + .../quarkus/annotation/processor/Outputs.java | 21 + .../config/ConfigDocExtensionProcessor.java | 101 ++ .../discovery/DiscoveryConfigGroup.java | 11 + .../discovery/DiscoveryConfigProperty.java | 229 ++++ .../config/discovery/DiscoveryConfigRoot.java | 53 + .../discovery/DiscoveryRootElement.java | 87 ++ .../config/discovery/EnumDefinition.java | 19 + .../config/discovery/JavadocFormat.java | 6 + .../config/discovery/ParsedJavadoc.java | 12 + .../discovery/ParsedJavadocSection.java | 4 + .../config/discovery/ResolvedType.java | 83 ++ .../discovery/UnresolvedEnumDefinition.java | 16 + .../JavadocToAsciidocTransformer.java | 525 ++++++++ .../config/model/AbstractConfigItem.java | 45 + .../config/model/ConfigGroup.java | 5 + .../config/model/ConfigItemCollection.java | 11 + .../config/model/ConfigPhase.java | 61 + .../config/model/ConfigProperty.java | 146 +++ .../config/model/ConfigRoot.java | 91 ++ .../config/model/ConfigSection.java | 43 + .../config/model/EnumAcceptedValues.java | 12 + .../documentation/config/model/Extension.java | 4 + .../config/model/ResolvedModel.java | 58 + .../config/resolver/ConfigResolver.java | 283 +++++ .../scanner/AbstractConfigListener.java | 104 ++ .../AbstractJavadocConfigListener.java | 40 + .../scanner/ConfigAnnotationListener.java | 55 + .../scanner/ConfigAnnotationScanner.java | 430 +++++++ .../config/scanner/ConfigCollector.java | 161 +++ .../config/scanner/ConfigMappingListener.java | 172 +++ .../scanner/JavadocConfigMappingListener.java | 31 + .../JavadocLegacyConfigRootListener.java | 29 + .../config/scanner/LegacyConfigListener.java | 174 +++ .../config/util/ConfigNamingUtil.java | 219 ++++ .../config/util/JavadocUtil.java | 84 ++ .../documentation/config/util/Markers.java | 15 + .../documentation/config/util/TypeUtil.java | 40 + .../documentation/config/util/Types.java | 75 ++ .../extension/ExtensionBuildProcessor.java | 192 +++ .../generate_doc/ConfigDocBuilder.java | 4 +- .../ConfigDocGeneratedOutput.java | 2 - .../generate_doc/ConfigDocItemFinder.java | 41 +- .../generate_doc/ConfigDocItemScanner.java | 2 - .../processor/generate_doc/ConfigDocKey.java | 2 - .../generate_doc/ConfigDocWriter.java | 2 - .../processor/generate_doc/ConfigPhase.java | 2 - .../{ => generate_doc}/Constants.java | 4 +- .../generate_doc/DocGeneratorUtil.java | 2 - .../processor/generate_doc/JavaDocParser.java | 2 - .../LegacyConfigDocExtensionProcessor.java | 210 ++++ .../generate_doc/MavenConfigDocBuilder.java | 7 +- .../SummaryTableDocFormatter.java | 6 +- .../processor/util/AccessorGenerator.java | 195 +++ .../annotation/processor/util/Config.java | 28 + .../processor/util/ElementUtil.java | 161 +++ .../annotation/processor/util/FilerUtil.java | 78 ++ .../annotation/processor/util/Strings.java | 15 + .../annotation/processor/util/Utils.java | 34 + .../ExtensionAnnotationProcessorTest.java | 10 +- .../generate_doc/DocGeneratorUtilTest.java | 2 - .../QuarkusMavenPluginDocsGenerator.java | 2 +- 65 files changed, 4658 insertions(+), 990 deletions(-) create mode 100644 core/processor/src/main/java/io/quarkus/annotation/processor/ExtensionProcessor.java create mode 100644 core/processor/src/main/java/io/quarkus/annotation/processor/Options.java create mode 100644 core/processor/src/main/java/io/quarkus/annotation/processor/Outputs.java create mode 100644 core/processor/src/main/java/io/quarkus/annotation/processor/documentation/config/ConfigDocExtensionProcessor.java create mode 100644 core/processor/src/main/java/io/quarkus/annotation/processor/documentation/config/discovery/DiscoveryConfigGroup.java create mode 100644 core/processor/src/main/java/io/quarkus/annotation/processor/documentation/config/discovery/DiscoveryConfigProperty.java create mode 100644 core/processor/src/main/java/io/quarkus/annotation/processor/documentation/config/discovery/DiscoveryConfigRoot.java create mode 100644 core/processor/src/main/java/io/quarkus/annotation/processor/documentation/config/discovery/DiscoveryRootElement.java create mode 100644 core/processor/src/main/java/io/quarkus/annotation/processor/documentation/config/discovery/EnumDefinition.java create mode 100644 core/processor/src/main/java/io/quarkus/annotation/processor/documentation/config/discovery/JavadocFormat.java create mode 100644 core/processor/src/main/java/io/quarkus/annotation/processor/documentation/config/discovery/ParsedJavadoc.java create mode 100644 core/processor/src/main/java/io/quarkus/annotation/processor/documentation/config/discovery/ParsedJavadocSection.java create mode 100644 core/processor/src/main/java/io/quarkus/annotation/processor/documentation/config/discovery/ResolvedType.java create mode 100644 core/processor/src/main/java/io/quarkus/annotation/processor/documentation/config/discovery/UnresolvedEnumDefinition.java create mode 100644 core/processor/src/main/java/io/quarkus/annotation/processor/documentation/config/formatter/JavadocToAsciidocTransformer.java create mode 100644 core/processor/src/main/java/io/quarkus/annotation/processor/documentation/config/model/AbstractConfigItem.java create mode 100644 core/processor/src/main/java/io/quarkus/annotation/processor/documentation/config/model/ConfigGroup.java create mode 100644 core/processor/src/main/java/io/quarkus/annotation/processor/documentation/config/model/ConfigItemCollection.java create mode 100644 core/processor/src/main/java/io/quarkus/annotation/processor/documentation/config/model/ConfigPhase.java create mode 100644 core/processor/src/main/java/io/quarkus/annotation/processor/documentation/config/model/ConfigProperty.java create mode 100644 core/processor/src/main/java/io/quarkus/annotation/processor/documentation/config/model/ConfigRoot.java create mode 100644 core/processor/src/main/java/io/quarkus/annotation/processor/documentation/config/model/ConfigSection.java create mode 100644 core/processor/src/main/java/io/quarkus/annotation/processor/documentation/config/model/EnumAcceptedValues.java create mode 100644 core/processor/src/main/java/io/quarkus/annotation/processor/documentation/config/model/Extension.java create mode 100644 core/processor/src/main/java/io/quarkus/annotation/processor/documentation/config/model/ResolvedModel.java create mode 100644 core/processor/src/main/java/io/quarkus/annotation/processor/documentation/config/resolver/ConfigResolver.java create mode 100644 core/processor/src/main/java/io/quarkus/annotation/processor/documentation/config/scanner/AbstractConfigListener.java create mode 100644 core/processor/src/main/java/io/quarkus/annotation/processor/documentation/config/scanner/AbstractJavadocConfigListener.java create mode 100644 core/processor/src/main/java/io/quarkus/annotation/processor/documentation/config/scanner/ConfigAnnotationListener.java create mode 100644 core/processor/src/main/java/io/quarkus/annotation/processor/documentation/config/scanner/ConfigAnnotationScanner.java create mode 100644 core/processor/src/main/java/io/quarkus/annotation/processor/documentation/config/scanner/ConfigCollector.java create mode 100644 core/processor/src/main/java/io/quarkus/annotation/processor/documentation/config/scanner/ConfigMappingListener.java create mode 100644 core/processor/src/main/java/io/quarkus/annotation/processor/documentation/config/scanner/JavadocConfigMappingListener.java create mode 100644 core/processor/src/main/java/io/quarkus/annotation/processor/documentation/config/scanner/JavadocLegacyConfigRootListener.java create mode 100644 core/processor/src/main/java/io/quarkus/annotation/processor/documentation/config/scanner/LegacyConfigListener.java create mode 100644 core/processor/src/main/java/io/quarkus/annotation/processor/documentation/config/util/ConfigNamingUtil.java create mode 100644 core/processor/src/main/java/io/quarkus/annotation/processor/documentation/config/util/JavadocUtil.java create mode 100644 core/processor/src/main/java/io/quarkus/annotation/processor/documentation/config/util/Markers.java create mode 100644 core/processor/src/main/java/io/quarkus/annotation/processor/documentation/config/util/TypeUtil.java create mode 100644 core/processor/src/main/java/io/quarkus/annotation/processor/documentation/config/util/Types.java create mode 100644 core/processor/src/main/java/io/quarkus/annotation/processor/extension/ExtensionBuildProcessor.java rename core/processor/src/main/java/io/quarkus/annotation/processor/{ => generate_doc}/Constants.java (98%) create mode 100644 core/processor/src/main/java/io/quarkus/annotation/processor/generate_doc/LegacyConfigDocExtensionProcessor.java create mode 100644 core/processor/src/main/java/io/quarkus/annotation/processor/util/AccessorGenerator.java create mode 100644 core/processor/src/main/java/io/quarkus/annotation/processor/util/Config.java create mode 100644 core/processor/src/main/java/io/quarkus/annotation/processor/util/ElementUtil.java create mode 100644 core/processor/src/main/java/io/quarkus/annotation/processor/util/FilerUtil.java create mode 100644 core/processor/src/main/java/io/quarkus/annotation/processor/util/Strings.java create mode 100644 core/processor/src/main/java/io/quarkus/annotation/processor/util/Utils.java diff --git a/core/processor/pom.xml b/core/processor/pom.xml index 680bc888257b2..5b4690e1e3ef4 100644 --- a/core/processor/pom.xml +++ b/core/processor/pom.xml @@ -32,6 +32,10 @@ com.fasterxml.jackson.core jackson-databind + + com.fasterxml.jackson.dataformat + jackson-dataformat-yaml + io.quarkus quarkus-bootstrap-app-model diff --git a/core/processor/src/main/java/io/quarkus/annotation/processor/ExtensionAnnotationProcessor.java b/core/processor/src/main/java/io/quarkus/annotation/processor/ExtensionAnnotationProcessor.java index 8a8cf20170dd1..1bd0ed7e448c9 100644 --- a/core/processor/src/main/java/io/quarkus/annotation/processor/ExtensionAnnotationProcessor.java +++ b/core/processor/src/main/java/io/quarkus/annotation/processor/ExtensionAnnotationProcessor.java @@ -1,1022 +1,215 @@ package io.quarkus.annotation.processor; -import static io.quarkus.annotation.processor.Constants.ANNOTATION_CONFIG_GROUP; -import static io.quarkus.annotation.processor.Constants.ANNOTATION_CONFIG_MAPPING; -import static javax.lang.model.util.ElementFilter.constructorsIn; -import static javax.lang.model.util.ElementFilter.fieldsIn; -import static javax.lang.model.util.ElementFilter.methodsIn; -import static javax.lang.model.util.ElementFilter.typesIn; - -import java.io.BufferedOutputStream; -import java.io.BufferedReader; -import java.io.BufferedWriter; import java.io.IOException; -import java.io.OutputStream; -import java.io.OutputStreamWriter; -import java.io.Writer; -import java.net.URI; -import java.nio.charset.StandardCharsets; -import java.nio.file.FileVisitResult; -import java.nio.file.FileVisitor; -import java.nio.file.Files; import java.nio.file.Path; import java.nio.file.Paths; -import java.nio.file.attribute.BasicFileAttributes; -import java.util.Arrays; -import java.util.Collection; +import java.util.ArrayList; import java.util.Collections; -import java.util.HashSet; import java.util.List; -import java.util.Map; -import java.util.Optional; -import java.util.Properties; import java.util.Set; -import java.util.TreeSet; -import java.util.concurrent.ConcurrentHashMap; -import java.util.regex.Pattern; import javax.annotation.processing.AbstractProcessor; import javax.annotation.processing.Completion; -import javax.annotation.processing.Filer; +import javax.annotation.processing.ProcessingEnvironment; import javax.annotation.processing.RoundEnvironment; +import javax.annotation.processing.SupportedOptions; import javax.lang.model.SourceVersion; import javax.lang.model.element.AnnotationMirror; -import javax.lang.model.element.AnnotationValue; import javax.lang.model.element.Element; -import javax.lang.model.element.ElementKind; import javax.lang.model.element.ExecutableElement; -import javax.lang.model.element.Modifier; -import javax.lang.model.element.Name; -import javax.lang.model.element.PackageElement; import javax.lang.model.element.TypeElement; -import javax.lang.model.element.VariableElement; -import javax.lang.model.type.DeclaredType; -import javax.lang.model.type.PrimitiveType; -import javax.lang.model.type.TypeKind; -import javax.lang.model.type.TypeMirror; import javax.tools.Diagnostic; -import javax.tools.FileObject; import javax.tools.StandardLocation; +import javax.xml.XMLConstants; +import javax.xml.parsers.DocumentBuilder; +import javax.xml.parsers.DocumentBuilderFactory; -import org.jboss.jdeparser.FormatPreferences; -import org.jboss.jdeparser.JAssignableExpr; -import org.jboss.jdeparser.JCall; -import org.jboss.jdeparser.JClassDef; import org.jboss.jdeparser.JDeparser; -import org.jboss.jdeparser.JExprs; -import org.jboss.jdeparser.JFiler; -import org.jboss.jdeparser.JMethodDef; -import org.jboss.jdeparser.JMod; -import org.jboss.jdeparser.JSourceFile; -import org.jboss.jdeparser.JSources; -import org.jboss.jdeparser.JType; -import org.jboss.jdeparser.JTypes; - -import io.quarkus.annotation.processor.generate_doc.ConfigDocGeneratedOutput; -import io.quarkus.annotation.processor.generate_doc.ConfigDocItemScanner; -import io.quarkus.annotation.processor.generate_doc.ConfigDocWriter; -import io.quarkus.annotation.processor.generate_doc.DocGeneratorUtil; -import io.quarkus.bootstrap.util.PropertyUtils; - +import org.w3c.dom.Document; +import org.w3c.dom.Node; +import org.w3c.dom.NodeList; + +import io.quarkus.annotation.processor.documentation.config.ConfigDocExtensionProcessor; +import io.quarkus.annotation.processor.documentation.config.model.Extension; +import io.quarkus.annotation.processor.documentation.config.util.Types; +import io.quarkus.annotation.processor.extension.ExtensionBuildProcessor; +import io.quarkus.annotation.processor.generate_doc.LegacyConfigDocExtensionProcessor; +import io.quarkus.annotation.processor.util.Config; +import io.quarkus.annotation.processor.util.Utils; + +@SupportedOptions({ Options.LEGACY_CONFIG_ROOT, Options.GENERATE_DOC, Options.GENERATE_LEGACY_CONFIG_DOC }) public class ExtensionAnnotationProcessor extends AbstractProcessor { - private static final Pattern REMOVE_LEADING_SPACE = Pattern.compile("^ ", Pattern.MULTILINE); - private static final String QUARKUS_GENERATED = "io.quarkus.Generated"; - - private final ConfigDocWriter configDocWriter = new ConfigDocWriter(); - private final ConfigDocItemScanner configDocItemScanner = new ConfigDocItemScanner(); - private final Set generatedAccessors = new ConcurrentHashMap().keySet(Boolean.TRUE); - private final Set generatedJavaDocs = new ConcurrentHashMap().keySet(Boolean.TRUE); - private final boolean generateDocs = !(Boolean.getBoolean("skipDocs") || Boolean.getBoolean("quickly")); - - private final Map ANNOTATION_USAGE_TRACKER = new ConcurrentHashMap<>(); - - public ExtensionAnnotationProcessor() { - } + private static final String DEBUG = "debug-extension-annotation-processor"; + private static final String ARTIFACT_DEPLOYMENT_SUFFIX = "-deployment"; + private static final String NAME_RUNTIME_SUFFIX = " - Runtime"; + private static final String NAME_DEPLOYMENT_SUFFIX = " - DEPLOYMENT"; - @Override - public Set getSupportedOptions() { - return Collections.emptySet(); - } + private List extensionProcessors; @Override - public Set getSupportedAnnotationTypes() { - return Constants.SUPPORTED_ANNOTATIONS_TYPES; - } - - @Override - public SourceVersion getSupportedSourceVersion() { - return SourceVersion.latest(); - } - - @Override - public boolean process(Set annotations, RoundEnvironment roundEnv) { - try { - doProcess(annotations, roundEnv); - if (roundEnv.processingOver()) { - doFinish(); - } - return true; - } finally { - JDeparser.dropCaches(); - } - } - - @Override - public Iterable getCompletions(Element element, AnnotationMirror annotation, ExecutableElement member, - String userText) { - return Collections.emptySet(); - } - - public void doProcess(Set annotations, RoundEnvironment roundEnv) { - for (TypeElement annotation : annotations) { - switch (annotation.getQualifiedName() - .toString()) { - case Constants.ANNOTATION_BUILD_STEP: - trackAnnotationUsed(Constants.ANNOTATION_BUILD_STEP); - processBuildStep(roundEnv, annotation); - break; - case Constants.ANNOTATION_CONFIG_GROUP: - trackAnnotationUsed(Constants.ANNOTATION_CONFIG_GROUP); - processConfigGroup(roundEnv, annotation); - break; - case Constants.ANNOTATION_CONFIG_ROOT: - trackAnnotationUsed(Constants.ANNOTATION_CONFIG_ROOT); - processConfigRoot(roundEnv, annotation); - break; - case Constants.ANNOTATION_RECORDER: - trackAnnotationUsed(Constants.ANNOTATION_RECORDER); - processRecorder(roundEnv, annotation); - break; - case Constants.ANNOTATION_CONFIG_MAPPING: - trackAnnotationUsed(Constants.ANNOTATION_CONFIG_MAPPING); - break; - } - } - } - - void doFinish() { - validateAnnotationUsage(); - - final Filer filer = processingEnv.getFiler(); - final FileObject tempResource; - try { - tempResource = filer.createResource(StandardLocation.SOURCE_OUTPUT, Constants.EMPTY, "ignore.tmp"); - } catch (IOException e) { - processingEnv.getMessager() - .printMessage(Diagnostic.Kind.ERROR, "Unable to create temp output file: " + e); - return; - } - final URI uri = tempResource.toUri(); - // tempResource.delete(); - Path path; - try { - path = Paths.get(uri) - .getParent(); - } catch (RuntimeException e) { - processingEnv.getMessager() - .printMessage(Diagnostic.Kind.ERROR, "Resource path URI is invalid: " + uri); - return; - } - Collection bscListClasses = new TreeSet<>(); - Collection crListClasses = new TreeSet<>(); - Properties javaDocProperties = new Properties(); - - try { - Files.walkFileTree(path, new FileVisitor<>() { - public FileVisitResult preVisitDirectory(final Path dir, final BasicFileAttributes attrs) { - return FileVisitResult.CONTINUE; - } - - public FileVisitResult visitFile(final Path file, final BasicFileAttributes attrs) { - final String nameStr = file.getFileName() - .toString(); - if (nameStr.endsWith(".bsc")) { - readFile(file, bscListClasses); - } else if (nameStr.endsWith(".cr")) { - readFile(file, crListClasses); - } else if (nameStr.endsWith(".jdp")) { - final Properties p = new Properties(); - try (BufferedReader br = Files.newBufferedReader(file, StandardCharsets.UTF_8)) { - p.load(br); - } catch (IOException e) { - processingEnv.getMessager() - .printMessage(Diagnostic.Kind.ERROR, - "Failed to read file " + file + ": " + e); - } - final Set names = p.stringPropertyNames(); - for (String name : names) { - javaDocProperties.setProperty(name, p.getProperty(name)); - } - } - - return FileVisitResult.CONTINUE; - } - - public FileVisitResult visitFileFailed(final Path file, final IOException exc) { - processingEnv.getMessager() - .printMessage(Diagnostic.Kind.ERROR, - "Failed to visit file " + file + ": " + exc); - return FileVisitResult.CONTINUE; - } - - public FileVisitResult postVisitDirectory(final Path dir, final IOException exc) { - return FileVisitResult.CONTINUE; - } - }); - } catch (IOException e) { - processingEnv.getMessager() - .printMessage(Diagnostic.Kind.ERROR, "File walk failed: " + e); - } - if (!bscListClasses.isEmpty()) - try { - final FileObject listResource = filer.createResource(StandardLocation.CLASS_OUTPUT, "", - "META-INF/quarkus-build-steps.list"); - writeListResourceFile(bscListClasses, listResource); - } catch (IOException e) { - processingEnv.getMessager() - .printMessage(Diagnostic.Kind.ERROR, "Failed to write build steps listing: " + e); - return; - } - if (!crListClasses.isEmpty()) { - try { - final FileObject listResource = filer.createResource(StandardLocation.CLASS_OUTPUT, "", - "META-INF/quarkus-config-roots.list"); - writeListResourceFile(crListClasses, listResource); - } catch (IOException e) { - processingEnv.getMessager() - .printMessage(Diagnostic.Kind.ERROR, "Failed to write config roots listing: " + e); - return; - } - } + public synchronized void init(ProcessingEnvironment processingEnv) { + super.init(processingEnv); - if (!javaDocProperties.isEmpty()) { - try { - final FileObject listResource = filer.createResource(StandardLocation.CLASS_OUTPUT, "", - "META-INF/quarkus-javadoc.properties"); - try (OutputStream os = listResource.openOutputStream()) { - try (BufferedOutputStream bos = new BufferedOutputStream(os)) { - try (OutputStreamWriter osw = new OutputStreamWriter(bos, StandardCharsets.UTF_8)) { - try (BufferedWriter bw = new BufferedWriter(osw)) { - PropertyUtils.store(javaDocProperties, bw); - } - } - } - } - } catch (IOException e) { - processingEnv.getMessager() - .printMessage(Diagnostic.Kind.ERROR, "Failed to write javadoc properties: " + e); - return; - } - } + List extensionProcessors = new ArrayList<>(); + extensionProcessors.add(new ExtensionBuildProcessor()); - try { - if (generateDocs) { - final Set outputs = configDocItemScanner - .scanExtensionsConfigurationItems(javaDocProperties, isAnnotationUsed(ANNOTATION_CONFIG_MAPPING)); - for (ConfigDocGeneratedOutput output : outputs) { - DocGeneratorUtil.sort(output.getConfigDocItems()); // sort before writing - configDocWriter.writeAllExtensionConfigDocumentation(output); - } - } - } catch (IOException e) { - processingEnv.getMessager() - .printMessage(Diagnostic.Kind.ERROR, "Failed to generate extension doc: " + e); - } - } + boolean skipDocs = Boolean.getBoolean("skipDocs") || Boolean.getBoolean("quickly"); + boolean generateDoc = !skipDocs && !"false".equals(processingEnv.getOptions().get(Options.GENERATE_DOC)); - private void validateAnnotationUsage() { - if (isAnnotationUsed(Constants.ANNOTATION_BUILD_STEP) && isAnnotationUsed(Constants.ANNOTATION_RECORDER)) { - processingEnv.getMessager() - .printMessage(Diagnostic.Kind.ERROR, - "Detected use of @Recorder annotation in 'deployment' module. Classes annotated with @Recorder must be " - + - "part of the extension's 'runtime' module"); - } - } - - private boolean isAnnotationUsed(String annotation) { - return ANNOTATION_USAGE_TRACKER.getOrDefault(annotation, false); - } + // for now, we generate the old config doc by default but we will change this behavior soon + if (generateDoc) { + extensionProcessors.add(new ConfigDocExtensionProcessor()); - private void trackAnnotationUsed(String annotation) { - ANNOTATION_USAGE_TRACKER.put(annotation, true); - } - - private void writeListResourceFile(Collection crListClasses, FileObject listResource) throws IOException { - try (BufferedWriter bw = new BufferedWriter( - new OutputStreamWriter(listResource.openOutputStream(), StandardCharsets.UTF_8))) { - for (String className : crListClasses) { - bw.write(className); - bw.newLine(); + if (!"false".equals(processingEnv.getOptions().get(Options.GENERATE_LEGACY_CONFIG_DOC))) { + extensionProcessors.add(new LegacyConfigDocExtensionProcessor()); } } - } - private void readFile(Path file, Collection bscListClasses) { - try (BufferedReader br = Files.newBufferedReader(file, StandardCharsets.UTF_8)) { - String line; - while ((line = br.readLine()) != null) { - line = line.trim(); - if (!line.isEmpty()) { - bscListClasses.add(line); - } - } - } catch (IOException e) { - processingEnv.getMessager() - .printMessage(Diagnostic.Kind.ERROR, - "Failed to read file " + file + ": " + e); - } - } + this.extensionProcessors = Collections.unmodifiableList(extensionProcessors); - private void processBuildStep(RoundEnvironment roundEnv, TypeElement annotation) { - final Set processorClassNames = new HashSet<>(); + Utils utils = new Utils(processingEnv); - for (ExecutableElement i : methodsIn(roundEnv.getElementsAnnotatedWith(annotation))) { - final TypeElement clazz = getClassOf(i); - if (clazz == null) { - continue; - } + boolean useConfigMapping = !Boolean + .parseBoolean(utils.processingEnv().getOptions().getOrDefault(Options.LEGACY_CONFIG_ROOT, "false")); + boolean debug = Boolean.getBoolean(DEBUG); - final PackageElement pkg = processingEnv.getElementUtils() - .getPackageOf(clazz); - if (pkg == null) { - processingEnv.getMessager() - .printMessage(Diagnostic.Kind.ERROR, - "Element " + clazz + " has no enclosing package"); - continue; - } + Extension extension = getExtension(processingEnv); + Config config = new Config(extension, useConfigMapping, debug); - final String binaryName = processingEnv.getElementUtils() - .getBinaryName(clazz) - .toString(); - if (processorClassNames.add(binaryName)) { - validateRecordBuildSteps(clazz); - recordConfigJavadoc(clazz); - generateAccessor(clazz); - final StringBuilder rbn = getRelativeBinaryName(clazz, new StringBuilder()); - try { - final FileObject itemResource = processingEnv.getFiler() - .createResource( - StandardLocation.SOURCE_OUTPUT, - pkg.getQualifiedName() - .toString(), - rbn + ".bsc", clazz); - writeResourceFile(binaryName, itemResource); - } catch (IOException e1) { - processingEnv.getMessager() - .printMessage(Diagnostic.Kind.ERROR, - "Failed to create " + rbn + " in " + pkg + ": " + e1, clazz); - } - } + if (!useConfigMapping) { + processingEnv.getMessager().printMessage(Diagnostic.Kind.WARNING, "Extension " + extension.artifactId() + + " config implementation is deprecated. Please migrate to use @ConfigMapping: https://quarkus.io/guides/writing-extensions#configuration"); } - } - - private void validateRecordBuildSteps(TypeElement clazz) { - for (Element e : clazz.getEnclosedElements()) { - if (e.getKind() != ElementKind.METHOD) { - continue; - } - ExecutableElement ex = (ExecutableElement) e; - if (!isAnnotationPresent(ex, Constants.ANNOTATION_BUILD_STEP)) { - continue; - } - if (!isAnnotationPresent(ex, Constants.ANNOTATION_RECORD)) { - continue; - } - boolean hasRecorder = false; - boolean allTypesResolvable = true; - for (VariableElement parameter : ex.getParameters()) { - String parameterClassName = parameter.asType() - .toString(); - TypeElement parameterTypeElement = processingEnv.getElementUtils() - .getTypeElement(parameterClassName); - if (parameterTypeElement == null) { - allTypesResolvable = false; - } else { - if (isAnnotationPresent(parameterTypeElement, Constants.ANNOTATION_RECORDER)) { - if (parameterTypeElement.getModifiers() - .contains(Modifier.FINAL)) { - processingEnv.getMessager() - .printMessage(Diagnostic.Kind.ERROR, - "Class '" + parameterTypeElement.getQualifiedName() - + "' is annotated with @Recorder and therefore cannot be made as a final class."); - } else if (getPackageName(clazz).equals(getPackageName(parameterTypeElement))) { - processingEnv.getMessager() - .printMessage(Diagnostic.Kind.WARNING, - "Build step class '" + clazz.getQualifiedName() - + "' and recorder '" + parameterTypeElement - + "' share the same package. This is highly discouraged as it can lead to " - + - "unexpected results."); - } - hasRecorder = true; - break; - } - } - } - - if (!hasRecorder && allTypesResolvable) { - processingEnv.getMessager() - .printMessage(Diagnostic.Kind.ERROR, "Build Step '" + clazz.getQualifiedName() + "#" - + ex.getSimpleName() - + "' which is annotated with '@Record' does not contain a method parameter whose type is annotated " - + - "with '@Recorder'."); - } + for (ExtensionProcessor extensionProcessor : extensionProcessors) { + extensionProcessor.init(config, utils); } } - private Name getPackageName(TypeElement clazz) { - return processingEnv.getElementUtils() - .getPackageOf(clazz) - .getQualifiedName(); - } - - private StringBuilder getRelativeBinaryName(TypeElement te, StringBuilder b) { - final Element enclosing = te.getEnclosingElement(); - if (enclosing instanceof TypeElement) { - getRelativeBinaryName((TypeElement) enclosing, b); - b.append('$'); - } - b.append(te.getSimpleName()); - return b; + @Override + public Set getSupportedAnnotationTypes() { + return Types.SUPPORTED_ANNOTATIONS_TYPES; } - private TypeElement getClassOf(Element e) { - Element t = e; - while (!(t instanceof TypeElement)) { - if (t == null) { - processingEnv.getMessager() - .printMessage(Diagnostic.Kind.ERROR, "Element " + e + " has no enclosing class"); - return null; - } - t = t.getEnclosingElement(); - } - return (TypeElement) t; + @Override + public SourceVersion getSupportedSourceVersion() { + return SourceVersion.latest(); } - private void recordConfigJavadoc(TypeElement clazz) { - String className = clazz.getQualifiedName() - .toString(); - if (!generatedJavaDocs.add(className)) - return; - Properties javadocProps = new Properties(); - for (Element e : clazz.getEnclosedElements()) { - switch (e.getKind()) { - case FIELD: { - if (isDocumentedConfigItem(e)) { - processFieldConfigItem((VariableElement) e, javadocProps, className); - } - break; - } - case CONSTRUCTOR: { - final ExecutableElement ex = (ExecutableElement) e; - if (hasParameterDocumentedConfigItem(ex)) { - processCtorConfigItem(ex, javadocProps, className); - } - break; - } - case METHOD: { - final ExecutableElement ex = (ExecutableElement) e; - if (hasParameterDocumentedConfigItem(ex)) { - processMethodConfigItem(ex, javadocProps, className); - } - break; - } - case ENUM: - e - .getEnclosedElements() - .stream() - .filter(e1 -> e1.getKind() == ElementKind.ENUM_CONSTANT) - .forEach(ec -> processEnumConstant(ec, javadocProps, className)); - break; - default: - } - } - writeJavadocProperties(clazz, javadocProps); + @Override + public Iterable getCompletions(Element element, AnnotationMirror annotation, ExecutableElement member, + String userText) { + return Collections.emptySet(); } - private void recordMappingJavadoc(TypeElement clazz) { - String className = clazz.getQualifiedName() - .toString(); - if (!generatedJavaDocs.add(className)) - return; - if (!isAnnotationPresent(clazz, ANNOTATION_CONFIG_MAPPING)) { - if (generateDocs) { - configDocItemScanner.addConfigGroups(clazz); + @Override + public boolean process(Set annotations, RoundEnvironment roundEnv) { + try { + for (ExtensionProcessor extensionProcessor : extensionProcessors) { + extensionProcessor.process(annotations, roundEnv); } - } - Properties javadocProps = new Properties(); - recordMappingJavadoc(clazz, javadocProps); - writeJavadocProperties(clazz, javadocProps); - } - private void recordMappingJavadoc(final TypeElement clazz, final Properties javadocProps) { - String className = clazz.getQualifiedName() - .toString(); - for (Element e : clazz.getEnclosedElements()) { - switch (e.getKind()) { - case INTERFACE: { - recordMappingJavadoc(((TypeElement) e)); - break; - } - - case METHOD: { - if (!isConfigMappingMethodIgnored(e)) { - processMethodConfigMapping((ExecutableElement) e, javadocProps, className); - } - break; + if (roundEnv.processingOver()) { + for (ExtensionProcessor extensionProcessor : extensionProcessors) { + extensionProcessor.finalizeProcessing(); } - default: } + return true; + } finally { + JDeparser.dropCaches(); } } - private boolean isEnclosedByMapping(Element clazz) { - if (clazz.getKind() - .equals(ElementKind.INTERFACE)) { - Element enclosingElement = clazz.getEnclosingElement(); - if (enclosingElement.getKind() - .equals(ElementKind.INTERFACE)) { - if (isAnnotationPresent(enclosingElement, ANNOTATION_CONFIG_MAPPING)) { - return true; - } else { - isEnclosedByMapping(enclosingElement); - } - } - } - return false; - } + /** + * This is not exactly pretty but it's actually not easy to get the artifact id of the current artifact. + * One option would be to pass it through the annotation processor but it's not exactly ideal. + */ + private Extension getExtension(ProcessingEnvironment processingEnv) { + Path pom; - private void writeJavadocProperties(final TypeElement clazz, final Properties javadocProps) { - if (javadocProps.isEmpty()) - return; - final PackageElement pkg = processingEnv.getElementUtils() - .getPackageOf(clazz); - final String rbn = getRelativeBinaryName(clazz, new StringBuilder()).append(".jdp") - .toString(); try { - FileObject file = processingEnv.getFiler() - .createResource( - StandardLocation.SOURCE_OUTPUT, - pkg.getQualifiedName() - .toString(), - rbn, - clazz); - try (Writer writer = file.openWriter()) { - PropertyUtils.store(javadocProps, writer); - } + pom = Paths.get(processingEnv.getFiler().getResource(StandardLocation.CLASS_OUTPUT, "", "dummy").toUri()) + .getParent().getParent().getParent().resolve("pom.xml").toAbsolutePath(); } catch (IOException e) { - processingEnv.getMessager() - .printMessage(Diagnostic.Kind.ERROR, "Failed to persist resource " + rbn + ": " + e); - } - } - - private void processFieldConfigItem(VariableElement field, Properties javadocProps, String className) { - javadocProps.put(className + Constants.DOT + field.getSimpleName() - .toString(), getRequiredJavadoc(field)); - } - - private void processEnumConstant(Element field, Properties javadocProps, String className) { - String javaDoc = getJavadoc(field); - if (javaDoc != null && !javaDoc.isBlank()) { - javadocProps.put(className + Constants.DOT + field.getSimpleName() - .toString(), javaDoc); + throw new IllegalStateException("Unable to determine path to pom.xml"); } - } - - private void processCtorConfigItem(ExecutableElement ctor, Properties javadocProps, String className) { - final String docComment = getRequiredJavadoc(ctor); - final StringBuilder buf = new StringBuilder(); - appendParamTypes(ctor, buf); - javadocProps.put(className + Constants.DOT + buf, docComment); - } - - private void processMethodConfigItem(ExecutableElement method, Properties javadocProps, String className) { - final String docComment = getRequiredJavadoc(method); - final StringBuilder buf = new StringBuilder(); - buf.append(method.getSimpleName() - .toString()); - appendParamTypes(method, buf); - javadocProps.put(className + Constants.DOT + buf, docComment); - } - private void processMethodConfigMapping(ExecutableElement method, Properties javadocProps, String className) { - if (method.getModifiers() - .contains(Modifier.ABSTRACT)) { - // Skip toString method, because mappings can include it and generate it - if (method.getSimpleName() - .contentEquals("toString") - && method.getParameters() - .isEmpty()) { - return; - } + Document doc; - String docComment = getRequiredJavadoc(method); - javadocProps.put(className + Constants.DOT + method.getSimpleName() - .toString(), docComment); - - // Find groups without annotation - TypeMirror returnType = method.getReturnType(); - if (TypeKind.DECLARED.equals(returnType.getKind())) { - DeclaredType declaredType = (DeclaredType) returnType; - if (!isAnnotationPresent(declaredType.asElement(), ANNOTATION_CONFIG_GROUP)) { - TypeElement type = unwrapConfigGroup(returnType); - if (type != null && ElementKind.INTERFACE.equals(type.getKind())) { - recordMappingJavadoc(type); - configDocItemScanner.addConfigGroups(type); - } - } - } - } - } - - private TypeElement unwrapConfigGroup(TypeMirror typeMirror) { - if (typeMirror == null) { - return null; - } - - DeclaredType declaredType = (DeclaredType) typeMirror; - String name = declaredType.asElement() - .toString(); - List typeArguments = declaredType.getTypeArguments(); - if (typeArguments.isEmpty()) { - if (!name.startsWith("java.")) { - return (TypeElement) declaredType.asElement(); - } - } else if (typeArguments.size() == 1) { - if (name.equals(Optional.class.getName()) || - name.equals(List.class.getName()) || - name.equals(Set.class.getName())) { - return unwrapConfigGroup(typeArguments.get(0)); - } - } else if (typeArguments.size() == 2) { - if (name.equals(Map.class.getName())) { - return unwrapConfigGroup(typeArguments.get(1)); - } + try { + DocumentBuilderFactory dbf = DocumentBuilderFactory.newInstance(); + dbf.setFeature(XMLConstants.FEATURE_SECURE_PROCESSING, true); + DocumentBuilder db = dbf.newDocumentBuilder(); + doc = db.parse(pom.toFile()); + doc.getDocumentElement().normalize(); + } catch (Exception e) { + throw new IllegalStateException("Unable parse pom file: " + pom, e); } - return null; - } - private void processConfigGroup(RoundEnvironment roundEnv, TypeElement annotation) { - final Set groupClassNames = new HashSet<>(); - for (TypeElement i : typesIn(roundEnv.getElementsAnnotatedWith(annotation))) { - if (groupClassNames.add(i.getQualifiedName() - .toString())) { - generateAccessor(i); - if (isEnclosedByMapping(i) || i.getKind() - .equals(ElementKind.INTERFACE)) { - recordMappingJavadoc(i); - } else { - recordConfigJavadoc(i); - } - if (generateDocs) { - configDocItemScanner.addConfigGroups(i); - } - } - } + return getExtensionFromPom(pom, doc); } - private void processConfigRoot(RoundEnvironment roundEnv, TypeElement annotation) { - final Set rootClassNames = new HashSet<>(); + private Extension getExtensionFromPom(Path pom, Document doc) { + String parentGroupId = null; + String artifactId = null; + String groupId = null; + String name = null; - for (TypeElement clazz : typesIn(roundEnv.getElementsAnnotatedWith(annotation))) { - final PackageElement pkg = processingEnv.getElementUtils() - .getPackageOf(clazz); - if (pkg == null) { - processingEnv.getMessager() - .printMessage(Diagnostic.Kind.ERROR, - "Element " + clazz + " has no enclosing package"); - continue; + NodeList children = doc.getDocumentElement().getChildNodes(); + for (int i = 0; i < children.getLength(); i++) { + if (groupId != null && artifactId != null && name != null) { + break; } - if (generateDocs) { - configDocItemScanner.addConfigRoot(pkg, clazz); - } + Node child = children.item(i); - final String binaryName = processingEnv.getElementUtils() - .getBinaryName(clazz) - .toString(); - if (rootClassNames.add(binaryName)) { - // new class - if (isAnnotationPresent(clazz, ANNOTATION_CONFIG_MAPPING)) { - recordMappingJavadoc(clazz); - } else if (isAnnotationPresent(clazz, Constants.ANNOTATION_CONFIG_ROOT)) { - recordConfigJavadoc(clazz); - generateAccessor(clazz); - } - final StringBuilder rbn = getRelativeBinaryName(clazz, new StringBuilder()); - try { - final FileObject itemResource = processingEnv.getFiler() - .createResource( - StandardLocation.SOURCE_OUTPUT, - pkg.getQualifiedName() - .toString(), - rbn + ".cr", - clazz); - writeResourceFile(binaryName, itemResource); - } catch (IOException e1) { - processingEnv.getMessager() - .printMessage(Diagnostic.Kind.ERROR, - "Failed to create " + rbn + " in " + pkg + ": " + e1, clazz); - } - } - } - } - - private void writeResourceFile(String binaryName, FileObject itemResource) throws IOException { - try (OutputStream os = itemResource.openOutputStream()) { - try (BufferedOutputStream bos = new BufferedOutputStream(os)) { - try (OutputStreamWriter osw = new OutputStreamWriter(bos, StandardCharsets.UTF_8)) { - try (BufferedWriter bw = new BufferedWriter(osw)) { - bw.write(binaryName); - bw.newLine(); + if ("parent".equals(child.getNodeName())) { + NodeList parentChildren = child.getChildNodes(); + for (int j = 0; j < parentChildren.getLength(); j++) { + Node parentChild = parentChildren.item(j); + if ("groupId".equals(parentChild.getNodeName())) { + parentGroupId = parentChild.getTextContent() != null ? parentChild.getTextContent().trim() : null; + ; + break; } } + continue; } - } - } - - private void processRecorder(RoundEnvironment roundEnv, TypeElement annotation) { - final Set groupClassNames = new HashSet<>(); - for (TypeElement i : typesIn(roundEnv.getElementsAnnotatedWith(annotation))) { - if (groupClassNames.add(i.getQualifiedName() - .toString())) { - generateAccessor(i); - recordConfigJavadoc(i); - } - } - } - - private void generateAccessor(final TypeElement clazz) { - if (!generatedAccessors.add(clazz.getQualifiedName() - .toString())) - return; - final FormatPreferences fp = new FormatPreferences(); - final JSources sources = JDeparser.createSources(JFiler.newInstance(processingEnv.getFiler()), fp); - final PackageElement packageElement = processingEnv.getElementUtils() - .getPackageOf(clazz); - final String className = getRelativeBinaryName(clazz, new StringBuilder()).append("$$accessor") - .toString(); - final JSourceFile sourceFile = sources.createSourceFile(packageElement.getQualifiedName() - .toString(), className); - JType clazzType = JTypes.typeOf(clazz.asType()); - if (clazz.asType() instanceof DeclaredType) { - DeclaredType declaredType = ((DeclaredType) clazz.asType()); - TypeMirror enclosingType = declaredType.getEnclosingType(); - if (enclosingType != null && enclosingType.getKind() == TypeKind.DECLARED - && clazz.getModifiers() - .contains(Modifier.STATIC)) { - // Ugly workaround for Eclipse APT and static nested types - clazzType = unnestStaticNestedType(declaredType); + if ("groupId".equals(child.getNodeName())) { + groupId = child.getTextContent() != null ? child.getTextContent().trim() : null; + continue; } - } - final JClassDef classDef = sourceFile._class(JMod.PUBLIC | JMod.FINAL, className); - classDef.constructor(JMod.PRIVATE); // no construction - classDef.annotate(QUARKUS_GENERATED) - .value("Quarkus annotation processor"); - final JAssignableExpr instanceName = JExprs.name(Constants.INSTANCE_SYM); - boolean isEnclosingClassPublic = clazz.getModifiers() - .contains(Modifier.PUBLIC); - // iterate fields - boolean generationNeeded = false; - for (VariableElement field : fieldsIn(clazz.getEnclosedElements())) { - final Set mods = field.getModifiers(); - if (mods.contains(Modifier.PRIVATE) || mods.contains(Modifier.STATIC) || mods.contains(Modifier.FINAL)) { - // skip it + if ("artifactId".equals(child.getNodeName())) { + artifactId = child.getTextContent() != null ? child.getTextContent().trim() : null; continue; } - final TypeMirror fieldType = field.asType(); - if (mods.contains(Modifier.PUBLIC) && isEnclosingClassPublic) { - // we don't need to generate a method accessor when the following conditions are met: - // 1) the field is public - // 2) the enclosing class is public - // 3) the class type of the field is public - if (fieldType instanceof DeclaredType) { - final DeclaredType declaredType = (DeclaredType) fieldType; - final TypeElement typeElement = (TypeElement) declaredType.asElement(); - if (typeElement.getModifiers() - .contains(Modifier.PUBLIC)) { - continue; - } - } else { - continue; - } - + if ("name".equals(child.getNodeName())) { + name = child.getTextContent() != null ? child.getTextContent().trim() : null; + continue; } - generationNeeded = true; - - final JType realType = JTypes.typeOf(fieldType); - final JType publicType = fieldType instanceof PrimitiveType ? realType : JType.OBJECT; - - final String fieldName = field.getSimpleName() - .toString(); - final JMethodDef getter = classDef.method(JMod.PUBLIC | JMod.STATIC, publicType, "get_" + fieldName); - getter.annotate(SuppressWarnings.class) - .value("unchecked"); - getter.param(JType.OBJECT, Constants.INSTANCE_SYM); - getter.body() - ._return(instanceName.cast(clazzType) - .field(fieldName)); - final JMethodDef setter = classDef.method(JMod.PUBLIC | JMod.STATIC, JType.VOID, "set_" + fieldName); - setter.annotate(SuppressWarnings.class) - .value("unchecked"); - setter.param(JType.OBJECT, Constants.INSTANCE_SYM); - setter.param(publicType, fieldName); - final JAssignableExpr fieldExpr = JExprs.name(fieldName); - setter.body() - .assign(instanceName.cast(clazzType) - .field(fieldName), - (publicType.equals(realType) ? fieldExpr : fieldExpr.cast(realType))); } - // we need to generate an accessor if the class isn't public - if (!isEnclosingClassPublic) { - for (ExecutableElement ctor : constructorsIn(clazz.getEnclosedElements())) { - if (ctor.getModifiers() - .contains(Modifier.PRIVATE)) { - // skip it - continue; - } - generationNeeded = true; - StringBuilder b = new StringBuilder(); - for (VariableElement parameter : ctor.getParameters()) { - b.append('_'); - b.append(parameter.asType() - .toString() - .replace('.', '_')); - } - String codedName = b.toString(); - final JMethodDef ctorMethod = classDef.method(JMod.PUBLIC | JMod.STATIC, JType.OBJECT, "construct" + codedName); - final JCall ctorCall = clazzType._new(); - for (VariableElement parameter : ctor.getParameters()) { - final TypeMirror paramType = parameter.asType(); - final JType realType = JTypes.typeOf(paramType); - final JType publicType = paramType instanceof PrimitiveType ? realType : JType.OBJECT; - final String name = parameter.getSimpleName() - .toString(); - ctorMethod.param(publicType, name); - final JAssignableExpr nameExpr = JExprs.name(name); - ctorCall.arg(publicType.equals(realType) ? nameExpr : nameExpr.cast(realType)); - } - ctorMethod.body() - ._return(ctorCall); - } + if (groupId == null) { + groupId = parentGroupId; } - // if no constructor or field access is needed, don't generate anything - if (generationNeeded) { - try { - sources.writeSources(); - } catch (IOException e) { - processingEnv.getMessager() - .printMessage(Diagnostic.Kind.ERROR, "Failed to generate source file: " + e, clazz); - } + if (groupId == null || groupId.isBlank() || artifactId == null || artifactId.isBlank()) { + throw new IllegalStateException("Unable to determine artifact coordinates from: " + pom); } - } - - private JType unnestStaticNestedType(DeclaredType declaredType) { - final TypeElement typeElement = (TypeElement) declaredType.asElement(); - final String name = typeElement.getQualifiedName() - .toString(); - final JType rawType = JTypes.typeNamed(name); - final List typeArguments = declaredType.getTypeArguments(); - if (typeArguments.isEmpty()) { - return rawType; + if (artifactId.endsWith(ARTIFACT_DEPLOYMENT_SUFFIX)) { + artifactId = artifactId.substring(0, artifactId.length() - ARTIFACT_DEPLOYMENT_SUFFIX.length()); } - JType[] args = new JType[typeArguments.size()]; - for (int i = 0; i < typeArguments.size(); i++) { - final TypeMirror argument = typeArguments.get(i); - args[i] = JTypes.typeOf(argument); - } - return rawType.typeArg(args); - } - private void appendParamTypes(ExecutableElement ex, final StringBuilder buf) { - final List params = ex.getParameters(); - if (params.isEmpty()) { - processingEnv.getMessager() - .printMessage(Diagnostic.Kind.ERROR, "Expected at least one parameter", ex); - return; - } - VariableElement param = params.get(0); - DeclaredType dt = (DeclaredType) param.asType(); - String typeName = processingEnv.getElementUtils() - .getBinaryName(((TypeElement) dt.asElement())) - .toString(); - buf.append('(') - .append(typeName); - for (int i = 1; i < params.size(); ++i) { - param = params.get(i); - dt = (DeclaredType) param.asType(); - typeName = processingEnv.getElementUtils() - .getBinaryName(((TypeElement) dt.asElement())) - .toString(); - buf.append(',') - .append(typeName); - } - buf.append(')'); - } - - private String getRequiredJavadoc(Element e) { - String javaDoc = getJavadoc(e); - - if (javaDoc == null) { - processingEnv.getMessager() - .printMessage(Diagnostic.Kind.ERROR, - "Unable to find javadoc for config item " + e.getEnclosingElement() + " " + e, e); - return ""; - } - return javaDoc; - } - - private String getJavadoc(Element e) { - String docComment = processingEnv.getElementUtils() - .getDocComment(e); - - if (docComment == null) { - return null; - } - - // javax.lang.model keeps the leading space after the "*" so we need to remove it. - - return REMOVE_LEADING_SPACE.matcher(docComment) - .replaceAll("") - .trim(); - } - - private static boolean isDocumentedConfigItem(Element element) { - boolean hasAnnotation = false; - for (AnnotationMirror annotationMirror : element.getAnnotationMirrors()) { - String annotationName = ((TypeElement) annotationMirror.getAnnotationType() - .asElement()) - .getQualifiedName() - .toString(); - if (Constants.ANNOTATION_CONFIG_ITEM.equals(annotationName)) { - hasAnnotation = true; - Object generateDocumentation = getAnnotationAttribute(annotationMirror, "generateDocumentation()"); - if (generateDocumentation != null && !(Boolean) generateDocumentation) { - // Documentation is explicitly disabled - return false; - } - } else if (Constants.ANNOTATION_CONFIG_DOC_SECTION.equals(annotationName)) { - hasAnnotation = true; - } - } - return hasAnnotation; - } - - private static boolean isConfigMappingMethodIgnored(Element element) { - for (AnnotationMirror annotationMirror : element.getAnnotationMirrors()) { - String annotationName = ((TypeElement) annotationMirror.getAnnotationType() - .asElement()) - .getQualifiedName() - .toString(); - if (Constants.ANNOTATION_CONFIG_DOC_IGNORE.equals(annotationName)) { - return true; - } - } - return false; - } - - private static Object getAnnotationAttribute(AnnotationMirror annotationMirror, String attributeName) { - for (Map.Entry entry : annotationMirror - .getElementValues() - .entrySet()) { - final String key = entry.getKey() - .toString(); - final Object value = entry.getValue() - .getValue(); - if (attributeName.equals(key)) { - return value; - } - } - return null; - } - - private static boolean hasParameterDocumentedConfigItem(ExecutableElement ex) { - for (VariableElement param : ex.getParameters()) { - if (isDocumentedConfigItem(param)) { - return true; + if (name != null) { + if (name.endsWith(NAME_DEPLOYMENT_SUFFIX)) { + name = name.substring(0, name.length() - NAME_DEPLOYMENT_SUFFIX.length()); + } else if (name.endsWith(NAME_RUNTIME_SUFFIX)) { + name = name.substring(0, name.length() - NAME_RUNTIME_SUFFIX.length()); } } - return false; - } - - private static boolean isAnnotationPresent(Element element, String... annotationNames) { - Set annotations = new HashSet<>(Arrays.asList(annotationNames)); - for (AnnotationMirror i : element.getAnnotationMirrors()) { - String annotationName = ((TypeElement) i.getAnnotationType() - .asElement()).getQualifiedName() - .toString(); - if (annotations.contains(annotationName)) { - return true; - } - } - return false; + return new Extension(groupId, artifactId, name); } } diff --git a/core/processor/src/main/java/io/quarkus/annotation/processor/ExtensionProcessor.java b/core/processor/src/main/java/io/quarkus/annotation/processor/ExtensionProcessor.java new file mode 100644 index 0000000000000..c9ec532b4e939 --- /dev/null +++ b/core/processor/src/main/java/io/quarkus/annotation/processor/ExtensionProcessor.java @@ -0,0 +1,19 @@ +package io.quarkus.annotation.processor; + +import java.util.Set; + +import javax.annotation.processing.RoundEnvironment; +import javax.lang.model.element.TypeElement; + +import io.quarkus.annotation.processor.util.Config; +import io.quarkus.annotation.processor.util.Utils; + +public interface ExtensionProcessor { + + void init(Config config, Utils utils); + + void process(Set annotations, RoundEnvironment roundEnv); + + void finalizeProcessing(); + +} diff --git a/core/processor/src/main/java/io/quarkus/annotation/processor/Options.java b/core/processor/src/main/java/io/quarkus/annotation/processor/Options.java new file mode 100644 index 0000000000000..dbbd252be8e31 --- /dev/null +++ b/core/processor/src/main/java/io/quarkus/annotation/processor/Options.java @@ -0,0 +1,8 @@ +package io.quarkus.annotation.processor; + +public final class Options { + + public static final String LEGACY_CONFIG_ROOT = "legacyConfigRoot"; + public static final String GENERATE_LEGACY_CONFIG_DOC = "generateLegacyConfigDoc"; + public static final String GENERATE_DOC = "generateDoc"; +} diff --git a/core/processor/src/main/java/io/quarkus/annotation/processor/Outputs.java b/core/processor/src/main/java/io/quarkus/annotation/processor/Outputs.java new file mode 100644 index 0000000000000..e818546355a3a --- /dev/null +++ b/core/processor/src/main/java/io/quarkus/annotation/processor/Outputs.java @@ -0,0 +1,21 @@ +package io.quarkus.annotation.processor; + +/** + * Define the output here so that they are clearly identified. + *

+ * Paths are resolved from target/classes. + */ +public final class Outputs { + + public static final String META_INF_QUARKUS_BUILD_STEPS = "META-INF/quarkus-build-steps.list"; + public static final String META_INF_QUARKUS_CONFIG_ROOTS = "META-INF/quarkus-config-roots.list"; + public static final String META_INF_QUARKUS_JAVADOC = "META-INF/quarkus-javadoc.properties"; + + /** + * This directory is specific and written directly into target/ as it's not a file we want to package. + */ + public static final String QUARKUS_CONFIG_DOC = "quarkus-config-doc"; + + private Outputs() { + } +} diff --git a/core/processor/src/main/java/io/quarkus/annotation/processor/documentation/config/ConfigDocExtensionProcessor.java b/core/processor/src/main/java/io/quarkus/annotation/processor/documentation/config/ConfigDocExtensionProcessor.java new file mode 100644 index 0000000000000..d283b8df95053 --- /dev/null +++ b/core/processor/src/main/java/io/quarkus/annotation/processor/documentation/config/ConfigDocExtensionProcessor.java @@ -0,0 +1,101 @@ +package io.quarkus.annotation.processor.documentation.config; + +import java.io.IOException; +import java.nio.file.Files; +import java.nio.file.Path; +import java.util.Optional; +import java.util.Set; + +import javax.annotation.processing.RoundEnvironment; +import javax.lang.model.element.TypeElement; +import javax.tools.Diagnostic.Kind; + +import com.fasterxml.jackson.annotation.JsonInclude; +import com.fasterxml.jackson.databind.ObjectMapper; +import com.fasterxml.jackson.dataformat.yaml.YAMLFactory; + +import io.quarkus.annotation.processor.ExtensionProcessor; +import io.quarkus.annotation.processor.Outputs; +import io.quarkus.annotation.processor.documentation.config.model.ResolvedModel; +import io.quarkus.annotation.processor.documentation.config.resolver.ConfigResolver; +import io.quarkus.annotation.processor.documentation.config.scanner.ConfigAnnotationScanner; +import io.quarkus.annotation.processor.documentation.config.scanner.ConfigCollector; +import io.quarkus.annotation.processor.documentation.config.util.Types; +import io.quarkus.annotation.processor.util.Config; +import io.quarkus.annotation.processor.util.Utils; + +public class ConfigDocExtensionProcessor implements ExtensionProcessor { + + private static final ObjectMapper YAML_OBJECT_MAPPER = new ObjectMapper(new YAMLFactory()); + + static { + YAML_OBJECT_MAPPER.setSerializationInclusion(JsonInclude.Include.NON_DEFAULT); + } + + private Config config; + private Utils utils; + private ConfigAnnotationScanner configAnnotationScanner; + + @Override + public void init(Config config, Utils utils) { + this.config = config; + this.utils = utils; + this.configAnnotationScanner = new ConfigAnnotationScanner(config, utils); + } + + @Override + public void process(Set annotations, RoundEnvironment roundEnv) { + Optional configGroup = findAnnotation(annotations, Types.ANNOTATION_CONFIG_GROUP); + Optional configRoot = findAnnotation(annotations, Types.ANNOTATION_CONFIG_ROOT); + + // make sure we scan the groups before the root + if (configGroup.isPresent()) { + configAnnotationScanner.scanConfigGroups(roundEnv, configGroup.get()); + } + if (configRoot.isPresent()) { + configAnnotationScanner.scanConfigRoots(roundEnv, configRoot.get()); + } + } + + private Optional findAnnotation(Set annotations, String annotationName) { + for (TypeElement annotation : annotations) { + if (annotationName.equals(annotation.getQualifiedName().toString())) { + return Optional.of(annotation); + } + } + + return Optional.empty(); + } + + @Override + public void finalizeProcessing() { + ConfigCollector configCollector = configAnnotationScanner.finalizeProcessing(); + + utils.filer().write(Outputs.META_INF_QUARKUS_JAVADOC, configCollector.getJavadocProperties()); + + ConfigResolver configResolver = new ConfigResolver(utils, configCollector); + ResolvedModel resolvedModel = configResolver.resolveModel(); + + // we don't want to write this file in the jar + Path quarkusConfigDocPath = utils.filer().getTargetPath().resolve(Outputs.QUARKUS_CONFIG_DOC); + Path yamlModelPath = quarkusConfigDocPath.resolve("resolved-model-" + config.getExtension().artifactId() + ".yaml"); + try { + Files.createDirectories(quarkusConfigDocPath); + YAML_OBJECT_MAPPER.writeValue(yamlModelPath.toFile(), resolvedModel); + } catch (IOException e) { + throw new IllegalStateException("Unable to write the resolved model to: " + yamlModelPath, e); + } + + if (config.isDebug()) { + utils.processingEnv().getMessager().printMessage(Kind.NOTE, + "Result of config scanning:\n\n" + configCollector.toString()); + + try { + utils.processingEnv().getMessager().printMessage(Kind.NOTE, + "Resolved model:\n\n" + Files.readString(yamlModelPath)); + } catch (IOException e) { + throw new IllegalStateException("Unable to read the resolved model from: " + yamlModelPath, e); + } + } + } +} diff --git a/core/processor/src/main/java/io/quarkus/annotation/processor/documentation/config/discovery/DiscoveryConfigGroup.java b/core/processor/src/main/java/io/quarkus/annotation/processor/documentation/config/discovery/DiscoveryConfigGroup.java new file mode 100644 index 0000000000000..3f23cc9cf23c8 --- /dev/null +++ b/core/processor/src/main/java/io/quarkus/annotation/processor/documentation/config/discovery/DiscoveryConfigGroup.java @@ -0,0 +1,11 @@ +package io.quarkus.annotation.processor.documentation.config.discovery; + +import io.quarkus.annotation.processor.documentation.config.model.Extension; + +public final class DiscoveryConfigGroup extends DiscoveryRootElement { + + public DiscoveryConfigGroup(Extension extension, String binaryName, String qualifiedName) { + super(extension, binaryName, qualifiedName); + } + +} diff --git a/core/processor/src/main/java/io/quarkus/annotation/processor/documentation/config/discovery/DiscoveryConfigProperty.java b/core/processor/src/main/java/io/quarkus/annotation/processor/documentation/config/discovery/DiscoveryConfigProperty.java new file mode 100644 index 0000000000000..b5f9336499600 --- /dev/null +++ b/core/processor/src/main/java/io/quarkus/annotation/processor/documentation/config/discovery/DiscoveryConfigProperty.java @@ -0,0 +1,229 @@ +package io.quarkus.annotation.processor.documentation.config.discovery; + +import io.quarkus.annotation.processor.documentation.config.util.TypeUtil; +import io.quarkus.annotation.processor.util.Strings; + +public class DiscoveryConfigProperty { + + private final String path; + private final String sourceName; + private final String defaultValue; + private final String defaultValueForDoc; + private final boolean deprecated; + private final String mapKey; + private final boolean unnamedMapKey; + private final String description; + private final String since; + private final String rawJavadoc; + private final ResolvedType type; + private final boolean converted; + private final ParsedJavadocSection section; + + public DiscoveryConfigProperty(String path, String sourceName, String defaultValue, String defaultValueForDoc, + boolean deprecated, String mapKey, boolean unnamedMapKey, + String description, String since, String rawJavadoc, ResolvedType type, boolean converted, + ParsedJavadocSection section) { + this.path = path; + this.sourceName = sourceName; + this.defaultValue = defaultValue; + this.defaultValueForDoc = defaultValueForDoc; + this.deprecated = deprecated; + this.mapKey = mapKey; + this.unnamedMapKey = unnamedMapKey; + this.description = description; + this.since = since; + this.rawJavadoc = rawJavadoc; + this.type = type; + this.converted = converted; + this.section = section; + } + + public String getPath() { + return path; + } + + public String getSourceName() { + return sourceName; + } + + public String getDefaultValue() { + return defaultValue; + } + + public String getDefaultValueForDoc() { + return defaultValueForDoc; + } + + public boolean isDeprecated() { + return deprecated; + } + + public String getMapKey() { + return mapKey; + } + + public boolean isUnnamedMapKey() { + return unnamedMapKey; + } + + public String getDescription() { + return description; + } + + public String getSince() { + return since; + } + + public String getRawJavadoc() { + return rawJavadoc; + } + + public ResolvedType getType() { + return type; + } + + public boolean isConverted() { + return converted; + } + + public ParsedJavadocSection getSection() { + return section; + } + + public boolean isSection() { + return section != null; + } + + public String toString() { + return toString(""); + } + + public String toString(String prefix) { + StringBuilder sb = new StringBuilder(); + sb.append(prefix + "name = " + path + "\n"); + sb.append(prefix + "sourceName = " + sourceName + "\n"); + sb.append(prefix + "type = " + type + "\n"); + if (defaultValue != null) { + sb.append(prefix + "defaultValue = " + defaultValue + "\n"); + } + if (defaultValueForDoc != null) { + sb.append(prefix + "defaultValueForDoc = " + defaultValueForDoc + "\n"); + } + if (deprecated) { + sb.append(prefix + "deprecated = true\n"); + } + if (mapKey != null) { + sb.append(prefix + "mapKey = " + mapKey + "\n"); + } + if (unnamedMapKey) { + sb.append(prefix + "unnamedMapKey = true\n"); + } + if (description != null && !description.isBlank()) { + sb.append(prefix + "description = " + description.split("\n")[0] + "...\n"); + } + if (since != null) { + sb.append(prefix + "since = " + since + "\n"); + } + if (converted) { + sb.append(prefix + "converted = true\n"); + } + if (section != null) { + sb.append(prefix + "section title = " + section.title() + "\n"); + } + + return sb.toString(); + } + + public static Builder builder(String sourceName, ResolvedType type) { + return new Builder(sourceName, type); + } + + public static class Builder { + + private String name; + private final String sourceName; + private final ResolvedType type; + private String defaultValue; + private String defaultValueForDoc; + private boolean deprecated = false; + private String mapKey; + private boolean unnamedMapKey = false; + private String description; + private String since; + private String rawJavadoc; + private boolean converted; + private ParsedJavadocSection section; + + public Builder(String sourceName, ResolvedType type) { + this.sourceName = sourceName; + this.type = type; + } + + public Builder name(String name) { + this.name = name; + return this; + } + + public Builder defaultValue(String defaultValue) { + this.defaultValue = defaultValue; + return this; + } + + public Builder defaultValueForDoc(String defaultValueForDoc) { + this.defaultValueForDoc = defaultValueForDoc; + return this; + } + + public Builder deprecated() { + this.deprecated = true; + return this; + } + + public Builder mapKey(String mapKey) { + this.mapKey = mapKey; + return this; + } + + public Builder unnamedMapKey() { + this.unnamedMapKey = true; + return this; + } + + public Builder description(String description) { + this.description = description; + return this; + } + + public Builder since(String since) { + this.since = since; + return this; + } + + public Builder rawJavadoc(String rawJavadoc) { + this.rawJavadoc = rawJavadoc; + return this; + } + + public Builder converted() { + this.converted = true; + return this; + } + + public Builder section(ParsedJavadocSection section) { + this.section = section; + return this; + } + + public DiscoveryConfigProperty build() { + if (type.isPrimitive() && defaultValue == null) { + defaultValue = TypeUtil.getPrimitiveDefaultValue(type.qualifiedName()); + } + if (type.isDuration() && !Strings.isBlank(defaultValue)) { + defaultValue = TypeUtil.normalizeDurationValue(defaultValue); + } + + return new DiscoveryConfigProperty(name, sourceName, defaultValue, defaultValueForDoc, deprecated, + mapKey, unnamedMapKey, description, since, rawJavadoc, type, converted, section); + } + } +} diff --git a/core/processor/src/main/java/io/quarkus/annotation/processor/documentation/config/discovery/DiscoveryConfigRoot.java b/core/processor/src/main/java/io/quarkus/annotation/processor/documentation/config/discovery/DiscoveryConfigRoot.java new file mode 100644 index 0000000000000..a662f47a5cc4e --- /dev/null +++ b/core/processor/src/main/java/io/quarkus/annotation/processor/documentation/config/discovery/DiscoveryConfigRoot.java @@ -0,0 +1,53 @@ +package io.quarkus.annotation.processor.documentation.config.discovery; + +import io.quarkus.annotation.processor.documentation.config.model.ConfigPhase; +import io.quarkus.annotation.processor.documentation.config.model.Extension; + +/** + * At this stage, each {@code @ConfigRoot} annotation leads to a separate DiscoveryConfigRoot. + * So you basically get one DiscoveryConfigRoot per phase. + * The config roots will get merged when we resolve the final model. + */ +public final class DiscoveryConfigRoot extends DiscoveryRootElement { + + private final String prefix; + private final ConfigPhase phase; + private final String overriddenDocFileName; + + public DiscoveryConfigRoot(Extension extension, String prefix, String binaryName, String qualifiedName, + ConfigPhase configPhase, String overriddenDocFileName) { + super(extension, binaryName, qualifiedName); + + this.prefix = prefix; + this.phase = configPhase; + this.overriddenDocFileName = overriddenDocFileName; + } + + public String getPrefix() { + return prefix; + } + + public ConfigPhase getPhase() { + return phase; + } + + public String getOverriddenDocFileName() { + return overriddenDocFileName; + } + + public String toString() { + return toString(""); + } + + public String toString(String prefix) { + StringBuilder sb = new StringBuilder(); + sb.append(prefix + "prefix = " + this.prefix + "\n"); + sb.append(prefix + "config = " + this.phase + "\n"); + if (overriddenDocFileName != null) { + sb.append(prefix + "overriddenDocFileName = " + this.overriddenDocFileName + "\n"); + } + sb.append(super.toString(prefix)); + + return sb.toString(); + } +} diff --git a/core/processor/src/main/java/io/quarkus/annotation/processor/documentation/config/discovery/DiscoveryRootElement.java b/core/processor/src/main/java/io/quarkus/annotation/processor/documentation/config/discovery/DiscoveryRootElement.java new file mode 100644 index 0000000000000..d35cc8ad4c570 --- /dev/null +++ b/core/processor/src/main/java/io/quarkus/annotation/processor/documentation/config/discovery/DiscoveryRootElement.java @@ -0,0 +1,87 @@ +package io.quarkus.annotation.processor.documentation.config.discovery; + +import java.util.ArrayList; +import java.util.Collections; +import java.util.LinkedHashMap; +import java.util.List; +import java.util.Map; + +import io.quarkus.annotation.processor.documentation.config.model.Extension; + +public sealed abstract class DiscoveryRootElement permits DiscoveryConfigRoot, DiscoveryConfigGroup { + + private final Extension extension; + private final String binaryName; + private final String qualifiedName; + private String unresolvedSuperclass; + private final List unresolvedInterfaces = new ArrayList<>(); + private final Map properties = new LinkedHashMap<>(); + + DiscoveryRootElement(Extension extension, String binaryName, String qualifiedName) { + this.extension = extension; + this.binaryName = binaryName; + this.qualifiedName = qualifiedName; + } + + public Extension getExtension() { + return extension; + } + + public String getBinaryName() { + return binaryName; + } + + public String getQualifiedName() { + return qualifiedName; + } + + public void setUnresolvedSuperclass(String unresolvedSuperclass) { + this.unresolvedSuperclass = unresolvedSuperclass; + } + + public String getUnresolvedSuperclass() { + return unresolvedSuperclass; + } + + public void addUnresolvedInterfaces(String unresolvedInterface) { + unresolvedInterfaces.add(unresolvedInterface); + } + + public List getUnresolvedInterfaces() { + return Collections.unmodifiableList(unresolvedInterfaces); + } + + public void addProperty(DiscoveryConfigProperty discoveryConfigProperty) { + properties.put(discoveryConfigProperty.getSourceName(), discoveryConfigProperty); + } + + public Map getProperties() { + return Collections.unmodifiableMap(properties); + } + + public String toString() { + return toString(""); + } + + public String toString(String prefix) { + StringBuilder sb = new StringBuilder(); + sb.append(prefix + "binaryName = " + this.binaryName); + if (this.unresolvedSuperclass != null) { + sb.append("\n"); + sb.append(prefix + "unresolvedSuperclass = " + this.unresolvedSuperclass); + } + if (!this.unresolvedInterfaces.isEmpty()) { + sb.append("\n"); + sb.append(prefix + "unresolvedInterfaces = " + this.unresolvedInterfaces); + } + + if (!properties.isEmpty()) { + sb.append("\n\n" + prefix + "--- Properties ---\n\n"); + for (DiscoveryConfigProperty property : properties.values()) { + sb.append(property.toString(prefix) + prefix + "--\n"); + } + } + + return sb.toString(); + } +} diff --git a/core/processor/src/main/java/io/quarkus/annotation/processor/documentation/config/discovery/EnumDefinition.java b/core/processor/src/main/java/io/quarkus/annotation/processor/documentation/config/discovery/EnumDefinition.java new file mode 100644 index 0000000000000..7b76dcf28d130 --- /dev/null +++ b/core/processor/src/main/java/io/quarkus/annotation/processor/documentation/config/discovery/EnumDefinition.java @@ -0,0 +1,19 @@ +package io.quarkus.annotation.processor.documentation.config.discovery; + +import java.util.Map; + +/** + * This is an uncontextual enum definition obtained from the enum type. + *

+ * At resolution, the enum will get contextualized to how it's consumed in the config property (and for instance, might be + * hyphenated if needed). + */ +public record EnumDefinition(String qualifiedName, Map constants) { + + public record EnumConstant(String explicitValue, String description, String since, String rawJavadoc) { + + public boolean hasExplicitValue() { + return explicitValue != null; + } + } +} diff --git a/core/processor/src/main/java/io/quarkus/annotation/processor/documentation/config/discovery/JavadocFormat.java b/core/processor/src/main/java/io/quarkus/annotation/processor/documentation/config/discovery/JavadocFormat.java new file mode 100644 index 0000000000000..027f96a25db24 --- /dev/null +++ b/core/processor/src/main/java/io/quarkus/annotation/processor/documentation/config/discovery/JavadocFormat.java @@ -0,0 +1,6 @@ +package io.quarkus.annotation.processor.documentation.config.discovery; + +public enum JavadocFormat { + ASCIIDOC, + JAVADOC; +} \ No newline at end of file diff --git a/core/processor/src/main/java/io/quarkus/annotation/processor/documentation/config/discovery/ParsedJavadoc.java b/core/processor/src/main/java/io/quarkus/annotation/processor/documentation/config/discovery/ParsedJavadoc.java new file mode 100644 index 0000000000000..45a13153619c1 --- /dev/null +++ b/core/processor/src/main/java/io/quarkus/annotation/processor/documentation/config/discovery/ParsedJavadoc.java @@ -0,0 +1,12 @@ +package io.quarkus.annotation.processor.documentation.config.discovery; + +public record ParsedJavadoc(String description, String since, JavadocFormat originalFormat) { + + public static ParsedJavadoc empty() { + return new ParsedJavadoc(null, null, null); + } + + public boolean isEmpty() { + return description == null || description.isBlank(); + } +} \ No newline at end of file diff --git a/core/processor/src/main/java/io/quarkus/annotation/processor/documentation/config/discovery/ParsedJavadocSection.java b/core/processor/src/main/java/io/quarkus/annotation/processor/documentation/config/discovery/ParsedJavadocSection.java new file mode 100644 index 0000000000000..5342e394c4870 --- /dev/null +++ b/core/processor/src/main/java/io/quarkus/annotation/processor/documentation/config/discovery/ParsedJavadocSection.java @@ -0,0 +1,4 @@ +package io.quarkus.annotation.processor.documentation.config.discovery; + +public record ParsedJavadocSection(String title, String description) { +} \ No newline at end of file diff --git a/core/processor/src/main/java/io/quarkus/annotation/processor/documentation/config/discovery/ResolvedType.java b/core/processor/src/main/java/io/quarkus/annotation/processor/documentation/config/discovery/ResolvedType.java new file mode 100644 index 0000000000000..d73a83198bd9e --- /dev/null +++ b/core/processor/src/main/java/io/quarkus/annotation/processor/documentation/config/discovery/ResolvedType.java @@ -0,0 +1,83 @@ +package io.quarkus.annotation.processor.documentation.config.discovery; + +import javax.lang.model.element.TypeElement; +import javax.lang.model.type.DeclaredType; +import javax.lang.model.type.TypeMirror; + +public record ResolvedType( + TypeMirror wrapperType, + TypeMirror unwrappedType, + String binaryName, + String qualifiedName, + String simplifiedName, + boolean isPrimitive, + boolean isMap, + boolean isList, + boolean isOptional, + boolean isDeclared, + boolean isInterface, + boolean isClass, + boolean isEnum, + boolean isDuration) { + + public TypeElement unwrappedTypeElement() { + if (!isDeclared) { + throw new IllegalStateException("Unable to get element as unwrappedType is not a DeclaredType: " + unwrappedType); + } + + return (TypeElement) ((DeclaredType) unwrappedType).asElement(); + } + + @Override + public final String toString() { + return unwrappedType.toString(); + } + + public static ResolvedType ofPrimitive(TypeMirror unwrappedType) { + String primitiveName = unwrappedType.toString(); + + return new ResolvedType(unwrappedType, unwrappedType, primitiveName, primitiveName, primitiveName, true, false, false, + false, false, + false, false, false, false); + } + + public static ResolvedType ofDeclaredType(TypeMirror type, String binaryName, + String qualifiedName, + String simpleName, + boolean isInterface, boolean isClass, boolean isEnum, boolean isDuration) { + return new ResolvedType(type, type, binaryName, qualifiedName, simpleName, false, false, false, false, true, + isInterface, + isClass, + isEnum, isDuration); + } + + public static ResolvedType makeList(TypeMirror type, ResolvedType unwrappedResolvedType) { + return new ResolvedType(type, unwrappedResolvedType.unwrappedType, + unwrappedResolvedType.binaryName, unwrappedResolvedType.qualifiedName, unwrappedResolvedType.simplifiedName, + unwrappedResolvedType.isPrimitive, + unwrappedResolvedType.isMap, true, + unwrappedResolvedType.isOptional, + unwrappedResolvedType.isDeclared, unwrappedResolvedType.isInterface, unwrappedResolvedType.isClass, + unwrappedResolvedType.isEnum, unwrappedResolvedType.isDuration); + } + + public static ResolvedType makeOptional(ResolvedType unwrappedResolvedType) { + return new ResolvedType(unwrappedResolvedType.wrapperType, unwrappedResolvedType.unwrappedType, + unwrappedResolvedType.binaryName, unwrappedResolvedType.qualifiedName, unwrappedResolvedType.simplifiedName, + unwrappedResolvedType.isPrimitive, + unwrappedResolvedType.isMap, unwrappedResolvedType.isList, + true, + unwrappedResolvedType.isDeclared, unwrappedResolvedType.isInterface, unwrappedResolvedType.isClass, + unwrappedResolvedType.isEnum, unwrappedResolvedType.isDuration); + } + + public static ResolvedType makeMap(TypeMirror type, ResolvedType unwrappedResolvedType) { + return new ResolvedType(type, unwrappedResolvedType.unwrappedType, + unwrappedResolvedType.binaryName, unwrappedResolvedType.qualifiedName, unwrappedResolvedType.simplifiedName, + unwrappedResolvedType.isPrimitive, + true, unwrappedResolvedType.isList, + unwrappedResolvedType.isOptional, + unwrappedResolvedType.isDeclared, unwrappedResolvedType.isInterface, unwrappedResolvedType.isClass, + unwrappedResolvedType.isEnum, unwrappedResolvedType.isDuration); + } +} \ No newline at end of file diff --git a/core/processor/src/main/java/io/quarkus/annotation/processor/documentation/config/discovery/UnresolvedEnumDefinition.java b/core/processor/src/main/java/io/quarkus/annotation/processor/documentation/config/discovery/UnresolvedEnumDefinition.java new file mode 100644 index 0000000000000..97133d3212091 --- /dev/null +++ b/core/processor/src/main/java/io/quarkus/annotation/processor/documentation/config/discovery/UnresolvedEnumDefinition.java @@ -0,0 +1,16 @@ +package io.quarkus.annotation.processor.documentation.config.discovery; + +import java.util.Map; + +/** + * This is an unresolved enum. It might get resolved at some point on final assembly. + */ +public record UnresolvedEnumDefinition(String qualifiedName, Map constants) { + + public record UnresolvedEnumConstant(String explicitValue) { + + public boolean hasExplicitValue() { + return explicitValue != null; + } + } +} diff --git a/core/processor/src/main/java/io/quarkus/annotation/processor/documentation/config/formatter/JavadocToAsciidocTransformer.java b/core/processor/src/main/java/io/quarkus/annotation/processor/documentation/config/formatter/JavadocToAsciidocTransformer.java new file mode 100644 index 0000000000000..62100a8596f18 --- /dev/null +++ b/core/processor/src/main/java/io/quarkus/annotation/processor/documentation/config/formatter/JavadocToAsciidocTransformer.java @@ -0,0 +1,525 @@ +package io.quarkus.annotation.processor.documentation.config.formatter; + +import java.util.Optional; +import java.util.regex.Pattern; + +import org.jsoup.Jsoup; +import org.jsoup.nodes.Node; +import org.jsoup.nodes.TextNode; + +import com.github.javaparser.StaticJavaParser; +import com.github.javaparser.javadoc.Javadoc; +import com.github.javaparser.javadoc.JavadocBlockTag; +import com.github.javaparser.javadoc.JavadocBlockTag.Type; +import com.github.javaparser.javadoc.description.JavadocDescription; +import com.github.javaparser.javadoc.description.JavadocDescriptionElement; +import com.github.javaparser.javadoc.description.JavadocInlineTag; + +import io.quarkus.annotation.processor.documentation.config.discovery.JavadocFormat; +import io.quarkus.annotation.processor.documentation.config.discovery.ParsedJavadoc; +import io.quarkus.annotation.processor.documentation.config.discovery.ParsedJavadocSection; +import io.quarkus.annotation.processor.documentation.config.util.ConfigNamingUtil; + +public final class JavadocToAsciidocTransformer { + + public static final JavadocToAsciidocTransformer INSTANCE = new JavadocToAsciidocTransformer(); + public static final JavadocToAsciidocTransformer INLINE_MACRO_INSTANCE = new JavadocToAsciidocTransformer(true); + + private static final Pattern START_OF_LINE = Pattern.compile("^", Pattern.MULTILINE); + private static final Pattern REPLACE_WINDOWS_EOL = Pattern.compile("\r\n"); + private static final Pattern REPLACE_MACOS_EOL = Pattern.compile("\r"); + private static final Pattern STARTING_SPACE = Pattern.compile("^ +"); + + private static final String EMPTY = ""; + private static final String DOT = "."; + + private static final String BACKTICK = "`"; + private static final String HASH = "#"; + private static final String STAR = "*"; + private static final String S_NODE = "s"; + private static final String UNDERSCORE = "_"; + private static final String NEW_LINE = "\n"; + private static final String LINK_NODE = "a"; + private static final String BOLD_NODE = "b"; + private static final String STRONG_NODE = "strong"; + private static final String BIG_NODE = "big"; + private static final String CODE_NODE = "code"; + private static final String DEL_NODE = "del"; + private static final String ITALICS_NODE = "i"; + private static final String EMPHASIS_NODE = "em"; + private static final String TEXT_NODE = "#text"; + private static final String UNDERLINE_NODE = "u"; + private static final String NEW_LINE_NODE = "br"; + private static final String PARAGRAPH_NODE = "p"; + private static final String SMALL_NODE = "small"; + private static final String LIST_ITEM_NODE = "li"; + private static final String HREF_ATTRIBUTE = "href"; + private static final String STRIKE_NODE = "strike"; + private static final String SUB_SCRIPT_NODE = "sub"; + private static final String ORDERED_LIST_NODE = "ol"; + private static final String SUPER_SCRIPT_NODE = "sup"; + private static final String UN_ORDERED_LIST_NODE = "ul"; + private static final String PREFORMATED_NODE = "pre"; + private static final String BLOCKQUOTE_NODE = "blockquote"; + + private static final String BIG_ASCIDOC_STYLE = "[.big]"; + private static final String LINK_ATTRIBUTE_FORMAT = "[%s]"; + private static final String SUB_SCRIPT_ASCIDOC_STYLE = "~"; + private static final String SUPER_SCRIPT_ASCIDOC_STYLE = "^"; + private static final String SMALL_ASCIDOC_STYLE = "[.small]"; + private static final String ORDERED_LIST_ITEM_ASCIDOC_STYLE = " . "; + private static final String UNORDERED_LIST_ITEM_ASCIDOC_STYLE = " - "; + private static final String UNDERLINE_ASCIDOC_STYLE = "[.underline]"; + private static final String LINE_THROUGH_ASCIDOC_STYLE = "[.line-through]"; + private static final String HARD_LINE_BREAK_ASCIDOC_STYLE = " +\n"; + private static final String CODE_BLOCK_ASCIDOC_STYLE = "```"; + private static final String BLOCKQUOTE_BLOCK_ASCIDOC_STYLE = "[quote]\n____"; + private static final String BLOCKQUOTE_BLOCK_ASCIDOC_STYLE_END = "____"; + + private final boolean inlineMacroMode; + + private JavadocToAsciidocTransformer(boolean inlineMacroMode) { + this.inlineMacroMode = inlineMacroMode; + } + + private JavadocToAsciidocTransformer() { + this(false); + } + + public ParsedJavadoc parseConfigItemJavadoc(String rawJavadoc) { + if (rawJavadoc == null || rawJavadoc.isBlank()) { + return ParsedJavadoc.empty(); + } + + // the parser expects all the lines to start with "* " + // we add it as it has been previously removed + Javadoc javadoc = StaticJavaParser.parseJavadoc(START_OF_LINE.matcher(rawJavadoc).replaceAll("* ")); + + String description; + JavadocFormat originalFormat; + + if (isAsciidoc(javadoc)) { + description = handleEolInAsciidoc(javadoc); + originalFormat = JavadocFormat.ASCIIDOC; + } else { + description = htmlJavadocToAsciidoc(javadoc.getDescription()); + originalFormat = JavadocFormat.JAVADOC; + } + + Optional since = javadoc.getBlockTags().stream() + .filter(t -> t.getType() == Type.SINCE) + .map(JavadocBlockTag::getContent) + .map(JavadocDescription::toText) + .findFirst(); + + return new ParsedJavadoc(description, since.isPresent() ? since.get() : null, originalFormat); + } + + public ParsedJavadocSection parseConfigSectionJavadoc(String javadocComment) { + if (javadocComment == null || javadocComment.trim().isEmpty()) { + return new ParsedJavadocSection(EMPTY, EMPTY); + } + + // the parser expects all the lines to start with "* " + // we add it as it has been previously removed + javadocComment = START_OF_LINE.matcher(javadocComment).replaceAll("* "); + Javadoc javadoc = StaticJavaParser.parseJavadoc(javadocComment); + + String asciidoc; + if (isAsciidoc(javadoc)) { + asciidoc = handleEolInAsciidoc(javadoc); + } else { + asciidoc = htmlJavadocToAsciidoc(javadoc.getDescription()); + } + + if (asciidoc == null || asciidoc.isBlank()) { + return new ParsedJavadocSection(EMPTY, EMPTY); + } + + final int endOfTitleIndex = asciidoc.indexOf(DOT); + if (endOfTitleIndex == -1) { + final String title = asciidoc.replaceAll("^([^\\w])+", EMPTY).trim(); + + return new ParsedJavadocSection(title, EMPTY); + } else { + final String title = asciidoc.substring(0, endOfTitleIndex).replaceAll("^([^\\w])+", EMPTY).trim(); + final String details = asciidoc.substring(endOfTitleIndex + 1).trim(); + + return new ParsedJavadocSection(title, details); + } + } + + private String handleEolInAsciidoc(Javadoc javadoc) { + // it's Asciidoc, so we just pass through + // it also uses platform specific EOL, so we need to convert them back to \n + String asciidoc = javadoc.getDescription().toText(); + asciidoc = REPLACE_WINDOWS_EOL.matcher(asciidoc).replaceAll("\n"); + asciidoc = REPLACE_MACOS_EOL.matcher(asciidoc).replaceAll("\n"); + return asciidoc; + } + + private boolean isAsciidoc(Javadoc javadoc) { + for (JavadocBlockTag blockTag : javadoc.getBlockTags()) { + if ("asciidoclet".equals(blockTag.getTagName())) { + return true; + } + } + return false; + } + + private String htmlJavadocToAsciidoc(JavadocDescription javadocDescription) { + StringBuilder sb = new StringBuilder(); + + for (JavadocDescriptionElement javadocDescriptionElement : javadocDescription.getElements()) { + if (javadocDescriptionElement instanceof JavadocInlineTag) { + JavadocInlineTag inlineTag = (JavadocInlineTag) javadocDescriptionElement; + String content = inlineTag.getContent().trim(); + switch (inlineTag.getType()) { + case CODE: + case VALUE: + case LITERAL: + case SYSTEM_PROPERTY: + sb.append('`'); + appendEscapedAsciiDoc(sb, content); + sb.append('`'); + break; + case LINK: + case LINKPLAIN: + if (content.startsWith(HASH)) { + content = ConfigNamingUtil.hyphenate(content.substring(1)); + } + sb.append('`'); + appendEscapedAsciiDoc(sb, content); + sb.append('`'); + break; + default: + sb.append(content); + break; + } + } else { + appendHtml(sb, Jsoup.parseBodyFragment(javadocDescriptionElement.toText())); + } + } + + return trim(sb); + } + + private void appendHtml(StringBuilder sb, Node node) { + for (Node childNode : node.childNodes()) { + switch (childNode.nodeName()) { + case PARAGRAPH_NODE: + newLine(sb); + newLine(sb); + appendHtml(sb, childNode); + break; + case PREFORMATED_NODE: + newLine(sb); + newLine(sb); + sb.append(CODE_BLOCK_ASCIDOC_STYLE); + newLine(sb); + for (Node grandChildNode : childNode.childNodes()) { + unescapeHtmlEntities(sb, grandChildNode.toString()); + } + newLineIfNeeded(sb); + sb.append(CODE_BLOCK_ASCIDOC_STYLE); + newLine(sb); + newLine(sb); + break; + case BLOCKQUOTE_NODE: + newLine(sb); + newLine(sb); + sb.append(BLOCKQUOTE_BLOCK_ASCIDOC_STYLE); + newLine(sb); + appendHtml(sb, childNode); + newLineIfNeeded(sb); + sb.append(BLOCKQUOTE_BLOCK_ASCIDOC_STYLE_END); + newLine(sb); + newLine(sb); + break; + case ORDERED_LIST_NODE: + case UN_ORDERED_LIST_NODE: + newLine(sb); + appendHtml(sb, childNode); + break; + case LIST_ITEM_NODE: + final String marker = childNode.parent().nodeName().equals(ORDERED_LIST_NODE) + ? ORDERED_LIST_ITEM_ASCIDOC_STYLE + : UNORDERED_LIST_ITEM_ASCIDOC_STYLE; + newLine(sb); + sb.append(marker); + appendHtml(sb, childNode); + break; + case LINK_NODE: + final String link = childNode.attr(HREF_ATTRIBUTE); + sb.append("link:"); + sb.append(link); + final StringBuilder caption = new StringBuilder(); + appendHtml(caption, childNode); + sb.append(String.format(LINK_ATTRIBUTE_FORMAT, trim(caption))); + break; + case CODE_NODE: + sb.append(BACKTICK); + appendHtml(sb, childNode); + sb.append(BACKTICK); + break; + case BOLD_NODE: + case STRONG_NODE: + sb.append(STAR); + appendHtml(sb, childNode); + sb.append(STAR); + break; + case EMPHASIS_NODE: + case ITALICS_NODE: + sb.append(UNDERSCORE); + appendHtml(sb, childNode); + sb.append(UNDERSCORE); + break; + case UNDERLINE_NODE: + sb.append(UNDERLINE_ASCIDOC_STYLE); + sb.append(HASH); + appendHtml(sb, childNode); + sb.append(HASH); + break; + case SMALL_NODE: + sb.append(SMALL_ASCIDOC_STYLE); + sb.append(HASH); + appendHtml(sb, childNode); + sb.append(HASH); + break; + case BIG_NODE: + sb.append(BIG_ASCIDOC_STYLE); + sb.append(HASH); + appendHtml(sb, childNode); + sb.append(HASH); + break; + case SUB_SCRIPT_NODE: + sb.append(SUB_SCRIPT_ASCIDOC_STYLE); + appendHtml(sb, childNode); + sb.append(SUB_SCRIPT_ASCIDOC_STYLE); + break; + case SUPER_SCRIPT_NODE: + sb.append(SUPER_SCRIPT_ASCIDOC_STYLE); + appendHtml(sb, childNode); + sb.append(SUPER_SCRIPT_ASCIDOC_STYLE); + break; + case DEL_NODE: + case S_NODE: + case STRIKE_NODE: + sb.append(LINE_THROUGH_ASCIDOC_STYLE); + sb.append(HASH); + appendHtml(sb, childNode); + sb.append(HASH); + break; + case NEW_LINE_NODE: + sb.append(HARD_LINE_BREAK_ASCIDOC_STYLE); + break; + case TEXT_NODE: + String text = ((TextNode) childNode).text(); + + if (text.isEmpty()) { + break; + } + + // Indenting the first line of a paragraph by one or more spaces makes the block literal + // Please see https://docs.asciidoctor.org/asciidoc/latest/verbatim/literal-blocks/ for more info + // This prevents literal blocks f.e. after
+ final var startingSpaceMatcher = STARTING_SPACE.matcher(text); + if (sb.length() > 0 && '\n' == sb.charAt(sb.length() - 1) && startingSpaceMatcher.find()) { + text = startingSpaceMatcher.replaceFirst(""); + } + + appendEscapedAsciiDoc(sb, text); + break; + default: + appendHtml(sb, childNode); + break; + } + } + } + + /** + * Trim the content of the given {@link StringBuilder} holding also AsciiDoc had line break {@code " +\n"} + * for whitespace in addition to characters <= {@code ' '}. + * + * @param sb the {@link StringBuilder} to trim + * @return the trimmed content of the given {@link StringBuilder} + */ + static String trim(StringBuilder sb) { + int length = sb.length(); + int offset = 0; + while (offset < length) { + final char ch = sb.charAt(offset); + if (ch == ' ' + && offset + 2 < length + && sb.charAt(offset + 1) == '+' + && sb.charAt(offset + 2) == '\n') { + /* Space followed by + and newline is AsciiDoc hard break that we consider whitespace */ + offset += 3; + continue; + } else if (ch > ' ') { + /* Non-whitespace as defined by String.trim() */ + break; + } + offset++; + } + if (offset > 0) { + sb.delete(0, offset); + } + if (sb.length() > 0) { + offset = sb.length() - 1; + while (offset >= 0) { + final char ch = sb.charAt(offset); + if (ch == '\n' + && offset - 2 >= 0 + && sb.charAt(offset - 1) == '+' + && sb.charAt(offset - 2) == ' ') { + /* Space followed by + is AsciiDoc hard break that we consider whitespace */ + offset -= 3; + continue; + } else if (ch > ' ') { + /* Non-whitespace as defined by String.trim() */ + break; + } + offset--; + } + if (offset < sb.length() - 1) { + sb.setLength(offset + 1); + } + } + return sb.toString(); + } + + private static StringBuilder newLineIfNeeded(StringBuilder sb) { + trimText(sb, " \t\r\n"); + return sb.append(NEW_LINE); + } + + private static StringBuilder newLine(StringBuilder sb) { + /* Trim trailing spaces and tabs at the end of line */ + trimText(sb, " \t"); + return sb.append(NEW_LINE); + } + + private static StringBuilder trimText(StringBuilder sb, String charsToTrim) { + while (sb.length() > 0 && charsToTrim.indexOf(sb.charAt(sb.length() - 1)) >= 0) { + sb.setLength(sb.length() - 1); + } + return sb; + } + + private StringBuilder unescapeHtmlEntities(StringBuilder sb, String text) { + int i = 0; + /* trim leading whitespace */ + LOOP: while (i < text.length()) { + switch (text.charAt(i++)) { + case ' ': + case '\t': + case '\r': + case '\n': + break; + default: + i--; + break LOOP; + } + } + for (; i < text.length(); i++) { + final char ch = text.charAt(i); + switch (ch) { + case '&': + int start = ++i; + while (i < text.length() && text.charAt(i) != ';') { + i++; + } + if (i > start) { + final String abbrev = text.substring(start, i); + switch (abbrev) { + case "lt": + sb.append('<'); + break; + case "gt": + sb.append('>'); + break; + case "nbsp": + sb.append("{nbsp}"); + break; + case "amp": + sb.append('&'); + break; + default: + try { + int code = Integer.parseInt(abbrev); + sb.append((char) code); + } catch (NumberFormatException e) { + throw new RuntimeException( + "Could not parse HTML entity &" + abbrev + "; in\n\n" + text + "\n\n"); + } + break; + } + } + break; + case '\r': + if (i + 1 < text.length() && text.charAt(i + 1) == '\n') { + /* Ignore \r followed by \n */ + } else { + /* A Mac single \r: replace by \n */ + sb.append('\n'); + } + break; + default: + sb.append(ch); + + } + } + return sb; + } + + private StringBuilder appendEscapedAsciiDoc(StringBuilder sb, String text) { + boolean escaping = false; + for (int i = 0; i < text.length(); i++) { + final char ch = text.charAt(i); + switch (ch) { + case ']': + // don't escape closing square bracket in the attribute list of an inline element with passThrough + // https://docs.asciidoctor.org/asciidoc/latest/attributes/positional-and-named-attributes/#substitutions + if (inlineMacroMode) { + if (escaping) { + sb.append("++"); + escaping = false; + } + sb.append("]"); + break; + } + case '#': + case '*': + case '\\': + case '{': + case '}': + case '[': + case '|': + if (!escaping) { + sb.append("++"); + escaping = true; + } + sb.append(ch); + break; + case '+': + if (escaping) { + sb.append("++"); + escaping = false; + } + sb.append("{plus}"); + break; + default: + if (escaping) { + sb.append("++"); + escaping = false; + } + sb.append(ch); + } + } + if (escaping) { + sb.append("++"); + } + return sb; + } +} diff --git a/core/processor/src/main/java/io/quarkus/annotation/processor/documentation/config/model/AbstractConfigItem.java b/core/processor/src/main/java/io/quarkus/annotation/processor/documentation/config/model/AbstractConfigItem.java new file mode 100644 index 0000000000000..0d36d28f2e6fd --- /dev/null +++ b/core/processor/src/main/java/io/quarkus/annotation/processor/documentation/config/model/AbstractConfigItem.java @@ -0,0 +1,45 @@ +package io.quarkus.annotation.processor.documentation.config.model; + +import com.fasterxml.jackson.annotation.JsonTypeInfo; + +@JsonTypeInfo(use = JsonTypeInfo.Id.CLASS, include = JsonTypeInfo.As.PROPERTY, property = "@class") +public sealed abstract class AbstractConfigItem implements Comparable + permits ConfigProperty, ConfigSection { + + private final String sourceClass; + private final String sourceName; + private final String path; + + private final String type; + private final String description; + + public AbstractConfigItem(String sourceClass, String sourceName, String path, String type, String description) { + this.sourceClass = sourceClass; + this.sourceName = sourceName; + this.path = path; + this.type = type; + this.description = description; + } + + public String getSourceClass() { + return sourceClass; + } + + public String getSourceName() { + return sourceName; + } + + public String getPath() { + return path; + } + + public String getType() { + return type; + } + + public String getDescription() { + return description; + } + + public abstract boolean isSection(); +} diff --git a/core/processor/src/main/java/io/quarkus/annotation/processor/documentation/config/model/ConfigGroup.java b/core/processor/src/main/java/io/quarkus/annotation/processor/documentation/config/model/ConfigGroup.java new file mode 100644 index 0000000000000..2173b326487e2 --- /dev/null +++ b/core/processor/src/main/java/io/quarkus/annotation/processor/documentation/config/model/ConfigGroup.java @@ -0,0 +1,5 @@ +package io.quarkus.annotation.processor.documentation.config.model; + +public class ConfigGroup { + +} diff --git a/core/processor/src/main/java/io/quarkus/annotation/processor/documentation/config/model/ConfigItemCollection.java b/core/processor/src/main/java/io/quarkus/annotation/processor/documentation/config/model/ConfigItemCollection.java new file mode 100644 index 0000000000000..111f3ab1ebb97 --- /dev/null +++ b/core/processor/src/main/java/io/quarkus/annotation/processor/documentation/config/model/ConfigItemCollection.java @@ -0,0 +1,11 @@ +package io.quarkus.annotation.processor.documentation.config.model; + +import java.util.List; + +public interface ConfigItemCollection { + + List getItems(); + + void addItem(AbstractConfigItem item); + +} diff --git a/core/processor/src/main/java/io/quarkus/annotation/processor/documentation/config/model/ConfigPhase.java b/core/processor/src/main/java/io/quarkus/annotation/processor/documentation/config/model/ConfigPhase.java new file mode 100644 index 0000000000000..6a0bae82dfcbe --- /dev/null +++ b/core/processor/src/main/java/io/quarkus/annotation/processor/documentation/config/model/ConfigPhase.java @@ -0,0 +1,61 @@ +package io.quarkus.annotation.processor.documentation.config.model; + +import java.util.Comparator; + +public enum ConfigPhase implements Comparable { + + RUN_TIME("RunTime"), + BUILD_TIME("BuildTime"), + BUILD_AND_RUN_TIME_FIXED("BuildTime"); + + static final Comparator COMPARATOR = new Comparator() { + /** + * Order built time phase first + * Then build time run time fixed phase + * Then runtime one + */ + @Override + public int compare(ConfigPhase firstPhase, ConfigPhase secondPhase) { + switch (firstPhase) { + case BUILD_TIME: { + switch (secondPhase) { + case BUILD_TIME: + return 0; + default: + return -1; + } + } + case BUILD_AND_RUN_TIME_FIXED: { + switch (secondPhase) { + case BUILD_TIME: + return 1; + case BUILD_AND_RUN_TIME_FIXED: + return 0; + default: + return -1; + } + } + case RUN_TIME: { + switch (secondPhase) { + case RUN_TIME: + return 0; + default: + return 1; + } + } + default: + return 0; + } + } + }; + + private String configSuffix; + + ConfigPhase(String configSuffix) { + this.configSuffix = configSuffix; + } + + public String getConfigSuffix() { + return configSuffix; + } +} diff --git a/core/processor/src/main/java/io/quarkus/annotation/processor/documentation/config/model/ConfigProperty.java b/core/processor/src/main/java/io/quarkus/annotation/processor/documentation/config/model/ConfigProperty.java new file mode 100644 index 0000000000000..b01cad909b624 --- /dev/null +++ b/core/processor/src/main/java/io/quarkus/annotation/processor/documentation/config/model/ConfigProperty.java @@ -0,0 +1,146 @@ +package io.quarkus.annotation.processor.documentation.config.model; + +import java.util.List; + +public final class ConfigProperty extends AbstractConfigItem { + + private final ConfigPhase phase; + private final List additionalPaths; + private final String environmentVariable; + + private final String typeDescription; + private final boolean map; + private final boolean list; + private final boolean optional; + private final String mapKey; + private final boolean unnamedMapKey; + private final boolean withinMap; + private final boolean converted; + private final boolean isEnum; + private final EnumAcceptedValues enumAcceptedValues; + + private final String defaultValue; + + private final String javadocSiteLink; + + private final boolean deprecated; + private final String since; + + public ConfigProperty(ConfigPhase phase, String sourceClass, String sourceName, String path, List additionalPaths, + String environmentVariable, String type, String typeDescription, boolean map, boolean list, boolean optional, + String mapKey, boolean unnamedMapKey, boolean withinMap, boolean converted, boolean isEnum, + EnumAcceptedValues enumAcceptedValues, + String defaultValue, String description, String javadocSiteLink, + boolean deprecated, String since) { + super(sourceClass, sourceName, path, typeDescription, description); + this.phase = phase; + this.additionalPaths = additionalPaths; + this.environmentVariable = environmentVariable; + this.typeDescription = typeDescription; + this.map = map; + this.list = list; + this.optional = optional; + this.mapKey = mapKey; + this.unnamedMapKey = unnamedMapKey; + this.withinMap = withinMap; + this.converted = converted; + this.isEnum = isEnum; + this.enumAcceptedValues = enumAcceptedValues; + this.defaultValue = defaultValue; + this.javadocSiteLink = javadocSiteLink; + this.deprecated = deprecated; + this.since = since; + } + + public ConfigPhase getPhase() { + return phase; + } + + public List getAdditionalPaths() { + return additionalPaths; + } + + public String getEnvironmentVariable() { + return environmentVariable; + } + + public String getTypeDescription() { + return typeDescription; + } + + public boolean isMap() { + return map; + } + + public boolean isList() { + return list; + } + + public boolean isOptional() { + return optional; + } + + public String getMapKey() { + return mapKey; + } + + public boolean isUnnamedMapKey() { + return unnamedMapKey; + } + + public boolean isWithinMap() { + return withinMap; + } + + public boolean isConverted() { + return converted; + } + + public boolean isEnum() { + return isEnum; + } + + public EnumAcceptedValues getEnumAcceptedValues() { + return enumAcceptedValues; + } + + public String getDefaultValue() { + return defaultValue; + } + + public String getJavadocSiteLink() { + return javadocSiteLink; + } + + public boolean isDeprecated() { + return deprecated; + } + + public String getSince() { + return since; + } + + public boolean isSection() { + return false; + } + + @Override + public int compareTo(AbstractConfigItem o) { + if (o instanceof ConfigSection) { + return -1; + } + + ConfigProperty other = (ConfigProperty) o; + + if (isWithinMap()) { + if (other.isWithinMap()) { + return ConfigPhase.COMPARATOR.compare(phase, other.getPhase()); + } + return 1; + } else if (other.isWithinMap()) { + return -1; + } + + return ConfigPhase.COMPARATOR.compare(phase, other.getPhase()); + } +} diff --git a/core/processor/src/main/java/io/quarkus/annotation/processor/documentation/config/model/ConfigRoot.java b/core/processor/src/main/java/io/quarkus/annotation/processor/documentation/config/model/ConfigRoot.java new file mode 100644 index 0000000000000..299a1d2552e0e --- /dev/null +++ b/core/processor/src/main/java/io/quarkus/annotation/processor/documentation/config/model/ConfigRoot.java @@ -0,0 +1,91 @@ +package io.quarkus.annotation.processor.documentation.config.model; + +import java.util.ArrayList; +import java.util.Collections; +import java.util.HashSet; +import java.util.List; +import java.util.Set; + +/** + * At this stage, a config root is actually a prefix: we merged all the config roots with the same prefix. + *

+ * Thus the phase for instance is not stored at this level but at the item level. + */ +public class ConfigRoot implements ConfigItemCollection { + + private final Extension extension; + private final String prefix; + + private String overriddenDocFileName; + private final List items = new ArrayList<>(); + private final Set qualifiedNames = new HashSet<>(); + private final Set unresolvedSuperclasses = new HashSet<>(); + private final List unresolvedInterfaces = new ArrayList<>(); + private final Set unresolvedEnums = new HashSet<>(); + + public ConfigRoot(Extension extension, String prefix) { + this.extension = extension; + this.prefix = prefix; + } + + public Extension getExtension() { + return extension; + } + + public String getPrefix() { + return prefix; + } + + public void setOverriddenDocFileName(String overriddenDocFileName) { + if (this.overriddenDocFileName != null) { + return; + } + this.overriddenDocFileName = overriddenDocFileName; + } + + public void addQualifiedName(String qualifiedName) { + qualifiedNames.add(qualifiedName); + } + + public Set getQualifiedNames() { + return Collections.unmodifiableSet(qualifiedNames); + } + + public void addUnresolvedSuperclass(String unresolvedSuperclass) { + unresolvedSuperclasses.add(unresolvedSuperclass); + } + + public Set getUnresolvedSuperclasses() { + return Collections.unmodifiableSet(unresolvedSuperclasses); + } + + public void addUnresolvedInterfaces(List unresolvedInterfaces) { + this.unresolvedInterfaces.addAll(unresolvedInterfaces); + } + + public List getUnresolvedInterfaces() { + return Collections.unmodifiableList(unresolvedInterfaces); + } + + public void addUnresolvedEnum(String unresolvedEnum) { + unresolvedEnums.add(unresolvedEnum); + } + + public Set getUnresolvedEnums() { + return unresolvedEnums; + } + + public boolean isFullyResolved() { + return unresolvedSuperclasses.isEmpty() && unresolvedInterfaces.isEmpty() && unresolvedEnums.isEmpty(); + } + + @Override + public void addItem(AbstractConfigItem item) { + this.items.add(item); + } + + @Override + public List getItems() { + return Collections.unmodifiableList(items); + } +} diff --git a/core/processor/src/main/java/io/quarkus/annotation/processor/documentation/config/model/ConfigSection.java b/core/processor/src/main/java/io/quarkus/annotation/processor/documentation/config/model/ConfigSection.java new file mode 100644 index 0000000000000..6882daba0bf78 --- /dev/null +++ b/core/processor/src/main/java/io/quarkus/annotation/processor/documentation/config/model/ConfigSection.java @@ -0,0 +1,43 @@ +package io.quarkus.annotation.processor.documentation.config.model; + +import java.util.ArrayList; +import java.util.Collections; +import java.util.List; + +public final class ConfigSection extends AbstractConfigItem implements ConfigItemCollection { + + private String title; + private final List items = new ArrayList<>(); + + public ConfigSection(String sourceClass, String sourceName, String path, String type, String title, String description) { + super(sourceClass, sourceName, path, type, description); + this.title = title; + } + + public String getTitle() { + return title; + } + + @Override + public void addItem(AbstractConfigItem item) { + this.items.add(item); + } + + @Override + public List getItems() { + return Collections.unmodifiableList(items); + } + + @Override + public int compareTo(AbstractConfigItem o) { + if (o instanceof ConfigProperty) { + return 1; + } + + return 0; + } + + public boolean isSection() { + return true; + } +} diff --git a/core/processor/src/main/java/io/quarkus/annotation/processor/documentation/config/model/EnumAcceptedValues.java b/core/processor/src/main/java/io/quarkus/annotation/processor/documentation/config/model/EnumAcceptedValues.java new file mode 100644 index 0000000000000..cc3bc7da67e1e --- /dev/null +++ b/core/processor/src/main/java/io/quarkus/annotation/processor/documentation/config/model/EnumAcceptedValues.java @@ -0,0 +1,12 @@ +package io.quarkus.annotation.processor.documentation.config.model; + +import java.util.Map; + +/** + * This is the enum accepted values that will appear in the documentation. + */ +public record EnumAcceptedValues(String qualifiedName, Map values) { + + public record EnumAcceptedValue(String description, String since) { + } +} diff --git a/core/processor/src/main/java/io/quarkus/annotation/processor/documentation/config/model/Extension.java b/core/processor/src/main/java/io/quarkus/annotation/processor/documentation/config/model/Extension.java new file mode 100644 index 0000000000000..2bb5f1b4dc6e3 --- /dev/null +++ b/core/processor/src/main/java/io/quarkus/annotation/processor/documentation/config/model/Extension.java @@ -0,0 +1,4 @@ +package io.quarkus.annotation.processor.documentation.config.model; + +public record Extension(String groupId, String artifactId, String name) { +} diff --git a/core/processor/src/main/java/io/quarkus/annotation/processor/documentation/config/model/ResolvedModel.java b/core/processor/src/main/java/io/quarkus/annotation/processor/documentation/config/model/ResolvedModel.java new file mode 100644 index 0000000000000..95be07e21271c --- /dev/null +++ b/core/processor/src/main/java/io/quarkus/annotation/processor/documentation/config/model/ResolvedModel.java @@ -0,0 +1,58 @@ +package io.quarkus.annotation.processor.documentation.config.model; + +import java.util.Collections; +import java.util.Map; + +/** + * This is the fully resolved model for a given module. + *

+ * Note that while it's fully resolved at the module level, it might not be fully resolved in case a config group, an interface + * or a superclass is in another module. + *

+ * When assembling all the models at a more global level (for instance when generating the doc or in the IDE), + * an additional resolution step might be needed if the model is not fully resolved. + */ +public class ResolvedModel { + + private final boolean fullyResolved; + + /** + * Key is the prefix of the config root (all config roots with the same prefix are merged). + */ + private Map configRoots; + + /** + * In some cases, we have a shared config mapping in a separate shared module. + *

+ * These mappings are not resolved to config roots but might be useful when fully resolving the unresolved interfaces and + * superclasses of a config root. + * This is only useful for corner cases, for instance in the observability dev services. + *

+ * Key is the prefix of the mapping. + */ + // TODO implement unresolved config mappings + //private Map unresolvedConfigMappings; + + /** + * Key is the qualified name of the class of the config group. + */ + private Map configGroups; + + public ResolvedModel(Map configRoots, Map configGroups, boolean fullyResolved) { + this.configRoots = Collections.unmodifiableMap(configRoots); + this.configGroups = Collections.unmodifiableMap(configGroups); + this.fullyResolved = fullyResolved; + } + + public Map getConfigRoots() { + return configRoots; + } + + public Map getConfigGroups() { + return configGroups; + } + + public boolean isFullyResolved() { + return fullyResolved; + } +} diff --git a/core/processor/src/main/java/io/quarkus/annotation/processor/documentation/config/resolver/ConfigResolver.java b/core/processor/src/main/java/io/quarkus/annotation/processor/documentation/config/resolver/ConfigResolver.java new file mode 100644 index 0000000000000..84d2ce3c2c07c --- /dev/null +++ b/core/processor/src/main/java/io/quarkus/annotation/processor/documentation/config/resolver/ConfigResolver.java @@ -0,0 +1,283 @@ +package io.quarkus.annotation.processor.documentation.config.resolver; + +import java.util.ArrayList; +import java.util.Arrays; +import java.util.HashMap; +import java.util.List; +import java.util.ListIterator; +import java.util.Map; +import java.util.stream.Collectors; + +import javax.lang.model.element.TypeElement; +import javax.lang.model.type.DeclaredType; +import javax.lang.model.type.TypeMirror; + +import io.quarkus.annotation.processor.documentation.config.discovery.DiscoveryConfigGroup; +import io.quarkus.annotation.processor.documentation.config.discovery.DiscoveryConfigProperty; +import io.quarkus.annotation.processor.documentation.config.discovery.DiscoveryConfigRoot; +import io.quarkus.annotation.processor.documentation.config.discovery.DiscoveryRootElement; +import io.quarkus.annotation.processor.documentation.config.discovery.EnumDefinition; +import io.quarkus.annotation.processor.documentation.config.discovery.ResolvedType; +import io.quarkus.annotation.processor.documentation.config.discovery.UnresolvedEnumDefinition; +import io.quarkus.annotation.processor.documentation.config.model.ConfigGroup; +import io.quarkus.annotation.processor.documentation.config.model.ConfigItemCollection; +import io.quarkus.annotation.processor.documentation.config.model.ConfigPhase; +import io.quarkus.annotation.processor.documentation.config.model.ConfigProperty; +import io.quarkus.annotation.processor.documentation.config.model.ConfigRoot; +import io.quarkus.annotation.processor.documentation.config.model.ConfigSection; +import io.quarkus.annotation.processor.documentation.config.model.EnumAcceptedValues; +import io.quarkus.annotation.processor.documentation.config.model.EnumAcceptedValues.EnumAcceptedValue; +import io.quarkus.annotation.processor.documentation.config.model.ResolvedModel; +import io.quarkus.annotation.processor.documentation.config.scanner.ConfigCollector; +import io.quarkus.annotation.processor.documentation.config.util.ConfigNamingUtil; +import io.quarkus.annotation.processor.documentation.config.util.JavadocUtil; +import io.quarkus.annotation.processor.documentation.config.util.Markers; +import io.quarkus.annotation.processor.util.Strings; +import io.quarkus.annotation.processor.util.Utils; + +/** + * The goal of this class is to resolve the elements obtained on scanning/discovery + * and assemble them into the final model. + *

+ * Note that the model is not exactly final as some elements might not be resolvable + * because they are inside another module: this annotation processor doesn't cross + * the module boundaries as it causes a lot of headaches (for instance for the Develocity + * caching but not only). + *

+ * NEVER CROSS THE STREAMS! + */ +public class ConfigResolver { + + private final Utils utils; + private final ConfigCollector configCollector; + + public ConfigResolver(Utils utils, ConfigCollector configCollector) { + this.utils = utils; + this.configCollector = configCollector; + } + + public ResolvedModel resolveModel() { + Map configRoots = new HashMap<>(); + + boolean fullyResolved = true; + + for (DiscoveryConfigRoot discoveryConfigRoot : configCollector.getConfigRoots()) { + ConfigRoot configRoot = configRoots.computeIfAbsent(discoveryConfigRoot.getPrefix(), + k -> new ConfigRoot(discoveryConfigRoot.getExtension(), discoveryConfigRoot.getPrefix())); + + configRoot.setOverriddenDocFileName(discoveryConfigRoot.getOverriddenDocFileName()); + configRoot.addQualifiedName(discoveryConfigRoot.getQualifiedName()); + configRoot.addUnresolvedInterfaces(discoveryConfigRoot.getUnresolvedInterfaces()); + + ResolutionContext context = new ResolutionContext(configRoot.getPrefix(), new ArrayList<>(), discoveryConfigRoot, + configRoot, + false); + for (DiscoveryConfigProperty discoveryConfigProperty : discoveryConfigRoot.getProperties().values()) { + resolveProperty(configRoot, discoveryConfigRoot.getPhase(), context, discoveryConfigProperty); + } + + configRoots.put(configRoot.getPrefix(), configRoot); + + fullyResolved = fullyResolved && configRoot.isFullyResolved(); + } + + Map configGroups = new HashMap<>(); + + // TODO GSM: config groups + + return new ResolvedModel(configRoots, configGroups, fullyResolved); + } + + private void resolveProperty(ConfigRoot configRoot, ConfigPhase phase, ResolutionContext context, + DiscoveryConfigProperty discoveryConfigProperty) { + String fullPath = appendPath(context.getPath(), discoveryConfigProperty.getPath()); + List additionalPaths = context.getAdditionalPaths().stream() + .map(p -> appendPath(p, discoveryConfigProperty.getPath())) + .collect(Collectors.toCollection(ArrayList::new)); + + String typeQualifiedName = discoveryConfigProperty.getType().qualifiedName(); + + if (configCollector.isResolvedConfigGroup(typeQualifiedName)) { + DiscoveryConfigGroup discoveryConfigGroup = configCollector.getResolvedConfigGroup(typeQualifiedName); + + if (discoveryConfigProperty.getType().isMap()) { + if (discoveryConfigProperty.isUnnamedMapKey()) { + ListIterator additionalPathsIterator = additionalPaths.listIterator(); + + additionalPathsIterator.add(fullPath + ConfigNamingUtil.getMapKey(discoveryConfigProperty.getMapKey())); + while (additionalPathsIterator.hasNext()) { + additionalPathsIterator.add(additionalPathsIterator.next() + + ConfigNamingUtil.getMapKey(discoveryConfigProperty.getMapKey())); + } + } else { + fullPath += ConfigNamingUtil.getMapKey(discoveryConfigProperty.getMapKey()); + additionalPaths = additionalPaths.stream() + .map(p -> p + ConfigNamingUtil.getMapKey(discoveryConfigProperty.getMapKey())) + .collect(Collectors.toCollection(ArrayList::new)); + } + } + + ResolutionContext configGroupContext; + + if (discoveryConfigProperty.isSection()) { + ConfigSection configSection = new ConfigSection(typeQualifiedName, + discoveryConfigProperty.getSourceName(), fullPath, typeQualifiedName, + discoveryConfigProperty.getSection().title(), + discoveryConfigProperty.getSection().description()); + context.getItemCollection().addItem(configSection); + configGroupContext = new ResolutionContext(fullPath, additionalPaths, discoveryConfigGroup, configSection, + discoveryConfigProperty.getType().isMap()); + } else { + configGroupContext = new ResolutionContext(fullPath, additionalPaths, discoveryConfigGroup, + context.getItemCollection(), discoveryConfigProperty.getType().isMap()); + } + + for (DiscoveryConfigProperty configGroupProperty : discoveryConfigGroup.getProperties().values()) { + resolveProperty(configRoot, phase, configGroupContext, configGroupProperty); + } + } else if (configCollector.isUnresolvedConfigGroup(typeQualifiedName)) { + + } else { + String typeBinaryName = discoveryConfigProperty.getType().binaryName(); + String typeSimplifiedName = discoveryConfigProperty.getType().simplifiedName(); + + // if the property has a converter, we don't hyphenate the values (per historical rules, not exactly sure of the reason) + boolean hyphenateEnumValues = !discoveryConfigProperty.isConverted(); + + String defaultValue = getDefaultValue(discoveryConfigProperty.getDefaultValue(), + discoveryConfigProperty.getDefaultValueForDoc(), discoveryConfigProperty.getType(), hyphenateEnumValues); + + EnumAcceptedValues enumAcceptedValues = null; + if (discoveryConfigProperty.getType().isEnum()) { + if (configCollector.isResolvedEnum(typeQualifiedName)) { + EnumDefinition enumDefinition = configCollector.getResolvedEnum(typeQualifiedName); + Map localAcceptedValues = enumDefinition.constants().entrySet().stream() + .collect(Collectors.toMap( + e -> e.getValue().hasExplicitValue() ? e.getValue().explicitValue() + : (hyphenateEnumValues ? ConfigNamingUtil.hyphenateEnumValue(e.getKey()) + : e.getKey()), + e -> new EnumAcceptedValue(e.getValue().description(), e.getValue().since()))); + enumAcceptedValues = new EnumAcceptedValues(enumDefinition.qualifiedName(), localAcceptedValues); + } else { + UnresolvedEnumDefinition unresolvedEnumDefinition = configCollector.getUnresolvedEnum(typeQualifiedName); + + Map localAcceptedValues = unresolvedEnumDefinition.constants().entrySet() + .stream() + .collect(Collectors.toMap( + e -> e.getValue().hasExplicitValue() ? e.getValue().explicitValue() + : (hyphenateEnumValues ? ConfigNamingUtil.hyphenateEnumValue(e.getKey()) + : e.getKey()), + e -> new EnumAcceptedValue(null, null))); + enumAcceptedValues = new EnumAcceptedValues(unresolvedEnumDefinition.qualifiedName(), localAcceptedValues); + + configRoot.addUnresolvedEnum(discoveryConfigProperty.getType().qualifiedName()); + } + } + + if (discoveryConfigProperty.getType().isMap()) { + // it is a leaf pass through map + typeQualifiedName = discoveryConfigProperty.getType().wrapperType().toString(); + typeSimplifiedName = utils.element().simplifyGenericType(discoveryConfigProperty.getType().wrapperType()); + + fullPath += ConfigNamingUtil.getMapKey(discoveryConfigProperty.getMapKey()); + additionalPaths = additionalPaths.stream() + .map(p -> p + ConfigNamingUtil.getMapKey(discoveryConfigProperty.getMapKey())) + .collect(Collectors.toCollection(ArrayList::new)); + } else if (discoveryConfigProperty.getType().isList()) { + typeQualifiedName = discoveryConfigProperty.getType().wrapperType().toString(); + typeSimplifiedName = "list of " + typeSimplifiedName; + } + + // this is a standard property + ConfigProperty configProperty = new ConfigProperty(phase, + context.getDiscoveryRootElement().getQualifiedName(), + discoveryConfigProperty.getSourceName(), fullPath, additionalPaths, + ConfigNamingUtil.toEnvVarName(fullPath), typeQualifiedName, typeSimplifiedName, + discoveryConfigProperty.getType().isMap(), discoveryConfigProperty.getType().isList(), + discoveryConfigProperty.getType().isOptional(), discoveryConfigProperty.getMapKey(), + discoveryConfigProperty.isUnnamedMapKey(), context.isWithinMap(), + discoveryConfigProperty.isConverted(), + discoveryConfigProperty.getType().isEnum(), + enumAcceptedValues, defaultValue, discoveryConfigProperty.getDescription(), + JavadocUtil.getJavadocSiteLink(typeBinaryName), + discoveryConfigProperty.isDeprecated(), + discoveryConfigProperty.getSince()); + context.getItemCollection().addItem(configProperty); + } + } + + public static String getDefaultValue(String defaultValue, String defaultValueForDoc, ResolvedType type, + boolean hyphenateEnumValues) { + if (!Strings.isBlank(defaultValueForDoc)) { + return defaultValueForDoc; + } + + if (defaultValue == null) { + return null; + } + + if (type.isEnum() && hyphenateEnumValues) { + if (type.isList()) { + return Arrays.stream(defaultValue.split(Markers.COMMA)) + .map(v -> ConfigNamingUtil.hyphenateEnumValue(v.trim())) + .collect(Collectors.joining(Markers.COMMA)); + } else { + return ConfigNamingUtil.hyphenateEnumValue(defaultValue.trim()); + } + } + + return defaultValue; + } + + public static String getType(TypeMirror typeMirror) { + if (typeMirror instanceof DeclaredType) { + DeclaredType declaredType = (DeclaredType) typeMirror; + TypeElement typeElement = (TypeElement) declaredType.asElement(); + return typeElement.getQualifiedName().toString(); + } + return typeMirror.toString(); + } + + public static String appendPath(String parentPath, String path) { + return Markers.PARENT.equals(path) ? parentPath : parentPath + Markers.DOT + path; + } + + private static class ResolutionContext { + + private final String path; + private final List additionalPaths; + private final DiscoveryRootElement discoveryRootElement; + private final ConfigItemCollection itemCollection; + private final boolean withinMap; + + private ResolutionContext(String path, List additionalPaths, DiscoveryRootElement discoveryRootElement, + ConfigItemCollection itemCollection, + boolean withinMap) { + this.path = path; + this.additionalPaths = additionalPaths; + this.discoveryRootElement = discoveryRootElement; + this.itemCollection = itemCollection; + this.withinMap = withinMap; + } + + public String getPath() { + return path; + } + + public List getAdditionalPaths() { + return additionalPaths; + } + + public DiscoveryRootElement getDiscoveryRootElement() { + return discoveryRootElement; + } + + public ConfigItemCollection getItemCollection() { + return itemCollection; + } + + public boolean isWithinMap() { + return withinMap; + } + } +} diff --git a/core/processor/src/main/java/io/quarkus/annotation/processor/documentation/config/scanner/AbstractConfigListener.java b/core/processor/src/main/java/io/quarkus/annotation/processor/documentation/config/scanner/AbstractConfigListener.java new file mode 100644 index 0000000000000..145d737b02971 --- /dev/null +++ b/core/processor/src/main/java/io/quarkus/annotation/processor/documentation/config/scanner/AbstractConfigListener.java @@ -0,0 +1,104 @@ +package io.quarkus.annotation.processor.documentation.config.scanner; + +import java.util.LinkedHashMap; +import java.util.Map; +import java.util.Optional; + +import javax.lang.model.element.AnnotationMirror; +import javax.lang.model.element.Element; +import javax.lang.model.element.ElementKind; +import javax.lang.model.element.TypeElement; + +import io.quarkus.annotation.processor.documentation.config.discovery.DiscoveryConfigGroup; +import io.quarkus.annotation.processor.documentation.config.discovery.EnumDefinition; +import io.quarkus.annotation.processor.documentation.config.discovery.EnumDefinition.EnumConstant; +import io.quarkus.annotation.processor.documentation.config.discovery.ParsedJavadoc; +import io.quarkus.annotation.processor.documentation.config.discovery.UnresolvedEnumDefinition; +import io.quarkus.annotation.processor.documentation.config.discovery.UnresolvedEnumDefinition.UnresolvedEnumConstant; +import io.quarkus.annotation.processor.documentation.config.formatter.JavadocToAsciidocTransformer; +import io.quarkus.annotation.processor.documentation.config.util.Types; +import io.quarkus.annotation.processor.util.Config; +import io.quarkus.annotation.processor.util.Utils; + +public class AbstractConfigListener implements ConfigAnnotationListener { + + protected final Config config; + protected final Utils utils; + protected final ConfigCollector configCollector; + + protected AbstractConfigListener(Config config, Utils utils, ConfigCollector configCollector) { + this.config = config; + this.utils = utils; + this.configCollector = configCollector; + } + + @Override + public Optional onConfigGroup(TypeElement configGroup) { + DiscoveryConfigGroup discoveryConfigGroup = new DiscoveryConfigGroup(config.getExtension(), + utils.element().getBinaryName(configGroup), + configGroup.getQualifiedName().toString()); + configCollector.addResolvedConfigGroup(discoveryConfigGroup); + return Optional.of(discoveryConfigGroup); + } + + @Override + public void onUnresolvedConfigGroup(TypeElement configGroup) { + configCollector.addUnresolvedConfigGroup(configGroup.getQualifiedName().toString()); + } + + @Override + public void onResolvedEnum(TypeElement enumTypeElement) { + Map enumConstants = new LinkedHashMap<>(); + + for (Element enumElement : enumTypeElement.getEnclosedElements()) { + if (enumElement.getKind() != ElementKind.ENUM_CONSTANT) { + continue; + } + + String rawJavadoc = utils.element().getJavadoc(enumElement); + ParsedJavadoc parsedJavadoc = JavadocToAsciidocTransformer.INSTANCE.parseConfigItemJavadoc(rawJavadoc); + + String explicitValue = null; + Map annotations = utils.element().getAnnotations(enumElement); + AnnotationMirror configDocEnumValue = annotations.get(Types.ANNOTATION_CONFIG_DOC_ENUM_VALUE); + if (configDocEnumValue != null) { + Map enumValueValues = utils.element().getAnnotationValues(configDocEnumValue); + explicitValue = (String) enumValueValues.get("value"); + } + + enumConstants.put(enumElement.getSimpleName().toString(), + new EnumConstant(explicitValue, parsedJavadoc.description(), parsedJavadoc.since(), rawJavadoc)); + } + + EnumDefinition enumDefinition = new EnumDefinition(enumTypeElement.getQualifiedName().toString(), + enumConstants); + configCollector.addResolvedEnum(enumDefinition); + } + + @Override + public void onUnresolvedEnum(TypeElement enumTypeElement) { + Map enumConstants = new LinkedHashMap<>(); + + for (Element enumElement : enumTypeElement.getEnclosedElements()) { + if (enumElement.getKind() != ElementKind.ENUM_CONSTANT) { + continue; + } + + String explicitValue = null; + Map annotations = utils.element().getAnnotations(enumElement); + AnnotationMirror configDocEnumValue = annotations.get(Types.ANNOTATION_CONFIG_DOC_ENUM_VALUE); + if (configDocEnumValue != null) { + Map enumValueValues = utils.element().getAnnotationValues(configDocEnumValue); + explicitValue = (String) enumValueValues.get("value"); + } + + enumConstants.put(enumElement.getSimpleName().toString(), new UnresolvedEnumConstant(explicitValue)); + } + + UnresolvedEnumDefinition unresolvedEnumDefinition = new UnresolvedEnumDefinition( + enumTypeElement.getQualifiedName().toString(), + enumConstants); + + configCollector.addUnresolvedEnum(unresolvedEnumDefinition); + } +} diff --git a/core/processor/src/main/java/io/quarkus/annotation/processor/documentation/config/scanner/AbstractJavadocConfigListener.java b/core/processor/src/main/java/io/quarkus/annotation/processor/documentation/config/scanner/AbstractJavadocConfigListener.java new file mode 100644 index 0000000000000..f9f45ab7362bd --- /dev/null +++ b/core/processor/src/main/java/io/quarkus/annotation/processor/documentation/config/scanner/AbstractJavadocConfigListener.java @@ -0,0 +1,40 @@ +package io.quarkus.annotation.processor.documentation.config.scanner; + +import javax.lang.model.element.Element; +import javax.lang.model.element.ElementKind; +import javax.lang.model.element.TypeElement; + +import io.quarkus.annotation.processor.documentation.config.util.Markers; +import io.quarkus.annotation.processor.util.Config; +import io.quarkus.annotation.processor.util.Utils; + +public class AbstractJavadocConfigListener implements ConfigAnnotationListener { + + protected final Config config; + protected final Utils utils; + protected final ConfigCollector configCollector; + + protected AbstractJavadocConfigListener(Config config, Utils utils, ConfigCollector configCollector) { + this.config = config; + this.utils = utils; + this.configCollector = configCollector; + } + + @Override + public void onResolvedEnum(TypeElement enumTypeElement) { + for (Element enumElement : enumTypeElement.getEnclosedElements()) { + if (enumElement.getKind() != ElementKind.ENUM_CONSTANT) { + continue; + } + + String javadoc = utils.element().getJavadoc(enumElement); + if (javadoc != null && !javadoc.isBlank()) { + configCollector + .addJavadocProperty( + enumTypeElement.getQualifiedName().toString() + Markers.DOT + enumElement.getSimpleName() + .toString(), + javadoc); + } + } + } +} diff --git a/core/processor/src/main/java/io/quarkus/annotation/processor/documentation/config/scanner/ConfigAnnotationListener.java b/core/processor/src/main/java/io/quarkus/annotation/processor/documentation/config/scanner/ConfigAnnotationListener.java new file mode 100644 index 0000000000000..11e8f7b273800 --- /dev/null +++ b/core/processor/src/main/java/io/quarkus/annotation/processor/documentation/config/scanner/ConfigAnnotationListener.java @@ -0,0 +1,55 @@ +package io.quarkus.annotation.processor.documentation.config.scanner; + +import java.util.Optional; + +import javax.lang.model.element.ExecutableElement; +import javax.lang.model.element.TypeElement; +import javax.lang.model.element.VariableElement; + +import io.quarkus.annotation.processor.documentation.config.discovery.DiscoveryConfigGroup; +import io.quarkus.annotation.processor.documentation.config.discovery.DiscoveryConfigRoot; +import io.quarkus.annotation.processor.documentation.config.discovery.DiscoveryRootElement; +import io.quarkus.annotation.processor.documentation.config.discovery.ResolvedType; + +public interface ConfigAnnotationListener { + + default Optional onConfigRoot(TypeElement configRoot) { + return Optional.empty(); + } + + default void onSuperclass(DiscoveryRootElement discoveryRootElement, TypeElement superClass) { + } + + default void onUnresolvedSuperclass(DiscoveryRootElement discoveryRootElement, TypeElement superclass) { + } + + default void onInterface(DiscoveryRootElement discoveryRootElement, TypeElement interfaze) { + } + + default void onUnresolvedInterface(DiscoveryRootElement discoveryRootElement, TypeElement interfaze) { + } + + default Optional onConfigGroup(TypeElement configGroup) { + return Optional.empty(); + } + + default void onUnresolvedConfigGroup(TypeElement configGroup) { + } + + default void onEnclosedMethod(DiscoveryRootElement discoveryRootElement, TypeElement clazz, ExecutableElement method, + ResolvedType type) { + } + + default void onEnclosedField(DiscoveryRootElement discoveryRootElement, TypeElement clazz, VariableElement field, + ResolvedType type) { + } + + default void onResolvedEnum(TypeElement enumTypeElement) { + } + + default void onUnresolvedEnum(TypeElement enumTypeElement) { + } + + default void finalizeProcessing() { + } +} diff --git a/core/processor/src/main/java/io/quarkus/annotation/processor/documentation/config/scanner/ConfigAnnotationScanner.java b/core/processor/src/main/java/io/quarkus/annotation/processor/documentation/config/scanner/ConfigAnnotationScanner.java new file mode 100644 index 0000000000000..1029b9eca7d9f --- /dev/null +++ b/core/processor/src/main/java/io/quarkus/annotation/processor/documentation/config/scanner/ConfigAnnotationScanner.java @@ -0,0 +1,430 @@ +package io.quarkus.annotation.processor.documentation.config.scanner; + +import static javax.lang.model.util.ElementFilter.typesIn; + +import java.time.Duration; +import java.util.ArrayList; +import java.util.Collections; +import java.util.HashSet; +import java.util.List; +import java.util.Map; +import java.util.Optional; +import java.util.Set; +import java.util.function.Consumer; +import java.util.function.Function; + +import javax.annotation.processing.RoundEnvironment; +import javax.lang.model.element.AnnotationMirror; +import javax.lang.model.element.Element; +import javax.lang.model.element.ElementKind; +import javax.lang.model.element.ExecutableElement; +import javax.lang.model.element.Modifier; +import javax.lang.model.element.PackageElement; +import javax.lang.model.element.TypeElement; +import javax.lang.model.element.VariableElement; +import javax.lang.model.type.ArrayType; +import javax.lang.model.type.DeclaredType; +import javax.lang.model.type.TypeKind; +import javax.lang.model.type.TypeMirror; +import javax.lang.model.util.ElementFilter; +import javax.tools.Diagnostic; +import javax.tools.Diagnostic.Kind; + +import io.quarkus.annotation.processor.documentation.config.discovery.DiscoveryConfigGroup; +import io.quarkus.annotation.processor.documentation.config.discovery.DiscoveryConfigRoot; +import io.quarkus.annotation.processor.documentation.config.discovery.DiscoveryRootElement; +import io.quarkus.annotation.processor.documentation.config.discovery.ResolvedType; +import io.quarkus.annotation.processor.documentation.config.util.TypeUtil; +import io.quarkus.annotation.processor.documentation.config.util.Types; +import io.quarkus.annotation.processor.util.Config; +import io.quarkus.annotation.processor.util.Utils; + +public class ConfigAnnotationScanner { + + private final Utils utils; + private final Config config; + private final ConfigCollector configCollector; + private final Set configGroupClassNames = new HashSet<>(); + private final Set configRootClassNames = new HashSet<>(); + private final Set enumClassNames = new HashSet<>(); + + private final List listeners; + + public ConfigAnnotationScanner(Config config, Utils utils) { + this.config = config; + this.utils = utils; + this.configCollector = new ConfigCollector(); + + List listeners = new ArrayList<>(); + if (config.useConfigMapping()) { + listeners.add(new JavadocConfigMappingListener(config, utils, configCollector)); + listeners.add(new ConfigMappingListener(config, utils, configCollector)); + } else { + listeners.add(new JavadocLegacyConfigRootListener(config, utils, configCollector)); + listeners.add(new LegacyConfigListener(config, utils, configCollector)); + } + this.listeners = Collections.unmodifiableList(listeners); + } + + public void scanConfigGroups(RoundEnvironment roundEnv, TypeElement annotation) { + for (TypeElement configGroup : ElementFilter.typesIn(roundEnv.getElementsAnnotatedWith(annotation))) { + if (isConfigGroupAlreadyHandled(configGroup)) { + continue; + } + + debug("Detected annotated config group: " + configGroup, configGroup); + + try { + DiscoveryConfigGroup discoveryConfigGroup = applyRootListeners(l -> l.onConfigGroup(configGroup)); + scanElement(discoveryConfigGroup, configGroup); + } catch (Exception e) { + throw new IllegalStateException("Unable to scan config group: " + configGroup, e); + } + } + } + + public void scanConfigRoots(RoundEnvironment roundEnv, TypeElement annotation) { + for (TypeElement configRoot : typesIn(roundEnv.getElementsAnnotatedWith(annotation))) { + final PackageElement pkg = utils.element().getPackageOf(configRoot); + if (pkg == null) { + utils.processingEnv().getMessager().printMessage(Diagnostic.Kind.ERROR, + "Element " + configRoot + " has no enclosing package"); + continue; + } + + if (isConfigRootAlreadyHandled(configRoot)) { + continue; + } + + debug("Detected config root: " + configRoot, configRoot); + + try { + DiscoveryConfigRoot discoveryConfigRoot = applyRootListeners(l -> l.onConfigRoot(configRoot)); + scanElement(discoveryConfigRoot, configRoot); + } catch (Exception e) { + throw new IllegalStateException("Unable to scan config root: " + configRoot, e); + } + } + } + + public ConfigCollector finalizeProcessing() { + applyListeners(l -> l.finalizeProcessing()); + + return configCollector; + } + + private void scanElement(DiscoveryRootElement configRootElement, TypeElement clazz) { + // we scan the superclass and interfaces first so that the local elements can potentially override them + if (clazz.getKind() == ElementKind.INTERFACE) { + List superInterfaces = clazz.getInterfaces(); + for (TypeMirror superInterface : superInterfaces) { + TypeElement superInterfaceTypeElement = (TypeElement) ((DeclaredType) superInterface).asElement(); + + debug("Detected superinterface: " + superInterfaceTypeElement, clazz); + + if (utils.element().isLocalClass(superInterfaceTypeElement)) { + applyListeners(l -> l.onInterface(configRootElement, superInterfaceTypeElement)); + if (!isConfigRootAlreadyHandled(superInterfaceTypeElement)) { + scanElement(configRootElement, superInterfaceTypeElement); + } + } else { + applyListeners(l -> l.onUnresolvedInterface(configRootElement, superInterfaceTypeElement)); + } + } + } else { + TypeMirror superclass = clazz.getSuperclass(); + if (superclass.getKind() != TypeKind.NONE && !superclass.toString().equals(Object.class.getName())) { + TypeElement superclassTypeElement = (TypeElement) ((DeclaredType) superclass).asElement(); + + debug("Detected superclass: " + superclassTypeElement, clazz); + + if (utils.element().isLocalClass(superclassTypeElement)) { + applyListeners(l -> l.onSuperclass(configRootElement, clazz)); + if (!isConfigRootAlreadyHandled(superclassTypeElement)) { + scanElement(configRootElement, superclassTypeElement); + } + } else { + applyListeners(l -> l.onUnresolvedSuperclass(configRootElement, superclassTypeElement)); + } + } + } + + for (Element e : clazz.getEnclosedElements()) { + switch (e.getKind()) { + case INTERFACE: { + // We don't need to catch the enclosed interface anymore + // They are config groups and they will be detected as such when parsing the methods + break; + } + + case METHOD: { + ExecutableElement method = (ExecutableElement) e; + if (isMethodIgnored(method)) { + continue; + } + + // Find groups without annotation + TypeMirror returnType = method.getReturnType(); + + ResolvedType resolvedType = resolveType(returnType); + if (resolvedType.isEnum()) { + handleEnum(resolvedType.unwrappedTypeElement()); + } else if (resolvedType.isInterface()) { + TypeElement unwrappedTypeElement = resolvedType.unwrappedTypeElement(); + if (!utils.element().isJdkClass(unwrappedTypeElement)) { + if (!isConfigGroupAlreadyHandled(unwrappedTypeElement)) { + if (utils.element().isLocalClass(unwrappedTypeElement)) { + debug("Detected config group: " + resolvedType + " on method: " + + method, clazz); + + DiscoveryConfigGroup discoveryConfigGroup = applyRootListeners( + l -> l.onConfigGroup(unwrappedTypeElement)); + scanElement(discoveryConfigGroup, unwrappedTypeElement); + } else { + debug("Detected unresolved config group: " + resolvedType + " on method: " + + method, clazz); + + // if the class is not local, we register it as an unresolved config group + applyListeners(l -> l.onUnresolvedConfigGroup(unwrappedTypeElement)); + } + } + } + } + + debug("Detected enclosed method: " + method, e); + + applyListeners(l -> l.onEnclosedMethod(configRootElement, clazz, method, resolvedType)); + + break; + } + + case FIELD: { + VariableElement field = (VariableElement) e; + + if (isFieldIgnored(field)) { + continue; + } + + ResolvedType resolvedType = resolveType(field.asType()); + + if (resolvedType.isEnum()) { + handleEnum(resolvedType.unwrappedTypeElement()); + } else if (resolvedType.isClass()) { + TypeElement unwrappedTypeElement = resolvedType.unwrappedTypeElement(); + if (!utils.element().isJdkClass(unwrappedTypeElement) && + !isConfigGroupAlreadyHandled(unwrappedTypeElement) && + !utils.element().isLocalClass(unwrappedTypeElement)) { + + debug("Detected unresolved config group: " + resolvedType + " on field: " + field, + clazz); + + // if the class is not local and has a @ConfigGroup annotation, we register it as an unresolved config group + // fields are used by legacy @ConfigRoot and for them the @ConfigGroup annotation is always mandatory + applyListeners(l -> l.onUnresolvedConfigGroup(unwrappedTypeElement)); + } + } + + debug("Detected enclosed field: " + field, clazz); + + applyListeners(l -> l.onEnclosedField(configRootElement, clazz, field, resolvedType)); + break; + } + + case ENUM: { + handleEnum((TypeElement) e); + break; + } + + default: + // do nothing + break; + } + } + } + + private void handleEnum(TypeElement enumTypeElement) { + if (!isEnumAlreadyHandled(enumTypeElement)) { + if (utils.element().isLocalClass(enumTypeElement)) { + applyListeners(l -> l.onResolvedEnum(enumTypeElement)); + } else { + applyListeners(l -> l.onUnresolvedEnum(enumTypeElement)); + } + } + } + + private boolean isConfigRootAlreadyHandled(TypeElement clazz) { + String qualifiedName = clazz.getQualifiedName().toString(); + + return !configRootClassNames.add(qualifiedName); + } + + private boolean isConfigGroupAlreadyHandled(TypeElement clazz) { + String qualifiedName = clazz.getQualifiedName().toString(); + + return !configGroupClassNames.add(qualifiedName); + } + + private boolean isEnumAlreadyHandled(TypeElement clazz) { + String qualifiedName = clazz.getQualifiedName().toString(); + + return !enumClassNames.add(qualifiedName); + } + + private ResolvedType resolveType(TypeMirror typeMirror) { + if (typeMirror.getKind().isPrimitive()) { + return ResolvedType.ofPrimitive(typeMirror); + } + if (typeMirror.getKind() == TypeKind.ARRAY) { + ResolvedType resolvedType = resolveType(((ArrayType) typeMirror).getComponentType()); + return ResolvedType.makeList(typeMirror, resolvedType); + } + + DeclaredType declaredType = (DeclaredType) typeMirror; + TypeElement typeElement = (TypeElement) declaredType.asElement(); + + String qualifiedName = typeElement.getQualifiedName().toString(); + + boolean optional = qualifiedName.startsWith(Optional.class.getName()); + boolean map = qualifiedName.equals(Map.class.getName()); + boolean list = qualifiedName.equals(List.class.getName()) + || qualifiedName.equals(Set.class.getName()); + + List typeArguments = declaredType.getTypeArguments(); + if (!typeArguments.isEmpty()) { + // let's resolve the type + if (typeArguments.size() == 1 && optional) { + return ResolvedType.makeOptional(resolveType(typeArguments.get(0))); + } else if (typeArguments.size() == 1 && list) { + return ResolvedType.makeList(typeMirror, resolveType(typeArguments.get(0))); + } else if (typeArguments.size() == 2 && map) { + return ResolvedType.makeMap(typeMirror, resolveType(typeArguments.get(1))); + } + } + + String binaryName = utils.element().getBinaryName(typeElement); + String simplifiedName = getSimplifiedTypeName(typeElement); + + boolean isInterface = false; + boolean isClass = false; + boolean isEnum = false; + boolean isDuration = false; + + if (typeElement.getKind() == ElementKind.ENUM) { + isEnum = true; + } else if (typeElement.getKind() == ElementKind.INTERFACE) { + isInterface = true; + } else if (typeElement.getKind() == ElementKind.CLASS) { + isClass = true; + isDuration = typeMirror.toString().equals(Duration.class.getName()); + } + + ResolvedType resolvedType = ResolvedType.ofDeclaredType(typeMirror, binaryName, qualifiedName, simplifiedName, + isInterface, isClass, isEnum, isDuration); + + // optional can also be present on non wrapper types (e.g. OptionalInt) + if (optional) { + return ResolvedType.makeOptional(resolvedType); + } + + return resolvedType; + } + + private String getSimplifiedTypeName(TypeElement typeElement) { + String qualifiedName = typeElement.getQualifiedName().toString(); + + String typeAlias = TypeUtil.getAlias(qualifiedName); + if (typeAlias != null) { + return typeAlias; + } + if (TypeUtil.isPrimitiveWrapper(qualifiedName)) { + return TypeUtil.unbox(qualifiedName); + } + + return typeElement.getSimpleName().toString(); + } + + public boolean isMethodIgnored(ExecutableElement method) { + // default methods are ignored + if (!method.getModifiers().contains(Modifier.ABSTRACT)) { + return true; + } + if (TypeKind.VOID == method.getReturnType().getKind()) { + return true; + } + // Skip toString method, because mappings can include it and generate it + if (method.getSimpleName().contentEquals("toString") + && method.getParameters().isEmpty()) { + return true; + } + + if (utils.element().isAnnotationPresent(method, Types.ANNOTATION_CONFIG_DOC_IGNORE)) { + return true; + } + + return false; + } + + public boolean isFieldIgnored(VariableElement field) { + if (field.getModifiers().contains(Modifier.STATIC)) { + return true; + } + + Map annotations = utils.element().getAnnotations(field); + + if (annotations.containsKey(Types.ANNOTATION_CONFIG_ITEM)) { + Map annotationValues = utils.element() + .getAnnotationValues(annotations.get(Types.ANNOTATION_CONFIG_ITEM)); + Boolean generateDocumentation = (Boolean) annotationValues.get("generateDocumentation"); + + if (generateDocumentation != null && !generateDocumentation) { + return true; + } + return false; + } + // this was added specifically for @ConfigMapping but it can also be set on fields so let's be safe + if (annotations.containsKey(Types.ANNOTATION_CONFIG_DOC_IGNORE)) { + return true; + } + if (annotations.containsKey(Types.ANNOTATION_CONFIG_DOC_SECTION)) { + return false; + } + + return true; + } + + private void applyListeners(Consumer listenerFunction) { + for (ConfigAnnotationListener listener : listeners) { + listenerFunction.accept(listener); + } + } + + private T applyRootListeners( + Function> listenerFunction) { + T discoveryRootElement = null; + + for (ConfigAnnotationListener listener : listeners) { + Optional discoveryRootElementCandidate = listenerFunction.apply(listener); + if (discoveryRootElementCandidate.isPresent()) { + if (discoveryRootElement != null) { + throw new IllegalStateException("Multiple listeners returned discovery root elements"); + } + + discoveryRootElement = discoveryRootElementCandidate.get(); + } + } + + if (discoveryRootElement == null) { + throw new IllegalStateException("No listeners returned a discovery root element"); + } + + return discoveryRootElement; + } + + private void debug(String debug, Element element) { + if (!config.isDebug()) { + return; + } + + utils.processingEnv().getMessager().printMessage(Kind.NOTE, "[" + element.getSimpleName() + "] " + debug); + } +} diff --git a/core/processor/src/main/java/io/quarkus/annotation/processor/documentation/config/scanner/ConfigCollector.java b/core/processor/src/main/java/io/quarkus/annotation/processor/documentation/config/scanner/ConfigCollector.java new file mode 100644 index 0000000000000..4af01a1493133 --- /dev/null +++ b/core/processor/src/main/java/io/quarkus/annotation/processor/documentation/config/scanner/ConfigCollector.java @@ -0,0 +1,161 @@ +package io.quarkus.annotation.processor.documentation.config.scanner; + +import java.util.Collection; +import java.util.Collections; +import java.util.HashMap; +import java.util.HashSet; +import java.util.Map; +import java.util.Properties; +import java.util.Set; + +import io.quarkus.annotation.processor.documentation.config.discovery.DiscoveryConfigGroup; +import io.quarkus.annotation.processor.documentation.config.discovery.DiscoveryConfigRoot; +import io.quarkus.annotation.processor.documentation.config.discovery.EnumDefinition; +import io.quarkus.annotation.processor.documentation.config.discovery.UnresolvedEnumDefinition; + +public class ConfigCollector { + + @Deprecated(since = "3.14", forRemoval = true) + private Properties javadocProperties = new Properties(); + + /** + * Key is the qualified name of the class. + */ + private Map configRoots = new HashMap<>(); + + /** + * Key is the qualified name of the class. + */ + private Map resolvedConfigGroups = new HashMap<>(); + + /** + * Contains the qualified name of the class. + */ + private Set unresolvedConfigGroups = new HashSet<>(); + + /** + * Key is the qualified name of the class. + */ + private Map resolvedEnums = new HashMap<>(); + + /** + * Contains the qualified name of the class. + */ + private Map unresolvedEnums = new HashMap<>(); + + @Deprecated(since = "3.14", forRemoval = true) + void addJavadocProperty(String key, String docComment) { + javadocProperties.put(key, docComment); + } + + @Deprecated(since = "3.14", forRemoval = true) + public Properties getJavadocProperties() { + return javadocProperties; + } + + public void addConfigRoot(DiscoveryConfigRoot configRoot) { + configRoots.put(configRoot.getQualifiedName(), configRoot); + } + + public Collection getConfigRoots() { + return Collections.unmodifiableCollection(configRoots.values()); + } + + public void addResolvedConfigGroup(DiscoveryConfigGroup configGroup) { + resolvedConfigGroups.put(configGroup.getQualifiedName(), configGroup); + } + + public void addUnresolvedConfigGroup(String configGroupClassName) { + unresolvedConfigGroups.add(configGroupClassName); + } + + public Collection getResolvedConfigGroups() { + return Collections.unmodifiableCollection(resolvedConfigGroups.values()); + } + + public DiscoveryConfigGroup getResolvedConfigGroup(String configGroupClassName) { + return resolvedConfigGroups.get(configGroupClassName); + } + + public Set getUnresolvedConfigGroups() { + return Collections.unmodifiableSet(unresolvedConfigGroups); + } + + public boolean isConfigGroup(String className) { + return isResolvedConfigGroup(className) || isUnresolvedConfigGroup(className); + } + + public boolean isResolvedConfigGroup(String className) { + return resolvedConfigGroups.containsKey(className); + } + + public boolean isUnresolvedConfigGroup(String className) { + return unresolvedConfigGroups.contains(className); + } + + public void addResolvedEnum(EnumDefinition enumDefinition) { + resolvedEnums.put(enumDefinition.qualifiedName(), enumDefinition); + } + + public void addUnresolvedEnum(UnresolvedEnumDefinition unresolvedEnumDefinition) { + unresolvedEnums.put(unresolvedEnumDefinition.qualifiedName(), unresolvedEnumDefinition); + } + + public boolean isEnum(String className) { + return isResolvedEnum(className) || isUnresolvedEnum(className); + } + + public boolean isResolvedEnum(String className) { + return resolvedEnums.containsKey(className); + } + + public boolean isUnresolvedEnum(String className) { + return unresolvedEnums.containsKey(className); + } + + public UnresolvedEnumDefinition getUnresolvedEnum(String className) { + return unresolvedEnums.get(className); + } + + public EnumDefinition getResolvedEnum(String name) { + return resolvedEnums.get(name); + } + + public Map getResolvedEnums() { + return resolvedEnums; + } + + @Override + public String toString() { + StringBuilder sb = new StringBuilder(); + + sb.append("=======================================================\n"); + sb.append("= Config roots\n"); + sb.append("=======================================================\n\n"); + + for (DiscoveryConfigRoot configRoot : configRoots.values()) { + sb.append("- " + configRoot.getQualifiedName() + "\n"); + sb.append(configRoot.toString(" ")); + sb.append("\n\n===\n\n"); + } + if (configRoots.isEmpty()) { + sb.append(" No config roots were detected\n\n"); + } + + sb.append("=======================================================\n"); + sb.append("= Config groups\n"); + sb.append("=======================================================\n\n"); + + for (DiscoveryConfigGroup configGroup : resolvedConfigGroups.values()) { + sb.append("- " + configGroup.getQualifiedName() + "\n"); + sb.append(configGroup.toString(" ")); + sb.append("\n\n===\n\n"); + } + + if (resolvedConfigGroups.isEmpty()) { + sb.append(" No config groups were detected\n\n"); + } + + return sb.toString(); + } +} diff --git a/core/processor/src/main/java/io/quarkus/annotation/processor/documentation/config/scanner/ConfigMappingListener.java b/core/processor/src/main/java/io/quarkus/annotation/processor/documentation/config/scanner/ConfigMappingListener.java new file mode 100644 index 0000000000000..3bb71de100f48 --- /dev/null +++ b/core/processor/src/main/java/io/quarkus/annotation/processor/documentation/config/scanner/ConfigMappingListener.java @@ -0,0 +1,172 @@ +package io.quarkus.annotation.processor.documentation.config.scanner; + +import java.util.Map; +import java.util.Optional; + +import javax.lang.model.element.AnnotationMirror; +import javax.lang.model.element.AnnotationValue; +import javax.lang.model.element.ExecutableElement; +import javax.lang.model.element.TypeElement; + +import io.quarkus.annotation.processor.documentation.config.discovery.DiscoveryConfigProperty; +import io.quarkus.annotation.processor.documentation.config.discovery.DiscoveryConfigRoot; +import io.quarkus.annotation.processor.documentation.config.discovery.DiscoveryRootElement; +import io.quarkus.annotation.processor.documentation.config.discovery.ParsedJavadoc; +import io.quarkus.annotation.processor.documentation.config.discovery.ParsedJavadocSection; +import io.quarkus.annotation.processor.documentation.config.discovery.ResolvedType; +import io.quarkus.annotation.processor.documentation.config.formatter.JavadocToAsciidocTransformer; +import io.quarkus.annotation.processor.documentation.config.model.ConfigPhase; +import io.quarkus.annotation.processor.documentation.config.util.ConfigNamingUtil; +import io.quarkus.annotation.processor.documentation.config.util.Markers; +import io.quarkus.annotation.processor.documentation.config.util.Types; +import io.quarkus.annotation.processor.util.Config; +import io.quarkus.annotation.processor.util.Utils; + +public class ConfigMappingListener extends AbstractConfigListener { + + ConfigMappingListener(Config config, Utils utils, ConfigCollector configCollector) { + super(config, utils, configCollector); + } + + @Override + public Optional onConfigRoot(TypeElement configRoot) { + String prefix = Markers.DEFAULT_PREFIX; + ConfigPhase configPhase = ConfigPhase.BUILD_TIME; + + AnnotationMirror configRootAnnotation = null; + AnnotationMirror configMappingAnnotion = null; + AnnotationMirror configDocFileNameAnnotation = null; + + for (AnnotationMirror annotationMirror : configRoot.getAnnotationMirrors()) { + String annotationName = annotationMirror.getAnnotationType().toString(); + + if (annotationName.equals(Types.ANNOTATION_CONFIG_ROOT)) { + configRootAnnotation = annotationMirror; + continue; + } + if (annotationName.equals(Types.ANNOTATION_CONFIG_MAPPING)) { + configMappingAnnotion = annotationMirror; + continue; + } + if (annotationName.equals(Types.ANNOTATION_CONFIG_DOC_FILE_NAME)) { + configDocFileNameAnnotation = annotationMirror; + continue; + } + } + + if (configRootAnnotation == null || configMappingAnnotion == null) { + throw new IllegalStateException("Either @ConfigRoot or @ConfigMapping is missing on " + configRoot); + } + + final Map elementValues = configRootAnnotation + .getElementValues(); + for (Map.Entry entry : elementValues.entrySet()) { + if ("phase()".equals(entry.getKey().toString())) { + configPhase = ConfigPhase.valueOf(entry.getValue().getValue().toString()); + } + } + + for (Map.Entry entry : configMappingAnnotion.getElementValues() + .entrySet()) { + if ("prefix()".equals(entry.getKey().toString())) { + prefix = entry.getValue().getValue().toString(); + } + } + + String overriddenDocFileName = null; + if (configDocFileNameAnnotation != null) { + for (Map.Entry entry : configDocFileNameAnnotation + .getElementValues() + .entrySet()) { + if ("value()".equals(entry.getKey().toString())) { + overriddenDocFileName = entry.getValue().getValue().toString(); + break; + } + } + } + + String rootPrefix = ConfigNamingUtil.getRootPrefix(prefix, "", configRoot.getSimpleName().toString(), configPhase); + String binaryName = utils.element().getBinaryName(configRoot); + + DiscoveryConfigRoot discoveryConfigRoot = new DiscoveryConfigRoot(config.getExtension(), rootPrefix, + binaryName, configRoot.getQualifiedName().toString(), configPhase, overriddenDocFileName); + configCollector.addConfigRoot(discoveryConfigRoot); + return Optional.of(discoveryConfigRoot); + } + + @Override + public void onUnresolvedInterface(DiscoveryRootElement discoveryRootElement, TypeElement interfaze) { + discoveryRootElement.addUnresolvedInterfaces(interfaze.getQualifiedName().toString()); + } + + @Override + public void onEnclosedMethod(DiscoveryRootElement discoveryRootElement, TypeElement clazz, ExecutableElement method, + ResolvedType resolvedType) { + Map methodAnnotations = utils.element().getAnnotations(method); + + String sourceName = method.getSimpleName().toString(); + DiscoveryConfigProperty.Builder builder = DiscoveryConfigProperty.builder(sourceName, + resolvedType); + + AnnotationMirror deprecatedAnnotation = methodAnnotations.get(Deprecated.class.getName()); + if (deprecatedAnnotation != null) { + builder.deprecated(); + // TODO add more information about the deprecated forRemoval/since/comment + } + + String name = ConfigNamingUtil.hyphenate(sourceName); + AnnotationMirror withNameAnnotation = methodAnnotations.get(Types.ANNOTATION_CONFIG_WITH_NAME); + if (withNameAnnotation != null) { + name = withNameAnnotation.getElementValues().values().iterator().next().getValue().toString(); + } + if (methodAnnotations.containsKey(Types.ANNOTATION_CONFIG_WITH_PARENT_NAME)) { + name = Markers.PARENT; + } + builder.name(name); + + AnnotationMirror withDefaultAnnotation = methodAnnotations.get(Types.ANNOTATION_CONFIG_WITH_DEFAULT); + if (withDefaultAnnotation != null) { + builder.defaultValue(withDefaultAnnotation.getElementValues().values().isEmpty() ? null + : withDefaultAnnotation.getElementValues().values().iterator().next().getValue().toString()); + } + + AnnotationMirror configDocDefaultAnnotation = methodAnnotations.get(Types.ANNOTATION_CONFIG_DOC_DEFAULT); + if (configDocDefaultAnnotation != null) { + builder.defaultValueForDoc( + configDocDefaultAnnotation.getElementValues().values().iterator().next().getValue().toString()); + } + + if (resolvedType.isMap()) { + String mapKey = name; + AnnotationMirror configDocMapKeyAnnotation = methodAnnotations.get(Types.ANNOTATION_CONFIG_DOC_MAP_KEY); + if (configDocMapKeyAnnotation != null) { + mapKey = configDocMapKeyAnnotation.getElementValues().values().iterator().next().getValue().toString(); + } + builder.mapKey(mapKey); + + AnnotationMirror unnamedMapKeyAnnotation = methodAnnotations.get(Types.ANNOTATION_CONFIG_WITH_UNNAMED_KEY); + if (unnamedMapKeyAnnotation != null) { + builder.unnamedMapKey(); + } + } + + if (methodAnnotations.containsKey(Types.ANNOTATION_CONFIG_WITH_CONVERTER)) { + builder.converted(); + } + + String rawJavadoc = utils.element().getRequiredJavadoc(method); + builder.rawJavadoc(rawJavadoc); + + AnnotationMirror configDocSectionAnnotation = methodAnnotations.get(Types.ANNOTATION_CONFIG_DOC_SECTION); + if (configDocSectionAnnotation != null) { + ParsedJavadocSection section = JavadocToAsciidocTransformer.INSTANCE.parseConfigSectionJavadoc(rawJavadoc); + builder.section(section); + } else { + ParsedJavadoc parsedJavadoc = JavadocToAsciidocTransformer.INSTANCE.parseConfigItemJavadoc(rawJavadoc); + builder.description(parsedJavadoc.description()); + builder.since(parsedJavadoc.since()); + } + + discoveryRootElement.addProperty(builder.build()); + } +} diff --git a/core/processor/src/main/java/io/quarkus/annotation/processor/documentation/config/scanner/JavadocConfigMappingListener.java b/core/processor/src/main/java/io/quarkus/annotation/processor/documentation/config/scanner/JavadocConfigMappingListener.java new file mode 100644 index 0000000000000..77d412130f7ff --- /dev/null +++ b/core/processor/src/main/java/io/quarkus/annotation/processor/documentation/config/scanner/JavadocConfigMappingListener.java @@ -0,0 +1,31 @@ +package io.quarkus.annotation.processor.documentation.config.scanner; + +import javax.lang.model.element.ExecutableElement; +import javax.lang.model.element.TypeElement; + +import io.quarkus.annotation.processor.documentation.config.discovery.DiscoveryRootElement; +import io.quarkus.annotation.processor.documentation.config.discovery.ResolvedType; +import io.quarkus.annotation.processor.documentation.config.util.Markers; +import io.quarkus.annotation.processor.util.Config; +import io.quarkus.annotation.processor.util.Utils; + +/** + * This class is responsible for collecting and writing the Javadoc in quarkus-javadoc.properties. + * We want this class to be replaced by the new descriptors that will be generated. + */ +@Deprecated(since = "3.14", forRemoval = true) +public class JavadocConfigMappingListener extends AbstractJavadocConfigListener { + + JavadocConfigMappingListener(Config config, Utils utils, ConfigCollector configCollector) { + super(config, utils, configCollector); + } + + @Override + public void onEnclosedMethod(DiscoveryRootElement discoveryRootElement, TypeElement clazz, ExecutableElement method, + ResolvedType resolvedType) { + String docComment = utils.element().getRequiredJavadoc(method); + configCollector.addJavadocProperty( + clazz.getQualifiedName().toString() + Markers.DOT + method.getSimpleName().toString(), + docComment); + } +} diff --git a/core/processor/src/main/java/io/quarkus/annotation/processor/documentation/config/scanner/JavadocLegacyConfigRootListener.java b/core/processor/src/main/java/io/quarkus/annotation/processor/documentation/config/scanner/JavadocLegacyConfigRootListener.java new file mode 100644 index 0000000000000..68941bed561dc --- /dev/null +++ b/core/processor/src/main/java/io/quarkus/annotation/processor/documentation/config/scanner/JavadocLegacyConfigRootListener.java @@ -0,0 +1,29 @@ +package io.quarkus.annotation.processor.documentation.config.scanner; + +import javax.lang.model.element.TypeElement; +import javax.lang.model.element.VariableElement; + +import io.quarkus.annotation.processor.documentation.config.discovery.DiscoveryRootElement; +import io.quarkus.annotation.processor.documentation.config.discovery.ResolvedType; +import io.quarkus.annotation.processor.documentation.config.util.Markers; +import io.quarkus.annotation.processor.util.Config; +import io.quarkus.annotation.processor.util.Utils; + +/** + * This class is responsible for collecting and writing the Javadoc in quarkus-javadoc.properties. + * We want this class to be replaced by the new descriptors that will be generated. + */ +@Deprecated(since = "3.14", forRemoval = true) +public class JavadocLegacyConfigRootListener extends AbstractJavadocConfigListener { + + JavadocLegacyConfigRootListener(Config config, Utils utils, ConfigCollector configCollector) { + super(config, utils, configCollector); + } + + @Override + public void onEnclosedField(DiscoveryRootElement discoveryRootElement, TypeElement clazz, VariableElement field, + ResolvedType resolvedType) { + configCollector.addJavadocProperty(clazz.getQualifiedName().toString() + Markers.DOT + field.getSimpleName() + .toString(), utils.element().getRequiredJavadoc(field)); + } +} diff --git a/core/processor/src/main/java/io/quarkus/annotation/processor/documentation/config/scanner/LegacyConfigListener.java b/core/processor/src/main/java/io/quarkus/annotation/processor/documentation/config/scanner/LegacyConfigListener.java new file mode 100644 index 0000000000000..bfd309bc9f700 --- /dev/null +++ b/core/processor/src/main/java/io/quarkus/annotation/processor/documentation/config/scanner/LegacyConfigListener.java @@ -0,0 +1,174 @@ +package io.quarkus.annotation.processor.documentation.config.scanner; + +import java.util.Map; +import java.util.Optional; + +import javax.lang.model.element.AnnotationMirror; +import javax.lang.model.element.AnnotationValue; +import javax.lang.model.element.ExecutableElement; +import javax.lang.model.element.TypeElement; +import javax.lang.model.element.VariableElement; + +import io.quarkus.annotation.processor.documentation.config.discovery.DiscoveryConfigProperty; +import io.quarkus.annotation.processor.documentation.config.discovery.DiscoveryConfigRoot; +import io.quarkus.annotation.processor.documentation.config.discovery.DiscoveryRootElement; +import io.quarkus.annotation.processor.documentation.config.discovery.ParsedJavadoc; +import io.quarkus.annotation.processor.documentation.config.discovery.ParsedJavadocSection; +import io.quarkus.annotation.processor.documentation.config.discovery.ResolvedType; +import io.quarkus.annotation.processor.documentation.config.formatter.JavadocToAsciidocTransformer; +import io.quarkus.annotation.processor.documentation.config.model.ConfigPhase; +import io.quarkus.annotation.processor.documentation.config.util.ConfigNamingUtil; +import io.quarkus.annotation.processor.documentation.config.util.Markers; +import io.quarkus.annotation.processor.documentation.config.util.Types; +import io.quarkus.annotation.processor.util.Config; +import io.quarkus.annotation.processor.util.Strings; +import io.quarkus.annotation.processor.util.Utils; + +public class LegacyConfigListener extends AbstractConfigListener { + + LegacyConfigListener(Config config, Utils utils, ConfigCollector configCollector) { + super(config, utils, configCollector); + } + + @Override + public Optional onConfigRoot(TypeElement configRoot) { + String prefix = Markers.DEFAULT_PREFIX; + ConfigPhase configPhase = ConfigPhase.BUILD_TIME; + + AnnotationMirror configRootAnnotation = null; + AnnotationMirror configDocFileNameAnnotation = null; + + for (AnnotationMirror annotationMirror : configRoot.getAnnotationMirrors()) { + String annotationName = annotationMirror.getAnnotationType().toString(); + + if (annotationName.equals(Types.ANNOTATION_CONFIG_ROOT)) { + configRootAnnotation = annotationMirror; + continue; + } + if (annotationName.equals(Types.ANNOTATION_CONFIG_DOC_FILE_NAME)) { + configDocFileNameAnnotation = annotationMirror; + continue; + } + } + + if (configRootAnnotation == null) { + throw new IllegalStateException("@ConfigRoot is missing on " + configRoot); + } + + final Map elementValues = configRootAnnotation + .getElementValues(); + String name = Markers.HYPHENATED_ELEMENT_NAME; + for (Map.Entry entry : elementValues.entrySet()) { + final String key = entry.getKey().toString(); + final String value = entry.getValue().getValue().toString(); + if ("name()".equals(key)) { + name = value; + } else if ("phase()".equals(key)) { + configPhase = ConfigPhase.valueOf(value); + } else if ("prefix()".equals(key)) { + prefix = value; + } + } + + String overriddenDocFileName = null; + if (configDocFileNameAnnotation != null) { + for (Map.Entry entry : configDocFileNameAnnotation + .getElementValues() + .entrySet()) { + if ("value()".equals(entry.getKey().toString())) { + overriddenDocFileName = entry.getValue().getValue().toString(); + break; + } + } + } + + String rootPrefix = ConfigNamingUtil.getRootPrefix(prefix, name, configRoot.getSimpleName().toString(), configPhase); + String binaryName = utils.element().getBinaryName(configRoot); + + DiscoveryConfigRoot discoveryConfigRoot = new DiscoveryConfigRoot(config.getExtension(), rootPrefix, + binaryName, configRoot.getQualifiedName().toString(), + configPhase, overriddenDocFileName); + configCollector.addConfigRoot(discoveryConfigRoot); + return Optional.of(discoveryConfigRoot); + } + + @Override + public void onUnresolvedSuperclass(DiscoveryRootElement discoveryRootElement, TypeElement superclass) { + discoveryRootElement.setUnresolvedSuperclass(superclass.getQualifiedName().toString()); + } + + @Override + public void onEnclosedField(DiscoveryRootElement discoveryRootElement, TypeElement clazz, VariableElement field, + ResolvedType resolvedType) { + Map fieldAnnotations = utils.element().getAnnotations(field); + + String sourceName = field.getSimpleName().toString(); + String name = ConfigNamingUtil.hyphenate(sourceName); + + DiscoveryConfigProperty.Builder builder = DiscoveryConfigProperty.builder(sourceName, + resolvedType); + + AnnotationMirror deprecatedAnnotation = fieldAnnotations.get(Deprecated.class.getName()); + if (deprecatedAnnotation != null) { + builder.deprecated(); + // TODO add more information about the deprecated forRemoval/since/comment + } + + AnnotationMirror configItemAnnotation = fieldAnnotations.get(Types.ANNOTATION_CONFIG_ITEM); + if (configItemAnnotation != null) { + Map configItemValues = utils.element().getAnnotationValues(configItemAnnotation); + + String configItemName = (String) configItemValues.get("name"); + if (configItemName != null && !Markers.HYPHENATED_ELEMENT_NAME.equals(configItemName)) { + name = configItemName; + } + + String configItemDefaultValue = (String) configItemValues.get("defaultValue"); + if (configItemDefaultValue != null && !Markers.NO_DEFAULT.equals(configItemDefaultValue)) { + builder.defaultValue(configItemDefaultValue); + } + + String configItemDefaultValueForDoc = (String) configItemValues.get("defaultValueDocumentation"); + if (!Strings.isEmpty(configItemDefaultValueForDoc)) { + builder.defaultValueForDoc(configItemDefaultValueForDoc); + } else { + // while ConfigDocDefault was added for ConfigMappings, it's allowed on fields so let's be safe + AnnotationMirror configDocDefaultAnnotation = fieldAnnotations.get(Types.ANNOTATION_CONFIG_DOC_DEFAULT); + if (configDocDefaultAnnotation != null) { + builder.defaultValueForDoc( + configDocDefaultAnnotation.getElementValues().values().iterator().next().getValue().toString()); + } + } + } + builder.name(name); + + if (resolvedType.isMap()) { + String mapKey = name; + AnnotationMirror configDocMapKeyAnnotation = fieldAnnotations.get(Types.ANNOTATION_CONFIG_DOC_MAP_KEY); + if (configDocMapKeyAnnotation != null) { + mapKey = configDocMapKeyAnnotation.getElementValues().values().iterator().next().getValue().toString(); + } + builder.mapKey(mapKey); + } + + if (fieldAnnotations.containsKey(Types.ANNOTATION_DEFAULT_CONVERTER) || + fieldAnnotations.containsKey(Types.ANNOTATION_CONVERT_WITH)) { + builder.converted(); + } + + String rawJavadoc = utils.element().getRequiredJavadoc(field); + builder.rawJavadoc(rawJavadoc); + + AnnotationMirror configDocSectionAnnotation = fieldAnnotations.get(Types.ANNOTATION_CONFIG_DOC_SECTION); + if (configDocSectionAnnotation != null) { + ParsedJavadocSection section = JavadocToAsciidocTransformer.INSTANCE.parseConfigSectionJavadoc(rawJavadoc); + builder.section(section); + } else { + ParsedJavadoc parsedJavadoc = JavadocToAsciidocTransformer.INSTANCE.parseConfigItemJavadoc(rawJavadoc); + builder.description(parsedJavadoc.description()); + builder.since(parsedJavadoc.since()); + } + + discoveryRootElement.addProperty(builder.build()); + } +} diff --git a/core/processor/src/main/java/io/quarkus/annotation/processor/documentation/config/util/ConfigNamingUtil.java b/core/processor/src/main/java/io/quarkus/annotation/processor/documentation/config/util/ConfigNamingUtil.java new file mode 100644 index 0000000000000..1cb8a1090b6a9 --- /dev/null +++ b/core/processor/src/main/java/io/quarkus/annotation/processor/documentation/config/util/ConfigNamingUtil.java @@ -0,0 +1,219 @@ +package io.quarkus.annotation.processor.documentation.config.util; + +import java.util.Iterator; +import java.util.Locale; +import java.util.NoSuchElementException; +import java.util.regex.Matcher; +import java.util.regex.Pattern; + +import io.quarkus.annotation.processor.documentation.config.model.ConfigPhase; + +public final class ConfigNamingUtil { + + private static final String CONFIG = "Config"; + private static final String CONFIGURATION = "Configuration"; + private static final String HYPHEN = "-"; + private static final Pattern ENUM_SEPARATOR_PATTERN = Pattern.compile("([-_]+)"); + private static final String NAMED_MAP_CONFIG_ITEM_FORMAT = ".\"%s\""; + + private ConfigNamingUtil() { + } + + public static String getRootPrefix(String prefix, String name, String simpleClassName, ConfigPhase configPhase) { + String rootPrefix; + + if (name.equals(Markers.HYPHENATED_ELEMENT_NAME)) { + rootPrefix = deriveConfigRootName(simpleClassName, prefix, configPhase); + } else if (!prefix.isEmpty()) { + if (!name.isEmpty()) { + rootPrefix = prefix + Markers.DOT + name; + } else { + rootPrefix = prefix; + } + } else { + rootPrefix = name; + } + + if (rootPrefix.endsWith(Markers.DOT + Markers.PARENT)) { + // take into account the root case which would contain characters that can't be used to create the final file + rootPrefix = rootPrefix.replace(Markers.DOT + Markers.PARENT, ""); + } + + return rootPrefix; + } + + private static String deriveConfigRootName(String simpleClassName, String prefix, ConfigPhase configPhase) { + String simpleNameInLowerCase = simpleClassName.toLowerCase(); + int length = simpleNameInLowerCase.length(); + + if (simpleNameInLowerCase.endsWith(CONFIG.toLowerCase())) { + String sanitized = simpleClassName.substring(0, length - CONFIG.length()); + return deriveConfigRootName(sanitized, prefix, configPhase); + } else if (simpleNameInLowerCase.endsWith(CONFIGURATION.toLowerCase())) { + String sanitized = simpleClassName.substring(0, length - CONFIGURATION.length()); + return deriveConfigRootName(sanitized, prefix, configPhase); + } else if (simpleNameInLowerCase.endsWith(configPhase.getConfigSuffix().toLowerCase())) { + String sanitized = simpleClassName.substring(0, length - configPhase.getConfigSuffix().length()); + return deriveConfigRootName(sanitized, prefix, configPhase); + } + + return !prefix.isEmpty() ? prefix + Markers.DOT + ConfigNamingUtil.hyphenate(simpleClassName) + : Markers.DEFAULT_PREFIX + Markers.DOT + ConfigNamingUtil.hyphenate(simpleClassName); + } + + public static Iterator camelHumpsIterator(String str) { + return new Iterator() { + int idx; + + @Override + public boolean hasNext() { + return idx < str.length(); + } + + @Override + public String next() { + if (idx == str.length()) + throw new NoSuchElementException(); + // known mixed-case rule-breakers + if (str.startsWith("JBoss", idx)) { + idx += 5; + return "JBoss"; + } + final int start = idx; + int c = str.codePointAt(idx); + if (Character.isUpperCase(c)) { + // an uppercase-starting word + idx = str.offsetByCodePoints(idx, 1); + if (idx < str.length()) { + c = str.codePointAt(idx); + if (Character.isUpperCase(c)) { + // all-caps word; need one look-ahead + int nextIdx = str.offsetByCodePoints(idx, 1); + while (nextIdx < str.length()) { + c = str.codePointAt(nextIdx); + if (Character.isLowerCase(c)) { + // ended at idx + return str.substring(start, idx); + } + idx = nextIdx; + nextIdx = str.offsetByCodePoints(idx, 1); + } + // consumed the whole remainder, update idx to length + idx = str.length(); + return str.substring(start); + } else { + // initial caps, trailing lowercase + idx = str.offsetByCodePoints(idx, 1); + while (idx < str.length()) { + c = str.codePointAt(idx); + if (Character.isUpperCase(c)) { + // end + return str.substring(start, idx); + } + idx = str.offsetByCodePoints(idx, 1); + } + // consumed the whole remainder + return str.substring(start); + } + } else { + // one-letter word + return str.substring(start); + } + } else { + // a lowercase-starting word + idx = str.offsetByCodePoints(idx, 1); + while (idx < str.length()) { + c = str.codePointAt(idx); + if (Character.isUpperCase(c)) { + // end + return str.substring(start, idx); + } + idx = str.offsetByCodePoints(idx, 1); + } + // consumed the whole remainder + return str.substring(start); + } + } + }; + } + + static Iterator lowerCase(Iterator orig) { + return new Iterator() { + @Override + public boolean hasNext() { + return orig.hasNext(); + } + + @Override + public String next() { + return orig.next().toLowerCase(Locale.ROOT); + } + }; + } + + static String join(Iterator it) { + final StringBuilder b = new StringBuilder(); + if (it.hasNext()) { + b.append(it.next()); + while (it.hasNext()) { + b.append("-"); + b.append(it.next()); + } + } + return b.toString(); + } + + public static String hyphenate(String orig) { + return join(lowerCase(camelHumpsIterator(orig))); + } + + /** + * This needs to be consistent with io.quarkus.runtime.configuration.HyphenateEnumConverter. + */ + public static String hyphenateEnumValue(String orig) { + StringBuffer target = new StringBuffer(); + String hyphenate = hyphenate(orig); + Matcher matcher = ENUM_SEPARATOR_PATTERN.matcher(hyphenate); + while (matcher.find()) { + matcher.appendReplacement(target, HYPHEN); + } + matcher.appendTail(target); + return target.toString(); + } + + static String normalizeDurationValue(String value) { + if (!value.isEmpty() && Character.isDigit(value.charAt(value.length() - 1))) { + try { + value = Integer.parseInt(value) + "S"; + } catch (NumberFormatException ignore) { + } + } + value = value.toUpperCase(Locale.ROOT); + return value; + } + + /** + * Replace each character that is neither alphanumeric nor _ with _ then convert the name to upper case, e.g. + * quarkus.datasource.jdbc.initial-size -> QUARKUS_DATASOURCE_JDBC_INITIAL_SIZE + * See also: io.smallrye.config.common.utils.StringUtil#replaceNonAlphanumericByUnderscores(java.lang.String) + */ + public static String toEnvVarName(final String name) { + int length = name.length(); + StringBuilder sb = new StringBuilder(length); + for (int i = 0; i < length; i++) { + char c = name.charAt(i); + if ('a' <= c && c <= 'z' || + 'A' <= c && c <= 'Z' || + '0' <= c && c <= '9') { + sb.append(c); + } else { + sb.append('_'); + } + } + return sb.toString().toUpperCase(); + } + + public static String getMapKey(String mapKey) { + return String.format(NAMED_MAP_CONFIG_ITEM_FORMAT, mapKey); + } +} diff --git a/core/processor/src/main/java/io/quarkus/annotation/processor/documentation/config/util/JavadocUtil.java b/core/processor/src/main/java/io/quarkus/annotation/processor/documentation/config/util/JavadocUtil.java new file mode 100644 index 0000000000000..242094b306aaf --- /dev/null +++ b/core/processor/src/main/java/io/quarkus/annotation/processor/documentation/config/util/JavadocUtil.java @@ -0,0 +1,84 @@ +package io.quarkus.annotation.processor.documentation.config.util; + +import java.util.HashMap; +import java.util.Map; +import java.util.logging.Level; +import java.util.regex.Matcher; +import java.util.regex.Pattern; + +import javax.annotation.processing.ProcessingEnvironment; + +public final class JavadocUtil { + + private static final String VERTX_JAVA_DOC_SITE = "https://vertx.io/docs/apidocs/"; + private static final String OFFICIAL_JAVA_DOC_BASE_LINK = "https://docs.oracle.com/en/java/javase/17/docs/api/"; + private static final String AGROAL_API_JAVA_DOC_SITE = "https://javadoc.io/doc/io.agroal/agroal-api/latest/"; + private static final String LOG_LEVEL_REDIRECT_URL = "https://javadoc.io/doc/org.jboss.logmanager/jboss-logmanager/latest/org/jboss/logmanager/Level.html"; + + private static final Pattern PACKAGE_PATTERN = Pattern.compile("^(\\w+)\\.(\\w+)\\..*$"); + + private static final Map EXTENSION_JAVA_DOC_LINK = new HashMap<>(); + + static { + EXTENSION_JAVA_DOC_LINK.put("io.vertx.", VERTX_JAVA_DOC_SITE); + EXTENSION_JAVA_DOC_LINK.put("io.agroal.", AGROAL_API_JAVA_DOC_SITE); + } + + private JavadocUtil(ProcessingEnvironment processingEnv) { + } + + /** + * Get javadoc link of a given type value + */ + public static String getJavadocSiteLink(String binaryName) { + if (binaryName.equals(Level.class.getName())) { + //hack, we don't want to link to the JUL version, but the jboss logging version + //this seems like a one off use case so for now it is just hacked in here + //if there are other use cases we should do something more generic + return LOG_LEVEL_REDIRECT_URL; + } + Matcher packageMatcher = PACKAGE_PATTERN.matcher(binaryName); + + if (!packageMatcher.find()) { + return null; + } + + if (TypeUtil.isPrimitiveWrapper(binaryName)) { + return null; + } + + if ("java".equals(packageMatcher.group(1))) { + return OFFICIAL_JAVA_DOC_BASE_LINK + getJavaDocLinkForType(binaryName); + } + + String basePkgName = packageMatcher.group(1) + "." + packageMatcher.group(2) + "."; + String javaDocBaseUrl = EXTENSION_JAVA_DOC_LINK.get(basePkgName); + + if (javaDocBaseUrl != null) { + return javaDocBaseUrl + getJavaDocLinkForType(binaryName); + } + + return null; + } + + private static String getJavaDocLinkForType(String type) { + int beginOfWrappedTypeIndex = type.indexOf("<"); + if (beginOfWrappedTypeIndex != -1) { + type = type.substring(0, beginOfWrappedTypeIndex); + } + + int indexOfFirstUpperCase = 0; + for (int index = 0; index < type.length(); index++) { + char charAt = type.charAt(index); + if (charAt >= 'A' && charAt <= 'Z') { + indexOfFirstUpperCase = index; + break; + } + } + + final String base = type.substring(0, indexOfFirstUpperCase).replace('.', '/'); + final String html = type.substring(indexOfFirstUpperCase).replace('$', '.') + ".html"; + + return base + html; + } +} diff --git a/core/processor/src/main/java/io/quarkus/annotation/processor/documentation/config/util/Markers.java b/core/processor/src/main/java/io/quarkus/annotation/processor/documentation/config/util/Markers.java new file mode 100644 index 0000000000000..a0ba6ac8854e4 --- /dev/null +++ b/core/processor/src/main/java/io/quarkus/annotation/processor/documentation/config/util/Markers.java @@ -0,0 +1,15 @@ +package io.quarkus.annotation.processor.documentation.config.util; + +public final class Markers { + + private Markers() { + } + + public static final String DEFAULT_PREFIX = "quarkus"; + public static final String PARENT = "<>"; + public static final String NO_DEFAULT = "<>"; + public static final String HYPHENATED_ELEMENT_NAME = "<>"; + public static final String DOT = "."; + public static final String DASH = "-"; + public static final String COMMA = ","; +} diff --git a/core/processor/src/main/java/io/quarkus/annotation/processor/documentation/config/util/TypeUtil.java b/core/processor/src/main/java/io/quarkus/annotation/processor/documentation/config/util/TypeUtil.java new file mode 100644 index 0000000000000..01c5e09441731 --- /dev/null +++ b/core/processor/src/main/java/io/quarkus/annotation/processor/documentation/config/util/TypeUtil.java @@ -0,0 +1,40 @@ +package io.quarkus.annotation.processor.documentation.config.util; + +import java.util.Locale; + +public final class TypeUtil { + + /* + * Retrieve a default value of a primitive type. + * + */ + public static String getPrimitiveDefaultValue(String primitiveType) { + return Types.PRIMITIVE_DEFAULT_VALUES.get(primitiveType); + } + + /** + * Replaces Java primitive wrapper types with primitive types + */ + public static String unbox(String type) { + String mapping = Types.PRIMITIVE_WRAPPERS.get(type); + return mapping == null ? type : mapping; + } + + public static boolean isPrimitiveWrapper(String type) { + return Types.PRIMITIVE_WRAPPERS.containsKey(type); + } + + public static String getAlias(String qualifiedName) { + return Types.ALIASED_TYPES.get(qualifiedName); + } + + public static String normalizeDurationValue(String value) { + if (!value.isEmpty() && Character.isDigit(value.charAt(value.length() - 1))) { + try { + value = Integer.parseInt(value) + "S"; + } catch (NumberFormatException ignore) { + } + } + return value.toUpperCase(Locale.ROOT); + } +} diff --git a/core/processor/src/main/java/io/quarkus/annotation/processor/documentation/config/util/Types.java b/core/processor/src/main/java/io/quarkus/annotation/processor/documentation/config/util/Types.java new file mode 100644 index 0000000000000..d0c44f4605fb1 --- /dev/null +++ b/core/processor/src/main/java/io/quarkus/annotation/processor/documentation/config/util/Types.java @@ -0,0 +1,75 @@ +package io.quarkus.annotation.processor.documentation.config.util; + +import java.nio.file.Path; +import java.util.HashMap; +import java.util.Map; +import java.util.OptionalDouble; +import java.util.OptionalInt; +import java.util.OptionalLong; +import java.util.Set; + +public final class Types { + + private Types() { + } + + public static final String ANNOTATION_RECORDER = "io.quarkus.runtime.annotations.Recorder"; + public static final String ANNOTATION_RECORD = "io.quarkus.deployment.annotations.Record"; + + public static final String MEMORY_SIZE_TYPE = "io.quarkus.runtime.configuration.MemorySize"; + public static final String ANNOTATION_CONFIG_ITEM = "io.quarkus.runtime.annotations.ConfigItem"; + public static final String ANNOTATION_BUILD_STEP = "io.quarkus.deployment.annotations.BuildStep"; + public static final String ANNOTATION_CONFIG_ROOT = "io.quarkus.runtime.annotations.ConfigRoot"; + public static final String ANNOTATION_CONFIG_MAPPING = "io.smallrye.config.ConfigMapping"; + public static final String ANNOTATION_DEFAULT_CONVERTER = "io.quarkus.runtime.annotations.DefaultConverter"; + public static final String ANNOTATION_CONVERT_WITH = "io.quarkus.runtime.annotations.ConvertWith"; + public static final String ANNOTATION_CONFIG_GROUP = "io.quarkus.runtime.annotations.ConfigGroup"; + public static final String ANNOTATION_CONFIG_DOC_IGNORE = "io.quarkus.runtime.annotations.ConfigDocIgnore"; + public static final String ANNOTATION_CONFIG_DOC_MAP_KEY = "io.quarkus.runtime.annotations.ConfigDocMapKey"; + public static final String ANNOTATION_CONFIG_DOC_SECTION = "io.quarkus.runtime.annotations.ConfigDocSection"; + public static final String ANNOTATION_CONFIG_DOC_ENUM_VALUE = "io.quarkus.runtime.annotations.ConfigDocEnumValue"; + public static final String ANNOTATION_CONFIG_DOC_DEFAULT = "io.quarkus.runtime.annotations.ConfigDocDefault"; + public static final String ANNOTATION_CONFIG_DOC_FILE_NAME = "io.quarkus.runtime.annotations.ConfigDocFilename"; + + public static final String ANNOTATION_CONFIG_WITH_CONVERTER = "io.smallrye.config.WithConverter"; + public static final String ANNOTATION_CONFIG_WITH_NAME = "io.smallrye.config.WithName"; + public static final String ANNOTATION_CONFIG_WITH_PARENT_NAME = "io.smallrye.config.WithParentName"; + public static final String ANNOTATION_CONFIG_WITH_DEFAULT = "io.smallrye.config.WithDefault"; + public static final String ANNOTATION_CONFIG_WITH_UNNAMED_KEY = "io.smallrye.config.WithUnnamedKey"; + + public static final Set SUPPORTED_ANNOTATIONS_TYPES = Set.of(ANNOTATION_BUILD_STEP, ANNOTATION_CONFIG_GROUP, + ANNOTATION_CONFIG_ROOT, ANNOTATION_RECORDER, ANNOTATION_CONFIG_MAPPING); + + static final Map ALIASED_TYPES = Map.of( + OptionalLong.class.getName(), Long.class.getName(), + OptionalInt.class.getName(), Integer.class.getName(), + OptionalDouble.class.getName(), Double.class.getName(), + "java.lang.Class", "class name", + "java.net.InetSocketAddress", "host:port", + Path.class.getName(), "path", + String.class.getName(), "string"); + + static final Map PRIMITIVE_DEFAULT_VALUES = new HashMap<>(); + + static final Map PRIMITIVE_WRAPPERS = new HashMap<>(); + + static { + PRIMITIVE_DEFAULT_VALUES.put("int", "0"); + PRIMITIVE_DEFAULT_VALUES.put("byte", "0"); + PRIMITIVE_DEFAULT_VALUES.put("char", ""); + PRIMITIVE_DEFAULT_VALUES.put("short", "0"); + PRIMITIVE_DEFAULT_VALUES.put("long", "0l"); + PRIMITIVE_DEFAULT_VALUES.put("float", "0f"); + PRIMITIVE_DEFAULT_VALUES.put("double", "0d"); + PRIMITIVE_DEFAULT_VALUES.put("boolean", "false"); + + PRIMITIVE_WRAPPERS.put("java.lang.Character", "char"); + PRIMITIVE_WRAPPERS.put("java.lang.Boolean", "boolean"); + PRIMITIVE_WRAPPERS.put("java.lang.Byte", "byte"); + PRIMITIVE_WRAPPERS.put("java.lang.Short", "short"); + PRIMITIVE_WRAPPERS.put("java.lang.Integer", "int"); + PRIMITIVE_WRAPPERS.put("java.lang.Long", "long"); + PRIMITIVE_WRAPPERS.put("java.lang.Float", "float"); + PRIMITIVE_WRAPPERS.put("java.lang.Double", "double"); + } +} diff --git a/core/processor/src/main/java/io/quarkus/annotation/processor/extension/ExtensionBuildProcessor.java b/core/processor/src/main/java/io/quarkus/annotation/processor/extension/ExtensionBuildProcessor.java new file mode 100644 index 0000000000000..e96fcf44b3034 --- /dev/null +++ b/core/processor/src/main/java/io/quarkus/annotation/processor/extension/ExtensionBuildProcessor.java @@ -0,0 +1,192 @@ +package io.quarkus.annotation.processor.extension; + +import static javax.lang.model.util.ElementFilter.methodsIn; +import static javax.lang.model.util.ElementFilter.typesIn; + +import java.util.HashSet; +import java.util.Map; +import java.util.Set; +import java.util.concurrent.ConcurrentHashMap; + +import javax.annotation.processing.RoundEnvironment; +import javax.lang.model.element.Element; +import javax.lang.model.element.ElementKind; +import javax.lang.model.element.ExecutableElement; +import javax.lang.model.element.Modifier; +import javax.lang.model.element.PackageElement; +import javax.lang.model.element.TypeElement; +import javax.lang.model.element.VariableElement; +import javax.tools.Diagnostic; + +import io.quarkus.annotation.processor.ExtensionProcessor; +import io.quarkus.annotation.processor.Outputs; +import io.quarkus.annotation.processor.documentation.config.util.Types; +import io.quarkus.annotation.processor.generate_doc.Constants; +import io.quarkus.annotation.processor.util.Config; +import io.quarkus.annotation.processor.util.Utils; + +public class ExtensionBuildProcessor implements ExtensionProcessor { + + private Config config; + private Utils utils; + + private final Set processorClassNames = new HashSet<>(); + private final Set recorderClassNames = new HashSet<>(); + private final Set configRootClassNames = new HashSet<>(); + private final Set buildSteps = new HashSet<>(); + private final Map annotationUsageTracker = new ConcurrentHashMap<>(); + + @Override + public void init(Config config, Utils utils) { + this.config = config; + this.utils = utils; + } + + @Override + public void process(Set annotations, RoundEnvironment roundEnv) { + for (TypeElement annotation : annotations) { + switch (annotation.getQualifiedName().toString()) { + case Types.ANNOTATION_BUILD_STEP: + trackAnnotationUsed(Types.ANNOTATION_BUILD_STEP); + processBuildStep(roundEnv, annotation); + break; + case Types.ANNOTATION_RECORDER: + trackAnnotationUsed(Constants.ANNOTATION_RECORDER); + processRecorder(roundEnv, annotation); + break; + case Types.ANNOTATION_CONFIG_ROOT: + trackAnnotationUsed(Constants.ANNOTATION_CONFIG_ROOT); + processConfigRoot(roundEnv, annotation); + break; + case Types.ANNOTATION_CONFIG_GROUP: + trackAnnotationUsed(Constants.ANNOTATION_CONFIG_GROUP); + processConfigGroup(roundEnv, annotation); + break; + } + } + } + + @Override + public void finalizeProcessing() { + validateAnnotationUsage(); + + utils.filer().write(Outputs.META_INF_QUARKUS_BUILD_STEPS, buildSteps); + utils.filer().write(Outputs.META_INF_QUARKUS_CONFIG_ROOTS, configRootClassNames); + } + + private void processBuildStep(RoundEnvironment roundEnv, TypeElement annotation) { + for (ExecutableElement buildStep : methodsIn(roundEnv.getElementsAnnotatedWith(annotation))) { + final TypeElement clazz = utils.element().getClassOf(buildStep); + if (clazz == null) { + continue; + } + + final PackageElement pkg = utils.element().getPackageOf(clazz); + if (pkg == null) { + utils.processingEnv().getMessager().printMessage(Diagnostic.Kind.ERROR, + "Element " + clazz + " has no enclosing package"); + continue; + } + + final String binaryName = utils.element().getBinaryName(clazz); + if (processorClassNames.add(binaryName)) { + validateRecordBuildSteps(clazz); + utils.accessorGenerator().generateAccessor(clazz); + buildSteps.add(binaryName); + } + } + } + + private void validateRecordBuildSteps(TypeElement clazz) { + for (Element e : clazz.getEnclosedElements()) { + if (e.getKind() != ElementKind.METHOD) { + continue; + } + ExecutableElement ex = (ExecutableElement) e; + if (!utils.element().isAnnotationPresent(ex, Constants.ANNOTATION_BUILD_STEP)) { + continue; + } + if (!utils.element().isAnnotationPresent(ex, Constants.ANNOTATION_RECORD)) { + continue; + } + + boolean hasRecorder = false; + boolean allTypesResolvable = true; + for (VariableElement parameter : ex.getParameters()) { + String parameterClassName = parameter.asType().toString(); + TypeElement parameterTypeElement = utils.processingEnv().getElementUtils().getTypeElement(parameterClassName); + if (parameterTypeElement == null) { + allTypesResolvable = false; + } else { + if (utils.element().isAnnotationPresent(parameterTypeElement, Constants.ANNOTATION_RECORDER)) { + if (parameterTypeElement.getModifiers().contains(Modifier.FINAL)) { + utils.processingEnv().getMessager().printMessage(Diagnostic.Kind.ERROR, + "Class '" + parameterTypeElement.getQualifiedName() + + "' is annotated with @Recorder and therefore cannot be made as a final class."); + } else if (utils.element().getPackageName(clazz) + .equals(utils.element().getPackageName(parameterTypeElement))) { + utils.processingEnv().getMessager().printMessage(Diagnostic.Kind.WARNING, + "Build step class '" + clazz.getQualifiedName() + + "' and recorder '" + parameterTypeElement + + "' share the same package. This is highly discouraged as it can lead to unexpected results."); + } + hasRecorder = true; + break; + } + } + } + + if (!hasRecorder && allTypesResolvable) { + utils.processingEnv().getMessager().printMessage(Diagnostic.Kind.ERROR, "Build Step '" + + clazz.getQualifiedName() + "#" + + ex.getSimpleName() + + "' which is annotated with '@Record' does not contain a method parameter whose type is annotated with '@Recorder'."); + } + } + } + + private void processRecorder(RoundEnvironment roundEnv, TypeElement annotation) { + for (TypeElement recorder : typesIn(roundEnv.getElementsAnnotatedWith(annotation))) { + if (recorderClassNames.add(recorder.getQualifiedName().toString())) { + utils.accessorGenerator().generateAccessor(recorder); + } + } + } + + private void processConfigRoot(RoundEnvironment roundEnv, TypeElement annotation) { + for (TypeElement configRoot : typesIn(roundEnv.getElementsAnnotatedWith(annotation))) { + configRootClassNames.add(utils.element().getBinaryName(configRoot)); + + // TODO ideally we would use config.useConfigMapping() but core is currently a mess + // so using the annotations instead + if (!utils.element().isAnnotationPresent(configRoot, Types.ANNOTATION_CONFIG_MAPPING)) { + utils.accessorGenerator().generateAccessor(configRoot); + } + } + } + + private void processConfigGroup(RoundEnvironment roundEnv, TypeElement annotation) { + for (TypeElement configGroup : typesIn(roundEnv.getElementsAnnotatedWith(annotation))) { + // TODO for config groups, we generate an accessor only if we don't use @ConfigMapping + // and for core which is still a mess + if (!config.useConfigMapping() || "quarkus-core".equals(config.getExtension().artifactId())) { + utils.accessorGenerator().generateAccessor(configGroup); + } + } + } + + private void validateAnnotationUsage() { + if (isAnnotationUsed(Constants.ANNOTATION_BUILD_STEP) && isAnnotationUsed(Constants.ANNOTATION_RECORDER)) { + utils.processingEnv().getMessager().printMessage(Diagnostic.Kind.ERROR, + "Detected use of @Recorder annotation in 'deployment' module. Classes annotated with @Recorder must be part of the extension's 'runtime' module"); + } + } + + private boolean isAnnotationUsed(String annotation) { + return annotationUsageTracker.getOrDefault(annotation, false); + } + + private void trackAnnotationUsed(String annotation) { + annotationUsageTracker.put(annotation, true); + } +} diff --git a/core/processor/src/main/java/io/quarkus/annotation/processor/generate_doc/ConfigDocBuilder.java b/core/processor/src/main/java/io/quarkus/annotation/processor/generate_doc/ConfigDocBuilder.java index 57edebb518529..60e8eeddb6ba9 100644 --- a/core/processor/src/main/java/io/quarkus/annotation/processor/generate_doc/ConfigDocBuilder.java +++ b/core/processor/src/main/java/io/quarkus/annotation/processor/generate_doc/ConfigDocBuilder.java @@ -1,13 +1,11 @@ package io.quarkus.annotation.processor.generate_doc; -import static io.quarkus.annotation.processor.Constants.SUMMARY_TABLE_ID_VARIABLE; +import static io.quarkus.annotation.processor.generate_doc.Constants.SUMMARY_TABLE_ID_VARIABLE; import static java.util.Objects.requireNonNull; import java.util.ArrayList; import java.util.List; -import io.quarkus.annotation.processor.Constants; - /** * {@link ConfigDoc} builder */ diff --git a/core/processor/src/main/java/io/quarkus/annotation/processor/generate_doc/ConfigDocGeneratedOutput.java b/core/processor/src/main/java/io/quarkus/annotation/processor/generate_doc/ConfigDocGeneratedOutput.java index 95715a245e897..215b15f6c53e0 100644 --- a/core/processor/src/main/java/io/quarkus/annotation/processor/generate_doc/ConfigDocGeneratedOutput.java +++ b/core/processor/src/main/java/io/quarkus/annotation/processor/generate_doc/ConfigDocGeneratedOutput.java @@ -3,8 +3,6 @@ import java.util.List; import java.util.Objects; -import io.quarkus.annotation.processor.Constants; - public class ConfigDocGeneratedOutput { private final String fileName; private final boolean searchable; diff --git a/core/processor/src/main/java/io/quarkus/annotation/processor/generate_doc/ConfigDocItemFinder.java b/core/processor/src/main/java/io/quarkus/annotation/processor/generate_doc/ConfigDocItemFinder.java index 4070bd79b0273..e12797fc59e6d 100644 --- a/core/processor/src/main/java/io/quarkus/annotation/processor/generate_doc/ConfigDocItemFinder.java +++ b/core/processor/src/main/java/io/quarkus/annotation/processor/generate_doc/ConfigDocItemFinder.java @@ -1,25 +1,25 @@ package io.quarkus.annotation.processor.generate_doc; -import static io.quarkus.annotation.processor.Constants.ANNOTATION_CONFIG_DOC_DEFAULT; -import static io.quarkus.annotation.processor.Constants.ANNOTATION_CONFIG_DOC_ENUM_VALUE; -import static io.quarkus.annotation.processor.Constants.ANNOTATION_CONFIG_DOC_IGNORE; -import static io.quarkus.annotation.processor.Constants.ANNOTATION_CONFIG_DOC_MAP_KEY; -import static io.quarkus.annotation.processor.Constants.ANNOTATION_CONFIG_DOC_SECTION; -import static io.quarkus.annotation.processor.Constants.ANNOTATION_CONFIG_ITEM; -import static io.quarkus.annotation.processor.Constants.ANNOTATION_CONFIG_WITH_DEFAULT; -import static io.quarkus.annotation.processor.Constants.ANNOTATION_CONFIG_WITH_NAME; -import static io.quarkus.annotation.processor.Constants.ANNOTATION_CONFIG_WITH_PARENT_NAME; -import static io.quarkus.annotation.processor.Constants.ANNOTATION_CONFIG_WITH_UNNAMED_KEY; -import static io.quarkus.annotation.processor.Constants.ANNOTATION_CONVERT_WITH; -import static io.quarkus.annotation.processor.Constants.ANNOTATION_DEFAULT_CONVERTER; -import static io.quarkus.annotation.processor.Constants.DOT; -import static io.quarkus.annotation.processor.Constants.EMPTY; -import static io.quarkus.annotation.processor.Constants.HYPHENATED_ELEMENT_NAME; -import static io.quarkus.annotation.processor.Constants.LIST_OF_CONFIG_ITEMS_TYPE_REF; -import static io.quarkus.annotation.processor.Constants.NEW_LINE; -import static io.quarkus.annotation.processor.Constants.NO_DEFAULT; -import static io.quarkus.annotation.processor.Constants.OBJECT_MAPPER; -import static io.quarkus.annotation.processor.Constants.PARENT; +import static io.quarkus.annotation.processor.generate_doc.Constants.ANNOTATION_CONFIG_DOC_DEFAULT; +import static io.quarkus.annotation.processor.generate_doc.Constants.ANNOTATION_CONFIG_DOC_ENUM_VALUE; +import static io.quarkus.annotation.processor.generate_doc.Constants.ANNOTATION_CONFIG_DOC_IGNORE; +import static io.quarkus.annotation.processor.generate_doc.Constants.ANNOTATION_CONFIG_DOC_MAP_KEY; +import static io.quarkus.annotation.processor.generate_doc.Constants.ANNOTATION_CONFIG_DOC_SECTION; +import static io.quarkus.annotation.processor.generate_doc.Constants.ANNOTATION_CONFIG_ITEM; +import static io.quarkus.annotation.processor.generate_doc.Constants.ANNOTATION_CONFIG_WITH_DEFAULT; +import static io.quarkus.annotation.processor.generate_doc.Constants.ANNOTATION_CONFIG_WITH_NAME; +import static io.quarkus.annotation.processor.generate_doc.Constants.ANNOTATION_CONFIG_WITH_PARENT_NAME; +import static io.quarkus.annotation.processor.generate_doc.Constants.ANNOTATION_CONFIG_WITH_UNNAMED_KEY; +import static io.quarkus.annotation.processor.generate_doc.Constants.ANNOTATION_CONVERT_WITH; +import static io.quarkus.annotation.processor.generate_doc.Constants.ANNOTATION_DEFAULT_CONVERTER; +import static io.quarkus.annotation.processor.generate_doc.Constants.DOT; +import static io.quarkus.annotation.processor.generate_doc.Constants.EMPTY; +import static io.quarkus.annotation.processor.generate_doc.Constants.HYPHENATED_ELEMENT_NAME; +import static io.quarkus.annotation.processor.generate_doc.Constants.LIST_OF_CONFIG_ITEMS_TYPE_REF; +import static io.quarkus.annotation.processor.generate_doc.Constants.NEW_LINE; +import static io.quarkus.annotation.processor.generate_doc.Constants.NO_DEFAULT; +import static io.quarkus.annotation.processor.generate_doc.Constants.OBJECT_MAPPER; +import static io.quarkus.annotation.processor.generate_doc.Constants.PARENT; import static io.quarkus.annotation.processor.generate_doc.DocGeneratorUtil.getJavaDocSiteLink; import static io.quarkus.annotation.processor.generate_doc.DocGeneratorUtil.getKnownGenericType; import static io.quarkus.annotation.processor.generate_doc.DocGeneratorUtil.hyphenate; @@ -56,7 +56,6 @@ import com.fasterxml.jackson.core.JsonProcessingException; -import io.quarkus.annotation.processor.Constants; import io.quarkus.annotation.processor.generate_doc.JavaDocParser.SectionHolder; class ConfigDocItemFinder { diff --git a/core/processor/src/main/java/io/quarkus/annotation/processor/generate_doc/ConfigDocItemScanner.java b/core/processor/src/main/java/io/quarkus/annotation/processor/generate_doc/ConfigDocItemScanner.java index e0d3d722b71ae..43d212c9393b4 100644 --- a/core/processor/src/main/java/io/quarkus/annotation/processor/generate_doc/ConfigDocItemScanner.java +++ b/core/processor/src/main/java/io/quarkus/annotation/processor/generate_doc/ConfigDocItemScanner.java @@ -22,8 +22,6 @@ import javax.lang.model.element.PackageElement; import javax.lang.model.element.TypeElement; -import io.quarkus.annotation.processor.Constants; - final public class ConfigDocItemScanner { private static final String IO_QUARKUS_TEST_EXTENSION_PACKAGE = "io.quarkus.extest."; diff --git a/core/processor/src/main/java/io/quarkus/annotation/processor/generate_doc/ConfigDocKey.java b/core/processor/src/main/java/io/quarkus/annotation/processor/generate_doc/ConfigDocKey.java index 7c021425621eb..f6733e7a30187 100644 --- a/core/processor/src/main/java/io/quarkus/annotation/processor/generate_doc/ConfigDocKey.java +++ b/core/processor/src/main/java/io/quarkus/annotation/processor/generate_doc/ConfigDocKey.java @@ -7,8 +7,6 @@ import java.util.Objects; import java.util.regex.Matcher; -import io.quarkus.annotation.processor.Constants; - final public class ConfigDocKey implements ConfigDocElement, Comparable { private String type; private String key; diff --git a/core/processor/src/main/java/io/quarkus/annotation/processor/generate_doc/ConfigDocWriter.java b/core/processor/src/main/java/io/quarkus/annotation/processor/generate_doc/ConfigDocWriter.java index b2baf426709a3..773cab80eae2b 100644 --- a/core/processor/src/main/java/io/quarkus/annotation/processor/generate_doc/ConfigDocWriter.java +++ b/core/processor/src/main/java/io/quarkus/annotation/processor/generate_doc/ConfigDocWriter.java @@ -5,8 +5,6 @@ import java.nio.file.Files; import java.nio.file.Path; -import io.quarkus.annotation.processor.Constants; - final public class ConfigDocWriter { /** diff --git a/core/processor/src/main/java/io/quarkus/annotation/processor/generate_doc/ConfigPhase.java b/core/processor/src/main/java/io/quarkus/annotation/processor/generate_doc/ConfigPhase.java index 5120966ee2280..95d47e7b6cf6b 100644 --- a/core/processor/src/main/java/io/quarkus/annotation/processor/generate_doc/ConfigPhase.java +++ b/core/processor/src/main/java/io/quarkus/annotation/processor/generate_doc/ConfigPhase.java @@ -2,8 +2,6 @@ import java.util.Comparator; -import io.quarkus.annotation.processor.Constants; - public enum ConfigPhase implements Comparable { RUN_TIME("The configuration is overridable at runtime", "", "RunTime"), BUILD_TIME("The configuration is not overridable at runtime", Constants.CONFIG_PHASE_BUILD_TIME_ILLUSTRATION, "BuildTime"), diff --git a/core/processor/src/main/java/io/quarkus/annotation/processor/Constants.java b/core/processor/src/main/java/io/quarkus/annotation/processor/generate_doc/Constants.java similarity index 98% rename from core/processor/src/main/java/io/quarkus/annotation/processor/Constants.java rename to core/processor/src/main/java/io/quarkus/annotation/processor/generate_doc/Constants.java index 6418a4128edb8..75ce923e755dd 100644 --- a/core/processor/src/main/java/io/quarkus/annotation/processor/Constants.java +++ b/core/processor/src/main/java/io/quarkus/annotation/processor/generate_doc/Constants.java @@ -1,4 +1,4 @@ -package io.quarkus.annotation.processor; +package io.quarkus.annotation.processor.generate_doc; import java.nio.file.Path; import java.nio.file.Paths; @@ -15,8 +15,6 @@ import com.fasterxml.jackson.core.type.TypeReference; import com.fasterxml.jackson.databind.ObjectMapper; -import io.quarkus.annotation.processor.generate_doc.ConfigDocItem; - final public class Constants { public static final ObjectMapper OBJECT_MAPPER = new ObjectMapper(); public static TypeReference> LIST_OF_CONFIG_ITEMS_TYPE_REF = new TypeReference<>() { diff --git a/core/processor/src/main/java/io/quarkus/annotation/processor/generate_doc/DocGeneratorUtil.java b/core/processor/src/main/java/io/quarkus/annotation/processor/generate_doc/DocGeneratorUtil.java index 95a43d1feac34..ae33d07e253d7 100644 --- a/core/processor/src/main/java/io/quarkus/annotation/processor/generate_doc/DocGeneratorUtil.java +++ b/core/processor/src/main/java/io/quarkus/annotation/processor/generate_doc/DocGeneratorUtil.java @@ -16,8 +16,6 @@ import javax.lang.model.type.DeclaredType; import javax.lang.model.type.TypeMirror; -import io.quarkus.annotation.processor.Constants; - public class DocGeneratorUtil { private static final String NEW_LINE = "\n"; private static final String CORE = "core"; diff --git a/core/processor/src/main/java/io/quarkus/annotation/processor/generate_doc/JavaDocParser.java b/core/processor/src/main/java/io/quarkus/annotation/processor/generate_doc/JavaDocParser.java index 4141db4ff6cd2..4d8955c3ae503 100644 --- a/core/processor/src/main/java/io/quarkus/annotation/processor/generate_doc/JavaDocParser.java +++ b/core/processor/src/main/java/io/quarkus/annotation/processor/generate_doc/JavaDocParser.java @@ -20,8 +20,6 @@ import com.github.javaparser.javadoc.description.JavadocDescriptionElement; import com.github.javaparser.javadoc.description.JavadocInlineTag; -import io.quarkus.annotation.processor.Constants; - final class JavaDocParser { private static final Pattern START_OF_LINE = Pattern.compile("^", Pattern.MULTILINE); diff --git a/core/processor/src/main/java/io/quarkus/annotation/processor/generate_doc/LegacyConfigDocExtensionProcessor.java b/core/processor/src/main/java/io/quarkus/annotation/processor/generate_doc/LegacyConfigDocExtensionProcessor.java new file mode 100644 index 0000000000000..6c5e77aa1be45 --- /dev/null +++ b/core/processor/src/main/java/io/quarkus/annotation/processor/generate_doc/LegacyConfigDocExtensionProcessor.java @@ -0,0 +1,210 @@ +package io.quarkus.annotation.processor.generate_doc; + +import static io.quarkus.annotation.processor.generate_doc.Constants.ANNOTATION_CONFIG_GROUP; +import static io.quarkus.annotation.processor.generate_doc.Constants.ANNOTATION_CONFIG_MAPPING; +import static javax.lang.model.util.ElementFilter.typesIn; + +import java.io.IOException; +import java.io.InputStream; +import java.nio.file.Files; +import java.nio.file.Path; +import java.util.HashSet; +import java.util.List; +import java.util.Map; +import java.util.Optional; +import java.util.Properties; +import java.util.Set; +import java.util.concurrent.ConcurrentHashMap; + +import javax.annotation.processing.RoundEnvironment; +import javax.lang.model.element.AnnotationMirror; +import javax.lang.model.element.Element; +import javax.lang.model.element.ElementKind; +import javax.lang.model.element.ExecutableElement; +import javax.lang.model.element.Modifier; +import javax.lang.model.element.PackageElement; +import javax.lang.model.element.TypeElement; +import javax.lang.model.type.DeclaredType; +import javax.lang.model.type.TypeKind; +import javax.lang.model.type.TypeMirror; +import javax.lang.model.util.ElementFilter; +import javax.tools.Diagnostic; + +import io.quarkus.annotation.processor.ExtensionProcessor; +import io.quarkus.annotation.processor.Outputs; +import io.quarkus.annotation.processor.documentation.config.util.Types; +import io.quarkus.annotation.processor.util.Config; +import io.quarkus.annotation.processor.util.Utils; + +public class LegacyConfigDocExtensionProcessor implements ExtensionProcessor { + + private Utils utils; + private final ConfigDocItemScanner configDocItemScanner; + private final ConfigDocWriter configDocWriter; + + private final Map annotationUsageTracker = new ConcurrentHashMap<>(); + private boolean configMappingUsed; + + public LegacyConfigDocExtensionProcessor() { + this.configDocItemScanner = new ConfigDocItemScanner(); + this.configDocWriter = new ConfigDocWriter(); + } + + @Override + public void init(Config config, Utils utils) { + this.utils = utils; + } + + @Override + public void process(Set annotations, RoundEnvironment roundEnv) { + configMappingUsed = annotations.stream() + .anyMatch(a -> a.getQualifiedName().toString().equals(Types.ANNOTATION_CONFIG_MAPPING)); + + for (TypeElement annotation : annotations) { + switch (annotation.getQualifiedName().toString()) { + case Types.ANNOTATION_CONFIG_ROOT: + trackAnnotationUsed(Types.ANNOTATION_CONFIG_ROOT); + processConfigRoot(roundEnv, annotation); + break; + case Types.ANNOTATION_CONFIG_GROUP: + trackAnnotationUsed(Types.ANNOTATION_CONFIG_GROUP); + processConfigGroup(roundEnv, annotation); + break; + case Types.ANNOTATION_CONFIG_MAPPING: + configMappingUsed = true; + break; + } + } + } + + private void processConfigRoot(RoundEnvironment roundEnv, TypeElement annotation) { + for (TypeElement clazz : typesIn(roundEnv.getElementsAnnotatedWith(annotation))) { + final PackageElement pkg = utils.element().getPackageOf(clazz); + if (pkg == null) { + utils.processingEnv().getMessager().printMessage(Diagnostic.Kind.ERROR, + "Element " + clazz + " has no enclosing package"); + continue; + } + + configDocItemScanner.addConfigRoot(pkg, clazz); + } + } + + private void processConfigGroup(RoundEnvironment roundEnv, TypeElement annotation) { + final Set groupClassNames = new HashSet<>(); + for (TypeElement i : ElementFilter.typesIn(roundEnv.getElementsAnnotatedWith(annotation))) { + if (groupClassNames.add(i.getQualifiedName().toString())) { + configDocItemScanner.addConfigGroups(i); + } + } + } + + private void recordMappingJavadoc(TypeElement clazz) { + String className = clazz.getQualifiedName().toString(); + if (!utils.element().isAnnotationPresent(clazz, ANNOTATION_CONFIG_MAPPING)) { + configDocItemScanner.addConfigGroups(clazz); + } + Properties javadocProps = new Properties(); + + for (Element e : clazz.getEnclosedElements()) { + switch (e.getKind()) { + case INTERFACE: { + recordMappingJavadoc(((TypeElement) e)); + break; + } + + case METHOD: { + if (!isConfigMappingMethodIgnored(e)) { + processMethodConfigMapping((ExecutableElement) e, javadocProps, className); + } + break; + } + default: + } + } + } + + private void processMethodConfigMapping(ExecutableElement method, Properties javadocProps, String className) { + if (method.getModifiers().contains(Modifier.ABSTRACT)) { + TypeMirror returnType = method.getReturnType(); + if (TypeKind.DECLARED.equals(returnType.getKind())) { + DeclaredType declaredType = (DeclaredType) returnType; + if (!utils.element().isAnnotationPresent(declaredType.asElement(), ANNOTATION_CONFIG_GROUP)) { + TypeElement type = unwrapConfigGroup(returnType); + if (type != null && ElementKind.INTERFACE.equals(type.getKind())) { + recordMappingJavadoc(type); + configDocItemScanner.addConfigGroups(type); + } + } + } + } + } + + private TypeElement unwrapConfigGroup(TypeMirror typeMirror) { + if (typeMirror == null) { + return null; + } + + DeclaredType declaredType = (DeclaredType) typeMirror; + String name = declaredType.asElement() + .toString(); + List typeArguments = declaredType.getTypeArguments(); + if (typeArguments.isEmpty()) { + if (!name.startsWith("java.")) { + return (TypeElement) declaredType.asElement(); + } + } else if (typeArguments.size() == 1) { + if (name.equals(Optional.class.getName()) || + name.equals(List.class.getName()) || + name.equals(Set.class.getName())) { + return unwrapConfigGroup(typeArguments.get(0)); + } + } else if (typeArguments.size() == 2) { + if (name.equals(Map.class.getName())) { + return unwrapConfigGroup(typeArguments.get(1)); + } + } + return null; + } + + private static boolean isConfigMappingMethodIgnored(Element element) { + for (AnnotationMirror annotationMirror : element.getAnnotationMirrors()) { + String annotationName = ((TypeElement) annotationMirror.getAnnotationType().asElement()) + .getQualifiedName().toString(); + if (Constants.ANNOTATION_CONFIG_DOC_IGNORE.equals(annotationName)) { + return true; + } + } + return false; + } + + private void trackAnnotationUsed(String annotation) { + annotationUsageTracker.put(annotation, true); + } + + @Override + public void finalizeProcessing() { + try { + // not ideal but let's load the javadoc properties (we can't use the filer API here as we can't open the same file twice)... + Properties javadocProperties = new Properties(); + Path javadocPropertiesPath = utils.filer().getTargetPath().resolve("classes") + .resolve(Outputs.META_INF_QUARKUS_JAVADOC); + if (Files.isReadable(javadocPropertiesPath)) { + try (InputStream is = Files.newInputStream(javadocPropertiesPath)) { + javadocProperties.load(is); + } + } + + final Set outputs = configDocItemScanner + .scanExtensionsConfigurationItems(javadocProperties, configMappingUsed); + for (ConfigDocGeneratedOutput output : outputs) { + DocGeneratorUtil.sort(output.getConfigDocItems()); // sort before writing + configDocWriter.writeAllExtensionConfigDocumentation(output); + } + } catch (IOException e) { + utils.processingEnv().getMessager().printMessage(Diagnostic.Kind.ERROR, "Failed to generate extension doc: " + e); + return; + } + } + +} diff --git a/core/processor/src/main/java/io/quarkus/annotation/processor/generate_doc/MavenConfigDocBuilder.java b/core/processor/src/main/java/io/quarkus/annotation/processor/generate_doc/MavenConfigDocBuilder.java index a5b1fcf98cc0e..0e538bb2169aa 100644 --- a/core/processor/src/main/java/io/quarkus/annotation/processor/generate_doc/MavenConfigDocBuilder.java +++ b/core/processor/src/main/java/io/quarkus/annotation/processor/generate_doc/MavenConfigDocBuilder.java @@ -1,14 +1,11 @@ package io.quarkus.annotation.processor.generate_doc; -import static io.quarkus.annotation.processor.Constants.EMPTY; -import static io.quarkus.annotation.processor.Constants.NEW_LINE; -import static io.quarkus.annotation.processor.Constants.SECTION_TITLE_L1; +import static io.quarkus.annotation.processor.generate_doc.Constants.NEW_LINE; +import static io.quarkus.annotation.processor.generate_doc.Constants.SECTION_TITLE_L1; import java.util.ArrayList; import java.util.List; -import io.quarkus.annotation.processor.Constants; - public final class MavenConfigDocBuilder extends ConfigDocBuilder { public MavenConfigDocBuilder() { diff --git a/core/processor/src/main/java/io/quarkus/annotation/processor/generate_doc/SummaryTableDocFormatter.java b/core/processor/src/main/java/io/quarkus/annotation/processor/generate_doc/SummaryTableDocFormatter.java index ce604d33eb1de..1fe3040fe6dca 100644 --- a/core/processor/src/main/java/io/quarkus/annotation/processor/generate_doc/SummaryTableDocFormatter.java +++ b/core/processor/src/main/java/io/quarkus/annotation/processor/generate_doc/SummaryTableDocFormatter.java @@ -1,15 +1,13 @@ package io.quarkus.annotation.processor.generate_doc; -import static io.quarkus.annotation.processor.Constants.CONFIG_PHASE_LEGEND; -import static io.quarkus.annotation.processor.Constants.NEW_LINE; +import static io.quarkus.annotation.processor.generate_doc.Constants.CONFIG_PHASE_LEGEND; +import static io.quarkus.annotation.processor.generate_doc.Constants.NEW_LINE; import static io.quarkus.annotation.processor.generate_doc.DocGeneratorUtil.toEnvVarName; import java.io.IOException; import java.io.Writer; import java.util.List; -import io.quarkus.annotation.processor.Constants; - final class SummaryTableDocFormatter implements DocFormatter { private static final String TWO_NEW_LINES = "\n\n"; private static final String TABLE_CLOSING_TAG = "\n|==="; diff --git a/core/processor/src/main/java/io/quarkus/annotation/processor/util/AccessorGenerator.java b/core/processor/src/main/java/io/quarkus/annotation/processor/util/AccessorGenerator.java new file mode 100644 index 0000000000000..130d969d2762c --- /dev/null +++ b/core/processor/src/main/java/io/quarkus/annotation/processor/util/AccessorGenerator.java @@ -0,0 +1,195 @@ +package io.quarkus.annotation.processor.util; + +import static javax.lang.model.util.ElementFilter.constructorsIn; +import static javax.lang.model.util.ElementFilter.fieldsIn; + +import java.io.IOException; +import java.util.List; +import java.util.Set; +import java.util.concurrent.ConcurrentHashMap; + +import javax.annotation.processing.ProcessingEnvironment; +import javax.lang.model.element.ExecutableElement; +import javax.lang.model.element.Modifier; +import javax.lang.model.element.PackageElement; +import javax.lang.model.element.TypeElement; +import javax.lang.model.element.VariableElement; +import javax.lang.model.type.DeclaredType; +import javax.lang.model.type.PrimitiveType; +import javax.lang.model.type.TypeKind; +import javax.lang.model.type.TypeMirror; +import javax.tools.Diagnostic; + +import org.jboss.jdeparser.FormatPreferences; +import org.jboss.jdeparser.JAssignableExpr; +import org.jboss.jdeparser.JCall; +import org.jboss.jdeparser.JClassDef; +import org.jboss.jdeparser.JDeparser; +import org.jboss.jdeparser.JExprs; +import org.jboss.jdeparser.JFiler; +import org.jboss.jdeparser.JMethodDef; +import org.jboss.jdeparser.JMod; +import org.jboss.jdeparser.JSourceFile; +import org.jboss.jdeparser.JSources; +import org.jboss.jdeparser.JType; +import org.jboss.jdeparser.JTypes; + +import io.quarkus.annotation.processor.generate_doc.Constants; + +public final class AccessorGenerator { + + private static final String QUARKUS_GENERATED = "io.quarkus.Generated"; + + private final ProcessingEnvironment processingEnv; + private final ElementUtil elementUtil; + private final Set generatedAccessors = new ConcurrentHashMap().keySet(Boolean.TRUE); + + AccessorGenerator(ProcessingEnvironment processingEnv, ElementUtil elementUtil) { + this.processingEnv = processingEnv; + this.elementUtil = elementUtil; + } + + public void generateAccessor(final TypeElement clazz) { + if (!generatedAccessors.add(clazz.getQualifiedName().toString())) { + return; + } + final FormatPreferences fp = new FormatPreferences(); + final JSources sources = JDeparser.createSources(JFiler.newInstance(processingEnv.getFiler()), fp); + final PackageElement packageElement = elementUtil.getPackageOf(clazz); + final String className = elementUtil.buildRelativeBinaryName(clazz, new StringBuilder()).append("$$accessor") + .toString(); + final JSourceFile sourceFile = sources.createSourceFile(packageElement.getQualifiedName() + .toString(), className); + JType clazzType = JTypes.typeOf(clazz.asType()); + if (clazz.asType() instanceof DeclaredType) { + DeclaredType declaredType = ((DeclaredType) clazz.asType()); + TypeMirror enclosingType = declaredType.getEnclosingType(); + if (enclosingType != null && enclosingType.getKind() == TypeKind.DECLARED + && clazz.getModifiers() + .contains(Modifier.STATIC)) { + // Ugly workaround for Eclipse APT and static nested types + clazzType = unnestStaticNestedType(declaredType); + } + } + final JClassDef classDef = sourceFile._class(JMod.PUBLIC | JMod.FINAL, className); + classDef.constructor(JMod.PRIVATE); // no construction + classDef.annotate(QUARKUS_GENERATED) + .value("Quarkus annotation processor"); + final JAssignableExpr instanceName = JExprs.name(Constants.INSTANCE_SYM); + boolean isEnclosingClassPublic = clazz.getModifiers() + .contains(Modifier.PUBLIC); + // iterate fields + boolean generationNeeded = false; + for (VariableElement field : fieldsIn(clazz.getEnclosedElements())) { + final Set mods = field.getModifiers(); + if (mods.contains(Modifier.PRIVATE) || mods.contains(Modifier.STATIC) || mods.contains(Modifier.FINAL)) { + // skip it + continue; + } + final TypeMirror fieldType = field.asType(); + if (mods.contains(Modifier.PUBLIC) && isEnclosingClassPublic) { + // we don't need to generate a method accessor when the following conditions are met: + // 1) the field is public + // 2) the enclosing class is public + // 3) the class type of the field is public + if (fieldType instanceof DeclaredType) { + final DeclaredType declaredType = (DeclaredType) fieldType; + final TypeElement typeElement = (TypeElement) declaredType.asElement(); + if (typeElement.getModifiers() + .contains(Modifier.PUBLIC)) { + continue; + } + } else { + continue; + } + + } + generationNeeded = true; + + final JType realType = JTypes.typeOf(fieldType); + final JType publicType = fieldType instanceof PrimitiveType ? realType : JType.OBJECT; + + final String fieldName = field.getSimpleName() + .toString(); + final JMethodDef getter = classDef.method(JMod.PUBLIC | JMod.STATIC, publicType, "get_" + fieldName); + getter.annotate(SuppressWarnings.class) + .value("unchecked"); + getter.param(JType.OBJECT, Constants.INSTANCE_SYM); + getter.body() + ._return(instanceName.cast(clazzType) + .field(fieldName)); + final JMethodDef setter = classDef.method(JMod.PUBLIC | JMod.STATIC, JType.VOID, "set_" + fieldName); + setter.annotate(SuppressWarnings.class) + .value("unchecked"); + setter.param(JType.OBJECT, Constants.INSTANCE_SYM); + setter.param(publicType, fieldName); + final JAssignableExpr fieldExpr = JExprs.name(fieldName); + setter.body() + .assign(instanceName.cast(clazzType) + .field(fieldName), + (publicType.equals(realType) ? fieldExpr : fieldExpr.cast(realType))); + } + + // we need to generate an accessor if the class isn't public + if (!isEnclosingClassPublic) { + for (ExecutableElement ctor : constructorsIn(clazz.getEnclosedElements())) { + if (ctor.getModifiers() + .contains(Modifier.PRIVATE)) { + // skip it + continue; + } + generationNeeded = true; + StringBuilder b = new StringBuilder(); + for (VariableElement parameter : ctor.getParameters()) { + b.append('_'); + b.append(parameter.asType() + .toString() + .replace('.', '_')); + } + String codedName = b.toString(); + final JMethodDef ctorMethod = classDef.method(JMod.PUBLIC | JMod.STATIC, JType.OBJECT, "construct" + codedName); + final JCall ctorCall = clazzType._new(); + for (VariableElement parameter : ctor.getParameters()) { + final TypeMirror paramType = parameter.asType(); + final JType realType = JTypes.typeOf(paramType); + final JType publicType = paramType instanceof PrimitiveType ? realType : JType.OBJECT; + final String name = parameter.getSimpleName() + .toString(); + ctorMethod.param(publicType, name); + final JAssignableExpr nameExpr = JExprs.name(name); + ctorCall.arg(publicType.equals(realType) ? nameExpr : nameExpr.cast(realType)); + } + ctorMethod.body() + ._return(ctorCall); + } + } + + // if no constructor or field access is needed, don't generate anything + if (generationNeeded) { + try { + sources.writeSources(); + } catch (IOException e) { + processingEnv.getMessager() + .printMessage(Diagnostic.Kind.ERROR, "Failed to generate source file: " + e, clazz); + } + } + } + + private JType unnestStaticNestedType(DeclaredType declaredType) { + final TypeElement typeElement = (TypeElement) declaredType.asElement(); + + final String name = typeElement.getQualifiedName() + .toString(); + final JType rawType = JTypes.typeNamed(name); + final List typeArguments = declaredType.getTypeArguments(); + if (typeArguments.isEmpty()) { + return rawType; + } + JType[] args = new JType[typeArguments.size()]; + for (int i = 0; i < typeArguments.size(); i++) { + final TypeMirror argument = typeArguments.get(i); + args[i] = JTypes.typeOf(argument); + } + return rawType.typeArg(args); + } +} diff --git a/core/processor/src/main/java/io/quarkus/annotation/processor/util/Config.java b/core/processor/src/main/java/io/quarkus/annotation/processor/util/Config.java new file mode 100644 index 0000000000000..85643f62c24eb --- /dev/null +++ b/core/processor/src/main/java/io/quarkus/annotation/processor/util/Config.java @@ -0,0 +1,28 @@ +package io.quarkus.annotation.processor.util; + +import io.quarkus.annotation.processor.documentation.config.model.Extension; + +public class Config { + + private final Extension extension; + private final boolean useConfigMapping; + private final boolean debug; + + public Config(Extension extension, boolean useConfigMapping, boolean debug) { + this.extension = extension; + this.useConfigMapping = useConfigMapping; + this.debug = debug; + } + + public Extension getExtension() { + return extension; + } + + public boolean useConfigMapping() { + return useConfigMapping; + } + + public boolean isDebug() { + return debug; + } +} diff --git a/core/processor/src/main/java/io/quarkus/annotation/processor/util/ElementUtil.java b/core/processor/src/main/java/io/quarkus/annotation/processor/util/ElementUtil.java new file mode 100644 index 0000000000000..cca53fef2a6e8 --- /dev/null +++ b/core/processor/src/main/java/io/quarkus/annotation/processor/util/ElementUtil.java @@ -0,0 +1,161 @@ +package io.quarkus.annotation.processor.util; + +import java.util.List; +import java.util.Map; +import java.util.Set; +import java.util.function.Function; +import java.util.regex.Pattern; +import java.util.stream.Collectors; + +import javax.annotation.processing.ProcessingEnvironment; +import javax.lang.model.element.AnnotationMirror; +import javax.lang.model.element.Element; +import javax.lang.model.element.Name; +import javax.lang.model.element.PackageElement; +import javax.lang.model.element.TypeElement; +import javax.lang.model.type.DeclaredType; +import javax.lang.model.type.TypeMirror; +import javax.tools.Diagnostic; +import javax.tools.StandardLocation; + +public class ElementUtil { + + private static final Pattern REMOVE_LEADING_SPACE = Pattern.compile("^ ", Pattern.MULTILINE); + + private final ProcessingEnvironment processingEnv; + + ElementUtil(ProcessingEnvironment processingEnv) { + this.processingEnv = processingEnv; + } + + public String getBinaryName(TypeElement clazz) { + return processingEnv.getElementUtils().getBinaryName(clazz).toString(); + } + + public String getRelativeBinaryName(TypeElement typeElement) { + return buildRelativeBinaryName(typeElement, new StringBuilder()).toString(); + } + + StringBuilder buildRelativeBinaryName(TypeElement typeElement, StringBuilder builder) { + final Element enclosing = typeElement.getEnclosingElement(); + if (enclosing instanceof TypeElement) { + buildRelativeBinaryName((TypeElement) enclosing, builder); + builder.append('$'); + } + builder.append(typeElement.getSimpleName()); + return builder; + } + + public String simplifyGenericType(TypeMirror typeMirror) { + DeclaredType declaredType = ((DeclaredType) typeMirror); + List typeArguments = declaredType.getTypeArguments(); + String simpleName = declaredType.asElement().getSimpleName().toString(); + if (typeArguments.isEmpty()) { + return simpleName; + } else if (typeArguments.size() == 1) { + return String.format("%s<%s>", simpleName, simplifyGenericType(typeArguments.get(0))); + } else if (typeArguments.size() == 2) { + return String.format("%s<%s,%s>", simpleName, simplifyGenericType(typeArguments.get(0)), + simplifyGenericType(typeArguments.get(1))); + } + + return "unknown"; // we should not reach here + } + + public Map getAnnotations(Element element) { + return element.getAnnotationMirrors().stream() + .collect(Collectors.toMap(a -> ((TypeElement) a.getAnnotationType().asElement()).getQualifiedName().toString(), + Function.identity())); + } + + public Map getAnnotationValues(AnnotationMirror annotation) { + return annotation.getElementValues().entrySet().stream() + .collect(Collectors.toMap(e -> e.getKey().toString().substring(0, e.getKey().toString().length() - 2), + e -> e.getValue().getValue())); + } + + public PackageElement getPackageOf(TypeElement clazz) { + return processingEnv.getElementUtils().getPackageOf(clazz); + } + + public Name getPackageName(TypeElement clazz) { + return getPackageOf(clazz).getQualifiedName(); + } + + public TypeElement getClassOf(Element e) { + Element t = e; + while (!(t instanceof TypeElement)) { + if (t == null) { + processingEnv.getMessager().printMessage(Diagnostic.Kind.ERROR, + "Element " + e + " has no enclosing class"); + return null; + } + t = t.getEnclosingElement(); + } + return (TypeElement) t; + } + + public boolean isAnnotationPresent(Element element, String... annotationNames) { + Set annotations = Set.of(annotationNames); + for (AnnotationMirror i : element.getAnnotationMirrors()) { + String annotationName = ((TypeElement) i.getAnnotationType() + .asElement()).getQualifiedName() + .toString(); + if (annotations.contains(annotationName)) { + return true; + } + } + return false; + } + + /** + * This is less than ideal but it's the only way I found to detect if a class is local or not. + *

+ * It is important because, while we can scan the annotations of classes in the classpath, we cannot get their javadoc, + * which in the case of config doc generation is problematic. + */ + public boolean isLocalClass(TypeElement clazz) { + try { + TypeElement topLevelClass = clazz; + if (clazz.getNestingKind().isNested()) { + topLevelClass = (TypeElement) clazz.getEnclosingElement(); + } + + processingEnv.getFiler().getResource(StandardLocation.SOURCE_PATH, "", + topLevelClass.getQualifiedName().toString().replace('.', '/') + ".java"); + return true; + } catch (Exception e) { + return false; + } + } + + public String getRequiredJavadoc(Element e) { + String javaDoc = getJavadoc(e); + + if (javaDoc == null) { + processingEnv.getMessager() + .printMessage(Diagnostic.Kind.ERROR, + "Unable to find javadoc for config item " + e.getEnclosingElement() + " " + e, e); + return ""; + } + return javaDoc; + } + + public String getJavadoc(Element e) { + String docComment = processingEnv.getElementUtils().getDocComment(e); + + if (docComment == null) { + return null; + } + + // javax.lang.model keeps the leading space after the "*" so we need to remove it. + + return REMOVE_LEADING_SPACE.matcher(docComment) + .replaceAll("") + .trim(); + } + + public boolean isJdkClass(TypeElement e) { + return e.getQualifiedName().toString().startsWith("java."); + } +} diff --git a/core/processor/src/main/java/io/quarkus/annotation/processor/util/FilerUtil.java b/core/processor/src/main/java/io/quarkus/annotation/processor/util/FilerUtil.java new file mode 100644 index 0000000000000..7264efb7b3b61 --- /dev/null +++ b/core/processor/src/main/java/io/quarkus/annotation/processor/util/FilerUtil.java @@ -0,0 +1,78 @@ +package io.quarkus.annotation.processor.util; + +import java.io.BufferedWriter; +import java.io.IOException; +import java.io.OutputStreamWriter; +import java.io.UncheckedIOException; +import java.nio.charset.StandardCharsets; +import java.nio.file.Path; +import java.nio.file.Paths; +import java.util.Properties; +import java.util.Set; + +import javax.annotation.processing.ProcessingEnvironment; +import javax.tools.Diagnostic; +import javax.tools.FileObject; +import javax.tools.StandardLocation; + +import io.quarkus.bootstrap.util.PropertyUtils; + +public class FilerUtil { + + private final ProcessingEnvironment processingEnv; + + FilerUtil(ProcessingEnvironment processingEnv) { + this.processingEnv = processingEnv; + } + + public void write(String fileName, Set set) { + if (set.isEmpty()) { + return; + } + + try { + final FileObject listResource = processingEnv.getFiler().createResource(StandardLocation.CLASS_OUTPUT, "", + fileName); + + try (BufferedWriter writer = new BufferedWriter( + new OutputStreamWriter(listResource.openOutputStream(), StandardCharsets.UTF_8))) { + for (String className : set) { + writer.write(className); + writer.newLine(); + } + } + } catch (IOException e) { + processingEnv.getMessager().printMessage(Diagnostic.Kind.ERROR, "Failed to write " + fileName + ": " + e); + return; + } + } + + public void write(String fileName, Properties properties) { + if (properties.isEmpty()) { + return; + } + + try { + final FileObject propertiesResource = processingEnv.getFiler().createResource(StandardLocation.CLASS_OUTPUT, "", + fileName); + + try (BufferedWriter writer = new BufferedWriter( + new OutputStreamWriter(propertiesResource.openOutputStream(), StandardCharsets.UTF_8))) { + PropertyUtils.store(properties, writer); + } + } catch (IOException e) { + processingEnv.getMessager().printMessage(Diagnostic.Kind.ERROR, "Failed to write " + fileName + ": " + e); + return; + } + } + + public Path getTargetPath() { + try { + FileObject dummyFile = processingEnv.getFiler().getResource(StandardLocation.CLASS_OUTPUT, "", "dummy"); + return Paths.get(dummyFile.toUri()).getParent().getParent(); + } catch (IOException e) { + processingEnv.getMessager().printMessage(Diagnostic.Kind.ERROR, "Unable to determine the path of target/" + e); + throw new UncheckedIOException(e); + } + } +} diff --git a/core/processor/src/main/java/io/quarkus/annotation/processor/util/Strings.java b/core/processor/src/main/java/io/quarkus/annotation/processor/util/Strings.java new file mode 100644 index 0000000000000..2976bad169b74 --- /dev/null +++ b/core/processor/src/main/java/io/quarkus/annotation/processor/util/Strings.java @@ -0,0 +1,15 @@ +package io.quarkus.annotation.processor.util; + +public final class Strings { + + private Strings() { + } + + public static boolean isBlank(String string) { + return string == null || string.isBlank(); + } + + public static boolean isEmpty(String string) { + return string == null || string.isEmpty(); + } +} diff --git a/core/processor/src/main/java/io/quarkus/annotation/processor/util/Utils.java b/core/processor/src/main/java/io/quarkus/annotation/processor/util/Utils.java new file mode 100644 index 0000000000000..5e65ec56a55b3 --- /dev/null +++ b/core/processor/src/main/java/io/quarkus/annotation/processor/util/Utils.java @@ -0,0 +1,34 @@ +package io.quarkus.annotation.processor.util; + +import javax.annotation.processing.ProcessingEnvironment; + +public final class Utils { + + private final ProcessingEnvironment processingEnv; + private final ElementUtil elementUtil; + private final AccessorGenerator accessorGenerator; + private final FilerUtil filerUtil; + + public Utils(ProcessingEnvironment processingEnv) { + this.processingEnv = processingEnv; + this.elementUtil = new ElementUtil(processingEnv); + this.accessorGenerator = new AccessorGenerator(processingEnv, elementUtil); + this.filerUtil = new FilerUtil(processingEnv); + } + + public ElementUtil element() { + return elementUtil; + } + + public ProcessingEnvironment processingEnv() { + return processingEnv; + } + + public AccessorGenerator accessorGenerator() { + return accessorGenerator; + } + + public FilerUtil filer() { + return filerUtil; + } +} diff --git a/core/processor/src/test/java/io/quarkus/annotation/processor/ExtensionAnnotationProcessorTest.java b/core/processor/src/test/java/io/quarkus/annotation/processor/ExtensionAnnotationProcessorTest.java index 6181456df994e..df5122c68afd8 100644 --- a/core/processor/src/test/java/io/quarkus/annotation/processor/ExtensionAnnotationProcessorTest.java +++ b/core/processor/src/test/java/io/quarkus/annotation/processor/ExtensionAnnotationProcessorTest.java @@ -9,6 +9,7 @@ import javax.tools.JavaFileObject; +import org.junit.jupiter.api.Disabled; import org.junit.jupiter.api.Test; import org.junit.jupiter.api.extension.ExtendWith; @@ -19,18 +20,19 @@ @ExtendWith(JavacExtension.class) @Processors({ ExtensionAnnotationProcessor.class }) +@Disabled class ExtensionAnnotationProcessorTest { @Test @Classpath("org.acme.examples.ClassWithBuildStep") void shouldProcessClassWithBuildStepWithoutErrors(Results results) throws IOException { - assertNoErrrors(results); + assertNoErrors(results); } @Test @Classpath("org.acme.examples.ClassWithBuildStep") void shouldGenerateABscFile(Results results) throws IOException { - assertNoErrrors(results); + assertNoErrors(results); List sources = results.generatedSources; JavaFileObject bscFile = sources.stream() .filter(source -> source.getName() @@ -53,10 +55,10 @@ private String removeLineBreaks(String s) { @Test @Classpath("org.acme.examples.ClassWithoutBuildStep") void shouldProcessEmptyClassWithoutErrors(Results results) { - assertNoErrrors(results); + assertNoErrors(results); } - private static void assertNoErrrors(Results results) { + private static void assertNoErrors(Results results) { assertEquals(0, results.find() .errors() .count(), diff --git a/core/processor/src/test/java/io/quarkus/annotation/processor/generate_doc/DocGeneratorUtilTest.java b/core/processor/src/test/java/io/quarkus/annotation/processor/generate_doc/DocGeneratorUtilTest.java index 0cf6ca266f726..57fc8df1dee9f 100644 --- a/core/processor/src/test/java/io/quarkus/annotation/processor/generate_doc/DocGeneratorUtilTest.java +++ b/core/processor/src/test/java/io/quarkus/annotation/processor/generate_doc/DocGeneratorUtilTest.java @@ -25,8 +25,6 @@ import org.junit.jupiter.api.Test; -import io.quarkus.annotation.processor.Constants; - public class DocGeneratorUtilTest { @Test public void shouldReturnEmptyListForPrimitiveValue() { diff --git a/docs/src/main/java/io/quarkus/docs/generation/QuarkusMavenPluginDocsGenerator.java b/docs/src/main/java/io/quarkus/docs/generation/QuarkusMavenPluginDocsGenerator.java index 7ef18c94898dd..991810aef9657 100644 --- a/docs/src/main/java/io/quarkus/docs/generation/QuarkusMavenPluginDocsGenerator.java +++ b/docs/src/main/java/io/quarkus/docs/generation/QuarkusMavenPluginDocsGenerator.java @@ -13,8 +13,8 @@ import org.apache.maven.plugin.descriptor.PluginDescriptorBuilder; import org.codehaus.plexus.util.xml.XmlStreamReader; -import io.quarkus.annotation.processor.Constants; import io.quarkus.annotation.processor.generate_doc.ConfigDocWriter; +import io.quarkus.annotation.processor.generate_doc.Constants; import io.quarkus.annotation.processor.generate_doc.MavenConfigDocBuilder; import io.quarkus.annotation.processor.generate_doc.MavenConfigDocBuilder.GoalParamsBuilder; From 1998f19173cf8336791cabc2dbeb3cb1dbfe85b2 Mon Sep 17 00:00:00 2001 From: Guillaume Smet Date: Wed, 24 Jul 2024 15:47:40 +0200 Subject: [PATCH 02/43] Simplify OptionalInt/... types This is a small change of behavior compared to current, per discussion with Yoann. --- .../processor/documentation/config/util/Types.java | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/core/processor/src/main/java/io/quarkus/annotation/processor/documentation/config/util/Types.java b/core/processor/src/main/java/io/quarkus/annotation/processor/documentation/config/util/Types.java index d0c44f4605fb1..d8016274dd929 100644 --- a/core/processor/src/main/java/io/quarkus/annotation/processor/documentation/config/util/Types.java +++ b/core/processor/src/main/java/io/quarkus/annotation/processor/documentation/config/util/Types.java @@ -41,9 +41,9 @@ private Types() { ANNOTATION_CONFIG_ROOT, ANNOTATION_RECORDER, ANNOTATION_CONFIG_MAPPING); static final Map ALIASED_TYPES = Map.of( - OptionalLong.class.getName(), Long.class.getName(), - OptionalInt.class.getName(), Integer.class.getName(), - OptionalDouble.class.getName(), Double.class.getName(), + OptionalLong.class.getName(), long.class.getName(), + OptionalInt.class.getName(), int.class.getName(), + OptionalDouble.class.getName(), double.class.getName(), "java.lang.Class", "class name", "java.net.InetSocketAddress", "host:port", Path.class.getName(), "path", From 2f0b8d4cd0932a7f19b3efd002764580ff3753fd Mon Sep 17 00:00:00 2001 From: Guillaume Smet Date: Wed, 24 Jul 2024 15:48:14 +0200 Subject: [PATCH 03/43] Support deprecating a whole section --- .../config/resolver/ConfigResolver.java | 18 ++++++++++++------ 1 file changed, 12 insertions(+), 6 deletions(-) diff --git a/core/processor/src/main/java/io/quarkus/annotation/processor/documentation/config/resolver/ConfigResolver.java b/core/processor/src/main/java/io/quarkus/annotation/processor/documentation/config/resolver/ConfigResolver.java index 84d2ce3c2c07c..f195312992d14 100644 --- a/core/processor/src/main/java/io/quarkus/annotation/processor/documentation/config/resolver/ConfigResolver.java +++ b/core/processor/src/main/java/io/quarkus/annotation/processor/documentation/config/resolver/ConfigResolver.java @@ -70,8 +70,7 @@ public ResolvedModel resolveModel() { configRoot.addUnresolvedInterfaces(discoveryConfigRoot.getUnresolvedInterfaces()); ResolutionContext context = new ResolutionContext(configRoot.getPrefix(), new ArrayList<>(), discoveryConfigRoot, - configRoot, - false); + configRoot, false, false); for (DiscoveryConfigProperty discoveryConfigProperty : discoveryConfigRoot.getProperties().values()) { resolveProperty(configRoot, discoveryConfigRoot.getPhase(), context, discoveryConfigProperty); } @@ -94,6 +93,7 @@ private void resolveProperty(ConfigRoot configRoot, ConfigPhase phase, Resolutio List additionalPaths = context.getAdditionalPaths().stream() .map(p -> appendPath(p, discoveryConfigProperty.getPath())) .collect(Collectors.toCollection(ArrayList::new)); + boolean deprecated = context.isDeprecated() || discoveryConfigProperty.isDeprecated(); String typeQualifiedName = discoveryConfigProperty.getType().qualifiedName(); @@ -126,10 +126,10 @@ private void resolveProperty(ConfigRoot configRoot, ConfigPhase phase, Resolutio discoveryConfigProperty.getSection().description()); context.getItemCollection().addItem(configSection); configGroupContext = new ResolutionContext(fullPath, additionalPaths, discoveryConfigGroup, configSection, - discoveryConfigProperty.getType().isMap()); + discoveryConfigProperty.getType().isMap(), deprecated); } else { configGroupContext = new ResolutionContext(fullPath, additionalPaths, discoveryConfigGroup, - context.getItemCollection(), discoveryConfigProperty.getType().isMap()); + context.getItemCollection(), discoveryConfigProperty.getType().isMap(), deprecated); } for (DiscoveryConfigProperty configGroupProperty : discoveryConfigGroup.getProperties().values()) { @@ -200,7 +200,7 @@ private void resolveProperty(ConfigRoot configRoot, ConfigPhase phase, Resolutio discoveryConfigProperty.getType().isEnum(), enumAcceptedValues, defaultValue, discoveryConfigProperty.getDescription(), JavadocUtil.getJavadocSiteLink(typeBinaryName), - discoveryConfigProperty.isDeprecated(), + deprecated, discoveryConfigProperty.getSince()); context.getItemCollection().addItem(configProperty); } @@ -249,15 +249,17 @@ private static class ResolutionContext { private final DiscoveryRootElement discoveryRootElement; private final ConfigItemCollection itemCollection; private final boolean withinMap; + private final boolean deprecated; private ResolutionContext(String path, List additionalPaths, DiscoveryRootElement discoveryRootElement, ConfigItemCollection itemCollection, - boolean withinMap) { + boolean withinMap, boolean deprecated) { this.path = path; this.additionalPaths = additionalPaths; this.discoveryRootElement = discoveryRootElement; this.itemCollection = itemCollection; this.withinMap = withinMap; + this.deprecated = deprecated; } public String getPath() { @@ -279,5 +281,9 @@ public ConfigItemCollection getItemCollection() { public boolean isWithinMap() { return withinMap; } + + public boolean isDeprecated() { + return deprecated; + } } } From 124a3ea962af3c473505d3d11b1fd1030e1a8eed Mon Sep 17 00:00:00 2001 From: Guillaume Smet Date: Thu, 18 Jul 2024 19:46:38 +0200 Subject: [PATCH 04/43] Mark projects using legacy @ConfigRoots --- .../amazon-lambda-http/deployment/pom.xml | 3 + extensions/amazon-lambda-http/runtime/pom.xml | 3 + .../amazon-lambda-rest/deployment/pom.xml | 3 + extensions/amazon-lambda-rest/runtime/pom.xml | 3 + .../amazon-lambda/common-deployment/pom.xml | 3 + .../amazon-lambda/common-runtime/pom.xml | 3 + extensions/amazon-lambda/deployment/pom.xml | 3 + extensions/amazon-lambda/runtime/pom.xml | 3 + extensions/arc/deployment/pom.xml | 3 + extensions/arc/runtime/pom.xml | 103 ++++---- extensions/azure-functions/deployment/pom.xml | 3 + extensions/azure-functions/runtime/pom.xml | 3 + .../deployment/pom.xml | 3 + .../container-image-buildpack/runtime/pom.xml | 3 + .../container-image-jib/deployment/pom.xml | 5 +- .../container-image-jib/runtime/pom.xml | 5 +- .../deployment/pom.xml | 3 + .../container-image-openshift/runtime/pom.xml | 3 + extensions/container-image/deployment/pom.xml | 3 + extensions/container-image/runtime/pom.xml | 3 + .../deployment/pom.xml | 3 + .../runtime/pom.xml | 3 + .../deployment/pom.xml | 3 + .../elasticsearch-rest-client/runtime/pom.xml | 3 + extensions/flyway/deployment/pom.xml | 3 + extensions/flyway/runtime/pom.xml | 3 + .../funqy-knative-events/deployment/pom.xml | 3 + .../funqy-knative-events/runtime/pom.xml | 3 + .../funqy-server-common/deployment/pom.xml | 3 + .../funqy/funqy-server-common/runtime/pom.xml | 3 + .../google-cloud-functions/deployment/pom.xml | 5 +- .../google-cloud-functions/runtime/pom.xml | 5 +- extensions/grpc/deployment/pom.xml | 3 + extensions/grpc/runtime/pom.xml | 3 + .../infinispan-cache/deployment/pom.xml | 5 +- extensions/infinispan-cache/runtime/pom.xml | 3 + .../infinispan-client/deployment/pom.xml | 3 + extensions/infinispan-client/runtime/pom.xml | 3 + extensions/jackson/deployment/pom.xml | 3 + extensions/jackson/runtime/pom.xml | 3 + extensions/jaxb/deployment/pom.xml | 3 + extensions/jaxb/runtime/pom.xml | 3 + extensions/kafka-client/deployment/pom.xml | 3 + extensions/kafka-client/runtime/pom.xml | 3 + extensions/kafka-streams/deployment/pom.xml | 3 + extensions/kafka-streams/runtime/pom.xml | 3 + .../kubernetes/vanilla/deployment/pom.xml | 3 + extensions/kubernetes/vanilla/runtime/pom.xml | 3 + .../liquibase-mongodb/deployment/pom.xml | 3 + extensions/liquibase-mongodb/runtime/pom.xml | 3 + extensions/liquibase/deployment/pom.xml | 3 + extensions/liquibase/runtime/pom.xml | 3 + extensions/logging-gelf/deployment/pom.xml | 3 + extensions/logging-gelf/runtime/pom.xml | 3 + extensions/logging-json/deployment/pom.xml | 5 +- extensions/logging-json/runtime/pom.xml | 3 + extensions/mailer/deployment/pom.xml | 3 + extensions/mailer/runtime/pom.xml | 3 + extensions/micrometer/deployment/pom.xml | 3 + extensions/micrometer/runtime/pom.xml | 3 + extensions/mongodb-client/deployment/pom.xml | 3 + extensions/mongodb-client/runtime/pom.xml | 3 + extensions/narayana-jta/deployment/pom.xml | 3 + extensions/narayana-jta/runtime/pom.xml | 3 + extensions/narayana-lra/deployment/pom.xml | 3 + extensions/narayana-lra/runtime/pom.xml | 3 + extensions/netty/deployment/pom.xml | 3 + extensions/netty/runtime/pom.xml | 3 + extensions/oidc-client/deployment/pom.xml | 3 + extensions/oidc-client/runtime/pom.xml | 3 + extensions/oidc/deployment/pom.xml | 3 + extensions/oidc/runtime/pom.xml | 3 + extensions/picocli/deployment/pom.xml | 3 + extensions/picocli/runtime/pom.xml | 3 + extensions/quartz/deployment/pom.xml | 3 + extensions/quartz/runtime/pom.xml | 3 + extensions/qute/deployment/pom.xml | 3 + extensions/qute/runtime/pom.xml | 3 + extensions/redis-cache/deployment/pom.xml | 3 + extensions/redis-cache/runtime/pom.xml | 3 + .../rest-client-config/deployment/pom.xml | 3 + .../rest-client-config/runtime/pom.xml | 3 + .../resteasy-common/deployment/pom.xml | 3 + .../resteasy-common/runtime/pom.xml | 3 + .../resteasy-multipart/deployment/pom.xml | 3 + .../resteasy-multipart/runtime/pom.xml | 3 + .../resteasy-server-common/deployment/pom.xml | 3 + .../resteasy-server-common/runtime/pom.xml | 3 + .../resteasy/deployment/pom.xml | 3 + .../resteasy-classic/resteasy/runtime/pom.xml | 3 + .../rest-client/deployment/pom.xml | 3 + .../rest-client/runtime/pom.xml | 3 + .../rest-csrf/deployment/pom.xml | 3 + .../rest-csrf/runtime/pom.xml | 3 + .../deployment/pom.xml | 3 + .../runtime/pom.xml | 3 + extensions/scheduler/deployment/pom.xml | 35 +-- extensions/scheduler/runtime/pom.xml | 3 + .../devservice/deployment/pom.xml | 3 + .../devservice/runtime/pom.xml | 19 ++ .../deployment/pom.xml | 3 + .../smallrye-graphql-client/runtime/pom.xml | 3 + .../smallrye-graphql/deployment/pom.xml | 3 + extensions/smallrye-graphql/runtime/pom.xml | 3 + extensions/smallrye-health/deployment/pom.xml | 3 + extensions/smallrye-health/runtime/pom.xml | 3 + .../smallrye-metrics/deployment/pom.xml | 3 + extensions/smallrye-metrics/runtime/pom.xml | 3 + .../deployment/pom.xml | 3 + .../smallrye-openapi/deployment/pom.xml | 225 +++++++++--------- extensions/smallrye-openapi/runtime/pom.xml | 119 ++++----- .../deployment/pom.xml | 3 + .../runtime/pom.xml | 3 + .../deployment/pom.xml | 3 + .../runtime/pom.xml | 3 + .../deployment/pom.xml | 3 + .../runtime/pom.xml | 3 + .../deployment/pom.xml | 3 + .../runtime/pom.xml | 3 + .../deployment/pom.xml | 3 + .../runtime/pom.xml | 3 + .../deployment/pom.xml | 201 ++++++++-------- .../runtime/pom.xml | 3 + .../spring-boot-properties/deployment/pom.xml | 5 +- .../spring-boot-properties/runtime/pom.xml | 3 + extensions/swagger-ui/deployment/pom.xml | 27 ++- extensions/swagger-ui/runtime/pom.xml | 3 + extensions/undertow/deployment/pom.xml | 3 + extensions/undertow/runtime/pom.xml | 3 + extensions/vertx-graphql/deployment/pom.xml | 3 + extensions/vertx-graphql/runtime/pom.xml | 3 + extensions/vertx-http/deployment/pom.xml | 3 + extensions/vertx-http/runtime/pom.xml | 3 + extensions/virtual-threads/deployment/pom.xml | 3 + extensions/virtual-threads/runtime/pom.xml | 3 + .../web-dependency-locator/deployment/pom.xml | 3 + .../web-dependency-locator/runtime/pom.xml | 3 + .../websockets/client/deployment/pom.xml | 3 + extensions/websockets/client/runtime/pom.xml | 3 + .../extension/deployment/pom.xml | 3 + .../test-extension/extension/runtime/pom.xml | 3 + test-framework/jacoco/deployment/pom.xml | 3 + test-framework/jacoco/runtime/pom.xml | 3 + 143 files changed, 798 insertions(+), 353 deletions(-) diff --git a/extensions/amazon-lambda-http/deployment/pom.xml b/extensions/amazon-lambda-http/deployment/pom.xml index 2b8a540f7773e..83e14cf9a8328 100644 --- a/extensions/amazon-lambda-http/deployment/pom.xml +++ b/extensions/amazon-lambda-http/deployment/pom.xml @@ -65,6 +65,9 @@ ${project.version} + + -AlegacyConfigRoot=true + diff --git a/extensions/amazon-lambda-http/runtime/pom.xml b/extensions/amazon-lambda-http/runtime/pom.xml index 6fb67ab485eea..db09722ebf83b 100644 --- a/extensions/amazon-lambda-http/runtime/pom.xml +++ b/extensions/amazon-lambda-http/runtime/pom.xml @@ -73,6 +73,9 @@ ${project.version} + + -AlegacyConfigRoot=true + diff --git a/extensions/amazon-lambda-rest/deployment/pom.xml b/extensions/amazon-lambda-rest/deployment/pom.xml index 27d8372e8d6e4..2234e2a59676f 100644 --- a/extensions/amazon-lambda-rest/deployment/pom.xml +++ b/extensions/amazon-lambda-rest/deployment/pom.xml @@ -65,6 +65,9 @@ ${project.version} + + -AlegacyConfigRoot=true + diff --git a/extensions/amazon-lambda-rest/runtime/pom.xml b/extensions/amazon-lambda-rest/runtime/pom.xml index 7e26ad8baf3d5..6238605770cc7 100644 --- a/extensions/amazon-lambda-rest/runtime/pom.xml +++ b/extensions/amazon-lambda-rest/runtime/pom.xml @@ -54,6 +54,9 @@ ${project.version} + + -AlegacyConfigRoot=true + diff --git a/extensions/amazon-lambda/common-deployment/pom.xml b/extensions/amazon-lambda/common-deployment/pom.xml index 9e34d9282e0ce..7fe8610d77ce2 100644 --- a/extensions/amazon-lambda/common-deployment/pom.xml +++ b/extensions/amazon-lambda/common-deployment/pom.xml @@ -58,6 +58,9 @@ ${project.version} + + -AlegacyConfigRoot=true + diff --git a/extensions/amazon-lambda/common-runtime/pom.xml b/extensions/amazon-lambda/common-runtime/pom.xml index b124bc0a031a7..0a2c726e6f54b 100644 --- a/extensions/amazon-lambda/common-runtime/pom.xml +++ b/extensions/amazon-lambda/common-runtime/pom.xml @@ -69,6 +69,9 @@ ${project.version} + + -AlegacyConfigRoot=true + diff --git a/extensions/amazon-lambda/deployment/pom.xml b/extensions/amazon-lambda/deployment/pom.xml index 8e5df28f1b6d4..cb1a17cd0d311 100644 --- a/extensions/amazon-lambda/deployment/pom.xml +++ b/extensions/amazon-lambda/deployment/pom.xml @@ -54,6 +54,9 @@ ${project.version} + + -AlegacyConfigRoot=true + diff --git a/extensions/amazon-lambda/runtime/pom.xml b/extensions/amazon-lambda/runtime/pom.xml index 3aa811071c3ee..f361bea1de811 100644 --- a/extensions/amazon-lambda/runtime/pom.xml +++ b/extensions/amazon-lambda/runtime/pom.xml @@ -48,6 +48,9 @@ ${project.version} + + -AlegacyConfigRoot=true + diff --git a/extensions/arc/deployment/pom.xml b/extensions/arc/deployment/pom.xml index 16ef31d3f3bb0..c2ca964605e22 100644 --- a/extensions/arc/deployment/pom.xml +++ b/extensions/arc/deployment/pom.xml @@ -70,6 +70,9 @@ ${project.version} + + -AlegacyConfigRoot=true + diff --git a/extensions/arc/runtime/pom.xml b/extensions/arc/runtime/pom.xml index 7888f77f9f8d8..e9dd01296be29 100644 --- a/extensions/arc/runtime/pom.xml +++ b/extensions/arc/runtime/pom.xml @@ -1,56 +1,59 @@ - - quarkus-arc-parent - io.quarkus - 999-SNAPSHOT - - 4.0.0 + xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" + xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 https://maven.apache.org/xsd/maven-4.0.0.xsd"> + + quarkus-arc-parent + io.quarkus + 999-SNAPSHOT + + 4.0.0 - quarkus-arc - Quarkus - ArC - Runtime - Build time CDI dependency injection + quarkus-arc + Quarkus - ArC - Runtime + Build time CDI dependency injection - - - io.quarkus.arc - arc - - - io.quarkus - quarkus-core - - - org.eclipse.microprofile.context-propagation - microprofile-context-propagation-api - - + + + io.quarkus.arc + arc + + + io.quarkus + quarkus-core + + + org.eclipse.microprofile.context-propagation + microprofile-context-propagation-api + + - - - - io.quarkus - quarkus-extension-maven-plugin - - - io.quarkus.cdi - - - - - maven-compiler-plugin - - - - io.quarkus - quarkus-extension-processor - ${project.version} - - - - - - + + + + io.quarkus + quarkus-extension-maven-plugin + + + io.quarkus.cdi + + + + + maven-compiler-plugin + + + + io.quarkus + quarkus-extension-processor + ${project.version} + + + + -AlegacyConfigRoot=true + + + + + diff --git a/extensions/azure-functions/deployment/pom.xml b/extensions/azure-functions/deployment/pom.xml index 762d28c3c190c..3ff2ca28028ba 100644 --- a/extensions/azure-functions/deployment/pom.xml +++ b/extensions/azure-functions/deployment/pom.xml @@ -129,6 +129,9 @@ ${project.version} + + -AlegacyConfigRoot=true + diff --git a/extensions/azure-functions/runtime/pom.xml b/extensions/azure-functions/runtime/pom.xml index 3dbb3a074311b..189d763ea6c88 100644 --- a/extensions/azure-functions/runtime/pom.xml +++ b/extensions/azure-functions/runtime/pom.xml @@ -50,6 +50,9 @@ ${project.version} + + -AlegacyConfigRoot=true + diff --git a/extensions/container-image/container-image-buildpack/deployment/pom.xml b/extensions/container-image/container-image-buildpack/deployment/pom.xml index 70a0a884e03e9..f2ea05fbe0cae 100644 --- a/extensions/container-image/container-image-buildpack/deployment/pom.xml +++ b/extensions/container-image/container-image-buildpack/deployment/pom.xml @@ -46,6 +46,9 @@ ${project.version} + + -AlegacyConfigRoot=true + diff --git a/extensions/container-image/container-image-buildpack/runtime/pom.xml b/extensions/container-image/container-image-buildpack/runtime/pom.xml index bb7dbdb3ab00a..0a1dba2c7061a 100644 --- a/extensions/container-image/container-image-buildpack/runtime/pom.xml +++ b/extensions/container-image/container-image-buildpack/runtime/pom.xml @@ -44,6 +44,9 @@ ${project.version} + + -AlegacyConfigRoot=true + diff --git a/extensions/container-image/container-image-jib/deployment/pom.xml b/extensions/container-image/container-image-jib/deployment/pom.xml index d595ade0ff69a..17bbc38acabab 100644 --- a/extensions/container-image/container-image-jib/deployment/pom.xml +++ b/extensions/container-image/container-image-jib/deployment/pom.xml @@ -44,9 +44,12 @@ ${project.version} + + -AlegacyConfigRoot=true + - \ No newline at end of file + diff --git a/extensions/container-image/container-image-jib/runtime/pom.xml b/extensions/container-image/container-image-jib/runtime/pom.xml index c7d96542aab16..7cfdabb0dcc3d 100644 --- a/extensions/container-image/container-image-jib/runtime/pom.xml +++ b/extensions/container-image/container-image-jib/runtime/pom.xml @@ -45,8 +45,11 @@ ${project.version} + + -AlegacyConfigRoot=true + - \ No newline at end of file + diff --git a/extensions/container-image/container-image-openshift/deployment/pom.xml b/extensions/container-image/container-image-openshift/deployment/pom.xml index f0c58f60fa958..ec6bdc68ff5f1 100644 --- a/extensions/container-image/container-image-openshift/deployment/pom.xml +++ b/extensions/container-image/container-image-openshift/deployment/pom.xml @@ -77,6 +77,9 @@ ${project.version} + + -AlegacyConfigRoot=true + diff --git a/extensions/container-image/container-image-openshift/runtime/pom.xml b/extensions/container-image/container-image-openshift/runtime/pom.xml index 3ef6d6f2a0850..cc7899b2d19a8 100644 --- a/extensions/container-image/container-image-openshift/runtime/pom.xml +++ b/extensions/container-image/container-image-openshift/runtime/pom.xml @@ -50,6 +50,9 @@ ${project.version} + + -AlegacyConfigRoot=true + diff --git a/extensions/container-image/deployment/pom.xml b/extensions/container-image/deployment/pom.xml index 142217295de67..ffdd352a34f21 100644 --- a/extensions/container-image/deployment/pom.xml +++ b/extensions/container-image/deployment/pom.xml @@ -56,6 +56,9 @@ ${project.version} + + -AlegacyConfigRoot=true + diff --git a/extensions/container-image/runtime/pom.xml b/extensions/container-image/runtime/pom.xml index a180709fc207d..1f074045a5a6a 100644 --- a/extensions/container-image/runtime/pom.xml +++ b/extensions/container-image/runtime/pom.xml @@ -46,6 +46,9 @@ ${project.version} + + -AlegacyConfigRoot=true + diff --git a/extensions/elasticsearch-rest-client-common/deployment/pom.xml b/extensions/elasticsearch-rest-client-common/deployment/pom.xml index 9439464ca2156..ff95ef33c0830 100644 --- a/extensions/elasticsearch-rest-client-common/deployment/pom.xml +++ b/extensions/elasticsearch-rest-client-common/deployment/pom.xml @@ -57,6 +57,9 @@ ${project.version} + + -AlegacyConfigRoot=true + diff --git a/extensions/elasticsearch-rest-client-common/runtime/pom.xml b/extensions/elasticsearch-rest-client-common/runtime/pom.xml index 152afd765989a..42e70be945f79 100644 --- a/extensions/elasticsearch-rest-client-common/runtime/pom.xml +++ b/extensions/elasticsearch-rest-client-common/runtime/pom.xml @@ -68,6 +68,9 @@ ${project.version} + + -AlegacyConfigRoot=true + diff --git a/extensions/elasticsearch-rest-client/deployment/pom.xml b/extensions/elasticsearch-rest-client/deployment/pom.xml index cec8af5407f64..dcba456c0c04c 100644 --- a/extensions/elasticsearch-rest-client/deployment/pom.xml +++ b/extensions/elasticsearch-rest-client/deployment/pom.xml @@ -66,6 +66,9 @@ ${project.version} + + -AlegacyConfigRoot=true + diff --git a/extensions/elasticsearch-rest-client/runtime/pom.xml b/extensions/elasticsearch-rest-client/runtime/pom.xml index 9b83daf603490..fc5d8ecfb3a4d 100644 --- a/extensions/elasticsearch-rest-client/runtime/pom.xml +++ b/extensions/elasticsearch-rest-client/runtime/pom.xml @@ -51,6 +51,9 @@ ${project.version} + + -AlegacyConfigRoot=true + diff --git a/extensions/flyway/deployment/pom.xml b/extensions/flyway/deployment/pom.xml index 326fbfe104686..3c1f451996e23 100644 --- a/extensions/flyway/deployment/pom.xml +++ b/extensions/flyway/deployment/pom.xml @@ -83,6 +83,9 @@ ${project.version} + + -AlegacyConfigRoot=true + diff --git a/extensions/flyway/runtime/pom.xml b/extensions/flyway/runtime/pom.xml index 39bd38b99022f..d0de449dced8d 100644 --- a/extensions/flyway/runtime/pom.xml +++ b/extensions/flyway/runtime/pom.xml @@ -78,6 +78,9 @@ ${project.version} + + -AlegacyConfigRoot=true + diff --git a/extensions/funqy/funqy-knative-events/deployment/pom.xml b/extensions/funqy/funqy-knative-events/deployment/pom.xml index 4c25454e815ad..74bd363b04f64 100644 --- a/extensions/funqy/funqy-knative-events/deployment/pom.xml +++ b/extensions/funqy/funqy-knative-events/deployment/pom.xml @@ -57,6 +57,9 @@ ${project.version} + + -AlegacyConfigRoot=true + diff --git a/extensions/funqy/funqy-knative-events/runtime/pom.xml b/extensions/funqy/funqy-knative-events/runtime/pom.xml index 6d311c76b3c86..32c3518f662cc 100644 --- a/extensions/funqy/funqy-knative-events/runtime/pom.xml +++ b/extensions/funqy/funqy-knative-events/runtime/pom.xml @@ -44,6 +44,9 @@ ${project.version} + + -AlegacyConfigRoot=true + diff --git a/extensions/funqy/funqy-server-common/deployment/pom.xml b/extensions/funqy/funqy-server-common/deployment/pom.xml index 6eb117a9babd6..b4c3366eb875c 100644 --- a/extensions/funqy/funqy-server-common/deployment/pom.xml +++ b/extensions/funqy/funqy-server-common/deployment/pom.xml @@ -44,6 +44,9 @@ ${project.version} + + -AlegacyConfigRoot=true + diff --git a/extensions/funqy/funqy-server-common/runtime/pom.xml b/extensions/funqy/funqy-server-common/runtime/pom.xml index 7f97e9665d7f4..06acbfaa9afb8 100644 --- a/extensions/funqy/funqy-server-common/runtime/pom.xml +++ b/extensions/funqy/funqy-server-common/runtime/pom.xml @@ -49,6 +49,9 @@ ${project.version} + + -AlegacyConfigRoot=true + diff --git a/extensions/google-cloud-functions/deployment/pom.xml b/extensions/google-cloud-functions/deployment/pom.xml index 750177b130f89..60a2204484876 100644 --- a/extensions/google-cloud-functions/deployment/pom.xml +++ b/extensions/google-cloud-functions/deployment/pom.xml @@ -40,9 +40,12 @@ ${project.version} + + -AlegacyConfigRoot=true + - \ No newline at end of file + diff --git a/extensions/google-cloud-functions/runtime/pom.xml b/extensions/google-cloud-functions/runtime/pom.xml index e57ccb38c5188..400198e1afba2 100644 --- a/extensions/google-cloud-functions/runtime/pom.xml +++ b/extensions/google-cloud-functions/runtime/pom.xml @@ -52,9 +52,12 @@ ${project.version} + + -AlegacyConfigRoot=true + - \ No newline at end of file + diff --git a/extensions/grpc/deployment/pom.xml b/extensions/grpc/deployment/pom.xml index 7bb95b5265906..5bc308b2424b1 100644 --- a/extensions/grpc/deployment/pom.xml +++ b/extensions/grpc/deployment/pom.xml @@ -156,6 +156,9 @@ ${project.version} + + -AlegacyConfigRoot=true + diff --git a/extensions/grpc/runtime/pom.xml b/extensions/grpc/runtime/pom.xml index b8e49742f0c44..28a72c291ac98 100644 --- a/extensions/grpc/runtime/pom.xml +++ b/extensions/grpc/runtime/pom.xml @@ -152,6 +152,9 @@ ${project.version} + + -AlegacyConfigRoot=true + diff --git a/extensions/infinispan-cache/deployment/pom.xml b/extensions/infinispan-cache/deployment/pom.xml index 9577d042bdd15..df5cc11be2e2a 100644 --- a/extensions/infinispan-cache/deployment/pom.xml +++ b/extensions/infinispan-cache/deployment/pom.xml @@ -54,6 +54,9 @@ ${project.version} + + -AlegacyConfigRoot=true + @@ -91,4 +94,4 @@ - \ No newline at end of file + diff --git a/extensions/infinispan-cache/runtime/pom.xml b/extensions/infinispan-cache/runtime/pom.xml index 5ae742d0b1b13..ab067a6180106 100644 --- a/extensions/infinispan-cache/runtime/pom.xml +++ b/extensions/infinispan-cache/runtime/pom.xml @@ -39,6 +39,9 @@ ${project.version} + + -AlegacyConfigRoot=true + diff --git a/extensions/infinispan-client/deployment/pom.xml b/extensions/infinispan-client/deployment/pom.xml index 3e915150c829a..30e38d54fb483 100644 --- a/extensions/infinispan-client/deployment/pom.xml +++ b/extensions/infinispan-client/deployment/pom.xml @@ -108,6 +108,9 @@ ${project.version} + + -AlegacyConfigRoot=true + diff --git a/extensions/infinispan-client/runtime/pom.xml b/extensions/infinispan-client/runtime/pom.xml index 5607869cac3e8..582e732f2190b 100644 --- a/extensions/infinispan-client/runtime/pom.xml +++ b/extensions/infinispan-client/runtime/pom.xml @@ -173,6 +173,9 @@ ${project.version} + + -AlegacyConfigRoot=true + diff --git a/extensions/jackson/deployment/pom.xml b/extensions/jackson/deployment/pom.xml index 68597280eeabb..dce12472f36ee 100644 --- a/extensions/jackson/deployment/pom.xml +++ b/extensions/jackson/deployment/pom.xml @@ -53,6 +53,9 @@ ${project.version} + + -AlegacyConfigRoot=true + diff --git a/extensions/jackson/runtime/pom.xml b/extensions/jackson/runtime/pom.xml index bd3e3a2159e33..0cfed83c76c06 100644 --- a/extensions/jackson/runtime/pom.xml +++ b/extensions/jackson/runtime/pom.xml @@ -61,6 +61,9 @@ ${project.version} + + -AlegacyConfigRoot=true + diff --git a/extensions/jaxb/deployment/pom.xml b/extensions/jaxb/deployment/pom.xml index e4cf5cd173d01..358a19aa6021a 100644 --- a/extensions/jaxb/deployment/pom.xml +++ b/extensions/jaxb/deployment/pom.xml @@ -53,6 +53,9 @@ ${project.version} + + -AlegacyConfigRoot=true + diff --git a/extensions/jaxb/runtime/pom.xml b/extensions/jaxb/runtime/pom.xml index 3bb778612c17b..e00894cfb5611 100644 --- a/extensions/jaxb/runtime/pom.xml +++ b/extensions/jaxb/runtime/pom.xml @@ -68,6 +68,9 @@ ${project.version} + + -AlegacyConfigRoot=true + diff --git a/extensions/kafka-client/deployment/pom.xml b/extensions/kafka-client/deployment/pom.xml index 9329e0e43e0ed..386074633b536 100644 --- a/extensions/kafka-client/deployment/pom.xml +++ b/extensions/kafka-client/deployment/pom.xml @@ -81,6 +81,9 @@ ${project.version} + + -AlegacyConfigRoot=true + diff --git a/extensions/kafka-client/runtime/pom.xml b/extensions/kafka-client/runtime/pom.xml index 5162715561574..91b804c269ba7 100644 --- a/extensions/kafka-client/runtime/pom.xml +++ b/extensions/kafka-client/runtime/pom.xml @@ -98,6 +98,9 @@ ${project.version} + + -AlegacyConfigRoot=true + diff --git a/extensions/kafka-streams/deployment/pom.xml b/extensions/kafka-streams/deployment/pom.xml index c8ed75033ec8e..4c1a79ee82c4c 100644 --- a/extensions/kafka-streams/deployment/pom.xml +++ b/extensions/kafka-streams/deployment/pom.xml @@ -63,6 +63,9 @@ ${project.version} + + -AlegacyConfigRoot=true + diff --git a/extensions/kafka-streams/runtime/pom.xml b/extensions/kafka-streams/runtime/pom.xml index 7f827c745b840..b6d7f288f4128 100644 --- a/extensions/kafka-streams/runtime/pom.xml +++ b/extensions/kafka-streams/runtime/pom.xml @@ -73,6 +73,9 @@ ${project.version} + + -AlegacyConfigRoot=true + diff --git a/extensions/kubernetes/vanilla/deployment/pom.xml b/extensions/kubernetes/vanilla/deployment/pom.xml index 40b8b5b205e41..fa6e216895b46 100644 --- a/extensions/kubernetes/vanilla/deployment/pom.xml +++ b/extensions/kubernetes/vanilla/deployment/pom.xml @@ -129,6 +129,9 @@ ${project.version} + + -AlegacyConfigRoot=true + diff --git a/extensions/kubernetes/vanilla/runtime/pom.xml b/extensions/kubernetes/vanilla/runtime/pom.xml index 1968e28fca58a..7fa0dbdb15066 100644 --- a/extensions/kubernetes/vanilla/runtime/pom.xml +++ b/extensions/kubernetes/vanilla/runtime/pom.xml @@ -42,6 +42,9 @@ ${project.version} + + -AlegacyConfigRoot=true + diff --git a/extensions/liquibase-mongodb/deployment/pom.xml b/extensions/liquibase-mongodb/deployment/pom.xml index a969686fade27..b87cdef7a15a5 100644 --- a/extensions/liquibase-mongodb/deployment/pom.xml +++ b/extensions/liquibase-mongodb/deployment/pom.xml @@ -39,6 +39,9 @@ ${project.version} + + -AlegacyConfigRoot=true + diff --git a/extensions/liquibase-mongodb/runtime/pom.xml b/extensions/liquibase-mongodb/runtime/pom.xml index 9e932f0198299..9f00d207b9a8c 100644 --- a/extensions/liquibase-mongodb/runtime/pom.xml +++ b/extensions/liquibase-mongodb/runtime/pom.xml @@ -72,6 +72,9 @@ ${project.version} + + -AlegacyConfigRoot=true + diff --git a/extensions/liquibase/deployment/pom.xml b/extensions/liquibase/deployment/pom.xml index 9c3ba43b1a015..68728814b1c92 100644 --- a/extensions/liquibase/deployment/pom.xml +++ b/extensions/liquibase/deployment/pom.xml @@ -71,6 +71,9 @@ ${project.version} + + -AlegacyConfigRoot=true + diff --git a/extensions/liquibase/runtime/pom.xml b/extensions/liquibase/runtime/pom.xml index d4dee6a275aab..20af4f5fc693b 100644 --- a/extensions/liquibase/runtime/pom.xml +++ b/extensions/liquibase/runtime/pom.xml @@ -90,6 +90,9 @@ ${project.version} + + -AlegacyConfigRoot=true + diff --git a/extensions/logging-gelf/deployment/pom.xml b/extensions/logging-gelf/deployment/pom.xml index a97fe15f580ab..7ff4da1f9fd1f 100644 --- a/extensions/logging-gelf/deployment/pom.xml +++ b/extensions/logging-gelf/deployment/pom.xml @@ -37,6 +37,9 @@ ${project.version} + + -AlegacyConfigRoot=true + diff --git a/extensions/logging-gelf/runtime/pom.xml b/extensions/logging-gelf/runtime/pom.xml index f5d1ee04d41a9..b8d387db6996b 100644 --- a/extensions/logging-gelf/runtime/pom.xml +++ b/extensions/logging-gelf/runtime/pom.xml @@ -47,6 +47,9 @@ ${project.version} + + -AlegacyConfigRoot=true + diff --git a/extensions/logging-json/deployment/pom.xml b/extensions/logging-json/deployment/pom.xml index 3b82e164cf231..1bec885ed0858 100644 --- a/extensions/logging-json/deployment/pom.xml +++ b/extensions/logging-json/deployment/pom.xml @@ -66,10 +66,13 @@ ${project.version} + + -AlegacyConfigRoot=true + - \ No newline at end of file + diff --git a/extensions/logging-json/runtime/pom.xml b/extensions/logging-json/runtime/pom.xml index a01ec677bc2ed..44da82977e855 100644 --- a/extensions/logging-json/runtime/pom.xml +++ b/extensions/logging-json/runtime/pom.xml @@ -55,6 +55,9 @@ ${project.version} + + -AlegacyConfigRoot=true + diff --git a/extensions/mailer/deployment/pom.xml b/extensions/mailer/deployment/pom.xml index 01951c2c43838..580a5bd54d98d 100644 --- a/extensions/mailer/deployment/pom.xml +++ b/extensions/mailer/deployment/pom.xml @@ -56,6 +56,9 @@ ${project.version} + + -AlegacyConfigRoot=true + diff --git a/extensions/mailer/runtime/pom.xml b/extensions/mailer/runtime/pom.xml index fd2304e6a1034..09d472852f87d 100644 --- a/extensions/mailer/runtime/pom.xml +++ b/extensions/mailer/runtime/pom.xml @@ -92,6 +92,9 @@ ${project.version} + + -AlegacyConfigRoot=true + diff --git a/extensions/micrometer/deployment/pom.xml b/extensions/micrometer/deployment/pom.xml index 6eaf232ba1a3d..bf7df9e9b6988 100644 --- a/extensions/micrometer/deployment/pom.xml +++ b/extensions/micrometer/deployment/pom.xml @@ -168,6 +168,9 @@ ${project.version} + + -AlegacyConfigRoot=true + diff --git a/extensions/micrometer/runtime/pom.xml b/extensions/micrometer/runtime/pom.xml index 0393d7b9cd89c..878a5e9c4d44c 100644 --- a/extensions/micrometer/runtime/pom.xml +++ b/extensions/micrometer/runtime/pom.xml @@ -172,6 +172,9 @@ ${project.version} + + -AlegacyConfigRoot=true + diff --git a/extensions/mongodb-client/deployment/pom.xml b/extensions/mongodb-client/deployment/pom.xml index ad80149825900..904e27de62bce 100644 --- a/extensions/mongodb-client/deployment/pom.xml +++ b/extensions/mongodb-client/deployment/pom.xml @@ -116,6 +116,9 @@ ${project.version} + + -AlegacyConfigRoot=true + diff --git a/extensions/mongodb-client/runtime/pom.xml b/extensions/mongodb-client/runtime/pom.xml index 408d5efd30210..c2fb0e9e18741 100644 --- a/extensions/mongodb-client/runtime/pom.xml +++ b/extensions/mongodb-client/runtime/pom.xml @@ -153,6 +153,9 @@ ${project.version} + + -AlegacyConfigRoot=true + diff --git a/extensions/narayana-jta/deployment/pom.xml b/extensions/narayana-jta/deployment/pom.xml index ced79bdff9fb4..995ccd2508b4c 100644 --- a/extensions/narayana-jta/deployment/pom.xml +++ b/extensions/narayana-jta/deployment/pom.xml @@ -52,6 +52,9 @@ ${project.version} + + -AlegacyConfigRoot=true + diff --git a/extensions/narayana-jta/runtime/pom.xml b/extensions/narayana-jta/runtime/pom.xml index 730b86416c880..3bac9cae29f68 100644 --- a/extensions/narayana-jta/runtime/pom.xml +++ b/extensions/narayana-jta/runtime/pom.xml @@ -117,6 +117,9 @@ ${project.version} + + -AlegacyConfigRoot=true + diff --git a/extensions/narayana-lra/deployment/pom.xml b/extensions/narayana-lra/deployment/pom.xml index e7b6565cd24af..c21863adc7bbb 100644 --- a/extensions/narayana-lra/deployment/pom.xml +++ b/extensions/narayana-lra/deployment/pom.xml @@ -64,6 +64,9 @@ ${project.version} + + -AlegacyConfigRoot=true + diff --git a/extensions/narayana-lra/runtime/pom.xml b/extensions/narayana-lra/runtime/pom.xml index d508f17cf3c8e..1503de2a01631 100644 --- a/extensions/narayana-lra/runtime/pom.xml +++ b/extensions/narayana-lra/runtime/pom.xml @@ -89,6 +89,9 @@ ${project.version} + + -AlegacyConfigRoot=true + diff --git a/extensions/netty/deployment/pom.xml b/extensions/netty/deployment/pom.xml index 222d693dd417b..fbed3a4e867c8 100644 --- a/extensions/netty/deployment/pom.xml +++ b/extensions/netty/deployment/pom.xml @@ -39,6 +39,9 @@ ${project.version} + + -AlegacyConfigRoot=true + diff --git a/extensions/netty/runtime/pom.xml b/extensions/netty/runtime/pom.xml index 3ff1dbab97ebf..903fae912f0ee 100644 --- a/extensions/netty/runtime/pom.xml +++ b/extensions/netty/runtime/pom.xml @@ -88,6 +88,9 @@ ${project.version} + + -AlegacyConfigRoot=true + diff --git a/extensions/oidc-client/deployment/pom.xml b/extensions/oidc-client/deployment/pom.xml index 574a030bb0768..acdc840e03768 100644 --- a/extensions/oidc-client/deployment/pom.xml +++ b/extensions/oidc-client/deployment/pom.xml @@ -114,6 +114,9 @@ ${project.version} + + -AlegacyConfigRoot=true + diff --git a/extensions/oidc-client/runtime/pom.xml b/extensions/oidc-client/runtime/pom.xml index 2f643077b4cfa..61270c3bbc3bb 100644 --- a/extensions/oidc-client/runtime/pom.xml +++ b/extensions/oidc-client/runtime/pom.xml @@ -48,6 +48,9 @@ ${project.version} + + -AlegacyConfigRoot=true + diff --git a/extensions/oidc/deployment/pom.xml b/extensions/oidc/deployment/pom.xml index 34490f5d691d1..7bca0a28f535d 100644 --- a/extensions/oidc/deployment/pom.xml +++ b/extensions/oidc/deployment/pom.xml @@ -125,6 +125,9 @@ ${project.version} + + -AlegacyConfigRoot=true + diff --git a/extensions/oidc/runtime/pom.xml b/extensions/oidc/runtime/pom.xml index 1c5145df46d56..c50be32b3913f 100644 --- a/extensions/oidc/runtime/pom.xml +++ b/extensions/oidc/runtime/pom.xml @@ -78,6 +78,9 @@ ${project.version} + + -AlegacyConfigRoot=true + diff --git a/extensions/picocli/deployment/pom.xml b/extensions/picocli/deployment/pom.xml index d269e2245c640..38fe04628dabf 100644 --- a/extensions/picocli/deployment/pom.xml +++ b/extensions/picocli/deployment/pom.xml @@ -52,6 +52,9 @@ ${project.version} + + -AlegacyConfigRoot=true + diff --git a/extensions/picocli/runtime/pom.xml b/extensions/picocli/runtime/pom.xml index 21580227a05e4..deff2f00a8be1 100644 --- a/extensions/picocli/runtime/pom.xml +++ b/extensions/picocli/runtime/pom.xml @@ -62,6 +62,9 @@ ${project.version} + + -AlegacyConfigRoot=true + diff --git a/extensions/quartz/deployment/pom.xml b/extensions/quartz/deployment/pom.xml index 7dc4e797cfb5f..49f28a02297a3 100644 --- a/extensions/quartz/deployment/pom.xml +++ b/extensions/quartz/deployment/pom.xml @@ -69,6 +69,9 @@ ${project.version} + + -AlegacyConfigRoot=true + diff --git a/extensions/quartz/runtime/pom.xml b/extensions/quartz/runtime/pom.xml index 5b8b60e382cad..40c2e8b4b39fb 100644 --- a/extensions/quartz/runtime/pom.xml +++ b/extensions/quartz/runtime/pom.xml @@ -89,6 +89,9 @@ ${project.version} + + -AlegacyConfigRoot=true + diff --git a/extensions/qute/deployment/pom.xml b/extensions/qute/deployment/pom.xml index 5f660d98c70a1..9b3491c4e8640 100644 --- a/extensions/qute/deployment/pom.xml +++ b/extensions/qute/deployment/pom.xml @@ -77,6 +77,9 @@ ${project.version} + + -AlegacyConfigRoot=true + diff --git a/extensions/qute/runtime/pom.xml b/extensions/qute/runtime/pom.xml index f6b3e3a03b3d3..8203cef39bdc5 100644 --- a/extensions/qute/runtime/pom.xml +++ b/extensions/qute/runtime/pom.xml @@ -54,6 +54,9 @@ ${project.version} + + -AlegacyConfigRoot=true + diff --git a/extensions/redis-cache/deployment/pom.xml b/extensions/redis-cache/deployment/pom.xml index 078f0184d1cf2..e65d5ce1b8b34 100644 --- a/extensions/redis-cache/deployment/pom.xml +++ b/extensions/redis-cache/deployment/pom.xml @@ -71,6 +71,9 @@ ${project.version} + + -AlegacyConfigRoot=true + diff --git a/extensions/redis-cache/runtime/pom.xml b/extensions/redis-cache/runtime/pom.xml index 860e13e5aa0be..832c4b9e8aae7 100644 --- a/extensions/redis-cache/runtime/pom.xml +++ b/extensions/redis-cache/runtime/pom.xml @@ -73,6 +73,9 @@ ${project.version} + + -AlegacyConfigRoot=true + diff --git a/extensions/resteasy-classic/rest-client-config/deployment/pom.xml b/extensions/resteasy-classic/rest-client-config/deployment/pom.xml index ae70e2be717c0..0c513daec5722 100644 --- a/extensions/resteasy-classic/rest-client-config/deployment/pom.xml +++ b/extensions/resteasy-classic/rest-client-config/deployment/pom.xml @@ -51,6 +51,9 @@ ${project.version} + + -AlegacyConfigRoot=true + diff --git a/extensions/resteasy-classic/rest-client-config/runtime/pom.xml b/extensions/resteasy-classic/rest-client-config/runtime/pom.xml index bc57bd9e0e7db..152da7b3ae5fa 100644 --- a/extensions/resteasy-classic/rest-client-config/runtime/pom.xml +++ b/extensions/resteasy-classic/rest-client-config/runtime/pom.xml @@ -64,6 +64,9 @@ ${project.version} + + -AlegacyConfigRoot=true + diff --git a/extensions/resteasy-classic/resteasy-common/deployment/pom.xml b/extensions/resteasy-classic/resteasy-common/deployment/pom.xml index d861d5432e1c2..adb80b72504b1 100644 --- a/extensions/resteasy-classic/resteasy-common/deployment/pom.xml +++ b/extensions/resteasy-classic/resteasy-common/deployment/pom.xml @@ -43,6 +43,9 @@ ${project.version} + + -AlegacyConfigRoot=true + diff --git a/extensions/resteasy-classic/resteasy-common/runtime/pom.xml b/extensions/resteasy-classic/resteasy-common/runtime/pom.xml index 59c117aedb45a..2824c70817b88 100644 --- a/extensions/resteasy-classic/resteasy-common/runtime/pom.xml +++ b/extensions/resteasy-classic/resteasy-common/runtime/pom.xml @@ -124,6 +124,9 @@ ${project.version} + + -AlegacyConfigRoot=true + diff --git a/extensions/resteasy-classic/resteasy-multipart/deployment/pom.xml b/extensions/resteasy-classic/resteasy-multipart/deployment/pom.xml index 1e63133e08d3d..71cd40e5dccef 100644 --- a/extensions/resteasy-classic/resteasy-multipart/deployment/pom.xml +++ b/extensions/resteasy-classic/resteasy-multipart/deployment/pom.xml @@ -50,6 +50,9 @@ ${project.version} + + -AlegacyConfigRoot=true + diff --git a/extensions/resteasy-classic/resteasy-multipart/runtime/pom.xml b/extensions/resteasy-classic/resteasy-multipart/runtime/pom.xml index 7b8e9a1e0dc3d..a2c4da1673a92 100644 --- a/extensions/resteasy-classic/resteasy-multipart/runtime/pom.xml +++ b/extensions/resteasy-classic/resteasy-multipart/runtime/pom.xml @@ -70,6 +70,9 @@ ${project.version} + + -AlegacyConfigRoot=true + diff --git a/extensions/resteasy-classic/resteasy-server-common/deployment/pom.xml b/extensions/resteasy-classic/resteasy-server-common/deployment/pom.xml index 98168579b21d6..01b1f654d61f1 100644 --- a/extensions/resteasy-classic/resteasy-server-common/deployment/pom.xml +++ b/extensions/resteasy-classic/resteasy-server-common/deployment/pom.xml @@ -55,6 +55,9 @@ ${project.version} + + -AlegacyConfigRoot=true + diff --git a/extensions/resteasy-classic/resteasy-server-common/runtime/pom.xml b/extensions/resteasy-classic/resteasy-server-common/runtime/pom.xml index a5e599747b728..ef7d0ccae022f 100644 --- a/extensions/resteasy-classic/resteasy-server-common/runtime/pom.xml +++ b/extensions/resteasy-classic/resteasy-server-common/runtime/pom.xml @@ -51,6 +51,9 @@ ${project.version} + + -AlegacyConfigRoot=true + diff --git a/extensions/resteasy-classic/resteasy/deployment/pom.xml b/extensions/resteasy-classic/resteasy/deployment/pom.xml index 7b59037cea38d..5f445d3dc6959 100644 --- a/extensions/resteasy-classic/resteasy/deployment/pom.xml +++ b/extensions/resteasy-classic/resteasy/deployment/pom.xml @@ -104,6 +104,9 @@ ${project.version} + + -AlegacyConfigRoot=true + diff --git a/extensions/resteasy-classic/resteasy/runtime/pom.xml b/extensions/resteasy-classic/resteasy/runtime/pom.xml index e3a868763b42e..78c521d5f2f0a 100644 --- a/extensions/resteasy-classic/resteasy/runtime/pom.xml +++ b/extensions/resteasy-classic/resteasy/runtime/pom.xml @@ -62,6 +62,9 @@ ${project.version} + + -AlegacyConfigRoot=true + diff --git a/extensions/resteasy-reactive/rest-client/deployment/pom.xml b/extensions/resteasy-reactive/rest-client/deployment/pom.xml index 5809e48efd730..33805881ccb67 100644 --- a/extensions/resteasy-reactive/rest-client/deployment/pom.xml +++ b/extensions/resteasy-reactive/rest-client/deployment/pom.xml @@ -125,6 +125,9 @@ ${project.version} + + -AlegacyConfigRoot=true + diff --git a/extensions/resteasy-reactive/rest-client/runtime/pom.xml b/extensions/resteasy-reactive/rest-client/runtime/pom.xml index 73cb9951b3adf..40b271597b197 100644 --- a/extensions/resteasy-reactive/rest-client/runtime/pom.xml +++ b/extensions/resteasy-reactive/rest-client/runtime/pom.xml @@ -106,6 +106,9 @@ ${project.version} + + -AlegacyConfigRoot=true + diff --git a/extensions/resteasy-reactive/rest-csrf/deployment/pom.xml b/extensions/resteasy-reactive/rest-csrf/deployment/pom.xml index 886cff45f93e1..6d8a01a430c4d 100644 --- a/extensions/resteasy-reactive/rest-csrf/deployment/pom.xml +++ b/extensions/resteasy-reactive/rest-csrf/deployment/pom.xml @@ -62,6 +62,9 @@ ${project.version} + + -AlegacyConfigRoot=true + diff --git a/extensions/resteasy-reactive/rest-csrf/runtime/pom.xml b/extensions/resteasy-reactive/rest-csrf/runtime/pom.xml index 6888b213beaaf..d1e3dec92eb66 100644 --- a/extensions/resteasy-reactive/rest-csrf/runtime/pom.xml +++ b/extensions/resteasy-reactive/rest-csrf/runtime/pom.xml @@ -52,6 +52,9 @@ ${project.version} + + -AlegacyConfigRoot=true + diff --git a/extensions/resteasy-reactive/rest-kotlin-serialization-common/deployment/pom.xml b/extensions/resteasy-reactive/rest-kotlin-serialization-common/deployment/pom.xml index 0f5faf7f1d8b8..e59a79613f73f 100644 --- a/extensions/resteasy-reactive/rest-kotlin-serialization-common/deployment/pom.xml +++ b/extensions/resteasy-reactive/rest-kotlin-serialization-common/deployment/pom.xml @@ -108,6 +108,9 @@ ${project.version} + + -AlegacyConfigRoot=true + diff --git a/extensions/resteasy-reactive/rest-kotlin-serialization-common/runtime/pom.xml b/extensions/resteasy-reactive/rest-kotlin-serialization-common/runtime/pom.xml index 04f6ff2b10618..16bee8dee1d5f 100644 --- a/extensions/resteasy-reactive/rest-kotlin-serialization-common/runtime/pom.xml +++ b/extensions/resteasy-reactive/rest-kotlin-serialization-common/runtime/pom.xml @@ -104,6 +104,9 @@ ${project.version} + + -AlegacyConfigRoot=true + diff --git a/extensions/scheduler/deployment/pom.xml b/extensions/scheduler/deployment/pom.xml index 8082201f010c5..eb93c53980248 100644 --- a/extensions/scheduler/deployment/pom.xml +++ b/extensions/scheduler/deployment/pom.xml @@ -67,20 +67,23 @@ - - - - maven-compiler-plugin - - - - io.quarkus - quarkus-extension-processor - ${project.version} - - - - - - + + + + maven-compiler-plugin + + + + io.quarkus + quarkus-extension-processor + ${project.version} + + + + -AlegacyConfigRoot=true + + + + + diff --git a/extensions/scheduler/runtime/pom.xml b/extensions/scheduler/runtime/pom.xml index a2efebebfb61a..f3111efc5686a 100644 --- a/extensions/scheduler/runtime/pom.xml +++ b/extensions/scheduler/runtime/pom.xml @@ -66,6 +66,9 @@ ${project.version} + + -AlegacyConfigRoot=true + diff --git a/extensions/schema-registry/devservice/deployment/pom.xml b/extensions/schema-registry/devservice/deployment/pom.xml index e9d4bc9dc7df7..609bf0c0fcb26 100644 --- a/extensions/schema-registry/devservice/deployment/pom.xml +++ b/extensions/schema-registry/devservice/deployment/pom.xml @@ -47,6 +47,9 @@ ${project.version} + + -AlegacyConfigRoot=true + diff --git a/extensions/schema-registry/devservice/runtime/pom.xml b/extensions/schema-registry/devservice/runtime/pom.xml index a9008082c9df4..7d46afa0d1ade 100644 --- a/extensions/schema-registry/devservice/runtime/pom.xml +++ b/extensions/schema-registry/devservice/runtime/pom.xml @@ -25,4 +25,23 @@ + + + + maven-compiler-plugin + + + + io.quarkus + quarkus-extension-processor + ${project.version} + + + + -AlegacyConfigRoot=true + + + + + diff --git a/extensions/smallrye-graphql-client/deployment/pom.xml b/extensions/smallrye-graphql-client/deployment/pom.xml index 461bf63e8dc18..edcea2c17f76f 100644 --- a/extensions/smallrye-graphql-client/deployment/pom.xml +++ b/extensions/smallrye-graphql-client/deployment/pom.xml @@ -96,6 +96,9 @@ ${project.version} + + -AlegacyConfigRoot=true + diff --git a/extensions/smallrye-graphql-client/runtime/pom.xml b/extensions/smallrye-graphql-client/runtime/pom.xml index c0d0087a8cc88..b7b40a8156e55 100644 --- a/extensions/smallrye-graphql-client/runtime/pom.xml +++ b/extensions/smallrye-graphql-client/runtime/pom.xml @@ -79,6 +79,9 @@ ${project.version} + + -AlegacyConfigRoot=true + diff --git a/extensions/smallrye-graphql/deployment/pom.xml b/extensions/smallrye-graphql/deployment/pom.xml index 6047b82a6c7d9..322b883952e64 100644 --- a/extensions/smallrye-graphql/deployment/pom.xml +++ b/extensions/smallrye-graphql/deployment/pom.xml @@ -103,6 +103,9 @@ ${project.version} + + -AlegacyConfigRoot=true + diff --git a/extensions/smallrye-graphql/runtime/pom.xml b/extensions/smallrye-graphql/runtime/pom.xml index a8d85f9d4b941..5c61c87aad66d 100644 --- a/extensions/smallrye-graphql/runtime/pom.xml +++ b/extensions/smallrye-graphql/runtime/pom.xml @@ -83,6 +83,9 @@ ${project.version} + + -AlegacyConfigRoot=true + diff --git a/extensions/smallrye-health/deployment/pom.xml b/extensions/smallrye-health/deployment/pom.xml index 500367c3c058d..05778f6b226f4 100644 --- a/extensions/smallrye-health/deployment/pom.xml +++ b/extensions/smallrye-health/deployment/pom.xml @@ -80,6 +80,9 @@ ${project.version} + + -AlegacyConfigRoot=true + diff --git a/extensions/smallrye-health/runtime/pom.xml b/extensions/smallrye-health/runtime/pom.xml index 434148658bc78..d80d1322b08f2 100644 --- a/extensions/smallrye-health/runtime/pom.xml +++ b/extensions/smallrye-health/runtime/pom.xml @@ -63,6 +63,9 @@ ${project.version} + + -AlegacyConfigRoot=true + diff --git a/extensions/smallrye-metrics/deployment/pom.xml b/extensions/smallrye-metrics/deployment/pom.xml index 78ba1141d8e43..bfabad7160204 100644 --- a/extensions/smallrye-metrics/deployment/pom.xml +++ b/extensions/smallrye-metrics/deployment/pom.xml @@ -90,6 +90,9 @@ ${project.version} + + -AlegacyConfigRoot=true + diff --git a/extensions/smallrye-metrics/runtime/pom.xml b/extensions/smallrye-metrics/runtime/pom.xml index d7adcdedcc2ef..d652cbc5c7850 100644 --- a/extensions/smallrye-metrics/runtime/pom.xml +++ b/extensions/smallrye-metrics/runtime/pom.xml @@ -72,6 +72,9 @@ ${project.version} + + -AlegacyConfigRoot=true + diff --git a/extensions/smallrye-openapi-common/deployment/pom.xml b/extensions/smallrye-openapi-common/deployment/pom.xml index a3b59fa1c61d0..a91915c45fa85 100644 --- a/extensions/smallrye-openapi-common/deployment/pom.xml +++ b/extensions/smallrye-openapi-common/deployment/pom.xml @@ -31,6 +31,9 @@ ${project.version} + + -AlegacyConfigRoot=true + diff --git a/extensions/smallrye-openapi/deployment/pom.xml b/extensions/smallrye-openapi/deployment/pom.xml index ef8c47584ddc4..cefb64b284b82 100644 --- a/extensions/smallrye-openapi/deployment/pom.xml +++ b/extensions/smallrye-openapi/deployment/pom.xml @@ -1,119 +1,122 @@ - - quarkus-smallrye-openapi-parent - io.quarkus - 999-SNAPSHOT - - 4.0.0 + xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" + xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 https://maven.apache.org/xsd/maven-4.0.0.xsd"> + + quarkus-smallrye-openapi-parent + io.quarkus + 999-SNAPSHOT + + 4.0.0 - quarkus-smallrye-openapi-deployment - Quarkus - SmallRye OpenAPI - Deployment + quarkus-smallrye-openapi-deployment + Quarkus - SmallRye OpenAPI - Deployment - - - io.quarkus - quarkus-core-deployment - - - io.quarkus - quarkus-vertx-http-deployment - - - io.quarkus - quarkus-vertx-http-dev-ui-spi - - - io.quarkus - quarkus-smallrye-openapi-spi - - - io.quarkus - quarkus-resteasy-server-common-spi - - - io.quarkus - quarkus-resteasy-common-spi - - - io.quarkus - quarkus-arc-deployment - - - io.quarkus - quarkus-smallrye-openapi-common-deployment - - - io.quarkus - quarkus-swagger-ui-deployment - - - io.quarkus - quarkus-smallrye-openapi - - - io.smallrye - smallrye-open-api-jaxrs - - - io.smallrye - smallrye-open-api-spring - - - io.smallrye - smallrye-open-api-vertx - + + + io.quarkus + quarkus-core-deployment + + + io.quarkus + quarkus-vertx-http-deployment + + + io.quarkus + quarkus-vertx-http-dev-ui-spi + + + io.quarkus + quarkus-smallrye-openapi-spi + + + io.quarkus + quarkus-resteasy-server-common-spi + + + io.quarkus + quarkus-resteasy-common-spi + + + io.quarkus + quarkus-arc-deployment + + + io.quarkus + quarkus-smallrye-openapi-common-deployment + + + io.quarkus + quarkus-swagger-ui-deployment + + + io.quarkus + quarkus-smallrye-openapi + + + io.smallrye + smallrye-open-api-jaxrs + + + io.smallrye + smallrye-open-api-spring + + + io.smallrye + smallrye-open-api-vertx + - - - io.quarkus - quarkus-rest-deployment - test - - - io.quarkus - quarkus-reactive-routes-deployment - test - - - io.quarkus - quarkus-junit5-internal - test - - - io.rest-assured - rest-assured - test - - - org.mockito - mockito-core - test - - - jakarta.ws.rs - jakarta.ws.rs-api - test - - + + + io.quarkus + quarkus-rest-deployment + test + + + io.quarkus + quarkus-reactive-routes-deployment + test + + + io.quarkus + quarkus-junit5-internal + test + + + io.rest-assured + rest-assured + test + + + org.mockito + mockito-core + test + + + jakarta.ws.rs + jakarta.ws.rs-api + test + + - - - - maven-compiler-plugin - - - - io.quarkus - quarkus-extension-processor - ${project.version} - - - - - - + + + + maven-compiler-plugin + + + + io.quarkus + quarkus-extension-processor + ${project.version} + + + + -AlegacyConfigRoot=true + + + + + diff --git a/extensions/smallrye-openapi/runtime/pom.xml b/extensions/smallrye-openapi/runtime/pom.xml index f74a7e256135e..950b0f1f7f6aa 100644 --- a/extensions/smallrye-openapi/runtime/pom.xml +++ b/extensions/smallrye-openapi/runtime/pom.xml @@ -1,64 +1,67 @@ - - quarkus-smallrye-openapi-parent - io.quarkus - 999-SNAPSHOT - - 4.0.0 + xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" + xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 https://maven.apache.org/xsd/maven-4.0.0.xsd"> + + quarkus-smallrye-openapi-parent + io.quarkus + 999-SNAPSHOT + + 4.0.0 - quarkus-smallrye-openapi - Quarkus - SmallRye OpenAPI - Runtime - Document your REST APIs with OpenAPI - comes with Swagger UI + quarkus-smallrye-openapi + Quarkus - SmallRye OpenAPI - Runtime + Document your REST APIs with OpenAPI - comes with Swagger UI - - - io.smallrye - smallrye-open-api-core - - - io.quarkus - quarkus-core - - - io.quarkus - quarkus-vertx-http - - - io.quarkus - quarkus-arc - - - io.quarkus - quarkus-swagger-ui - - + + + io.smallrye + smallrye-open-api-core + + + io.quarkus + quarkus-core + + + io.quarkus + quarkus-vertx-http + + + io.quarkus + quarkus-arc + + + io.quarkus + quarkus-swagger-ui + + - - - - io.quarkus - quarkus-extension-maven-plugin - - - io.quarkus.smallrye.openapi - - - - - maven-compiler-plugin - - - - io.quarkus - quarkus-extension-processor - ${project.version} - - - - - - + + + + io.quarkus + quarkus-extension-maven-plugin + + + io.quarkus.smallrye.openapi + + + + + maven-compiler-plugin + + + + io.quarkus + quarkus-extension-processor + ${project.version} + + + + -AlegacyConfigRoot=true + + + + + diff --git a/extensions/smallrye-reactive-messaging-amqp/deployment/pom.xml b/extensions/smallrye-reactive-messaging-amqp/deployment/pom.xml index 7924dd5684e4e..f04c6355416e6 100644 --- a/extensions/smallrye-reactive-messaging-amqp/deployment/pom.xml +++ b/extensions/smallrye-reactive-messaging-amqp/deployment/pom.xml @@ -109,6 +109,9 @@ ${project.version} + + -AlegacyConfigRoot=true + diff --git a/extensions/smallrye-reactive-messaging-amqp/runtime/pom.xml b/extensions/smallrye-reactive-messaging-amqp/runtime/pom.xml index a86915d0d5a7e..268772194e62d 100644 --- a/extensions/smallrye-reactive-messaging-amqp/runtime/pom.xml +++ b/extensions/smallrye-reactive-messaging-amqp/runtime/pom.xml @@ -74,6 +74,9 @@ ${project.version} + + -AlegacyConfigRoot=true + diff --git a/extensions/smallrye-reactive-messaging-kafka/deployment/pom.xml b/extensions/smallrye-reactive-messaging-kafka/deployment/pom.xml index ee98dc61ef876..22309bb2e41f6 100644 --- a/extensions/smallrye-reactive-messaging-kafka/deployment/pom.xml +++ b/extensions/smallrye-reactive-messaging-kafka/deployment/pom.xml @@ -116,6 +116,9 @@ ${project.version} + + -AlegacyConfigRoot=true + diff --git a/extensions/smallrye-reactive-messaging-kafka/runtime/pom.xml b/extensions/smallrye-reactive-messaging-kafka/runtime/pom.xml index 9ffefc05881a1..1cd78f6002db4 100644 --- a/extensions/smallrye-reactive-messaging-kafka/runtime/pom.xml +++ b/extensions/smallrye-reactive-messaging-kafka/runtime/pom.xml @@ -87,6 +87,9 @@ ${project.version} + + -AlegacyConfigRoot=true + diff --git a/extensions/smallrye-reactive-messaging-mqtt/deployment/pom.xml b/extensions/smallrye-reactive-messaging-mqtt/deployment/pom.xml index 6a7e072646ff0..a9b6ef67c3d9f 100644 --- a/extensions/smallrye-reactive-messaging-mqtt/deployment/pom.xml +++ b/extensions/smallrye-reactive-messaging-mqtt/deployment/pom.xml @@ -70,6 +70,9 @@ ${project.version} + + -AlegacyConfigRoot=true + diff --git a/extensions/smallrye-reactive-messaging-mqtt/runtime/pom.xml b/extensions/smallrye-reactive-messaging-mqtt/runtime/pom.xml index 8fa79a139df82..5ea09f9be0dc7 100644 --- a/extensions/smallrye-reactive-messaging-mqtt/runtime/pom.xml +++ b/extensions/smallrye-reactive-messaging-mqtt/runtime/pom.xml @@ -70,6 +70,9 @@ ${project.version} + + -AlegacyConfigRoot=true + diff --git a/extensions/smallrye-reactive-messaging-pulsar/deployment/pom.xml b/extensions/smallrye-reactive-messaging-pulsar/deployment/pom.xml index 7fe0775136ff7..ad67ecc54ce40 100644 --- a/extensions/smallrye-reactive-messaging-pulsar/deployment/pom.xml +++ b/extensions/smallrye-reactive-messaging-pulsar/deployment/pom.xml @@ -108,6 +108,9 @@ ${project.version} + + -AlegacyConfigRoot=true + diff --git a/extensions/smallrye-reactive-messaging-pulsar/runtime/pom.xml b/extensions/smallrye-reactive-messaging-pulsar/runtime/pom.xml index b700040e0157c..c9dcf4c6126fa 100644 --- a/extensions/smallrye-reactive-messaging-pulsar/runtime/pom.xml +++ b/extensions/smallrye-reactive-messaging-pulsar/runtime/pom.xml @@ -154,6 +154,9 @@ ${project.version} + + -AlegacyConfigRoot=true + diff --git a/extensions/smallrye-reactive-messaging-rabbitmq/deployment/pom.xml b/extensions/smallrye-reactive-messaging-rabbitmq/deployment/pom.xml index 333f46d4c14ed..246b152cbd5cf 100644 --- a/extensions/smallrye-reactive-messaging-rabbitmq/deployment/pom.xml +++ b/extensions/smallrye-reactive-messaging-rabbitmq/deployment/pom.xml @@ -88,6 +88,9 @@ ${project.version} + + -AlegacyConfigRoot=true + diff --git a/extensions/smallrye-reactive-messaging-rabbitmq/runtime/pom.xml b/extensions/smallrye-reactive-messaging-rabbitmq/runtime/pom.xml index 120da89852860..d38fdc13e0b60 100644 --- a/extensions/smallrye-reactive-messaging-rabbitmq/runtime/pom.xml +++ b/extensions/smallrye-reactive-messaging-rabbitmq/runtime/pom.xml @@ -78,6 +78,9 @@ ${project.version} + + -AlegacyConfigRoot=true + diff --git a/extensions/smallrye-reactive-messaging/deployment/pom.xml b/extensions/smallrye-reactive-messaging/deployment/pom.xml index 2de388adb375a..39e576b650e7e 100644 --- a/extensions/smallrye-reactive-messaging/deployment/pom.xml +++ b/extensions/smallrye-reactive-messaging/deployment/pom.xml @@ -1,108 +1,111 @@ - - quarkus-messaging-parent - io.quarkus - 999-SNAPSHOT - + xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" + xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 https://maven.apache.org/xsd/maven-4.0.0.xsd"> + + quarkus-messaging-parent + io.quarkus + 999-SNAPSHOT + - 4.0.0 + 4.0.0 - quarkus-messaging-deployment - Quarkus - Messaging - Deployment + quarkus-messaging-deployment + Quarkus - Messaging - Deployment - - - io.quarkus - quarkus-core-deployment - - - io.quarkus - quarkus-arc-deployment - - - io.quarkus - quarkus-messaging - - - io.quarkus - quarkus-smallrye-health-spi - - - io.quarkus - quarkus-mutiny-reactive-streams-operators-deployment - - - io.quarkus - quarkus-vertx-deployment - - - io.quarkus - quarkus-virtual-threads-deployment - - - org.commonmark - commonmark - - - io.quarkus - quarkus-vertx-http-dev-ui-spi - + + + io.quarkus + quarkus-core-deployment + + + io.quarkus + quarkus-arc-deployment + + + io.quarkus + quarkus-messaging + + + io.quarkus + quarkus-smallrye-health-spi + + + io.quarkus + quarkus-mutiny-reactive-streams-operators-deployment + + + io.quarkus + quarkus-vertx-deployment + + + io.quarkus + quarkus-virtual-threads-deployment + + + org.commonmark + commonmark + + + io.quarkus + quarkus-vertx-http-dev-ui-spi + - - io.quarkus - quarkus-vertx-http-deployment - test - - - com.fasterxml.jackson.core - jackson-databind - test - + + io.quarkus + quarkus-vertx-http-deployment + test + + + com.fasterxml.jackson.core + jackson-databind + test + - - io.quarkus - quarkus-junit5-internal - test - - - org.assertj - assertj-core - test - - - org.awaitility - awaitility - test - - - io.rest-assured - rest-assured - test - - - io.quarkus - quarkus-resteasy-deployment - test - - + + io.quarkus + quarkus-junit5-internal + test + + + org.assertj + assertj-core + test + + + org.awaitility + awaitility + test + + + io.rest-assured + rest-assured + test + + + io.quarkus + quarkus-resteasy-deployment + test + + - - - - maven-compiler-plugin - - - - io.quarkus - quarkus-extension-processor - ${project.version} - - - - - - + + + + maven-compiler-plugin + + + + io.quarkus + quarkus-extension-processor + ${project.version} + + + + -AlegacyConfigRoot=true + + + + + diff --git a/extensions/smallrye-reactive-messaging/runtime/pom.xml b/extensions/smallrye-reactive-messaging/runtime/pom.xml index 7555ee75d41ef..4f425ce1dcd3b 100644 --- a/extensions/smallrye-reactive-messaging/runtime/pom.xml +++ b/extensions/smallrye-reactive-messaging/runtime/pom.xml @@ -104,6 +104,9 @@ ${project.version} + + -AlegacyConfigRoot=true + diff --git a/extensions/spring-boot-properties/deployment/pom.xml b/extensions/spring-boot-properties/deployment/pom.xml index e746697fc6ffb..d3e07be7662a6 100644 --- a/extensions/spring-boot-properties/deployment/pom.xml +++ b/extensions/spring-boot-properties/deployment/pom.xml @@ -35,8 +35,11 @@ ${project.version} + + -AlegacyConfigRoot=true + - \ No newline at end of file + diff --git a/extensions/spring-boot-properties/runtime/pom.xml b/extensions/spring-boot-properties/runtime/pom.xml index ab4b3c1f1d244..1253b8baf248e 100644 --- a/extensions/spring-boot-properties/runtime/pom.xml +++ b/extensions/spring-boot-properties/runtime/pom.xml @@ -49,6 +49,9 @@ ${project.version} + + -AlegacyConfigRoot=true + diff --git a/extensions/swagger-ui/deployment/pom.xml b/extensions/swagger-ui/deployment/pom.xml index 5e767d27fc158..18ed14786d31d 100644 --- a/extensions/swagger-ui/deployment/pom.xml +++ b/extensions/swagger-ui/deployment/pom.xml @@ -52,18 +52,21 @@ - maven-compiler-plugin - - - - io.quarkus - quarkus-extension-processor - ${project.version} - - - - - + maven-compiler-plugin + + + + io.quarkus + quarkus-extension-processor + ${project.version} + + + + -AlegacyConfigRoot=true + + + + diff --git a/extensions/swagger-ui/runtime/pom.xml b/extensions/swagger-ui/runtime/pom.xml index ec5e159a3e8ac..edb4fd6f3e51a 100644 --- a/extensions/swagger-ui/runtime/pom.xml +++ b/extensions/swagger-ui/runtime/pom.xml @@ -43,6 +43,9 @@ ${project.version} + + -AlegacyConfigRoot=true + diff --git a/extensions/undertow/deployment/pom.xml b/extensions/undertow/deployment/pom.xml index 35a5c3ded9af0..d7b72b18e8107 100644 --- a/extensions/undertow/deployment/pom.xml +++ b/extensions/undertow/deployment/pom.xml @@ -91,6 +91,9 @@ ${project.version} + + -AlegacyConfigRoot=true + diff --git a/extensions/undertow/runtime/pom.xml b/extensions/undertow/runtime/pom.xml index 9fcc7ec71fbb6..d7230c5c949d3 100644 --- a/extensions/undertow/runtime/pom.xml +++ b/extensions/undertow/runtime/pom.xml @@ -118,6 +118,9 @@ ${project.version} + + -AlegacyConfigRoot=true + diff --git a/extensions/vertx-graphql/deployment/pom.xml b/extensions/vertx-graphql/deployment/pom.xml index e78929ba64fd1..39df2cced2e9a 100644 --- a/extensions/vertx-graphql/deployment/pom.xml +++ b/extensions/vertx-graphql/deployment/pom.xml @@ -51,6 +51,9 @@ ${project.version} + + -AlegacyConfigRoot=true + diff --git a/extensions/vertx-graphql/runtime/pom.xml b/extensions/vertx-graphql/runtime/pom.xml index 6e39ed9f64479..258d9850608df 100644 --- a/extensions/vertx-graphql/runtime/pom.xml +++ b/extensions/vertx-graphql/runtime/pom.xml @@ -41,6 +41,9 @@ ${project.version} + + -AlegacyConfigRoot=true + diff --git a/extensions/vertx-http/deployment/pom.xml b/extensions/vertx-http/deployment/pom.xml index 8d4ce7733a096..f2d3d31960997 100644 --- a/extensions/vertx-http/deployment/pom.xml +++ b/extensions/vertx-http/deployment/pom.xml @@ -154,6 +154,9 @@ ${project.version} + + -AlegacyConfigRoot=true + diff --git a/extensions/vertx-http/runtime/pom.xml b/extensions/vertx-http/runtime/pom.xml index 62dbc241f5678..f24d420daa77e 100644 --- a/extensions/vertx-http/runtime/pom.xml +++ b/extensions/vertx-http/runtime/pom.xml @@ -118,6 +118,9 @@ ${project.version} + + -AlegacyConfigRoot=true + diff --git a/extensions/virtual-threads/deployment/pom.xml b/extensions/virtual-threads/deployment/pom.xml index 3a2dfb3550315..ff7dc00b11cfe 100644 --- a/extensions/virtual-threads/deployment/pom.xml +++ b/extensions/virtual-threads/deployment/pom.xml @@ -40,6 +40,9 @@ ${project.version} + + -AlegacyConfigRoot=true + diff --git a/extensions/virtual-threads/runtime/pom.xml b/extensions/virtual-threads/runtime/pom.xml index 56e0b36cb510d..e0ba7717725c7 100644 --- a/extensions/virtual-threads/runtime/pom.xml +++ b/extensions/virtual-threads/runtime/pom.xml @@ -57,6 +57,9 @@ ${project.version} + + -AlegacyConfigRoot=true + diff --git a/extensions/web-dependency-locator/deployment/pom.xml b/extensions/web-dependency-locator/deployment/pom.xml index 3c540aa3dcdd5..dd9ce478c39f6 100644 --- a/extensions/web-dependency-locator/deployment/pom.xml +++ b/extensions/web-dependency-locator/deployment/pom.xml @@ -94,6 +94,9 @@ ${project.version} + + -AlegacyConfigRoot=true + diff --git a/extensions/web-dependency-locator/runtime/pom.xml b/extensions/web-dependency-locator/runtime/pom.xml index 51703d373ba25..cf6cd4abcc9d1 100644 --- a/extensions/web-dependency-locator/runtime/pom.xml +++ b/extensions/web-dependency-locator/runtime/pom.xml @@ -40,6 +40,9 @@ ${project.version} + + -AlegacyConfigRoot=true + diff --git a/extensions/websockets/client/deployment/pom.xml b/extensions/websockets/client/deployment/pom.xml index 90c6b60d7981b..706ce573ac731 100644 --- a/extensions/websockets/client/deployment/pom.xml +++ b/extensions/websockets/client/deployment/pom.xml @@ -49,6 +49,9 @@ ${project.version} + + -AlegacyConfigRoot=true + diff --git a/extensions/websockets/client/runtime/pom.xml b/extensions/websockets/client/runtime/pom.xml index f1a4ba3d5bd5c..0165918da142c 100644 --- a/extensions/websockets/client/runtime/pom.xml +++ b/extensions/websockets/client/runtime/pom.xml @@ -68,6 +68,9 @@ ${project.version} + + -AlegacyConfigRoot=true + diff --git a/integration-tests/test-extension/extension/deployment/pom.xml b/integration-tests/test-extension/extension/deployment/pom.xml index c87887d965e8a..b1947433ff32a 100644 --- a/integration-tests/test-extension/extension/deployment/pom.xml +++ b/integration-tests/test-extension/extension/deployment/pom.xml @@ -88,6 +88,9 @@ ${project.version} + + -AgenerateDoc=false + diff --git a/integration-tests/test-extension/extension/runtime/pom.xml b/integration-tests/test-extension/extension/runtime/pom.xml index d5051040bbef7..4abf257788fb2 100644 --- a/integration-tests/test-extension/extension/runtime/pom.xml +++ b/integration-tests/test-extension/extension/runtime/pom.xml @@ -124,6 +124,9 @@ ${project.version} + + -AgenerateDoc=false + diff --git a/test-framework/jacoco/deployment/pom.xml b/test-framework/jacoco/deployment/pom.xml index c416ec7771a4f..af0224e671d69 100644 --- a/test-framework/jacoco/deployment/pom.xml +++ b/test-framework/jacoco/deployment/pom.xml @@ -49,6 +49,9 @@ ${project.version} + + -AlegacyConfigRoot=true + diff --git a/test-framework/jacoco/runtime/pom.xml b/test-framework/jacoco/runtime/pom.xml index 6671c6289f0ed..6d0d856264efd 100644 --- a/test-framework/jacoco/runtime/pom.xml +++ b/test-framework/jacoco/runtime/pom.xml @@ -79,6 +79,9 @@ ${project.version} + + -AlegacyConfigRoot=true + From 98245a8150255d2091331787c770310a2a8a4274 Mon Sep 17 00:00:00 2001 From: Guillaume Smet Date: Wed, 24 Jul 2024 18:52:54 +0200 Subject: [PATCH 05/43] Add a check for @ConfigRoot/@ConfigMapping consistency --- .../scanner/ConfigAnnotationScanner.java | 26 +++++++++++++++++++ 1 file changed, 26 insertions(+) diff --git a/core/processor/src/main/java/io/quarkus/annotation/processor/documentation/config/scanner/ConfigAnnotationScanner.java b/core/processor/src/main/java/io/quarkus/annotation/processor/documentation/config/scanner/ConfigAnnotationScanner.java index 1029b9eca7d9f..818e319ac64f1 100644 --- a/core/processor/src/main/java/io/quarkus/annotation/processor/documentation/config/scanner/ConfigAnnotationScanner.java +++ b/core/processor/src/main/java/io/quarkus/annotation/processor/documentation/config/scanner/ConfigAnnotationScanner.java @@ -85,6 +85,8 @@ public void scanConfigGroups(RoundEnvironment roundEnv, TypeElement annotation) public void scanConfigRoots(RoundEnvironment roundEnv, TypeElement annotation) { for (TypeElement configRoot : typesIn(roundEnv.getElementsAnnotatedWith(annotation))) { + checkConfigRootAnnotationConsistency(configRoot); + final PackageElement pkg = utils.element().getPackageOf(configRoot); if (pkg == null) { utils.processingEnv().getMessager().printMessage(Diagnostic.Kind.ERROR, @@ -420,6 +422,30 @@ private T applyRootListeners( return discoveryRootElement; } + private void checkConfigRootAnnotationConsistency(TypeElement configRoot) { + // for now quarkus-core is a mix of both @ConfigRoot and @ConfigMapping + // see https://github.com/quarkusio/quarkus/issues/42114 + if ("quarkus-core".equals(config.getExtension().artifactId())) { + return; + } + + if (config.useConfigMapping()) { + if (!utils.element().isAnnotationPresent(configRoot, Types.ANNOTATION_CONFIG_MAPPING)) { + throw new IllegalStateException( + "This module is configured to use @ConfigMapping annotations but we found a @ConfigRoot without a corresponding @ConfigMapping annotation in: " + + configRoot + "." + + " Either add the annotation or add the -AlegacyConfigRoot=true argument to the annotation processor config in the pom.xml"); + } + } else { + if (utils.element().isAnnotationPresent(configRoot, Types.ANNOTATION_CONFIG_MAPPING)) { + throw new IllegalStateException( + "This module is configured to use legacy @ConfigRoot annotations but we found a @ConfigMapping annotation in: " + + configRoot + "." + + " Check the configuration of the annotation processor and drop the -AlegacyConfigRoot=true argument from the pom.xml if needed"); + } + } + } + private void debug(String debug, Element element) { if (!config.isDebug()) { return; From 50b35a13cd970883536a24f83bbde141971bee5a Mon Sep 17 00:00:00 2001 From: Guillaume Smet Date: Thu, 25 Jul 2024 10:23:50 +0200 Subject: [PATCH 06/43] Only run the annotation processor for the default execution We don't need the annotation processor when compiling the tests. --- core/deployment/pom.xml | 23 +++++++++------ extensions/agroal/deployment/pom.xml | 23 +++++++++------ extensions/agroal/runtime/pom.xml | 23 +++++++++------ .../amazon-lambda-http/deployment/pom.xml | 29 +++++++++++-------- extensions/amazon-lambda-http/runtime/pom.xml | 29 +++++++++++-------- .../amazon-lambda-rest/deployment/pom.xml | 29 +++++++++++-------- extensions/amazon-lambda-rest/runtime/pom.xml | 29 +++++++++++-------- .../amazon-lambda-xray/deployment/pom.xml | 23 +++++++++------ extensions/amazon-lambda-xray/runtime/pom.xml | 23 +++++++++------ .../amazon-lambda/common-deployment/pom.xml | 29 +++++++++++-------- .../amazon-lambda/common-runtime/pom.xml | 29 +++++++++++-------- extensions/amazon-lambda/deployment/pom.xml | 29 +++++++++++-------- extensions/amazon-lambda/runtime/pom.xml | 29 +++++++++++-------- .../apache-httpclient/deployment/pom.xml | 23 +++++++++------ extensions/apache-httpclient/runtime/pom.xml | 23 +++++++++------ extensions/arc/deployment/pom.xml | 29 +++++++++++-------- extensions/arc/runtime/pom.xml | 29 +++++++++++-------- extensions/avro/deployment/pom.xml | 23 +++++++++------ extensions/avro/runtime/pom.xml | 23 +++++++++------ extensions/awt/deployment/pom.xml | 23 +++++++++------ extensions/awt/runtime/pom.xml | 23 +++++++++------ .../azure-functions-http/deployment/pom.xml | 23 +++++++++------ .../azure-functions-http/runtime/pom.xml | 23 +++++++++------ extensions/azure-functions/deployment/pom.xml | 29 +++++++++++-------- extensions/azure-functions/runtime/pom.xml | 29 +++++++++++-------- extensions/cache/deployment/pom.xml | 23 +++++++++------ extensions/cache/runtime-spi/pom.xml | 23 +++++++++------ extensions/cache/runtime/pom.xml | 23 +++++++++------ extensions/caffeine/deployment/pom.xml | 23 +++++++++------ extensions/caffeine/runtime/pom.xml | 23 +++++++++------ extensions/config-yaml/deployment/pom.xml | 23 +++++++++------ extensions/config-yaml/runtime/pom.xml | 23 +++++++++------ .../deployment/pom.xml | 29 +++++++++++-------- .../container-image-buildpack/runtime/pom.xml | 29 +++++++++++-------- .../deployment/pom.xml | 23 +++++++++------ .../runtime/pom.xml | 23 +++++++++------ .../container-image-docker/deployment/pom.xml | 23 +++++++++------ .../container-image-docker/runtime/pom.xml | 23 +++++++++------ .../container-image-jib/deployment/pom.xml | 29 +++++++++++-------- .../container-image-jib/runtime/pom.xml | 29 +++++++++++-------- .../deployment/pom.xml | 29 +++++++++++-------- .../container-image-openshift/runtime/pom.xml | 29 +++++++++++-------- .../container-image-podman/deployment/pom.xml | 23 +++++++++------ .../container-image-podman/runtime/pom.xml | 23 +++++++++------ extensions/container-image/deployment/pom.xml | 29 +++++++++++-------- extensions/container-image/runtime/pom.xml | 29 +++++++++++-------- extensions/credentials/deployment/pom.xml | 23 +++++++++------ extensions/datasource/deployment/pom.xml | 23 +++++++++------ extensions/datasource/runtime/pom.xml | 23 +++++++++------ extensions/devservices/db2/pom.xml | 23 +++++++++------ extensions/devservices/deployment/pom.xml | 23 +++++++++------ extensions/devservices/derby/pom.xml | 23 +++++++++------ extensions/devservices/h2/pom.xml | 23 +++++++++------ extensions/devservices/mariadb/pom.xml | 23 +++++++++------ extensions/devservices/mssql/pom.xml | 23 +++++++++------ extensions/devservices/mysql/pom.xml | 23 +++++++++------ extensions/devservices/oracle/pom.xml | 23 +++++++++------ extensions/devservices/postgresql/pom.xml | 23 +++++++++------ .../deployment/pom.xml | 29 +++++++++++-------- .../runtime/pom.xml | 29 +++++++++++-------- .../deployment/pom.xml | 23 +++++++++------ .../elytron-security-common/runtime/pom.xml | 23 +++++++++------ .../deployment/pom.xml | 23 +++++++++------ .../elytron-security-oauth2/runtime/pom.xml | 23 +++++++++------ .../deployment/pom.xml | 23 +++++++++------ .../runtime/pom.xml | 23 +++++++++------ .../elytron-security/deployment/pom.xml | 23 +++++++++------ extensions/elytron-security/runtime/pom.xml | 23 +++++++++------ extensions/flyway-db2/deployment/pom.xml | 23 +++++++++------ extensions/flyway-db2/runtime/pom.xml | 23 +++++++++------ extensions/flyway-derby/deployment/pom.xml | 23 +++++++++------ extensions/flyway-derby/runtime/pom.xml | 23 +++++++++------ extensions/flyway-mssql/deployment/pom.xml | 23 +++++++++------ extensions/flyway-mssql/runtime/pom.xml | 23 +++++++++------ extensions/flyway-mysql/deployment/pom.xml | 23 +++++++++------ extensions/flyway-mysql/runtime/pom.xml | 23 +++++++++------ extensions/flyway-oracle/deployment/pom.xml | 23 +++++++++------ extensions/flyway-oracle/runtime/pom.xml | 23 +++++++++------ .../flyway-postgresql/deployment/pom.xml | 23 +++++++++------ extensions/flyway-postgresql/runtime/pom.xml | 23 +++++++++------ extensions/flyway/deployment/pom.xml | 29 +++++++++++-------- extensions/flyway/runtime/pom.xml | 29 +++++++++++-------- .../funqy-amazon-lambda/deployment/pom.xml | 23 +++++++++------ .../funqy/funqy-amazon-lambda/runtime/pom.xml | 23 +++++++++------ .../deployment/pom.xml | 23 +++++++++------ .../runtime/pom.xml | 23 +++++++++------ .../funqy/funqy-http/deployment/pom.xml | 23 +++++++++------ extensions/funqy/funqy-http/runtime/pom.xml | 23 +++++++++------ .../funqy-knative-events/deployment/pom.xml | 29 +++++++++++-------- .../funqy-knative-events/runtime/pom.xml | 29 +++++++++++-------- .../funqy-server-common/deployment/pom.xml | 29 +++++++++++-------- .../funqy/funqy-server-common/runtime/pom.xml | 29 +++++++++++-------- .../deployment/pom.xml | 23 +++++++++------ .../runtime/pom.xml | 23 +++++++++------ .../google-cloud-functions/deployment/pom.xml | 29 +++++++++++-------- .../google-cloud-functions/runtime/pom.xml | 29 +++++++++++-------- extensions/grpc-common/deployment/pom.xml | 23 +++++++++------ extensions/grpc-common/runtime/pom.xml | 23 +++++++++------ extensions/grpc/deployment/pom.xml | 29 +++++++++++-------- extensions/grpc/runtime/pom.xml | 29 +++++++++++-------- extensions/hal/deployment/pom.xml | 23 +++++++++------ extensions/hal/runtime/pom.xml | 23 +++++++++------ extensions/hibernate-envers/runtime/pom.xml | 23 +++++++++------ extensions/hibernate-orm/deployment/pom.xml | 23 +++++++++------ extensions/hibernate-orm/runtime/pom.xml | 23 +++++++++------ .../hibernate-reactive/deployment/pom.xml | 23 +++++++++------ extensions/hibernate-reactive/runtime/pom.xml | 23 +++++++++------ .../deployment/pom.xml | 23 +++++++++------ .../runtime/pom.xml | 23 +++++++++------ .../deployment/pom.xml | 23 +++++++++------ .../runtime/pom.xml | 23 +++++++++------ .../deployment/pom.xml | 23 +++++++++------ .../runtime/pom.xml | 23 +++++++++------ .../hibernate-validator/deployment/pom.xml | 23 +++++++++------ .../hibernate-validator/runtime/pom.xml | 23 +++++++++------ .../infinispan-cache/deployment/pom.xml | 29 +++++++++++-------- extensions/infinispan-cache/runtime/pom.xml | 29 +++++++++++-------- .../infinispan-client/deployment/pom.xml | 29 +++++++++++-------- extensions/infinispan-client/runtime/pom.xml | 29 +++++++++++-------- extensions/info/deployment/pom.xml | 23 +++++++++------ extensions/info/runtime-spi/pom.xml | 23 +++++++++------ extensions/info/runtime/pom.xml | 23 +++++++++------ extensions/jackson/deployment/pom.xml | 29 +++++++++++-------- extensions/jackson/runtime/pom.xml | 29 +++++++++++-------- extensions/jaxb/deployment/pom.xml | 29 +++++++++++-------- extensions/jaxb/runtime/pom.xml | 29 +++++++++++-------- extensions/jaxp/deployment/pom.xml | 23 +++++++++------ extensions/jaxp/runtime/pom.xml | 23 +++++++++------ extensions/jdbc/jdbc-db2/deployment/pom.xml | 23 +++++++++------ extensions/jdbc/jdbc-db2/runtime/pom.xml | 23 +++++++++------ extensions/jdbc/jdbc-derby/deployment/pom.xml | 23 +++++++++------ extensions/jdbc/jdbc-derby/runtime/pom.xml | 23 +++++++++------ extensions/jdbc/jdbc-h2/deployment/pom.xml | 23 +++++++++------ extensions/jdbc/jdbc-h2/runtime/pom.xml | 23 +++++++++------ .../jdbc/jdbc-mariadb/deployment/pom.xml | 23 +++++++++------ extensions/jdbc/jdbc-mariadb/runtime/pom.xml | 23 +++++++++------ extensions/jdbc/jdbc-mssql/deployment/pom.xml | 23 +++++++++------ extensions/jdbc/jdbc-mssql/runtime/pom.xml | 23 +++++++++------ extensions/jdbc/jdbc-mysql/deployment/pom.xml | 23 +++++++++------ extensions/jdbc/jdbc-mysql/runtime/pom.xml | 23 +++++++++------ .../jdbc/jdbc-oracle/deployment/pom.xml | 23 +++++++++------ extensions/jdbc/jdbc-oracle/runtime/pom.xml | 23 +++++++++------ .../jdbc/jdbc-postgresql/deployment/pom.xml | 23 +++++++++------ .../jdbc/jdbc-postgresql/runtime/pom.xml | 23 +++++++++------ extensions/jfr/deployment/pom.xml | 23 +++++++++------ extensions/jfr/runtime/pom.xml | 23 +++++++++------ extensions/jsonb/deployment/pom.xml | 23 +++++++++------ extensions/jsonb/runtime/pom.xml | 23 +++++++++------ extensions/jsonp/deployment/pom.xml | 23 +++++++++------ extensions/jsonp/runtime/pom.xml | 23 +++++++++------ extensions/kafka-client/deployment/pom.xml | 29 +++++++++++-------- extensions/kafka-client/runtime/pom.xml | 29 +++++++++++-------- extensions/kafka-streams/deployment/pom.xml | 29 +++++++++++-------- extensions/kafka-streams/runtime/pom.xml | 29 +++++++++++-------- .../deployment/pom.xml | 23 +++++++++------ .../runtime/pom.xml | 23 +++++++++------ .../deployment/pom.xml | 23 +++++++++------ .../runtime/pom.xml | 23 +++++++++------ .../deployment/pom.xml | 23 +++++++++------ .../runtime/pom.xml | 23 +++++++++------ .../keycloak-authorization/deployment/pom.xml | 23 +++++++++------ .../keycloak-authorization/runtime/pom.xml | 23 +++++++++------ extensions/kotlin/deployment/pom.xml | 23 +++++++++------ .../deployment-internal/pom.xml | 23 +++++++++------ .../kubernetes-client/deployment/pom.xml | 23 +++++++++------ .../runtime-internal/pom.xml | 23 +++++++++------ extensions/kubernetes-client/runtime/pom.xml | 23 +++++++++------ extensions/kubernetes-client/spi/pom.xml | 23 +++++++++------ .../kubernetes-config/deployment/pom.xml | 23 +++++++++------ extensions/kubernetes-config/runtime/pom.xml | 23 +++++++++------ .../deployment/pom.xml | 23 +++++++++------ .../runtime/pom.xml | 23 +++++++++------ extensions/kubernetes/kind/deployment/pom.xml | 23 +++++++++------ extensions/kubernetes/kind/runtime/pom.xml | 23 +++++++++------ .../kubernetes/minikube/deployment/pom.xml | 23 +++++++++------ .../kubernetes/minikube/runtime/pom.xml | 23 +++++++++------ .../kubernetes/openshift/deployment/pom.xml | 23 +++++++++------ .../kubernetes/openshift/runtime/pom.xml | 23 +++++++++------ .../kubernetes/vanilla/deployment/pom.xml | 29 +++++++++++-------- extensions/kubernetes/vanilla/runtime/pom.xml | 29 +++++++++++-------- .../liquibase-mongodb/deployment/pom.xml | 29 +++++++++++-------- extensions/liquibase-mongodb/runtime/pom.xml | 29 +++++++++++-------- extensions/liquibase/deployment/pom.xml | 29 +++++++++++-------- extensions/liquibase/runtime/pom.xml | 29 +++++++++++-------- extensions/load-shedding/deployment/pom.xml | 23 +++++++++------ extensions/load-shedding/runtime/pom.xml | 23 +++++++++------ extensions/logging-json/deployment/pom.xml | 29 +++++++++++-------- extensions/logging-json/runtime/pom.xml | 29 +++++++++++-------- extensions/mailer/deployment/pom.xml | 29 +++++++++++-------- extensions/mailer/runtime/pom.xml | 29 +++++++++++-------- .../deployment/pom.xml | 23 +++++++++------ .../runtime/pom.xml | 23 +++++++++------ extensions/micrometer/deployment/pom.xml | 29 +++++++++++-------- extensions/micrometer/runtime/pom.xml | 29 +++++++++++-------- extensions/mongodb-client/deployment/pom.xml | 29 +++++++++++-------- extensions/mongodb-client/runtime/pom.xml | 29 +++++++++++-------- extensions/mutiny/deployment/pom.xml | 23 +++++++++------ extensions/mutiny/runtime/pom.xml | 23 +++++++++------ extensions/narayana-jta/deployment/pom.xml | 29 +++++++++++-------- extensions/narayana-jta/runtime/pom.xml | 29 +++++++++++-------- extensions/narayana-lra/deployment/pom.xml | 29 +++++++++++-------- extensions/narayana-lra/runtime/pom.xml | 29 +++++++++++-------- extensions/narayana-stm/deployment/pom.xml | 23 +++++++++------ extensions/narayana-stm/runtime/pom.xml | 23 +++++++++------ extensions/netty/deployment/pom.xml | 29 +++++++++++-------- extensions/netty/runtime/pom.xml | 29 +++++++++++-------- .../observability-devservices/common/pom.xml | 23 +++++++++------ .../deployment/pom.xml | 23 +++++++++------ .../observability-devservices/runtime/pom.xml | 23 +++++++++------ .../oidc-client-filter/deployment/pom.xml | 23 +++++++++------ extensions/oidc-client-filter/runtime/pom.xml | 23 +++++++++------ .../oidc-client-graphql/deployment/pom.xml | 23 +++++++++------ .../oidc-client-graphql/runtime/pom.xml | 23 +++++++++------ .../deployment/pom.xml | 23 +++++++++------ .../runtime/pom.xml | 23 +++++++++------ extensions/oidc-client/deployment/pom.xml | 29 +++++++++++-------- extensions/oidc-client/runtime/pom.xml | 29 +++++++++++-------- extensions/oidc-common/deployment/pom.xml | 23 +++++++++------ extensions/oidc-common/runtime/pom.xml | 23 +++++++++------ .../deployment/pom.xml | 23 +++++++++------ .../runtime/pom.xml | 23 +++++++++------ .../deployment/pom.xml | 23 +++++++++------ .../runtime/pom.xml | 23 +++++++++------ .../oidc-token-propagation/deployment/pom.xml | 23 +++++++++------ .../oidc-token-propagation/runtime/pom.xml | 23 +++++++++------ extensions/oidc/deployment/pom.xml | 29 +++++++++++-------- extensions/oidc/runtime/pom.xml | 29 +++++++++++-------- .../openshift-client/deployment/pom.xml | 23 +++++++++------ extensions/openshift-client/runtime/pom.xml | 23 +++++++++------ extensions/opentelemetry/deployment/pom.xml | 23 +++++++++------ extensions/opentelemetry/runtime/pom.xml | 23 +++++++++------ .../deployment/pom.xml | 23 +++++++++------ .../hibernate-orm-panache/deployment/pom.xml | 23 +++++++++------ .../deployment/pom.xml | 23 +++++++++------ .../deployment/pom.xml | 23 +++++++++------ .../mongodb-panache-common/deployment/pom.xml | 23 +++++++++------ .../mongodb-panache-kotlin/deployment/pom.xml | 23 +++++++++------ .../mongodb-panache/deployment/pom.xml | 23 +++++++++------ .../deployment/pom.xml | 23 +++++++++------ .../panache/rest-data-panache/runtime/pom.xml | 23 +++++++++------ extensions/quartz/deployment/pom.xml | 29 +++++++++++-------- extensions/quartz/runtime/pom.xml | 29 +++++++++++-------- extensions/qute/deployment/pom.xml | 29 +++++++++++-------- extensions/qute/runtime/pom.xml | 29 +++++++++++-------- .../reactive-datasource/deployment/pom.xml | 23 +++++++++------ .../reactive-datasource/runtime/pom.xml | 23 +++++++++------ .../reactive-db2-client/deployment/pom.xml | 23 +++++++++------ .../reactive-db2-client/runtime/pom.xml | 23 +++++++++------ .../reactive-mssql-client/deployment/pom.xml | 23 +++++++++------ .../reactive-mssql-client/runtime/pom.xml | 23 +++++++++------ .../reactive-mysql-client/deployment/pom.xml | 23 +++++++++------ .../reactive-mysql-client/runtime/pom.xml | 23 +++++++++------ .../reactive-oracle-client/deployment/pom.xml | 23 +++++++++------ .../reactive-oracle-client/runtime/pom.xml | 23 +++++++++------ .../reactive-pg-client/deployment/pom.xml | 23 +++++++++------ extensions/reactive-pg-client/runtime/pom.xml | 23 +++++++++------ extensions/reactive-routes/deployment/pom.xml | 23 +++++++++------ extensions/reactive-routes/runtime/pom.xml | 23 +++++++++------ .../deployment/pom.xml | 23 +++++++++------ .../runtime/pom.xml | 23 +++++++++------ .../deployment/pom.xml | 23 +++++++++------ .../runtime/pom.xml | 23 +++++++++------ .../deployment/pom.xml | 23 +++++++++------ extensions/redis-cache/deployment/pom.xml | 29 +++++++++++-------- extensions/redis-cache/runtime/pom.xml | 29 +++++++++++-------- extensions/redis-client/deployment/pom.xml | 23 +++++++++------ extensions/redis-client/runtime/pom.xml | 23 +++++++++------ .../rest-client-config/deployment/pom.xml | 29 +++++++++++-------- .../rest-client-config/runtime/pom.xml | 29 +++++++++++-------- .../deployment/pom.xml | 23 +++++++++------ .../resteasy-client-jackson/runtime/pom.xml | 23 +++++++++------ .../resteasy-client-jaxb/deployment/pom.xml | 23 +++++++++------ .../resteasy-client-jaxb/runtime/pom.xml | 23 +++++++++------ .../resteasy-client-jsonb/deployment/pom.xml | 23 +++++++++------ .../resteasy-client-jsonb/runtime/pom.xml | 23 +++++++++------ .../resteasy-client-mutiny/deployment/pom.xml | 23 +++++++++------ .../resteasy-client-mutiny/runtime/pom.xml | 23 +++++++++------ .../resteasy-client/deployment/pom.xml | 23 +++++++++------ .../resteasy-client/runtime/pom.xml | 23 +++++++++------ .../resteasy-common/deployment/pom.xml | 29 +++++++++++-------- .../resteasy-common/runtime/pom.xml | 29 +++++++++++-------- .../resteasy-jackson/deployment/pom.xml | 23 +++++++++------ .../resteasy-jackson/runtime/pom.xml | 23 +++++++++------ .../resteasy-jaxb/deployment/pom.xml | 23 +++++++++------ .../resteasy-jaxb/runtime/pom.xml | 23 +++++++++------ .../resteasy-jsonb/deployment/pom.xml | 23 +++++++++------ .../resteasy-jsonb/runtime/pom.xml | 23 +++++++++------ .../resteasy-links/deployment/pom.xml | 23 +++++++++------ .../resteasy-links/runtime/pom.xml | 23 +++++++++------ .../resteasy-multipart/deployment/pom.xml | 29 +++++++++++-------- .../resteasy-multipart/runtime/pom.xml | 29 +++++++++++-------- .../resteasy-mutiny-common/deployment/pom.xml | 23 +++++++++------ .../resteasy-mutiny-common/runtime/pom.xml | 23 +++++++++------ .../resteasy-mutiny/deployment/pom.xml | 23 +++++++++------ .../resteasy-mutiny/runtime/pom.xml | 23 +++++++++------ .../resteasy-qute/deployment/pom.xml | 23 +++++++++------ .../resteasy-qute/runtime/pom.xml | 23 +++++++++------ .../resteasy-server-common/deployment/pom.xml | 29 +++++++++++-------- .../resteasy-server-common/runtime/pom.xml | 29 +++++++++++-------- .../resteasy/deployment/pom.xml | 29 +++++++++++-------- .../resteasy-classic/resteasy/runtime/pom.xml | 29 +++++++++++-------- .../rest-client-jackson/deployment/pom.xml | 23 +++++++++------ .../rest-client-jackson/runtime/pom.xml | 23 +++++++++------ .../rest-client-jaxb/deployment/pom.xml | 23 +++++++++------ .../rest-client-jaxb/runtime/pom.xml | 23 +++++++++------ .../rest-client-jaxrs/deployment/pom.xml | 23 +++++++++------ .../rest-client-jaxrs/runtime/pom.xml | 23 +++++++++------ .../rest-client-jsonb/deployment/pom.xml | 23 +++++++++------ .../rest-client-jsonb/runtime/pom.xml | 23 +++++++++------ .../deployment/pom.xml | 23 +++++++++------ .../rest-client/deployment/pom.xml | 29 +++++++++++-------- .../rest-common/deployment/pom.xml | 23 +++++++++------ .../rest-common/runtime/pom.xml | 23 +++++++++------ .../rest-csrf/deployment/pom.xml | 29 +++++++++++-------- .../rest-csrf/runtime/pom.xml | 29 +++++++++++-------- .../rest-jackson-common/deployment/pom.xml | 23 +++++++++------ .../rest-jackson-common/runtime/pom.xml | 23 +++++++++------ .../rest-jackson/deployment/pom.xml | 23 +++++++++------ .../rest-jackson/runtime/pom.xml | 23 +++++++++------ .../rest-jaxb/deployment/pom.xml | 23 +++++++++------ .../rest-jaxb/runtime/pom.xml | 23 +++++++++------ .../rest-jsonb-common/deployment/pom.xml | 23 +++++++++------ .../rest-jsonb-common/runtime/pom.xml | 23 +++++++++------ .../rest-jsonb/deployment/pom.xml | 23 +++++++++------ .../rest-jsonb/runtime/pom.xml | 23 +++++++++------ .../deployment/pom.xml | 23 +++++++++------ .../rest-kotlin/deployment/pom.xml | 23 +++++++++------ .../rest-links/runtime/pom.xml | 23 +++++++++------ .../rest-qute/deployment/pom.xml | 23 +++++++++------ .../rest-qute/runtime/pom.xml | 23 +++++++++------ .../rest-servlet/deployment/pom.xml | 23 +++++++++------ .../rest-servlet/runtime/pom.xml | 23 +++++++++------ .../resteasy-reactive/rest/deployment/pom.xml | 23 +++++++++------ .../resteasy-reactive/rest/runtime/pom.xml | 23 +++++++++------ extensions/scala/deployment/pom.xml | 23 +++++++++------ extensions/scheduler/deployment/pom.xml | 29 +++++++++++-------- extensions/scheduler/runtime/pom.xml | 29 +++++++++++-------- .../apicurio/avro/deployment/pom.xml | 23 +++++++++------ .../apicurio/avro/runtime/pom.xml | 23 +++++++++------ .../apicurio/common/deployment/pom.xml | 23 +++++++++------ .../apicurio/json-schema/deployment/pom.xml | 23 +++++++++------ .../apicurio/json-schema/runtime/pom.xml | 23 +++++++++------ .../confluent/avro/deployment/pom.xml | 23 +++++++++------ .../confluent/avro/runtime/pom.xml | 23 +++++++++------ .../confluent/common/deployment/pom.xml | 23 +++++++++------ .../confluent/json-schema/deployment/pom.xml | 23 +++++++++------ .../confluent/json-schema/runtime/pom.xml | 23 +++++++++------ .../devservice/deployment/pom.xml | 29 +++++++++++-------- .../devservice/runtime/pom.xml | 29 +++++++++++-------- extensions/security/deployment/pom.xml | 23 +++++++++------ extensions/security/runtime-spi/pom.xml | 23 +++++++++------ extensions/security/runtime/pom.xml | 23 +++++++++------ extensions/security/spi/pom.xml | 23 +++++++++------ .../deployment/pom.xml | 23 +++++++++------ .../runtime/pom.xml | 23 +++++++++------ .../deployment/pom.xml | 23 +++++++++------ .../smallrye-fault-tolerance/runtime/pom.xml | 23 +++++++++------ extensions/smallrye-health/deployment/pom.xml | 29 +++++++++++-------- extensions/smallrye-health/runtime/pom.xml | 29 +++++++++++-------- .../smallrye-jwt-build/deployment/pom.xml | 23 +++++++++------ extensions/smallrye-jwt-build/runtime/pom.xml | 23 +++++++++------ extensions/smallrye-jwt/deployment/pom.xml | 23 +++++++++------ extensions/smallrye-jwt/runtime/pom.xml | 23 +++++++++------ .../smallrye-metrics/deployment/pom.xml | 29 +++++++++++-------- extensions/smallrye-metrics/runtime/pom.xml | 29 +++++++++++-------- .../deployment/pom.xml | 29 +++++++++++-------- .../smallrye-openapi/deployment/pom.xml | 29 +++++++++++-------- extensions/smallrye-openapi/runtime/pom.xml | 29 +++++++++++-------- .../deployment/pom.xml | 29 +++++++++++-------- .../runtime/pom.xml | 29 +++++++++++-------- .../deployment/pom.xml | 29 +++++++++++-------- .../runtime/pom.xml | 29 +++++++++++-------- .../deployment/pom.xml | 29 +++++++++++-------- .../runtime/pom.xml | 29 +++++++++++-------- .../deployment/pom.xml | 29 +++++++++++-------- .../runtime/pom.xml | 29 +++++++++++-------- .../deployment/pom.xml | 29 +++++++++++-------- .../runtime/pom.xml | 29 +++++++++++-------- .../deployment/pom.xml | 29 +++++++++++-------- .../runtime/pom.xml | 29 +++++++++++-------- extensions/smallrye-stork/deployment/pom.xml | 23 +++++++++------ extensions/smallrye-stork/runtime/pom.xml | 23 +++++++++------ .../spring-boot-properties/deployment/pom.xml | 29 +++++++++++-------- .../spring-boot-properties/runtime/pom.xml | 29 +++++++++++-------- extensions/spring-cache/deployment/pom.xml | 23 +++++++++------ .../deployment/pom.xml | 23 +++++++++------ extensions/spring-data-jpa/deployment/pom.xml | 23 +++++++++------ .../spring-data-rest/deployment/pom.xml | 23 +++++++++------ extensions/spring-di/deployment/pom.xml | 23 +++++++++------ .../spring-scheduled/deployment/pom.xml | 23 +++++++++------ extensions/spring-security/deployment/pom.xml | 23 +++++++++------ extensions/spring-web/core/deployment/pom.xml | 23 +++++++++------ .../resteasy-classic/deployment/pom.xml | 23 +++++++++------ .../resteasy-reactive/deployment/pom.xml | 23 +++++++++------ extensions/swagger-ui/deployment/pom.xml | 29 +++++++++++-------- extensions/swagger-ui/runtime/pom.xml | 29 +++++++++++-------- extensions/tls-registry/deployment/pom.xml | 23 +++++++++------ extensions/tls-registry/runtime/pom.xml | 23 +++++++++------ extensions/undertow/deployment/pom.xml | 29 +++++++++++-------- extensions/undertow/runtime/pom.xml | 29 +++++++++++-------- extensions/undertow/spi/pom.xml | 23 +++++++++------ extensions/vertx-http/deployment/pom.xml | 29 +++++++++++-------- extensions/vertx-http/runtime/pom.xml | 29 +++++++++++-------- extensions/vertx/deployment/pom.xml | 23 +++++++++------ extensions/vertx/kotlin/deployment/pom.xml | 23 +++++++++------ extensions/vertx/runtime/pom.xml | 23 +++++++++------ extensions/virtual-threads/deployment/pom.xml | 29 +++++++++++-------- extensions/virtual-threads/runtime/pom.xml | 29 +++++++++++-------- .../web-dependency-locator/deployment/pom.xml | 29 +++++++++++-------- .../web-dependency-locator/runtime/pom.xml | 29 +++++++++++-------- extensions/websockets-next/runtime/pom.xml | 23 +++++++++------ .../websockets/client/deployment/pom.xml | 29 +++++++++++-------- extensions/websockets/client/runtime/pom.xml | 29 +++++++++++-------- .../websockets/server/deployment/pom.xml | 23 +++++++++------ extensions/websockets/server/runtime/pom.xml | 23 +++++++++------ .../class-transformer/deployment/pom.xml | 23 +++++++++------ integration-tests/devmode/pom.xml | 23 +++++++++------ integration-tests/devtools/pom.xml | 23 +++++++++------ .../deployment/pom.xml | 23 +++++++++------ .../runtime/pom.xml | 23 +++++++++------ test-framework/jacoco/deployment/pom.xml | 29 +++++++++++-------- test-framework/jacoco/runtime/pom.xml | 29 +++++++++++-------- 422 files changed, 6286 insertions(+), 4176 deletions(-) diff --git a/core/deployment/pom.xml b/core/deployment/pom.xml index 1fc87443c5d34..b0efea90680a8 100644 --- a/core/deployment/pom.xml +++ b/core/deployment/pom.xml @@ -214,15 +214,20 @@ maven-compiler-plugin - - - - io.quarkus - quarkus-extension-processor - ${project.version} - - - + + + default-compile + + + + io.quarkus + quarkus-extension-processor + ${project.version} + + + + + de.thetaphi diff --git a/extensions/agroal/deployment/pom.xml b/extensions/agroal/deployment/pom.xml index e120b9ad70e93..d98df477aa1a2 100644 --- a/extensions/agroal/deployment/pom.xml +++ b/extensions/agroal/deployment/pom.xml @@ -99,15 +99,20 @@ maven-compiler-plugin - - - - io.quarkus - quarkus-extension-processor - ${project.version} - - - + + + default-compile + + + + io.quarkus + quarkus-extension-processor + ${project.version} + + + + + diff --git a/extensions/agroal/runtime/pom.xml b/extensions/agroal/runtime/pom.xml index cb338065a8315..761c8f80e6dc1 100644 --- a/extensions/agroal/runtime/pom.xml +++ b/extensions/agroal/runtime/pom.xml @@ -93,15 +93,20 @@ maven-compiler-plugin - - - - io.quarkus - quarkus-extension-processor - ${project.version} - - - + + + default-compile + + + + io.quarkus + quarkus-extension-processor + ${project.version} + + + + + diff --git a/extensions/amazon-lambda-http/deployment/pom.xml b/extensions/amazon-lambda-http/deployment/pom.xml index 83e14cf9a8328..d7088a8788cc3 100644 --- a/extensions/amazon-lambda-http/deployment/pom.xml +++ b/extensions/amazon-lambda-http/deployment/pom.xml @@ -57,18 +57,23 @@ maven-compiler-plugin - - - - io.quarkus - quarkus-extension-processor - ${project.version} - - - - -AlegacyConfigRoot=true - - + + + default-compile + + + + io.quarkus + quarkus-extension-processor + ${project.version} + + + + -AlegacyConfigRoot=true + + + + diff --git a/extensions/amazon-lambda-http/runtime/pom.xml b/extensions/amazon-lambda-http/runtime/pom.xml index db09722ebf83b..f71b749e0497d 100644 --- a/extensions/amazon-lambda-http/runtime/pom.xml +++ b/extensions/amazon-lambda-http/runtime/pom.xml @@ -65,18 +65,23 @@ maven-compiler-plugin - - - - io.quarkus - quarkus-extension-processor - ${project.version} - - - - -AlegacyConfigRoot=true - - + + + default-compile + + + + io.quarkus + quarkus-extension-processor + ${project.version} + + + + -AlegacyConfigRoot=true + + + + diff --git a/extensions/amazon-lambda-rest/deployment/pom.xml b/extensions/amazon-lambda-rest/deployment/pom.xml index 2234e2a59676f..a4680f09844c4 100644 --- a/extensions/amazon-lambda-rest/deployment/pom.xml +++ b/extensions/amazon-lambda-rest/deployment/pom.xml @@ -57,18 +57,23 @@ maven-compiler-plugin - - - - io.quarkus - quarkus-extension-processor - ${project.version} - - - - -AlegacyConfigRoot=true - - + + + default-compile + + + + io.quarkus + quarkus-extension-processor + ${project.version} + + + + -AlegacyConfigRoot=true + + + + diff --git a/extensions/amazon-lambda-rest/runtime/pom.xml b/extensions/amazon-lambda-rest/runtime/pom.xml index 6238605770cc7..9dd7859810e4c 100644 --- a/extensions/amazon-lambda-rest/runtime/pom.xml +++ b/extensions/amazon-lambda-rest/runtime/pom.xml @@ -46,18 +46,23 @@ maven-compiler-plugin - - - - io.quarkus - quarkus-extension-processor - ${project.version} - - - - -AlegacyConfigRoot=true - - + + + default-compile + + + + io.quarkus + quarkus-extension-processor + ${project.version} + + + + -AlegacyConfigRoot=true + + + + diff --git a/extensions/amazon-lambda-xray/deployment/pom.xml b/extensions/amazon-lambda-xray/deployment/pom.xml index f35b2095131ad..ab30d1162cb05 100644 --- a/extensions/amazon-lambda-xray/deployment/pom.xml +++ b/extensions/amazon-lambda-xray/deployment/pom.xml @@ -32,15 +32,20 @@ maven-compiler-plugin - - - - io.quarkus - quarkus-extension-processor - ${project.version} - - - + + + default-compile + + + + io.quarkus + quarkus-extension-processor + ${project.version} + + + + + diff --git a/extensions/amazon-lambda-xray/runtime/pom.xml b/extensions/amazon-lambda-xray/runtime/pom.xml index a77d913a78ae3..a31d8a12ff72d 100644 --- a/extensions/amazon-lambda-xray/runtime/pom.xml +++ b/extensions/amazon-lambda-xray/runtime/pom.xml @@ -46,15 +46,20 @@ maven-compiler-plugin - - - - io.quarkus - quarkus-extension-processor - ${project.version} - - - + + + default-compile + + + + io.quarkus + quarkus-extension-processor + ${project.version} + + + + + diff --git a/extensions/amazon-lambda/common-deployment/pom.xml b/extensions/amazon-lambda/common-deployment/pom.xml index 7fe8610d77ce2..6fa00eea9b452 100644 --- a/extensions/amazon-lambda/common-deployment/pom.xml +++ b/extensions/amazon-lambda/common-deployment/pom.xml @@ -50,18 +50,23 @@ maven-compiler-plugin - - - - io.quarkus - quarkus-extension-processor - ${project.version} - - - - -AlegacyConfigRoot=true - - + + + default-compile + + + + io.quarkus + quarkus-extension-processor + ${project.version} + + + + -AlegacyConfigRoot=true + + + + diff --git a/extensions/amazon-lambda/common-runtime/pom.xml b/extensions/amazon-lambda/common-runtime/pom.xml index 0a2c726e6f54b..eb8a8bab3501b 100644 --- a/extensions/amazon-lambda/common-runtime/pom.xml +++ b/extensions/amazon-lambda/common-runtime/pom.xml @@ -61,18 +61,23 @@ maven-compiler-plugin - - - - io.quarkus - quarkus-extension-processor - ${project.version} - - - - -AlegacyConfigRoot=true - - + + + default-compile + + + + io.quarkus + quarkus-extension-processor + ${project.version} + + + + -AlegacyConfigRoot=true + + + + diff --git a/extensions/amazon-lambda/deployment/pom.xml b/extensions/amazon-lambda/deployment/pom.xml index cb1a17cd0d311..24060850709a8 100644 --- a/extensions/amazon-lambda/deployment/pom.xml +++ b/extensions/amazon-lambda/deployment/pom.xml @@ -46,18 +46,23 @@ maven-compiler-plugin - - - - io.quarkus - quarkus-extension-processor - ${project.version} - - - - -AlegacyConfigRoot=true - - + + + default-compile + + + + io.quarkus + quarkus-extension-processor + ${project.version} + + + + -AlegacyConfigRoot=true + + + + diff --git a/extensions/amazon-lambda/runtime/pom.xml b/extensions/amazon-lambda/runtime/pom.xml index f361bea1de811..0a565e1dbe5e1 100644 --- a/extensions/amazon-lambda/runtime/pom.xml +++ b/extensions/amazon-lambda/runtime/pom.xml @@ -40,18 +40,23 @@ maven-compiler-plugin - - - - io.quarkus - quarkus-extension-processor - ${project.version} - - - - -AlegacyConfigRoot=true - - + + + default-compile + + + + io.quarkus + quarkus-extension-processor + ${project.version} + + + + -AlegacyConfigRoot=true + + + + diff --git a/extensions/apache-httpclient/deployment/pom.xml b/extensions/apache-httpclient/deployment/pom.xml index ffdffa75ba962..a2ea292f601e9 100644 --- a/extensions/apache-httpclient/deployment/pom.xml +++ b/extensions/apache-httpclient/deployment/pom.xml @@ -25,15 +25,20 @@ maven-compiler-plugin - - - - io.quarkus - quarkus-extension-processor - ${project.version} - - - + + + default-compile + + + + io.quarkus + quarkus-extension-processor + ${project.version} + + + + + diff --git a/extensions/apache-httpclient/runtime/pom.xml b/extensions/apache-httpclient/runtime/pom.xml index e0b85c3e2ef4d..4b7ea97216ce1 100644 --- a/extensions/apache-httpclient/runtime/pom.xml +++ b/extensions/apache-httpclient/runtime/pom.xml @@ -34,15 +34,20 @@ maven-compiler-plugin - - - - io.quarkus - quarkus-extension-processor - ${project.version} - - - + + + default-compile + + + + io.quarkus + quarkus-extension-processor + ${project.version} + + + + + diff --git a/extensions/arc/deployment/pom.xml b/extensions/arc/deployment/pom.xml index c2ca964605e22..779cb9e6f9da3 100644 --- a/extensions/arc/deployment/pom.xml +++ b/extensions/arc/deployment/pom.xml @@ -62,18 +62,23 @@ maven-compiler-plugin - - - - io.quarkus - quarkus-extension-processor - ${project.version} - - - - -AlegacyConfigRoot=true - - + + + default-compile + + + + io.quarkus + quarkus-extension-processor + ${project.version} + + + + -AlegacyConfigRoot=true + + + + diff --git a/extensions/arc/runtime/pom.xml b/extensions/arc/runtime/pom.xml index e9dd01296be29..7dbc125035b2c 100644 --- a/extensions/arc/runtime/pom.xml +++ b/extensions/arc/runtime/pom.xml @@ -41,18 +41,23 @@ maven-compiler-plugin - - - - io.quarkus - quarkus-extension-processor - ${project.version} - - - - -AlegacyConfigRoot=true - - + + + default-compile + + + + io.quarkus + quarkus-extension-processor + ${project.version} + + + + -AlegacyConfigRoot=true + + + + diff --git a/extensions/avro/deployment/pom.xml b/extensions/avro/deployment/pom.xml index 209bd698e26e0..b77775fc9a871 100644 --- a/extensions/avro/deployment/pom.xml +++ b/extensions/avro/deployment/pom.xml @@ -46,15 +46,20 @@ maven-compiler-plugin - - - - io.quarkus - quarkus-extension-processor - ${project.version} - - - + + + default-compile + + + + io.quarkus + quarkus-extension-processor + ${project.version} + + + + + diff --git a/extensions/avro/runtime/pom.xml b/extensions/avro/runtime/pom.xml index 498d5bbac563e..b6405d328aa22 100644 --- a/extensions/avro/runtime/pom.xml +++ b/extensions/avro/runtime/pom.xml @@ -46,15 +46,20 @@ maven-compiler-plugin - - - - io.quarkus - quarkus-extension-processor - ${project.version} - - - + + + default-compile + + + + io.quarkus + quarkus-extension-processor + ${project.version} + + + + + diff --git a/extensions/awt/deployment/pom.xml b/extensions/awt/deployment/pom.xml index 28e26fc5f21a5..313f26f4599c3 100644 --- a/extensions/awt/deployment/pom.xml +++ b/extensions/awt/deployment/pom.xml @@ -34,15 +34,20 @@ maven-compiler-plugin - - - - io.quarkus - quarkus-extension-processor - ${project.version} - - - + + + default-compile + + + + io.quarkus + quarkus-extension-processor + ${project.version} + + + + + diff --git a/extensions/awt/runtime/pom.xml b/extensions/awt/runtime/pom.xml index a27f6ad7ba86a..d48c87d3d5442 100644 --- a/extensions/awt/runtime/pom.xml +++ b/extensions/awt/runtime/pom.xml @@ -29,15 +29,20 @@ maven-compiler-plugin - - - - io.quarkus - quarkus-extension-processor - ${project.version} - - - + + + default-compile + + + + io.quarkus + quarkus-extension-processor + ${project.version} + + + + + diff --git a/extensions/azure-functions-http/deployment/pom.xml b/extensions/azure-functions-http/deployment/pom.xml index 13b3c65fb54f7..0f8891d9f68c3 100644 --- a/extensions/azure-functions-http/deployment/pom.xml +++ b/extensions/azure-functions-http/deployment/pom.xml @@ -43,15 +43,20 @@ maven-compiler-plugin - - - - io.quarkus - quarkus-extension-processor - ${project.version} - - - + + + default-compile + + + + io.quarkus + quarkus-extension-processor + ${project.version} + + + + + diff --git a/extensions/azure-functions-http/runtime/pom.xml b/extensions/azure-functions-http/runtime/pom.xml index 8416a0cbae4ac..24cfa2196eb4b 100644 --- a/extensions/azure-functions-http/runtime/pom.xml +++ b/extensions/azure-functions-http/runtime/pom.xml @@ -56,15 +56,20 @@ maven-compiler-plugin - - - - io.quarkus - quarkus-extension-processor - ${project.version} - - - + + + default-compile + + + + io.quarkus + quarkus-extension-processor + ${project.version} + + + + + diff --git a/extensions/azure-functions/deployment/pom.xml b/extensions/azure-functions/deployment/pom.xml index 3ff2ca28028ba..10437cac5561b 100644 --- a/extensions/azure-functions/deployment/pom.xml +++ b/extensions/azure-functions/deployment/pom.xml @@ -121,18 +121,23 @@ maven-compiler-plugin - - - - io.quarkus - quarkus-extension-processor - ${project.version} - - - - -AlegacyConfigRoot=true - - + + + default-compile + + + + io.quarkus + quarkus-extension-processor + ${project.version} + + + + -AlegacyConfigRoot=true + + + + diff --git a/extensions/azure-functions/runtime/pom.xml b/extensions/azure-functions/runtime/pom.xml index 189d763ea6c88..5440764ba4778 100644 --- a/extensions/azure-functions/runtime/pom.xml +++ b/extensions/azure-functions/runtime/pom.xml @@ -42,18 +42,23 @@ maven-compiler-plugin - - - - io.quarkus - quarkus-extension-processor - ${project.version} - - - - -AlegacyConfigRoot=true - - + + + default-compile + + + + io.quarkus + quarkus-extension-processor + ${project.version} + + + + -AlegacyConfigRoot=true + + + + diff --git a/extensions/cache/deployment/pom.xml b/extensions/cache/deployment/pom.xml index b07bc1074f51c..9f349acab98f8 100644 --- a/extensions/cache/deployment/pom.xml +++ b/extensions/cache/deployment/pom.xml @@ -74,15 +74,20 @@ maven-compiler-plugin - - - - io.quarkus - quarkus-extension-processor - ${project.version} - - - + + + default-compile + + + + io.quarkus + quarkus-extension-processor + ${project.version} + + + + + diff --git a/extensions/cache/runtime-spi/pom.xml b/extensions/cache/runtime-spi/pom.xml index 19619b5e24a5f..a0c57831b3890 100644 --- a/extensions/cache/runtime-spi/pom.xml +++ b/extensions/cache/runtime-spi/pom.xml @@ -23,15 +23,20 @@ maven-compiler-plugin - - - - io.quarkus - quarkus-extension-processor - ${project.version} - - - + + + default-compile + + + + io.quarkus + quarkus-extension-processor + ${project.version} + + + + + diff --git a/extensions/cache/runtime/pom.xml b/extensions/cache/runtime/pom.xml index e849a5b223d04..6181d84973c02 100644 --- a/extensions/cache/runtime/pom.xml +++ b/extensions/cache/runtime/pom.xml @@ -65,15 +65,20 @@ maven-compiler-plugin - - - - io.quarkus - quarkus-extension-processor - ${project.version} - - - + + + default-compile + + + + io.quarkus + quarkus-extension-processor + ${project.version} + + + + + diff --git a/extensions/caffeine/deployment/pom.xml b/extensions/caffeine/deployment/pom.xml index 1bbde72ebb0cc..c7874e481324d 100644 --- a/extensions/caffeine/deployment/pom.xml +++ b/extensions/caffeine/deployment/pom.xml @@ -31,15 +31,20 @@ maven-compiler-plugin - - - - io.quarkus - quarkus-extension-processor - ${project.version} - - - + + + default-compile + + + + io.quarkus + quarkus-extension-processor + ${project.version} + + + + + diff --git a/extensions/caffeine/runtime/pom.xml b/extensions/caffeine/runtime/pom.xml index 992164c336ecb..a3a36de42b086 100644 --- a/extensions/caffeine/runtime/pom.xml +++ b/extensions/caffeine/runtime/pom.xml @@ -36,15 +36,20 @@ maven-compiler-plugin - - - - io.quarkus - quarkus-extension-processor - ${project.version} - - - + + + default-compile + + + + io.quarkus + quarkus-extension-processor + ${project.version} + + + + + diff --git a/extensions/config-yaml/deployment/pom.xml b/extensions/config-yaml/deployment/pom.xml index fcbb526f40966..aa2ba2d1ee311 100644 --- a/extensions/config-yaml/deployment/pom.xml +++ b/extensions/config-yaml/deployment/pom.xml @@ -44,15 +44,20 @@ maven-compiler-plugin - - - - io.quarkus - quarkus-extension-processor - ${project.version} - - - + + + default-compile + + + + io.quarkus + quarkus-extension-processor + ${project.version} + + + + + diff --git a/extensions/config-yaml/runtime/pom.xml b/extensions/config-yaml/runtime/pom.xml index 6199774adc98e..dec80381910bc 100644 --- a/extensions/config-yaml/runtime/pom.xml +++ b/extensions/config-yaml/runtime/pom.xml @@ -53,15 +53,20 @@ maven-compiler-plugin - - - - io.quarkus - quarkus-extension-processor - ${project.version} - - - + + + default-compile + + + + io.quarkus + quarkus-extension-processor + ${project.version} + + + + + diff --git a/extensions/container-image/container-image-buildpack/deployment/pom.xml b/extensions/container-image/container-image-buildpack/deployment/pom.xml index f2ea05fbe0cae..5e4e5d1865f7b 100644 --- a/extensions/container-image/container-image-buildpack/deployment/pom.xml +++ b/extensions/container-image/container-image-buildpack/deployment/pom.xml @@ -38,18 +38,23 @@ maven-compiler-plugin - - - - io.quarkus - quarkus-extension-processor - ${project.version} - - - - -AlegacyConfigRoot=true - - + + + default-compile + + + + io.quarkus + quarkus-extension-processor + ${project.version} + + + + -AlegacyConfigRoot=true + + + + diff --git a/extensions/container-image/container-image-buildpack/runtime/pom.xml b/extensions/container-image/container-image-buildpack/runtime/pom.xml index 0a1dba2c7061a..1319507747e2e 100644 --- a/extensions/container-image/container-image-buildpack/runtime/pom.xml +++ b/extensions/container-image/container-image-buildpack/runtime/pom.xml @@ -36,18 +36,23 @@ maven-compiler-plugin - - - - io.quarkus - quarkus-extension-processor - ${project.version} - - - - -AlegacyConfigRoot=true - - + + + default-compile + + + + io.quarkus + quarkus-extension-processor + ${project.version} + + + + -AlegacyConfigRoot=true + + + + diff --git a/extensions/container-image/container-image-docker-common/deployment/pom.xml b/extensions/container-image/container-image-docker-common/deployment/pom.xml index 6f553dc401722..3549e7533ce71 100644 --- a/extensions/container-image/container-image-docker-common/deployment/pom.xml +++ b/extensions/container-image/container-image-docker-common/deployment/pom.xml @@ -32,15 +32,20 @@ maven-compiler-plugin - - - - io.quarkus - quarkus-extension-processor - ${project.version} - - - + + + default-compile + + + + io.quarkus + quarkus-extension-processor + ${project.version} + + + + + diff --git a/extensions/container-image/container-image-docker-common/runtime/pom.xml b/extensions/container-image/container-image-docker-common/runtime/pom.xml index c7b6cebce33b9..5b9b87d392984 100644 --- a/extensions/container-image/container-image-docker-common/runtime/pom.xml +++ b/extensions/container-image/container-image-docker-common/runtime/pom.xml @@ -28,15 +28,20 @@ maven-compiler-plugin - - - - io.quarkus - quarkus-extension-processor - ${project.version} - - - + + + default-compile + + + + io.quarkus + quarkus-extension-processor + ${project.version} + + + + + diff --git a/extensions/container-image/container-image-docker/deployment/pom.xml b/extensions/container-image/container-image-docker/deployment/pom.xml index 1d6fb564a0cea..677ff6c348da9 100644 --- a/extensions/container-image/container-image-docker/deployment/pom.xml +++ b/extensions/container-image/container-image-docker/deployment/pom.xml @@ -33,15 +33,20 @@ maven-compiler-plugin - - - - io.quarkus - quarkus-extension-processor - ${project.version} - - - + + + default-compile + + + + io.quarkus + quarkus-extension-processor + ${project.version} + + + + + diff --git a/extensions/container-image/container-image-docker/runtime/pom.xml b/extensions/container-image/container-image-docker/runtime/pom.xml index 8e172cf9a7466..e37a0a36a3f9d 100644 --- a/extensions/container-image/container-image-docker/runtime/pom.xml +++ b/extensions/container-image/container-image-docker/runtime/pom.xml @@ -37,15 +37,20 @@ maven-compiler-plugin - - - - io.quarkus - quarkus-extension-processor - ${project.version} - - - + + + default-compile + + + + io.quarkus + quarkus-extension-processor + ${project.version} + + + + + diff --git a/extensions/container-image/container-image-jib/deployment/pom.xml b/extensions/container-image/container-image-jib/deployment/pom.xml index 17bbc38acabab..33c2ea5c75c2f 100644 --- a/extensions/container-image/container-image-jib/deployment/pom.xml +++ b/extensions/container-image/container-image-jib/deployment/pom.xml @@ -36,18 +36,23 @@ maven-compiler-plugin - - - - io.quarkus - quarkus-extension-processor - ${project.version} - - - - -AlegacyConfigRoot=true - - + + + default-compile + + + + io.quarkus + quarkus-extension-processor + ${project.version} + + + + -AlegacyConfigRoot=true + + + + diff --git a/extensions/container-image/container-image-jib/runtime/pom.xml b/extensions/container-image/container-image-jib/runtime/pom.xml index 7cfdabb0dcc3d..0242e1b4e3ee9 100644 --- a/extensions/container-image/container-image-jib/runtime/pom.xml +++ b/extensions/container-image/container-image-jib/runtime/pom.xml @@ -37,18 +37,23 @@ maven-compiler-plugin - - - - io.quarkus - quarkus-extension-processor - ${project.version} - - - - -AlegacyConfigRoot=true - - + + + default-compile + + + + io.quarkus + quarkus-extension-processor + ${project.version} + + + + -AlegacyConfigRoot=true + + + + diff --git a/extensions/container-image/container-image-openshift/deployment/pom.xml b/extensions/container-image/container-image-openshift/deployment/pom.xml index ec6bdc68ff5f1..70ac92990e046 100644 --- a/extensions/container-image/container-image-openshift/deployment/pom.xml +++ b/extensions/container-image/container-image-openshift/deployment/pom.xml @@ -69,18 +69,23 @@ maven-compiler-plugin - - - - io.quarkus - quarkus-extension-processor - ${project.version} - - - - -AlegacyConfigRoot=true - - + + + default-compile + + + + io.quarkus + quarkus-extension-processor + ${project.version} + + + + -AlegacyConfigRoot=true + + + + diff --git a/extensions/container-image/container-image-openshift/runtime/pom.xml b/extensions/container-image/container-image-openshift/runtime/pom.xml index cc7899b2d19a8..944f403fc9881 100644 --- a/extensions/container-image/container-image-openshift/runtime/pom.xml +++ b/extensions/container-image/container-image-openshift/runtime/pom.xml @@ -42,18 +42,23 @@ maven-compiler-plugin - - - - io.quarkus - quarkus-extension-processor - ${project.version} - - - - -AlegacyConfigRoot=true - - + + + default-compile + + + + io.quarkus + quarkus-extension-processor + ${project.version} + + + + -AlegacyConfigRoot=true + + + + diff --git a/extensions/container-image/container-image-podman/deployment/pom.xml b/extensions/container-image/container-image-podman/deployment/pom.xml index 3db78bfc5e407..cdc510aa3c87a 100644 --- a/extensions/container-image/container-image-podman/deployment/pom.xml +++ b/extensions/container-image/container-image-podman/deployment/pom.xml @@ -33,15 +33,20 @@ maven-compiler-plugin - - - - io.quarkus - quarkus-extension-processor - ${project.version} - - - + + + default-compile + + + + io.quarkus + quarkus-extension-processor + ${project.version} + + + + + diff --git a/extensions/container-image/container-image-podman/runtime/pom.xml b/extensions/container-image/container-image-podman/runtime/pom.xml index 1bdbbdf23b8ac..167135a29f605 100644 --- a/extensions/container-image/container-image-podman/runtime/pom.xml +++ b/extensions/container-image/container-image-podman/runtime/pom.xml @@ -37,15 +37,20 @@ maven-compiler-plugin - - - - io.quarkus - quarkus-extension-processor - ${project.version} - - - + + + default-compile + + + + io.quarkus + quarkus-extension-processor + ${project.version} + + + + + diff --git a/extensions/container-image/deployment/pom.xml b/extensions/container-image/deployment/pom.xml index ffdd352a34f21..50de8b3187ecf 100644 --- a/extensions/container-image/deployment/pom.xml +++ b/extensions/container-image/deployment/pom.xml @@ -48,18 +48,23 @@ maven-compiler-plugin - - - - io.quarkus - quarkus-extension-processor - ${project.version} - - - - -AlegacyConfigRoot=true - - + + + default-compile + + + + io.quarkus + quarkus-extension-processor + ${project.version} + + + + -AlegacyConfigRoot=true + + + + diff --git a/extensions/container-image/runtime/pom.xml b/extensions/container-image/runtime/pom.xml index 1f074045a5a6a..02eaebdbc1433 100644 --- a/extensions/container-image/runtime/pom.xml +++ b/extensions/container-image/runtime/pom.xml @@ -38,18 +38,23 @@ maven-compiler-plugin - - - - io.quarkus - quarkus-extension-processor - ${project.version} - - - - -AlegacyConfigRoot=true - - + + + default-compile + + + + io.quarkus + quarkus-extension-processor + ${project.version} + + + + -AlegacyConfigRoot=true + + + + diff --git a/extensions/credentials/deployment/pom.xml b/extensions/credentials/deployment/pom.xml index 8ec28c952111b..846cd6a420204 100644 --- a/extensions/credentials/deployment/pom.xml +++ b/extensions/credentials/deployment/pom.xml @@ -31,15 +31,20 @@ maven-compiler-plugin - - - - io.quarkus - quarkus-extension-processor - ${project.version} - - - + + + default-compile + + + + io.quarkus + quarkus-extension-processor + ${project.version} + + + + + diff --git a/extensions/datasource/deployment/pom.xml b/extensions/datasource/deployment/pom.xml index c56e4d3df7906..d258163def6e7 100644 --- a/extensions/datasource/deployment/pom.xml +++ b/extensions/datasource/deployment/pom.xml @@ -51,15 +51,20 @@ maven-compiler-plugin - - - - io.quarkus - quarkus-extension-processor - ${project.version} - - - + + + default-compile + + + + io.quarkus + quarkus-extension-processor + ${project.version} + + + + + diff --git a/extensions/datasource/runtime/pom.xml b/extensions/datasource/runtime/pom.xml index 13950aa4a1603..7e9260ed089e2 100644 --- a/extensions/datasource/runtime/pom.xml +++ b/extensions/datasource/runtime/pom.xml @@ -44,15 +44,20 @@ maven-compiler-plugin - - - - io.quarkus - quarkus-extension-processor - ${project.version} - - - + + + default-compile + + + + io.quarkus + quarkus-extension-processor + ${project.version} + + + + + diff --git a/extensions/devservices/db2/pom.xml b/extensions/devservices/db2/pom.xml index c36078a730113..3f2a313fff6b8 100644 --- a/extensions/devservices/db2/pom.xml +++ b/extensions/devservices/db2/pom.xml @@ -49,15 +49,20 @@ maven-compiler-plugin - - - - io.quarkus - quarkus-extension-processor - ${project.version} - - - + + + default-compile + + + + io.quarkus + quarkus-extension-processor + ${project.version} + + + + + diff --git a/extensions/devservices/deployment/pom.xml b/extensions/devservices/deployment/pom.xml index f78183ff0248b..3a73b141c6173 100644 --- a/extensions/devservices/deployment/pom.xml +++ b/extensions/devservices/deployment/pom.xml @@ -30,15 +30,20 @@ maven-compiler-plugin - - - - io.quarkus - quarkus-extension-processor - ${project.version} - - - + + + default-compile + + + + io.quarkus + quarkus-extension-processor + ${project.version} + + + + + diff --git a/extensions/devservices/derby/pom.xml b/extensions/devservices/derby/pom.xml index ad142a4923234..203c6f0fa0206 100644 --- a/extensions/devservices/derby/pom.xml +++ b/extensions/devservices/derby/pom.xml @@ -39,15 +39,20 @@ maven-compiler-plugin - - - - io.quarkus - quarkus-extension-processor - ${project.version} - - - + + + default-compile + + + + io.quarkus + quarkus-extension-processor + ${project.version} + + + + + diff --git a/extensions/devservices/h2/pom.xml b/extensions/devservices/h2/pom.xml index 9f9f54654ea35..b539ca022961b 100644 --- a/extensions/devservices/h2/pom.xml +++ b/extensions/devservices/h2/pom.xml @@ -35,15 +35,20 @@ maven-compiler-plugin - - - - io.quarkus - quarkus-extension-processor - ${project.version} - - - + + + default-compile + + + + io.quarkus + quarkus-extension-processor + ${project.version} + + + + + diff --git a/extensions/devservices/mariadb/pom.xml b/extensions/devservices/mariadb/pom.xml index 3e3a536d05988..31cdb0c8d4035 100644 --- a/extensions/devservices/mariadb/pom.xml +++ b/extensions/devservices/mariadb/pom.xml @@ -55,15 +55,20 @@ maven-compiler-plugin - - - - io.quarkus - quarkus-extension-processor - ${project.version} - - - + + + default-compile + + + + io.quarkus + quarkus-extension-processor + ${project.version} + + + + + diff --git a/extensions/devservices/mssql/pom.xml b/extensions/devservices/mssql/pom.xml index f08675a84f6cd..7ac4287407ea2 100644 --- a/extensions/devservices/mssql/pom.xml +++ b/extensions/devservices/mssql/pom.xml @@ -55,15 +55,20 @@ maven-compiler-plugin - - - - io.quarkus - quarkus-extension-processor - ${project.version} - - - + + + default-compile + + + + io.quarkus + quarkus-extension-processor + ${project.version} + + + + + diff --git a/extensions/devservices/mysql/pom.xml b/extensions/devservices/mysql/pom.xml index 28b73be41d864..d3e5a8d3baa96 100644 --- a/extensions/devservices/mysql/pom.xml +++ b/extensions/devservices/mysql/pom.xml @@ -55,15 +55,20 @@ maven-compiler-plugin - - - - io.quarkus - quarkus-extension-processor - ${project.version} - - - + + + default-compile + + + + io.quarkus + quarkus-extension-processor + ${project.version} + + + + + diff --git a/extensions/devservices/oracle/pom.xml b/extensions/devservices/oracle/pom.xml index b92c58dbfab2b..ecb868a75a09e 100644 --- a/extensions/devservices/oracle/pom.xml +++ b/extensions/devservices/oracle/pom.xml @@ -55,15 +55,20 @@ maven-compiler-plugin - - - - io.quarkus - quarkus-extension-processor - ${project.version} - - - + + + default-compile + + + + io.quarkus + quarkus-extension-processor + ${project.version} + + + + + diff --git a/extensions/devservices/postgresql/pom.xml b/extensions/devservices/postgresql/pom.xml index 2afa0b43847ed..54c639c2528a0 100644 --- a/extensions/devservices/postgresql/pom.xml +++ b/extensions/devservices/postgresql/pom.xml @@ -55,15 +55,20 @@ maven-compiler-plugin - - - - io.quarkus - quarkus-extension-processor - ${project.version} - - - + + + default-compile + + + + io.quarkus + quarkus-extension-processor + ${project.version} + + + + + diff --git a/extensions/elasticsearch-rest-client-common/deployment/pom.xml b/extensions/elasticsearch-rest-client-common/deployment/pom.xml index ff95ef33c0830..05c8ff9697676 100644 --- a/extensions/elasticsearch-rest-client-common/deployment/pom.xml +++ b/extensions/elasticsearch-rest-client-common/deployment/pom.xml @@ -49,18 +49,23 @@ maven-compiler-plugin - - - - io.quarkus - quarkus-extension-processor - ${project.version} - - - - -AlegacyConfigRoot=true - - + + + default-compile + + + + io.quarkus + quarkus-extension-processor + ${project.version} + + + + -AlegacyConfigRoot=true + + + + diff --git a/extensions/elasticsearch-rest-client-common/runtime/pom.xml b/extensions/elasticsearch-rest-client-common/runtime/pom.xml index 42e70be945f79..b700174288cca 100644 --- a/extensions/elasticsearch-rest-client-common/runtime/pom.xml +++ b/extensions/elasticsearch-rest-client-common/runtime/pom.xml @@ -60,18 +60,23 @@ maven-compiler-plugin - - - - io.quarkus - quarkus-extension-processor - ${project.version} - - - - -AlegacyConfigRoot=true - - + + + default-compile + + + + io.quarkus + quarkus-extension-processor + ${project.version} + + + + -AlegacyConfigRoot=true + + + + diff --git a/extensions/elytron-security-common/deployment/pom.xml b/extensions/elytron-security-common/deployment/pom.xml index ee2a9b249beca..c4ca6917afe7a 100644 --- a/extensions/elytron-security-common/deployment/pom.xml +++ b/extensions/elytron-security-common/deployment/pom.xml @@ -27,15 +27,20 @@ maven-compiler-plugin - - - - io.quarkus - quarkus-extension-processor - ${project.version} - - - + + + default-compile + + + + io.quarkus + quarkus-extension-processor + ${project.version} + + + + + diff --git a/extensions/elytron-security-common/runtime/pom.xml b/extensions/elytron-security-common/runtime/pom.xml index 1890861723d83..f2faa3efd3380 100644 --- a/extensions/elytron-security-common/runtime/pom.xml +++ b/extensions/elytron-security-common/runtime/pom.xml @@ -57,15 +57,20 @@ maven-compiler-plugin - - - - io.quarkus - quarkus-extension-processor - ${project.version} - - - + + + default-compile + + + + io.quarkus + quarkus-extension-processor + ${project.version} + + + + + diff --git a/extensions/elytron-security-oauth2/deployment/pom.xml b/extensions/elytron-security-oauth2/deployment/pom.xml index 8602d41d65d87..7aa85344d655c 100644 --- a/extensions/elytron-security-oauth2/deployment/pom.xml +++ b/extensions/elytron-security-oauth2/deployment/pom.xml @@ -47,15 +47,20 @@ maven-compiler-plugin - - - - io.quarkus - quarkus-extension-processor - ${project.version} - - - + + + default-compile + + + + io.quarkus + quarkus-extension-processor + ${project.version} + + + + + diff --git a/extensions/elytron-security-oauth2/runtime/pom.xml b/extensions/elytron-security-oauth2/runtime/pom.xml index b8eb853dcc161..52ce3677e7b9b 100644 --- a/extensions/elytron-security-oauth2/runtime/pom.xml +++ b/extensions/elytron-security-oauth2/runtime/pom.xml @@ -41,15 +41,20 @@ maven-compiler-plugin - - - - io.quarkus - quarkus-extension-processor - ${project.version} - - - + + + default-compile + + + + io.quarkus + quarkus-extension-processor + ${project.version} + + + + + diff --git a/extensions/elytron-security-properties-file/deployment/pom.xml b/extensions/elytron-security-properties-file/deployment/pom.xml index 860ea5329ce9f..2d450894891a8 100644 --- a/extensions/elytron-security-properties-file/deployment/pom.xml +++ b/extensions/elytron-security-properties-file/deployment/pom.xml @@ -54,15 +54,20 @@ maven-compiler-plugin - - - - io.quarkus - quarkus-extension-processor - ${project.version} - - - + + + default-compile + + + + io.quarkus + quarkus-extension-processor + ${project.version} + + + + + diff --git a/extensions/elytron-security-properties-file/runtime/pom.xml b/extensions/elytron-security-properties-file/runtime/pom.xml index ae3729a51c142..e7c78c78d9136 100644 --- a/extensions/elytron-security-properties-file/runtime/pom.xml +++ b/extensions/elytron-security-properties-file/runtime/pom.xml @@ -69,15 +69,20 @@ maven-compiler-plugin - - - - io.quarkus - quarkus-extension-processor - ${project.version} - - - + + + default-compile + + + + io.quarkus + quarkus-extension-processor + ${project.version} + + + + + diff --git a/extensions/elytron-security/deployment/pom.xml b/extensions/elytron-security/deployment/pom.xml index 0bc492a2d6e31..7b6b2b4e29164 100644 --- a/extensions/elytron-security/deployment/pom.xml +++ b/extensions/elytron-security/deployment/pom.xml @@ -62,15 +62,20 @@ maven-compiler-plugin - - - - io.quarkus - quarkus-extension-processor - ${project.version} - - - + + + default-compile + + + + io.quarkus + quarkus-extension-processor + ${project.version} + + + + + diff --git a/extensions/elytron-security/runtime/pom.xml b/extensions/elytron-security/runtime/pom.xml index 78c6b738f72bd..b0b27e476033b 100644 --- a/extensions/elytron-security/runtime/pom.xml +++ b/extensions/elytron-security/runtime/pom.xml @@ -89,15 +89,20 @@ maven-compiler-plugin - - - - io.quarkus - quarkus-extension-processor - ${project.version} - - - + + + default-compile + + + + io.quarkus + quarkus-extension-processor + ${project.version} + + + + + diff --git a/extensions/flyway-db2/deployment/pom.xml b/extensions/flyway-db2/deployment/pom.xml index 364dc8bfa5d85..3f7b8edaa92b2 100644 --- a/extensions/flyway-db2/deployment/pom.xml +++ b/extensions/flyway-db2/deployment/pom.xml @@ -30,15 +30,20 @@ maven-compiler-plugin - - - - io.quarkus - quarkus-extension-processor - ${project.version} - - - + + + default-compile + + + + io.quarkus + quarkus-extension-processor + ${project.version} + + + + + diff --git a/extensions/flyway-db2/runtime/pom.xml b/extensions/flyway-db2/runtime/pom.xml index 0f3b1f50f7e69..8fe3920debceb 100644 --- a/extensions/flyway-db2/runtime/pom.xml +++ b/extensions/flyway-db2/runtime/pom.xml @@ -53,15 +53,20 @@ maven-compiler-plugin - - - - io.quarkus - quarkus-extension-processor - ${project.version} - - - + + + default-compile + + + + io.quarkus + quarkus-extension-processor + ${project.version} + + + + + diff --git a/extensions/flyway-derby/deployment/pom.xml b/extensions/flyway-derby/deployment/pom.xml index c440f2658bae6..d59e36f249676 100644 --- a/extensions/flyway-derby/deployment/pom.xml +++ b/extensions/flyway-derby/deployment/pom.xml @@ -30,15 +30,20 @@ maven-compiler-plugin - - - - io.quarkus - quarkus-extension-processor - ${project.version} - - - + + + default-compile + + + + io.quarkus + quarkus-extension-processor + ${project.version} + + + + + diff --git a/extensions/flyway-derby/runtime/pom.xml b/extensions/flyway-derby/runtime/pom.xml index df30be22a3e61..ac4f148fa586e 100644 --- a/extensions/flyway-derby/runtime/pom.xml +++ b/extensions/flyway-derby/runtime/pom.xml @@ -53,15 +53,20 @@ maven-compiler-plugin - - - - io.quarkus - quarkus-extension-processor - ${project.version} - - - + + + default-compile + + + + io.quarkus + quarkus-extension-processor + ${project.version} + + + + + diff --git a/extensions/flyway-mssql/deployment/pom.xml b/extensions/flyway-mssql/deployment/pom.xml index ccb77d200937e..d3b5704feda4b 100644 --- a/extensions/flyway-mssql/deployment/pom.xml +++ b/extensions/flyway-mssql/deployment/pom.xml @@ -30,15 +30,20 @@ maven-compiler-plugin - - - - io.quarkus - quarkus-extension-processor - ${project.version} - - - + + + default-compile + + + + io.quarkus + quarkus-extension-processor + ${project.version} + + + + + diff --git a/extensions/flyway-mssql/runtime/pom.xml b/extensions/flyway-mssql/runtime/pom.xml index 33b476f0aa217..ad0c6a78ad29f 100644 --- a/extensions/flyway-mssql/runtime/pom.xml +++ b/extensions/flyway-mssql/runtime/pom.xml @@ -53,15 +53,20 @@ maven-compiler-plugin - - - - io.quarkus - quarkus-extension-processor - ${project.version} - - - + + + default-compile + + + + io.quarkus + quarkus-extension-processor + ${project.version} + + + + + diff --git a/extensions/flyway-mysql/deployment/pom.xml b/extensions/flyway-mysql/deployment/pom.xml index 14aebf42a3c05..157743dc1847f 100644 --- a/extensions/flyway-mysql/deployment/pom.xml +++ b/extensions/flyway-mysql/deployment/pom.xml @@ -30,15 +30,20 @@ maven-compiler-plugin - - - - io.quarkus - quarkus-extension-processor - ${project.version} - - - + + + default-compile + + + + io.quarkus + quarkus-extension-processor + ${project.version} + + + + + diff --git a/extensions/flyway-mysql/runtime/pom.xml b/extensions/flyway-mysql/runtime/pom.xml index 3e6cf49fcaedf..8a574090882b0 100644 --- a/extensions/flyway-mysql/runtime/pom.xml +++ b/extensions/flyway-mysql/runtime/pom.xml @@ -53,15 +53,20 @@ maven-compiler-plugin - - - - io.quarkus - quarkus-extension-processor - ${project.version} - - - + + + default-compile + + + + io.quarkus + quarkus-extension-processor + ${project.version} + + + + + diff --git a/extensions/flyway-oracle/deployment/pom.xml b/extensions/flyway-oracle/deployment/pom.xml index c0a208a23538b..8f739e68f3e9b 100644 --- a/extensions/flyway-oracle/deployment/pom.xml +++ b/extensions/flyway-oracle/deployment/pom.xml @@ -30,15 +30,20 @@ maven-compiler-plugin - - - - io.quarkus - quarkus-extension-processor - ${project.version} - - - + + + default-compile + + + + io.quarkus + quarkus-extension-processor + ${project.version} + + + + + diff --git a/extensions/flyway-oracle/runtime/pom.xml b/extensions/flyway-oracle/runtime/pom.xml index 114910cfd069e..436acd351abe5 100644 --- a/extensions/flyway-oracle/runtime/pom.xml +++ b/extensions/flyway-oracle/runtime/pom.xml @@ -53,15 +53,20 @@ maven-compiler-plugin - - - - io.quarkus - quarkus-extension-processor - ${project.version} - - - + + + default-compile + + + + io.quarkus + quarkus-extension-processor + ${project.version} + + + + + diff --git a/extensions/flyway-postgresql/deployment/pom.xml b/extensions/flyway-postgresql/deployment/pom.xml index cd40755fcef9a..bc9ad058f0cfa 100644 --- a/extensions/flyway-postgresql/deployment/pom.xml +++ b/extensions/flyway-postgresql/deployment/pom.xml @@ -29,15 +29,20 @@ maven-compiler-plugin - - - - io.quarkus - quarkus-extension-processor - ${project.version} - - - + + + default-compile + + + + io.quarkus + quarkus-extension-processor + ${project.version} + + + + + diff --git a/extensions/flyway-postgresql/runtime/pom.xml b/extensions/flyway-postgresql/runtime/pom.xml index 888a6ea4e52b1..a71dab2452c3f 100644 --- a/extensions/flyway-postgresql/runtime/pom.xml +++ b/extensions/flyway-postgresql/runtime/pom.xml @@ -51,15 +51,20 @@ maven-compiler-plugin - - - - io.quarkus - quarkus-extension-processor - ${project.version} - - - + + + default-compile + + + + io.quarkus + quarkus-extension-processor + ${project.version} + + + + + diff --git a/extensions/flyway/deployment/pom.xml b/extensions/flyway/deployment/pom.xml index 3c1f451996e23..da0f30f213e9a 100644 --- a/extensions/flyway/deployment/pom.xml +++ b/extensions/flyway/deployment/pom.xml @@ -75,18 +75,23 @@ maven-compiler-plugin - - - - io.quarkus - quarkus-extension-processor - ${project.version} - - - - -AlegacyConfigRoot=true - - + + + default-compile + + + + io.quarkus + quarkus-extension-processor + ${project.version} + + + + -AlegacyConfigRoot=true + + + + diff --git a/extensions/flyway/runtime/pom.xml b/extensions/flyway/runtime/pom.xml index d0de449dced8d..1c72cb73e60f8 100644 --- a/extensions/flyway/runtime/pom.xml +++ b/extensions/flyway/runtime/pom.xml @@ -70,18 +70,23 @@ maven-compiler-plugin - - - - io.quarkus - quarkus-extension-processor - ${project.version} - - - - -AlegacyConfigRoot=true - - + + + default-compile + + + + io.quarkus + quarkus-extension-processor + ${project.version} + + + + -AlegacyConfigRoot=true + + + + diff --git a/extensions/funqy/funqy-amazon-lambda/deployment/pom.xml b/extensions/funqy/funqy-amazon-lambda/deployment/pom.xml index 159c1b235e5ad..c0d5463ef9e70 100644 --- a/extensions/funqy/funqy-amazon-lambda/deployment/pom.xml +++ b/extensions/funqy/funqy-amazon-lambda/deployment/pom.xml @@ -45,15 +45,20 @@ maven-compiler-plugin - - - - io.quarkus - quarkus-extension-processor - ${project.version} - - - + + + default-compile + + + + io.quarkus + quarkus-extension-processor + ${project.version} + + + + + diff --git a/extensions/funqy/funqy-amazon-lambda/runtime/pom.xml b/extensions/funqy/funqy-amazon-lambda/runtime/pom.xml index ccf8a40910d24..5219f851ccb50 100644 --- a/extensions/funqy/funqy-amazon-lambda/runtime/pom.xml +++ b/extensions/funqy/funqy-amazon-lambda/runtime/pom.xml @@ -50,15 +50,20 @@ maven-compiler-plugin - - - - io.quarkus - quarkus-extension-processor - ${project.version} - - - + + + default-compile + + + + io.quarkus + quarkus-extension-processor + ${project.version} + + + + + diff --git a/extensions/funqy/funqy-google-cloud-functions/deployment/pom.xml b/extensions/funqy/funqy-google-cloud-functions/deployment/pom.xml index f61c2eeba3a36..537e2e0362963 100644 --- a/extensions/funqy/funqy-google-cloud-functions/deployment/pom.xml +++ b/extensions/funqy/funqy-google-cloud-functions/deployment/pom.xml @@ -31,15 +31,20 @@ maven-compiler-plugin - - - - io.quarkus - quarkus-extension-processor - ${project.version} - - - + + + default-compile + + + + io.quarkus + quarkus-extension-processor + ${project.version} + + + + + diff --git a/extensions/funqy/funqy-google-cloud-functions/runtime/pom.xml b/extensions/funqy/funqy-google-cloud-functions/runtime/pom.xml index 591dbaa49fde8..fdf7a1b572da6 100644 --- a/extensions/funqy/funqy-google-cloud-functions/runtime/pom.xml +++ b/extensions/funqy/funqy-google-cloud-functions/runtime/pom.xml @@ -37,15 +37,20 @@ maven-compiler-plugin - - - - io.quarkus - quarkus-extension-processor - ${project.version} - - - + + + default-compile + + + + io.quarkus + quarkus-extension-processor + ${project.version} + + + + + diff --git a/extensions/funqy/funqy-http/deployment/pom.xml b/extensions/funqy/funqy-http/deployment/pom.xml index 231189e3b612d..9558d9339c68e 100644 --- a/extensions/funqy/funqy-http/deployment/pom.xml +++ b/extensions/funqy/funqy-http/deployment/pom.xml @@ -49,15 +49,20 @@ maven-compiler-plugin - - - - io.quarkus - quarkus-extension-processor - ${project.version} - - - + + + default-compile + + + + io.quarkus + quarkus-extension-processor + ${project.version} + + + + + diff --git a/extensions/funqy/funqy-http/runtime/pom.xml b/extensions/funqy/funqy-http/runtime/pom.xml index f1620de0ac23d..387c94a72baef 100644 --- a/extensions/funqy/funqy-http/runtime/pom.xml +++ b/extensions/funqy/funqy-http/runtime/pom.xml @@ -36,15 +36,20 @@ maven-compiler-plugin - - - - io.quarkus - quarkus-extension-processor - ${project.version} - - - + + + default-compile + + + + io.quarkus + quarkus-extension-processor + ${project.version} + + + + + diff --git a/extensions/funqy/funqy-knative-events/deployment/pom.xml b/extensions/funqy/funqy-knative-events/deployment/pom.xml index 74bd363b04f64..e5d33f9511422 100644 --- a/extensions/funqy/funqy-knative-events/deployment/pom.xml +++ b/extensions/funqy/funqy-knative-events/deployment/pom.xml @@ -49,18 +49,23 @@ maven-compiler-plugin - - - - io.quarkus - quarkus-extension-processor - ${project.version} - - - - -AlegacyConfigRoot=true - - + + + default-compile + + + + io.quarkus + quarkus-extension-processor + ${project.version} + + + + -AlegacyConfigRoot=true + + + + diff --git a/extensions/funqy/funqy-knative-events/runtime/pom.xml b/extensions/funqy/funqy-knative-events/runtime/pom.xml index 32c3518f662cc..242cd82ecac69 100644 --- a/extensions/funqy/funqy-knative-events/runtime/pom.xml +++ b/extensions/funqy/funqy-knative-events/runtime/pom.xml @@ -36,18 +36,23 @@ maven-compiler-plugin - - - - io.quarkus - quarkus-extension-processor - ${project.version} - - - - -AlegacyConfigRoot=true - - + + + default-compile + + + + io.quarkus + quarkus-extension-processor + ${project.version} + + + + -AlegacyConfigRoot=true + + + + diff --git a/extensions/funqy/funqy-server-common/deployment/pom.xml b/extensions/funqy/funqy-server-common/deployment/pom.xml index b4c3366eb875c..e3bc1f8f1c790 100644 --- a/extensions/funqy/funqy-server-common/deployment/pom.xml +++ b/extensions/funqy/funqy-server-common/deployment/pom.xml @@ -36,18 +36,23 @@ maven-compiler-plugin - - - - io.quarkus - quarkus-extension-processor - ${project.version} - - - - -AlegacyConfigRoot=true - - + + + default-compile + + + + io.quarkus + quarkus-extension-processor + ${project.version} + + + + -AlegacyConfigRoot=true + + + + diff --git a/extensions/funqy/funqy-server-common/runtime/pom.xml b/extensions/funqy/funqy-server-common/runtime/pom.xml index 06acbfaa9afb8..fd679939c8faf 100644 --- a/extensions/funqy/funqy-server-common/runtime/pom.xml +++ b/extensions/funqy/funqy-server-common/runtime/pom.xml @@ -41,18 +41,23 @@ maven-compiler-plugin - - - - io.quarkus - quarkus-extension-processor - ${project.version} - - - - -AlegacyConfigRoot=true - - + + + default-compile + + + + io.quarkus + quarkus-extension-processor + ${project.version} + + + + -AlegacyConfigRoot=true + + + + diff --git a/extensions/google-cloud-functions-http/deployment/pom.xml b/extensions/google-cloud-functions-http/deployment/pom.xml index 4af62db26e4b9..7726237a3a3e2 100644 --- a/extensions/google-cloud-functions-http/deployment/pom.xml +++ b/extensions/google-cloud-functions-http/deployment/pom.xml @@ -27,15 +27,20 @@ maven-compiler-plugin - - - - io.quarkus - quarkus-extension-processor - ${project.version} - - - + + + default-compile + + + + io.quarkus + quarkus-extension-processor + ${project.version} + + + + + diff --git a/extensions/google-cloud-functions-http/runtime/pom.xml b/extensions/google-cloud-functions-http/runtime/pom.xml index bc8e03a2eb6ac..1d3444e9781cd 100644 --- a/extensions/google-cloud-functions-http/runtime/pom.xml +++ b/extensions/google-cloud-functions-http/runtime/pom.xml @@ -52,15 +52,20 @@ maven-compiler-plugin - - - - io.quarkus - quarkus-extension-processor - ${project.version} - - - + + + default-compile + + + + io.quarkus + quarkus-extension-processor + ${project.version} + + + + + diff --git a/extensions/google-cloud-functions/deployment/pom.xml b/extensions/google-cloud-functions/deployment/pom.xml index 60a2204484876..83abc5b968a54 100644 --- a/extensions/google-cloud-functions/deployment/pom.xml +++ b/extensions/google-cloud-functions/deployment/pom.xml @@ -32,18 +32,23 @@ maven-compiler-plugin - - - - io.quarkus - quarkus-extension-processor - ${project.version} - - - - -AlegacyConfigRoot=true - - + + + default-compile + + + + io.quarkus + quarkus-extension-processor + ${project.version} + + + + -AlegacyConfigRoot=true + + + + diff --git a/extensions/google-cloud-functions/runtime/pom.xml b/extensions/google-cloud-functions/runtime/pom.xml index 400198e1afba2..df657c49d4b12 100644 --- a/extensions/google-cloud-functions/runtime/pom.xml +++ b/extensions/google-cloud-functions/runtime/pom.xml @@ -44,18 +44,23 @@ maven-compiler-plugin - - - - io.quarkus - quarkus-extension-processor - ${project.version} - - - - -AlegacyConfigRoot=true - - + + + default-compile + + + + io.quarkus + quarkus-extension-processor + ${project.version} + + + + -AlegacyConfigRoot=true + + + + diff --git a/extensions/grpc-common/deployment/pom.xml b/extensions/grpc-common/deployment/pom.xml index 801044c4f2937..72cf9aaeb62ad 100644 --- a/extensions/grpc-common/deployment/pom.xml +++ b/extensions/grpc-common/deployment/pom.xml @@ -31,15 +31,20 @@ maven-compiler-plugin - - - - io.quarkus - quarkus-extension-processor - ${project.version} - - - + + + default-compile + + + + io.quarkus + quarkus-extension-processor + ${project.version} + + + + + diff --git a/extensions/grpc-common/runtime/pom.xml b/extensions/grpc-common/runtime/pom.xml index 3cb6eed8d0cad..473ace72cdc4b 100644 --- a/extensions/grpc-common/runtime/pom.xml +++ b/extensions/grpc-common/runtime/pom.xml @@ -144,15 +144,20 @@ maven-compiler-plugin - - - - io.quarkus - quarkus-extension-processor - ${project.version} - - - + + + default-compile + + + + io.quarkus + quarkus-extension-processor + ${project.version} + + + + + diff --git a/extensions/grpc/deployment/pom.xml b/extensions/grpc/deployment/pom.xml index 5bc308b2424b1..c19904ab9df5d 100644 --- a/extensions/grpc/deployment/pom.xml +++ b/extensions/grpc/deployment/pom.xml @@ -148,18 +148,23 @@ maven-compiler-plugin - - - - io.quarkus - quarkus-extension-processor - ${project.version} - - - - -AlegacyConfigRoot=true - - + + + default-compile + + + + io.quarkus + quarkus-extension-processor + ${project.version} + + + + -AlegacyConfigRoot=true + + + + diff --git a/extensions/grpc/runtime/pom.xml b/extensions/grpc/runtime/pom.xml index 28a72c291ac98..575081b4b9efe 100644 --- a/extensions/grpc/runtime/pom.xml +++ b/extensions/grpc/runtime/pom.xml @@ -144,18 +144,23 @@ maven-compiler-plugin - - - - io.quarkus - quarkus-extension-processor - ${project.version} - - - - -AlegacyConfigRoot=true - - + + + default-compile + + + + io.quarkus + quarkus-extension-processor + ${project.version} + + + + -AlegacyConfigRoot=true + + + + diff --git a/extensions/hal/deployment/pom.xml b/extensions/hal/deployment/pom.xml index db8ffa13a6051..dde2d68dd266a 100644 --- a/extensions/hal/deployment/pom.xml +++ b/extensions/hal/deployment/pom.xml @@ -44,15 +44,20 @@ maven-compiler-plugin - - - - io.quarkus - quarkus-extension-processor - ${project.version} - - - + + + default-compile + + + + io.quarkus + quarkus-extension-processor + ${project.version} + + + + + diff --git a/extensions/hal/runtime/pom.xml b/extensions/hal/runtime/pom.xml index d039cb3b17211..45ddf474d13d1 100644 --- a/extensions/hal/runtime/pom.xml +++ b/extensions/hal/runtime/pom.xml @@ -55,15 +55,20 @@ maven-compiler-plugin - - - - io.quarkus - quarkus-extension-processor - ${project.version} - - - + + + default-compile + + + + io.quarkus + quarkus-extension-processor + ${project.version} + + + + + diff --git a/extensions/hibernate-envers/runtime/pom.xml b/extensions/hibernate-envers/runtime/pom.xml index 41b3444e4709e..4702377f1e02c 100644 --- a/extensions/hibernate-envers/runtime/pom.xml +++ b/extensions/hibernate-envers/runtime/pom.xml @@ -43,15 +43,20 @@ maven-compiler-plugin - - - - io.quarkus - quarkus-extension-processor - ${project.version} - - - + + + default-compile + + + + io.quarkus + quarkus-extension-processor + ${project.version} + + + + + diff --git a/extensions/hibernate-orm/deployment/pom.xml b/extensions/hibernate-orm/deployment/pom.xml index 50e05c8cb1d84..e17abfe0a5389 100644 --- a/extensions/hibernate-orm/deployment/pom.xml +++ b/extensions/hibernate-orm/deployment/pom.xml @@ -149,15 +149,20 @@ maven-compiler-plugin - - - - io.quarkus - quarkus-extension-processor - ${project.version} - - - + + + default-compile + + + + io.quarkus + quarkus-extension-processor + ${project.version} + + + + + de.thetaphi diff --git a/extensions/hibernate-orm/runtime/pom.xml b/extensions/hibernate-orm/runtime/pom.xml index 3b245c312644f..205773ecdff7a 100644 --- a/extensions/hibernate-orm/runtime/pom.xml +++ b/extensions/hibernate-orm/runtime/pom.xml @@ -157,15 +157,20 @@ maven-compiler-plugin - - - - io.quarkus - quarkus-extension-processor - ${project.version} - - - + + + default-compile + + + + io.quarkus + quarkus-extension-processor + ${project.version} + + + + + de.thetaphi diff --git a/extensions/hibernate-reactive/deployment/pom.xml b/extensions/hibernate-reactive/deployment/pom.xml index 3de9ecda87870..6d050bed88146 100644 --- a/extensions/hibernate-reactive/deployment/pom.xml +++ b/extensions/hibernate-reactive/deployment/pom.xml @@ -115,15 +115,20 @@ maven-compiler-plugin - - - - io.quarkus - quarkus-extension-processor - ${project.version} - - - + + + default-compile + + + + io.quarkus + quarkus-extension-processor + ${project.version} + + + + + maven-surefire-plugin diff --git a/extensions/hibernate-reactive/runtime/pom.xml b/extensions/hibernate-reactive/runtime/pom.xml index c81f0fe70013e..d6e3d7f3dc860 100644 --- a/extensions/hibernate-reactive/runtime/pom.xml +++ b/extensions/hibernate-reactive/runtime/pom.xml @@ -70,15 +70,20 @@ maven-compiler-plugin - - - - io.quarkus - quarkus-extension-processor - ${project.version} - - - + + + default-compile + + + + io.quarkus + quarkus-extension-processor + ${project.version} + + + + + diff --git a/extensions/hibernate-search-orm-elasticsearch/deployment/pom.xml b/extensions/hibernate-search-orm-elasticsearch/deployment/pom.xml index dcd3adfbb183a..6862482c6010a 100644 --- a/extensions/hibernate-search-orm-elasticsearch/deployment/pom.xml +++ b/extensions/hibernate-search-orm-elasticsearch/deployment/pom.xml @@ -75,15 +75,20 @@ maven-compiler-plugin - - - - io.quarkus - quarkus-extension-processor - ${project.version} - - - + + + default-compile + + + + io.quarkus + quarkus-extension-processor + ${project.version} + + + + + maven-surefire-plugin diff --git a/extensions/hibernate-search-orm-elasticsearch/runtime/pom.xml b/extensions/hibernate-search-orm-elasticsearch/runtime/pom.xml index 77d2fb9a7882c..12b6c1e1dd0b0 100644 --- a/extensions/hibernate-search-orm-elasticsearch/runtime/pom.xml +++ b/extensions/hibernate-search-orm-elasticsearch/runtime/pom.xml @@ -62,15 +62,20 @@ maven-compiler-plugin - - - - io.quarkus - quarkus-extension-processor - ${project.version} - - - + + + default-compile + + + + io.quarkus + quarkus-extension-processor + ${project.version} + + + + + diff --git a/extensions/hibernate-search-orm-outbox-polling/deployment/pom.xml b/extensions/hibernate-search-orm-outbox-polling/deployment/pom.xml index b5f2c6ebadea8..7b0718ded58d2 100644 --- a/extensions/hibernate-search-orm-outbox-polling/deployment/pom.xml +++ b/extensions/hibernate-search-orm-outbox-polling/deployment/pom.xml @@ -57,15 +57,20 @@ maven-compiler-plugin - - - - io.quarkus - quarkus-extension-processor - ${project.version} - - - + + + default-compile + + + + io.quarkus + quarkus-extension-processor + ${project.version} + + + + + maven-surefire-plugin diff --git a/extensions/hibernate-search-orm-outbox-polling/runtime/pom.xml b/extensions/hibernate-search-orm-outbox-polling/runtime/pom.xml index 24d030c4640e5..40489f092eaf2 100644 --- a/extensions/hibernate-search-orm-outbox-polling/runtime/pom.xml +++ b/extensions/hibernate-search-orm-outbox-polling/runtime/pom.xml @@ -44,15 +44,20 @@ maven-compiler-plugin - - - - io.quarkus - quarkus-extension-processor - ${project.version} - - - + + + default-compile + + + + io.quarkus + quarkus-extension-processor + ${project.version} + + + + + diff --git a/extensions/hibernate-search-standalone-elasticsearch/deployment/pom.xml b/extensions/hibernate-search-standalone-elasticsearch/deployment/pom.xml index bcd5021446075..b4ad5c85ba44b 100644 --- a/extensions/hibernate-search-standalone-elasticsearch/deployment/pom.xml +++ b/extensions/hibernate-search-standalone-elasticsearch/deployment/pom.xml @@ -61,15 +61,20 @@ maven-compiler-plugin - - - - io.quarkus - quarkus-extension-processor - ${project.version} - - - + + + default-compile + + + + io.quarkus + quarkus-extension-processor + ${project.version} + + + + + maven-surefire-plugin diff --git a/extensions/hibernate-search-standalone-elasticsearch/runtime/pom.xml b/extensions/hibernate-search-standalone-elasticsearch/runtime/pom.xml index ede21091a94f2..d71267a449b66 100644 --- a/extensions/hibernate-search-standalone-elasticsearch/runtime/pom.xml +++ b/extensions/hibernate-search-standalone-elasticsearch/runtime/pom.xml @@ -54,15 +54,20 @@ maven-compiler-plugin - - - - io.quarkus - quarkus-extension-processor - ${project.version} - - - + + + default-compile + + + + io.quarkus + quarkus-extension-processor + ${project.version} + + + + + diff --git a/extensions/hibernate-validator/deployment/pom.xml b/extensions/hibernate-validator/deployment/pom.xml index f72296bc8d1b8..3b525bd111dbc 100644 --- a/extensions/hibernate-validator/deployment/pom.xml +++ b/extensions/hibernate-validator/deployment/pom.xml @@ -72,15 +72,20 @@ maven-compiler-plugin - - - - io.quarkus - quarkus-extension-processor - ${project.version} - - - + + + default-compile + + + + io.quarkus + quarkus-extension-processor + ${project.version} + + + + + diff --git a/extensions/hibernate-validator/runtime/pom.xml b/extensions/hibernate-validator/runtime/pom.xml index 719e40c6e00f3..b83260dea01d7 100644 --- a/extensions/hibernate-validator/runtime/pom.xml +++ b/extensions/hibernate-validator/runtime/pom.xml @@ -111,15 +111,20 @@ maven-compiler-plugin - - - - io.quarkus - quarkus-extension-processor - ${project.version} - - - + + + default-compile + + + + io.quarkus + quarkus-extension-processor + ${project.version} + + + + + diff --git a/extensions/infinispan-cache/deployment/pom.xml b/extensions/infinispan-cache/deployment/pom.xml index df5cc11be2e2a..5254fcbc79e3a 100644 --- a/extensions/infinispan-cache/deployment/pom.xml +++ b/extensions/infinispan-cache/deployment/pom.xml @@ -46,18 +46,23 @@ maven-compiler-plugin - - - - io.quarkus - quarkus-extension-processor - ${project.version} - - - - -AlegacyConfigRoot=true - - + + + default-compile + + + + io.quarkus + quarkus-extension-processor + ${project.version} + + + + -AlegacyConfigRoot=true + + + + maven-surefire-plugin diff --git a/extensions/infinispan-cache/runtime/pom.xml b/extensions/infinispan-cache/runtime/pom.xml index ab067a6180106..979be55c201a1 100644 --- a/extensions/infinispan-cache/runtime/pom.xml +++ b/extensions/infinispan-cache/runtime/pom.xml @@ -31,18 +31,23 @@ maven-compiler-plugin - - - - io.quarkus - quarkus-extension-processor - ${project.version} - - - - -AlegacyConfigRoot=true - - + + + default-compile + + + + io.quarkus + quarkus-extension-processor + ${project.version} + + + + -AlegacyConfigRoot=true + + + + maven-surefire-plugin diff --git a/extensions/infinispan-client/deployment/pom.xml b/extensions/infinispan-client/deployment/pom.xml index 30e38d54fb483..d015e1389bbc9 100644 --- a/extensions/infinispan-client/deployment/pom.xml +++ b/extensions/infinispan-client/deployment/pom.xml @@ -100,18 +100,23 @@ maven-compiler-plugin - - - - io.quarkus - quarkus-extension-processor - ${project.version} - - - - -AlegacyConfigRoot=true - - + + + default-compile + + + + io.quarkus + quarkus-extension-processor + ${project.version} + + + + -AlegacyConfigRoot=true + + + + maven-surefire-plugin diff --git a/extensions/infinispan-client/runtime/pom.xml b/extensions/infinispan-client/runtime/pom.xml index 582e732f2190b..46275ca6a714c 100644 --- a/extensions/infinispan-client/runtime/pom.xml +++ b/extensions/infinispan-client/runtime/pom.xml @@ -165,18 +165,23 @@ maven-compiler-plugin - - - - io.quarkus - quarkus-extension-processor - ${project.version} - - - - -AlegacyConfigRoot=true - - + + + default-compile + + + + io.quarkus + quarkus-extension-processor + ${project.version} + + + + -AlegacyConfigRoot=true + + + + diff --git a/extensions/info/deployment/pom.xml b/extensions/info/deployment/pom.xml index d3cfb4c382c11..1e852cc47cc12 100644 --- a/extensions/info/deployment/pom.xml +++ b/extensions/info/deployment/pom.xml @@ -50,15 +50,20 @@ maven-compiler-plugin - - - - io.quarkus - quarkus-extension-processor - ${project.version} - - - + + + default-compile + + + + io.quarkus + quarkus-extension-processor + ${project.version} + + + + + diff --git a/extensions/info/runtime-spi/pom.xml b/extensions/info/runtime-spi/pom.xml index 907051e281480..0b6c219db7b99 100644 --- a/extensions/info/runtime-spi/pom.xml +++ b/extensions/info/runtime-spi/pom.xml @@ -24,15 +24,20 @@ maven-compiler-plugin - - - - io.quarkus - quarkus-extension-processor - ${project.version} - - - + + + default-compile + + + + io.quarkus + quarkus-extension-processor + ${project.version} + + + + + diff --git a/extensions/info/runtime/pom.xml b/extensions/info/runtime/pom.xml index 727ab44443390..d0ebaf6e5555b 100644 --- a/extensions/info/runtime/pom.xml +++ b/extensions/info/runtime/pom.xml @@ -31,15 +31,20 @@ maven-compiler-plugin - - - - io.quarkus - quarkus-extension-processor - ${project.version} - - - + + + default-compile + + + + io.quarkus + quarkus-extension-processor + ${project.version} + + + + + diff --git a/extensions/jackson/deployment/pom.xml b/extensions/jackson/deployment/pom.xml index dce12472f36ee..a67b293e16e3a 100644 --- a/extensions/jackson/deployment/pom.xml +++ b/extensions/jackson/deployment/pom.xml @@ -45,18 +45,23 @@ maven-compiler-plugin - - - - io.quarkus - quarkus-extension-processor - ${project.version} - - - - -AlegacyConfigRoot=true - - + + + default-compile + + + + io.quarkus + quarkus-extension-processor + ${project.version} + + + + -AlegacyConfigRoot=true + + + + diff --git a/extensions/jackson/runtime/pom.xml b/extensions/jackson/runtime/pom.xml index 0cfed83c76c06..fafc5dde6bc8e 100644 --- a/extensions/jackson/runtime/pom.xml +++ b/extensions/jackson/runtime/pom.xml @@ -53,18 +53,23 @@ maven-compiler-plugin - - - - io.quarkus - quarkus-extension-processor - ${project.version} - - - - -AlegacyConfigRoot=true - - + + + default-compile + + + + io.quarkus + quarkus-extension-processor + ${project.version} + + + + -AlegacyConfigRoot=true + + + + diff --git a/extensions/jaxb/deployment/pom.xml b/extensions/jaxb/deployment/pom.xml index 358a19aa6021a..15589c3c49e5b 100644 --- a/extensions/jaxb/deployment/pom.xml +++ b/extensions/jaxb/deployment/pom.xml @@ -45,18 +45,23 @@ maven-compiler-plugin - - - - io.quarkus - quarkus-extension-processor - ${project.version} - - - - -AlegacyConfigRoot=true - - + + + default-compile + + + + io.quarkus + quarkus-extension-processor + ${project.version} + + + + -AlegacyConfigRoot=true + + + + diff --git a/extensions/jaxb/runtime/pom.xml b/extensions/jaxb/runtime/pom.xml index e00894cfb5611..3c6144fcbb637 100644 --- a/extensions/jaxb/runtime/pom.xml +++ b/extensions/jaxb/runtime/pom.xml @@ -60,18 +60,23 @@ maven-compiler-plugin - - - - io.quarkus - quarkus-extension-processor - ${project.version} - - - - -AlegacyConfigRoot=true - - + + + default-compile + + + + io.quarkus + quarkus-extension-processor + ${project.version} + + + + -AlegacyConfigRoot=true + + + + diff --git a/extensions/jaxp/deployment/pom.xml b/extensions/jaxp/deployment/pom.xml index 7d03c794aa535..e512e05000873 100644 --- a/extensions/jaxp/deployment/pom.xml +++ b/extensions/jaxp/deployment/pom.xml @@ -27,15 +27,20 @@ maven-compiler-plugin - - - - io.quarkus - quarkus-extension-processor - ${project.version} - - - + + + default-compile + + + + io.quarkus + quarkus-extension-processor + ${project.version} + + + + + diff --git a/extensions/jaxp/runtime/pom.xml b/extensions/jaxp/runtime/pom.xml index c670dfaf44b4d..6705d7fd4df46 100644 --- a/extensions/jaxp/runtime/pom.xml +++ b/extensions/jaxp/runtime/pom.xml @@ -32,15 +32,20 @@ maven-compiler-plugin - - - - io.quarkus - quarkus-extension-processor - ${project.version} - - - + + + default-compile + + + + io.quarkus + quarkus-extension-processor + ${project.version} + + + + + diff --git a/extensions/jdbc/jdbc-db2/deployment/pom.xml b/extensions/jdbc/jdbc-db2/deployment/pom.xml index 166828fa26b2e..2b648a98a4c86 100644 --- a/extensions/jdbc/jdbc-db2/deployment/pom.xml +++ b/extensions/jdbc/jdbc-db2/deployment/pom.xml @@ -70,15 +70,20 @@ maven-compiler-plugin - - - - io.quarkus - quarkus-extension-processor - ${project.version} - - - + + + default-compile + + + + io.quarkus + quarkus-extension-processor + ${project.version} + + + + + org.apache.maven.plugins diff --git a/extensions/jdbc/jdbc-db2/runtime/pom.xml b/extensions/jdbc/jdbc-db2/runtime/pom.xml index ddcca4ceaf092..cb0903d562df5 100644 --- a/extensions/jdbc/jdbc-db2/runtime/pom.xml +++ b/extensions/jdbc/jdbc-db2/runtime/pom.xml @@ -52,15 +52,20 @@ maven-compiler-plugin - - - - io.quarkus - quarkus-extension-processor - ${project.version} - - - + + + default-compile + + + + io.quarkus + quarkus-extension-processor + ${project.version} + + + + + diff --git a/extensions/jdbc/jdbc-derby/deployment/pom.xml b/extensions/jdbc/jdbc-derby/deployment/pom.xml index 77d8f5cf58eac..65e40b59bf6a3 100644 --- a/extensions/jdbc/jdbc-derby/deployment/pom.xml +++ b/extensions/jdbc/jdbc-derby/deployment/pom.xml @@ -59,15 +59,20 @@ maven-compiler-plugin - - - - io.quarkus - quarkus-extension-processor - ${project.version} - - - + + + default-compile + + + + io.quarkus + quarkus-extension-processor + ${project.version} + + + + + org.apache.maven.plugins diff --git a/extensions/jdbc/jdbc-derby/runtime/pom.xml b/extensions/jdbc/jdbc-derby/runtime/pom.xml index 36c13190b0465..172374f698b9c 100644 --- a/extensions/jdbc/jdbc-derby/runtime/pom.xml +++ b/extensions/jdbc/jdbc-derby/runtime/pom.xml @@ -57,15 +57,20 @@ maven-compiler-plugin - - - - io.quarkus - quarkus-extension-processor - ${project.version} - - - + + + default-compile + + + + io.quarkus + quarkus-extension-processor + ${project.version} + + + + + diff --git a/extensions/jdbc/jdbc-h2/deployment/pom.xml b/extensions/jdbc/jdbc-h2/deployment/pom.xml index b40927eefcb7f..c0bbe8bda24c3 100644 --- a/extensions/jdbc/jdbc-h2/deployment/pom.xml +++ b/extensions/jdbc/jdbc-h2/deployment/pom.xml @@ -39,15 +39,20 @@ maven-compiler-plugin - - - - io.quarkus - quarkus-extension-processor - ${project.version} - - - + + + default-compile + + + + io.quarkus + quarkus-extension-processor + ${project.version} + + + + + diff --git a/extensions/jdbc/jdbc-h2/runtime/pom.xml b/extensions/jdbc/jdbc-h2/runtime/pom.xml index ef1752782a3aa..10d8bffac8580 100644 --- a/extensions/jdbc/jdbc-h2/runtime/pom.xml +++ b/extensions/jdbc/jdbc-h2/runtime/pom.xml @@ -59,15 +59,20 @@ maven-compiler-plugin - - - - io.quarkus - quarkus-extension-processor - ${project.version} - - - + + + default-compile + + + + io.quarkus + quarkus-extension-processor + ${project.version} + + + + + diff --git a/extensions/jdbc/jdbc-mariadb/deployment/pom.xml b/extensions/jdbc/jdbc-mariadb/deployment/pom.xml index 7e2e7b91334dc..1e6ffd8c4bb5a 100644 --- a/extensions/jdbc/jdbc-mariadb/deployment/pom.xml +++ b/extensions/jdbc/jdbc-mariadb/deployment/pom.xml @@ -54,15 +54,20 @@ maven-compiler-plugin - - - - io.quarkus - quarkus-extension-processor - ${project.version} - - - + + + default-compile + + + + io.quarkus + quarkus-extension-processor + ${project.version} + + + + + org.apache.maven.plugins diff --git a/extensions/jdbc/jdbc-mariadb/runtime/pom.xml b/extensions/jdbc/jdbc-mariadb/runtime/pom.xml index 55f026b98ab1c..13abcad7ceabf 100644 --- a/extensions/jdbc/jdbc-mariadb/runtime/pom.xml +++ b/extensions/jdbc/jdbc-mariadb/runtime/pom.xml @@ -51,15 +51,20 @@ maven-compiler-plugin - - - - io.quarkus - quarkus-extension-processor - ${project.version} - - - + + + default-compile + + + + io.quarkus + quarkus-extension-processor + ${project.version} + + + + + diff --git a/extensions/jdbc/jdbc-mssql/deployment/pom.xml b/extensions/jdbc/jdbc-mssql/deployment/pom.xml index 3ccf780a6b7db..356c3c44725c6 100644 --- a/extensions/jdbc/jdbc-mssql/deployment/pom.xml +++ b/extensions/jdbc/jdbc-mssql/deployment/pom.xml @@ -65,15 +65,20 @@ maven-compiler-plugin - - - - io.quarkus - quarkus-extension-processor - ${project.version} - - - + + + default-compile + + + + io.quarkus + quarkus-extension-processor + ${project.version} + + + + + org.apache.maven.plugins diff --git a/extensions/jdbc/jdbc-mssql/runtime/pom.xml b/extensions/jdbc/jdbc-mssql/runtime/pom.xml index e37a9c288d3cb..fd031ce3fee00 100644 --- a/extensions/jdbc/jdbc-mssql/runtime/pom.xml +++ b/extensions/jdbc/jdbc-mssql/runtime/pom.xml @@ -61,15 +61,20 @@ maven-compiler-plugin - - - - io.quarkus - quarkus-extension-processor - ${project.version} - - - + + + default-compile + + + + io.quarkus + quarkus-extension-processor + ${project.version} + + + + + diff --git a/extensions/jdbc/jdbc-mysql/deployment/pom.xml b/extensions/jdbc/jdbc-mysql/deployment/pom.xml index 8772725e22c27..2aca2c9c90244 100644 --- a/extensions/jdbc/jdbc-mysql/deployment/pom.xml +++ b/extensions/jdbc/jdbc-mysql/deployment/pom.xml @@ -59,15 +59,20 @@ maven-compiler-plugin - - - - io.quarkus - quarkus-extension-processor - ${project.version} - - - + + + default-compile + + + + io.quarkus + quarkus-extension-processor + ${project.version} + + + + + org.apache.maven.plugins diff --git a/extensions/jdbc/jdbc-mysql/runtime/pom.xml b/extensions/jdbc/jdbc-mysql/runtime/pom.xml index 663c5842fa21c..9cbc61aefd416 100644 --- a/extensions/jdbc/jdbc-mysql/runtime/pom.xml +++ b/extensions/jdbc/jdbc-mysql/runtime/pom.xml @@ -56,15 +56,20 @@ maven-compiler-plugin - - - - io.quarkus - quarkus-extension-processor - ${project.version} - - - + + + default-compile + + + + io.quarkus + quarkus-extension-processor + ${project.version} + + + + + diff --git a/extensions/jdbc/jdbc-oracle/deployment/pom.xml b/extensions/jdbc/jdbc-oracle/deployment/pom.xml index db294d7e445a5..62900bd6de815 100644 --- a/extensions/jdbc/jdbc-oracle/deployment/pom.xml +++ b/extensions/jdbc/jdbc-oracle/deployment/pom.xml @@ -59,15 +59,20 @@ maven-compiler-plugin - - - - io.quarkus - quarkus-extension-processor - ${project.version} - - - + + + default-compile + + + + io.quarkus + quarkus-extension-processor + ${project.version} + + + + + org.apache.maven.plugins diff --git a/extensions/jdbc/jdbc-oracle/runtime/pom.xml b/extensions/jdbc/jdbc-oracle/runtime/pom.xml index 22fbcd6e64364..a8fea051f9cd5 100644 --- a/extensions/jdbc/jdbc-oracle/runtime/pom.xml +++ b/extensions/jdbc/jdbc-oracle/runtime/pom.xml @@ -60,15 +60,20 @@ maven-compiler-plugin - - - - io.quarkus - quarkus-extension-processor - ${project.version} - - - + + + default-compile + + + + io.quarkus + quarkus-extension-processor + ${project.version} + + + + + diff --git a/extensions/jdbc/jdbc-postgresql/deployment/pom.xml b/extensions/jdbc/jdbc-postgresql/deployment/pom.xml index bf9a0c4bc1b8b..acc108ca7da1a 100644 --- a/extensions/jdbc/jdbc-postgresql/deployment/pom.xml +++ b/extensions/jdbc/jdbc-postgresql/deployment/pom.xml @@ -71,15 +71,20 @@ maven-compiler-plugin - - - - io.quarkus - quarkus-extension-processor - ${project.version} - - - + + + default-compile + + + + io.quarkus + quarkus-extension-processor + ${project.version} + + + + + org.apache.maven.plugins diff --git a/extensions/jdbc/jdbc-postgresql/runtime/pom.xml b/extensions/jdbc/jdbc-postgresql/runtime/pom.xml index 72fc3ff672cef..a44c67ce6a581 100644 --- a/extensions/jdbc/jdbc-postgresql/runtime/pom.xml +++ b/extensions/jdbc/jdbc-postgresql/runtime/pom.xml @@ -68,15 +68,20 @@ maven-compiler-plugin - - - - io.quarkus - quarkus-extension-processor - ${project.version} - - - + + + default-compile + + + + io.quarkus + quarkus-extension-processor + ${project.version} + + + + + diff --git a/extensions/jfr/deployment/pom.xml b/extensions/jfr/deployment/pom.xml index b12e3229d802a..0cf61e5aa8530 100644 --- a/extensions/jfr/deployment/pom.xml +++ b/extensions/jfr/deployment/pom.xml @@ -40,15 +40,20 @@ maven-compiler-plugin - - - - io.quarkus - quarkus-extension-processor - ${project.version} - - - + + + default-compile + + + + io.quarkus + quarkus-extension-processor + ${project.version} + + + + + diff --git a/extensions/jfr/runtime/pom.xml b/extensions/jfr/runtime/pom.xml index efa6681a02da4..6a55bc5f17daf 100644 --- a/extensions/jfr/runtime/pom.xml +++ b/extensions/jfr/runtime/pom.xml @@ -57,15 +57,20 @@ maven-compiler-plugin - - - - io.quarkus - quarkus-extension-processor - ${project.version} - - - + + + default-compile + + + + io.quarkus + quarkus-extension-processor + ${project.version} + + + + + diff --git a/extensions/jsonb/deployment/pom.xml b/extensions/jsonb/deployment/pom.xml index e9e1ed14ace61..459d613b94431 100644 --- a/extensions/jsonb/deployment/pom.xml +++ b/extensions/jsonb/deployment/pom.xml @@ -44,15 +44,20 @@ maven-compiler-plugin - - - - io.quarkus - quarkus-extension-processor - ${project.version} - - - + + + default-compile + + + + io.quarkus + quarkus-extension-processor + ${project.version} + + + + + diff --git a/extensions/jsonb/runtime/pom.xml b/extensions/jsonb/runtime/pom.xml index 93749d61689a8..3374bec58e757 100644 --- a/extensions/jsonb/runtime/pom.xml +++ b/extensions/jsonb/runtime/pom.xml @@ -52,15 +52,20 @@ maven-compiler-plugin - - - - io.quarkus - quarkus-extension-processor - ${project.version} - - - + + + default-compile + + + + io.quarkus + quarkus-extension-processor + ${project.version} + + + + + diff --git a/extensions/jsonp/deployment/pom.xml b/extensions/jsonp/deployment/pom.xml index 6aa5775e3f5b9..e802ef5fd9fbf 100644 --- a/extensions/jsonp/deployment/pom.xml +++ b/extensions/jsonp/deployment/pom.xml @@ -27,15 +27,20 @@ maven-compiler-plugin - - - - io.quarkus - quarkus-extension-processor - ${project.version} - - - + + + default-compile + + + + io.quarkus + quarkus-extension-processor + ${project.version} + + + + + diff --git a/extensions/jsonp/runtime/pom.xml b/extensions/jsonp/runtime/pom.xml index 649e4da7478e6..9b737cc826852 100644 --- a/extensions/jsonp/runtime/pom.xml +++ b/extensions/jsonp/runtime/pom.xml @@ -43,15 +43,20 @@ maven-compiler-plugin - - - - io.quarkus - quarkus-extension-processor - ${project.version} - - - + + + default-compile + + + + io.quarkus + quarkus-extension-processor + ${project.version} + + + + + diff --git a/extensions/kafka-client/deployment/pom.xml b/extensions/kafka-client/deployment/pom.xml index 386074633b536..936dd84eaf808 100644 --- a/extensions/kafka-client/deployment/pom.xml +++ b/extensions/kafka-client/deployment/pom.xml @@ -73,18 +73,23 @@ maven-compiler-plugin - - - - io.quarkus - quarkus-extension-processor - ${project.version} - - - - -AlegacyConfigRoot=true - - + + + default-compile + + + + io.quarkus + quarkus-extension-processor + ${project.version} + + + + -AlegacyConfigRoot=true + + + + diff --git a/extensions/kafka-client/runtime/pom.xml b/extensions/kafka-client/runtime/pom.xml index 91b804c269ba7..6571aa714bb34 100644 --- a/extensions/kafka-client/runtime/pom.xml +++ b/extensions/kafka-client/runtime/pom.xml @@ -90,18 +90,23 @@ maven-compiler-plugin - - - - io.quarkus - quarkus-extension-processor - ${project.version} - - - - -AlegacyConfigRoot=true - - + + + default-compile + + + + io.quarkus + quarkus-extension-processor + ${project.version} + + + + -AlegacyConfigRoot=true + + + + diff --git a/extensions/kafka-streams/deployment/pom.xml b/extensions/kafka-streams/deployment/pom.xml index 4c1a79ee82c4c..392701b2a2a75 100644 --- a/extensions/kafka-streams/deployment/pom.xml +++ b/extensions/kafka-streams/deployment/pom.xml @@ -55,18 +55,23 @@ maven-compiler-plugin - - - - io.quarkus - quarkus-extension-processor - ${project.version} - - - - -AlegacyConfigRoot=true - - + + + default-compile + + + + io.quarkus + quarkus-extension-processor + ${project.version} + + + + -AlegacyConfigRoot=true + + + + diff --git a/extensions/kafka-streams/runtime/pom.xml b/extensions/kafka-streams/runtime/pom.xml index b6d7f288f4128..e89e81725e8f4 100644 --- a/extensions/kafka-streams/runtime/pom.xml +++ b/extensions/kafka-streams/runtime/pom.xml @@ -65,18 +65,23 @@ maven-compiler-plugin - - - - io.quarkus - quarkus-extension-processor - ${project.version} - - - - -AlegacyConfigRoot=true - - + + + default-compile + + + + io.quarkus + quarkus-extension-processor + ${project.version} + + + + -AlegacyConfigRoot=true + + + + diff --git a/extensions/keycloak-admin-client-common/deployment/pom.xml b/extensions/keycloak-admin-client-common/deployment/pom.xml index e0bf3d218dc33..eb3187ea0436f 100644 --- a/extensions/keycloak-admin-client-common/deployment/pom.xml +++ b/extensions/keycloak-admin-client-common/deployment/pom.xml @@ -36,15 +36,20 @@ maven-compiler-plugin - - - - io.quarkus - quarkus-extension-processor - ${project.version} - - - + + + default-compile + + + + io.quarkus + quarkus-extension-processor + ${project.version} + + + + + diff --git a/extensions/keycloak-admin-client-common/runtime/pom.xml b/extensions/keycloak-admin-client-common/runtime/pom.xml index d33dace5e17a5..099491ac0ae6b 100644 --- a/extensions/keycloak-admin-client-common/runtime/pom.xml +++ b/extensions/keycloak-admin-client-common/runtime/pom.xml @@ -31,15 +31,20 @@ maven-compiler-plugin - - - - io.quarkus - quarkus-extension-processor - ${project.version} - - - + + + default-compile + + + + io.quarkus + quarkus-extension-processor + ${project.version} + + + + + diff --git a/extensions/keycloak-admin-rest-client/deployment/pom.xml b/extensions/keycloak-admin-rest-client/deployment/pom.xml index 528786f991fc2..a8fe4071dfff9 100644 --- a/extensions/keycloak-admin-rest-client/deployment/pom.xml +++ b/extensions/keycloak-admin-rest-client/deployment/pom.xml @@ -62,15 +62,20 @@ maven-compiler-plugin - - - - io.quarkus - quarkus-extension-processor - ${project.version} - - - + + + default-compile + + + + io.quarkus + quarkus-extension-processor + ${project.version} + + + + + org.apache.maven.plugins diff --git a/extensions/keycloak-admin-rest-client/runtime/pom.xml b/extensions/keycloak-admin-rest-client/runtime/pom.xml index e204f2f79ecee..7daec9e854335 100644 --- a/extensions/keycloak-admin-rest-client/runtime/pom.xml +++ b/extensions/keycloak-admin-rest-client/runtime/pom.xml @@ -88,15 +88,20 @@ maven-compiler-plugin - - - - io.quarkus - quarkus-extension-processor - ${project.version} - - - + + + default-compile + + + + io.quarkus + quarkus-extension-processor + ${project.version} + + + + + diff --git a/extensions/keycloak-admin-resteasy-client/deployment/pom.xml b/extensions/keycloak-admin-resteasy-client/deployment/pom.xml index 2f93c9876805c..9c07f98455388 100644 --- a/extensions/keycloak-admin-resteasy-client/deployment/pom.xml +++ b/extensions/keycloak-admin-resteasy-client/deployment/pom.xml @@ -70,15 +70,20 @@ maven-compiler-plugin - - - - io.quarkus - quarkus-extension-processor - ${project.version} - - - + + + default-compile + + + + io.quarkus + quarkus-extension-processor + ${project.version} + + + + + org.apache.maven.plugins diff --git a/extensions/keycloak-admin-resteasy-client/runtime/pom.xml b/extensions/keycloak-admin-resteasy-client/runtime/pom.xml index 00afe7ca465f6..dc3f73112bcf5 100644 --- a/extensions/keycloak-admin-resteasy-client/runtime/pom.xml +++ b/extensions/keycloak-admin-resteasy-client/runtime/pom.xml @@ -108,15 +108,20 @@ maven-compiler-plugin - - - - io.quarkus - quarkus-extension-processor - ${project.version} - - - + + + default-compile + + + + io.quarkus + quarkus-extension-processor + ${project.version} + + + + + diff --git a/extensions/keycloak-authorization/deployment/pom.xml b/extensions/keycloak-authorization/deployment/pom.xml index 5850d95fa50da..c76a2ada27e1d 100644 --- a/extensions/keycloak-authorization/deployment/pom.xml +++ b/extensions/keycloak-authorization/deployment/pom.xml @@ -76,15 +76,20 @@ maven-compiler-plugin - - - - io.quarkus - quarkus-extension-processor - ${project.version} - - - + + + default-compile + + + + io.quarkus + quarkus-extension-processor + ${project.version} + + + + + diff --git a/extensions/keycloak-authorization/runtime/pom.xml b/extensions/keycloak-authorization/runtime/pom.xml index d04a87ea641ff..a49332d94f3ad 100644 --- a/extensions/keycloak-authorization/runtime/pom.xml +++ b/extensions/keycloak-authorization/runtime/pom.xml @@ -78,15 +78,20 @@ maven-compiler-plugin - - - - io.quarkus - quarkus-extension-processor - ${project.version} - - - + + + default-compile + + + + io.quarkus + quarkus-extension-processor + ${project.version} + + + + + diff --git a/extensions/kotlin/deployment/pom.xml b/extensions/kotlin/deployment/pom.xml index 9515f8f899c83..dbd398037a393 100644 --- a/extensions/kotlin/deployment/pom.xml +++ b/extensions/kotlin/deployment/pom.xml @@ -39,15 +39,20 @@ maven-compiler-plugin - - - - io.quarkus - quarkus-extension-processor - ${project.version} - - - + + + default-compile + + + + io.quarkus + quarkus-extension-processor + ${project.version} + + + + + diff --git a/extensions/kubernetes-client/deployment-internal/pom.xml b/extensions/kubernetes-client/deployment-internal/pom.xml index 432475ce82b80..a7a3f1c050546 100644 --- a/extensions/kubernetes-client/deployment-internal/pom.xml +++ b/extensions/kubernetes-client/deployment-internal/pom.xml @@ -58,15 +58,20 @@ maven-compiler-plugin - - - - io.quarkus - quarkus-extension-processor - ${project.version} - - - + + + default-compile + + + + io.quarkus + quarkus-extension-processor + ${project.version} + + + + + diff --git a/extensions/kubernetes-client/deployment/pom.xml b/extensions/kubernetes-client/deployment/pom.xml index bf94885a44d04..711fba34c843a 100644 --- a/extensions/kubernetes-client/deployment/pom.xml +++ b/extensions/kubernetes-client/deployment/pom.xml @@ -50,15 +50,20 @@ maven-compiler-plugin - - - - io.quarkus - quarkus-extension-processor - ${project.version} - - - + + + default-compile + + + + io.quarkus + quarkus-extension-processor + ${project.version} + + + + + org.codehaus.mojo diff --git a/extensions/kubernetes-client/runtime-internal/pom.xml b/extensions/kubernetes-client/runtime-internal/pom.xml index 205a0202b99c0..cf4ca8c7cc6d2 100644 --- a/extensions/kubernetes-client/runtime-internal/pom.xml +++ b/extensions/kubernetes-client/runtime-internal/pom.xml @@ -49,15 +49,20 @@ maven-compiler-plugin - - - - io.quarkus - quarkus-extension-processor - ${project.version} - - - + + + default-compile + + + + io.quarkus + quarkus-extension-processor + ${project.version} + + + + + diff --git a/extensions/kubernetes-client/runtime/pom.xml b/extensions/kubernetes-client/runtime/pom.xml index f5ce060c5e4eb..0b365260ecf8c 100644 --- a/extensions/kubernetes-client/runtime/pom.xml +++ b/extensions/kubernetes-client/runtime/pom.xml @@ -85,15 +85,20 @@ maven-compiler-plugin - - - - io.quarkus - quarkus-extension-processor - ${project.version} - - - + + + default-compile + + + + io.quarkus + quarkus-extension-processor + ${project.version} + + + + + diff --git a/extensions/kubernetes-client/spi/pom.xml b/extensions/kubernetes-client/spi/pom.xml index a2d91bf7654e7..2c0a2fb139ef7 100644 --- a/extensions/kubernetes-client/spi/pom.xml +++ b/extensions/kubernetes-client/spi/pom.xml @@ -50,15 +50,20 @@ maven-compiler-plugin - - - - io.quarkus - quarkus-extension-processor - ${project.version} - - - + + + default-compile + + + + io.quarkus + quarkus-extension-processor + ${project.version} + + + + + diff --git a/extensions/kubernetes-config/deployment/pom.xml b/extensions/kubernetes-config/deployment/pom.xml index cf9f194469148..e97def48c326f 100644 --- a/extensions/kubernetes-config/deployment/pom.xml +++ b/extensions/kubernetes-config/deployment/pom.xml @@ -28,15 +28,20 @@ maven-compiler-plugin - - - - io.quarkus - quarkus-extension-processor - ${project.version} - - - + + + default-compile + + + + io.quarkus + quarkus-extension-processor + ${project.version} + + + + + diff --git a/extensions/kubernetes-config/runtime/pom.xml b/extensions/kubernetes-config/runtime/pom.xml index e35f6c4527f7f..17c4e4dd4e520 100644 --- a/extensions/kubernetes-config/runtime/pom.xml +++ b/extensions/kubernetes-config/runtime/pom.xml @@ -44,15 +44,20 @@ maven-compiler-plugin - - - - io.quarkus - quarkus-extension-processor - ${project.version} - - - + + + default-compile + + + + io.quarkus + quarkus-extension-processor + ${project.version} + + + + + diff --git a/extensions/kubernetes-service-binding/deployment/pom.xml b/extensions/kubernetes-service-binding/deployment/pom.xml index eb5dc13cb87b0..7ce4a69a57de7 100644 --- a/extensions/kubernetes-service-binding/deployment/pom.xml +++ b/extensions/kubernetes-service-binding/deployment/pom.xml @@ -75,15 +75,20 @@ maven-compiler-plugin - - - - io.quarkus - quarkus-extension-processor - ${project.version} - - - + + + default-compile + + + + io.quarkus + quarkus-extension-processor + ${project.version} + + + + + diff --git a/extensions/kubernetes-service-binding/runtime/pom.xml b/extensions/kubernetes-service-binding/runtime/pom.xml index d8444f1a192ef..bfbaf1d045e8a 100644 --- a/extensions/kubernetes-service-binding/runtime/pom.xml +++ b/extensions/kubernetes-service-binding/runtime/pom.xml @@ -49,15 +49,20 @@ maven-compiler-plugin - - - - io.quarkus - quarkus-extension-processor - ${project.version} - - - + + + default-compile + + + + io.quarkus + quarkus-extension-processor + ${project.version} + + + + + diff --git a/extensions/kubernetes/kind/deployment/pom.xml b/extensions/kubernetes/kind/deployment/pom.xml index cfbc1ef49ae53..0f0a6a55cfa75 100644 --- a/extensions/kubernetes/kind/deployment/pom.xml +++ b/extensions/kubernetes/kind/deployment/pom.xml @@ -46,15 +46,20 @@ maven-compiler-plugin - - - - io.quarkus - quarkus-extension-processor - ${project.version} - - - + + + default-compile + + + + io.quarkus + quarkus-extension-processor + ${project.version} + + + + + diff --git a/extensions/kubernetes/kind/runtime/pom.xml b/extensions/kubernetes/kind/runtime/pom.xml index a37e3ebd2901d..8f67df7e81d7b 100644 --- a/extensions/kubernetes/kind/runtime/pom.xml +++ b/extensions/kubernetes/kind/runtime/pom.xml @@ -34,15 +34,20 @@ maven-compiler-plugin - - - - io.quarkus - quarkus-extension-processor - ${project.version} - - - + + + default-compile + + + + io.quarkus + quarkus-extension-processor + ${project.version} + + + + + diff --git a/extensions/kubernetes/minikube/deployment/pom.xml b/extensions/kubernetes/minikube/deployment/pom.xml index 48c76e5f16fcc..15fc2708efb9b 100644 --- a/extensions/kubernetes/minikube/deployment/pom.xml +++ b/extensions/kubernetes/minikube/deployment/pom.xml @@ -27,15 +27,20 @@ maven-compiler-plugin - - - - io.quarkus - quarkus-extension-processor - ${project.version} - - - + + + default-compile + + + + io.quarkus + quarkus-extension-processor + ${project.version} + + + + + diff --git a/extensions/kubernetes/minikube/runtime/pom.xml b/extensions/kubernetes/minikube/runtime/pom.xml index c77b3f572aa6c..9db64e2c2979c 100644 --- a/extensions/kubernetes/minikube/runtime/pom.xml +++ b/extensions/kubernetes/minikube/runtime/pom.xml @@ -34,15 +34,20 @@ maven-compiler-plugin - - - - io.quarkus - quarkus-extension-processor - ${project.version} - - - + + + default-compile + + + + io.quarkus + quarkus-extension-processor + ${project.version} + + + + + diff --git a/extensions/kubernetes/openshift/deployment/pom.xml b/extensions/kubernetes/openshift/deployment/pom.xml index d6db4ae0a1272..f2a48b367751e 100644 --- a/extensions/kubernetes/openshift/deployment/pom.xml +++ b/extensions/kubernetes/openshift/deployment/pom.xml @@ -60,15 +60,20 @@ maven-compiler-plugin - - - - io.quarkus - quarkus-extension-processor - ${project.version} - - - + + + default-compile + + + + io.quarkus + quarkus-extension-processor + ${project.version} + + + + + diff --git a/extensions/kubernetes/openshift/runtime/pom.xml b/extensions/kubernetes/openshift/runtime/pom.xml index bf146e44ac642..c7459f4558832 100644 --- a/extensions/kubernetes/openshift/runtime/pom.xml +++ b/extensions/kubernetes/openshift/runtime/pom.xml @@ -46,15 +46,20 @@ maven-compiler-plugin - - - - io.quarkus - quarkus-extension-processor - ${project.version} - - - + + + default-compile + + + + io.quarkus + quarkus-extension-processor + ${project.version} + + + + + diff --git a/extensions/kubernetes/vanilla/deployment/pom.xml b/extensions/kubernetes/vanilla/deployment/pom.xml index fa6e216895b46..530f4c2f6ab21 100644 --- a/extensions/kubernetes/vanilla/deployment/pom.xml +++ b/extensions/kubernetes/vanilla/deployment/pom.xml @@ -121,18 +121,23 @@ maven-compiler-plugin - - - - io.quarkus - quarkus-extension-processor - ${project.version} - - - - -AlegacyConfigRoot=true - - + + + default-compile + + + + io.quarkus + quarkus-extension-processor + ${project.version} + + + + -AlegacyConfigRoot=true + + + + diff --git a/extensions/kubernetes/vanilla/runtime/pom.xml b/extensions/kubernetes/vanilla/runtime/pom.xml index 7fa0dbdb15066..aa5be8b7f33ce 100644 --- a/extensions/kubernetes/vanilla/runtime/pom.xml +++ b/extensions/kubernetes/vanilla/runtime/pom.xml @@ -34,18 +34,23 @@ maven-compiler-plugin - - - - io.quarkus - quarkus-extension-processor - ${project.version} - - - - -AlegacyConfigRoot=true - - + + + default-compile + + + + io.quarkus + quarkus-extension-processor + ${project.version} + + + + -AlegacyConfigRoot=true + + + + diff --git a/extensions/liquibase-mongodb/deployment/pom.xml b/extensions/liquibase-mongodb/deployment/pom.xml index b87cdef7a15a5..6ac0f8adb7e93 100644 --- a/extensions/liquibase-mongodb/deployment/pom.xml +++ b/extensions/liquibase-mongodb/deployment/pom.xml @@ -31,18 +31,23 @@ maven-compiler-plugin - - - - io.quarkus - quarkus-extension-processor - ${project.version} - - - - -AlegacyConfigRoot=true - - + + + default-compile + + + + io.quarkus + quarkus-extension-processor + ${project.version} + + + + -AlegacyConfigRoot=true + + + + diff --git a/extensions/liquibase-mongodb/runtime/pom.xml b/extensions/liquibase-mongodb/runtime/pom.xml index 9f00d207b9a8c..42a277a255599 100644 --- a/extensions/liquibase-mongodb/runtime/pom.xml +++ b/extensions/liquibase-mongodb/runtime/pom.xml @@ -64,18 +64,23 @@ maven-compiler-plugin - - - - io.quarkus - quarkus-extension-processor - ${project.version} - - - - -AlegacyConfigRoot=true - - + + + default-compile + + + + io.quarkus + quarkus-extension-processor + ${project.version} + + + + -AlegacyConfigRoot=true + + + + diff --git a/extensions/liquibase/deployment/pom.xml b/extensions/liquibase/deployment/pom.xml index 68728814b1c92..c41fc61187a3e 100644 --- a/extensions/liquibase/deployment/pom.xml +++ b/extensions/liquibase/deployment/pom.xml @@ -63,18 +63,23 @@ maven-compiler-plugin - - - - io.quarkus - quarkus-extension-processor - ${project.version} - - - - -AlegacyConfigRoot=true - - + + + default-compile + + + + io.quarkus + quarkus-extension-processor + ${project.version} + + + + -AlegacyConfigRoot=true + + + + diff --git a/extensions/liquibase/runtime/pom.xml b/extensions/liquibase/runtime/pom.xml index 20af4f5fc693b..2e094d6c9d4e3 100644 --- a/extensions/liquibase/runtime/pom.xml +++ b/extensions/liquibase/runtime/pom.xml @@ -82,18 +82,23 @@ maven-compiler-plugin - - - - io.quarkus - quarkus-extension-processor - ${project.version} - - - - -AlegacyConfigRoot=true - - + + + default-compile + + + + io.quarkus + quarkus-extension-processor + ${project.version} + + + + -AlegacyConfigRoot=true + + + + diff --git a/extensions/load-shedding/deployment/pom.xml b/extensions/load-shedding/deployment/pom.xml index 782ca14cbcfab..f711856cd346b 100644 --- a/extensions/load-shedding/deployment/pom.xml +++ b/extensions/load-shedding/deployment/pom.xml @@ -51,15 +51,20 @@ maven-compiler-plugin - - - - io.quarkus - quarkus-extension-processor - ${project.version} - - - + + + default-compile + + + + io.quarkus + quarkus-extension-processor + ${project.version} + + + + + diff --git a/extensions/load-shedding/runtime/pom.xml b/extensions/load-shedding/runtime/pom.xml index 3636bd25a1b54..1cea8b4c8bfaa 100644 --- a/extensions/load-shedding/runtime/pom.xml +++ b/extensions/load-shedding/runtime/pom.xml @@ -30,15 +30,20 @@ maven-compiler-plugin - - - - io.quarkus - quarkus-extension-processor - ${project.version} - - - + + + default-compile + + + + io.quarkus + quarkus-extension-processor + ${project.version} + + + + + diff --git a/extensions/logging-json/deployment/pom.xml b/extensions/logging-json/deployment/pom.xml index 1bec885ed0858..673743cabce09 100644 --- a/extensions/logging-json/deployment/pom.xml +++ b/extensions/logging-json/deployment/pom.xml @@ -58,18 +58,23 @@ maven-compiler-plugin - - - - io.quarkus - quarkus-extension-processor - ${project.version} - - - - -AlegacyConfigRoot=true - - + + + default-compile + + + + io.quarkus + quarkus-extension-processor + ${project.version} + + + + -AlegacyConfigRoot=true + + + + diff --git a/extensions/logging-json/runtime/pom.xml b/extensions/logging-json/runtime/pom.xml index 44da82977e855..5372151fe388e 100644 --- a/extensions/logging-json/runtime/pom.xml +++ b/extensions/logging-json/runtime/pom.xml @@ -47,18 +47,23 @@ maven-compiler-plugin - - - - io.quarkus - quarkus-extension-processor - ${project.version} - - - - -AlegacyConfigRoot=true - - + + + default-compile + + + + io.quarkus + quarkus-extension-processor + ${project.version} + + + + -AlegacyConfigRoot=true + + + + diff --git a/extensions/mailer/deployment/pom.xml b/extensions/mailer/deployment/pom.xml index 580a5bd54d98d..40145227a5c34 100644 --- a/extensions/mailer/deployment/pom.xml +++ b/extensions/mailer/deployment/pom.xml @@ -48,18 +48,23 @@ maven-compiler-plugin - - - - io.quarkus - quarkus-extension-processor - ${project.version} - - - - -AlegacyConfigRoot=true - - + + + default-compile + + + + io.quarkus + quarkus-extension-processor + ${project.version} + + + + -AlegacyConfigRoot=true + + + + diff --git a/extensions/mailer/runtime/pom.xml b/extensions/mailer/runtime/pom.xml index 09d472852f87d..d271031465011 100644 --- a/extensions/mailer/runtime/pom.xml +++ b/extensions/mailer/runtime/pom.xml @@ -84,18 +84,23 @@ maven-compiler-plugin - - - - io.quarkus - quarkus-extension-processor - ${project.version} - - - - -AlegacyConfigRoot=true - - + + + default-compile + + + + io.quarkus + quarkus-extension-processor + ${project.version} + + + + -AlegacyConfigRoot=true + + + + diff --git a/extensions/micrometer-registry-prometheus/deployment/pom.xml b/extensions/micrometer-registry-prometheus/deployment/pom.xml index 564787cd0eea2..e1b665a45f8c0 100644 --- a/extensions/micrometer-registry-prometheus/deployment/pom.xml +++ b/extensions/micrometer-registry-prometheus/deployment/pom.xml @@ -45,15 +45,20 @@ maven-compiler-plugin - - - - io.quarkus - quarkus-extension-processor - ${project.version} - - - + + + default-compile + + + + io.quarkus + quarkus-extension-processor + ${project.version} + + + + + diff --git a/extensions/micrometer-registry-prometheus/runtime/pom.xml b/extensions/micrometer-registry-prometheus/runtime/pom.xml index ffd82405dc019..1027bba2f1548 100644 --- a/extensions/micrometer-registry-prometheus/runtime/pom.xml +++ b/extensions/micrometer-registry-prometheus/runtime/pom.xml @@ -45,15 +45,20 @@ maven-compiler-plugin - - - - io.quarkus - quarkus-extension-processor - ${project.version} - - - + + + default-compile + + + + io.quarkus + quarkus-extension-processor + ${project.version} + + + + + diff --git a/extensions/micrometer/deployment/pom.xml b/extensions/micrometer/deployment/pom.xml index bf7df9e9b6988..cf068ad6c8e55 100644 --- a/extensions/micrometer/deployment/pom.xml +++ b/extensions/micrometer/deployment/pom.xml @@ -160,18 +160,23 @@ maven-compiler-plugin - - - - io.quarkus - quarkus-extension-processor - ${project.version} - - - - -AlegacyConfigRoot=true - - + + + default-compile + + + + io.quarkus + quarkus-extension-processor + ${project.version} + + + + -AlegacyConfigRoot=true + + + + diff --git a/extensions/micrometer/runtime/pom.xml b/extensions/micrometer/runtime/pom.xml index 878a5e9c4d44c..5573112a7d4b0 100644 --- a/extensions/micrometer/runtime/pom.xml +++ b/extensions/micrometer/runtime/pom.xml @@ -164,18 +164,23 @@ maven-compiler-plugin - - - - io.quarkus - quarkus-extension-processor - ${project.version} - - - - -AlegacyConfigRoot=true - - + + + default-compile + + + + io.quarkus + quarkus-extension-processor + ${project.version} + + + + -AlegacyConfigRoot=true + + + + diff --git a/extensions/mongodb-client/deployment/pom.xml b/extensions/mongodb-client/deployment/pom.xml index 904e27de62bce..8bd99d1840900 100644 --- a/extensions/mongodb-client/deployment/pom.xml +++ b/extensions/mongodb-client/deployment/pom.xml @@ -108,18 +108,23 @@ maven-compiler-plugin - - - - io.quarkus - quarkus-extension-processor - ${project.version} - - - - -AlegacyConfigRoot=true - - + + + default-compile + + + + io.quarkus + quarkus-extension-processor + ${project.version} + + + + -AlegacyConfigRoot=true + + + + diff --git a/extensions/mongodb-client/runtime/pom.xml b/extensions/mongodb-client/runtime/pom.xml index c2fb0e9e18741..0f6b273f5ad2a 100644 --- a/extensions/mongodb-client/runtime/pom.xml +++ b/extensions/mongodb-client/runtime/pom.xml @@ -145,18 +145,23 @@ maven-compiler-plugin - - - - io.quarkus - quarkus-extension-processor - ${project.version} - - - - -AlegacyConfigRoot=true - - + + + default-compile + + + + io.quarkus + quarkus-extension-processor + ${project.version} + + + + -AlegacyConfigRoot=true + + + + diff --git a/extensions/mutiny/deployment/pom.xml b/extensions/mutiny/deployment/pom.xml index 72292962fbcee..f7b1e6bc665f7 100644 --- a/extensions/mutiny/deployment/pom.xml +++ b/extensions/mutiny/deployment/pom.xml @@ -41,15 +41,20 @@ maven-compiler-plugin - - - - io.quarkus - quarkus-extension-processor - ${project.version} - - - + + + default-compile + + + + io.quarkus + quarkus-extension-processor + ${project.version} + + + + + diff --git a/extensions/mutiny/runtime/pom.xml b/extensions/mutiny/runtime/pom.xml index b688947b2d296..d371c3be102ee 100644 --- a/extensions/mutiny/runtime/pom.xml +++ b/extensions/mutiny/runtime/pom.xml @@ -62,15 +62,20 @@ maven-compiler-plugin - - - - io.quarkus - quarkus-extension-processor - ${project.version} - - - + + + default-compile + + + + io.quarkus + quarkus-extension-processor + ${project.version} + + + + + diff --git a/extensions/narayana-jta/deployment/pom.xml b/extensions/narayana-jta/deployment/pom.xml index 995ccd2508b4c..cd8deb7598f39 100644 --- a/extensions/narayana-jta/deployment/pom.xml +++ b/extensions/narayana-jta/deployment/pom.xml @@ -44,18 +44,23 @@ maven-compiler-plugin - - - - io.quarkus - quarkus-extension-processor - ${project.version} - - - - -AlegacyConfigRoot=true - - + + + default-compile + + + + io.quarkus + quarkus-extension-processor + ${project.version} + + + + -AlegacyConfigRoot=true + + + + diff --git a/extensions/narayana-jta/runtime/pom.xml b/extensions/narayana-jta/runtime/pom.xml index 3bac9cae29f68..fdd82659db7e4 100644 --- a/extensions/narayana-jta/runtime/pom.xml +++ b/extensions/narayana-jta/runtime/pom.xml @@ -109,18 +109,23 @@ maven-compiler-plugin - - - - io.quarkus - quarkus-extension-processor - ${project.version} - - - - -AlegacyConfigRoot=true - - + + + default-compile + + + + io.quarkus + quarkus-extension-processor + ${project.version} + + + + -AlegacyConfigRoot=true + + + + diff --git a/extensions/narayana-lra/deployment/pom.xml b/extensions/narayana-lra/deployment/pom.xml index c21863adc7bbb..ff54319bb966b 100644 --- a/extensions/narayana-lra/deployment/pom.xml +++ b/extensions/narayana-lra/deployment/pom.xml @@ -56,18 +56,23 @@ maven-compiler-plugin - - - - io.quarkus - quarkus-extension-processor - ${project.version} - - - - -AlegacyConfigRoot=true - - + + + default-compile + + + + io.quarkus + quarkus-extension-processor + ${project.version} + + + + -AlegacyConfigRoot=true + + + + diff --git a/extensions/narayana-lra/runtime/pom.xml b/extensions/narayana-lra/runtime/pom.xml index 1503de2a01631..5cd719cacd84b 100644 --- a/extensions/narayana-lra/runtime/pom.xml +++ b/extensions/narayana-lra/runtime/pom.xml @@ -81,18 +81,23 @@ maven-compiler-plugin - - - - io.quarkus - quarkus-extension-processor - ${project.version} - - - - -AlegacyConfigRoot=true - - + + + default-compile + + + + io.quarkus + quarkus-extension-processor + ${project.version} + + + + -AlegacyConfigRoot=true + + + + diff --git a/extensions/narayana-stm/deployment/pom.xml b/extensions/narayana-stm/deployment/pom.xml index acdb5d885726b..f89de1e3b1cbb 100644 --- a/extensions/narayana-stm/deployment/pom.xml +++ b/extensions/narayana-stm/deployment/pom.xml @@ -27,15 +27,20 @@ maven-compiler-plugin - - - - io.quarkus - quarkus-extension-processor - ${project.version} - - - + + + default-compile + + + + io.quarkus + quarkus-extension-processor + ${project.version} + + + + + diff --git a/extensions/narayana-stm/runtime/pom.xml b/extensions/narayana-stm/runtime/pom.xml index ef5f889702ea8..53063b07699c1 100644 --- a/extensions/narayana-stm/runtime/pom.xml +++ b/extensions/narayana-stm/runtime/pom.xml @@ -36,15 +36,20 @@ maven-compiler-plugin - - - - io.quarkus - quarkus-extension-processor - ${project.version} - - - + + + default-compile + + + + io.quarkus + quarkus-extension-processor + ${project.version} + + + + + diff --git a/extensions/netty/deployment/pom.xml b/extensions/netty/deployment/pom.xml index fbed3a4e867c8..ac6d6301d2c56 100644 --- a/extensions/netty/deployment/pom.xml +++ b/extensions/netty/deployment/pom.xml @@ -31,18 +31,23 @@ maven-compiler-plugin - - - - io.quarkus - quarkus-extension-processor - ${project.version} - - - - -AlegacyConfigRoot=true - - + + + default-compile + + + + io.quarkus + quarkus-extension-processor + ${project.version} + + + + -AlegacyConfigRoot=true + + + + diff --git a/extensions/netty/runtime/pom.xml b/extensions/netty/runtime/pom.xml index 903fae912f0ee..96b924e0ada49 100644 --- a/extensions/netty/runtime/pom.xml +++ b/extensions/netty/runtime/pom.xml @@ -80,18 +80,23 @@ maven-compiler-plugin - - - - io.quarkus - quarkus-extension-processor - ${project.version} - - - - -AlegacyConfigRoot=true - - + + + default-compile + + + + io.quarkus + quarkus-extension-processor + ${project.version} + + + + -AlegacyConfigRoot=true + + + + diff --git a/extensions/observability-devservices/common/pom.xml b/extensions/observability-devservices/common/pom.xml index 9a66a4be11340..59c8d83da4901 100644 --- a/extensions/observability-devservices/common/pom.xml +++ b/extensions/observability-devservices/common/pom.xml @@ -30,15 +30,20 @@ maven-compiler-plugin - - - - io.quarkus - quarkus-extension-processor - ${project.version} - - - + + + default-compile + + + + io.quarkus + quarkus-extension-processor + ${project.version} + + + + + diff --git a/extensions/observability-devservices/deployment/pom.xml b/extensions/observability-devservices/deployment/pom.xml index b2d7788a0da5c..b3bf7109d34bb 100644 --- a/extensions/observability-devservices/deployment/pom.xml +++ b/extensions/observability-devservices/deployment/pom.xml @@ -66,15 +66,20 @@ maven-compiler-plugin - - - - io.quarkus - quarkus-extension-processor - ${project.version} - - - + + + default-compile + + + + io.quarkus + quarkus-extension-processor + ${project.version} + + + + + diff --git a/extensions/observability-devservices/runtime/pom.xml b/extensions/observability-devservices/runtime/pom.xml index 0ef968108573c..66148ced300a3 100644 --- a/extensions/observability-devservices/runtime/pom.xml +++ b/extensions/observability-devservices/runtime/pom.xml @@ -74,15 +74,20 @@ maven-compiler-plugin - - - - io.quarkus - quarkus-extension-processor - ${project.version} - - - + + + default-compile + + + + io.quarkus + quarkus-extension-processor + ${project.version} + + + + + diff --git a/extensions/oidc-client-filter/deployment/pom.xml b/extensions/oidc-client-filter/deployment/pom.xml index cd85ae837259d..da942a2f90c09 100644 --- a/extensions/oidc-client-filter/deployment/pom.xml +++ b/extensions/oidc-client-filter/deployment/pom.xml @@ -74,15 +74,20 @@ maven-compiler-plugin - - - - io.quarkus - quarkus-extension-processor - ${project.version} - - - + + + default-compile + + + + io.quarkus + quarkus-extension-processor + ${project.version} + + + + + maven-surefire-plugin diff --git a/extensions/oidc-client-filter/runtime/pom.xml b/extensions/oidc-client-filter/runtime/pom.xml index 9efce9fcb7d36..5982ff89034e0 100644 --- a/extensions/oidc-client-filter/runtime/pom.xml +++ b/extensions/oidc-client-filter/runtime/pom.xml @@ -36,15 +36,20 @@ maven-compiler-plugin - - - - io.quarkus - quarkus-extension-processor - ${project.version} - - - + + + default-compile + + + + io.quarkus + quarkus-extension-processor + ${project.version} + + + + + diff --git a/extensions/oidc-client-graphql/deployment/pom.xml b/extensions/oidc-client-graphql/deployment/pom.xml index 68ee801e97f78..e6ee323239ea4 100644 --- a/extensions/oidc-client-graphql/deployment/pom.xml +++ b/extensions/oidc-client-graphql/deployment/pom.xml @@ -82,15 +82,20 @@ maven-compiler-plugin - - - - io.quarkus - quarkus-extension-processor - ${project.version} - - - + + + default-compile + + + + io.quarkus + quarkus-extension-processor + ${project.version} + + + + + maven-surefire-plugin diff --git a/extensions/oidc-client-graphql/runtime/pom.xml b/extensions/oidc-client-graphql/runtime/pom.xml index 8774f6c5829fc..7fda45075d1be 100644 --- a/extensions/oidc-client-graphql/runtime/pom.xml +++ b/extensions/oidc-client-graphql/runtime/pom.xml @@ -44,15 +44,20 @@ maven-compiler-plugin - - - - io.quarkus - quarkus-extension-processor - ${project.version} - - - + + + default-compile + + + + io.quarkus + quarkus-extension-processor + ${project.version} + + + + + diff --git a/extensions/oidc-client-reactive-filter/deployment/pom.xml b/extensions/oidc-client-reactive-filter/deployment/pom.xml index dfffe8e048677..f9af84357e3f6 100644 --- a/extensions/oidc-client-reactive-filter/deployment/pom.xml +++ b/extensions/oidc-client-reactive-filter/deployment/pom.xml @@ -69,15 +69,20 @@ maven-compiler-plugin - - - - io.quarkus - quarkus-extension-processor - ${project.version} - - - + + + default-compile + + + + io.quarkus + quarkus-extension-processor + ${project.version} + + + + + maven-surefire-plugin diff --git a/extensions/oidc-client-reactive-filter/runtime/pom.xml b/extensions/oidc-client-reactive-filter/runtime/pom.xml index 2376cb153126f..36fab0359d879 100644 --- a/extensions/oidc-client-reactive-filter/runtime/pom.xml +++ b/extensions/oidc-client-reactive-filter/runtime/pom.xml @@ -36,15 +36,20 @@ maven-compiler-plugin - - - - io.quarkus - quarkus-extension-processor - ${project.version} - - - + + + default-compile + + + + io.quarkus + quarkus-extension-processor + ${project.version} + + + + + diff --git a/extensions/oidc-client/deployment/pom.xml b/extensions/oidc-client/deployment/pom.xml index acdc840e03768..9dd676e25f712 100644 --- a/extensions/oidc-client/deployment/pom.xml +++ b/extensions/oidc-client/deployment/pom.xml @@ -106,18 +106,23 @@ maven-compiler-plugin - - - - io.quarkus - quarkus-extension-processor - ${project.version} - - - - -AlegacyConfigRoot=true - - + + + default-compile + + + + io.quarkus + quarkus-extension-processor + ${project.version} + + + + -AlegacyConfigRoot=true + + + + maven-surefire-plugin diff --git a/extensions/oidc-client/runtime/pom.xml b/extensions/oidc-client/runtime/pom.xml index 61270c3bbc3bb..35afc5fbf4ebf 100644 --- a/extensions/oidc-client/runtime/pom.xml +++ b/extensions/oidc-client/runtime/pom.xml @@ -40,18 +40,23 @@ maven-compiler-plugin - - - - io.quarkus - quarkus-extension-processor - ${project.version} - - - - -AlegacyConfigRoot=true - - + + + default-compile + + + + io.quarkus + quarkus-extension-processor + ${project.version} + + + + -AlegacyConfigRoot=true + + + + diff --git a/extensions/oidc-common/deployment/pom.xml b/extensions/oidc-common/deployment/pom.xml index abe96698b131e..6b8e565f4e77c 100644 --- a/extensions/oidc-common/deployment/pom.xml +++ b/extensions/oidc-common/deployment/pom.xml @@ -46,15 +46,20 @@ maven-compiler-plugin - - - - io.quarkus - quarkus-extension-processor - ${project.version} - - - + + + default-compile + + + + io.quarkus + quarkus-extension-processor + ${project.version} + + + + + diff --git a/extensions/oidc-common/runtime/pom.xml b/extensions/oidc-common/runtime/pom.xml index 4b749c95f65ef..ace03eb72f809 100644 --- a/extensions/oidc-common/runtime/pom.xml +++ b/extensions/oidc-common/runtime/pom.xml @@ -60,15 +60,20 @@ maven-compiler-plugin - - - - io.quarkus - quarkus-extension-processor - ${project.version} - - - + + + default-compile + + + + io.quarkus + quarkus-extension-processor + ${project.version} + + + + + diff --git a/extensions/oidc-db-token-state-manager/deployment/pom.xml b/extensions/oidc-db-token-state-manager/deployment/pom.xml index 41099ef5cec92..c4ec597917ab4 100644 --- a/extensions/oidc-db-token-state-manager/deployment/pom.xml +++ b/extensions/oidc-db-token-state-manager/deployment/pom.xml @@ -53,15 +53,20 @@ maven-compiler-plugin - - - - io.quarkus - quarkus-extension-processor - ${project.version} - - - + + + default-compile + + + + io.quarkus + quarkus-extension-processor + ${project.version} + + + + + maven-surefire-plugin diff --git a/extensions/oidc-db-token-state-manager/runtime/pom.xml b/extensions/oidc-db-token-state-manager/runtime/pom.xml index 856f59fa67828..e6eb08be72b51 100644 --- a/extensions/oidc-db-token-state-manager/runtime/pom.xml +++ b/extensions/oidc-db-token-state-manager/runtime/pom.xml @@ -30,15 +30,20 @@ maven-compiler-plugin - - - - io.quarkus - quarkus-extension-processor - ${project.version} - - - + + + default-compile + + + + io.quarkus + quarkus-extension-processor + ${project.version} + + + + + diff --git a/extensions/oidc-token-propagation-reactive/deployment/pom.xml b/extensions/oidc-token-propagation-reactive/deployment/pom.xml index 94133e45600cc..0dbe5a126b0d6 100644 --- a/extensions/oidc-token-propagation-reactive/deployment/pom.xml +++ b/extensions/oidc-token-propagation-reactive/deployment/pom.xml @@ -72,15 +72,20 @@ maven-compiler-plugin - - - - io.quarkus - quarkus-extension-processor - ${project.version} - - - + + + default-compile + + + + io.quarkus + quarkus-extension-processor + ${project.version} + + + + + maven-surefire-plugin diff --git a/extensions/oidc-token-propagation-reactive/runtime/pom.xml b/extensions/oidc-token-propagation-reactive/runtime/pom.xml index 043b4336885e3..e8b6b0cab747c 100644 --- a/extensions/oidc-token-propagation-reactive/runtime/pom.xml +++ b/extensions/oidc-token-propagation-reactive/runtime/pom.xml @@ -35,15 +35,20 @@ maven-compiler-plugin - - - - io.quarkus - quarkus-extension-processor - ${project.version} - - - + + + default-compile + + + + io.quarkus + quarkus-extension-processor + ${project.version} + + + + + diff --git a/extensions/oidc-token-propagation/deployment/pom.xml b/extensions/oidc-token-propagation/deployment/pom.xml index 9df8688efb579..562d4ad647127 100644 --- a/extensions/oidc-token-propagation/deployment/pom.xml +++ b/extensions/oidc-token-propagation/deployment/pom.xml @@ -65,15 +65,20 @@ maven-compiler-plugin - - - - io.quarkus - quarkus-extension-processor - ${project.version} - - - + + + default-compile + + + + io.quarkus + quarkus-extension-processor + ${project.version} + + + + + maven-surefire-plugin diff --git a/extensions/oidc-token-propagation/runtime/pom.xml b/extensions/oidc-token-propagation/runtime/pom.xml index cbd600a104d1a..5dc9a094fc416 100644 --- a/extensions/oidc-token-propagation/runtime/pom.xml +++ b/extensions/oidc-token-propagation/runtime/pom.xml @@ -43,15 +43,20 @@ maven-compiler-plugin - - - - io.quarkus - quarkus-extension-processor - ${project.version} - - - + + + default-compile + + + + io.quarkus + quarkus-extension-processor + ${project.version} + + + + + diff --git a/extensions/oidc/deployment/pom.xml b/extensions/oidc/deployment/pom.xml index 7bca0a28f535d..d7d217b5cb6c6 100644 --- a/extensions/oidc/deployment/pom.xml +++ b/extensions/oidc/deployment/pom.xml @@ -117,18 +117,23 @@ maven-compiler-plugin - - - - io.quarkus - quarkus-extension-processor - ${project.version} - - - - -AlegacyConfigRoot=true - - + + + default-compile + + + + io.quarkus + quarkus-extension-processor + ${project.version} + + + + -AlegacyConfigRoot=true + + + + maven-surefire-plugin diff --git a/extensions/oidc/runtime/pom.xml b/extensions/oidc/runtime/pom.xml index c50be32b3913f..6f14545605b5e 100644 --- a/extensions/oidc/runtime/pom.xml +++ b/extensions/oidc/runtime/pom.xml @@ -70,18 +70,23 @@ maven-compiler-plugin - - - - io.quarkus - quarkus-extension-processor - ${project.version} - - - - -AlegacyConfigRoot=true - - + + + default-compile + + + + io.quarkus + quarkus-extension-processor + ${project.version} + + + + -AlegacyConfigRoot=true + + + + diff --git a/extensions/openshift-client/deployment/pom.xml b/extensions/openshift-client/deployment/pom.xml index e5cd572c2c931..be6e59b1dc0d5 100644 --- a/extensions/openshift-client/deployment/pom.xml +++ b/extensions/openshift-client/deployment/pom.xml @@ -34,15 +34,20 @@ maven-compiler-plugin - - - - io.quarkus - quarkus-extension-processor - ${project.version} - - - + + + default-compile + + + + io.quarkus + quarkus-extension-processor + ${project.version} + + + + + diff --git a/extensions/openshift-client/runtime/pom.xml b/extensions/openshift-client/runtime/pom.xml index 59d3c57136b93..e0fd98a62bc54 100644 --- a/extensions/openshift-client/runtime/pom.xml +++ b/extensions/openshift-client/runtime/pom.xml @@ -61,15 +61,20 @@ maven-compiler-plugin - - - - io.quarkus - quarkus-extension-processor - ${project.version} - - - + + + default-compile + + + + io.quarkus + quarkus-extension-processor + ${project.version} + + + + + diff --git a/extensions/opentelemetry/deployment/pom.xml b/extensions/opentelemetry/deployment/pom.xml index edf033a78999f..9ba18f7033975 100644 --- a/extensions/opentelemetry/deployment/pom.xml +++ b/extensions/opentelemetry/deployment/pom.xml @@ -182,15 +182,20 @@ maven-compiler-plugin - - - - io.quarkus - quarkus-extension-processor - ${project.version} - - - + + + default-compile + + + + io.quarkus + quarkus-extension-processor + ${project.version} + + + + + diff --git a/extensions/opentelemetry/runtime/pom.xml b/extensions/opentelemetry/runtime/pom.xml index 5d3624fa1df12..e6abd62301dec 100644 --- a/extensions/opentelemetry/runtime/pom.xml +++ b/extensions/opentelemetry/runtime/pom.xml @@ -221,15 +221,20 @@ maven-compiler-plugin - - - - io.quarkus - quarkus-extension-processor - ${project.version} - - - + + + default-compile + + + + io.quarkus + quarkus-extension-processor + ${project.version} + + + + + diff --git a/extensions/panache/hibernate-orm-panache-common/deployment/pom.xml b/extensions/panache/hibernate-orm-panache-common/deployment/pom.xml index 8b7eaa28f86d8..3a0a2aeb6e229 100644 --- a/extensions/panache/hibernate-orm-panache-common/deployment/pom.xml +++ b/extensions/panache/hibernate-orm-panache-common/deployment/pom.xml @@ -41,15 +41,20 @@ maven-compiler-plugin - - - - io.quarkus - quarkus-extension-processor - ${project.version} - - - + + + default-compile + + + + io.quarkus + quarkus-extension-processor + ${project.version} + + + + + diff --git a/extensions/panache/hibernate-orm-panache/deployment/pom.xml b/extensions/panache/hibernate-orm-panache/deployment/pom.xml index 944df5b5c88b0..12d5d41e6364b 100644 --- a/extensions/panache/hibernate-orm-panache/deployment/pom.xml +++ b/extensions/panache/hibernate-orm-panache/deployment/pom.xml @@ -79,15 +79,20 @@ maven-compiler-plugin - - - - io.quarkus - quarkus-extension-processor - ${project.version} - - - + + + default-compile + + + + io.quarkus + quarkus-extension-processor + ${project.version} + + + + + diff --git a/extensions/panache/hibernate-reactive-panache-common/deployment/pom.xml b/extensions/panache/hibernate-reactive-panache-common/deployment/pom.xml index 79a4688e93f80..155c7fd4270cb 100644 --- a/extensions/panache/hibernate-reactive-panache-common/deployment/pom.xml +++ b/extensions/panache/hibernate-reactive-panache-common/deployment/pom.xml @@ -41,15 +41,20 @@ maven-compiler-plugin - - - - io.quarkus - quarkus-extension-processor - ${project.version} - - - + + + default-compile + + + + io.quarkus + quarkus-extension-processor + ${project.version} + + + + + maven-surefire-plugin diff --git a/extensions/panache/hibernate-reactive-panache/deployment/pom.xml b/extensions/panache/hibernate-reactive-panache/deployment/pom.xml index 96d701fed980e..ea051e1cfbb21 100644 --- a/extensions/panache/hibernate-reactive-panache/deployment/pom.xml +++ b/extensions/panache/hibernate-reactive-panache/deployment/pom.xml @@ -95,15 +95,20 @@ maven-compiler-plugin - - - - io.quarkus - quarkus-extension-processor - ${project.version} - - - + + + default-compile + + + + io.quarkus + quarkus-extension-processor + ${project.version} + + + + + diff --git a/extensions/panache/mongodb-panache-common/deployment/pom.xml b/extensions/panache/mongodb-panache-common/deployment/pom.xml index 65da08848ff74..b1fbfef414f3d 100644 --- a/extensions/panache/mongodb-panache-common/deployment/pom.xml +++ b/extensions/panache/mongodb-panache-common/deployment/pom.xml @@ -58,15 +58,20 @@ maven-compiler-plugin - - - - io.quarkus - quarkus-extension-processor - ${project.version} - - - + + + default-compile + + + + io.quarkus + quarkus-extension-processor + ${project.version} + + + + + diff --git a/extensions/panache/mongodb-panache-kotlin/deployment/pom.xml b/extensions/panache/mongodb-panache-kotlin/deployment/pom.xml index 4b5a1b081d010..ddd0ed62537a7 100644 --- a/extensions/panache/mongodb-panache-kotlin/deployment/pom.xml +++ b/extensions/panache/mongodb-panache-kotlin/deployment/pom.xml @@ -49,15 +49,20 @@ maven-compiler-plugin - - - - io.quarkus - quarkus-extension-processor - ${project.version} - - - + + + default-compile + + + + io.quarkus + quarkus-extension-processor + ${project.version} + + + + + org.jetbrains.kotlin diff --git a/extensions/panache/mongodb-panache/deployment/pom.xml b/extensions/panache/mongodb-panache/deployment/pom.xml index d7968ca5ac1b3..a51cd8bd288a1 100644 --- a/extensions/panache/mongodb-panache/deployment/pom.xml +++ b/extensions/panache/mongodb-panache/deployment/pom.xml @@ -49,15 +49,20 @@ maven-compiler-plugin - - - - io.quarkus - quarkus-extension-processor - ${project.version} - - - + + + default-compile + + + + io.quarkus + quarkus-extension-processor + ${project.version} + + + + + diff --git a/extensions/panache/panache-hibernate-common/deployment/pom.xml b/extensions/panache/panache-hibernate-common/deployment/pom.xml index dcd39aa2df0ae..67879e64b082f 100644 --- a/extensions/panache/panache-hibernate-common/deployment/pom.xml +++ b/extensions/panache/panache-hibernate-common/deployment/pom.xml @@ -41,15 +41,20 @@ maven-compiler-plugin - - - - io.quarkus - quarkus-extension-processor - ${project.version} - - - + + + default-compile + + + + io.quarkus + quarkus-extension-processor + ${project.version} + + + + + diff --git a/extensions/panache/rest-data-panache/runtime/pom.xml b/extensions/panache/rest-data-panache/runtime/pom.xml index feb96f6836516..2b673431e324d 100644 --- a/extensions/panache/rest-data-panache/runtime/pom.xml +++ b/extensions/panache/rest-data-panache/runtime/pom.xml @@ -74,15 +74,20 @@ maven-compiler-plugin - - - - io.quarkus - quarkus-extension-processor - ${project.version} - - - + + + default-compile + + + + io.quarkus + quarkus-extension-processor + ${project.version} + + + + + diff --git a/extensions/quartz/deployment/pom.xml b/extensions/quartz/deployment/pom.xml index 49f28a02297a3..b67c16e1a8706 100644 --- a/extensions/quartz/deployment/pom.xml +++ b/extensions/quartz/deployment/pom.xml @@ -61,18 +61,23 @@ maven-compiler-plugin - - - - io.quarkus - quarkus-extension-processor - ${project.version} - - - - -AlegacyConfigRoot=true - - + + + default-compile + + + + io.quarkus + quarkus-extension-processor + ${project.version} + + + + -AlegacyConfigRoot=true + + + + diff --git a/extensions/quartz/runtime/pom.xml b/extensions/quartz/runtime/pom.xml index 40c2e8b4b39fb..afb86369ef3b5 100644 --- a/extensions/quartz/runtime/pom.xml +++ b/extensions/quartz/runtime/pom.xml @@ -81,18 +81,23 @@ maven-compiler-plugin - - - - io.quarkus - quarkus-extension-processor - ${project.version} - - - - -AlegacyConfigRoot=true - - + + + default-compile + + + + io.quarkus + quarkus-extension-processor + ${project.version} + + + + -AlegacyConfigRoot=true + + + + diff --git a/extensions/qute/deployment/pom.xml b/extensions/qute/deployment/pom.xml index 9b3491c4e8640..893c79f081a83 100644 --- a/extensions/qute/deployment/pom.xml +++ b/extensions/qute/deployment/pom.xml @@ -69,18 +69,23 @@ maven-compiler-plugin - - - - io.quarkus - quarkus-extension-processor - ${project.version} - - - - -AlegacyConfigRoot=true - - + + + default-compile + + + + io.quarkus + quarkus-extension-processor + ${project.version} + + + + -AlegacyConfigRoot=true + + + + diff --git a/extensions/qute/runtime/pom.xml b/extensions/qute/runtime/pom.xml index 8203cef39bdc5..83a329d2a9ca5 100644 --- a/extensions/qute/runtime/pom.xml +++ b/extensions/qute/runtime/pom.xml @@ -46,18 +46,23 @@ maven-compiler-plugin - - - - io.quarkus - quarkus-extension-processor - ${project.version} - - - - -AlegacyConfigRoot=true - - + + + default-compile + + + + io.quarkus + quarkus-extension-processor + ${project.version} + + + + -AlegacyConfigRoot=true + + + + diff --git a/extensions/reactive-datasource/deployment/pom.xml b/extensions/reactive-datasource/deployment/pom.xml index 241c34489d393..cd72d1b43fd96 100644 --- a/extensions/reactive-datasource/deployment/pom.xml +++ b/extensions/reactive-datasource/deployment/pom.xml @@ -41,15 +41,20 @@ maven-compiler-plugin - - - - io.quarkus - quarkus-extension-processor - ${project.version} - - - + + + default-compile + + + + io.quarkus + quarkus-extension-processor + ${project.version} + + + + + org.apache.maven.plugins diff --git a/extensions/reactive-datasource/runtime/pom.xml b/extensions/reactive-datasource/runtime/pom.xml index 09bf734c38a53..065720604aea0 100644 --- a/extensions/reactive-datasource/runtime/pom.xml +++ b/extensions/reactive-datasource/runtime/pom.xml @@ -49,15 +49,20 @@ maven-compiler-plugin - - - - io.quarkus - quarkus-extension-processor - ${project.version} - - - + + + default-compile + + + + io.quarkus + quarkus-extension-processor + ${project.version} + + + + + diff --git a/extensions/reactive-db2-client/deployment/pom.xml b/extensions/reactive-db2-client/deployment/pom.xml index 7b46ff737d769..20586014c9f29 100644 --- a/extensions/reactive-db2-client/deployment/pom.xml +++ b/extensions/reactive-db2-client/deployment/pom.xml @@ -45,15 +45,20 @@ maven-compiler-plugin - - - - io.quarkus - quarkus-extension-processor - ${project.version} - - - + + + default-compile + + + + io.quarkus + quarkus-extension-processor + ${project.version} + + + + + diff --git a/extensions/reactive-db2-client/runtime/pom.xml b/extensions/reactive-db2-client/runtime/pom.xml index 254cda26cb106..9c0a8d0fa0ecf 100644 --- a/extensions/reactive-db2-client/runtime/pom.xml +++ b/extensions/reactive-db2-client/runtime/pom.xml @@ -57,15 +57,20 @@ maven-compiler-plugin - - - - io.quarkus - quarkus-extension-processor - ${project.version} - - - + + + default-compile + + + + io.quarkus + quarkus-extension-processor + ${project.version} + + + + + diff --git a/extensions/reactive-mssql-client/deployment/pom.xml b/extensions/reactive-mssql-client/deployment/pom.xml index 10e161b1be8f3..6e3f8a3309452 100644 --- a/extensions/reactive-mssql-client/deployment/pom.xml +++ b/extensions/reactive-mssql-client/deployment/pom.xml @@ -87,15 +87,20 @@ maven-compiler-plugin - - - - io.quarkus - quarkus-extension-processor - ${project.version} - - - + + + default-compile + + + + io.quarkus + quarkus-extension-processor + ${project.version} + + + + + maven-surefire-plugin diff --git a/extensions/reactive-mssql-client/runtime/pom.xml b/extensions/reactive-mssql-client/runtime/pom.xml index aa9ba57b9f144..6d1676eeac261 100644 --- a/extensions/reactive-mssql-client/runtime/pom.xml +++ b/extensions/reactive-mssql-client/runtime/pom.xml @@ -61,15 +61,20 @@ maven-compiler-plugin - - - - io.quarkus - quarkus-extension-processor - ${project.version} - - - + + + default-compile + + + + io.quarkus + quarkus-extension-processor + ${project.version} + + + + + diff --git a/extensions/reactive-mysql-client/deployment/pom.xml b/extensions/reactive-mysql-client/deployment/pom.xml index f903fd22c4837..3128ae1428d46 100644 --- a/extensions/reactive-mysql-client/deployment/pom.xml +++ b/extensions/reactive-mysql-client/deployment/pom.xml @@ -108,15 +108,20 @@ maven-compiler-plugin - - - - io.quarkus - quarkus-extension-processor - ${project.version} - - - + + + default-compile + + + + io.quarkus + quarkus-extension-processor + ${project.version} + + + + + maven-surefire-plugin diff --git a/extensions/reactive-mysql-client/runtime/pom.xml b/extensions/reactive-mysql-client/runtime/pom.xml index f98ea175f5550..49b714c75499d 100644 --- a/extensions/reactive-mysql-client/runtime/pom.xml +++ b/extensions/reactive-mysql-client/runtime/pom.xml @@ -77,15 +77,20 @@ maven-compiler-plugin - - - - io.quarkus - quarkus-extension-processor - ${project.version} - - - + + + default-compile + + + + io.quarkus + quarkus-extension-processor + ${project.version} + + + + + diff --git a/extensions/reactive-oracle-client/deployment/pom.xml b/extensions/reactive-oracle-client/deployment/pom.xml index eae3911222e2c..46ff7685cdbee 100644 --- a/extensions/reactive-oracle-client/deployment/pom.xml +++ b/extensions/reactive-oracle-client/deployment/pom.xml @@ -91,15 +91,20 @@ maven-compiler-plugin - - - - io.quarkus - quarkus-extension-processor - ${project.version} - - - + + + default-compile + + + + io.quarkus + quarkus-extension-processor + ${project.version} + + + + + maven-surefire-plugin diff --git a/extensions/reactive-oracle-client/runtime/pom.xml b/extensions/reactive-oracle-client/runtime/pom.xml index 842a846f3c9b1..b227c055f66c2 100644 --- a/extensions/reactive-oracle-client/runtime/pom.xml +++ b/extensions/reactive-oracle-client/runtime/pom.xml @@ -65,15 +65,20 @@ maven-compiler-plugin - - - - io.quarkus - quarkus-extension-processor - ${project.version} - - - + + + default-compile + + + + io.quarkus + quarkus-extension-processor + ${project.version} + + + + + diff --git a/extensions/reactive-pg-client/deployment/pom.xml b/extensions/reactive-pg-client/deployment/pom.xml index 77ea754745e53..526a5676f6b9a 100644 --- a/extensions/reactive-pg-client/deployment/pom.xml +++ b/extensions/reactive-pg-client/deployment/pom.xml @@ -87,15 +87,20 @@ maven-compiler-plugin - - - - io.quarkus - quarkus-extension-processor - ${project.version} - - - + + + default-compile + + + + io.quarkus + quarkus-extension-processor + ${project.version} + + + + + maven-surefire-plugin diff --git a/extensions/reactive-pg-client/runtime/pom.xml b/extensions/reactive-pg-client/runtime/pom.xml index 21ea768d8973b..f4c83bfb00916 100644 --- a/extensions/reactive-pg-client/runtime/pom.xml +++ b/extensions/reactive-pg-client/runtime/pom.xml @@ -65,15 +65,20 @@ maven-compiler-plugin - - - - io.quarkus - quarkus-extension-processor - ${project.version} - - - + + + default-compile + + + + io.quarkus + quarkus-extension-processor + ${project.version} + + + + + diff --git a/extensions/reactive-routes/deployment/pom.xml b/extensions/reactive-routes/deployment/pom.xml index 5d1ab1a6a741e..003067462d7fa 100644 --- a/extensions/reactive-routes/deployment/pom.xml +++ b/extensions/reactive-routes/deployment/pom.xml @@ -75,15 +75,20 @@ maven-compiler-plugin - - - - io.quarkus - quarkus-extension-processor - ${project.version} - - - + + + default-compile + + + + io.quarkus + quarkus-extension-processor + ${project.version} + + + + + diff --git a/extensions/reactive-routes/runtime/pom.xml b/extensions/reactive-routes/runtime/pom.xml index fae3468e7046f..f04ce8f241a9b 100644 --- a/extensions/reactive-routes/runtime/pom.xml +++ b/extensions/reactive-routes/runtime/pom.xml @@ -67,15 +67,20 @@ maven-compiler-plugin - - - - io.quarkus - quarkus-extension-processor - ${project.version} - - - + + + default-compile + + + + io.quarkus + quarkus-extension-processor + ${project.version} + + + + + diff --git a/extensions/reactive-streams-operators/mutiny-reactive-streams-operators/deployment/pom.xml b/extensions/reactive-streams-operators/mutiny-reactive-streams-operators/deployment/pom.xml index 7141a2162e618..f05efcb0909f9 100644 --- a/extensions/reactive-streams-operators/mutiny-reactive-streams-operators/deployment/pom.xml +++ b/extensions/reactive-streams-operators/mutiny-reactive-streams-operators/deployment/pom.xml @@ -46,15 +46,20 @@ maven-compiler-plugin - - - - io.quarkus - quarkus-extension-processor - ${project.version} - - - + + + default-compile + + + + io.quarkus + quarkus-extension-processor + ${project.version} + + + + + diff --git a/extensions/reactive-streams-operators/mutiny-reactive-streams-operators/runtime/pom.xml b/extensions/reactive-streams-operators/mutiny-reactive-streams-operators/runtime/pom.xml index ea06fe7474659..341fdb11e5954 100644 --- a/extensions/reactive-streams-operators/mutiny-reactive-streams-operators/runtime/pom.xml +++ b/extensions/reactive-streams-operators/mutiny-reactive-streams-operators/runtime/pom.xml @@ -47,15 +47,20 @@ maven-compiler-plugin - - - - io.quarkus - quarkus-extension-processor - ${project.version} - - - + + + default-compile + + + + io.quarkus + quarkus-extension-processor + ${project.version} + + + + + diff --git a/extensions/reactive-streams-operators/smallrye-reactive-streams-operators/deployment/pom.xml b/extensions/reactive-streams-operators/smallrye-reactive-streams-operators/deployment/pom.xml index bd09ad275efcf..2fc5c3ed4d5c9 100644 --- a/extensions/reactive-streams-operators/smallrye-reactive-streams-operators/deployment/pom.xml +++ b/extensions/reactive-streams-operators/smallrye-reactive-streams-operators/deployment/pom.xml @@ -46,15 +46,20 @@ maven-compiler-plugin - - - - io.quarkus - quarkus-extension-processor - ${project.version} - - - + + + default-compile + + + + io.quarkus + quarkus-extension-processor + ${project.version} + + + + + diff --git a/extensions/reactive-streams-operators/smallrye-reactive-streams-operators/runtime/pom.xml b/extensions/reactive-streams-operators/smallrye-reactive-streams-operators/runtime/pom.xml index 07b67399dcce2..d32346e8b900b 100644 --- a/extensions/reactive-streams-operators/smallrye-reactive-streams-operators/runtime/pom.xml +++ b/extensions/reactive-streams-operators/smallrye-reactive-streams-operators/runtime/pom.xml @@ -43,15 +43,20 @@ maven-compiler-plugin - - - - io.quarkus - quarkus-extension-processor - ${project.version} - - - + + + default-compile + + + + io.quarkus + quarkus-extension-processor + ${project.version} + + + + + diff --git a/extensions/reactive-streams-operators/smallrye-reactive-type-converters/deployment/pom.xml b/extensions/reactive-streams-operators/smallrye-reactive-type-converters/deployment/pom.xml index 5badf81dcc25b..e48e3ee076d87 100644 --- a/extensions/reactive-streams-operators/smallrye-reactive-type-converters/deployment/pom.xml +++ b/extensions/reactive-streams-operators/smallrye-reactive-type-converters/deployment/pom.xml @@ -28,15 +28,20 @@ maven-compiler-plugin - - - - io.quarkus - quarkus-extension-processor - ${project.version} - - - + + + default-compile + + + + io.quarkus + quarkus-extension-processor + ${project.version} + + + + + diff --git a/extensions/redis-cache/deployment/pom.xml b/extensions/redis-cache/deployment/pom.xml index e65d5ce1b8b34..c5926b82942a2 100644 --- a/extensions/redis-cache/deployment/pom.xml +++ b/extensions/redis-cache/deployment/pom.xml @@ -63,18 +63,23 @@ maven-compiler-plugin - - - - io.quarkus - quarkus-extension-processor - ${project.version} - - - - -AlegacyConfigRoot=true - - + + + default-compile + + + + io.quarkus + quarkus-extension-processor + ${project.version} + + + + -AlegacyConfigRoot=true + + + + maven-surefire-plugin diff --git a/extensions/redis-cache/runtime/pom.xml b/extensions/redis-cache/runtime/pom.xml index 832c4b9e8aae7..dd7a7439eb461 100644 --- a/extensions/redis-cache/runtime/pom.xml +++ b/extensions/redis-cache/runtime/pom.xml @@ -65,18 +65,23 @@ maven-compiler-plugin - - - - io.quarkus - quarkus-extension-processor - ${project.version} - - - - -AlegacyConfigRoot=true - - + + + default-compile + + + + io.quarkus + quarkus-extension-processor + ${project.version} + + + + -AlegacyConfigRoot=true + + + + maven-surefire-plugin diff --git a/extensions/redis-client/deployment/pom.xml b/extensions/redis-client/deployment/pom.xml index 4061e6a14da54..24699889af400 100644 --- a/extensions/redis-client/deployment/pom.xml +++ b/extensions/redis-client/deployment/pom.xml @@ -79,15 +79,20 @@ maven-compiler-plugin - - - - io.quarkus - quarkus-extension-processor - ${project.version} - - - + + + default-compile + + + + io.quarkus + quarkus-extension-processor + ${project.version} + + + + + maven-surefire-plugin diff --git a/extensions/redis-client/runtime/pom.xml b/extensions/redis-client/runtime/pom.xml index 4518d61454f59..c010999601a2f 100644 --- a/extensions/redis-client/runtime/pom.xml +++ b/extensions/redis-client/runtime/pom.xml @@ -89,15 +89,20 @@ maven-compiler-plugin - - - - io.quarkus - quarkus-extension-processor - ${project.version} - - - + + + default-compile + + + + io.quarkus + quarkus-extension-processor + ${project.version} + + + + + maven-surefire-plugin diff --git a/extensions/resteasy-classic/rest-client-config/deployment/pom.xml b/extensions/resteasy-classic/rest-client-config/deployment/pom.xml index 0c513daec5722..12ec359b90237 100644 --- a/extensions/resteasy-classic/rest-client-config/deployment/pom.xml +++ b/extensions/resteasy-classic/rest-client-config/deployment/pom.xml @@ -43,18 +43,23 @@ maven-compiler-plugin - - - - io.quarkus - quarkus-extension-processor - ${project.version} - - - - -AlegacyConfigRoot=true - - + + + default-compile + + + + io.quarkus + quarkus-extension-processor + ${project.version} + + + + -AlegacyConfigRoot=true + + + + diff --git a/extensions/resteasy-classic/rest-client-config/runtime/pom.xml b/extensions/resteasy-classic/rest-client-config/runtime/pom.xml index 152da7b3ae5fa..bc909d47741e6 100644 --- a/extensions/resteasy-classic/rest-client-config/runtime/pom.xml +++ b/extensions/resteasy-classic/rest-client-config/runtime/pom.xml @@ -56,18 +56,23 @@ maven-compiler-plugin - - - - io.quarkus - quarkus-extension-processor - ${project.version} - - - - -AlegacyConfigRoot=true - - + + + default-compile + + + + io.quarkus + quarkus-extension-processor + ${project.version} + + + + -AlegacyConfigRoot=true + + + + diff --git a/extensions/resteasy-classic/resteasy-client-jackson/deployment/pom.xml b/extensions/resteasy-classic/resteasy-client-jackson/deployment/pom.xml index 2f7469328c1ba..0dc5d4b990eeb 100644 --- a/extensions/resteasy-classic/resteasy-client-jackson/deployment/pom.xml +++ b/extensions/resteasy-classic/resteasy-client-jackson/deployment/pom.xml @@ -47,15 +47,20 @@ maven-compiler-plugin - - - - io.quarkus - quarkus-extension-processor - ${project.version} - - - + + + default-compile + + + + io.quarkus + quarkus-extension-processor + ${project.version} + + + + + diff --git a/extensions/resteasy-classic/resteasy-client-jackson/runtime/pom.xml b/extensions/resteasy-classic/resteasy-client-jackson/runtime/pom.xml index a8449953d3579..664416064aa4c 100644 --- a/extensions/resteasy-classic/resteasy-client-jackson/runtime/pom.xml +++ b/extensions/resteasy-classic/resteasy-client-jackson/runtime/pom.xml @@ -58,15 +58,20 @@ maven-compiler-plugin - - - - io.quarkus - quarkus-extension-processor - ${project.version} - - - + + + default-compile + + + + io.quarkus + quarkus-extension-processor + ${project.version} + + + + + diff --git a/extensions/resteasy-classic/resteasy-client-jaxb/deployment/pom.xml b/extensions/resteasy-classic/resteasy-client-jaxb/deployment/pom.xml index 3fedf3af48517..4f8ed3f46460c 100644 --- a/extensions/resteasy-classic/resteasy-client-jaxb/deployment/pom.xml +++ b/extensions/resteasy-classic/resteasy-client-jaxb/deployment/pom.xml @@ -47,15 +47,20 @@ maven-compiler-plugin - - - - io.quarkus - quarkus-extension-processor - ${project.version} - - - + + + default-compile + + + + io.quarkus + quarkus-extension-processor + ${project.version} + + + + + diff --git a/extensions/resteasy-classic/resteasy-client-jaxb/runtime/pom.xml b/extensions/resteasy-classic/resteasy-client-jaxb/runtime/pom.xml index fcd52c0bc1ae6..85875ce14a8da 100644 --- a/extensions/resteasy-classic/resteasy-client-jaxb/runtime/pom.xml +++ b/extensions/resteasy-classic/resteasy-client-jaxb/runtime/pom.xml @@ -49,15 +49,20 @@ maven-compiler-plugin - - - - io.quarkus - quarkus-extension-processor - ${project.version} - - - + + + default-compile + + + + io.quarkus + quarkus-extension-processor + ${project.version} + + + + + diff --git a/extensions/resteasy-classic/resteasy-client-jsonb/deployment/pom.xml b/extensions/resteasy-classic/resteasy-client-jsonb/deployment/pom.xml index 86cbecc33a2d2..b68a8f792c06d 100644 --- a/extensions/resteasy-classic/resteasy-client-jsonb/deployment/pom.xml +++ b/extensions/resteasy-classic/resteasy-client-jsonb/deployment/pom.xml @@ -47,15 +47,20 @@ maven-compiler-plugin - - - - io.quarkus - quarkus-extension-processor - ${project.version} - - - + + + default-compile + + + + io.quarkus + quarkus-extension-processor + ${project.version} + + + + + diff --git a/extensions/resteasy-classic/resteasy-client-jsonb/runtime/pom.xml b/extensions/resteasy-classic/resteasy-client-jsonb/runtime/pom.xml index f212624d64479..e7e38f0dd68d0 100644 --- a/extensions/resteasy-classic/resteasy-client-jsonb/runtime/pom.xml +++ b/extensions/resteasy-classic/resteasy-client-jsonb/runtime/pom.xml @@ -55,15 +55,20 @@ maven-compiler-plugin - - - - io.quarkus - quarkus-extension-processor - ${project.version} - - - + + + default-compile + + + + io.quarkus + quarkus-extension-processor + ${project.version} + + + + + diff --git a/extensions/resteasy-classic/resteasy-client-mutiny/deployment/pom.xml b/extensions/resteasy-classic/resteasy-client-mutiny/deployment/pom.xml index 0a5ad947b8266..abe9a2689494f 100644 --- a/extensions/resteasy-classic/resteasy-client-mutiny/deployment/pom.xml +++ b/extensions/resteasy-classic/resteasy-client-mutiny/deployment/pom.xml @@ -46,15 +46,20 @@ maven-compiler-plugin - - - - io.quarkus - quarkus-extension-processor - ${project.version} - - - + + + default-compile + + + + io.quarkus + quarkus-extension-processor + ${project.version} + + + + + diff --git a/extensions/resteasy-classic/resteasy-client-mutiny/runtime/pom.xml b/extensions/resteasy-classic/resteasy-client-mutiny/runtime/pom.xml index 66881644bcb76..097ca79ebdabb 100644 --- a/extensions/resteasy-classic/resteasy-client-mutiny/runtime/pom.xml +++ b/extensions/resteasy-classic/resteasy-client-mutiny/runtime/pom.xml @@ -32,15 +32,20 @@ maven-compiler-plugin - - - - io.quarkus - quarkus-extension-processor - ${project.version} - - - + + + default-compile + + + + io.quarkus + quarkus-extension-processor + ${project.version} + + + + + diff --git a/extensions/resteasy-classic/resteasy-client/deployment/pom.xml b/extensions/resteasy-classic/resteasy-client/deployment/pom.xml index 034cee562aeec..0bcfdf8e974c2 100644 --- a/extensions/resteasy-classic/resteasy-client/deployment/pom.xml +++ b/extensions/resteasy-classic/resteasy-client/deployment/pom.xml @@ -64,15 +64,20 @@ maven-compiler-plugin - - - - io.quarkus - quarkus-extension-processor - ${project.version} - - - + + + default-compile + + + + io.quarkus + quarkus-extension-processor + ${project.version} + + + + + diff --git a/extensions/resteasy-classic/resteasy-client/runtime/pom.xml b/extensions/resteasy-classic/resteasy-client/runtime/pom.xml index da7954b22e79e..7b9ffc15bb9df 100644 --- a/extensions/resteasy-classic/resteasy-client/runtime/pom.xml +++ b/extensions/resteasy-classic/resteasy-client/runtime/pom.xml @@ -118,15 +118,20 @@ maven-compiler-plugin - - - - io.quarkus - quarkus-extension-processor - ${project.version} - - - + + + default-compile + + + + io.quarkus + quarkus-extension-processor + ${project.version} + + + + + diff --git a/extensions/resteasy-classic/resteasy-common/deployment/pom.xml b/extensions/resteasy-classic/resteasy-common/deployment/pom.xml index adb80b72504b1..01d7449ad54af 100644 --- a/extensions/resteasy-classic/resteasy-common/deployment/pom.xml +++ b/extensions/resteasy-classic/resteasy-common/deployment/pom.xml @@ -35,18 +35,23 @@ maven-compiler-plugin - - - - io.quarkus - quarkus-extension-processor - ${project.version} - - - - -AlegacyConfigRoot=true - - + + + default-compile + + + + io.quarkus + quarkus-extension-processor + ${project.version} + + + + -AlegacyConfigRoot=true + + + + diff --git a/extensions/resteasy-classic/resteasy-common/runtime/pom.xml b/extensions/resteasy-classic/resteasy-common/runtime/pom.xml index 2824c70817b88..57b6e8f198dd2 100644 --- a/extensions/resteasy-classic/resteasy-common/runtime/pom.xml +++ b/extensions/resteasy-classic/resteasy-common/runtime/pom.xml @@ -116,18 +116,23 @@ maven-compiler-plugin - - - - io.quarkus - quarkus-extension-processor - ${project.version} - - - - -AlegacyConfigRoot=true - - + + + default-compile + + + + io.quarkus + quarkus-extension-processor + ${project.version} + + + + -AlegacyConfigRoot=true + + + + diff --git a/extensions/resteasy-classic/resteasy-jackson/deployment/pom.xml b/extensions/resteasy-classic/resteasy-jackson/deployment/pom.xml index b229f603dc03f..1fae47a05b8bc 100644 --- a/extensions/resteasy-classic/resteasy-jackson/deployment/pom.xml +++ b/extensions/resteasy-classic/resteasy-jackson/deployment/pom.xml @@ -41,15 +41,20 @@ maven-compiler-plugin - - - - io.quarkus - quarkus-extension-processor - ${project.version} - - - + + + default-compile + + + + io.quarkus + quarkus-extension-processor + ${project.version} + + + + + diff --git a/extensions/resteasy-classic/resteasy-jackson/runtime/pom.xml b/extensions/resteasy-classic/resteasy-jackson/runtime/pom.xml index 9b50fa44942ac..4ebf9a83d7886 100644 --- a/extensions/resteasy-classic/resteasy-jackson/runtime/pom.xml +++ b/extensions/resteasy-classic/resteasy-jackson/runtime/pom.xml @@ -63,15 +63,20 @@ maven-compiler-plugin - - - - io.quarkus - quarkus-extension-processor - ${project.version} - - - + + + default-compile + + + + io.quarkus + quarkus-extension-processor + ${project.version} + + + + + diff --git a/extensions/resteasy-classic/resteasy-jaxb/deployment/pom.xml b/extensions/resteasy-classic/resteasy-jaxb/deployment/pom.xml index 63eb454eb26c7..f864cc70724e9 100644 --- a/extensions/resteasy-classic/resteasy-jaxb/deployment/pom.xml +++ b/extensions/resteasy-classic/resteasy-jaxb/deployment/pom.xml @@ -41,15 +41,20 @@ maven-compiler-plugin - - - - io.quarkus - quarkus-extension-processor - ${project.version} - - - + + + default-compile + + + + io.quarkus + quarkus-extension-processor + ${project.version} + + + + + diff --git a/extensions/resteasy-classic/resteasy-jaxb/runtime/pom.xml b/extensions/resteasy-classic/resteasy-jaxb/runtime/pom.xml index afd1494280354..d0c0fb334511c 100644 --- a/extensions/resteasy-classic/resteasy-jaxb/runtime/pom.xml +++ b/extensions/resteasy-classic/resteasy-jaxb/runtime/pom.xml @@ -62,15 +62,20 @@ maven-compiler-plugin - - - - io.quarkus - quarkus-extension-processor - ${project.version} - - - + + + default-compile + + + + io.quarkus + quarkus-extension-processor + ${project.version} + + + + + diff --git a/extensions/resteasy-classic/resteasy-jsonb/deployment/pom.xml b/extensions/resteasy-classic/resteasy-jsonb/deployment/pom.xml index c433902e70143..83e9c7b7f19e8 100644 --- a/extensions/resteasy-classic/resteasy-jsonb/deployment/pom.xml +++ b/extensions/resteasy-classic/resteasy-jsonb/deployment/pom.xml @@ -47,15 +47,20 @@ maven-compiler-plugin - - - - io.quarkus - quarkus-extension-processor - ${project.version} - - - + + + default-compile + + + + io.quarkus + quarkus-extension-processor + ${project.version} + + + + + diff --git a/extensions/resteasy-classic/resteasy-jsonb/runtime/pom.xml b/extensions/resteasy-classic/resteasy-jsonb/runtime/pom.xml index 23c614b90409f..7edaf39fd78b5 100644 --- a/extensions/resteasy-classic/resteasy-jsonb/runtime/pom.xml +++ b/extensions/resteasy-classic/resteasy-jsonb/runtime/pom.xml @@ -66,15 +66,20 @@ maven-compiler-plugin - - - - io.quarkus - quarkus-extension-processor - ${project.version} - - - + + + default-compile + + + + io.quarkus + quarkus-extension-processor + ${project.version} + + + + + diff --git a/extensions/resteasy-classic/resteasy-links/deployment/pom.xml b/extensions/resteasy-classic/resteasy-links/deployment/pom.xml index 489ad05b4f9cf..00afc00a858e4 100644 --- a/extensions/resteasy-classic/resteasy-links/deployment/pom.xml +++ b/extensions/resteasy-classic/resteasy-links/deployment/pom.xml @@ -48,15 +48,20 @@ maven-compiler-plugin - - - - io.quarkus - quarkus-extension-processor - ${project.version} - - - + + + default-compile + + + + io.quarkus + quarkus-extension-processor + ${project.version} + + + + + diff --git a/extensions/resteasy-classic/resteasy-links/runtime/pom.xml b/extensions/resteasy-classic/resteasy-links/runtime/pom.xml index f879fab6afb08..ab6101702cea9 100644 --- a/extensions/resteasy-classic/resteasy-links/runtime/pom.xml +++ b/extensions/resteasy-classic/resteasy-links/runtime/pom.xml @@ -73,15 +73,20 @@ maven-compiler-plugin - - - - io.quarkus - quarkus-extension-processor - ${project.version} - - - + + + default-compile + + + + io.quarkus + quarkus-extension-processor + ${project.version} + + + + + diff --git a/extensions/resteasy-classic/resteasy-multipart/deployment/pom.xml b/extensions/resteasy-classic/resteasy-multipart/deployment/pom.xml index 71cd40e5dccef..82213eb9b5838 100644 --- a/extensions/resteasy-classic/resteasy-multipart/deployment/pom.xml +++ b/extensions/resteasy-classic/resteasy-multipart/deployment/pom.xml @@ -42,18 +42,23 @@ maven-compiler-plugin - - - - io.quarkus - quarkus-extension-processor - ${project.version} - - - - -AlegacyConfigRoot=true - - + + + default-compile + + + + io.quarkus + quarkus-extension-processor + ${project.version} + + + + -AlegacyConfigRoot=true + + + + diff --git a/extensions/resteasy-classic/resteasy-multipart/runtime/pom.xml b/extensions/resteasy-classic/resteasy-multipart/runtime/pom.xml index a2c4da1673a92..adb18f4005fe8 100644 --- a/extensions/resteasy-classic/resteasy-multipart/runtime/pom.xml +++ b/extensions/resteasy-classic/resteasy-multipart/runtime/pom.xml @@ -62,18 +62,23 @@ maven-compiler-plugin - - - - io.quarkus - quarkus-extension-processor - ${project.version} - - - - -AlegacyConfigRoot=true - - + + + default-compile + + + + io.quarkus + quarkus-extension-processor + ${project.version} + + + + -AlegacyConfigRoot=true + + + + diff --git a/extensions/resteasy-classic/resteasy-mutiny-common/deployment/pom.xml b/extensions/resteasy-classic/resteasy-mutiny-common/deployment/pom.xml index a2fb20b55f9f0..803dd0adc00d4 100644 --- a/extensions/resteasy-classic/resteasy-mutiny-common/deployment/pom.xml +++ b/extensions/resteasy-classic/resteasy-mutiny-common/deployment/pom.xml @@ -36,15 +36,20 @@ maven-compiler-plugin - - - - io.quarkus - quarkus-extension-processor - ${project.version} - - - + + + default-compile + + + + io.quarkus + quarkus-extension-processor + ${project.version} + + + + + diff --git a/extensions/resteasy-classic/resteasy-mutiny-common/runtime/pom.xml b/extensions/resteasy-classic/resteasy-mutiny-common/runtime/pom.xml index 835402f2c616d..f6ee5b8533d3e 100644 --- a/extensions/resteasy-classic/resteasy-mutiny-common/runtime/pom.xml +++ b/extensions/resteasy-classic/resteasy-mutiny-common/runtime/pom.xml @@ -74,15 +74,20 @@ maven-compiler-plugin - - - - io.quarkus - quarkus-extension-processor - ${project.version} - - - + + + default-compile + + + + io.quarkus + quarkus-extension-processor + ${project.version} + + + + + diff --git a/extensions/resteasy-classic/resteasy-mutiny/deployment/pom.xml b/extensions/resteasy-classic/resteasy-mutiny/deployment/pom.xml index 2632b941af2bf..e55775ab0e8f3 100644 --- a/extensions/resteasy-classic/resteasy-mutiny/deployment/pom.xml +++ b/extensions/resteasy-classic/resteasy-mutiny/deployment/pom.xml @@ -61,15 +61,20 @@ maven-compiler-plugin - - - - io.quarkus - quarkus-extension-processor - ${project.version} - - - + + + default-compile + + + + io.quarkus + quarkus-extension-processor + ${project.version} + + + + + diff --git a/extensions/resteasy-classic/resteasy-mutiny/runtime/pom.xml b/extensions/resteasy-classic/resteasy-mutiny/runtime/pom.xml index 62e840c40650e..2d24d5e790bad 100644 --- a/extensions/resteasy-classic/resteasy-mutiny/runtime/pom.xml +++ b/extensions/resteasy-classic/resteasy-mutiny/runtime/pom.xml @@ -49,15 +49,20 @@ maven-compiler-plugin - - - - io.quarkus - quarkus-extension-processor - ${project.version} - - - + + + default-compile + + + + io.quarkus + quarkus-extension-processor + ${project.version} + + + + + diff --git a/extensions/resteasy-classic/resteasy-qute/deployment/pom.xml b/extensions/resteasy-classic/resteasy-qute/deployment/pom.xml index fc8902d9e8cf1..c1dae2af893df 100644 --- a/extensions/resteasy-classic/resteasy-qute/deployment/pom.xml +++ b/extensions/resteasy-classic/resteasy-qute/deployment/pom.xml @@ -42,15 +42,20 @@ maven-compiler-plugin - - - - io.quarkus - quarkus-extension-processor - ${project.version} - - - + + + default-compile + + + + io.quarkus + quarkus-extension-processor + ${project.version} + + + + + diff --git a/extensions/resteasy-classic/resteasy-qute/runtime/pom.xml b/extensions/resteasy-classic/resteasy-qute/runtime/pom.xml index d04d398c5def2..111ec99b12f43 100644 --- a/extensions/resteasy-classic/resteasy-qute/runtime/pom.xml +++ b/extensions/resteasy-classic/resteasy-qute/runtime/pom.xml @@ -52,15 +52,20 @@ maven-compiler-plugin - - - - io.quarkus - quarkus-extension-processor - ${project.version} - - - + + + default-compile + + + + io.quarkus + quarkus-extension-processor + ${project.version} + + + + + diff --git a/extensions/resteasy-classic/resteasy-server-common/deployment/pom.xml b/extensions/resteasy-classic/resteasy-server-common/deployment/pom.xml index 01b1f654d61f1..a9b54970a70a8 100644 --- a/extensions/resteasy-classic/resteasy-server-common/deployment/pom.xml +++ b/extensions/resteasy-classic/resteasy-server-common/deployment/pom.xml @@ -47,18 +47,23 @@ maven-compiler-plugin - - - - io.quarkus - quarkus-extension-processor - ${project.version} - - - - -AlegacyConfigRoot=true - - + + + default-compile + + + + io.quarkus + quarkus-extension-processor + ${project.version} + + + + -AlegacyConfigRoot=true + + + + diff --git a/extensions/resteasy-classic/resteasy-server-common/runtime/pom.xml b/extensions/resteasy-classic/resteasy-server-common/runtime/pom.xml index ef7d0ccae022f..30cbd77151de2 100644 --- a/extensions/resteasy-classic/resteasy-server-common/runtime/pom.xml +++ b/extensions/resteasy-classic/resteasy-server-common/runtime/pom.xml @@ -43,18 +43,23 @@ maven-compiler-plugin - - - - io.quarkus - quarkus-extension-processor - ${project.version} - - - - -AlegacyConfigRoot=true - - + + + default-compile + + + + io.quarkus + quarkus-extension-processor + ${project.version} + + + + -AlegacyConfigRoot=true + + + + diff --git a/extensions/resteasy-classic/resteasy/deployment/pom.xml b/extensions/resteasy-classic/resteasy/deployment/pom.xml index 5f445d3dc6959..8f08934d78201 100644 --- a/extensions/resteasy-classic/resteasy/deployment/pom.xml +++ b/extensions/resteasy-classic/resteasy/deployment/pom.xml @@ -96,18 +96,23 @@ maven-compiler-plugin - - - - io.quarkus - quarkus-extension-processor - ${project.version} - - - - -AlegacyConfigRoot=true - - + + + default-compile + + + + io.quarkus + quarkus-extension-processor + ${project.version} + + + + -AlegacyConfigRoot=true + + + + diff --git a/extensions/resteasy-classic/resteasy/runtime/pom.xml b/extensions/resteasy-classic/resteasy/runtime/pom.xml index 78c521d5f2f0a..ea8f4b3c8fe20 100644 --- a/extensions/resteasy-classic/resteasy/runtime/pom.xml +++ b/extensions/resteasy-classic/resteasy/runtime/pom.xml @@ -54,18 +54,23 @@ maven-compiler-plugin - - - - io.quarkus - quarkus-extension-processor - ${project.version} - - - - -AlegacyConfigRoot=true - - + + + default-compile + + + + io.quarkus + quarkus-extension-processor + ${project.version} + + + + -AlegacyConfigRoot=true + + + + diff --git a/extensions/resteasy-reactive/rest-client-jackson/deployment/pom.xml b/extensions/resteasy-reactive/rest-client-jackson/deployment/pom.xml index 77ebf50d93c1d..e5d0ef7b25330 100644 --- a/extensions/resteasy-reactive/rest-client-jackson/deployment/pom.xml +++ b/extensions/resteasy-reactive/rest-client-jackson/deployment/pom.xml @@ -51,15 +51,20 @@ maven-compiler-plugin - - - - io.quarkus - quarkus-extension-processor - ${project.version} - - - + + + default-compile + + + + io.quarkus + quarkus-extension-processor + ${project.version} + + + + + diff --git a/extensions/resteasy-reactive/rest-client-jackson/runtime/pom.xml b/extensions/resteasy-reactive/rest-client-jackson/runtime/pom.xml index 4425ab4f9f82d..f5a05e67e8728 100644 --- a/extensions/resteasy-reactive/rest-client-jackson/runtime/pom.xml +++ b/extensions/resteasy-reactive/rest-client-jackson/runtime/pom.xml @@ -40,15 +40,20 @@ maven-compiler-plugin - - - - io.quarkus - quarkus-extension-processor - ${project.version} - - - + + + default-compile + + + + io.quarkus + quarkus-extension-processor + ${project.version} + + + + + diff --git a/extensions/resteasy-reactive/rest-client-jaxb/deployment/pom.xml b/extensions/resteasy-reactive/rest-client-jaxb/deployment/pom.xml index ef9560816da0f..11e8c3e95f621 100644 --- a/extensions/resteasy-reactive/rest-client-jaxb/deployment/pom.xml +++ b/extensions/resteasy-reactive/rest-client-jaxb/deployment/pom.xml @@ -51,15 +51,20 @@ maven-compiler-plugin - - - - io.quarkus - quarkus-extension-processor - ${project.version} - - - + + + default-compile + + + + io.quarkus + quarkus-extension-processor + ${project.version} + + + + + diff --git a/extensions/resteasy-reactive/rest-client-jaxb/runtime/pom.xml b/extensions/resteasy-reactive/rest-client-jaxb/runtime/pom.xml index 60d733ff62f6d..be2c9c620a342 100644 --- a/extensions/resteasy-reactive/rest-client-jaxb/runtime/pom.xml +++ b/extensions/resteasy-reactive/rest-client-jaxb/runtime/pom.xml @@ -31,15 +31,20 @@ maven-compiler-plugin - - - - io.quarkus - quarkus-extension-processor - ${project.version} - - - + + + default-compile + + + + io.quarkus + quarkus-extension-processor + ${project.version} + + + + + diff --git a/extensions/resteasy-reactive/rest-client-jaxrs/deployment/pom.xml b/extensions/resteasy-reactive/rest-client-jaxrs/deployment/pom.xml index 354e92cd9982a..bc8a8c616760a 100644 --- a/extensions/resteasy-reactive/rest-client-jaxrs/deployment/pom.xml +++ b/extensions/resteasy-reactive/rest-client-jaxrs/deployment/pom.xml @@ -96,15 +96,20 @@ maven-compiler-plugin - - - - io.quarkus - quarkus-extension-processor - ${project.version} - - - + + + default-compile + + + + io.quarkus + quarkus-extension-processor + ${project.version} + + + + + maven-surefire-plugin diff --git a/extensions/resteasy-reactive/rest-client-jaxrs/runtime/pom.xml b/extensions/resteasy-reactive/rest-client-jaxrs/runtime/pom.xml index b1432cd596ae7..83f0b49a4fbc2 100644 --- a/extensions/resteasy-reactive/rest-client-jaxrs/runtime/pom.xml +++ b/extensions/resteasy-reactive/rest-client-jaxrs/runtime/pom.xml @@ -41,15 +41,20 @@ maven-compiler-plugin - - - - io.quarkus - quarkus-extension-processor - ${project.version} - - - + + + default-compile + + + + io.quarkus + quarkus-extension-processor + ${project.version} + + + + + diff --git a/extensions/resteasy-reactive/rest-client-jsonb/deployment/pom.xml b/extensions/resteasy-reactive/rest-client-jsonb/deployment/pom.xml index e45e0be2abc13..8e7d33b9c15ff 100644 --- a/extensions/resteasy-reactive/rest-client-jsonb/deployment/pom.xml +++ b/extensions/resteasy-reactive/rest-client-jsonb/deployment/pom.xml @@ -51,15 +51,20 @@ maven-compiler-plugin - - - - io.quarkus - quarkus-extension-processor - ${project.version} - - - + + + default-compile + + + + io.quarkus + quarkus-extension-processor + ${project.version} + + + + + diff --git a/extensions/resteasy-reactive/rest-client-jsonb/runtime/pom.xml b/extensions/resteasy-reactive/rest-client-jsonb/runtime/pom.xml index 6a4c10211cfe2..53077c65db12f 100644 --- a/extensions/resteasy-reactive/rest-client-jsonb/runtime/pom.xml +++ b/extensions/resteasy-reactive/rest-client-jsonb/runtime/pom.xml @@ -40,15 +40,20 @@ maven-compiler-plugin - - - - io.quarkus - quarkus-extension-processor - ${project.version} - - - + + + default-compile + + + + io.quarkus + quarkus-extension-processor + ${project.version} + + + + + diff --git a/extensions/resteasy-reactive/rest-client-kotlin-serialization/deployment/pom.xml b/extensions/resteasy-reactive/rest-client-kotlin-serialization/deployment/pom.xml index a347ff7ea1ed2..b4ea4767243ba 100644 --- a/extensions/resteasy-reactive/rest-client-kotlin-serialization/deployment/pom.xml +++ b/extensions/resteasy-reactive/rest-client-kotlin-serialization/deployment/pom.xml @@ -58,15 +58,20 @@ maven-compiler-plugin - - - - io.quarkus - quarkus-extension-processor - ${project.version} - - - + + + default-compile + + + + io.quarkus + quarkus-extension-processor + ${project.version} + + + + + diff --git a/extensions/resteasy-reactive/rest-client/deployment/pom.xml b/extensions/resteasy-reactive/rest-client/deployment/pom.xml index 33805881ccb67..276960655b48f 100644 --- a/extensions/resteasy-reactive/rest-client/deployment/pom.xml +++ b/extensions/resteasy-reactive/rest-client/deployment/pom.xml @@ -117,18 +117,23 @@ maven-compiler-plugin - - - - io.quarkus - quarkus-extension-processor - ${project.version} - - - - -AlegacyConfigRoot=true - - + + + default-compile + + + + io.quarkus + quarkus-extension-processor + ${project.version} + + + + -AlegacyConfigRoot=true + + + + diff --git a/extensions/resteasy-reactive/rest-common/deployment/pom.xml b/extensions/resteasy-reactive/rest-common/deployment/pom.xml index 39277fba53298..a8f75b2ed388d 100644 --- a/extensions/resteasy-reactive/rest-common/deployment/pom.xml +++ b/extensions/resteasy-reactive/rest-common/deployment/pom.xml @@ -51,15 +51,20 @@ maven-compiler-plugin - - - - io.quarkus - quarkus-extension-processor - ${project.version} - - - + + + default-compile + + + + io.quarkus + quarkus-extension-processor + ${project.version} + + + + + maven-surefire-plugin diff --git a/extensions/resteasy-reactive/rest-common/runtime/pom.xml b/extensions/resteasy-reactive/rest-common/runtime/pom.xml index 68c5bf066f308..9d2e8c6ff2f59 100644 --- a/extensions/resteasy-reactive/rest-common/runtime/pom.xml +++ b/extensions/resteasy-reactive/rest-common/runtime/pom.xml @@ -45,15 +45,20 @@ maven-compiler-plugin - - - - io.quarkus - quarkus-extension-processor - ${project.version} - - - + + + default-compile + + + + io.quarkus + quarkus-extension-processor + ${project.version} + + + + + diff --git a/extensions/resteasy-reactive/rest-csrf/deployment/pom.xml b/extensions/resteasy-reactive/rest-csrf/deployment/pom.xml index 6d8a01a430c4d..1ce8f6a8c71bc 100644 --- a/extensions/resteasy-reactive/rest-csrf/deployment/pom.xml +++ b/extensions/resteasy-reactive/rest-csrf/deployment/pom.xml @@ -54,18 +54,23 @@ maven-compiler-plugin - - - - io.quarkus - quarkus-extension-processor - ${project.version} - - - - -AlegacyConfigRoot=true - - + + + default-compile + + + + io.quarkus + quarkus-extension-processor + ${project.version} + + + + -AlegacyConfigRoot=true + + + + diff --git a/extensions/resteasy-reactive/rest-csrf/runtime/pom.xml b/extensions/resteasy-reactive/rest-csrf/runtime/pom.xml index d1e3dec92eb66..ba6223dc9bf34 100644 --- a/extensions/resteasy-reactive/rest-csrf/runtime/pom.xml +++ b/extensions/resteasy-reactive/rest-csrf/runtime/pom.xml @@ -44,18 +44,23 @@ maven-compiler-plugin - - - - io.quarkus - quarkus-extension-processor - ${project.version} - - - - -AlegacyConfigRoot=true - - + + + default-compile + + + + io.quarkus + quarkus-extension-processor + ${project.version} + + + + -AlegacyConfigRoot=true + + + + diff --git a/extensions/resteasy-reactive/rest-jackson-common/deployment/pom.xml b/extensions/resteasy-reactive/rest-jackson-common/deployment/pom.xml index 6117af7a5e83a..3ae76ae31b78d 100644 --- a/extensions/resteasy-reactive/rest-jackson-common/deployment/pom.xml +++ b/extensions/resteasy-reactive/rest-jackson-common/deployment/pom.xml @@ -31,15 +31,20 @@ maven-compiler-plugin - - - - io.quarkus - quarkus-extension-processor - ${project.version} - - - + + + default-compile + + + + io.quarkus + quarkus-extension-processor + ${project.version} + + + + + diff --git a/extensions/resteasy-reactive/rest-jackson-common/runtime/pom.xml b/extensions/resteasy-reactive/rest-jackson-common/runtime/pom.xml index 23aac235818da..30a7e3914539f 100644 --- a/extensions/resteasy-reactive/rest-jackson-common/runtime/pom.xml +++ b/extensions/resteasy-reactive/rest-jackson-common/runtime/pom.xml @@ -39,15 +39,20 @@ maven-compiler-plugin - - - - io.quarkus - quarkus-extension-processor - ${project.version} - - - + + + default-compile + + + + io.quarkus + quarkus-extension-processor + ${project.version} + + + + + diff --git a/extensions/resteasy-reactive/rest-jackson/deployment/pom.xml b/extensions/resteasy-reactive/rest-jackson/deployment/pom.xml index df2de75e88f62..575644d4586c1 100644 --- a/extensions/resteasy-reactive/rest-jackson/deployment/pom.xml +++ b/extensions/resteasy-reactive/rest-jackson/deployment/pom.xml @@ -61,15 +61,20 @@ maven-compiler-plugin - - - - io.quarkus - quarkus-extension-processor - ${project.version} - - - + + + default-compile + + + + io.quarkus + quarkus-extension-processor + ${project.version} + + + + + diff --git a/extensions/resteasy-reactive/rest-jackson/runtime/pom.xml b/extensions/resteasy-reactive/rest-jackson/runtime/pom.xml index 1afb96cef2987..492b3a899b7b8 100644 --- a/extensions/resteasy-reactive/rest-jackson/runtime/pom.xml +++ b/extensions/resteasy-reactive/rest-jackson/runtime/pom.xml @@ -38,15 +38,20 @@ maven-compiler-plugin - - - - io.quarkus - quarkus-extension-processor - ${project.version} - - - + + + default-compile + + + + io.quarkus + quarkus-extension-processor + ${project.version} + + + + + diff --git a/extensions/resteasy-reactive/rest-jaxb/deployment/pom.xml b/extensions/resteasy-reactive/rest-jaxb/deployment/pom.xml index 32dad6129cf28..280bf9d77ba5d 100644 --- a/extensions/resteasy-reactive/rest-jaxb/deployment/pom.xml +++ b/extensions/resteasy-reactive/rest-jaxb/deployment/pom.xml @@ -57,15 +57,20 @@ maven-compiler-plugin - - - - io.quarkus - quarkus-extension-processor - ${project.version} - - - + + + default-compile + + + + io.quarkus + quarkus-extension-processor + ${project.version} + + + + + diff --git a/extensions/resteasy-reactive/rest-jaxb/runtime/pom.xml b/extensions/resteasy-reactive/rest-jaxb/runtime/pom.xml index f5dd192a153c8..2771bef080320 100644 --- a/extensions/resteasy-reactive/rest-jaxb/runtime/pom.xml +++ b/extensions/resteasy-reactive/rest-jaxb/runtime/pom.xml @@ -32,15 +32,20 @@ maven-compiler-plugin - - - - io.quarkus - quarkus-extension-processor - ${project.version} - - - + + + default-compile + + + + io.quarkus + quarkus-extension-processor + ${project.version} + + + + + diff --git a/extensions/resteasy-reactive/rest-jsonb-common/deployment/pom.xml b/extensions/resteasy-reactive/rest-jsonb-common/deployment/pom.xml index 5f5e0d0ff96ba..f88a1e9a94acb 100644 --- a/extensions/resteasy-reactive/rest-jsonb-common/deployment/pom.xml +++ b/extensions/resteasy-reactive/rest-jsonb-common/deployment/pom.xml @@ -31,15 +31,20 @@ maven-compiler-plugin - - - - io.quarkus - quarkus-extension-processor - ${project.version} - - - + + + default-compile + + + + io.quarkus + quarkus-extension-processor + ${project.version} + + + + + diff --git a/extensions/resteasy-reactive/rest-jsonb-common/runtime/pom.xml b/extensions/resteasy-reactive/rest-jsonb-common/runtime/pom.xml index edfb5996b4747..bec2bb7ee5c52 100644 --- a/extensions/resteasy-reactive/rest-jsonb-common/runtime/pom.xml +++ b/extensions/resteasy-reactive/rest-jsonb-common/runtime/pom.xml @@ -36,15 +36,20 @@ maven-compiler-plugin - - - - io.quarkus - quarkus-extension-processor - ${project.version} - - - + + + default-compile + + + + io.quarkus + quarkus-extension-processor + ${project.version} + + + + + diff --git a/extensions/resteasy-reactive/rest-jsonb/deployment/pom.xml b/extensions/resteasy-reactive/rest-jsonb/deployment/pom.xml index ddc6d53d901f5..eccc4d245c7fd 100644 --- a/extensions/resteasy-reactive/rest-jsonb/deployment/pom.xml +++ b/extensions/resteasy-reactive/rest-jsonb/deployment/pom.xml @@ -57,15 +57,20 @@ maven-compiler-plugin - - - - io.quarkus - quarkus-extension-processor - ${project.version} - - - + + + default-compile + + + + io.quarkus + quarkus-extension-processor + ${project.version} + + + + + diff --git a/extensions/resteasy-reactive/rest-jsonb/runtime/pom.xml b/extensions/resteasy-reactive/rest-jsonb/runtime/pom.xml index 3ee70588046e5..a6a3547dc5cc3 100644 --- a/extensions/resteasy-reactive/rest-jsonb/runtime/pom.xml +++ b/extensions/resteasy-reactive/rest-jsonb/runtime/pom.xml @@ -42,15 +42,20 @@ maven-compiler-plugin - - - - io.quarkus - quarkus-extension-processor - ${project.version} - - - + + + default-compile + + + + io.quarkus + quarkus-extension-processor + ${project.version} + + + + + diff --git a/extensions/resteasy-reactive/rest-kotlin-serialization/deployment/pom.xml b/extensions/resteasy-reactive/rest-kotlin-serialization/deployment/pom.xml index 6c7b6dcbd87c0..551c079e2ff5c 100644 --- a/extensions/resteasy-reactive/rest-kotlin-serialization/deployment/pom.xml +++ b/extensions/resteasy-reactive/rest-kotlin-serialization/deployment/pom.xml @@ -40,15 +40,20 @@ maven-compiler-plugin - - - - io.quarkus - quarkus-extension-processor - ${project.version} - - - + + + default-compile + + + + io.quarkus + quarkus-extension-processor + ${project.version} + + + + + diff --git a/extensions/resteasy-reactive/rest-kotlin/deployment/pom.xml b/extensions/resteasy-reactive/rest-kotlin/deployment/pom.xml index 53412840db5f8..3ee66ef8913e4 100644 --- a/extensions/resteasy-reactive/rest-kotlin/deployment/pom.xml +++ b/extensions/resteasy-reactive/rest-kotlin/deployment/pom.xml @@ -31,15 +31,20 @@ maven-compiler-plugin - - - - io.quarkus - quarkus-extension-processor - ${project.version} - - - + + + default-compile + + + + io.quarkus + quarkus-extension-processor + ${project.version} + + + + + diff --git a/extensions/resteasy-reactive/rest-links/runtime/pom.xml b/extensions/resteasy-reactive/rest-links/runtime/pom.xml index 6e75b222e6590..0d9c2296625a3 100644 --- a/extensions/resteasy-reactive/rest-links/runtime/pom.xml +++ b/extensions/resteasy-reactive/rest-links/runtime/pom.xml @@ -47,15 +47,20 @@ maven-compiler-plugin - - - - io.quarkus - quarkus-extension-processor - ${project.version} - - - + + + default-compile + + + + io.quarkus + quarkus-extension-processor + ${project.version} + + + + + diff --git a/extensions/resteasy-reactive/rest-qute/deployment/pom.xml b/extensions/resteasy-reactive/rest-qute/deployment/pom.xml index 08d998c33b297..b624cc0e9721a 100644 --- a/extensions/resteasy-reactive/rest-qute/deployment/pom.xml +++ b/extensions/resteasy-reactive/rest-qute/deployment/pom.xml @@ -42,15 +42,20 @@ maven-compiler-plugin - - - - io.quarkus - quarkus-extension-processor - ${project.version} - - - + + + default-compile + + + + io.quarkus + quarkus-extension-processor + ${project.version} + + + + + diff --git a/extensions/resteasy-reactive/rest-qute/runtime/pom.xml b/extensions/resteasy-reactive/rest-qute/runtime/pom.xml index 74f6acd3b62bd..80e9617f99c60 100644 --- a/extensions/resteasy-reactive/rest-qute/runtime/pom.xml +++ b/extensions/resteasy-reactive/rest-qute/runtime/pom.xml @@ -53,15 +53,20 @@ maven-compiler-plugin - - - - io.quarkus - quarkus-extension-processor - ${project.version} - - - + + + default-compile + + + + io.quarkus + quarkus-extension-processor + ${project.version} + + + + + diff --git a/extensions/resteasy-reactive/rest-servlet/deployment/pom.xml b/extensions/resteasy-reactive/rest-servlet/deployment/pom.xml index 41302fb8aa921..ba556e043dd2c 100644 --- a/extensions/resteasy-reactive/rest-servlet/deployment/pom.xml +++ b/extensions/resteasy-reactive/rest-servlet/deployment/pom.xml @@ -82,15 +82,20 @@ maven-compiler-plugin - - - - io.quarkus - quarkus-extension-processor - ${project.version} - - - + + + default-compile + + + + io.quarkus + quarkus-extension-processor + ${project.version} + + + + + maven-surefire-plugin diff --git a/extensions/resteasy-reactive/rest-servlet/runtime/pom.xml b/extensions/resteasy-reactive/rest-servlet/runtime/pom.xml index b5e15d17a14d9..14e4dcb51a26b 100644 --- a/extensions/resteasy-reactive/rest-servlet/runtime/pom.xml +++ b/extensions/resteasy-reactive/rest-servlet/runtime/pom.xml @@ -37,15 +37,20 @@ maven-compiler-plugin - - - - io.quarkus - quarkus-extension-processor - ${project.version} - - - + + + default-compile + + + + io.quarkus + quarkus-extension-processor + ${project.version} + + + + + diff --git a/extensions/resteasy-reactive/rest/deployment/pom.xml b/extensions/resteasy-reactive/rest/deployment/pom.xml index 5c82c477d3648..a506c92c91c7a 100644 --- a/extensions/resteasy-reactive/rest/deployment/pom.xml +++ b/extensions/resteasy-reactive/rest/deployment/pom.xml @@ -125,15 +125,20 @@ maven-compiler-plugin - - - - io.quarkus - quarkus-extension-processor - ${project.version} - - - + + + default-compile + + + + io.quarkus + quarkus-extension-processor + ${project.version} + + + + + de.thetaphi diff --git a/extensions/resteasy-reactive/rest/runtime/pom.xml b/extensions/resteasy-reactive/rest/runtime/pom.xml index 6ffd6cbaafdb3..f83251ff30709 100644 --- a/extensions/resteasy-reactive/rest/runtime/pom.xml +++ b/extensions/resteasy-reactive/rest/runtime/pom.xml @@ -65,15 +65,20 @@ maven-compiler-plugin - - - - io.quarkus - quarkus-extension-processor - ${project.version} - - - + + + default-compile + + + + io.quarkus + quarkus-extension-processor + ${project.version} + + + + + diff --git a/extensions/scala/deployment/pom.xml b/extensions/scala/deployment/pom.xml index 3fc80398f86ff..090cfacd19336 100644 --- a/extensions/scala/deployment/pom.xml +++ b/extensions/scala/deployment/pom.xml @@ -34,15 +34,20 @@ maven-compiler-plugin - - - - io.quarkus - quarkus-extension-processor - ${project.version} - - - + + + default-compile + + + + io.quarkus + quarkus-extension-processor + ${project.version} + + + + + diff --git a/extensions/scheduler/deployment/pom.xml b/extensions/scheduler/deployment/pom.xml index eb93c53980248..7c95d30677ce9 100644 --- a/extensions/scheduler/deployment/pom.xml +++ b/extensions/scheduler/deployment/pom.xml @@ -71,18 +71,23 @@ maven-compiler-plugin - - - - io.quarkus - quarkus-extension-processor - ${project.version} - - - - -AlegacyConfigRoot=true - - + + + default-compile + + + + io.quarkus + quarkus-extension-processor + ${project.version} + + + + -AlegacyConfigRoot=true + + + + diff --git a/extensions/scheduler/runtime/pom.xml b/extensions/scheduler/runtime/pom.xml index f3111efc5686a..500e4cd276b10 100644 --- a/extensions/scheduler/runtime/pom.xml +++ b/extensions/scheduler/runtime/pom.xml @@ -58,18 +58,23 @@ maven-compiler-plugin - - - - io.quarkus - quarkus-extension-processor - ${project.version} - - - - -AlegacyConfigRoot=true - - + + + default-compile + + + + io.quarkus + quarkus-extension-processor + ${project.version} + + + + -AlegacyConfigRoot=true + + + + diff --git a/extensions/schema-registry/apicurio/avro/deployment/pom.xml b/extensions/schema-registry/apicurio/avro/deployment/pom.xml index 3c0009c1b7cf9..9360b00d0abfe 100644 --- a/extensions/schema-registry/apicurio/avro/deployment/pom.xml +++ b/extensions/schema-registry/apicurio/avro/deployment/pom.xml @@ -33,15 +33,20 @@ maven-compiler-plugin - - - - io.quarkus - quarkus-extension-processor - ${project.version} - - - + + + default-compile + + + + io.quarkus + quarkus-extension-processor + ${project.version} + + + + + diff --git a/extensions/schema-registry/apicurio/avro/runtime/pom.xml b/extensions/schema-registry/apicurio/avro/runtime/pom.xml index 9cfafe29bd518..f3d8fa5e3438c 100644 --- a/extensions/schema-registry/apicurio/avro/runtime/pom.xml +++ b/extensions/schema-registry/apicurio/avro/runtime/pom.xml @@ -50,15 +50,20 @@ maven-compiler-plugin - - - - io.quarkus - quarkus-extension-processor - ${project.version} - - - + + + default-compile + + + + io.quarkus + quarkus-extension-processor + ${project.version} + + + + + diff --git a/extensions/schema-registry/apicurio/common/deployment/pom.xml b/extensions/schema-registry/apicurio/common/deployment/pom.xml index 723a788758709..5c2bf237f4cc4 100644 --- a/extensions/schema-registry/apicurio/common/deployment/pom.xml +++ b/extensions/schema-registry/apicurio/common/deployment/pom.xml @@ -43,15 +43,20 @@ maven-compiler-plugin - - - - io.quarkus - quarkus-extension-processor - ${project.version} - - - + + + default-compile + + + + io.quarkus + quarkus-extension-processor + ${project.version} + + + + + diff --git a/extensions/schema-registry/apicurio/json-schema/deployment/pom.xml b/extensions/schema-registry/apicurio/json-schema/deployment/pom.xml index 0fb9a83544704..46260261b18c7 100644 --- a/extensions/schema-registry/apicurio/json-schema/deployment/pom.xml +++ b/extensions/schema-registry/apicurio/json-schema/deployment/pom.xml @@ -29,15 +29,20 @@ maven-compiler-plugin - - - - io.quarkus - quarkus-extension-processor - ${project.version} - - - + + + default-compile + + + + io.quarkus + quarkus-extension-processor + ${project.version} + + + + + diff --git a/extensions/schema-registry/apicurio/json-schema/runtime/pom.xml b/extensions/schema-registry/apicurio/json-schema/runtime/pom.xml index cdb6a28929e45..94c82a3356400 100644 --- a/extensions/schema-registry/apicurio/json-schema/runtime/pom.xml +++ b/extensions/schema-registry/apicurio/json-schema/runtime/pom.xml @@ -46,15 +46,20 @@ maven-compiler-plugin - - - - io.quarkus - quarkus-extension-processor - ${project.version} - - - + + + default-compile + + + + io.quarkus + quarkus-extension-processor + ${project.version} + + + + + diff --git a/extensions/schema-registry/confluent/avro/deployment/pom.xml b/extensions/schema-registry/confluent/avro/deployment/pom.xml index c98b4f7c0e4ae..0d1487a3f33c0 100644 --- a/extensions/schema-registry/confluent/avro/deployment/pom.xml +++ b/extensions/schema-registry/confluent/avro/deployment/pom.xml @@ -37,15 +37,20 @@ maven-compiler-plugin - - - - io.quarkus - quarkus-extension-processor - ${project.version} - - - + + + default-compile + + + + io.quarkus + quarkus-extension-processor + ${project.version} + + + + + diff --git a/extensions/schema-registry/confluent/avro/runtime/pom.xml b/extensions/schema-registry/confluent/avro/runtime/pom.xml index ec4593f1cb9ee..3b39990b923cb 100644 --- a/extensions/schema-registry/confluent/avro/runtime/pom.xml +++ b/extensions/schema-registry/confluent/avro/runtime/pom.xml @@ -43,15 +43,20 @@ maven-compiler-plugin - - - - io.quarkus - quarkus-extension-processor - ${project.version} - - - + + + default-compile + + + + io.quarkus + quarkus-extension-processor + ${project.version} + + + + + diff --git a/extensions/schema-registry/confluent/common/deployment/pom.xml b/extensions/schema-registry/confluent/common/deployment/pom.xml index 2c4608470b710..cd95107faf79d 100644 --- a/extensions/schema-registry/confluent/common/deployment/pom.xml +++ b/extensions/schema-registry/confluent/common/deployment/pom.xml @@ -34,15 +34,20 @@ maven-compiler-plugin - - - - io.quarkus - quarkus-extension-processor - ${project.version} - - - + + + default-compile + + + + io.quarkus + quarkus-extension-processor + ${project.version} + + + + + diff --git a/extensions/schema-registry/confluent/json-schema/deployment/pom.xml b/extensions/schema-registry/confluent/json-schema/deployment/pom.xml index 94501c8f5d7c0..29971f2ee1722 100644 --- a/extensions/schema-registry/confluent/json-schema/deployment/pom.xml +++ b/extensions/schema-registry/confluent/json-schema/deployment/pom.xml @@ -33,15 +33,20 @@ maven-compiler-plugin - - - - io.quarkus - quarkus-extension-processor - ${project.version} - - - + + + default-compile + + + + io.quarkus + quarkus-extension-processor + ${project.version} + + + + + diff --git a/extensions/schema-registry/confluent/json-schema/runtime/pom.xml b/extensions/schema-registry/confluent/json-schema/runtime/pom.xml index 6238560f35273..bcd2d2fde06f3 100644 --- a/extensions/schema-registry/confluent/json-schema/runtime/pom.xml +++ b/extensions/schema-registry/confluent/json-schema/runtime/pom.xml @@ -74,15 +74,20 @@ maven-compiler-plugin - - - - io.quarkus - quarkus-extension-processor - ${project.version} - - - + + + default-compile + + + + io.quarkus + quarkus-extension-processor + ${project.version} + + + + + diff --git a/extensions/schema-registry/devservice/deployment/pom.xml b/extensions/schema-registry/devservice/deployment/pom.xml index 609bf0c0fcb26..0a4809edbf8e6 100644 --- a/extensions/schema-registry/devservice/deployment/pom.xml +++ b/extensions/schema-registry/devservice/deployment/pom.xml @@ -39,18 +39,23 @@ maven-compiler-plugin - - - - io.quarkus - quarkus-extension-processor - ${project.version} - - - - -AlegacyConfigRoot=true - - + + + default-compile + + + + io.quarkus + quarkus-extension-processor + ${project.version} + + + + -AlegacyConfigRoot=true + + + + diff --git a/extensions/schema-registry/devservice/runtime/pom.xml b/extensions/schema-registry/devservice/runtime/pom.xml index 7d46afa0d1ade..62b3c516a6451 100644 --- a/extensions/schema-registry/devservice/runtime/pom.xml +++ b/extensions/schema-registry/devservice/runtime/pom.xml @@ -29,18 +29,23 @@ maven-compiler-plugin - - - - io.quarkus - quarkus-extension-processor - ${project.version} - - - - -AlegacyConfigRoot=true - - + + + default-compile + + + + io.quarkus + quarkus-extension-processor + ${project.version} + + + + -AlegacyConfigRoot=true + + + + diff --git a/extensions/security/deployment/pom.xml b/extensions/security/deployment/pom.xml index 919c2b7a3d788..4e895d91668eb 100644 --- a/extensions/security/deployment/pom.xml +++ b/extensions/security/deployment/pom.xml @@ -55,15 +55,20 @@ maven-compiler-plugin - - - - io.quarkus - quarkus-extension-processor - ${project.version} - - - + + + default-compile + + + + io.quarkus + quarkus-extension-processor + ${project.version} + + + + + diff --git a/extensions/security/runtime-spi/pom.xml b/extensions/security/runtime-spi/pom.xml index d1136b1e0c229..6c937ffbf7ca5 100644 --- a/extensions/security/runtime-spi/pom.xml +++ b/extensions/security/runtime-spi/pom.xml @@ -27,15 +27,20 @@ maven-compiler-plugin - - - - io.quarkus - quarkus-extension-processor - ${project.version} - - - + + + default-compile + + + + io.quarkus + quarkus-extension-processor + ${project.version} + + + + + diff --git a/extensions/security/runtime/pom.xml b/extensions/security/runtime/pom.xml index 913c34fd42225..9424d894efe38 100644 --- a/extensions/security/runtime/pom.xml +++ b/extensions/security/runtime/pom.xml @@ -64,15 +64,20 @@ maven-compiler-plugin - - - - io.quarkus - quarkus-extension-processor - ${project.version} - - - + + + default-compile + + + + io.quarkus + quarkus-extension-processor + ${project.version} + + + + + diff --git a/extensions/security/spi/pom.xml b/extensions/security/spi/pom.xml index a3045dbbb5f9e..33cff0db04439 100644 --- a/extensions/security/spi/pom.xml +++ b/extensions/security/spi/pom.xml @@ -27,15 +27,20 @@ maven-compiler-plugin - - - - io.quarkus - quarkus-extension-processor - ${project.version} - - - + + + default-compile + + + + io.quarkus + quarkus-extension-processor + ${project.version} + + + + + diff --git a/extensions/smallrye-context-propagation/deployment/pom.xml b/extensions/smallrye-context-propagation/deployment/pom.xml index 9b9c5e71d32c0..b7619fc0a23a4 100644 --- a/extensions/smallrye-context-propagation/deployment/pom.xml +++ b/extensions/smallrye-context-propagation/deployment/pom.xml @@ -39,15 +39,20 @@ maven-compiler-plugin - - - - io.quarkus - quarkus-extension-processor - ${project.version} - - - + + + default-compile + + + + io.quarkus + quarkus-extension-processor + ${project.version} + + + + + diff --git a/extensions/smallrye-context-propagation/runtime/pom.xml b/extensions/smallrye-context-propagation/runtime/pom.xml index dcb84f64baf50..0ba4760b9ea0a 100644 --- a/extensions/smallrye-context-propagation/runtime/pom.xml +++ b/extensions/smallrye-context-propagation/runtime/pom.xml @@ -45,15 +45,20 @@ maven-compiler-plugin - - - - io.quarkus - quarkus-extension-processor - ${project.version} - - - + + + default-compile + + + + io.quarkus + quarkus-extension-processor + ${project.version} + + + + + diff --git a/extensions/smallrye-fault-tolerance/deployment/pom.xml b/extensions/smallrye-fault-tolerance/deployment/pom.xml index 805401858b75c..50c3ad7d8e587 100644 --- a/extensions/smallrye-fault-tolerance/deployment/pom.xml +++ b/extensions/smallrye-fault-tolerance/deployment/pom.xml @@ -59,15 +59,20 @@ maven-compiler-plugin - - - - io.quarkus - quarkus-extension-processor - ${project.version} - - - + + + default-compile + + + + io.quarkus + quarkus-extension-processor + ${project.version} + + + + + diff --git a/extensions/smallrye-fault-tolerance/runtime/pom.xml b/extensions/smallrye-fault-tolerance/runtime/pom.xml index 9e8b6cf3cfbb7..3e6dfa2b3d699 100644 --- a/extensions/smallrye-fault-tolerance/runtime/pom.xml +++ b/extensions/smallrye-fault-tolerance/runtime/pom.xml @@ -90,15 +90,20 @@ maven-compiler-plugin - - - - io.quarkus - quarkus-extension-processor - ${project.version} - - - + + + default-compile + + + + io.quarkus + quarkus-extension-processor + ${project.version} + + + + + diff --git a/extensions/smallrye-health/deployment/pom.xml b/extensions/smallrye-health/deployment/pom.xml index 05778f6b226f4..e3a17ebe3cacd 100644 --- a/extensions/smallrye-health/deployment/pom.xml +++ b/extensions/smallrye-health/deployment/pom.xml @@ -72,18 +72,23 @@ maven-compiler-plugin - - - - io.quarkus - quarkus-extension-processor - ${project.version} - - - - -AlegacyConfigRoot=true - - + + + default-compile + + + + io.quarkus + quarkus-extension-processor + ${project.version} + + + + -AlegacyConfigRoot=true + + + + diff --git a/extensions/smallrye-health/runtime/pom.xml b/extensions/smallrye-health/runtime/pom.xml index d80d1322b08f2..b556b0e110e10 100644 --- a/extensions/smallrye-health/runtime/pom.xml +++ b/extensions/smallrye-health/runtime/pom.xml @@ -55,18 +55,23 @@ maven-compiler-plugin - - - - io.quarkus - quarkus-extension-processor - ${project.version} - - - - -AlegacyConfigRoot=true - - + + + default-compile + + + + io.quarkus + quarkus-extension-processor + ${project.version} + + + + -AlegacyConfigRoot=true + + + + diff --git a/extensions/smallrye-jwt-build/deployment/pom.xml b/extensions/smallrye-jwt-build/deployment/pom.xml index 7317a8485e090..2b3f73e683d10 100644 --- a/extensions/smallrye-jwt-build/deployment/pom.xml +++ b/extensions/smallrye-jwt-build/deployment/pom.xml @@ -42,15 +42,20 @@ maven-compiler-plugin - - - - io.quarkus - quarkus-extension-processor - ${project.version} - - - + + + default-compile + + + + io.quarkus + quarkus-extension-processor + ${project.version} + + + + + diff --git a/extensions/smallrye-jwt-build/runtime/pom.xml b/extensions/smallrye-jwt-build/runtime/pom.xml index 9501eccc0e055..2acada4bc252a 100644 --- a/extensions/smallrye-jwt-build/runtime/pom.xml +++ b/extensions/smallrye-jwt-build/runtime/pom.xml @@ -45,15 +45,20 @@ maven-compiler-plugin - - - - io.quarkus - quarkus-extension-processor - ${project.version} - - - + + + default-compile + + + + io.quarkus + quarkus-extension-processor + ${project.version} + + + + + diff --git a/extensions/smallrye-jwt/deployment/pom.xml b/extensions/smallrye-jwt/deployment/pom.xml index 3665b6f6abb07..5339218758bb7 100644 --- a/extensions/smallrye-jwt/deployment/pom.xml +++ b/extensions/smallrye-jwt/deployment/pom.xml @@ -71,15 +71,20 @@ maven-compiler-plugin - - - - io.quarkus - quarkus-extension-processor - ${project.version} - - - + + + default-compile + + + + io.quarkus + quarkus-extension-processor + ${project.version} + + + + + diff --git a/extensions/smallrye-jwt/runtime/pom.xml b/extensions/smallrye-jwt/runtime/pom.xml index 7b192b6fde459..6f288aded93b9 100644 --- a/extensions/smallrye-jwt/runtime/pom.xml +++ b/extensions/smallrye-jwt/runtime/pom.xml @@ -57,15 +57,20 @@ maven-compiler-plugin - - - - io.quarkus - quarkus-extension-processor - ${project.version} - - - + + + default-compile + + + + io.quarkus + quarkus-extension-processor + ${project.version} + + + + + diff --git a/extensions/smallrye-metrics/deployment/pom.xml b/extensions/smallrye-metrics/deployment/pom.xml index bfabad7160204..71c92edc2d4a5 100644 --- a/extensions/smallrye-metrics/deployment/pom.xml +++ b/extensions/smallrye-metrics/deployment/pom.xml @@ -82,18 +82,23 @@ maven-compiler-plugin - - - - io.quarkus - quarkus-extension-processor - ${project.version} - - - - -AlegacyConfigRoot=true - - + + + default-compile + + + + io.quarkus + quarkus-extension-processor + ${project.version} + + + + -AlegacyConfigRoot=true + + + + diff --git a/extensions/smallrye-metrics/runtime/pom.xml b/extensions/smallrye-metrics/runtime/pom.xml index d652cbc5c7850..6874d663fe883 100644 --- a/extensions/smallrye-metrics/runtime/pom.xml +++ b/extensions/smallrye-metrics/runtime/pom.xml @@ -64,18 +64,23 @@ maven-compiler-plugin - - - - io.quarkus - quarkus-extension-processor - ${project.version} - - - - -AlegacyConfigRoot=true - - + + + default-compile + + + + io.quarkus + quarkus-extension-processor + ${project.version} + + + + -AlegacyConfigRoot=true + + + + diff --git a/extensions/smallrye-openapi-common/deployment/pom.xml b/extensions/smallrye-openapi-common/deployment/pom.xml index a91915c45fa85..45bdfef55f030 100644 --- a/extensions/smallrye-openapi-common/deployment/pom.xml +++ b/extensions/smallrye-openapi-common/deployment/pom.xml @@ -23,18 +23,23 @@ maven-compiler-plugin - - - - io.quarkus - quarkus-extension-processor - ${project.version} - - - - -AlegacyConfigRoot=true - - + + + default-compile + + + + io.quarkus + quarkus-extension-processor + ${project.version} + + + + -AlegacyConfigRoot=true + + + + diff --git a/extensions/smallrye-openapi/deployment/pom.xml b/extensions/smallrye-openapi/deployment/pom.xml index cefb64b284b82..944f0c1f4986e 100644 --- a/extensions/smallrye-openapi/deployment/pom.xml +++ b/extensions/smallrye-openapi/deployment/pom.xml @@ -103,18 +103,23 @@ maven-compiler-plugin - - - - io.quarkus - quarkus-extension-processor - ${project.version} - - - - -AlegacyConfigRoot=true - - + + + default-compile + + + + io.quarkus + quarkus-extension-processor + ${project.version} + + + + -AlegacyConfigRoot=true + + + + diff --git a/extensions/smallrye-openapi/runtime/pom.xml b/extensions/smallrye-openapi/runtime/pom.xml index 950b0f1f7f6aa..1e8ec20b31c26 100644 --- a/extensions/smallrye-openapi/runtime/pom.xml +++ b/extensions/smallrye-openapi/runtime/pom.xml @@ -49,18 +49,23 @@ maven-compiler-plugin - - - - io.quarkus - quarkus-extension-processor - ${project.version} - - - - -AlegacyConfigRoot=true - - + + + default-compile + + + + io.quarkus + quarkus-extension-processor + ${project.version} + + + + -AlegacyConfigRoot=true + + + + diff --git a/extensions/smallrye-reactive-messaging-amqp/deployment/pom.xml b/extensions/smallrye-reactive-messaging-amqp/deployment/pom.xml index f04c6355416e6..efdf9bc89b055 100644 --- a/extensions/smallrye-reactive-messaging-amqp/deployment/pom.xml +++ b/extensions/smallrye-reactive-messaging-amqp/deployment/pom.xml @@ -101,18 +101,23 @@ maven-compiler-plugin - - - - io.quarkus - quarkus-extension-processor - ${project.version} - - - - -AlegacyConfigRoot=true - - + + + default-compile + + + + io.quarkus + quarkus-extension-processor + ${project.version} + + + + -AlegacyConfigRoot=true + + + + diff --git a/extensions/smallrye-reactive-messaging-amqp/runtime/pom.xml b/extensions/smallrye-reactive-messaging-amqp/runtime/pom.xml index 268772194e62d..d49053f4cf25d 100644 --- a/extensions/smallrye-reactive-messaging-amqp/runtime/pom.xml +++ b/extensions/smallrye-reactive-messaging-amqp/runtime/pom.xml @@ -66,18 +66,23 @@ maven-compiler-plugin - - - - io.quarkus - quarkus-extension-processor - ${project.version} - - - - -AlegacyConfigRoot=true - - + + + default-compile + + + + io.quarkus + quarkus-extension-processor + ${project.version} + + + + -AlegacyConfigRoot=true + + + + diff --git a/extensions/smallrye-reactive-messaging-kafka/deployment/pom.xml b/extensions/smallrye-reactive-messaging-kafka/deployment/pom.xml index 22309bb2e41f6..8ee27f89e36e3 100644 --- a/extensions/smallrye-reactive-messaging-kafka/deployment/pom.xml +++ b/extensions/smallrye-reactive-messaging-kafka/deployment/pom.xml @@ -108,18 +108,23 @@ maven-compiler-plugin - - - - io.quarkus - quarkus-extension-processor - ${project.version} - - - - -AlegacyConfigRoot=true - - + + + default-compile + + + + io.quarkus + quarkus-extension-processor + ${project.version} + + + + -AlegacyConfigRoot=true + + + + maven-surefire-plugin diff --git a/extensions/smallrye-reactive-messaging-kafka/runtime/pom.xml b/extensions/smallrye-reactive-messaging-kafka/runtime/pom.xml index 1cd78f6002db4..a1204f7969395 100644 --- a/extensions/smallrye-reactive-messaging-kafka/runtime/pom.xml +++ b/extensions/smallrye-reactive-messaging-kafka/runtime/pom.xml @@ -79,18 +79,23 @@ maven-compiler-plugin - - - - io.quarkus - quarkus-extension-processor - ${project.version} - - - - -AlegacyConfigRoot=true - - + + + default-compile + + + + io.quarkus + quarkus-extension-processor + ${project.version} + + + + -AlegacyConfigRoot=true + + + + diff --git a/extensions/smallrye-reactive-messaging-mqtt/deployment/pom.xml b/extensions/smallrye-reactive-messaging-mqtt/deployment/pom.xml index a9b6ef67c3d9f..00d8ab5e9cf43 100644 --- a/extensions/smallrye-reactive-messaging-mqtt/deployment/pom.xml +++ b/extensions/smallrye-reactive-messaging-mqtt/deployment/pom.xml @@ -62,18 +62,23 @@ maven-compiler-plugin - - - - io.quarkus - quarkus-extension-processor - ${project.version} - - - - -AlegacyConfigRoot=true - - + + + default-compile + + + + io.quarkus + quarkus-extension-processor + ${project.version} + + + + -AlegacyConfigRoot=true + + + + diff --git a/extensions/smallrye-reactive-messaging-mqtt/runtime/pom.xml b/extensions/smallrye-reactive-messaging-mqtt/runtime/pom.xml index 5ea09f9be0dc7..1ca33e4d0a01c 100644 --- a/extensions/smallrye-reactive-messaging-mqtt/runtime/pom.xml +++ b/extensions/smallrye-reactive-messaging-mqtt/runtime/pom.xml @@ -62,18 +62,23 @@ maven-compiler-plugin - - - - io.quarkus - quarkus-extension-processor - ${project.version} - - - - -AlegacyConfigRoot=true - - + + + default-compile + + + + io.quarkus + quarkus-extension-processor + ${project.version} + + + + -AlegacyConfigRoot=true + + + + diff --git a/extensions/smallrye-reactive-messaging-pulsar/deployment/pom.xml b/extensions/smallrye-reactive-messaging-pulsar/deployment/pom.xml index ad67ecc54ce40..ddb77fea405fb 100644 --- a/extensions/smallrye-reactive-messaging-pulsar/deployment/pom.xml +++ b/extensions/smallrye-reactive-messaging-pulsar/deployment/pom.xml @@ -100,18 +100,23 @@ maven-compiler-plugin - - - - io.quarkus - quarkus-extension-processor - ${project.version} - - - - -AlegacyConfigRoot=true - - + + + default-compile + + + + io.quarkus + quarkus-extension-processor + ${project.version} + + + + -AlegacyConfigRoot=true + + + + maven-surefire-plugin diff --git a/extensions/smallrye-reactive-messaging-pulsar/runtime/pom.xml b/extensions/smallrye-reactive-messaging-pulsar/runtime/pom.xml index c9dcf4c6126fa..36b057b5b2151 100644 --- a/extensions/smallrye-reactive-messaging-pulsar/runtime/pom.xml +++ b/extensions/smallrye-reactive-messaging-pulsar/runtime/pom.xml @@ -146,18 +146,23 @@ maven-compiler-plugin - - - - io.quarkus - quarkus-extension-processor - ${project.version} - - - - -AlegacyConfigRoot=true - - + + + default-compile + + + + io.quarkus + quarkus-extension-processor + ${project.version} + + + + -AlegacyConfigRoot=true + + + + diff --git a/extensions/smallrye-reactive-messaging-rabbitmq/deployment/pom.xml b/extensions/smallrye-reactive-messaging-rabbitmq/deployment/pom.xml index 246b152cbd5cf..7e24315a51b04 100644 --- a/extensions/smallrye-reactive-messaging-rabbitmq/deployment/pom.xml +++ b/extensions/smallrye-reactive-messaging-rabbitmq/deployment/pom.xml @@ -80,18 +80,23 @@ maven-compiler-plugin - - - - io.quarkus - quarkus-extension-processor - ${project.version} - - - - -AlegacyConfigRoot=true - - + + + default-compile + + + + io.quarkus + quarkus-extension-processor + ${project.version} + + + + -AlegacyConfigRoot=true + + + + diff --git a/extensions/smallrye-reactive-messaging-rabbitmq/runtime/pom.xml b/extensions/smallrye-reactive-messaging-rabbitmq/runtime/pom.xml index d38fdc13e0b60..ff7ab1c95d033 100644 --- a/extensions/smallrye-reactive-messaging-rabbitmq/runtime/pom.xml +++ b/extensions/smallrye-reactive-messaging-rabbitmq/runtime/pom.xml @@ -70,18 +70,23 @@ maven-compiler-plugin - - - - io.quarkus - quarkus-extension-processor - ${project.version} - - - - -AlegacyConfigRoot=true - - + + + default-compile + + + + io.quarkus + quarkus-extension-processor + ${project.version} + + + + -AlegacyConfigRoot=true + + + + diff --git a/extensions/smallrye-reactive-messaging/deployment/pom.xml b/extensions/smallrye-reactive-messaging/deployment/pom.xml index 39e576b650e7e..675ec3b76df01 100644 --- a/extensions/smallrye-reactive-messaging/deployment/pom.xml +++ b/extensions/smallrye-reactive-messaging/deployment/pom.xml @@ -93,18 +93,23 @@ maven-compiler-plugin - - - - io.quarkus - quarkus-extension-processor - ${project.version} - - - - -AlegacyConfigRoot=true - - + + + default-compile + + + + io.quarkus + quarkus-extension-processor + ${project.version} + + + + -AlegacyConfigRoot=true + + + + diff --git a/extensions/smallrye-reactive-messaging/runtime/pom.xml b/extensions/smallrye-reactive-messaging/runtime/pom.xml index 4f425ce1dcd3b..3fdbb10bfba31 100644 --- a/extensions/smallrye-reactive-messaging/runtime/pom.xml +++ b/extensions/smallrye-reactive-messaging/runtime/pom.xml @@ -96,18 +96,23 @@ maven-compiler-plugin - - - - io.quarkus - quarkus-extension-processor - ${project.version} - - - - -AlegacyConfigRoot=true - - + + + default-compile + + + + io.quarkus + quarkus-extension-processor + ${project.version} + + + + -AlegacyConfigRoot=true + + + + diff --git a/extensions/smallrye-stork/deployment/pom.xml b/extensions/smallrye-stork/deployment/pom.xml index 212600e2e2493..f928d523cd864 100644 --- a/extensions/smallrye-stork/deployment/pom.xml +++ b/extensions/smallrye-stork/deployment/pom.xml @@ -35,15 +35,20 @@ maven-compiler-plugin - - - - io.quarkus - quarkus-extension-processor - ${project.version} - - - + + + default-compile + + + + io.quarkus + quarkus-extension-processor + ${project.version} + + + + + diff --git a/extensions/smallrye-stork/runtime/pom.xml b/extensions/smallrye-stork/runtime/pom.xml index f67ce5f7c2a3b..e39c5d036c008 100644 --- a/extensions/smallrye-stork/runtime/pom.xml +++ b/extensions/smallrye-stork/runtime/pom.xml @@ -44,15 +44,20 @@ maven-compiler-plugin - - - - io.quarkus - quarkus-extension-processor - ${project.version} - - - + + + default-compile + + + + io.quarkus + quarkus-extension-processor + ${project.version} + + + + + diff --git a/extensions/spring-boot-properties/deployment/pom.xml b/extensions/spring-boot-properties/deployment/pom.xml index d3e07be7662a6..2b5f8ff2129df 100644 --- a/extensions/spring-boot-properties/deployment/pom.xml +++ b/extensions/spring-boot-properties/deployment/pom.xml @@ -27,18 +27,23 @@ maven-compiler-plugin - - - - io.quarkus - quarkus-extension-processor - ${project.version} - - - - -AlegacyConfigRoot=true - - + + + default-compile + + + + io.quarkus + quarkus-extension-processor + ${project.version} + + + + -AlegacyConfigRoot=true + + + + diff --git a/extensions/spring-boot-properties/runtime/pom.xml b/extensions/spring-boot-properties/runtime/pom.xml index 1253b8baf248e..8b859fb1aa0d4 100644 --- a/extensions/spring-boot-properties/runtime/pom.xml +++ b/extensions/spring-boot-properties/runtime/pom.xml @@ -41,18 +41,23 @@ maven-compiler-plugin - - - - io.quarkus - quarkus-extension-processor - ${project.version} - - - - -AlegacyConfigRoot=true - - + + + default-compile + + + + io.quarkus + quarkus-extension-processor + ${project.version} + + + + -AlegacyConfigRoot=true + + + + diff --git a/extensions/spring-cache/deployment/pom.xml b/extensions/spring-cache/deployment/pom.xml index 6a41ca3198124..3651930e3ed81 100644 --- a/extensions/spring-cache/deployment/pom.xml +++ b/extensions/spring-cache/deployment/pom.xml @@ -33,15 +33,20 @@ maven-compiler-plugin - - - - io.quarkus - quarkus-extension-processor - ${project.version} - - - + + + default-compile + + + + io.quarkus + quarkus-extension-processor + ${project.version} + + + + + diff --git a/extensions/spring-cloud-config-client/deployment/pom.xml b/extensions/spring-cloud-config-client/deployment/pom.xml index 5f81fff022e40..e5558ae4f4ad1 100644 --- a/extensions/spring-cloud-config-client/deployment/pom.xml +++ b/extensions/spring-cloud-config-client/deployment/pom.xml @@ -39,15 +39,20 @@ maven-compiler-plugin - - - - io.quarkus - quarkus-extension-processor - ${project.version} - - - + + + default-compile + + + + io.quarkus + quarkus-extension-processor + ${project.version} + + + + + diff --git a/extensions/spring-data-jpa/deployment/pom.xml b/extensions/spring-data-jpa/deployment/pom.xml index c9d9f16913e7c..a37901e4d8e67 100644 --- a/extensions/spring-data-jpa/deployment/pom.xml +++ b/extensions/spring-data-jpa/deployment/pom.xml @@ -58,15 +58,20 @@ maven-compiler-plugin - - - - io.quarkus - quarkus-extension-processor - ${project.version} - - - + + + default-compile + + + + io.quarkus + quarkus-extension-processor + ${project.version} + + + + + diff --git a/extensions/spring-data-rest/deployment/pom.xml b/extensions/spring-data-rest/deployment/pom.xml index 1b14f3cf8f580..f2771ddfbd3c1 100644 --- a/extensions/spring-data-rest/deployment/pom.xml +++ b/extensions/spring-data-rest/deployment/pom.xml @@ -62,15 +62,20 @@ maven-compiler-plugin - - - - io.quarkus - quarkus-extension-processor - ${project.version} - - - + + + default-compile + + + + io.quarkus + quarkus-extension-processor + ${project.version} + + + + + diff --git a/extensions/spring-di/deployment/pom.xml b/extensions/spring-di/deployment/pom.xml index 24f4a05d46599..1c205a5a8a753 100644 --- a/extensions/spring-di/deployment/pom.xml +++ b/extensions/spring-di/deployment/pom.xml @@ -39,15 +39,20 @@ maven-compiler-plugin - - - - io.quarkus - quarkus-extension-processor - ${project.version} - - - + + + default-compile + + + + io.quarkus + quarkus-extension-processor + ${project.version} + + + + + diff --git a/extensions/spring-scheduled/deployment/pom.xml b/extensions/spring-scheduled/deployment/pom.xml index a4cdf7c36953c..f723a49e98c87 100644 --- a/extensions/spring-scheduled/deployment/pom.xml +++ b/extensions/spring-scheduled/deployment/pom.xml @@ -47,15 +47,20 @@ maven-compiler-plugin - - - - io.quarkus - quarkus-extension-processor - ${project.version} - - - + + + default-compile + + + + io.quarkus + quarkus-extension-processor + ${project.version} + + + + + diff --git a/extensions/spring-security/deployment/pom.xml b/extensions/spring-security/deployment/pom.xml index 045d30559d843..883f98a0ffe09 100644 --- a/extensions/spring-security/deployment/pom.xml +++ b/extensions/spring-security/deployment/pom.xml @@ -75,15 +75,20 @@ maven-compiler-plugin - - - - io.quarkus - quarkus-extension-processor - ${project.version} - - - + + + default-compile + + + + io.quarkus + quarkus-extension-processor + ${project.version} + + + + + diff --git a/extensions/spring-web/core/deployment/pom.xml b/extensions/spring-web/core/deployment/pom.xml index f900549dbc620..3e4a4c85b1414 100644 --- a/extensions/spring-web/core/deployment/pom.xml +++ b/extensions/spring-web/core/deployment/pom.xml @@ -50,15 +50,20 @@ maven-compiler-plugin - - - - io.quarkus - quarkus-extension-processor - ${project.version} - - - + + + default-compile + + + + io.quarkus + quarkus-extension-processor + ${project.version} + + + + + diff --git a/extensions/spring-web/resteasy-classic/deployment/pom.xml b/extensions/spring-web/resteasy-classic/deployment/pom.xml index 3255de43b9e88..f7c07721f4a19 100644 --- a/extensions/spring-web/resteasy-classic/deployment/pom.xml +++ b/extensions/spring-web/resteasy-classic/deployment/pom.xml @@ -33,15 +33,20 @@ maven-compiler-plugin - - - - io.quarkus - quarkus-extension-processor - ${project.version} - - - + + + default-compile + + + + io.quarkus + quarkus-extension-processor + ${project.version} + + + + + diff --git a/extensions/spring-web/resteasy-reactive/deployment/pom.xml b/extensions/spring-web/resteasy-reactive/deployment/pom.xml index 3f7afef940d3a..4d4df3ebf8e21 100644 --- a/extensions/spring-web/resteasy-reactive/deployment/pom.xml +++ b/extensions/spring-web/resteasy-reactive/deployment/pom.xml @@ -44,15 +44,20 @@ maven-compiler-plugin - - - - io.quarkus - quarkus-extension-processor - ${project.version} - - - + + + default-compile + + + + io.quarkus + quarkus-extension-processor + ${project.version} + + + + + diff --git a/extensions/swagger-ui/deployment/pom.xml b/extensions/swagger-ui/deployment/pom.xml index 18ed14786d31d..02376a04919b0 100644 --- a/extensions/swagger-ui/deployment/pom.xml +++ b/extensions/swagger-ui/deployment/pom.xml @@ -53,18 +53,23 @@ maven-compiler-plugin - - - - io.quarkus - quarkus-extension-processor - ${project.version} - - - - -AlegacyConfigRoot=true - - + + + default-compile + + + + io.quarkus + quarkus-extension-processor + ${project.version} + + + + -AlegacyConfigRoot=true + + + + diff --git a/extensions/swagger-ui/runtime/pom.xml b/extensions/swagger-ui/runtime/pom.xml index edb4fd6f3e51a..ea8dbac939c47 100644 --- a/extensions/swagger-ui/runtime/pom.xml +++ b/extensions/swagger-ui/runtime/pom.xml @@ -35,18 +35,23 @@ maven-compiler-plugin - - - - io.quarkus - quarkus-extension-processor - ${project.version} - - - - -AlegacyConfigRoot=true - - + + + default-compile + + + + io.quarkus + quarkus-extension-processor + ${project.version} + + + + -AlegacyConfigRoot=true + + + + diff --git a/extensions/tls-registry/deployment/pom.xml b/extensions/tls-registry/deployment/pom.xml index 55311ab84b370..65a18203f3b75 100644 --- a/extensions/tls-registry/deployment/pom.xml +++ b/extensions/tls-registry/deployment/pom.xml @@ -80,15 +80,20 @@ maven-compiler-plugin - - - - io.quarkus - quarkus-extension-processor - ${project.version} - - - + + + default-compile + + + + io.quarkus + quarkus-extension-processor + ${project.version} + + + + + diff --git a/extensions/tls-registry/runtime/pom.xml b/extensions/tls-registry/runtime/pom.xml index 459055fe356c5..930ce841182e1 100644 --- a/extensions/tls-registry/runtime/pom.xml +++ b/extensions/tls-registry/runtime/pom.xml @@ -43,15 +43,20 @@ maven-compiler-plugin - - - - io.quarkus - quarkus-extension-processor - ${project.version} - - - + + + default-compile + + + + io.quarkus + quarkus-extension-processor + ${project.version} + + + + + diff --git a/extensions/undertow/deployment/pom.xml b/extensions/undertow/deployment/pom.xml index d7b72b18e8107..5c0a1dd872b2c 100644 --- a/extensions/undertow/deployment/pom.xml +++ b/extensions/undertow/deployment/pom.xml @@ -83,18 +83,23 @@ maven-compiler-plugin - - - - io.quarkus - quarkus-extension-processor - ${project.version} - - - - -AlegacyConfigRoot=true - - + + + default-compile + + + + io.quarkus + quarkus-extension-processor + ${project.version} + + + + -AlegacyConfigRoot=true + + + + diff --git a/extensions/undertow/runtime/pom.xml b/extensions/undertow/runtime/pom.xml index d7230c5c949d3..369d054c4238e 100644 --- a/extensions/undertow/runtime/pom.xml +++ b/extensions/undertow/runtime/pom.xml @@ -110,18 +110,23 @@ maven-compiler-plugin - - - - io.quarkus - quarkus-extension-processor - ${project.version} - - - - -AlegacyConfigRoot=true - - + + + default-compile + + + + io.quarkus + quarkus-extension-processor + ${project.version} + + + + -AlegacyConfigRoot=true + + + + diff --git a/extensions/undertow/spi/pom.xml b/extensions/undertow/spi/pom.xml index 3b13bfdf67625..95edde9d14428 100644 --- a/extensions/undertow/spi/pom.xml +++ b/extensions/undertow/spi/pom.xml @@ -41,15 +41,20 @@ maven-compiler-plugin - - - - io.quarkus - quarkus-extension-processor - ${project.version} - - - + + + default-compile + + + + io.quarkus + quarkus-extension-processor + ${project.version} + + + + + diff --git a/extensions/vertx-http/deployment/pom.xml b/extensions/vertx-http/deployment/pom.xml index f2d3d31960997..2ba139c19f25c 100644 --- a/extensions/vertx-http/deployment/pom.xml +++ b/extensions/vertx-http/deployment/pom.xml @@ -146,18 +146,23 @@ maven-compiler-plugin - - - - io.quarkus - quarkus-extension-processor - ${project.version} - - - - -AlegacyConfigRoot=true - - + + + default-compile + + + + io.quarkus + quarkus-extension-processor + ${project.version} + + + + -AlegacyConfigRoot=true + + + + diff --git a/extensions/vertx-http/runtime/pom.xml b/extensions/vertx-http/runtime/pom.xml index f24d420daa77e..b7073fd79dd1a 100644 --- a/extensions/vertx-http/runtime/pom.xml +++ b/extensions/vertx-http/runtime/pom.xml @@ -110,18 +110,23 @@ maven-compiler-plugin - - - - io.quarkus - quarkus-extension-processor - ${project.version} - - - - -AlegacyConfigRoot=true - - + + + default-compile + + + + io.quarkus + quarkus-extension-processor + ${project.version} + + + + -AlegacyConfigRoot=true + + + + diff --git a/extensions/vertx/deployment/pom.xml b/extensions/vertx/deployment/pom.xml index 3caa22b6d250b..d48712c837aa3 100644 --- a/extensions/vertx/deployment/pom.xml +++ b/extensions/vertx/deployment/pom.xml @@ -72,15 +72,20 @@ maven-compiler-plugin - - - - io.quarkus - quarkus-extension-processor - ${project.version} - - - + + + default-compile + + + + io.quarkus + quarkus-extension-processor + ${project.version} + + + + + de.thetaphi diff --git a/extensions/vertx/kotlin/deployment/pom.xml b/extensions/vertx/kotlin/deployment/pom.xml index 45cb0e8d86ae9..c504d169f2130 100644 --- a/extensions/vertx/kotlin/deployment/pom.xml +++ b/extensions/vertx/kotlin/deployment/pom.xml @@ -32,15 +32,20 @@ maven-compiler-plugin - - - - io.quarkus - quarkus-extension-processor - ${project.version} - - - + + + default-compile + + + + io.quarkus + quarkus-extension-processor + ${project.version} + + + + + de.thetaphi diff --git a/extensions/vertx/runtime/pom.xml b/extensions/vertx/runtime/pom.xml index 6809e3614a3e8..a9ea2bbc1a771 100644 --- a/extensions/vertx/runtime/pom.xml +++ b/extensions/vertx/runtime/pom.xml @@ -103,15 +103,20 @@ maven-compiler-plugin - - - - io.quarkus - quarkus-extension-processor - ${project.version} - - - + + + default-compile + + + + io.quarkus + quarkus-extension-processor + ${project.version} + + + + + diff --git a/extensions/virtual-threads/deployment/pom.xml b/extensions/virtual-threads/deployment/pom.xml index ff7dc00b11cfe..c5c58e98b1f7d 100644 --- a/extensions/virtual-threads/deployment/pom.xml +++ b/extensions/virtual-threads/deployment/pom.xml @@ -32,18 +32,23 @@ maven-compiler-plugin - - - - io.quarkus - quarkus-extension-processor - ${project.version} - - - - -AlegacyConfigRoot=true - - + + + default-compile + + + + io.quarkus + quarkus-extension-processor + ${project.version} + + + + -AlegacyConfigRoot=true + + + + diff --git a/extensions/virtual-threads/runtime/pom.xml b/extensions/virtual-threads/runtime/pom.xml index e0ba7717725c7..d01ec6de6546c 100644 --- a/extensions/virtual-threads/runtime/pom.xml +++ b/extensions/virtual-threads/runtime/pom.xml @@ -49,18 +49,23 @@ maven-compiler-plugin - - - - io.quarkus - quarkus-extension-processor - ${project.version} - - - - -AlegacyConfigRoot=true - - + + + default-compile + + + + io.quarkus + quarkus-extension-processor + ${project.version} + + + + -AlegacyConfigRoot=true + + + + org.apache.maven.plugins diff --git a/extensions/web-dependency-locator/deployment/pom.xml b/extensions/web-dependency-locator/deployment/pom.xml index dd9ce478c39f6..0a71bfa69a34c 100644 --- a/extensions/web-dependency-locator/deployment/pom.xml +++ b/extensions/web-dependency-locator/deployment/pom.xml @@ -86,18 +86,23 @@ maven-compiler-plugin - - - - io.quarkus - quarkus-extension-processor - ${project.version} - - - - -AlegacyConfigRoot=true - - + + + default-compile + + + + io.quarkus + quarkus-extension-processor + ${project.version} + + + + -AlegacyConfigRoot=true + + + + maven-surefire-plugin diff --git a/extensions/web-dependency-locator/runtime/pom.xml b/extensions/web-dependency-locator/runtime/pom.xml index cf6cd4abcc9d1..1bedaf80d0250 100644 --- a/extensions/web-dependency-locator/runtime/pom.xml +++ b/extensions/web-dependency-locator/runtime/pom.xml @@ -32,18 +32,23 @@ maven-compiler-plugin - - - - io.quarkus - quarkus-extension-processor - ${project.version} - - - - -AlegacyConfigRoot=true - - + + + default-compile + + + + io.quarkus + quarkus-extension-processor + ${project.version} + + + + -AlegacyConfigRoot=true + + + + diff --git a/extensions/websockets-next/runtime/pom.xml b/extensions/websockets-next/runtime/pom.xml index de16a0cfaacaa..4f0487b590599 100644 --- a/extensions/websockets-next/runtime/pom.xml +++ b/extensions/websockets-next/runtime/pom.xml @@ -64,15 +64,20 @@ maven-compiler-plugin - - - - io.quarkus - quarkus-extension-processor - ${project.version} - - - + + + default-compile + + + + io.quarkus + quarkus-extension-processor + ${project.version} + + + + + diff --git a/extensions/websockets/client/deployment/pom.xml b/extensions/websockets/client/deployment/pom.xml index 706ce573ac731..165456e8d7476 100644 --- a/extensions/websockets/client/deployment/pom.xml +++ b/extensions/websockets/client/deployment/pom.xml @@ -41,18 +41,23 @@ maven-compiler-plugin - - - - io.quarkus - quarkus-extension-processor - ${project.version} - - - - -AlegacyConfigRoot=true - - + + + default-compile + + + + io.quarkus + quarkus-extension-processor + ${project.version} + + + + -AlegacyConfigRoot=true + + + + diff --git a/extensions/websockets/client/runtime/pom.xml b/extensions/websockets/client/runtime/pom.xml index 0165918da142c..9286ecd0313fa 100644 --- a/extensions/websockets/client/runtime/pom.xml +++ b/extensions/websockets/client/runtime/pom.xml @@ -60,18 +60,23 @@ maven-compiler-plugin - - - - io.quarkus - quarkus-extension-processor - ${project.version} - - - - -AlegacyConfigRoot=true - - + + + default-compile + + + + io.quarkus + quarkus-extension-processor + ${project.version} + + + + -AlegacyConfigRoot=true + + + + diff --git a/extensions/websockets/server/deployment/pom.xml b/extensions/websockets/server/deployment/pom.xml index 277311312b2a2..b4eea0ff7c9aa 100644 --- a/extensions/websockets/server/deployment/pom.xml +++ b/extensions/websockets/server/deployment/pom.xml @@ -40,15 +40,20 @@ maven-compiler-plugin - - - - io.quarkus - quarkus-extension-processor - ${project.version} - - - + + + default-compile + + + + io.quarkus + quarkus-extension-processor + ${project.version} + + + + + diff --git a/extensions/websockets/server/runtime/pom.xml b/extensions/websockets/server/runtime/pom.xml index da764a6e8d82f..b811a6d90c656 100644 --- a/extensions/websockets/server/runtime/pom.xml +++ b/extensions/websockets/server/runtime/pom.xml @@ -62,15 +62,20 @@ maven-compiler-plugin - - - - io.quarkus - quarkus-extension-processor - ${project.version} - - - + + + default-compile + + + + io.quarkus + quarkus-extension-processor + ${project.version} + + + + + diff --git a/integration-tests/class-transformer/deployment/pom.xml b/integration-tests/class-transformer/deployment/pom.xml index 1500dc2e6129b..27444c60990cb 100644 --- a/integration-tests/class-transformer/deployment/pom.xml +++ b/integration-tests/class-transformer/deployment/pom.xml @@ -31,15 +31,20 @@ maven-compiler-plugin - - - - io.quarkus - quarkus-extension-processor - ${project.version} - - - + + + default-compile + + + + io.quarkus + quarkus-extension-processor + ${project.version} + + + + + diff --git a/integration-tests/devmode/pom.xml b/integration-tests/devmode/pom.xml index 6ff692ea73908..b58a82971aa3c 100644 --- a/integration-tests/devmode/pom.xml +++ b/integration-tests/devmode/pom.xml @@ -130,15 +130,20 @@ maven-compiler-plugin - - - - io.quarkus - quarkus-extension-processor - ${project.version} - - - + + + default-compile + + + + io.quarkus + quarkus-extension-processor + ${project.version} + + + + + maven-surefire-plugin diff --git a/integration-tests/devtools/pom.xml b/integration-tests/devtools/pom.xml index 42b88a83ac9c5..4c16999a91e3b 100644 --- a/integration-tests/devtools/pom.xml +++ b/integration-tests/devtools/pom.xml @@ -96,15 +96,20 @@ maven-compiler-plugin - - - - io.quarkus - quarkus-extension-processor - ${project.version} - - - + + + default-compile + + + + io.quarkus + quarkus-extension-processor + ${project.version} + + + + + diff --git a/integration-tests/test-extension/extension-that-defines-junit-test-extensions/deployment/pom.xml b/integration-tests/test-extension/extension-that-defines-junit-test-extensions/deployment/pom.xml index 8bed2e8d5dd73..7757fd6b1d07d 100644 --- a/integration-tests/test-extension/extension-that-defines-junit-test-extensions/deployment/pom.xml +++ b/integration-tests/test-extension/extension-that-defines-junit-test-extensions/deployment/pom.xml @@ -75,15 +75,20 @@ maven-compiler-plugin - - - - io.quarkus - quarkus-extension-processor - ${project.version} - - - + + + default-compile + + + + io.quarkus + quarkus-extension-processor + ${project.version} + + + + + diff --git a/integration-tests/test-extension/extension-that-defines-junit-test-extensions/runtime/pom.xml b/integration-tests/test-extension/extension-that-defines-junit-test-extensions/runtime/pom.xml index e39abc6d26939..92cebe648b095 100644 --- a/integration-tests/test-extension/extension-that-defines-junit-test-extensions/runtime/pom.xml +++ b/integration-tests/test-extension/extension-that-defines-junit-test-extensions/runtime/pom.xml @@ -118,15 +118,20 @@ maven-compiler-plugin - - - - io.quarkus - quarkus-extension-processor - ${project.version} - - - + + + default-compile + + + + io.quarkus + quarkus-extension-processor + ${project.version} + + + + + diff --git a/test-framework/jacoco/deployment/pom.xml b/test-framework/jacoco/deployment/pom.xml index af0224e671d69..7aa0f877e779a 100644 --- a/test-framework/jacoco/deployment/pom.xml +++ b/test-framework/jacoco/deployment/pom.xml @@ -41,18 +41,23 @@ maven-compiler-plugin - - - - io.quarkus - quarkus-extension-processor - ${project.version} - - - - -AlegacyConfigRoot=true - - + + + default-compile + + + + io.quarkus + quarkus-extension-processor + ${project.version} + + + + -AlegacyConfigRoot=true + + + + diff --git a/test-framework/jacoco/runtime/pom.xml b/test-framework/jacoco/runtime/pom.xml index 6d0d856264efd..449c9951353b7 100644 --- a/test-framework/jacoco/runtime/pom.xml +++ b/test-framework/jacoco/runtime/pom.xml @@ -71,18 +71,23 @@ maven-compiler-plugin - - - - io.quarkus - quarkus-extension-processor - ${project.version} - - - - -AlegacyConfigRoot=true - - + + + default-compile + + + + io.quarkus + quarkus-extension-processor + ${project.version} + + + + -AlegacyConfigRoot=true + + + + From e54a4ea2ac9116385f2b598eec0e12e5342a3440 Mon Sep 17 00:00:00 2001 From: Guillaume Smet Date: Thu, 25 Jul 2024 13:18:29 +0200 Subject: [PATCH 07/43] Fix pom legacy config --- extensions/elasticsearch-rest-client/deployment/pom.xml | 3 --- extensions/elasticsearch-rest-client/runtime/pom.xml | 3 --- extensions/resteasy-classic/resteasy-common/runtime/pom.xml | 3 --- 3 files changed, 9 deletions(-) diff --git a/extensions/elasticsearch-rest-client/deployment/pom.xml b/extensions/elasticsearch-rest-client/deployment/pom.xml index dcba456c0c04c..cec8af5407f64 100644 --- a/extensions/elasticsearch-rest-client/deployment/pom.xml +++ b/extensions/elasticsearch-rest-client/deployment/pom.xml @@ -66,9 +66,6 @@ ${project.version} - - -AlegacyConfigRoot=true - diff --git a/extensions/elasticsearch-rest-client/runtime/pom.xml b/extensions/elasticsearch-rest-client/runtime/pom.xml index fc5d8ecfb3a4d..9b83daf603490 100644 --- a/extensions/elasticsearch-rest-client/runtime/pom.xml +++ b/extensions/elasticsearch-rest-client/runtime/pom.xml @@ -51,9 +51,6 @@ ${project.version} - - -AlegacyConfigRoot=true - diff --git a/extensions/resteasy-classic/resteasy-common/runtime/pom.xml b/extensions/resteasy-classic/resteasy-common/runtime/pom.xml index 57b6e8f198dd2..07ff4148e5c36 100644 --- a/extensions/resteasy-classic/resteasy-common/runtime/pom.xml +++ b/extensions/resteasy-classic/resteasy-common/runtime/pom.xml @@ -127,9 +127,6 @@ ${project.version} - - -AlegacyConfigRoot=true - From 543fb56a58c68a9c7482a05c31dca5b419157bd3 Mon Sep 17 00:00:00 2001 From: Guillaume Smet Date: Wed, 31 Jul 2024 14:48:29 +0200 Subject: [PATCH 08/43] Make config annotations kept at runtime This should allow us to resolve fully the doc model even if we depend on classes or config groups that are outside of the scope of the module. The cost should be negligible and it should simplify things a lot. All the @ConfigMapping-related annotations in SmallRye Config already have a runtime retention so it makes sense to be consitent. Note that we will still need to centralize the Javadoc as obviously the Javadoc is source only. --- .../java/io/quarkus/runtime/annotations/ConfigDocDefault.java | 4 ++-- .../io/quarkus/runtime/annotations/ConfigDocFilename.java | 4 ++-- .../java/io/quarkus/runtime/annotations/ConfigDocIgnore.java | 4 ++-- .../java/io/quarkus/runtime/annotations/ConfigDocMapKey.java | 4 ++-- .../java/io/quarkus/runtime/annotations/ConfigDocSection.java | 4 ++-- 5 files changed, 10 insertions(+), 10 deletions(-) diff --git a/core/runtime/src/main/java/io/quarkus/runtime/annotations/ConfigDocDefault.java b/core/runtime/src/main/java/io/quarkus/runtime/annotations/ConfigDocDefault.java index b96723d2bbc47..ece03bd17604e 100644 --- a/core/runtime/src/main/java/io/quarkus/runtime/annotations/ConfigDocDefault.java +++ b/core/runtime/src/main/java/io/quarkus/runtime/annotations/ConfigDocDefault.java @@ -3,7 +3,7 @@ import static java.lang.annotation.ElementType.FIELD; import static java.lang.annotation.ElementType.METHOD; import static java.lang.annotation.ElementType.PARAMETER; -import static java.lang.annotation.RetentionPolicy.SOURCE; +import static java.lang.annotation.RetentionPolicy.RUNTIME; import java.lang.annotation.Documented; import java.lang.annotation.Retention; @@ -17,7 +17,7 @@ * Replaces defaultValueForDocumentation for the {@link ConfigMapping} approach. */ @Documented -@Retention(SOURCE) +@Retention(RUNTIME) @Target({ FIELD, PARAMETER, METHOD }) public @interface ConfigDocDefault { diff --git a/core/runtime/src/main/java/io/quarkus/runtime/annotations/ConfigDocFilename.java b/core/runtime/src/main/java/io/quarkus/runtime/annotations/ConfigDocFilename.java index d8489faaeaede..db67cda5497a3 100644 --- a/core/runtime/src/main/java/io/quarkus/runtime/annotations/ConfigDocFilename.java +++ b/core/runtime/src/main/java/io/quarkus/runtime/annotations/ConfigDocFilename.java @@ -1,6 +1,6 @@ package io.quarkus.runtime.annotations; -import static java.lang.annotation.RetentionPolicy.SOURCE; +import static java.lang.annotation.RetentionPolicy.RUNTIME; import java.lang.annotation.Documented; import java.lang.annotation.ElementType; @@ -14,7 +14,7 @@ * If not specified, the effective file name is derived either from the class name or {@link ConfigMapping#prefix()}. */ @Documented -@Retention(SOURCE) +@Retention(RUNTIME) @Target({ ElementType.TYPE }) public @interface ConfigDocFilename { diff --git a/core/runtime/src/main/java/io/quarkus/runtime/annotations/ConfigDocIgnore.java b/core/runtime/src/main/java/io/quarkus/runtime/annotations/ConfigDocIgnore.java index 1bc1a8469c9e2..ee67e4c5bfa8c 100644 --- a/core/runtime/src/main/java/io/quarkus/runtime/annotations/ConfigDocIgnore.java +++ b/core/runtime/src/main/java/io/quarkus/runtime/annotations/ConfigDocIgnore.java @@ -1,7 +1,7 @@ package io.quarkus.runtime.annotations; import static java.lang.annotation.ElementType.METHOD; -import static java.lang.annotation.RetentionPolicy.SOURCE; +import static java.lang.annotation.RetentionPolicy.RUNTIME; import java.lang.annotation.Documented; import java.lang.annotation.Retention; @@ -12,7 +12,7 @@ * when generating documentation. */ @Documented -@Retention(SOURCE) +@Retention(RUNTIME) @Target({ METHOD }) public @interface ConfigDocIgnore { } diff --git a/core/runtime/src/main/java/io/quarkus/runtime/annotations/ConfigDocMapKey.java b/core/runtime/src/main/java/io/quarkus/runtime/annotations/ConfigDocMapKey.java index 74e6b54fd62a6..f90353e882b2f 100644 --- a/core/runtime/src/main/java/io/quarkus/runtime/annotations/ConfigDocMapKey.java +++ b/core/runtime/src/main/java/io/quarkus/runtime/annotations/ConfigDocMapKey.java @@ -3,7 +3,7 @@ import static java.lang.annotation.ElementType.FIELD; import static java.lang.annotation.ElementType.METHOD; import static java.lang.annotation.ElementType.PARAMETER; -import static java.lang.annotation.RetentionPolicy.SOURCE; +import static java.lang.annotation.RetentionPolicy.RUNTIME; import java.lang.annotation.Documented; import java.lang.annotation.Retention; @@ -13,7 +13,7 @@ * A marker indicating a user-friendly documentation key for the {@link java.util.Map} type. */ @Documented -@Retention(SOURCE) +@Retention(RUNTIME) @Target({ FIELD, PARAMETER, METHOD }) public @interface ConfigDocMapKey { String value(); diff --git a/core/runtime/src/main/java/io/quarkus/runtime/annotations/ConfigDocSection.java b/core/runtime/src/main/java/io/quarkus/runtime/annotations/ConfigDocSection.java index 372cc7782d621..9560abb2d30a8 100644 --- a/core/runtime/src/main/java/io/quarkus/runtime/annotations/ConfigDocSection.java +++ b/core/runtime/src/main/java/io/quarkus/runtime/annotations/ConfigDocSection.java @@ -3,7 +3,7 @@ import static java.lang.annotation.ElementType.FIELD; import static java.lang.annotation.ElementType.METHOD; import static java.lang.annotation.ElementType.PARAMETER; -import static java.lang.annotation.RetentionPolicy.SOURCE; +import static java.lang.annotation.RetentionPolicy.RUNTIME; import java.lang.annotation.Documented; import java.lang.annotation.Retention; @@ -14,7 +14,7 @@ * The section will be generated only if the configuration item type is annotated with {@link ConfigGroup} */ @Documented -@Retention(SOURCE) +@Retention(RUNTIME) @Target({ FIELD, PARAMETER, METHOD }) public @interface ConfigDocSection { } From b015c1ddc14e64aa86ea12bc54378c4b382305a5 Mon Sep 17 00:00:00 2001 From: Guillaume Smet Date: Wed, 31 Jul 2024 15:19:52 +0200 Subject: [PATCH 09/43] Work around Quarkus Core and Quarkus Messaging mixing two approaches Both use traditional config roots AND config mappings at the same time, which won't be supported in the future. For now, we try to be lenient as it's going to be a long and bumpy road to fix it. --- .../discovery/DiscoveryConfigGroup.java | 4 +-- .../config/discovery/DiscoveryConfigRoot.java | 4 +-- .../discovery/DiscoveryRootElement.java | 13 +++++++- .../documentation/config/model/Extension.java | 9 ++++++ .../scanner/AbstractConfigListener.java | 4 ++- .../scanner/ConfigAnnotationScanner.java | 30 ++++++++++++++----- .../config/scanner/ConfigMappingListener.java | 26 +++++++++++++++- .../scanner/JavadocConfigMappingListener.java | 4 +++ .../JavadocLegacyConfigRootListener.java | 4 +++ .../config/scanner/LegacyConfigListener.java | 26 +++++++++++++++- .../extension/ExtensionBuildProcessor.java | 4 +-- 11 files changed, 111 insertions(+), 17 deletions(-) diff --git a/core/processor/src/main/java/io/quarkus/annotation/processor/documentation/config/discovery/DiscoveryConfigGroup.java b/core/processor/src/main/java/io/quarkus/annotation/processor/documentation/config/discovery/DiscoveryConfigGroup.java index 3f23cc9cf23c8..6f6b621126a1c 100644 --- a/core/processor/src/main/java/io/quarkus/annotation/processor/documentation/config/discovery/DiscoveryConfigGroup.java +++ b/core/processor/src/main/java/io/quarkus/annotation/processor/documentation/config/discovery/DiscoveryConfigGroup.java @@ -4,8 +4,8 @@ public final class DiscoveryConfigGroup extends DiscoveryRootElement { - public DiscoveryConfigGroup(Extension extension, String binaryName, String qualifiedName) { - super(extension, binaryName, qualifiedName); + public DiscoveryConfigGroup(Extension extension, String binaryName, String qualifiedName, boolean configMapping) { + super(extension, binaryName, qualifiedName, configMapping); } } diff --git a/core/processor/src/main/java/io/quarkus/annotation/processor/documentation/config/discovery/DiscoveryConfigRoot.java b/core/processor/src/main/java/io/quarkus/annotation/processor/documentation/config/discovery/DiscoveryConfigRoot.java index a662f47a5cc4e..b42451ddd609c 100644 --- a/core/processor/src/main/java/io/quarkus/annotation/processor/documentation/config/discovery/DiscoveryConfigRoot.java +++ b/core/processor/src/main/java/io/quarkus/annotation/processor/documentation/config/discovery/DiscoveryConfigRoot.java @@ -15,8 +15,8 @@ public final class DiscoveryConfigRoot extends DiscoveryRootElement { private final String overriddenDocFileName; public DiscoveryConfigRoot(Extension extension, String prefix, String binaryName, String qualifiedName, - ConfigPhase configPhase, String overriddenDocFileName) { - super(extension, binaryName, qualifiedName); + ConfigPhase configPhase, String overriddenDocFileName, boolean configMapping) { + super(extension, binaryName, qualifiedName, configMapping); this.prefix = prefix; this.phase = configPhase; diff --git a/core/processor/src/main/java/io/quarkus/annotation/processor/documentation/config/discovery/DiscoveryRootElement.java b/core/processor/src/main/java/io/quarkus/annotation/processor/documentation/config/discovery/DiscoveryRootElement.java index d35cc8ad4c570..34135560368c9 100644 --- a/core/processor/src/main/java/io/quarkus/annotation/processor/documentation/config/discovery/DiscoveryRootElement.java +++ b/core/processor/src/main/java/io/quarkus/annotation/processor/documentation/config/discovery/DiscoveryRootElement.java @@ -17,10 +17,16 @@ public sealed abstract class DiscoveryRootElement permits DiscoveryConfigRoot, D private final List unresolvedInterfaces = new ArrayList<>(); private final Map properties = new LinkedHashMap<>(); - DiscoveryRootElement(Extension extension, String binaryName, String qualifiedName) { + // TODO #42114 remove once fixed + // this is an approximation, we can't fully detect that in the case of config groups + @Deprecated(forRemoval = true) + private final boolean configMapping; + + DiscoveryRootElement(Extension extension, String binaryName, String qualifiedName, boolean configMapping) { this.extension = extension; this.binaryName = binaryName; this.qualifiedName = qualifiedName; + this.configMapping = configMapping; } public Extension getExtension() { @@ -59,6 +65,11 @@ public Map getProperties() { return Collections.unmodifiableMap(properties); } + @Deprecated(forRemoval = true) + public boolean isConfigMapping() { + return configMapping; + } + public String toString() { return toString(""); } diff --git a/core/processor/src/main/java/io/quarkus/annotation/processor/documentation/config/model/Extension.java b/core/processor/src/main/java/io/quarkus/annotation/processor/documentation/config/model/Extension.java index 2bb5f1b4dc6e3..81a833658a571 100644 --- a/core/processor/src/main/java/io/quarkus/annotation/processor/documentation/config/model/Extension.java +++ b/core/processor/src/main/java/io/quarkus/annotation/processor/documentation/config/model/Extension.java @@ -1,4 +1,13 @@ package io.quarkus.annotation.processor.documentation.config.model; +import com.fasterxml.jackson.annotation.JsonIgnore; + public record Extension(String groupId, String artifactId, String name) { + + // TODO #42114 remove once fixed + @Deprecated(forRemoval = true) + @JsonIgnore + public boolean isMixedModule() { + return "io.quarkus".equals(groupId) && ("quarkus-core".equals(artifactId) || "quarkus-messaging".equals(artifactId)); + } } diff --git a/core/processor/src/main/java/io/quarkus/annotation/processor/documentation/config/scanner/AbstractConfigListener.java b/core/processor/src/main/java/io/quarkus/annotation/processor/documentation/config/scanner/AbstractConfigListener.java index 145d737b02971..264733e1a3b7b 100644 --- a/core/processor/src/main/java/io/quarkus/annotation/processor/documentation/config/scanner/AbstractConfigListener.java +++ b/core/processor/src/main/java/io/quarkus/annotation/processor/documentation/config/scanner/AbstractConfigListener.java @@ -36,7 +36,9 @@ protected AbstractConfigListener(Config config, Utils utils, ConfigCollector con public Optional onConfigGroup(TypeElement configGroup) { DiscoveryConfigGroup discoveryConfigGroup = new DiscoveryConfigGroup(config.getExtension(), utils.element().getBinaryName(configGroup), - configGroup.getQualifiedName().toString()); + configGroup.getQualifiedName().toString(), + // interface config groups are considered config mappings, let's hope it's enough + configGroup.getKind() == ElementKind.INTERFACE); configCollector.addResolvedConfigGroup(discoveryConfigGroup); return Optional.of(discoveryConfigGroup); } diff --git a/core/processor/src/main/java/io/quarkus/annotation/processor/documentation/config/scanner/ConfigAnnotationScanner.java b/core/processor/src/main/java/io/quarkus/annotation/processor/documentation/config/scanner/ConfigAnnotationScanner.java index 818e319ac64f1..757819a2581aa 100644 --- a/core/processor/src/main/java/io/quarkus/annotation/processor/documentation/config/scanner/ConfigAnnotationScanner.java +++ b/core/processor/src/main/java/io/quarkus/annotation/processor/documentation/config/scanner/ConfigAnnotationScanner.java @@ -56,13 +56,26 @@ public ConfigAnnotationScanner(Config config, Utils utils) { this.configCollector = new ConfigCollector(); List listeners = new ArrayList<>(); - if (config.useConfigMapping()) { - listeners.add(new JavadocConfigMappingListener(config, utils, configCollector)); - listeners.add(new ConfigMappingListener(config, utils, configCollector)); + if (!config.getExtension().isMixedModule()) { + // This is what we aim for. We have an exception for Quarkus Core and Quarkus Messaging though. + if (config.useConfigMapping()) { + listeners.add(new JavadocConfigMappingListener(config, utils, configCollector)); + listeners.add(new ConfigMappingListener(config, utils, configCollector)); + } else { + listeners.add(new JavadocLegacyConfigRootListener(config, utils, configCollector)); + listeners.add(new LegacyConfigListener(config, utils, configCollector)); + } } else { - listeners.add(new JavadocLegacyConfigRootListener(config, utils, configCollector)); - listeners.add(new LegacyConfigListener(config, utils, configCollector)); + // TODO #42114 remove once fixed + // we handle both traditional config roots and config mappings + if (config.getExtension().isMixedModule()) { + listeners.add(new JavadocConfigMappingListener(config, utils, configCollector)); + listeners.add(new JavadocLegacyConfigRootListener(config, utils, configCollector)); + listeners.add(new ConfigMappingListener(config, utils, configCollector)); + listeners.add(new LegacyConfigListener(config, utils, configCollector)); + } } + this.listeners = Collections.unmodifiableList(listeners); } @@ -408,7 +421,8 @@ private T applyRootListeners( Optional discoveryRootElementCandidate = listenerFunction.apply(listener); if (discoveryRootElementCandidate.isPresent()) { if (discoveryRootElement != null) { - throw new IllegalStateException("Multiple listeners returned discovery root elements"); + throw new IllegalStateException("Multiple listeners returned discovery root elements for: " + + discoveryRootElement.getQualifiedName()); } discoveryRootElement = discoveryRootElementCandidate.get(); @@ -425,7 +439,9 @@ private T applyRootListeners( private void checkConfigRootAnnotationConsistency(TypeElement configRoot) { // for now quarkus-core is a mix of both @ConfigRoot and @ConfigMapping // see https://github.com/quarkusio/quarkus/issues/42114 - if ("quarkus-core".equals(config.getExtension().artifactId())) { + // same for Quarkus Messaging + // TODO #42114 remove once fixed + if (config.getExtension().isMixedModule()) { return; } diff --git a/core/processor/src/main/java/io/quarkus/annotation/processor/documentation/config/scanner/ConfigMappingListener.java b/core/processor/src/main/java/io/quarkus/annotation/processor/documentation/config/scanner/ConfigMappingListener.java index 3bb71de100f48..1131a773eb01c 100644 --- a/core/processor/src/main/java/io/quarkus/annotation/processor/documentation/config/scanner/ConfigMappingListener.java +++ b/core/processor/src/main/java/io/quarkus/annotation/processor/documentation/config/scanner/ConfigMappingListener.java @@ -5,9 +5,11 @@ import javax.lang.model.element.AnnotationMirror; import javax.lang.model.element.AnnotationValue; +import javax.lang.model.element.ElementKind; import javax.lang.model.element.ExecutableElement; import javax.lang.model.element.TypeElement; +import io.quarkus.annotation.processor.documentation.config.discovery.DiscoveryConfigGroup; import io.quarkus.annotation.processor.documentation.config.discovery.DiscoveryConfigProperty; import io.quarkus.annotation.processor.documentation.config.discovery.DiscoveryConfigRoot; import io.quarkus.annotation.processor.documentation.config.discovery.DiscoveryRootElement; @@ -30,6 +32,10 @@ public class ConfigMappingListener extends AbstractConfigListener { @Override public Optional onConfigRoot(TypeElement configRoot) { + if (config.getExtension().isMixedModule() && configRoot.getKind() != ElementKind.INTERFACE) { + return Optional.empty(); + } + String prefix = Markers.DEFAULT_PREFIX; ConfigPhase configPhase = ConfigPhase.BUILD_TIME; @@ -89,19 +95,27 @@ public Optional onConfigRoot(TypeElement configRoot) { String binaryName = utils.element().getBinaryName(configRoot); DiscoveryConfigRoot discoveryConfigRoot = new DiscoveryConfigRoot(config.getExtension(), rootPrefix, - binaryName, configRoot.getQualifiedName().toString(), configPhase, overriddenDocFileName); + binaryName, configRoot.getQualifiedName().toString(), configPhase, overriddenDocFileName, true); configCollector.addConfigRoot(discoveryConfigRoot); return Optional.of(discoveryConfigRoot); } @Override public void onUnresolvedInterface(DiscoveryRootElement discoveryRootElement, TypeElement interfaze) { + if (config.getExtension().isMixedModule() && !discoveryRootElement.isConfigMapping()) { + return; + } + discoveryRootElement.addUnresolvedInterfaces(interfaze.getQualifiedName().toString()); } @Override public void onEnclosedMethod(DiscoveryRootElement discoveryRootElement, TypeElement clazz, ExecutableElement method, ResolvedType resolvedType) { + if (config.getExtension().isMixedModule() && !discoveryRootElement.isConfigMapping()) { + return; + } + Map methodAnnotations = utils.element().getAnnotations(method); String sourceName = method.getSimpleName().toString(); @@ -169,4 +183,14 @@ public void onEnclosedMethod(DiscoveryRootElement discoveryRootElement, TypeElem discoveryRootElement.addProperty(builder.build()); } + + @Deprecated(forRemoval = true) + @Override + public Optional onConfigGroup(TypeElement configGroup) { + if (config.getExtension().isMixedModule() && configGroup.getKind() != ElementKind.INTERFACE) { + return Optional.empty(); + } + + return super.onConfigGroup(configGroup); + } } diff --git a/core/processor/src/main/java/io/quarkus/annotation/processor/documentation/config/scanner/JavadocConfigMappingListener.java b/core/processor/src/main/java/io/quarkus/annotation/processor/documentation/config/scanner/JavadocConfigMappingListener.java index 77d412130f7ff..2c250b609c06d 100644 --- a/core/processor/src/main/java/io/quarkus/annotation/processor/documentation/config/scanner/JavadocConfigMappingListener.java +++ b/core/processor/src/main/java/io/quarkus/annotation/processor/documentation/config/scanner/JavadocConfigMappingListener.java @@ -23,6 +23,10 @@ public class JavadocConfigMappingListener extends AbstractJavadocConfigListener @Override public void onEnclosedMethod(DiscoveryRootElement discoveryRootElement, TypeElement clazz, ExecutableElement method, ResolvedType resolvedType) { + if (config.getExtension().isMixedModule() && !discoveryRootElement.isConfigMapping()) { + return; + } + String docComment = utils.element().getRequiredJavadoc(method); configCollector.addJavadocProperty( clazz.getQualifiedName().toString() + Markers.DOT + method.getSimpleName().toString(), diff --git a/core/processor/src/main/java/io/quarkus/annotation/processor/documentation/config/scanner/JavadocLegacyConfigRootListener.java b/core/processor/src/main/java/io/quarkus/annotation/processor/documentation/config/scanner/JavadocLegacyConfigRootListener.java index 68941bed561dc..65c7e6ef49c2d 100644 --- a/core/processor/src/main/java/io/quarkus/annotation/processor/documentation/config/scanner/JavadocLegacyConfigRootListener.java +++ b/core/processor/src/main/java/io/quarkus/annotation/processor/documentation/config/scanner/JavadocLegacyConfigRootListener.java @@ -23,6 +23,10 @@ public class JavadocLegacyConfigRootListener extends AbstractJavadocConfigListen @Override public void onEnclosedField(DiscoveryRootElement discoveryRootElement, TypeElement clazz, VariableElement field, ResolvedType resolvedType) { + if (config.getExtension().isMixedModule() && discoveryRootElement.isConfigMapping()) { + return; + } + configCollector.addJavadocProperty(clazz.getQualifiedName().toString() + Markers.DOT + field.getSimpleName() .toString(), utils.element().getRequiredJavadoc(field)); } diff --git a/core/processor/src/main/java/io/quarkus/annotation/processor/documentation/config/scanner/LegacyConfigListener.java b/core/processor/src/main/java/io/quarkus/annotation/processor/documentation/config/scanner/LegacyConfigListener.java index bfd309bc9f700..21912bba6e9e6 100644 --- a/core/processor/src/main/java/io/quarkus/annotation/processor/documentation/config/scanner/LegacyConfigListener.java +++ b/core/processor/src/main/java/io/quarkus/annotation/processor/documentation/config/scanner/LegacyConfigListener.java @@ -5,10 +5,12 @@ import javax.lang.model.element.AnnotationMirror; import javax.lang.model.element.AnnotationValue; +import javax.lang.model.element.ElementKind; import javax.lang.model.element.ExecutableElement; import javax.lang.model.element.TypeElement; import javax.lang.model.element.VariableElement; +import io.quarkus.annotation.processor.documentation.config.discovery.DiscoveryConfigGroup; import io.quarkus.annotation.processor.documentation.config.discovery.DiscoveryConfigProperty; import io.quarkus.annotation.processor.documentation.config.discovery.DiscoveryConfigRoot; import io.quarkus.annotation.processor.documentation.config.discovery.DiscoveryRootElement; @@ -32,6 +34,10 @@ public class LegacyConfigListener extends AbstractConfigListener { @Override public Optional onConfigRoot(TypeElement configRoot) { + if (config.getExtension().isMixedModule() && configRoot.getKind() == ElementKind.INTERFACE) { + return Optional.empty(); + } + String prefix = Markers.DEFAULT_PREFIX; ConfigPhase configPhase = ConfigPhase.BUILD_TIME; @@ -87,19 +93,27 @@ public Optional onConfigRoot(TypeElement configRoot) { DiscoveryConfigRoot discoveryConfigRoot = new DiscoveryConfigRoot(config.getExtension(), rootPrefix, binaryName, configRoot.getQualifiedName().toString(), - configPhase, overriddenDocFileName); + configPhase, overriddenDocFileName, false); configCollector.addConfigRoot(discoveryConfigRoot); return Optional.of(discoveryConfigRoot); } @Override public void onUnresolvedSuperclass(DiscoveryRootElement discoveryRootElement, TypeElement superclass) { + if (config.getExtension().isMixedModule() && discoveryRootElement.isConfigMapping()) { + return; + } + discoveryRootElement.setUnresolvedSuperclass(superclass.getQualifiedName().toString()); } @Override public void onEnclosedField(DiscoveryRootElement discoveryRootElement, TypeElement clazz, VariableElement field, ResolvedType resolvedType) { + if (config.getExtension().isMixedModule() && discoveryRootElement.isConfigMapping()) { + return; + } + Map fieldAnnotations = utils.element().getAnnotations(field); String sourceName = field.getSimpleName().toString(); @@ -171,4 +185,14 @@ public void onEnclosedField(DiscoveryRootElement discoveryRootElement, TypeEleme discoveryRootElement.addProperty(builder.build()); } + + @Deprecated(forRemoval = true) + @Override + public Optional onConfigGroup(TypeElement configGroup) { + if (config.getExtension().isMixedModule() && configGroup.getKind() == ElementKind.INTERFACE) { + return Optional.empty(); + } + + return super.onConfigGroup(configGroup); + } } diff --git a/core/processor/src/main/java/io/quarkus/annotation/processor/extension/ExtensionBuildProcessor.java b/core/processor/src/main/java/io/quarkus/annotation/processor/extension/ExtensionBuildProcessor.java index e96fcf44b3034..de94fa8e122b3 100644 --- a/core/processor/src/main/java/io/quarkus/annotation/processor/extension/ExtensionBuildProcessor.java +++ b/core/processor/src/main/java/io/quarkus/annotation/processor/extension/ExtensionBuildProcessor.java @@ -168,8 +168,8 @@ private void processConfigRoot(RoundEnvironment roundEnv, TypeElement annotation private void processConfigGroup(RoundEnvironment roundEnv, TypeElement annotation) { for (TypeElement configGroup : typesIn(roundEnv.getElementsAnnotatedWith(annotation))) { // TODO for config groups, we generate an accessor only if we don't use @ConfigMapping - // and for core which is still a mess - if (!config.useConfigMapping() || "quarkus-core".equals(config.getExtension().artifactId())) { + // and for core and messaging which are still a mess + if (!config.useConfigMapping() || config.getExtension().isMixedModule()) { utils.accessorGenerator().generateAccessor(configGroup); } } From 5c1f94d464f4f8ef00792ab06d002296629ad5f0 Mon Sep 17 00:00:00 2001 From: Guillaume Smet Date: Wed, 31 Jul 2024 16:51:10 +0200 Subject: [PATCH 10/43] Drop the notion of resolution Now that we keep all the config annotations at runtime, we can fully resolve the model from the classpath. What's missing is the Javadoc but we will collect it in a separate file and when generating documentation, we will get the associated Javadoc from that file. --- .../discovery/DiscoveryConfigProperty.java | 67 +++---------------- .../discovery/DiscoveryRootElement.java | 28 -------- .../config/discovery/EnumDefinition.java | 2 +- .../discovery/UnresolvedEnumDefinition.java | 16 ----- .../config/model/AbstractConfigItem.java | 8 +-- .../config/model/ConfigProperty.java | 12 +--- .../config/model/ConfigRoot.java | 31 --------- .../config/model/ConfigSection.java | 10 +-- .../config/model/EnumAcceptedValues.java | 2 +- .../config/model/ResolvedModel.java | 9 +-- .../config/resolver/ConfigResolver.java | 52 ++++---------- .../scanner/AbstractConfigListener.java | 42 +----------- .../scanner/ConfigAnnotationListener.java | 12 ---- .../scanner/ConfigAnnotationScanner.java | 63 +++++------------ .../config/scanner/ConfigCollector.java | 47 +++---------- .../config/scanner/ConfigMappingListener.java | 25 +------ .../scanner/JavadocConfigMappingListener.java | 6 ++ .../JavadocLegacyConfigRootListener.java | 6 ++ .../config/scanner/LegacyConfigListener.java | 24 ++----- .../processor/util/ElementUtil.java | 13 ++-- 20 files changed, 84 insertions(+), 391 deletions(-) delete mode 100644 core/processor/src/main/java/io/quarkus/annotation/processor/documentation/config/discovery/UnresolvedEnumDefinition.java diff --git a/core/processor/src/main/java/io/quarkus/annotation/processor/documentation/config/discovery/DiscoveryConfigProperty.java b/core/processor/src/main/java/io/quarkus/annotation/processor/documentation/config/discovery/DiscoveryConfigProperty.java index b5f9336499600..952e4cac625e1 100644 --- a/core/processor/src/main/java/io/quarkus/annotation/processor/documentation/config/discovery/DiscoveryConfigProperty.java +++ b/core/processor/src/main/java/io/quarkus/annotation/processor/documentation/config/discovery/DiscoveryConfigProperty.java @@ -12,17 +12,14 @@ public class DiscoveryConfigProperty { private final boolean deprecated; private final String mapKey; private final boolean unnamedMapKey; - private final String description; - private final String since; - private final String rawJavadoc; private final ResolvedType type; private final boolean converted; - private final ParsedJavadocSection section; + private final boolean section; public DiscoveryConfigProperty(String path, String sourceName, String defaultValue, String defaultValueForDoc, boolean deprecated, String mapKey, boolean unnamedMapKey, - String description, String since, String rawJavadoc, ResolvedType type, boolean converted, - ParsedJavadocSection section) { + ResolvedType type, boolean converted, + boolean section) { this.path = path; this.sourceName = sourceName; this.defaultValue = defaultValue; @@ -30,9 +27,6 @@ public DiscoveryConfigProperty(String path, String sourceName, String defaultVal this.deprecated = deprecated; this.mapKey = mapKey; this.unnamedMapKey = unnamedMapKey; - this.description = description; - this.since = since; - this.rawJavadoc = rawJavadoc; this.type = type; this.converted = converted; this.section = section; @@ -66,18 +60,6 @@ public boolean isUnnamedMapKey() { return unnamedMapKey; } - public String getDescription() { - return description; - } - - public String getSince() { - return since; - } - - public String getRawJavadoc() { - return rawJavadoc; - } - public ResolvedType getType() { return type; } @@ -86,12 +68,8 @@ public boolean isConverted() { return converted; } - public ParsedJavadocSection getSection() { - return section; - } - public boolean isSection() { - return section != null; + return section; } public String toString() { @@ -118,18 +96,9 @@ public String toString(String prefix) { if (unnamedMapKey) { sb.append(prefix + "unnamedMapKey = true\n"); } - if (description != null && !description.isBlank()) { - sb.append(prefix + "description = " + description.split("\n")[0] + "...\n"); - } - if (since != null) { - sb.append(prefix + "since = " + since + "\n"); - } if (converted) { sb.append(prefix + "converted = true\n"); } - if (section != null) { - sb.append(prefix + "section title = " + section.title() + "\n"); - } return sb.toString(); } @@ -148,11 +117,8 @@ public static class Builder { private boolean deprecated = false; private String mapKey; private boolean unnamedMapKey = false; - private String description; - private String since; - private String rawJavadoc; - private boolean converted; - private ParsedJavadocSection section; + private boolean converted = false; + private boolean section = false; public Builder(String sourceName, ResolvedType type) { this.sourceName = sourceName; @@ -189,28 +155,13 @@ public Builder unnamedMapKey() { return this; } - public Builder description(String description) { - this.description = description; - return this; - } - - public Builder since(String since) { - this.since = since; - return this; - } - - public Builder rawJavadoc(String rawJavadoc) { - this.rawJavadoc = rawJavadoc; - return this; - } - public Builder converted() { this.converted = true; return this; } - public Builder section(ParsedJavadocSection section) { - this.section = section; + public Builder section() { + this.section = true; return this; } @@ -223,7 +174,7 @@ public DiscoveryConfigProperty build() { } return new DiscoveryConfigProperty(name, sourceName, defaultValue, defaultValueForDoc, deprecated, - mapKey, unnamedMapKey, description, since, rawJavadoc, type, converted, section); + mapKey, unnamedMapKey, type, converted, section); } } } diff --git a/core/processor/src/main/java/io/quarkus/annotation/processor/documentation/config/discovery/DiscoveryRootElement.java b/core/processor/src/main/java/io/quarkus/annotation/processor/documentation/config/discovery/DiscoveryRootElement.java index 34135560368c9..8a0b39ccd483c 100644 --- a/core/processor/src/main/java/io/quarkus/annotation/processor/documentation/config/discovery/DiscoveryRootElement.java +++ b/core/processor/src/main/java/io/quarkus/annotation/processor/documentation/config/discovery/DiscoveryRootElement.java @@ -1,9 +1,7 @@ package io.quarkus.annotation.processor.documentation.config.discovery; -import java.util.ArrayList; import java.util.Collections; import java.util.LinkedHashMap; -import java.util.List; import java.util.Map; import io.quarkus.annotation.processor.documentation.config.model.Extension; @@ -13,8 +11,6 @@ public sealed abstract class DiscoveryRootElement permits DiscoveryConfigRoot, D private final Extension extension; private final String binaryName; private final String qualifiedName; - private String unresolvedSuperclass; - private final List unresolvedInterfaces = new ArrayList<>(); private final Map properties = new LinkedHashMap<>(); // TODO #42114 remove once fixed @@ -41,22 +37,6 @@ public String getQualifiedName() { return qualifiedName; } - public void setUnresolvedSuperclass(String unresolvedSuperclass) { - this.unresolvedSuperclass = unresolvedSuperclass; - } - - public String getUnresolvedSuperclass() { - return unresolvedSuperclass; - } - - public void addUnresolvedInterfaces(String unresolvedInterface) { - unresolvedInterfaces.add(unresolvedInterface); - } - - public List getUnresolvedInterfaces() { - return Collections.unmodifiableList(unresolvedInterfaces); - } - public void addProperty(DiscoveryConfigProperty discoveryConfigProperty) { properties.put(discoveryConfigProperty.getSourceName(), discoveryConfigProperty); } @@ -77,14 +57,6 @@ public String toString() { public String toString(String prefix) { StringBuilder sb = new StringBuilder(); sb.append(prefix + "binaryName = " + this.binaryName); - if (this.unresolvedSuperclass != null) { - sb.append("\n"); - sb.append(prefix + "unresolvedSuperclass = " + this.unresolvedSuperclass); - } - if (!this.unresolvedInterfaces.isEmpty()) { - sb.append("\n"); - sb.append(prefix + "unresolvedInterfaces = " + this.unresolvedInterfaces); - } if (!properties.isEmpty()) { sb.append("\n\n" + prefix + "--- Properties ---\n\n"); diff --git a/core/processor/src/main/java/io/quarkus/annotation/processor/documentation/config/discovery/EnumDefinition.java b/core/processor/src/main/java/io/quarkus/annotation/processor/documentation/config/discovery/EnumDefinition.java index 7b76dcf28d130..4f500cc734c41 100644 --- a/core/processor/src/main/java/io/quarkus/annotation/processor/documentation/config/discovery/EnumDefinition.java +++ b/core/processor/src/main/java/io/quarkus/annotation/processor/documentation/config/discovery/EnumDefinition.java @@ -10,7 +10,7 @@ */ public record EnumDefinition(String qualifiedName, Map constants) { - public record EnumConstant(String explicitValue, String description, String since, String rawJavadoc) { + public record EnumConstant(String explicitValue) { public boolean hasExplicitValue() { return explicitValue != null; diff --git a/core/processor/src/main/java/io/quarkus/annotation/processor/documentation/config/discovery/UnresolvedEnumDefinition.java b/core/processor/src/main/java/io/quarkus/annotation/processor/documentation/config/discovery/UnresolvedEnumDefinition.java deleted file mode 100644 index 97133d3212091..0000000000000 --- a/core/processor/src/main/java/io/quarkus/annotation/processor/documentation/config/discovery/UnresolvedEnumDefinition.java +++ /dev/null @@ -1,16 +0,0 @@ -package io.quarkus.annotation.processor.documentation.config.discovery; - -import java.util.Map; - -/** - * This is an unresolved enum. It might get resolved at some point on final assembly. - */ -public record UnresolvedEnumDefinition(String qualifiedName, Map constants) { - - public record UnresolvedEnumConstant(String explicitValue) { - - public boolean hasExplicitValue() { - return explicitValue != null; - } - } -} diff --git a/core/processor/src/main/java/io/quarkus/annotation/processor/documentation/config/model/AbstractConfigItem.java b/core/processor/src/main/java/io/quarkus/annotation/processor/documentation/config/model/AbstractConfigItem.java index 0d36d28f2e6fd..b1fcafffa9503 100644 --- a/core/processor/src/main/java/io/quarkus/annotation/processor/documentation/config/model/AbstractConfigItem.java +++ b/core/processor/src/main/java/io/quarkus/annotation/processor/documentation/config/model/AbstractConfigItem.java @@ -11,14 +11,12 @@ public sealed abstract class AbstractConfigItem implements Comparable additionalPaths, String environmentVariable, String type, String typeDescription, boolean map, boolean list, boolean optional, String mapKey, boolean unnamedMapKey, boolean withinMap, boolean converted, boolean isEnum, EnumAcceptedValues enumAcceptedValues, - String defaultValue, String description, String javadocSiteLink, - boolean deprecated, String since) { - super(sourceClass, sourceName, path, typeDescription, description); + String defaultValue, String javadocSiteLink, + boolean deprecated) { + super(sourceClass, sourceName, path, typeDescription); this.phase = phase; this.additionalPaths = additionalPaths; this.environmentVariable = environmentVariable; @@ -49,7 +48,6 @@ public ConfigProperty(ConfigPhase phase, String sourceClass, String sourceName, this.defaultValue = defaultValue; this.javadocSiteLink = javadocSiteLink; this.deprecated = deprecated; - this.since = since; } public ConfigPhase getPhase() { @@ -116,10 +114,6 @@ public boolean isDeprecated() { return deprecated; } - public String getSince() { - return since; - } - public boolean isSection() { return false; } diff --git a/core/processor/src/main/java/io/quarkus/annotation/processor/documentation/config/model/ConfigRoot.java b/core/processor/src/main/java/io/quarkus/annotation/processor/documentation/config/model/ConfigRoot.java index 299a1d2552e0e..db22cb868fdb6 100644 --- a/core/processor/src/main/java/io/quarkus/annotation/processor/documentation/config/model/ConfigRoot.java +++ b/core/processor/src/main/java/io/quarkus/annotation/processor/documentation/config/model/ConfigRoot.java @@ -19,9 +19,6 @@ public class ConfigRoot implements ConfigItemCollection { private String overriddenDocFileName; private final List items = new ArrayList<>(); private final Set qualifiedNames = new HashSet<>(); - private final Set unresolvedSuperclasses = new HashSet<>(); - private final List unresolvedInterfaces = new ArrayList<>(); - private final Set unresolvedEnums = new HashSet<>(); public ConfigRoot(Extension extension, String prefix) { this.extension = extension; @@ -51,34 +48,6 @@ public Set getQualifiedNames() { return Collections.unmodifiableSet(qualifiedNames); } - public void addUnresolvedSuperclass(String unresolvedSuperclass) { - unresolvedSuperclasses.add(unresolvedSuperclass); - } - - public Set getUnresolvedSuperclasses() { - return Collections.unmodifiableSet(unresolvedSuperclasses); - } - - public void addUnresolvedInterfaces(List unresolvedInterfaces) { - this.unresolvedInterfaces.addAll(unresolvedInterfaces); - } - - public List getUnresolvedInterfaces() { - return Collections.unmodifiableList(unresolvedInterfaces); - } - - public void addUnresolvedEnum(String unresolvedEnum) { - unresolvedEnums.add(unresolvedEnum); - } - - public Set getUnresolvedEnums() { - return unresolvedEnums; - } - - public boolean isFullyResolved() { - return unresolvedSuperclasses.isEmpty() && unresolvedInterfaces.isEmpty() && unresolvedEnums.isEmpty(); - } - @Override public void addItem(AbstractConfigItem item) { this.items.add(item); diff --git a/core/processor/src/main/java/io/quarkus/annotation/processor/documentation/config/model/ConfigSection.java b/core/processor/src/main/java/io/quarkus/annotation/processor/documentation/config/model/ConfigSection.java index 6882daba0bf78..2240e878a159d 100644 --- a/core/processor/src/main/java/io/quarkus/annotation/processor/documentation/config/model/ConfigSection.java +++ b/core/processor/src/main/java/io/quarkus/annotation/processor/documentation/config/model/ConfigSection.java @@ -6,16 +6,10 @@ public final class ConfigSection extends AbstractConfigItem implements ConfigItemCollection { - private String title; private final List items = new ArrayList<>(); - public ConfigSection(String sourceClass, String sourceName, String path, String type, String title, String description) { - super(sourceClass, sourceName, path, type, description); - this.title = title; - } - - public String getTitle() { - return title; + public ConfigSection(String sourceClass, String sourceName, String path, String type) { + super(sourceClass, sourceName, path, type); } @Override diff --git a/core/processor/src/main/java/io/quarkus/annotation/processor/documentation/config/model/EnumAcceptedValues.java b/core/processor/src/main/java/io/quarkus/annotation/processor/documentation/config/model/EnumAcceptedValues.java index cc3bc7da67e1e..c49ec625afbf6 100644 --- a/core/processor/src/main/java/io/quarkus/annotation/processor/documentation/config/model/EnumAcceptedValues.java +++ b/core/processor/src/main/java/io/quarkus/annotation/processor/documentation/config/model/EnumAcceptedValues.java @@ -7,6 +7,6 @@ */ public record EnumAcceptedValues(String qualifiedName, Map values) { - public record EnumAcceptedValue(String description, String since) { + public record EnumAcceptedValue(String configValue) { } } diff --git a/core/processor/src/main/java/io/quarkus/annotation/processor/documentation/config/model/ResolvedModel.java b/core/processor/src/main/java/io/quarkus/annotation/processor/documentation/config/model/ResolvedModel.java index 95be07e21271c..afa2fb1026a5a 100644 --- a/core/processor/src/main/java/io/quarkus/annotation/processor/documentation/config/model/ResolvedModel.java +++ b/core/processor/src/main/java/io/quarkus/annotation/processor/documentation/config/model/ResolvedModel.java @@ -14,8 +14,6 @@ */ public class ResolvedModel { - private final boolean fullyResolved; - /** * Key is the prefix of the config root (all config roots with the same prefix are merged). */ @@ -38,10 +36,9 @@ public class ResolvedModel { */ private Map configGroups; - public ResolvedModel(Map configRoots, Map configGroups, boolean fullyResolved) { + public ResolvedModel(Map configRoots, Map configGroups) { this.configRoots = Collections.unmodifiableMap(configRoots); this.configGroups = Collections.unmodifiableMap(configGroups); - this.fullyResolved = fullyResolved; } public Map getConfigRoots() { @@ -51,8 +48,4 @@ public Map getConfigRoots() { public Map getConfigGroups() { return configGroups; } - - public boolean isFullyResolved() { - return fullyResolved; - } } diff --git a/core/processor/src/main/java/io/quarkus/annotation/processor/documentation/config/resolver/ConfigResolver.java b/core/processor/src/main/java/io/quarkus/annotation/processor/documentation/config/resolver/ConfigResolver.java index f195312992d14..211483a8812e6 100644 --- a/core/processor/src/main/java/io/quarkus/annotation/processor/documentation/config/resolver/ConfigResolver.java +++ b/core/processor/src/main/java/io/quarkus/annotation/processor/documentation/config/resolver/ConfigResolver.java @@ -3,6 +3,7 @@ import java.util.ArrayList; import java.util.Arrays; import java.util.HashMap; +import java.util.LinkedHashMap; import java.util.List; import java.util.ListIterator; import java.util.Map; @@ -18,7 +19,6 @@ import io.quarkus.annotation.processor.documentation.config.discovery.DiscoveryRootElement; import io.quarkus.annotation.processor.documentation.config.discovery.EnumDefinition; import io.quarkus.annotation.processor.documentation.config.discovery.ResolvedType; -import io.quarkus.annotation.processor.documentation.config.discovery.UnresolvedEnumDefinition; import io.quarkus.annotation.processor.documentation.config.model.ConfigGroup; import io.quarkus.annotation.processor.documentation.config.model.ConfigItemCollection; import io.quarkus.annotation.processor.documentation.config.model.ConfigPhase; @@ -59,15 +59,12 @@ public ConfigResolver(Utils utils, ConfigCollector configCollector) { public ResolvedModel resolveModel() { Map configRoots = new HashMap<>(); - boolean fullyResolved = true; - for (DiscoveryConfigRoot discoveryConfigRoot : configCollector.getConfigRoots()) { ConfigRoot configRoot = configRoots.computeIfAbsent(discoveryConfigRoot.getPrefix(), k -> new ConfigRoot(discoveryConfigRoot.getExtension(), discoveryConfigRoot.getPrefix())); configRoot.setOverriddenDocFileName(discoveryConfigRoot.getOverriddenDocFileName()); configRoot.addQualifiedName(discoveryConfigRoot.getQualifiedName()); - configRoot.addUnresolvedInterfaces(discoveryConfigRoot.getUnresolvedInterfaces()); ResolutionContext context = new ResolutionContext(configRoot.getPrefix(), new ArrayList<>(), discoveryConfigRoot, configRoot, false, false); @@ -76,15 +73,13 @@ public ResolvedModel resolveModel() { } configRoots.put(configRoot.getPrefix(), configRoot); - - fullyResolved = fullyResolved && configRoot.isFullyResolved(); } Map configGroups = new HashMap<>(); // TODO GSM: config groups - return new ResolvedModel(configRoots, configGroups, fullyResolved); + return new ResolvedModel(configRoots, configGroups); } private void resolveProperty(ConfigRoot configRoot, ConfigPhase phase, ResolutionContext context, @@ -121,9 +116,7 @@ private void resolveProperty(ConfigRoot configRoot, ConfigPhase phase, Resolutio if (discoveryConfigProperty.isSection()) { ConfigSection configSection = new ConfigSection(typeQualifiedName, - discoveryConfigProperty.getSourceName(), fullPath, typeQualifiedName, - discoveryConfigProperty.getSection().title(), - discoveryConfigProperty.getSection().description()); + discoveryConfigProperty.getSourceName(), fullPath, typeQualifiedName); context.getItemCollection().addItem(configSection); configGroupContext = new ResolutionContext(fullPath, additionalPaths, discoveryConfigGroup, configSection, discoveryConfigProperty.getType().isMap(), deprecated); @@ -135,8 +128,6 @@ private void resolveProperty(ConfigRoot configRoot, ConfigPhase phase, Resolutio for (DiscoveryConfigProperty configGroupProperty : discoveryConfigGroup.getProperties().values()) { resolveProperty(configRoot, phase, configGroupContext, configGroupProperty); } - } else if (configCollector.isUnresolvedConfigGroup(typeQualifiedName)) { - } else { String typeBinaryName = discoveryConfigProperty.getType().binaryName(); String typeSimplifiedName = discoveryConfigProperty.getType().simplifiedName(); @@ -149,29 +140,15 @@ private void resolveProperty(ConfigRoot configRoot, ConfigPhase phase, Resolutio EnumAcceptedValues enumAcceptedValues = null; if (discoveryConfigProperty.getType().isEnum()) { - if (configCollector.isResolvedEnum(typeQualifiedName)) { - EnumDefinition enumDefinition = configCollector.getResolvedEnum(typeQualifiedName); - Map localAcceptedValues = enumDefinition.constants().entrySet().stream() - .collect(Collectors.toMap( - e -> e.getValue().hasExplicitValue() ? e.getValue().explicitValue() - : (hyphenateEnumValues ? ConfigNamingUtil.hyphenateEnumValue(e.getKey()) - : e.getKey()), - e -> new EnumAcceptedValue(e.getValue().description(), e.getValue().since()))); - enumAcceptedValues = new EnumAcceptedValues(enumDefinition.qualifiedName(), localAcceptedValues); - } else { - UnresolvedEnumDefinition unresolvedEnumDefinition = configCollector.getUnresolvedEnum(typeQualifiedName); - - Map localAcceptedValues = unresolvedEnumDefinition.constants().entrySet() - .stream() - .collect(Collectors.toMap( - e -> e.getValue().hasExplicitValue() ? e.getValue().explicitValue() - : (hyphenateEnumValues ? ConfigNamingUtil.hyphenateEnumValue(e.getKey()) - : e.getKey()), - e -> new EnumAcceptedValue(null, null))); - enumAcceptedValues = new EnumAcceptedValues(unresolvedEnumDefinition.qualifiedName(), localAcceptedValues); - - configRoot.addUnresolvedEnum(discoveryConfigProperty.getType().qualifiedName()); - } + EnumDefinition enumDefinition = configCollector.getResolvedEnum(typeQualifiedName); + Map localAcceptedValues = enumDefinition.constants().entrySet().stream() + .collect(Collectors.toMap( + e -> e.getKey(), + e -> new EnumAcceptedValue(e.getValue().hasExplicitValue() ? e.getValue().explicitValue() + : (hyphenateEnumValues ? ConfigNamingUtil.hyphenateEnumValue(e.getKey()) + : e.getKey())), + (x, y) -> y, LinkedHashMap::new)); + enumAcceptedValues = new EnumAcceptedValues(enumDefinition.qualifiedName(), localAcceptedValues); } if (discoveryConfigProperty.getType().isMap()) { @@ -198,10 +175,9 @@ private void resolveProperty(ConfigRoot configRoot, ConfigPhase phase, Resolutio discoveryConfigProperty.isUnnamedMapKey(), context.isWithinMap(), discoveryConfigProperty.isConverted(), discoveryConfigProperty.getType().isEnum(), - enumAcceptedValues, defaultValue, discoveryConfigProperty.getDescription(), + enumAcceptedValues, defaultValue, JavadocUtil.getJavadocSiteLink(typeBinaryName), - deprecated, - discoveryConfigProperty.getSince()); + deprecated); context.getItemCollection().addItem(configProperty); } } diff --git a/core/processor/src/main/java/io/quarkus/annotation/processor/documentation/config/scanner/AbstractConfigListener.java b/core/processor/src/main/java/io/quarkus/annotation/processor/documentation/config/scanner/AbstractConfigListener.java index 264733e1a3b7b..2d4765f40e103 100644 --- a/core/processor/src/main/java/io/quarkus/annotation/processor/documentation/config/scanner/AbstractConfigListener.java +++ b/core/processor/src/main/java/io/quarkus/annotation/processor/documentation/config/scanner/AbstractConfigListener.java @@ -12,10 +12,6 @@ import io.quarkus.annotation.processor.documentation.config.discovery.DiscoveryConfigGroup; import io.quarkus.annotation.processor.documentation.config.discovery.EnumDefinition; import io.quarkus.annotation.processor.documentation.config.discovery.EnumDefinition.EnumConstant; -import io.quarkus.annotation.processor.documentation.config.discovery.ParsedJavadoc; -import io.quarkus.annotation.processor.documentation.config.discovery.UnresolvedEnumDefinition; -import io.quarkus.annotation.processor.documentation.config.discovery.UnresolvedEnumDefinition.UnresolvedEnumConstant; -import io.quarkus.annotation.processor.documentation.config.formatter.JavadocToAsciidocTransformer; import io.quarkus.annotation.processor.documentation.config.util.Types; import io.quarkus.annotation.processor.util.Config; import io.quarkus.annotation.processor.util.Utils; @@ -43,11 +39,6 @@ public Optional onConfigGroup(TypeElement configGroup) { return Optional.of(discoveryConfigGroup); } - @Override - public void onUnresolvedConfigGroup(TypeElement configGroup) { - configCollector.addUnresolvedConfigGroup(configGroup.getQualifiedName().toString()); - } - @Override public void onResolvedEnum(TypeElement enumTypeElement) { Map enumConstants = new LinkedHashMap<>(); @@ -57,9 +48,6 @@ public void onResolvedEnum(TypeElement enumTypeElement) { continue; } - String rawJavadoc = utils.element().getJavadoc(enumElement); - ParsedJavadoc parsedJavadoc = JavadocToAsciidocTransformer.INSTANCE.parseConfigItemJavadoc(rawJavadoc); - String explicitValue = null; Map annotations = utils.element().getAnnotations(enumElement); AnnotationMirror configDocEnumValue = annotations.get(Types.ANNOTATION_CONFIG_DOC_ENUM_VALUE); @@ -68,39 +56,11 @@ public void onResolvedEnum(TypeElement enumTypeElement) { explicitValue = (String) enumValueValues.get("value"); } - enumConstants.put(enumElement.getSimpleName().toString(), - new EnumConstant(explicitValue, parsedJavadoc.description(), parsedJavadoc.since(), rawJavadoc)); + enumConstants.put(enumElement.getSimpleName().toString(), new EnumConstant(explicitValue)); } EnumDefinition enumDefinition = new EnumDefinition(enumTypeElement.getQualifiedName().toString(), enumConstants); configCollector.addResolvedEnum(enumDefinition); } - - @Override - public void onUnresolvedEnum(TypeElement enumTypeElement) { - Map enumConstants = new LinkedHashMap<>(); - - for (Element enumElement : enumTypeElement.getEnclosedElements()) { - if (enumElement.getKind() != ElementKind.ENUM_CONSTANT) { - continue; - } - - String explicitValue = null; - Map annotations = utils.element().getAnnotations(enumElement); - AnnotationMirror configDocEnumValue = annotations.get(Types.ANNOTATION_CONFIG_DOC_ENUM_VALUE); - if (configDocEnumValue != null) { - Map enumValueValues = utils.element().getAnnotationValues(configDocEnumValue); - explicitValue = (String) enumValueValues.get("value"); - } - - enumConstants.put(enumElement.getSimpleName().toString(), new UnresolvedEnumConstant(explicitValue)); - } - - UnresolvedEnumDefinition unresolvedEnumDefinition = new UnresolvedEnumDefinition( - enumTypeElement.getQualifiedName().toString(), - enumConstants); - - configCollector.addUnresolvedEnum(unresolvedEnumDefinition); - } } diff --git a/core/processor/src/main/java/io/quarkus/annotation/processor/documentation/config/scanner/ConfigAnnotationListener.java b/core/processor/src/main/java/io/quarkus/annotation/processor/documentation/config/scanner/ConfigAnnotationListener.java index 11e8f7b273800..4a88e07f4e790 100644 --- a/core/processor/src/main/java/io/quarkus/annotation/processor/documentation/config/scanner/ConfigAnnotationListener.java +++ b/core/processor/src/main/java/io/quarkus/annotation/processor/documentation/config/scanner/ConfigAnnotationListener.java @@ -20,22 +20,13 @@ default Optional onConfigRoot(TypeElement configRoot) { default void onSuperclass(DiscoveryRootElement discoveryRootElement, TypeElement superClass) { } - default void onUnresolvedSuperclass(DiscoveryRootElement discoveryRootElement, TypeElement superclass) { - } - default void onInterface(DiscoveryRootElement discoveryRootElement, TypeElement interfaze) { } - default void onUnresolvedInterface(DiscoveryRootElement discoveryRootElement, TypeElement interfaze) { - } - default Optional onConfigGroup(TypeElement configGroup) { return Optional.empty(); } - default void onUnresolvedConfigGroup(TypeElement configGroup) { - } - default void onEnclosedMethod(DiscoveryRootElement discoveryRootElement, TypeElement clazz, ExecutableElement method, ResolvedType type) { } @@ -47,9 +38,6 @@ default void onEnclosedField(DiscoveryRootElement discoveryRootElement, TypeElem default void onResolvedEnum(TypeElement enumTypeElement) { } - default void onUnresolvedEnum(TypeElement enumTypeElement) { - } - default void finalizeProcessing() { } } diff --git a/core/processor/src/main/java/io/quarkus/annotation/processor/documentation/config/scanner/ConfigAnnotationScanner.java b/core/processor/src/main/java/io/quarkus/annotation/processor/documentation/config/scanner/ConfigAnnotationScanner.java index 757819a2581aa..88885ea7288b0 100644 --- a/core/processor/src/main/java/io/quarkus/annotation/processor/documentation/config/scanner/ConfigAnnotationScanner.java +++ b/core/processor/src/main/java/io/quarkus/annotation/processor/documentation/config/scanner/ConfigAnnotationScanner.java @@ -137,13 +137,9 @@ private void scanElement(DiscoveryRootElement configRootElement, TypeElement cla debug("Detected superinterface: " + superInterfaceTypeElement, clazz); - if (utils.element().isLocalClass(superInterfaceTypeElement)) { - applyListeners(l -> l.onInterface(configRootElement, superInterfaceTypeElement)); - if (!isConfigRootAlreadyHandled(superInterfaceTypeElement)) { - scanElement(configRootElement, superInterfaceTypeElement); - } - } else { - applyListeners(l -> l.onUnresolvedInterface(configRootElement, superInterfaceTypeElement)); + applyListeners(l -> l.onInterface(configRootElement, superInterfaceTypeElement)); + if (!isConfigRootAlreadyHandled(superInterfaceTypeElement)) { + scanElement(configRootElement, superInterfaceTypeElement); } } } else { @@ -153,13 +149,9 @@ private void scanElement(DiscoveryRootElement configRootElement, TypeElement cla debug("Detected superclass: " + superclassTypeElement, clazz); - if (utils.element().isLocalClass(superclassTypeElement)) { - applyListeners(l -> l.onSuperclass(configRootElement, clazz)); - if (!isConfigRootAlreadyHandled(superclassTypeElement)) { - scanElement(configRootElement, superclassTypeElement); - } - } else { - applyListeners(l -> l.onUnresolvedSuperclass(configRootElement, superclassTypeElement)); + applyListeners(l -> l.onSuperclass(configRootElement, clazz)); + if (!isConfigRootAlreadyHandled(superclassTypeElement)) { + scanElement(configRootElement, superclassTypeElement); } } } @@ -188,20 +180,12 @@ private void scanElement(DiscoveryRootElement configRootElement, TypeElement cla TypeElement unwrappedTypeElement = resolvedType.unwrappedTypeElement(); if (!utils.element().isJdkClass(unwrappedTypeElement)) { if (!isConfigGroupAlreadyHandled(unwrappedTypeElement)) { - if (utils.element().isLocalClass(unwrappedTypeElement)) { - debug("Detected config group: " + resolvedType + " on method: " - + method, clazz); - - DiscoveryConfigGroup discoveryConfigGroup = applyRootListeners( - l -> l.onConfigGroup(unwrappedTypeElement)); - scanElement(discoveryConfigGroup, unwrappedTypeElement); - } else { - debug("Detected unresolved config group: " + resolvedType + " on method: " - + method, clazz); - - // if the class is not local, we register it as an unresolved config group - applyListeners(l -> l.onUnresolvedConfigGroup(unwrappedTypeElement)); - } + debug("Detected config group: " + resolvedType + " on method: " + + method, clazz); + + DiscoveryConfigGroup discoveryConfigGroup = applyRootListeners( + l -> l.onConfigGroup(unwrappedTypeElement)); + scanElement(discoveryConfigGroup, unwrappedTypeElement); } } } @@ -224,19 +208,6 @@ private void scanElement(DiscoveryRootElement configRootElement, TypeElement cla if (resolvedType.isEnum()) { handleEnum(resolvedType.unwrappedTypeElement()); - } else if (resolvedType.isClass()) { - TypeElement unwrappedTypeElement = resolvedType.unwrappedTypeElement(); - if (!utils.element().isJdkClass(unwrappedTypeElement) && - !isConfigGroupAlreadyHandled(unwrappedTypeElement) && - !utils.element().isLocalClass(unwrappedTypeElement)) { - - debug("Detected unresolved config group: " + resolvedType + " on field: " + field, - clazz); - - // if the class is not local and has a @ConfigGroup annotation, we register it as an unresolved config group - // fields are used by legacy @ConfigRoot and for them the @ConfigGroup annotation is always mandatory - applyListeners(l -> l.onUnresolvedConfigGroup(unwrappedTypeElement)); - } } debug("Detected enclosed field: " + field, clazz); @@ -258,13 +229,11 @@ private void scanElement(DiscoveryRootElement configRootElement, TypeElement cla } private void handleEnum(TypeElement enumTypeElement) { - if (!isEnumAlreadyHandled(enumTypeElement)) { - if (utils.element().isLocalClass(enumTypeElement)) { - applyListeners(l -> l.onResolvedEnum(enumTypeElement)); - } else { - applyListeners(l -> l.onUnresolvedEnum(enumTypeElement)); - } + if (isEnumAlreadyHandled(enumTypeElement)) { + return; } + + applyListeners(l -> l.onResolvedEnum(enumTypeElement)); } private boolean isConfigRootAlreadyHandled(TypeElement clazz) { diff --git a/core/processor/src/main/java/io/quarkus/annotation/processor/documentation/config/scanner/ConfigCollector.java b/core/processor/src/main/java/io/quarkus/annotation/processor/documentation/config/scanner/ConfigCollector.java index 4af01a1493133..63b508fc32367 100644 --- a/core/processor/src/main/java/io/quarkus/annotation/processor/documentation/config/scanner/ConfigCollector.java +++ b/core/processor/src/main/java/io/quarkus/annotation/processor/documentation/config/scanner/ConfigCollector.java @@ -3,15 +3,12 @@ import java.util.Collection; import java.util.Collections; import java.util.HashMap; -import java.util.HashSet; import java.util.Map; import java.util.Properties; -import java.util.Set; import io.quarkus.annotation.processor.documentation.config.discovery.DiscoveryConfigGroup; import io.quarkus.annotation.processor.documentation.config.discovery.DiscoveryConfigRoot; import io.quarkus.annotation.processor.documentation.config.discovery.EnumDefinition; -import io.quarkus.annotation.processor.documentation.config.discovery.UnresolvedEnumDefinition; public class ConfigCollector { @@ -28,21 +25,11 @@ public class ConfigCollector { */ private Map resolvedConfigGroups = new HashMap<>(); - /** - * Contains the qualified name of the class. - */ - private Set unresolvedConfigGroups = new HashSet<>(); - /** * Key is the qualified name of the class. */ private Map resolvedEnums = new HashMap<>(); - /** - * Contains the qualified name of the class. - */ - private Map unresolvedEnums = new HashMap<>(); - @Deprecated(since = "3.14", forRemoval = true) void addJavadocProperty(String key, String docComment) { javadocProperties.put(key, docComment); @@ -65,10 +52,6 @@ public void addResolvedConfigGroup(DiscoveryConfigGroup configGroup) { resolvedConfigGroups.put(configGroup.getQualifiedName(), configGroup); } - public void addUnresolvedConfigGroup(String configGroupClassName) { - unresolvedConfigGroups.add(configGroupClassName); - } - public Collection getResolvedConfigGroups() { return Collections.unmodifiableCollection(resolvedConfigGroups.values()); } @@ -77,48 +60,34 @@ public DiscoveryConfigGroup getResolvedConfigGroup(String configGroupClassName) return resolvedConfigGroups.get(configGroupClassName); } - public Set getUnresolvedConfigGroups() { - return Collections.unmodifiableSet(unresolvedConfigGroups); - } - public boolean isConfigGroup(String className) { - return isResolvedConfigGroup(className) || isUnresolvedConfigGroup(className); + return isResolvedConfigGroup(className); } public boolean isResolvedConfigGroup(String className) { return resolvedConfigGroups.containsKey(className); } - public boolean isUnresolvedConfigGroup(String className) { - return unresolvedConfigGroups.contains(className); - } - public void addResolvedEnum(EnumDefinition enumDefinition) { resolvedEnums.put(enumDefinition.qualifiedName(), enumDefinition); } - public void addUnresolvedEnum(UnresolvedEnumDefinition unresolvedEnumDefinition) { - unresolvedEnums.put(unresolvedEnumDefinition.qualifiedName(), unresolvedEnumDefinition); - } - public boolean isEnum(String className) { - return isResolvedEnum(className) || isUnresolvedEnum(className); + return isResolvedEnum(className); } public boolean isResolvedEnum(String className) { return resolvedEnums.containsKey(className); } - public boolean isUnresolvedEnum(String className) { - return unresolvedEnums.containsKey(className); - } + public EnumDefinition getResolvedEnum(String name) { + EnumDefinition enumDefinition = resolvedEnums.get(name); - public UnresolvedEnumDefinition getUnresolvedEnum(String className) { - return unresolvedEnums.get(className); - } + if (enumDefinition == null) { + throw new IllegalStateException("Could not find registered EnumDefinition for " + name); + } - public EnumDefinition getResolvedEnum(String name) { - return resolvedEnums.get(name); + return enumDefinition; } public Map getResolvedEnums() { diff --git a/core/processor/src/main/java/io/quarkus/annotation/processor/documentation/config/scanner/ConfigMappingListener.java b/core/processor/src/main/java/io/quarkus/annotation/processor/documentation/config/scanner/ConfigMappingListener.java index 1131a773eb01c..a5abda56378d2 100644 --- a/core/processor/src/main/java/io/quarkus/annotation/processor/documentation/config/scanner/ConfigMappingListener.java +++ b/core/processor/src/main/java/io/quarkus/annotation/processor/documentation/config/scanner/ConfigMappingListener.java @@ -13,10 +13,7 @@ import io.quarkus.annotation.processor.documentation.config.discovery.DiscoveryConfigProperty; import io.quarkus.annotation.processor.documentation.config.discovery.DiscoveryConfigRoot; import io.quarkus.annotation.processor.documentation.config.discovery.DiscoveryRootElement; -import io.quarkus.annotation.processor.documentation.config.discovery.ParsedJavadoc; -import io.quarkus.annotation.processor.documentation.config.discovery.ParsedJavadocSection; import io.quarkus.annotation.processor.documentation.config.discovery.ResolvedType; -import io.quarkus.annotation.processor.documentation.config.formatter.JavadocToAsciidocTransformer; import io.quarkus.annotation.processor.documentation.config.model.ConfigPhase; import io.quarkus.annotation.processor.documentation.config.util.ConfigNamingUtil; import io.quarkus.annotation.processor.documentation.config.util.Markers; @@ -100,15 +97,6 @@ public Optional onConfigRoot(TypeElement configRoot) { return Optional.of(discoveryConfigRoot); } - @Override - public void onUnresolvedInterface(DiscoveryRootElement discoveryRootElement, TypeElement interfaze) { - if (config.getExtension().isMixedModule() && !discoveryRootElement.isConfigMapping()) { - return; - } - - discoveryRootElement.addUnresolvedInterfaces(interfaze.getQualifiedName().toString()); - } - @Override public void onEnclosedMethod(DiscoveryRootElement discoveryRootElement, TypeElement clazz, ExecutableElement method, ResolvedType resolvedType) { @@ -168,17 +156,8 @@ public void onEnclosedMethod(DiscoveryRootElement discoveryRootElement, TypeElem builder.converted(); } - String rawJavadoc = utils.element().getRequiredJavadoc(method); - builder.rawJavadoc(rawJavadoc); - - AnnotationMirror configDocSectionAnnotation = methodAnnotations.get(Types.ANNOTATION_CONFIG_DOC_SECTION); - if (configDocSectionAnnotation != null) { - ParsedJavadocSection section = JavadocToAsciidocTransformer.INSTANCE.parseConfigSectionJavadoc(rawJavadoc); - builder.section(section); - } else { - ParsedJavadoc parsedJavadoc = JavadocToAsciidocTransformer.INSTANCE.parseConfigItemJavadoc(rawJavadoc); - builder.description(parsedJavadoc.description()); - builder.since(parsedJavadoc.since()); + if (utils.element().isLocalClass(clazz)) { + utils.element().checkRequiredJavadoc(method); } discoveryRootElement.addProperty(builder.build()); diff --git a/core/processor/src/main/java/io/quarkus/annotation/processor/documentation/config/scanner/JavadocConfigMappingListener.java b/core/processor/src/main/java/io/quarkus/annotation/processor/documentation/config/scanner/JavadocConfigMappingListener.java index 2c250b609c06d..2baf3c9cd836e 100644 --- a/core/processor/src/main/java/io/quarkus/annotation/processor/documentation/config/scanner/JavadocConfigMappingListener.java +++ b/core/processor/src/main/java/io/quarkus/annotation/processor/documentation/config/scanner/JavadocConfigMappingListener.java @@ -27,6 +27,12 @@ public void onEnclosedMethod(DiscoveryRootElement discoveryRootElement, TypeElem return; } + // we only get Javbadoc for local classes + // classes coming from other modules won't have Javadoc available + if (!utils.element().isLocalClass(clazz)) { + return; + } + String docComment = utils.element().getRequiredJavadoc(method); configCollector.addJavadocProperty( clazz.getQualifiedName().toString() + Markers.DOT + method.getSimpleName().toString(), diff --git a/core/processor/src/main/java/io/quarkus/annotation/processor/documentation/config/scanner/JavadocLegacyConfigRootListener.java b/core/processor/src/main/java/io/quarkus/annotation/processor/documentation/config/scanner/JavadocLegacyConfigRootListener.java index 65c7e6ef49c2d..d53fb973c6b2d 100644 --- a/core/processor/src/main/java/io/quarkus/annotation/processor/documentation/config/scanner/JavadocLegacyConfigRootListener.java +++ b/core/processor/src/main/java/io/quarkus/annotation/processor/documentation/config/scanner/JavadocLegacyConfigRootListener.java @@ -27,6 +27,12 @@ public void onEnclosedField(DiscoveryRootElement discoveryRootElement, TypeEleme return; } + // we only get Javbadoc for local classes + // classes coming from other modules won't have Javadoc available + if (!utils.element().isLocalClass(clazz)) { + return; + } + configCollector.addJavadocProperty(clazz.getQualifiedName().toString() + Markers.DOT + field.getSimpleName() .toString(), utils.element().getRequiredJavadoc(field)); } diff --git a/core/processor/src/main/java/io/quarkus/annotation/processor/documentation/config/scanner/LegacyConfigListener.java b/core/processor/src/main/java/io/quarkus/annotation/processor/documentation/config/scanner/LegacyConfigListener.java index 21912bba6e9e6..5f6996b7e7dd2 100644 --- a/core/processor/src/main/java/io/quarkus/annotation/processor/documentation/config/scanner/LegacyConfigListener.java +++ b/core/processor/src/main/java/io/quarkus/annotation/processor/documentation/config/scanner/LegacyConfigListener.java @@ -14,10 +14,7 @@ import io.quarkus.annotation.processor.documentation.config.discovery.DiscoveryConfigProperty; import io.quarkus.annotation.processor.documentation.config.discovery.DiscoveryConfigRoot; import io.quarkus.annotation.processor.documentation.config.discovery.DiscoveryRootElement; -import io.quarkus.annotation.processor.documentation.config.discovery.ParsedJavadoc; -import io.quarkus.annotation.processor.documentation.config.discovery.ParsedJavadocSection; import io.quarkus.annotation.processor.documentation.config.discovery.ResolvedType; -import io.quarkus.annotation.processor.documentation.config.formatter.JavadocToAsciidocTransformer; import io.quarkus.annotation.processor.documentation.config.model.ConfigPhase; import io.quarkus.annotation.processor.documentation.config.util.ConfigNamingUtil; import io.quarkus.annotation.processor.documentation.config.util.Markers; @@ -98,15 +95,6 @@ public Optional onConfigRoot(TypeElement configRoot) { return Optional.of(discoveryConfigRoot); } - @Override - public void onUnresolvedSuperclass(DiscoveryRootElement discoveryRootElement, TypeElement superclass) { - if (config.getExtension().isMixedModule() && discoveryRootElement.isConfigMapping()) { - return; - } - - discoveryRootElement.setUnresolvedSuperclass(superclass.getQualifiedName().toString()); - } - @Override public void onEnclosedField(DiscoveryRootElement discoveryRootElement, TypeElement clazz, VariableElement field, ResolvedType resolvedType) { @@ -170,17 +158,13 @@ public void onEnclosedField(DiscoveryRootElement discoveryRootElement, TypeEleme builder.converted(); } - String rawJavadoc = utils.element().getRequiredJavadoc(field); - builder.rawJavadoc(rawJavadoc); + if (utils.element().isLocalClass(clazz)) { + utils.element().checkRequiredJavadoc(field); + } AnnotationMirror configDocSectionAnnotation = fieldAnnotations.get(Types.ANNOTATION_CONFIG_DOC_SECTION); if (configDocSectionAnnotation != null) { - ParsedJavadocSection section = JavadocToAsciidocTransformer.INSTANCE.parseConfigSectionJavadoc(rawJavadoc); - builder.section(section); - } else { - ParsedJavadoc parsedJavadoc = JavadocToAsciidocTransformer.INSTANCE.parseConfigItemJavadoc(rawJavadoc); - builder.description(parsedJavadoc.description()); - builder.since(parsedJavadoc.since()); + builder.section(); } discoveryRootElement.addProperty(builder.build()); diff --git a/core/processor/src/main/java/io/quarkus/annotation/processor/util/ElementUtil.java b/core/processor/src/main/java/io/quarkus/annotation/processor/util/ElementUtil.java index cca53fef2a6e8..9e91eccb7e34a 100644 --- a/core/processor/src/main/java/io/quarkus/annotation/processor/util/ElementUtil.java +++ b/core/processor/src/main/java/io/quarkus/annotation/processor/util/ElementUtil.java @@ -129,16 +129,21 @@ public boolean isLocalClass(TypeElement clazz) { } } - public String getRequiredJavadoc(Element e) { - String javaDoc = getJavadoc(e); + public String checkRequiredJavadoc(Element e) { + String javadoc = getJavadoc(e); - if (javaDoc == null) { + if (javadoc == null) { processingEnv.getMessager() .printMessage(Diagnostic.Kind.ERROR, "Unable to find javadoc for config item " + e.getEnclosingElement() + " " + e, e); return ""; } - return javaDoc; + + return javadoc; + } + + public String getRequiredJavadoc(Element e) { + return checkRequiredJavadoc(e); } public String getJavadoc(Element e) { From 5fe5b1c17e230ed61705621d029e4a17188f2afe Mon Sep 17 00:00:00 2001 From: Guillaume Smet Date: Wed, 31 Jul 2024 17:38:58 +0200 Subject: [PATCH 11/43] Write javadoc elements as JSON in a new file We need more structure than a simple properties. We keep the .properties for now for compatibility but hopefully we will be able to drop it in the future. --- .../quarkus/annotation/processor/Outputs.java | 9 ++++++ .../config/ConfigDocExtensionProcessor.java | 16 ++++++++-- .../config/model/JavadocElements.java | 11 +++++++ .../config/resolver/ConfigResolver.java | 10 ++++++- .../AbstractJavadocConfigListener.java | 22 +++++++++----- .../config/scanner/ConfigCollector.java | 18 +++++------ .../scanner/JavadocConfigMappingListener.java | 19 +++++++----- .../JavadocLegacyConfigRootListener.java | 17 +++++++---- .../annotation/processor/util/FilerUtil.java | 30 +++++++++++++++++++ 9 files changed, 121 insertions(+), 31 deletions(-) create mode 100644 core/processor/src/main/java/io/quarkus/annotation/processor/documentation/config/model/JavadocElements.java diff --git a/core/processor/src/main/java/io/quarkus/annotation/processor/Outputs.java b/core/processor/src/main/java/io/quarkus/annotation/processor/Outputs.java index e818546355a3a..8da73315109f1 100644 --- a/core/processor/src/main/java/io/quarkus/annotation/processor/Outputs.java +++ b/core/processor/src/main/java/io/quarkus/annotation/processor/Outputs.java @@ -9,6 +9,15 @@ public final class Outputs { public static final String META_INF_QUARKUS_BUILD_STEPS = "META-INF/quarkus-build-steps.list"; public static final String META_INF_QUARKUS_CONFIG_ROOTS = "META-INF/quarkus-config-roots.list"; + + public static final String META_INF_QUARKUS_CONFIG = "META-INF/quarkus-config/"; + public static final String META_INF_QUARKUS_CONFIG_JAVADOC = "META-INF/quarkus-config/quarkus-config-javadoc.json"; + public static final String META_INF_QUARKUS_CONFIG_MODEL = "META-INF/quarkus-config/quarkus-config-model.json"; + + /** + * Ideally, we should remove this file at some point. + */ + @Deprecated(forRemoval = true) public static final String META_INF_QUARKUS_JAVADOC = "META-INF/quarkus-javadoc.properties"; /** diff --git a/core/processor/src/main/java/io/quarkus/annotation/processor/documentation/config/ConfigDocExtensionProcessor.java b/core/processor/src/main/java/io/quarkus/annotation/processor/documentation/config/ConfigDocExtensionProcessor.java index d283b8df95053..3666c884f50e1 100644 --- a/core/processor/src/main/java/io/quarkus/annotation/processor/documentation/config/ConfigDocExtensionProcessor.java +++ b/core/processor/src/main/java/io/quarkus/annotation/processor/documentation/config/ConfigDocExtensionProcessor.java @@ -3,7 +3,9 @@ import java.io.IOException; import java.nio.file.Files; import java.nio.file.Path; +import java.util.Map.Entry; import java.util.Optional; +import java.util.Properties; import java.util.Set; import javax.annotation.processing.RoundEnvironment; @@ -16,6 +18,8 @@ import io.quarkus.annotation.processor.ExtensionProcessor; import io.quarkus.annotation.processor.Outputs; +import io.quarkus.annotation.processor.documentation.config.model.JavadocElements; +import io.quarkus.annotation.processor.documentation.config.model.JavadocElements.JavadocElement; import io.quarkus.annotation.processor.documentation.config.model.ResolvedModel; import io.quarkus.annotation.processor.documentation.config.resolver.ConfigResolver; import io.quarkus.annotation.processor.documentation.config.scanner.ConfigAnnotationScanner; @@ -71,9 +75,17 @@ private Optional findAnnotation(Set annotati public void finalizeProcessing() { ConfigCollector configCollector = configAnnotationScanner.finalizeProcessing(); - utils.filer().write(Outputs.META_INF_QUARKUS_JAVADOC, configCollector.getJavadocProperties()); + Properties javadocProperties = new Properties(); + for (Entry javadocElementEntry : configCollector.getJavadocElements().entrySet()) { + javadocProperties.put(javadocElementEntry.getKey(), javadocElementEntry.getValue().rawJavadoc()); + } + utils.filer().write(Outputs.META_INF_QUARKUS_JAVADOC, javadocProperties); + + ConfigResolver configResolver = new ConfigResolver(config, utils, configCollector); + + JavadocElements javadocElements = configResolver.resolveJavadoc(); + utils.filer().writeJson(Outputs.META_INF_QUARKUS_CONFIG_JAVADOC, javadocElements); - ConfigResolver configResolver = new ConfigResolver(utils, configCollector); ResolvedModel resolvedModel = configResolver.resolveModel(); // we don't want to write this file in the jar diff --git a/core/processor/src/main/java/io/quarkus/annotation/processor/documentation/config/model/JavadocElements.java b/core/processor/src/main/java/io/quarkus/annotation/processor/documentation/config/model/JavadocElements.java new file mode 100644 index 0000000000000..ee7694e2f9f55 --- /dev/null +++ b/core/processor/src/main/java/io/quarkus/annotation/processor/documentation/config/model/JavadocElements.java @@ -0,0 +1,11 @@ +package io.quarkus.annotation.processor.documentation.config.model; + +import java.util.Map; + +import com.fasterxml.jackson.annotation.JsonIgnore; + +public record JavadocElements(Extension extension, Map elements) { + + public record JavadocElement(String description, String since, @JsonIgnore String rawJavadoc) { + } +} diff --git a/core/processor/src/main/java/io/quarkus/annotation/processor/documentation/config/resolver/ConfigResolver.java b/core/processor/src/main/java/io/quarkus/annotation/processor/documentation/config/resolver/ConfigResolver.java index 211483a8812e6..1825311b68928 100644 --- a/core/processor/src/main/java/io/quarkus/annotation/processor/documentation/config/resolver/ConfigResolver.java +++ b/core/processor/src/main/java/io/quarkus/annotation/processor/documentation/config/resolver/ConfigResolver.java @@ -27,11 +27,13 @@ import io.quarkus.annotation.processor.documentation.config.model.ConfigSection; import io.quarkus.annotation.processor.documentation.config.model.EnumAcceptedValues; import io.quarkus.annotation.processor.documentation.config.model.EnumAcceptedValues.EnumAcceptedValue; +import io.quarkus.annotation.processor.documentation.config.model.JavadocElements; import io.quarkus.annotation.processor.documentation.config.model.ResolvedModel; import io.quarkus.annotation.processor.documentation.config.scanner.ConfigCollector; import io.quarkus.annotation.processor.documentation.config.util.ConfigNamingUtil; import io.quarkus.annotation.processor.documentation.config.util.JavadocUtil; import io.quarkus.annotation.processor.documentation.config.util.Markers; +import io.quarkus.annotation.processor.util.Config; import io.quarkus.annotation.processor.util.Strings; import io.quarkus.annotation.processor.util.Utils; @@ -48,14 +50,20 @@ */ public class ConfigResolver { + private final Config config; private final Utils utils; private final ConfigCollector configCollector; - public ConfigResolver(Utils utils, ConfigCollector configCollector) { + public ConfigResolver(Config config, Utils utils, ConfigCollector configCollector) { + this.config = config; this.utils = utils; this.configCollector = configCollector; } + public JavadocElements resolveJavadoc() { + return new JavadocElements(config.getExtension(), configCollector.getJavadocElements()); + } + public ResolvedModel resolveModel() { Map configRoots = new HashMap<>(); diff --git a/core/processor/src/main/java/io/quarkus/annotation/processor/documentation/config/scanner/AbstractJavadocConfigListener.java b/core/processor/src/main/java/io/quarkus/annotation/processor/documentation/config/scanner/AbstractJavadocConfigListener.java index f9f45ab7362bd..eb8ab4616fb6b 100644 --- a/core/processor/src/main/java/io/quarkus/annotation/processor/documentation/config/scanner/AbstractJavadocConfigListener.java +++ b/core/processor/src/main/java/io/quarkus/annotation/processor/documentation/config/scanner/AbstractJavadocConfigListener.java @@ -4,6 +4,9 @@ import javax.lang.model.element.ElementKind; import javax.lang.model.element.TypeElement; +import io.quarkus.annotation.processor.documentation.config.discovery.ParsedJavadoc; +import io.quarkus.annotation.processor.documentation.config.formatter.JavadocToAsciidocTransformer; +import io.quarkus.annotation.processor.documentation.config.model.JavadocElements.JavadocElement; import io.quarkus.annotation.processor.documentation.config.util.Markers; import io.quarkus.annotation.processor.util.Config; import io.quarkus.annotation.processor.util.Utils; @@ -22,18 +25,23 @@ protected AbstractJavadocConfigListener(Config config, Utils utils, ConfigCollec @Override public void onResolvedEnum(TypeElement enumTypeElement) { + if (!utils.element().isLocalClass(enumTypeElement)) { + return; + } + for (Element enumElement : enumTypeElement.getEnclosedElements()) { if (enumElement.getKind() != ElementKind.ENUM_CONSTANT) { continue; } - String javadoc = utils.element().getJavadoc(enumElement); - if (javadoc != null && !javadoc.isBlank()) { - configCollector - .addJavadocProperty( - enumTypeElement.getQualifiedName().toString() + Markers.DOT + enumElement.getSimpleName() - .toString(), - javadoc); + String rawJavadoc = utils.element().getJavadoc(enumElement); + if (rawJavadoc != null && !rawJavadoc.isBlank()) { + ParsedJavadoc parsedJavadoc = JavadocToAsciidocTransformer.INSTANCE.parseConfigItemJavadoc(rawJavadoc); + + configCollector.addJavadocElement( + enumTypeElement.getQualifiedName().toString() + Markers.DOT + enumElement.getSimpleName() + .toString(), + new JavadocElement(parsedJavadoc.description(), parsedJavadoc.since(), rawJavadoc)); } } } diff --git a/core/processor/src/main/java/io/quarkus/annotation/processor/documentation/config/scanner/ConfigCollector.java b/core/processor/src/main/java/io/quarkus/annotation/processor/documentation/config/scanner/ConfigCollector.java index 63b508fc32367..aaeaef3252a14 100644 --- a/core/processor/src/main/java/io/quarkus/annotation/processor/documentation/config/scanner/ConfigCollector.java +++ b/core/processor/src/main/java/io/quarkus/annotation/processor/documentation/config/scanner/ConfigCollector.java @@ -4,16 +4,18 @@ import java.util.Collections; import java.util.HashMap; import java.util.Map; -import java.util.Properties; import io.quarkus.annotation.processor.documentation.config.discovery.DiscoveryConfigGroup; import io.quarkus.annotation.processor.documentation.config.discovery.DiscoveryConfigRoot; import io.quarkus.annotation.processor.documentation.config.discovery.EnumDefinition; +import io.quarkus.annotation.processor.documentation.config.model.JavadocElements.JavadocElement; public class ConfigCollector { - @Deprecated(since = "3.14", forRemoval = true) - private Properties javadocProperties = new Properties(); + /** + * Key is qualified name of the class + "." + element name (for instance field or method name) + */ + private Map javadocElements = new HashMap<>(); /** * Key is the qualified name of the class. @@ -30,14 +32,12 @@ public class ConfigCollector { */ private Map resolvedEnums = new HashMap<>(); - @Deprecated(since = "3.14", forRemoval = true) - void addJavadocProperty(String key, String docComment) { - javadocProperties.put(key, docComment); + public void addJavadocElement(String key, JavadocElement element) { + javadocElements.put(key, element); } - @Deprecated(since = "3.14", forRemoval = true) - public Properties getJavadocProperties() { - return javadocProperties; + public Map getJavadocElements() { + return Collections.unmodifiableMap(javadocElements); } public void addConfigRoot(DiscoveryConfigRoot configRoot) { diff --git a/core/processor/src/main/java/io/quarkus/annotation/processor/documentation/config/scanner/JavadocConfigMappingListener.java b/core/processor/src/main/java/io/quarkus/annotation/processor/documentation/config/scanner/JavadocConfigMappingListener.java index 2baf3c9cd836e..21a5c93086e38 100644 --- a/core/processor/src/main/java/io/quarkus/annotation/processor/documentation/config/scanner/JavadocConfigMappingListener.java +++ b/core/processor/src/main/java/io/quarkus/annotation/processor/documentation/config/scanner/JavadocConfigMappingListener.java @@ -4,16 +4,17 @@ import javax.lang.model.element.TypeElement; import io.quarkus.annotation.processor.documentation.config.discovery.DiscoveryRootElement; +import io.quarkus.annotation.processor.documentation.config.discovery.ParsedJavadoc; import io.quarkus.annotation.processor.documentation.config.discovery.ResolvedType; +import io.quarkus.annotation.processor.documentation.config.formatter.JavadocToAsciidocTransformer; +import io.quarkus.annotation.processor.documentation.config.model.JavadocElements.JavadocElement; import io.quarkus.annotation.processor.documentation.config.util.Markers; import io.quarkus.annotation.processor.util.Config; import io.quarkus.annotation.processor.util.Utils; /** - * This class is responsible for collecting and writing the Javadoc in quarkus-javadoc.properties. - * We want this class to be replaced by the new descriptors that will be generated. + * This class is responsible for collecting and writing the Javadoc. */ -@Deprecated(since = "3.14", forRemoval = true) public class JavadocConfigMappingListener extends AbstractJavadocConfigListener { JavadocConfigMappingListener(Config config, Utils utils, ConfigCollector configCollector) { @@ -33,9 +34,13 @@ public void onEnclosedMethod(DiscoveryRootElement discoveryRootElement, TypeElem return; } - String docComment = utils.element().getRequiredJavadoc(method); - configCollector.addJavadocProperty( - clazz.getQualifiedName().toString() + Markers.DOT + method.getSimpleName().toString(), - docComment); + String rawJavadoc = utils.element().getRequiredJavadoc(method); + if (rawJavadoc != null && !rawJavadoc.isBlank()) { + ParsedJavadoc parsedJavadoc = JavadocToAsciidocTransformer.INSTANCE.parseConfigItemJavadoc(rawJavadoc); + + configCollector.addJavadocElement( + clazz.getQualifiedName().toString() + Markers.DOT + method.getSimpleName().toString(), + new JavadocElement(parsedJavadoc.description(), parsedJavadoc.since(), rawJavadoc)); + } } } diff --git a/core/processor/src/main/java/io/quarkus/annotation/processor/documentation/config/scanner/JavadocLegacyConfigRootListener.java b/core/processor/src/main/java/io/quarkus/annotation/processor/documentation/config/scanner/JavadocLegacyConfigRootListener.java index d53fb973c6b2d..d60aa03f2abb5 100644 --- a/core/processor/src/main/java/io/quarkus/annotation/processor/documentation/config/scanner/JavadocLegacyConfigRootListener.java +++ b/core/processor/src/main/java/io/quarkus/annotation/processor/documentation/config/scanner/JavadocLegacyConfigRootListener.java @@ -4,16 +4,17 @@ import javax.lang.model.element.VariableElement; import io.quarkus.annotation.processor.documentation.config.discovery.DiscoveryRootElement; +import io.quarkus.annotation.processor.documentation.config.discovery.ParsedJavadoc; import io.quarkus.annotation.processor.documentation.config.discovery.ResolvedType; +import io.quarkus.annotation.processor.documentation.config.formatter.JavadocToAsciidocTransformer; +import io.quarkus.annotation.processor.documentation.config.model.JavadocElements.JavadocElement; import io.quarkus.annotation.processor.documentation.config.util.Markers; import io.quarkus.annotation.processor.util.Config; import io.quarkus.annotation.processor.util.Utils; /** - * This class is responsible for collecting and writing the Javadoc in quarkus-javadoc.properties. - * We want this class to be replaced by the new descriptors that will be generated. + * This class is responsible for collecting and writing the Javadoc. */ -@Deprecated(since = "3.14", forRemoval = true) public class JavadocLegacyConfigRootListener extends AbstractJavadocConfigListener { JavadocLegacyConfigRootListener(Config config, Utils utils, ConfigCollector configCollector) { @@ -33,7 +34,13 @@ public void onEnclosedField(DiscoveryRootElement discoveryRootElement, TypeEleme return; } - configCollector.addJavadocProperty(clazz.getQualifiedName().toString() + Markers.DOT + field.getSimpleName() - .toString(), utils.element().getRequiredJavadoc(field)); + String rawJavadoc = utils.element().getRequiredJavadoc(field); + if (rawJavadoc != null && !rawJavadoc.isBlank()) { + ParsedJavadoc parsedJavadoc = JavadocToAsciidocTransformer.INSTANCE.parseConfigItemJavadoc(rawJavadoc); + + configCollector.addJavadocElement( + clazz.getQualifiedName().toString() + Markers.DOT + field.getSimpleName().toString(), + new JavadocElement(parsedJavadoc.description(), parsedJavadoc.since(), rawJavadoc)); + } } } diff --git a/core/processor/src/main/java/io/quarkus/annotation/processor/util/FilerUtil.java b/core/processor/src/main/java/io/quarkus/annotation/processor/util/FilerUtil.java index 7264efb7b3b61..96fc5a5488017 100644 --- a/core/processor/src/main/java/io/quarkus/annotation/processor/util/FilerUtil.java +++ b/core/processor/src/main/java/io/quarkus/annotation/processor/util/FilerUtil.java @@ -2,6 +2,7 @@ import java.io.BufferedWriter; import java.io.IOException; +import java.io.OutputStream; import java.io.OutputStreamWriter; import java.io.UncheckedIOException; import java.nio.charset.StandardCharsets; @@ -15,10 +16,21 @@ import javax.tools.FileObject; import javax.tools.StandardLocation; +import com.fasterxml.jackson.annotation.JsonInclude; +import com.fasterxml.jackson.databind.ObjectMapper; +import com.fasterxml.jackson.databind.ObjectWriter; + import io.quarkus.bootstrap.util.PropertyUtils; public class FilerUtil { + private static final ObjectWriter JSON_OBJECT_WRITER; + + static { + ObjectMapper jsonObjectMapper = new ObjectMapper().setSerializationInclusion(JsonInclude.Include.NON_DEFAULT); + JSON_OBJECT_WRITER = jsonObjectMapper.writerWithDefaultPrettyPrinter(); + } + private final ProcessingEnvironment processingEnv; FilerUtil(ProcessingEnvironment processingEnv) { @@ -66,6 +78,24 @@ public void write(String fileName, Properties properties) { } } + public void writeJson(String fileName, Object value) { + if (value == null) { + return; + } + + try { + final FileObject jsonResource = processingEnv.getFiler().createResource(StandardLocation.CLASS_OUTPUT, "", + fileName); + + try (OutputStream os = jsonResource.openOutputStream()) { + JSON_OBJECT_WRITER.writeValue(os, value); + } + } catch (IOException e) { + processingEnv.getMessager().printMessage(Diagnostic.Kind.ERROR, "Failed to write " + fileName + ": " + e); + return; + } + } + public Path getTargetPath() { try { FileObject dummyFile = processingEnv.getFiler().getResource(StandardLocation.CLASS_OUTPUT, "", "dummy"); From 3d68d93063eecacca13e00e2677a86697bcc3cf8 Mon Sep 17 00:00:00 2001 From: Guillaume Smet Date: Thu, 1 Aug 2024 19:02:31 +0200 Subject: [PATCH 12/43] Add a Maven plugin that assembles and generates the config doc --- core/processor/pom.xml | 4 + .../quarkus/annotation/processor/Outputs.java | 24 +- .../config/ConfigDocExtensionProcessor.java | 46 +-- .../config/model/AbstractConfigItem.java | 25 +- .../config/model/ConfigPhase.java | 16 +- .../config/model/ConfigProperty.java | 26 +- .../config/model/ConfigRoot.java | 51 +++ .../config/model/ConfigSection.java | 54 +++- .../documentation/config/model/Extension.java | 22 ++ .../config/model/ResolvedModel.java | 7 +- .../config/resolver/ConfigResolver.java | 5 +- .../annotation/processor/util/FilerUtil.java | 41 ++- devtools/config-doc-maven-plugin/pom.xml | 184 +++++++++++ .../maven/config/doc/AsciidocFormatter.java | 198 ++++++++++++ .../maven/config/doc/ConfigRootKey.java | 68 ++++ .../config/doc/ConfigSectionJavadoc.java | 19 ++ .../config/doc/GenerateAsciidocMojo.java | 304 ++++++++++++++++++ .../maven/config/doc/JavadocRepository.java | 20 ++ .../m2e/lifecycle-mapping-metadata.xml | 17 + .../resources/META-INF/plexus/components.xml | 20 ++ .../templates/configReference.qute.adoc | 31 ++ .../templates/tags/configProperty.qute.adoc | 15 + .../templates/tags/configSection.qute.adoc | 17 + .../templates/tags/durationNote.qute.adoc | 19 ++ .../resources/templates/tags/envVar.qute.adoc | 6 + .../templates/tags/memorySizeNote.qute.adoc | 10 + devtools/pom.xml | 1 + 27 files changed, 1174 insertions(+), 76 deletions(-) create mode 100644 devtools/config-doc-maven-plugin/pom.xml create mode 100644 devtools/config-doc-maven-plugin/src/main/java/io/quarkus/maven/config/doc/AsciidocFormatter.java create mode 100644 devtools/config-doc-maven-plugin/src/main/java/io/quarkus/maven/config/doc/ConfigRootKey.java create mode 100644 devtools/config-doc-maven-plugin/src/main/java/io/quarkus/maven/config/doc/ConfigSectionJavadoc.java create mode 100644 devtools/config-doc-maven-plugin/src/main/java/io/quarkus/maven/config/doc/GenerateAsciidocMojo.java create mode 100644 devtools/config-doc-maven-plugin/src/main/java/io/quarkus/maven/config/doc/JavadocRepository.java create mode 100644 devtools/config-doc-maven-plugin/src/main/resources/META-INF/m2e/lifecycle-mapping-metadata.xml create mode 100644 devtools/config-doc-maven-plugin/src/main/resources/META-INF/plexus/components.xml create mode 100644 devtools/config-doc-maven-plugin/src/main/resources/templates/configReference.qute.adoc create mode 100644 devtools/config-doc-maven-plugin/src/main/resources/templates/tags/configProperty.qute.adoc create mode 100644 devtools/config-doc-maven-plugin/src/main/resources/templates/tags/configSection.qute.adoc create mode 100644 devtools/config-doc-maven-plugin/src/main/resources/templates/tags/durationNote.qute.adoc create mode 100644 devtools/config-doc-maven-plugin/src/main/resources/templates/tags/envVar.qute.adoc create mode 100644 devtools/config-doc-maven-plugin/src/main/resources/templates/tags/memorySizeNote.qute.adoc diff --git a/core/processor/pom.xml b/core/processor/pom.xml index 5b4690e1e3ef4..20ef6ea3d0185 100644 --- a/core/processor/pom.xml +++ b/core/processor/pom.xml @@ -36,6 +36,10 @@ com.fasterxml.jackson.dataformat jackson-dataformat-yaml + + com.fasterxml.jackson.module + jackson-module-parameter-names + io.quarkus quarkus-bootstrap-app-model diff --git a/core/processor/src/main/java/io/quarkus/annotation/processor/Outputs.java b/core/processor/src/main/java/io/quarkus/annotation/processor/Outputs.java index 8da73315109f1..ba297dd7a7486 100644 --- a/core/processor/src/main/java/io/quarkus/annotation/processor/Outputs.java +++ b/core/processor/src/main/java/io/quarkus/annotation/processor/Outputs.java @@ -1,5 +1,7 @@ package io.quarkus.annotation.processor; +import java.nio.file.Path; + /** * Define the output here so that they are clearly identified. *

@@ -7,23 +9,25 @@ */ public final class Outputs { - public static final String META_INF_QUARKUS_BUILD_STEPS = "META-INF/quarkus-build-steps.list"; - public static final String META_INF_QUARKUS_CONFIG_ROOTS = "META-INF/quarkus-config-roots.list"; + public static final Path META_INF_QUARKUS_BUILD_STEPS = Path.of("META-INF", "quarkus-build-steps.list"); + public static final Path META_INF_QUARKUS_CONFIG_ROOTS = Path.of("META-INF", "quarkus-config-roots.list"); - public static final String META_INF_QUARKUS_CONFIG = "META-INF/quarkus-config/"; - public static final String META_INF_QUARKUS_CONFIG_JAVADOC = "META-INF/quarkus-config/quarkus-config-javadoc.json"; - public static final String META_INF_QUARKUS_CONFIG_MODEL = "META-INF/quarkus-config/quarkus-config-model.json"; + public static final Path META_INF_QUARKUS_CONFIG = Path.of("META-INF", "quarkus-config"); + public static final Path META_INF_QUARKUS_CONFIG_JAVADOC = META_INF_QUARKUS_CONFIG.resolve("quarkus-config-javadoc.json"); + public static final Path META_INF_QUARKUS_CONFIG_MODEL = META_INF_QUARKUS_CONFIG.resolve("quarkus-config-model.json"); /** - * Ideally, we should remove this file at some point. + * This directory is specific and written directly into target/ as it's not a file we want to package. */ - @Deprecated(forRemoval = true) - public static final String META_INF_QUARKUS_JAVADOC = "META-INF/quarkus-javadoc.properties"; + private static final Path QUARKUS_CONFIG_DOC = Path.of("quarkus-config-doc"); + public static final Path QUARKUS_CONFIG_DOC_JAVADOC = QUARKUS_CONFIG_DOC.resolve("quarkus-config-javadoc.yaml"); + public static final Path QUARKUS_CONFIG_DOC_MODEL = QUARKUS_CONFIG_DOC.resolve("quarkus-config-model.yaml"); /** - * This directory is specific and written directly into target/ as it's not a file we want to package. + * Ideally, we should remove this file at some point. */ - public static final String QUARKUS_CONFIG_DOC = "quarkus-config-doc"; + @Deprecated(forRemoval = true) + public static final Path META_INF_QUARKUS_JAVADOC = Path.of("META-INF", "quarkus-javadoc.properties"); private Outputs() { } diff --git a/core/processor/src/main/java/io/quarkus/annotation/processor/documentation/config/ConfigDocExtensionProcessor.java b/core/processor/src/main/java/io/quarkus/annotation/processor/documentation/config/ConfigDocExtensionProcessor.java index 3666c884f50e1..56b2764b4f4f5 100644 --- a/core/processor/src/main/java/io/quarkus/annotation/processor/documentation/config/ConfigDocExtensionProcessor.java +++ b/core/processor/src/main/java/io/quarkus/annotation/processor/documentation/config/ConfigDocExtensionProcessor.java @@ -12,10 +12,6 @@ import javax.lang.model.element.TypeElement; import javax.tools.Diagnostic.Kind; -import com.fasterxml.jackson.annotation.JsonInclude; -import com.fasterxml.jackson.databind.ObjectMapper; -import com.fasterxml.jackson.dataformat.yaml.YAMLFactory; - import io.quarkus.annotation.processor.ExtensionProcessor; import io.quarkus.annotation.processor.Outputs; import io.quarkus.annotation.processor.documentation.config.model.JavadocElements; @@ -30,12 +26,6 @@ public class ConfigDocExtensionProcessor implements ExtensionProcessor { - private static final ObjectMapper YAML_OBJECT_MAPPER = new ObjectMapper(new YAMLFactory()); - - static { - YAML_OBJECT_MAPPER.setSerializationInclusion(JsonInclude.Include.NON_DEFAULT); - } - private Config config; private Utils utils; private ConfigAnnotationScanner configAnnotationScanner; @@ -83,31 +73,25 @@ public void finalizeProcessing() { ConfigResolver configResolver = new ConfigResolver(config, utils, configCollector); + // the model is not written in the jar file JavadocElements javadocElements = configResolver.resolveJavadoc(); - utils.filer().writeJson(Outputs.META_INF_QUARKUS_CONFIG_JAVADOC, javadocElements); - - ResolvedModel resolvedModel = configResolver.resolveModel(); - - // we don't want to write this file in the jar - Path quarkusConfigDocPath = utils.filer().getTargetPath().resolve(Outputs.QUARKUS_CONFIG_DOC); - Path yamlModelPath = quarkusConfigDocPath.resolve("resolved-model-" + config.getExtension().artifactId() + ".yaml"); - try { - Files.createDirectories(quarkusConfigDocPath); - YAML_OBJECT_MAPPER.writeValue(yamlModelPath.toFile(), resolvedModel); - } catch (IOException e) { - throw new IllegalStateException("Unable to write the resolved model to: " + yamlModelPath, e); + if (!javadocElements.elements().isEmpty()) { + utils.filer().writeModel(Outputs.QUARKUS_CONFIG_DOC_JAVADOC, javadocElements); } - if (config.isDebug()) { - utils.processingEnv().getMessager().printMessage(Kind.NOTE, - "Result of config scanning:\n\n" + configCollector.toString()); - - try { - utils.processingEnv().getMessager().printMessage(Kind.NOTE, - "Resolved model:\n\n" + Files.readString(yamlModelPath)); - } catch (IOException e) { - throw new IllegalStateException("Unable to read the resolved model from: " + yamlModelPath, e); + ResolvedModel resolvedModel = configResolver.resolveModel(); + if (!resolvedModel.getConfigRoots().isEmpty()) { + Path resolvedModelPath = utils.filer().writeModel(Outputs.QUARKUS_CONFIG_DOC_MODEL, resolvedModel); + + if (config.isDebug()) { + try { + utils.processingEnv().getMessager().printMessage(Kind.NOTE, + "Resolved model:\n\n" + Files.readString(resolvedModelPath)); + } catch (IOException e) { + throw new IllegalStateException("Unable to read the resolved model from: " + resolvedModelPath, e); + } } } + } } diff --git a/core/processor/src/main/java/io/quarkus/annotation/processor/documentation/config/model/AbstractConfigItem.java b/core/processor/src/main/java/io/quarkus/annotation/processor/documentation/config/model/AbstractConfigItem.java index b1fcafffa9503..83e7b9a291dac 100644 --- a/core/processor/src/main/java/io/quarkus/annotation/processor/documentation/config/model/AbstractConfigItem.java +++ b/core/processor/src/main/java/io/quarkus/annotation/processor/documentation/config/model/AbstractConfigItem.java @@ -1,22 +1,26 @@ package io.quarkus.annotation.processor.documentation.config.model; +import com.fasterxml.jackson.annotation.JsonIgnore; import com.fasterxml.jackson.annotation.JsonTypeInfo; @JsonTypeInfo(use = JsonTypeInfo.Id.CLASS, include = JsonTypeInfo.As.PROPERTY, property = "@class") public sealed abstract class AbstractConfigItem implements Comparable permits ConfigProperty, ConfigSection { - private final String sourceClass; - private final String sourceName; - private final String path; + protected final String sourceClass; + protected final String sourceName; + protected final String path; - private final String type; + protected final String type; - public AbstractConfigItem(String sourceClass, String sourceName, String path, String type) { + protected final boolean deprecated; + + public AbstractConfigItem(String sourceClass, String sourceName, String path, String type, boolean deprecated) { this.sourceClass = sourceClass; this.sourceName = sourceName; this.path = path; this.type = type; + this.deprecated = deprecated; } public String getSourceClass() { @@ -35,5 +39,16 @@ public String getType() { return type; } + public boolean isDeprecated() { + return deprecated; + } + + @JsonIgnore public abstract boolean isSection(); + + @JsonIgnore + public abstract boolean hasDurationType(); + + @JsonIgnore + public abstract boolean hasMemorySizeType(); } diff --git a/core/processor/src/main/java/io/quarkus/annotation/processor/documentation/config/model/ConfigPhase.java b/core/processor/src/main/java/io/quarkus/annotation/processor/documentation/config/model/ConfigPhase.java index 6a0bae82dfcbe..e0aa79c43c190 100644 --- a/core/processor/src/main/java/io/quarkus/annotation/processor/documentation/config/model/ConfigPhase.java +++ b/core/processor/src/main/java/io/quarkus/annotation/processor/documentation/config/model/ConfigPhase.java @@ -4,9 +4,9 @@ public enum ConfigPhase implements Comparable { - RUN_TIME("RunTime"), - BUILD_TIME("BuildTime"), - BUILD_AND_RUN_TIME_FIXED("BuildTime"); + RUN_TIME("RunTime", false), + BUILD_TIME("BuildTime", true), + BUILD_AND_RUN_TIME_FIXED("BuildTime", true); static final Comparator COMPARATOR = new Comparator() { /** @@ -49,13 +49,19 @@ public int compare(ConfigPhase firstPhase, ConfigPhase secondPhase) { } }; - private String configSuffix; + private final String configSuffix; + private final boolean fixedAtBuildTime; - ConfigPhase(String configSuffix) { + ConfigPhase(String configSuffix, boolean fixedAtBuildTime) { this.configSuffix = configSuffix; + this.fixedAtBuildTime = fixedAtBuildTime; } public String getConfigSuffix() { return configSuffix; } + + public boolean isFixedAtBuildTime() { + return fixedAtBuildTime; + } } diff --git a/core/processor/src/main/java/io/quarkus/annotation/processor/documentation/config/model/ConfigProperty.java b/core/processor/src/main/java/io/quarkus/annotation/processor/documentation/config/model/ConfigProperty.java index 0a1774c76528e..76c10f26ec320 100644 --- a/core/processor/src/main/java/io/quarkus/annotation/processor/documentation/config/model/ConfigProperty.java +++ b/core/processor/src/main/java/io/quarkus/annotation/processor/documentation/config/model/ConfigProperty.java @@ -1,7 +1,12 @@ package io.quarkus.annotation.processor.documentation.config.model; +import java.time.Duration; import java.util.List; +import com.fasterxml.jackson.annotation.JsonProperty; + +import io.quarkus.annotation.processor.documentation.config.util.Types; + public final class ConfigProperty extends AbstractConfigItem { private final ConfigPhase phase; @@ -23,15 +28,13 @@ public final class ConfigProperty extends AbstractConfigItem { private final String javadocSiteLink; - private final boolean deprecated; - public ConfigProperty(ConfigPhase phase, String sourceClass, String sourceName, String path, List additionalPaths, String environmentVariable, String type, String typeDescription, boolean map, boolean list, boolean optional, - String mapKey, boolean unnamedMapKey, boolean withinMap, boolean converted, boolean isEnum, + String mapKey, boolean unnamedMapKey, boolean withinMap, boolean converted, @JsonProperty("enum") boolean isEnum, EnumAcceptedValues enumAcceptedValues, String defaultValue, String javadocSiteLink, boolean deprecated) { - super(sourceClass, sourceName, path, typeDescription); + super(sourceClass, sourceName, path, type, deprecated); this.phase = phase; this.additionalPaths = additionalPaths; this.environmentVariable = environmentVariable; @@ -47,7 +50,6 @@ public ConfigProperty(ConfigPhase phase, String sourceClass, String sourceName, this.enumAcceptedValues = enumAcceptedValues; this.defaultValue = defaultValue; this.javadocSiteLink = javadocSiteLink; - this.deprecated = deprecated; } public ConfigPhase getPhase() { @@ -110,10 +112,6 @@ public String getJavadocSiteLink() { return javadocSiteLink; } - public boolean isDeprecated() { - return deprecated; - } - public boolean isSection() { return false; } @@ -137,4 +135,14 @@ public int compareTo(AbstractConfigItem o) { return ConfigPhase.COMPARATOR.compare(phase, other.getPhase()); } + + @Override + public boolean hasDurationType() { + return Duration.class.getName().equals(type); + } + + @Override + public boolean hasMemorySizeType() { + return Types.MEMORY_SIZE_TYPE.equals(type); + } } diff --git a/core/processor/src/main/java/io/quarkus/annotation/processor/documentation/config/model/ConfigRoot.java b/core/processor/src/main/java/io/quarkus/annotation/processor/documentation/config/model/ConfigRoot.java index db22cb868fdb6..b2478d8d365b4 100644 --- a/core/processor/src/main/java/io/quarkus/annotation/processor/documentation/config/model/ConfigRoot.java +++ b/core/processor/src/main/java/io/quarkus/annotation/processor/documentation/config/model/ConfigRoot.java @@ -4,6 +4,7 @@ import java.util.Collections; import java.util.HashSet; import java.util.List; +import java.util.Optional; import java.util.Set; /** @@ -57,4 +58,54 @@ public void addItem(AbstractConfigItem item) { public List getItems() { return Collections.unmodifiableList(items); } + + public void merge(ConfigRoot other) { + this.qualifiedNames.addAll(other.getQualifiedNames()); + + for (AbstractConfigItem otherItem : other.getItems()) { + if (otherItem instanceof ConfigSection configSection) { + Optional similarConfigSection = findSimilarSection(configSection); + if (similarConfigSection.isEmpty()) { + this.items.add(configSection); + } else { + similarConfigSection.get().merge(configSection); + } + } else if (otherItem instanceof ConfigProperty configProperty) { + this.items.add(configProperty); + } else { + throw new IllegalStateException("Unknown item type: " + otherItem.getClass()); + } + } + + Collections.sort(this.items); + } + + private Optional findSimilarSection(ConfigSection configSection) { + // this is a bit naive as a section could be nested differently but with a similar path + // it should be sufficient for now + // also, it's not exactly optimal, maybe we should have a map (but we need to be careful about the order), we'll see + return this.getItems().stream() + .filter(i -> i.isSection()) + .filter(i -> i.getPath().equals(configSection.getPath())) + .map(i -> (ConfigSection) i) + .findFirst(); + } + + public boolean hasDurationType() { + for (AbstractConfigItem item : items) { + if (item.hasDurationType() && !item.deprecated) { + return true; + } + } + return false; + } + + public boolean hasMemorySizeType() { + for (AbstractConfigItem item : items) { + if (item.hasMemorySizeType() && !item.deprecated) { + return true; + } + } + return false; + } } diff --git a/core/processor/src/main/java/io/quarkus/annotation/processor/documentation/config/model/ConfigSection.java b/core/processor/src/main/java/io/quarkus/annotation/processor/documentation/config/model/ConfigSection.java index 2240e878a159d..4681d868d57e6 100644 --- a/core/processor/src/main/java/io/quarkus/annotation/processor/documentation/config/model/ConfigSection.java +++ b/core/processor/src/main/java/io/quarkus/annotation/processor/documentation/config/model/ConfigSection.java @@ -3,13 +3,14 @@ import java.util.ArrayList; import java.util.Collections; import java.util.List; +import java.util.Optional; public final class ConfigSection extends AbstractConfigItem implements ConfigItemCollection { private final List items = new ArrayList<>(); - public ConfigSection(String sourceClass, String sourceName, String path, String type) { - super(sourceClass, sourceName, path, type); + public ConfigSection(String sourceClass, String sourceName, String path, String type, boolean deprecated) { + super(sourceClass, sourceName, path, type, deprecated); } @Override @@ -34,4 +35,53 @@ public int compareTo(AbstractConfigItem o) { public boolean isSection() { return true; } + + public void merge(ConfigSection other) { + for (AbstractConfigItem otherItem : other.getItems()) { + if (otherItem instanceof ConfigSection configSection) { + Optional similarConfigSection = findSimilarSection(configSection); + if (similarConfigSection.isEmpty()) { + this.items.add(configSection); + } else { + similarConfigSection.get().merge(configSection); + Collections.sort(similarConfigSection.get().items); + } + } else if (otherItem instanceof ConfigProperty configProperty) { + this.items.add(configProperty); + } else { + throw new IllegalStateException("Unknown item type: " + otherItem.getClass()); + } + } + } + + private Optional findSimilarSection(ConfigSection configSection) { + // this is a bit naive as a section could be nested differently but with a similar path + // it should be sufficient for now + // also, it's not exactly optimal, maybe we should have a map (but we need to be careful about the order), we'll see + return this.getItems().stream() + .filter(i -> i.isSection()) + .filter(i -> i.getPath().equals(configSection.getPath())) + .map(i -> (ConfigSection) i) + .findFirst(); + } + + @Override + public boolean hasDurationType() { + for (AbstractConfigItem item : items) { + if (item.hasDurationType() && !item.deprecated) { + return true; + } + } + return false; + } + + @Override + public boolean hasMemorySizeType() { + for (AbstractConfigItem item : items) { + if (item.hasMemorySizeType() && !item.deprecated) { + return true; + } + } + return false; + } } diff --git a/core/processor/src/main/java/io/quarkus/annotation/processor/documentation/config/model/Extension.java b/core/processor/src/main/java/io/quarkus/annotation/processor/documentation/config/model/Extension.java index 81a833658a571..0f45e93af2edd 100644 --- a/core/processor/src/main/java/io/quarkus/annotation/processor/documentation/config/model/Extension.java +++ b/core/processor/src/main/java/io/quarkus/annotation/processor/documentation/config/model/Extension.java @@ -1,9 +1,31 @@ package io.quarkus.annotation.processor.documentation.config.model; +import java.util.Objects; + import com.fasterxml.jackson.annotation.JsonIgnore; public record Extension(String groupId, String artifactId, String name) { + @Override + public int hashCode() { + return Objects.hash(artifactId, groupId); + } + + @Override + public boolean equals(Object obj) { + if (this == obj) { + return true; + } + if (obj == null) { + return false; + } + if (getClass() != obj.getClass()) { + return false; + } + Extension other = (Extension) obj; + return Objects.equals(artifactId, other.artifactId) && Objects.equals(groupId, other.groupId); + } + // TODO #42114 remove once fixed @Deprecated(forRemoval = true) @JsonIgnore diff --git a/core/processor/src/main/java/io/quarkus/annotation/processor/documentation/config/model/ResolvedModel.java b/core/processor/src/main/java/io/quarkus/annotation/processor/documentation/config/model/ResolvedModel.java index afa2fb1026a5a..2ae697f7d0801 100644 --- a/core/processor/src/main/java/io/quarkus/annotation/processor/documentation/config/model/ResolvedModel.java +++ b/core/processor/src/main/java/io/quarkus/annotation/processor/documentation/config/model/ResolvedModel.java @@ -3,6 +3,8 @@ import java.util.Collections; import java.util.Map; +import com.fasterxml.jackson.annotation.JsonCreator; + /** * This is the fully resolved model for a given module. *

@@ -36,9 +38,10 @@ public class ResolvedModel { */ private Map configGroups; + @JsonCreator public ResolvedModel(Map configRoots, Map configGroups) { - this.configRoots = Collections.unmodifiableMap(configRoots); - this.configGroups = Collections.unmodifiableMap(configGroups); + this.configRoots = configRoots == null ? Map.of() : Collections.unmodifiableMap(configRoots); + this.configGroups = configGroups == null ? Map.of() : Collections.unmodifiableMap(configGroups); } public Map getConfigRoots() { diff --git a/core/processor/src/main/java/io/quarkus/annotation/processor/documentation/config/resolver/ConfigResolver.java b/core/processor/src/main/java/io/quarkus/annotation/processor/documentation/config/resolver/ConfigResolver.java index 1825311b68928..7fbeaa2137424 100644 --- a/core/processor/src/main/java/io/quarkus/annotation/processor/documentation/config/resolver/ConfigResolver.java +++ b/core/processor/src/main/java/io/quarkus/annotation/processor/documentation/config/resolver/ConfigResolver.java @@ -123,8 +123,8 @@ private void resolveProperty(ConfigRoot configRoot, ConfigPhase phase, Resolutio ResolutionContext configGroupContext; if (discoveryConfigProperty.isSection()) { - ConfigSection configSection = new ConfigSection(typeQualifiedName, - discoveryConfigProperty.getSourceName(), fullPath, typeQualifiedName); + ConfigSection configSection = new ConfigSection(context.getDiscoveryRootElement().getQualifiedName(), + discoveryConfigProperty.getSourceName(), fullPath, typeQualifiedName, deprecated); context.getItemCollection().addItem(configSection); configGroupContext = new ResolutionContext(fullPath, additionalPaths, discoveryConfigGroup, configSection, discoveryConfigProperty.getType().isMap(), deprecated); @@ -170,7 +170,6 @@ private void resolveProperty(ConfigRoot configRoot, ConfigPhase phase, Resolutio .collect(Collectors.toCollection(ArrayList::new)); } else if (discoveryConfigProperty.getType().isList()) { typeQualifiedName = discoveryConfigProperty.getType().wrapperType().toString(); - typeSimplifiedName = "list of " + typeSimplifiedName; } // this is a standard property diff --git a/core/processor/src/main/java/io/quarkus/annotation/processor/util/FilerUtil.java b/core/processor/src/main/java/io/quarkus/annotation/processor/util/FilerUtil.java index 96fc5a5488017..fd2543ba4c0e9 100644 --- a/core/processor/src/main/java/io/quarkus/annotation/processor/util/FilerUtil.java +++ b/core/processor/src/main/java/io/quarkus/annotation/processor/util/FilerUtil.java @@ -6,6 +6,7 @@ import java.io.OutputStreamWriter; import java.io.UncheckedIOException; import java.nio.charset.StandardCharsets; +import java.nio.file.Files; import java.nio.file.Path; import java.nio.file.Paths; import java.util.Properties; @@ -19,16 +20,23 @@ import com.fasterxml.jackson.annotation.JsonInclude; import com.fasterxml.jackson.databind.ObjectMapper; import com.fasterxml.jackson.databind.ObjectWriter; +import com.fasterxml.jackson.dataformat.yaml.YAMLFactory; import io.quarkus.bootstrap.util.PropertyUtils; public class FilerUtil { private static final ObjectWriter JSON_OBJECT_WRITER; + private static final ObjectMapper YAML_OBJECT_MAPPER = new ObjectMapper(new YAMLFactory()); + + static { + } static { ObjectMapper jsonObjectMapper = new ObjectMapper().setSerializationInclusion(JsonInclude.Include.NON_DEFAULT); JSON_OBJECT_WRITER = jsonObjectMapper.writerWithDefaultPrettyPrinter(); + + YAML_OBJECT_MAPPER.setSerializationInclusion(JsonInclude.Include.NON_DEFAULT); } private final ProcessingEnvironment processingEnv; @@ -37,14 +45,14 @@ public class FilerUtil { this.processingEnv = processingEnv; } - public void write(String fileName, Set set) { + public void write(Path filePath, Set set) { if (set.isEmpty()) { return; } try { final FileObject listResource = processingEnv.getFiler().createResource(StandardLocation.CLASS_OUTPUT, "", - fileName); + filePath.toString()); try (BufferedWriter writer = new BufferedWriter( new OutputStreamWriter(listResource.openOutputStream(), StandardCharsets.UTF_8))) { @@ -54,48 +62,63 @@ public void write(String fileName, Set set) { } } } catch (IOException e) { - processingEnv.getMessager().printMessage(Diagnostic.Kind.ERROR, "Failed to write " + fileName + ": " + e); + processingEnv.getMessager().printMessage(Diagnostic.Kind.ERROR, "Failed to write " + filePath + ": " + e); return; } } - public void write(String fileName, Properties properties) { + public void write(Path filePath, Properties properties) { if (properties.isEmpty()) { return; } try { final FileObject propertiesResource = processingEnv.getFiler().createResource(StandardLocation.CLASS_OUTPUT, "", - fileName); + filePath.toString()); try (BufferedWriter writer = new BufferedWriter( new OutputStreamWriter(propertiesResource.openOutputStream(), StandardCharsets.UTF_8))) { PropertyUtils.store(properties, writer); } } catch (IOException e) { - processingEnv.getMessager().printMessage(Diagnostic.Kind.ERROR, "Failed to write " + fileName + ": " + e); + processingEnv.getMessager().printMessage(Diagnostic.Kind.ERROR, "Failed to write " + filePath + ": " + e); return; } } - public void writeJson(String fileName, Object value) { + public void writeJson(Path filePath, Object value) { if (value == null) { return; } try { final FileObject jsonResource = processingEnv.getFiler().createResource(StandardLocation.CLASS_OUTPUT, "", - fileName); + filePath.toString()); try (OutputStream os = jsonResource.openOutputStream()) { JSON_OBJECT_WRITER.writeValue(os, value); } } catch (IOException e) { - processingEnv.getMessager().printMessage(Diagnostic.Kind.ERROR, "Failed to write " + fileName + ": " + e); + processingEnv.getMessager().printMessage(Diagnostic.Kind.ERROR, "Failed to write " + filePath + ": " + e); return; } } + /** + * The model files are written outside of target/classes as we don't want to include them in the jar. + */ + public Path writeModel(Path filePath, Object value) { + Path yamlModelPath = getTargetPath().resolve(filePath); + try { + Files.createDirectories(yamlModelPath.getParent()); + YAML_OBJECT_MAPPER.writeValue(yamlModelPath.toFile(), value); + + return yamlModelPath; + } catch (IOException e) { + throw new IllegalStateException("Unable to write the model to: " + yamlModelPath, e); + } + } + public Path getTargetPath() { try { FileObject dummyFile = processingEnv.getFiler().getResource(StandardLocation.CLASS_OUTPUT, "", "dummy"); diff --git a/devtools/config-doc-maven-plugin/pom.xml b/devtools/config-doc-maven-plugin/pom.xml new file mode 100644 index 0000000000000..bc50db3f7ec62 --- /dev/null +++ b/devtools/config-doc-maven-plugin/pom.xml @@ -0,0 +1,184 @@ + + 4.0.0 + + io.quarkus + quarkus-devtools-all + 999-SNAPSHOT + + quarkus-config-doc-maven-plugin + Quarkus - Config doc Maven plugin + maven-plugin + + 3.9.8 + + + + + + maven-compiler-plugin + + + maven-javadoc-plugin + + true + none + + + + org.apache.maven.plugins + maven-enforcer-plugin + + + io.quarkus + quarkus-enforcer-rules + ${project.version} + + + + + enforce + ${maven-enforcer-plugin.phase} + + + + + classpath:enforcer-rules/quarkus-require-java-version.xml + + + classpath:enforcer-rules/quarkus-require-maven-version.xml + + + classpath:enforcer-rules/quarkus-banned-dependencies.xml + + + + + com.google.code.findbugs:jsr305 + + com.google.guava:listenablefuture + + + + + + enforce + + + + + + + + + org.eclipse.sisu + sisu-maven-plugin + 0.9.0.M3 + + + index-project + + main-index + test-index + + + + + + org.apache.maven.plugins + maven-plugin-plugin + + quarkus-config-doc + true + + + + help-goal + + helpmojo + + + + default-config-doc + generate-resources + + + + + + + + io.quarkus + quarkus-extension-processor + ${project.version} + + + io.quarkus.qute + qute-core + + + javax.inject + javax.inject + + + org.apache.maven + maven-plugin-api + provided + + + org.apache.maven.plugin-tools + maven-plugin-annotations + + + org.apache.maven + maven-core + provided + + + org.apache.maven + maven-embedder + provided + + + org.apache.maven + maven-settings-builder + provided + + + org.apache.maven + maven-resolver-provider + provided + + + org.apache.maven + maven-model + provided + + + org.apache.maven + maven-model-builder + provided + + + org.apache.maven + maven-artifact + provided + + + org.apache.maven + maven-settings + provided + + + org.apache.maven + maven-builder-support + provided + + + org.apache.maven + maven-repository-metadata + provided + + + diff --git a/devtools/config-doc-maven-plugin/src/main/java/io/quarkus/maven/config/doc/AsciidocFormatter.java b/devtools/config-doc-maven-plugin/src/main/java/io/quarkus/maven/config/doc/AsciidocFormatter.java new file mode 100644 index 0000000000000..cd347cdf5f07e --- /dev/null +++ b/devtools/config-doc-maven-plugin/src/main/java/io/quarkus/maven/config/doc/AsciidocFormatter.java @@ -0,0 +1,198 @@ +package io.quarkus.maven.config.doc; + +import java.text.Normalizer; +import java.time.Duration; +import java.util.Optional; +import java.util.stream.Collectors; + +import io.quarkus.annotation.processor.documentation.config.model.ConfigProperty; +import io.quarkus.annotation.processor.documentation.config.model.ConfigSection; +import io.quarkus.annotation.processor.documentation.config.model.JavadocElements.JavadocElement; +import io.quarkus.annotation.processor.documentation.config.util.Types; + +final class AsciidocFormatter { + + private static final String TOOLTIP_MACRO = "tooltip:%s[%s]"; + private static final String MORE_INFO_ABOUT_TYPE_FORMAT = "link:#%s[icon:question-circle[title=More information about the %s format]]"; + + private final JavadocRepository javadocRepository; + + AsciidocFormatter(JavadocRepository javadocRepository) { + this.javadocRepository = javadocRepository; + } + + String formatDescription(ConfigProperty configProperty) { + Optional javadocElement = javadocRepository.getElement(configProperty.getSourceClass(), + configProperty.getSourceName()); + + if (javadocElement.isEmpty()) { + return null; + } + + String description = javadocElement.get().description(); + if (description == null || description.isBlank()) { + return null; + } + + return description + "\n\n"; + } + + String formatTypeDescription(ConfigProperty configProperty) { + String typeContent = ""; + + if (configProperty.isEnum()) { + typeContent = configProperty.getEnumAcceptedValues().values().entrySet().stream() + .map(e -> { + Optional javadocElement = javadocRepository.getElement(configProperty.getType(), + e.getKey()); + if (javadocElement.isEmpty()) { + return "`" + e.getValue().configValue() + "`"; + } + + return String.format(TOOLTIP_MACRO, e.getValue().configValue(), + cleanTooltipContent(javadocElement.get().description())); + }) + .collect(Collectors.joining(", ")); + } else { + typeContent = configProperty.getTypeDescription(); + if (configProperty.getJavadocSiteLink() != null) { + typeContent = String.format("link:%s[%s]", configProperty.getJavadocSiteLink(), typeContent); + } + } + if (configProperty.isList()) { + typeContent = "list of " + typeContent; + } + + if (Duration.class.getName().equals(configProperty.getType())) { + typeContent += " " + String.format(MORE_INFO_ABOUT_TYPE_FORMAT, + "duration-note-anchor-{summaryTableId}", Duration.class.getSimpleName()); + } else if (Types.MEMORY_SIZE_TYPE.equals(configProperty.getType())) { + typeContent += " " + String.format(MORE_INFO_ABOUT_TYPE_FORMAT, + "memory-size-note-anchor-{summaryTableId}", "MemorySize"); + } + + return typeContent; + } + + String formatDefaultValue(ConfigProperty configProperty) { + String defaultValue = configProperty.getDefaultValue(); + + if (configProperty.isEnum()) { + Optional enumConstant = configProperty.getEnumAcceptedValues().values().entrySet().stream() + .filter(e -> e.getValue().configValue().equals(defaultValue)) + .map(e -> e.getKey()) + .findFirst(); + + if (enumConstant.isPresent()) { + Optional javadocElement = javadocRepository.getElement(configProperty.getType(), + enumConstant.get()); + + if (javadocElement.isPresent()) { + return String.format(TOOLTIP_MACRO, defaultValue, cleanTooltipContent(javadocElement.get().description())); + } + } + } + + return "`" + defaultValue + "`"; + } + + String escapeCellContent(String value) { + if (value == null) { + return null; + } + + return value.replace("|", "\\|"); + } + + String toAnchor(String value) { + // remove accents + value = Normalizer.normalize(value, Normalizer.Form.NFKC) + .replaceAll("[àáâãäåāąă]", "a") + .replaceAll("[çćčĉċ]", "c") + .replaceAll("[ďđð]", "d") + .replaceAll("[èéêëēęěĕė]", "e") + .replaceAll("[ƒſ]", "f") + .replaceAll("[ĝğġģ]", "g") + .replaceAll("[ĥħ]", "h") + .replaceAll("[ìíîïīĩĭįı]", "i") + .replaceAll("[ijĵ]", "j") + .replaceAll("[ķĸ]", "k") + .replaceAll("[łľĺļŀ]", "l") + .replaceAll("[ñńňņʼnŋ]", "n") + .replaceAll("[òóôõöøōőŏœ]", "o") + .replaceAll("[Þþ]", "p") + .replaceAll("[ŕřŗ]", "r") + .replaceAll("[śšşŝș]", "s") + .replaceAll("[ťţŧț]", "t") + .replaceAll("[ùúûüūůűŭũų]", "u") + .replaceAll("[ŵ]", "w") + .replaceAll("[ýÿŷ]", "y") + .replaceAll("[žżź]", "z") + .replaceAll("[æ]", "ae") + .replaceAll("[ÀÁÂÃÄÅĀĄĂ]", "A") + .replaceAll("[ÇĆČĈĊ]", "C") + .replaceAll("[ĎĐÐ]", "D") + .replaceAll("[ÈÉÊËĒĘĚĔĖ]", "E") + .replaceAll("[ĜĞĠĢ]", "G") + .replaceAll("[ĤĦ]", "H") + .replaceAll("[ÌÍÎÏĪĨĬĮİ]", "I") + .replaceAll("[Ĵ]", "J") + .replaceAll("[Ķ]", "K") + .replaceAll("[ŁĽĹĻĿ]", "L") + .replaceAll("[ÑŃŇŅŊ]", "N") + .replaceAll("[ÒÓÔÕÖØŌŐŎ]", "O") + .replaceAll("[ŔŘŖ]", "R") + .replaceAll("[ŚŠŞŜȘ]", "S") + .replaceAll("[ÙÚÛÜŪŮŰŬŨŲ]", "U") + .replaceAll("[Ŵ]", "W") + .replaceAll("[ÝŶŸ]", "Y") + .replaceAll("[ŹŽŻ]", "Z") + .replaceAll("[ß]", "ss"); + + // TODO cache the patterns in statics + // Apostrophes. + value = value.replaceAll("([a-z])'s([^a-z])", "$1s$2"); + // Allow only letters, -, _ + value = value.replaceAll("[^\\w-_]", "-").replaceAll("-{2,}", "-"); + // Get rid of any - at the start and end. + value = value.replaceAll("-+$", "").replaceAll("^-+", ""); + + return value.toLowerCase(); + } + + String formatSectionTitle(ConfigSection configSection) { + Optional javadocElement = javadocRepository.getElement(configSection.getSourceClass(), + configSection.getSourceName()); + + if (javadocElement.isEmpty()) { + throw new IllegalStateException( + "Couldn't find section title for: " + configSection.getSourceClass() + "#" + configSection.getSourceName()); + } + + String javadoc = javadocElement.get().description(); + if (javadoc == null || javadoc.isBlank()) { + throw new IllegalStateException( + "Couldn't find section title for: " + configSection.getSourceClass() + "#" + configSection.getSourceName()); + } + + javadoc = javadoc.trim(); + int dotIndex = javadoc.indexOf("."); + + if (dotIndex == -1) { + return javadoc; + } + + return javadoc.substring(0, dotIndex); + } + + /** + * Note that this is extremely brittle. Apparently, colons breaks the tooltips but if escaped with \, the \ appears in the + * output. + *

+ * We should probably have some warnings/errors as to what is accepted in enum Javadoc. + */ + private String cleanTooltipContent(String tooltipContent) { + return tooltipContent.replace("

", "").replace("

", "").replace("\n+\n", " ").replace("\n", " ") + .replace(":", "\\:").replace("[", "\\]").replace("]", "\\]"); + } +} diff --git a/devtools/config-doc-maven-plugin/src/main/java/io/quarkus/maven/config/doc/ConfigRootKey.java b/devtools/config-doc-maven-plugin/src/main/java/io/quarkus/maven/config/doc/ConfigRootKey.java new file mode 100644 index 0000000000000..32e3809004c65 --- /dev/null +++ b/devtools/config-doc-maven-plugin/src/main/java/io/quarkus/maven/config/doc/ConfigRootKey.java @@ -0,0 +1,68 @@ +package io.quarkus.maven.config.doc; + +import java.util.Objects; +import java.util.regex.Pattern; + +import io.quarkus.annotation.processor.documentation.config.util.Markers; + +class ConfigRootKey { + + private final String groupId; + private final String artifactId; + private final String topLevelPrefix; + + public ConfigRootKey(String groupId, String artifactId, String prefix) { + this.groupId = groupId; + this.artifactId = artifactId; + this.topLevelPrefix = buildTopLevelPrefix(prefix); + } + + public String getGroupId() { + return groupId; + } + + public String getArtifactId() { + return artifactId; + } + + public String getTopLevelPrefix() { + return topLevelPrefix; + } + + private static String buildTopLevelPrefix(String prefix) { + String[] prefixSegments = prefix.split(Pattern.quote(Markers.DOT)); + + if (prefixSegments.length == 1) { + return prefixSegments[0]; + } + + return prefixSegments[0] + Markers.DOT + prefixSegments[1]; + } + + @Override + public int hashCode() { + return Objects.hash(artifactId, groupId, topLevelPrefix); + } + + @Override + public boolean equals(Object obj) { + if (this == obj) { + return true; + } + if (obj == null) { + return false; + } + if (getClass() != obj.getClass()) { + return false; + } + ConfigRootKey other = (ConfigRootKey) obj; + return Objects.equals(artifactId, other.artifactId) && Objects.equals(groupId, other.groupId) + && Objects.equals(topLevelPrefix, other.topLevelPrefix); + } + + @Override + public String toString() { + return "ConfigRootKey [groupId=" + groupId + ", artifactId=" + artifactId + ", topLevelPrefix=" + topLevelPrefix + + "]"; + } +} \ No newline at end of file diff --git a/devtools/config-doc-maven-plugin/src/main/java/io/quarkus/maven/config/doc/ConfigSectionJavadoc.java b/devtools/config-doc-maven-plugin/src/main/java/io/quarkus/maven/config/doc/ConfigSectionJavadoc.java new file mode 100644 index 0000000000000..c7a040950a80f --- /dev/null +++ b/devtools/config-doc-maven-plugin/src/main/java/io/quarkus/maven/config/doc/ConfigSectionJavadoc.java @@ -0,0 +1,19 @@ +package io.quarkus.maven.config.doc; + +record ConfigSectionJavadoc(String title, String details) { + + static ConfigSectionJavadoc of(String javadoc) { + if (javadoc == null || javadoc.isBlank()) { + return new ConfigSectionJavadoc(null, null); + } + + javadoc = javadoc.trim(); + int dotIndex = javadoc.indexOf("."); + + if (dotIndex == -1 || dotIndex == javadoc.length() - 1) { + return new ConfigSectionJavadoc(javadoc, null); + } + + return new ConfigSectionJavadoc(javadoc.substring(0, dotIndex).trim(), javadoc.substring(dotIndex).trim()); + } +} diff --git a/devtools/config-doc-maven-plugin/src/main/java/io/quarkus/maven/config/doc/GenerateAsciidocMojo.java b/devtools/config-doc-maven-plugin/src/main/java/io/quarkus/maven/config/doc/GenerateAsciidocMojo.java new file mode 100644 index 0000000000000..cd1d0a43c3e80 --- /dev/null +++ b/devtools/config-doc-maven-plugin/src/main/java/io/quarkus/maven/config/doc/GenerateAsciidocMojo.java @@ -0,0 +1,304 @@ +package io.quarkus.maven.config.doc; + +import java.io.File; +import java.io.IOException; +import java.io.InputStream; +import java.io.UncheckedIOException; +import java.nio.charset.StandardCharsets; +import java.nio.file.FileVisitResult; +import java.nio.file.Files; +import java.nio.file.Path; +import java.nio.file.SimpleFileVisitor; +import java.nio.file.StandardCopyOption; +import java.nio.file.attribute.BasicFileAttributes; +import java.util.ArrayList; +import java.util.HashMap; +import java.util.List; +import java.util.Map; +import java.util.Map.Entry; +import java.util.stream.Collectors; + +import org.apache.maven.execution.MavenSession; +import org.apache.maven.plugin.AbstractMojo; +import org.apache.maven.plugin.MojoExecutionException; +import org.apache.maven.plugin.MojoFailureException; +import org.apache.maven.plugins.annotations.LifecyclePhase; +import org.apache.maven.plugins.annotations.Mojo; +import org.apache.maven.plugins.annotations.Parameter; + +import com.fasterxml.jackson.databind.ObjectMapper; +import com.fasterxml.jackson.dataformat.yaml.YAMLFactory; +import com.fasterxml.jackson.module.paramnames.ParameterNamesModule; + +import io.quarkus.annotation.processor.Outputs; +import io.quarkus.annotation.processor.documentation.config.model.ConfigProperty; +import io.quarkus.annotation.processor.documentation.config.model.ConfigRoot; +import io.quarkus.annotation.processor.documentation.config.model.ConfigSection; +import io.quarkus.annotation.processor.documentation.config.model.JavadocElements; +import io.quarkus.annotation.processor.documentation.config.model.JavadocElements.JavadocElement; +import io.quarkus.annotation.processor.documentation.config.model.ResolvedModel; +import io.quarkus.qute.Engine; +import io.quarkus.qute.ReflectionValueResolver; +import io.quarkus.qute.UserTagSectionHelper; +import io.quarkus.qute.ValueResolver; + +@Mojo(name = "generate-asciidoc", defaultPhase = LifecyclePhase.GENERATE_RESOURCES, threadSafe = true) +public class GenerateAsciidocMojo extends AbstractMojo { + + private static final ObjectMapper YAML_OBJECT_MAPPER = new ObjectMapper(new YAMLFactory()) + .registerModule(new ParameterNamesModule()); + private static final String TARGET = "target"; + + private static final String CONFIG_ROOT_FILE_FORMAT = "%s.%s.adoc"; + private static final String EXTENSION_FILE_FORMAT = "%s.adoc"; + + @Parameter(defaultValue = "${session}", readonly = true) + private MavenSession mavenSession; + + @Parameter(readonly = true) + private File scanDirectory; + + @Parameter(defaultValue = "${project.build.directory}/quarkus-config-doc", readonly = true, required = true) + private File targetDirectory; + + @Override + public void execute() throws MojoExecutionException, MojoFailureException { + // I was unable to find an easy way to get the root directory of the project + Path resolvedScanDirectory = scanDirectory != null ? scanDirectory.toPath() + : mavenSession.getCurrentProject().getBasedir().toPath().getParent(); + Path resolvedTargetDirectory = targetDirectory.toPath(); + initTargetDirectory(resolvedTargetDirectory); + + List targetDirectories = findTargetDirectories(resolvedScanDirectory); + + JavadocRepository javadocRepository = findJavadocElements(targetDirectories); + Map configRoots = findConfigRoots(targetDirectories); + + AsciidocFormatter asciidocFormatter = new AsciidocFormatter(javadocRepository); + Engine quteEngine = initializeQuteEngine(asciidocFormatter); + + // we generate a file per extension + top level prefix + for (Entry configRootEntry : configRoots.entrySet()) { + ConfigRootKey configRootKey = configRootEntry.getKey(); + ConfigRoot configRoot = configRootEntry.getValue(); + + Path configRootAdocPath = resolvedTargetDirectory.resolve(String.format(CONFIG_ROOT_FILE_FORMAT, + configRootKey.getArtifactId(), configRootKey.getTopLevelPrefix())); + String summaryTableId = asciidocFormatter + .toAnchor(configRootKey.getArtifactId() + "_" + configRootKey.getTopLevelPrefix()); + + try { + Files.writeString(configRootAdocPath, + generateConfigReference(quteEngine, summaryTableId, configRootKey, configRoot)); + } catch (Exception e) { + throw new MojoExecutionException("Unable to render config root: " + configRootKey, e); + } + } + + // for extensions with only one top level prefix, we also copy the file to an extension file + Map> configRootKeysPerExtension = configRoots.keySet().stream() + .collect(Collectors.groupingBy(crk -> crk.getGroupId() + ":" + crk.getArtifactId())); + + for (List extensionConfigRootKeys : configRootKeysPerExtension.values()) { + if (extensionConfigRootKeys.size() != 1) { + continue; + } + + ConfigRootKey configRootKey = extensionConfigRootKeys.get(0); + + Path extensionAdocPath = resolvedTargetDirectory.resolve(String.format(EXTENSION_FILE_FORMAT, + configRootKey.getArtifactId())); + Path configRootAdocPath = resolvedTargetDirectory.resolve(String.format(CONFIG_ROOT_FILE_FORMAT, + configRootKey.getArtifactId(), configRootKey.getTopLevelPrefix())); + + try { + Files.copy(configRootAdocPath, extensionAdocPath, StandardCopyOption.REPLACE_EXISTING); + } catch (Exception e) { + throw new MojoExecutionException("Unable to copy extension file for: " + configRootKey, e); + } + } + } + + private static String generateConfigReference(Engine quteEngine, String summaryTableId, ConfigRootKey configRootKey, + ConfigRoot configRoot) { + return quteEngine.getTemplate("configReference.qute.adoc") + .data("configRootKey", configRootKey) + .data("configRoot", configRoot) + .data("searchable", true) + .data("summaryTableId", summaryTableId) + .data("includeDurationNote", configRoot.hasDurationType()) + .data("includeMemorySizeNote", configRoot.hasMemorySizeType()) + .render(); + } + + private static void initTargetDirectory(Path resolvedTargetDirectory) throws MojoExecutionException { + try { + Files.createDirectories(resolvedTargetDirectory); + } catch (IOException e) { + throw new MojoExecutionException("Unable to create directory: " + resolvedTargetDirectory, e); + } + } + + private static JavadocRepository findJavadocElements(List targetDirectories) throws MojoExecutionException { + Map javadocElementsMap = new HashMap<>(); + + for (Path targetDirectory : targetDirectories) { + Path javadocPath = targetDirectory.resolve(Outputs.QUARKUS_CONFIG_DOC_JAVADOC); + if (!Files.isReadable(javadocPath)) { + continue; + } + + try { + JavadocElements javadocElements = YAML_OBJECT_MAPPER.readValue(javadocPath.toFile(), JavadocElements.class); + + if (javadocElements.elements() == null || javadocElements.elements().isEmpty()) { + continue; + } + + javadocElementsMap.putAll(javadocElements.elements()); + } catch (IOException e) { + throw new MojoExecutionException("Unable to parse: " + javadocPath, e); + } + } + + return new JavadocRepository(javadocElementsMap); + } + + private static Map findConfigRoots(List targetDirectories) throws MojoExecutionException { + Map configRootsMap = new HashMap<>(); + + for (Path targetDirectory : targetDirectories) { + Path javadocPath = targetDirectory.resolve(Outputs.QUARKUS_CONFIG_DOC_MODEL); + if (!Files.isReadable(javadocPath)) { + continue; + } + + try { + ResolvedModel resolvedModel = YAML_OBJECT_MAPPER.readValue(javadocPath.toFile(), ResolvedModel.class); + + if (resolvedModel.getConfigRoots() == null || resolvedModel.getConfigRoots().isEmpty()) { + continue; + } + + for (ConfigRoot configRoot : resolvedModel.getConfigRoots().values()) { + ConfigRootKey configRootKey = new ConfigRootKey(configRoot.getExtension().groupId(), + configRoot.getExtension().artifactId(), + configRoot.getPrefix()); + + ConfigRoot existingConfigRoot = configRootsMap.get(configRootKey); + if (existingConfigRoot == null) { + configRootsMap.put(configRootKey, configRoot); + } else { + existingConfigRoot.merge(configRoot); + } + } + } catch (IOException e) { + throw new MojoExecutionException("Unable to parse: " + javadocPath, e); + } + } + + return configRootsMap; + } + + private static List findTargetDirectories(Path scanDirectory) throws MojoExecutionException { + try { + List targets = new ArrayList<>(); + + Files.walkFileTree(scanDirectory, new SimpleFileVisitor<>() { + + @Override + public FileVisitResult preVisitDirectory(Path dir, BasicFileAttributes attrs) throws IOException { + if (dir.endsWith(TARGET)) { + targets.add(dir); + + // a target directory can contain target directories for test projects + // so let's make sure we ignore whatever is nested in a target + return FileVisitResult.SKIP_SUBTREE; + } + + return FileVisitResult.CONTINUE; + } + }); + + return targets; + } catch (IOException e) { + throw new MojoExecutionException("Unable to collect the target directories", e); + } + } + + private static Engine initializeQuteEngine(AsciidocFormatter asciidocFormatter) { + Engine engine = Engine.builder() + .addDefaults() + .addSectionHelper(new UserTagSectionHelper.Factory("configProperty", "configProperty.qute.adoc")) + .addSectionHelper(new UserTagSectionHelper.Factory("configSection", "configSection.qute.adoc")) + .addSectionHelper(new UserTagSectionHelper.Factory("envVar", "envVar.qute.adoc")) + .addSectionHelper(new UserTagSectionHelper.Factory("durationNote", "durationNote.qute.adoc")) + .addSectionHelper(new UserTagSectionHelper.Factory("memorySizeNote", "memorySizeNote.qute.adoc")) + .addValueResolver(new ReflectionValueResolver()) + .addValueResolver(ValueResolver.builder() + .applyToBaseClass(String.class) + .applyToName("escapeCellContent") + .applyToNoParameters() + .resolveSync(ctx -> asciidocFormatter.escapeCellContent((String) ctx.getBase())) + .build()) + .addValueResolver(ValueResolver.builder() + .applyToBaseClass(String.class) + .applyToName("toAnchor") + .applyToNoParameters() + .resolveSync(ctx -> asciidocFormatter.toAnchor((String) ctx.getBase())) + .build()) + .addValueResolver(ValueResolver.builder() + .applyToBaseClass(ConfigProperty.class) + .applyToName("typeDescription") + .applyToNoParameters() + .resolveSync(ctx -> asciidocFormatter.formatTypeDescription((ConfigProperty) ctx.getBase())) + .build()) + .addValueResolver(ValueResolver.builder() + .applyToBaseClass(ConfigProperty.class) + .applyToName("description") + .applyToNoParameters() + .resolveSync(ctx -> asciidocFormatter.formatDescription((ConfigProperty) ctx.getBase())) + .build()) + .addValueResolver(ValueResolver.builder() + .applyToBaseClass(ConfigSection.class) + .applyToName("title") + .applyToNoParameters() + .resolveSync(ctx -> asciidocFormatter.formatSectionTitle((ConfigSection) ctx.getBase())) + .build()) + .build(); + + engine.putTemplate("configReference.qute.adoc", + engine.parse(getTemplate("templates/configReference.qute.adoc"))); + engine.putTemplate("configProperty.qute.adoc", + engine.parse(getTemplate("templates/tags/configProperty.qute.adoc"))); + engine.putTemplate("configSection.qute.adoc", + engine.parse(getTemplate("templates/tags/configSection.qute.adoc"))); + engine.putTemplate("envVar.qute.adoc", + engine.parse(getTemplate("templates/tags/envVar.qute.adoc"))); + engine.putTemplate("durationNote.qute.adoc", + engine.parse(getTemplate("templates/tags/durationNote.qute.adoc"))); + engine.putTemplate("memorySizeNote.qute.adoc", + engine.parse(getTemplate("templates/tags/memorySizeNote.qute.adoc"))); + + return engine; + } + + private static String getTemplate(String template) { + InputStream is = Thread.currentThread().getContextClassLoader().getResourceAsStream(template); + if (is == null) { + throw new IllegalArgumentException("Template does not exist: " + template); + } + + try { + return new String(is.readAllBytes(), StandardCharsets.UTF_8); + } catch (IOException e) { + throw new UncheckedIOException("Unable to read the template: " + template, e); + } finally { + try { + is.close(); + } catch (IOException e) { + throw new UncheckedIOException("Unable close InputStream for template: " + template, e); + } + } + } +} diff --git a/devtools/config-doc-maven-plugin/src/main/java/io/quarkus/maven/config/doc/JavadocRepository.java b/devtools/config-doc-maven-plugin/src/main/java/io/quarkus/maven/config/doc/JavadocRepository.java new file mode 100644 index 0000000000000..b4127463455ab --- /dev/null +++ b/devtools/config-doc-maven-plugin/src/main/java/io/quarkus/maven/config/doc/JavadocRepository.java @@ -0,0 +1,20 @@ +package io.quarkus.maven.config.doc; + +import java.util.Map; +import java.util.Optional; + +import io.quarkus.annotation.processor.documentation.config.model.JavadocElements.JavadocElement; +import io.quarkus.annotation.processor.documentation.config.util.Markers; + +final class JavadocRepository { + + private final Map javadocElementsMap; + + JavadocRepository(Map javadocElementsMap) { + this.javadocElementsMap = javadocElementsMap; + } + + public Optional getElement(String className, String elementName) { + return Optional.ofNullable(javadocElementsMap.get(className + Markers.DOT + elementName)); + } +} diff --git a/devtools/config-doc-maven-plugin/src/main/resources/META-INF/m2e/lifecycle-mapping-metadata.xml b/devtools/config-doc-maven-plugin/src/main/resources/META-INF/m2e/lifecycle-mapping-metadata.xml new file mode 100644 index 0000000000000..289acc962dd0e --- /dev/null +++ b/devtools/config-doc-maven-plugin/src/main/resources/META-INF/m2e/lifecycle-mapping-metadata.xml @@ -0,0 +1,17 @@ + + + + + + generate-asciidoctor + + + + + true + false + + + + + \ No newline at end of file diff --git a/devtools/config-doc-maven-plugin/src/main/resources/META-INF/plexus/components.xml b/devtools/config-doc-maven-plugin/src/main/resources/META-INF/plexus/components.xml new file mode 100644 index 0000000000000..615f650ef1fa4 --- /dev/null +++ b/devtools/config-doc-maven-plugin/src/main/resources/META-INF/plexus/components.xml @@ -0,0 +1,20 @@ + + + + org.apache.maven.lifecycle.Lifecycle + org.apache.maven.lifecycle.Lifecycle + quarkus-config-doc + + quarkus-config-doc + + my-plugin-not-used-phase + + + + io.quarkus:quarkus-config-doc-maven-plugin:${project.version}:generate-asciidoc + + + + + + diff --git a/devtools/config-doc-maven-plugin/src/main/resources/templates/configReference.qute.adoc b/devtools/config-doc-maven-plugin/src/main/resources/templates/configReference.qute.adoc new file mode 100644 index 0000000000000..43c74456ec990 --- /dev/null +++ b/devtools/config-doc-maven-plugin/src/main/resources/templates/configReference.qute.adoc @@ -0,0 +1,31 @@ +:summaryTableId: {summaryTableId} +[.configuration-legend] +icon:lock[title=Fixed at build time] Configuration property fixed at build time - All other configuration properties are overridable at runtime +[.configuration-reference{#if searchable}.searchable{/if}, cols="80,.^10,.^10"] +|=== + +h|Configuration property +h|Type +h|Default + +{#for item in configRoot.items} +{#if !item.deprecated} +{#if item.isSection} +{#configSection configSection=item /} + +{#else} +{#configProperty configProperty=item /} + +{/if} +{/if} +{/for} +|=== + +{#if includeDurationNote} +{#durationNote summaryTableId /} +{/if} +{#if includeMemorySizeNote} +{#memorySizeNote summaryTableId /} +{/if} + +:!summaryTableId: \ No newline at end of file diff --git a/devtools/config-doc-maven-plugin/src/main/resources/templates/tags/configProperty.qute.adoc b/devtools/config-doc-maven-plugin/src/main/resources/templates/tags/configProperty.qute.adoc new file mode 100644 index 0000000000000..39ccdcb83cda5 --- /dev/null +++ b/devtools/config-doc-maven-plugin/src/main/resources/templates/tags/configProperty.qute.adoc @@ -0,0 +1,15 @@ +{#let anchor = configProperty.path.toAnchor} +a|{#if configProperty.phase.fixedAtBuildTime}icon:lock[title=Fixed at build time]{/if} [[{configProperty.path.toAnchor}]]link:#{anchor}[`{configProperty.path}`] +{#for additionalPath in configProperty.additionalPaths} + +link:#{anchor}[`{additionalPath}`] +{/for} + +[.description] +-- +{configProperty.description.escapeCellContent.or("")} +{#envVar configProperty /} +-- +{#if configProperty.enum}a{/if}|{configProperty.typeDescription} +|{#if configProperty.defaultValue}`{configProperty.defaultValue.escapeCellContent}`{#else if !configProperty.optional}required icon:exclamation-circle[title=Configuration property is required]{/if} +{/let} diff --git a/devtools/config-doc-maven-plugin/src/main/resources/templates/tags/configSection.qute.adoc b/devtools/config-doc-maven-plugin/src/main/resources/templates/tags/configSection.qute.adoc new file mode 100644 index 0000000000000..5c0467b831b9e --- /dev/null +++ b/devtools/config-doc-maven-plugin/src/main/resources/templates/tags/configSection.qute.adoc @@ -0,0 +1,17 @@ +{#let anchor = configSection.path.toAnchor} +h|[[%s]]link:#%s[{configSection.title.escapeCellContent}] +h|Type +h|Default +{/let} + +{#for item in configSection.items} +{#if !item.deprecated} +{#if item.isSection} +{#configSection configSection=item /} + +{#else} +{#configProperty configProperty=item /} + +{/if} +{/if} +{/for} \ No newline at end of file diff --git a/devtools/config-doc-maven-plugin/src/main/resources/templates/tags/durationNote.qute.adoc b/devtools/config-doc-maven-plugin/src/main/resources/templates/tags/durationNote.qute.adoc new file mode 100644 index 0000000000000..b4c50b2eed884 --- /dev/null +++ b/devtools/config-doc-maven-plugin/src/main/resources/templates/tags/durationNote.qute.adoc @@ -0,0 +1,19 @@ +ifndef::no-duration-note[] +[NOTE] +[id=duration-note-anchor-{summaryTableId}] +.About the Duration format +==== +To write duration values, use the standard `java.time.Duration` format. +See the link:https://docs.oracle.com/en/java/javase/17/docs/api/java.base/java/time/Duration.html#parse(java.lang.CharSequence)[Duration#parse() Java API documentation] for more information. + +You can also use a simplified format, starting with a number: + +* If the value is only a number, it represents time in seconds.\n +* If the value is a number followed by `ms`, it represents time in milliseconds.\n + +In other cases, the simplified format is translated to the `java.time.Duration` format for parsing: + +* If the value is a number followed by `h`, `m`, or `s`, it is prefixed with `PT`. +* If the value is a number followed by `d`, it is prefixed with `P`. +==== +endif::no-duration-note[] diff --git a/devtools/config-doc-maven-plugin/src/main/resources/templates/tags/envVar.qute.adoc b/devtools/config-doc-maven-plugin/src/main/resources/templates/tags/envVar.qute.adoc new file mode 100644 index 0000000000000..d595945bcdc94 --- /dev/null +++ b/devtools/config-doc-maven-plugin/src/main/resources/templates/tags/envVar.qute.adoc @@ -0,0 +1,6 @@ +ifdef::add-copy-button-to-env-var[] +Environment variable: env_var_with_copy_button:+++{configProperty.environmentVariable}+++[] +endif::add-copy-button-to-env-var[] +ifndef::add-copy-button-to-env-var[] +Environment variable: `+++{configProperty.environmentVariable}+++` +endif::add-copy-button-to-env-var[] diff --git a/devtools/config-doc-maven-plugin/src/main/resources/templates/tags/memorySizeNote.qute.adoc b/devtools/config-doc-maven-plugin/src/main/resources/templates/tags/memorySizeNote.qute.adoc new file mode 100644 index 0000000000000..29fdff0eb6c07 --- /dev/null +++ b/devtools/config-doc-maven-plugin/src/main/resources/templates/tags/memorySizeNote.qute.adoc @@ -0,0 +1,10 @@ +ifndef::no-memory-size-note[] +[NOTE] +[id=memory-size-note-anchor-{summaryTableId}] +.About the MemorySize format +==== +A size configuration option recognizes strings in this format (shown as a regular expression): `[0-9]+[KkMmGgTtPpEeZzYy]?`. + +If no suffix is given, assume bytes. +==== +ifndef::no-memory-size-note[] diff --git a/devtools/pom.xml b/devtools/pom.xml index a01063c3f5c10..b1cd04e9e4a38 100644 --- a/devtools/pom.xml +++ b/devtools/pom.xml @@ -26,5 +26,6 @@ maven gradle cli + config-doc-maven-plugin From 6d240d36b1766fe1d429e306d56231f448350a81 Mon Sep 17 00:00:00 2001 From: Guillaume Smet Date: Sat, 3 Aug 2024 13:22:03 +0200 Subject: [PATCH 13/43] RESTEasy Classic REST Client Config is now @ConfigMapping --- extensions/resteasy-classic/rest-client-config/runtime/pom.xml | 3 --- 1 file changed, 3 deletions(-) diff --git a/extensions/resteasy-classic/rest-client-config/runtime/pom.xml b/extensions/resteasy-classic/rest-client-config/runtime/pom.xml index bc909d47741e6..1a31afbc85808 100644 --- a/extensions/resteasy-classic/rest-client-config/runtime/pom.xml +++ b/extensions/resteasy-classic/rest-client-config/runtime/pom.xml @@ -67,9 +67,6 @@ ${project.version} - - -AlegacyConfigRoot=true - From 96ae31e4ba09c77f00f768183d81ce1e38d82285 Mon Sep 17 00:00:00 2001 From: Guillaume Smet Date: Sat, 3 Aug 2024 13:23:25 +0200 Subject: [PATCH 14/43] Generate config doc with the new Maven plugin --- docs/pom.xml | 8 +++++++- 1 file changed, 7 insertions(+), 1 deletion(-) diff --git a/docs/pom.xml b/docs/pom.xml index b6f31472dc38e..7a4e0effb9955 100644 --- a/docs/pom.xml +++ b/docs/pom.xml @@ -34,7 +34,7 @@ https://quarkus.io https://github.com/quarkusio/quarkus https://github.com/quarkusio/quarkus-quickstarts - ${project.basedir}/../target/asciidoc/generated + ${project.build.directory}/quarkus-config-doc ${generated-dir}/examples docker.io/jdkato/vale:v2.15.5 @@ -3176,6 +3176,12 @@ + + io.quarkus + quarkus-config-doc-maven-plugin + ${project.version} + true + org.apache.maven.plugins maven-surefire-plugin From 24076faf01202c53a441cf1e48484f2b942fc86e Mon Sep 17 00:00:00 2001 From: Guillaume Smet Date: Sat, 3 Aug 2024 13:23:50 +0200 Subject: [PATCH 15/43] Point guides to the new config doc --- .../_templates/template-reference.adoc | 2 +- docs/src/main/asciidoc/all-builditems.adoc | 2 +- docs/src/main/asciidoc/all-config.adoc | 2 +- docs/src/main/asciidoc/amqp-reference.adoc | 4 +-- .../main/asciidoc/building-native-image.adoc | 2 +- .../asciidoc/cache-infinispan-reference.adoc | 2 +- .../main/asciidoc/cache-redis-reference.adoc | 2 +- docs/src/main/asciidoc/cache.adoc | 4 +-- docs/src/main/asciidoc/cdi-reference.adoc | 2 +- .../asciidoc/centralized-log-management.adoc | 2 +- .../asciidoc/class-loading-reference.adoc | 2 +- docs/src/main/asciidoc/config-reference.adoc | 2 +- docs/src/main/asciidoc/container-image.adoc | 10 +++---- .../src/main/asciidoc/continuous-testing.adoc | 2 +- .../main/asciidoc/databases-dev-services.adoc | 2 +- docs/src/main/asciidoc/datasource.adoc | 16 ++++++------ .../asciidoc/deploying-to-kubernetes.adoc | 8 +++--- .../main/asciidoc/deploying-to-openshift.adoc | 2 +- docs/src/main/asciidoc/dev-services.adoc | 24 ++++++++--------- .../asciidoc/elasticsearch-dev-services.adoc | 2 +- docs/src/main/asciidoc/elasticsearch.adoc | 2 +- docs/src/main/asciidoc/flyway.adoc | 4 +-- docs/src/main/asciidoc/getting-started.adoc | 2 +- docs/src/main/asciidoc/gradle-tooling.adoc | 2 +- .../asciidoc/grpc-service-consumption.adoc | 4 +-- .../asciidoc/grpc-service-implementation.adoc | 2 +- docs/src/main/asciidoc/grpc-xds.adoc | 4 +-- docs/src/main/asciidoc/hibernate-orm.adoc | 2 +- .../src/main/asciidoc/hibernate-reactive.adoc | 2 +- .../hibernate-search-orm-elasticsearch.adoc | 4 +-- ...rnate-search-standalone-elasticsearch.adoc | 2 +- docs/src/main/asciidoc/http-reference.adoc | 10 +++---- .../asciidoc/infinispan-client-reference.adoc | 2 +- .../asciidoc/infinispan-dev-services.adoc | 2 +- docs/src/main/asciidoc/jfr.adoc | 2 +- docs/src/main/asciidoc/kafka-streams.adoc | 2 +- docs/src/main/asciidoc/kubernetes-client.adoc | 2 +- docs/src/main/asciidoc/kubernetes-config.adoc | 2 +- docs/src/main/asciidoc/liquibase-mongodb.adoc | 2 +- docs/src/main/asciidoc/liquibase.adoc | 2 +- .../asciidoc/load-shedding-reference.adoc | 2 +- docs/src/main/asciidoc/logging.adoc | 6 ++--- docs/src/main/asciidoc/mailer-reference.adoc | 2 +- .../management-interface-reference.adoc | 4 +-- docs/src/main/asciidoc/maven-tooling.adoc | 6 ++--- docs/src/main/asciidoc/mongodb.adoc | 2 +- docs/src/main/asciidoc/openapi-swaggerui.adoc | 4 +-- docs/src/main/asciidoc/opentelemetry.adoc | 2 +- docs/src/main/asciidoc/picocli.adoc | 2 +- .../main/asciidoc/quarkus-maven-plugin.adoc | 2 +- docs/src/main/asciidoc/quartz.adoc | 2 +- docs/src/main/asciidoc/qute-reference.adoc | 8 +++--- docs/src/main/asciidoc/qute.adoc | 2 +- .../src/main/asciidoc/rabbitmq-reference.adoc | 2 +- .../main/asciidoc/reactive-sql-clients.adoc | 14 +++++----- .../src/main/asciidoc/redis-dev-services.adoc | 2 +- docs/src/main/asciidoc/redis-reference.adoc | 2 +- docs/src/main/asciidoc/resteasy.adoc | 2 +- .../main/asciidoc/scheduler-reference.adoc | 12 ++++----- docs/src/main/asciidoc/scheduler.adoc | 2 +- .../security-authentication-mechanisms.adoc | 4 +-- docs/src/main/asciidoc/security-cors.adoc | 2 +- .../asciidoc/security-csrf-prevention.adoc | 2 +- docs/src/main/asciidoc/security-jdbc.adoc | 4 +-- docs/src/main/asciidoc/security-jpa.adoc | 2 +- docs/src/main/asciidoc/security-jwt.adoc | 2 +- .../security-keycloak-admin-client.adoc | 2 +- .../security-keycloak-authorization.adoc | 2 +- docs/src/main/asciidoc/security-ldap.adoc | 2 +- docs/src/main/asciidoc/security-oauth2.adoc | 2 +- ...dc-configuration-properties-reference.adoc | 2 +- ...urity-openid-connect-client-reference.adoc | 4 +-- .../main/asciidoc/security-properties.adoc | 2 +- docs/src/main/asciidoc/security-webauthn.adoc | 6 ++--- docs/src/main/asciidoc/smallrye-graphql.adoc | 2 +- docs/src/main/asciidoc/smallrye-health.adoc | 2 +- docs/src/main/asciidoc/smallrye-metrics.adoc | 2 +- .../asciidoc/spring-cloud-config-client.adoc | 4 +-- docs/src/main/asciidoc/spring-di.adoc | 2 +- docs/src/main/asciidoc/stork-reference.adoc | 2 +- .../main/asciidoc/telemetry-micrometer.adoc | 2 +- .../main/asciidoc/tests-with-coverage.adoc | 2 +- .../main/asciidoc/tls-registry-reference.adoc | 2 +- docs/src/main/asciidoc/validation.adoc | 2 +- docs/src/main/asciidoc/vertx-reference.adoc | 6 ++--- .../asciidoc/websockets-next-reference.adoc | 26 +++++++++---------- .../src/main/asciidoc/writing-extensions.adoc | 6 ++--- 87 files changed, 164 insertions(+), 164 deletions(-) diff --git a/docs/src/main/asciidoc/_templates/template-reference.adoc b/docs/src/main/asciidoc/_templates/template-reference.adoc index 745e7b24e965b..dd2f1aa2d2878 100644 --- a/docs/src/main/asciidoc/_templates/template-reference.adoc +++ b/docs/src/main/asciidoc/_templates/template-reference.adoc @@ -60,7 +60,7 @@ To create anchors for in-file and cross-file navigation, see the following detai TODO: If this is an extension reference, include the relevant configuration == Configuration Reference -include::{generated-dir}/config/<>.adoc[opts=optional, leveloffset=+1] +include::{generated-dir}/<>.adoc[opts=optional, leveloffset=+1] //// == References diff --git a/docs/src/main/asciidoc/all-builditems.adoc b/docs/src/main/asciidoc/all-builditems.adoc index 02f053116dffd..dfd5cb014be96 100644 --- a/docs/src/main/asciidoc/all-builditems.adoc +++ b/docs/src/main/asciidoc/all-builditems.adoc @@ -15,4 +15,4 @@ Here you can find a list of Build Items and the extension that provides them. icon:building[title=Non-instantiatable Build Item] Build item can't be instantiated directly, but can be extended/inherited from -include::{generated-dir}/config/quarkus-all-build-items.adoc[opts=optional] +include::{generated-dir}/quarkus-all-build-items.adoc[opts=optional] diff --git a/docs/src/main/asciidoc/all-config.adoc b/docs/src/main/asciidoc/all-config.adoc index 4a97e523641ae..3cf03166362a7 100644 --- a/docs/src/main/asciidoc/all-config.adoc +++ b/docs/src/main/asciidoc/all-config.adoc @@ -11,4 +11,4 @@ include::_attributes.adoc[] :categories: core :summary: List all the configuration properties per extensions -include::{generated-dir}/config/quarkus-all-config.adoc[opts=optional] +include::{generated-dir}/quarkus-all-config.adoc[opts=optional] diff --git a/docs/src/main/asciidoc/amqp-reference.adoc b/docs/src/main/asciidoc/amqp-reference.adoc index 2317d75e16b6e..5394d249fa2ac 100644 --- a/docs/src/main/asciidoc/amqp-reference.adoc +++ b/docs/src/main/asciidoc/amqp-reference.adoc @@ -464,7 +464,7 @@ mp.messaging.incoming.prices.client-options-name=my-named-options ---- If you experience frequent disconnections from the broker, the `AmqpClientOptions` can also be used to set a heartbeat if you need to keep the AMQP connection permanently. -Some brokers might terminate the AMQP connection after a certain idle timeout. +Some brokers might terminate the AMQP connection after a certain idle timeout. You can provide a heartbeat value which will be used by the Vert.x proton client to advertise the idle timeout when opening transport to a remote peer. [source, java] @@ -549,7 +549,7 @@ For more information on sending Cloud Events, see https://smallrye.io/smallrye-r === Quarkus specific configuration -include::{generated-dir}/config/quarkus-smallrye-reactivemessaging-amqp.adoc[opts=optional, leveloffset=+1] +include::{generated-dir}/quarkus-smallrye-reactivemessaging-amqp.adoc[opts=optional, leveloffset=+1] === Incoming channel configuration diff --git a/docs/src/main/asciidoc/building-native-image.adoc b/docs/src/main/asciidoc/building-native-image.adoc index e73e092d1ae0c..0cf3df7b5b83f 100644 --- a/docs/src/main/asciidoc/building-native-image.adoc +++ b/docs/src/main/asciidoc/building-native-image.adoc @@ -942,7 +942,7 @@ These are provided in `application.properties` the same as any other config prop The properties are shown below: -include::{generated-dir}/config/quarkus-native-pkg-native-config.adoc[opts=optional] +include::{generated-dir}/quarkus-native-pkg-native-config.adoc[opts=optional] == What's next? diff --git a/docs/src/main/asciidoc/cache-infinispan-reference.adoc b/docs/src/main/asciidoc/cache-infinispan-reference.adoc index b743443dc6dd3..0216fc2c426f3 100644 --- a/docs/src/main/asciidoc/cache-infinispan-reference.adoc +++ b/docs/src/main/asciidoc/cache-infinispan-reference.adoc @@ -209,4 +209,4 @@ the cache. quarkus.cache.infinispan.my-cache.max-idle=100s ---- -include::{generated-dir}/config/quarkus-cache-infinispan.adoc[opts=optional, leveloffset=+1] \ No newline at end of file +include::{generated-dir}/quarkus-cache-infinispan.adoc[opts=optional, leveloffset=+1] \ No newline at end of file diff --git a/docs/src/main/asciidoc/cache-redis-reference.adoc b/docs/src/main/asciidoc/cache-redis-reference.adoc index 9adb78fb05047..e6c71e979b413 100644 --- a/docs/src/main/asciidoc/cache-redis-reference.adoc +++ b/docs/src/main/asciidoc/cache-redis-reference.adoc @@ -114,7 +114,7 @@ You would need to invalidate the values using the `@CacheInvalidateAll` or `@Cac The following table lists the supported properties: -include::{generated-dir}/config/quarkus-cache-redis.adoc[opts=optional, leveloffset=+1] +include::{generated-dir}/quarkus-cache-redis.adoc[opts=optional, leveloffset=+1] == Configure the Redis key diff --git a/docs/src/main/asciidoc/cache.adoc b/docs/src/main/asciidoc/cache.adoc index bced0649bd226..5e519c0134b39 100644 --- a/docs/src/main/asciidoc/cache.adoc +++ b/docs/src/main/asciidoc/cache.adoc @@ -395,7 +395,7 @@ The class must either represent a CDI bean or declare a public no-args construct If it represents a CDI bean, then the key generator will be injected during the cache key computation. Otherwise, a new instance of the key generator will be created using its default constructor for each cache key computation. -In case of CDI, there must be exactly one bean that has the class in its set of bean types, otherwise the build fails. +In case of CDI, there must be exactly one bean that has the class in its set of bean types, otherwise the build fails. The context associated with the scope of the bean must be active when the `CacheKeyGenerator#generate()` method is invoked. If the scope is `@Dependent` then the bean instance is destroyed when the `CacheKeyGenerator#generate()` method completes. @@ -747,7 +747,7 @@ properties in the `application.properties` file. By default, caches do not perfo You need to replace `cache-name` in all the following properties with the real name of the cache you want to configure. ==== -include::{generated-dir}/config/quarkus-cache-cache-config.adoc[opts=optional, leveloffset=+1] +include::{generated-dir}/quarkus-cache-cache-config.adoc[opts=optional, leveloffset=+1] Here's what your cache configuration could look like: diff --git a/docs/src/main/asciidoc/cdi-reference.adoc b/docs/src/main/asciidoc/cdi-reference.adoc index 41161c3799adf..b43240d289b9b 100644 --- a/docs/src/main/asciidoc/cdi-reference.adoc +++ b/docs/src/main/asciidoc/cdi-reference.adoc @@ -1382,4 +1382,4 @@ The "strictness" of the strict mode (the set of additional validations and the s [[arc-configuration-reference]] == ArC Configuration Reference -include::{generated-dir}/config/quarkus-arc.adoc[leveloffset=+1, opts=optional] +include::{generated-dir}/quarkus-arc.adoc[leveloffset=+1, opts=optional] diff --git a/docs/src/main/asciidoc/centralized-log-management.adoc b/docs/src/main/asciidoc/centralized-log-management.adoc index 663df993637c1..f20cfeedaf86b 100644 --- a/docs/src/main/asciidoc/centralized-log-management.adoc +++ b/docs/src/main/asciidoc/centralized-log-management.adoc @@ -450,7 +450,7 @@ See the following documentation for Graylog (but the same issue exists for the o Configuration is done through the usual `application.properties` file. -include::{generated-dir}/config/quarkus-logging-gelf.adoc[opts=optional, leveloffset=+1] +include::{generated-dir}/quarkus-logging-gelf.adoc[opts=optional, leveloffset=+1] This extension uses the `logstash-gelf` library that allow more configuration options via system properties, you can access its documentation here: https://logging.paluch.biz/ . diff --git a/docs/src/main/asciidoc/class-loading-reference.adoc b/docs/src/main/asciidoc/class-loading-reference.adoc index 6b740d078c24c..611979ca3d262 100644 --- a/docs/src/main/asciidoc/class-loading-reference.adoc +++ b/docs/src/main/asciidoc/class-loading-reference.adoc @@ -192,7 +192,7 @@ Note that class loading config is different to normal config, in that it does no (as it is needed too early), so only supports `application.properties`. The following options are supported. -include::{generated-dir}/config/quarkus-class-loading-configuration-class-loading-config.adoc[opts=optional, leveloffset=+1] +include::{generated-dir}/quarkus-class-loading-configuration-class-loading-config.adoc[opts=optional, leveloffset=+1] == Hiding/Removing classes and resources from dependencies diff --git a/docs/src/main/asciidoc/config-reference.adoc b/docs/src/main/asciidoc/config-reference.adoc index 213eac8b77a95..6071eea39109b 100644 --- a/docs/src/main/asciidoc/config-reference.adoc +++ b/docs/src/main/asciidoc/config-reference.adoc @@ -847,4 +847,4 @@ link:https://smallrye.io/smallrye-config/Main[SmallRye Config documentation]. == Configuration Reference -include::{generated-dir}/config/quarkus-config-config.adoc[opts=optional, leveloffset=+1] +include::{generated-dir}/quarkus-config-config.adoc[opts=optional, leveloffset=+1] diff --git a/docs/src/main/asciidoc/container-image.adoc b/docs/src/main/asciidoc/container-image.adoc index 4865f251f0461..344ca3001807d 100644 --- a/docs/src/main/asciidoc/container-image.adoc +++ b/docs/src/main/asciidoc/container-image.adoc @@ -250,7 +250,7 @@ The following properties can be used to customize the container image build proc === Container Image Options -include::{generated-dir}/config/quarkus-container-image.adoc[opts=optional, leveloffset=+1] +include::{generated-dir}/quarkus-container-image.adoc[opts=optional, leveloffset=+1] ==== Using CI Environments @@ -272,24 +272,24 @@ NOTE: See xref:config-reference.adoc#with-environment-variables[this] for more i In addition to the generic container image options, the `container-image-jib` also provides the following options: -include::{generated-dir}/config/quarkus-container-image-jib.adoc[opts=optional, leveloffset=+1] +include::{generated-dir}/quarkus-container-image-jib.adoc[opts=optional, leveloffset=+1] [[DockerOptions]] === Docker Options In addition to the generic container image options, the `container-image-docker` also provides the following options: -include::{generated-dir}/config/quarkus-container-image-docker.adoc[opts=optional, leveloffset=+1] +include::{generated-dir}/quarkus-container-image-docker.adoc[opts=optional, leveloffset=+1] [[PodmanOptions]] === Podman Options In addition to the generic container image options, the `container-image-podman` also provides the following options: -include::{generated-dir}/config/quarkus-container-image-podman.adoc[opts=optional, leveloffset=+1] +include::{generated-dir}/quarkus-container-image-podman.adoc[opts=optional, leveloffset=+1] === OpenShift Options In addition to the generic container image options, the `container-image-openshift` also provides the following options: -include::{generated-dir}/config/quarkus-container-image-openshift.adoc[opts=optional, leveloffset=+1] +include::{generated-dir}/quarkus-container-image-openshift.adoc[opts=optional, leveloffset=+1] diff --git a/docs/src/main/asciidoc/continuous-testing.adoc b/docs/src/main/asciidoc/continuous-testing.adoc index ef74b9c900785..6fb104c1557ae 100644 --- a/docs/src/main/asciidoc/continuous-testing.adoc +++ b/docs/src/main/asciidoc/continuous-testing.adoc @@ -155,5 +155,5 @@ This is enabled by default, and can be disabled via `quarkus.test.only-test-appl Continuous testing supports multiple configuration options that can be used to limit the tests that are run, and to control the output. The configuration properties are shown below: -include::{generated-dir}/config/quarkus-test-dev-testing-test-config.adoc[opts=optional, leveloffset=+2] +include::{generated-dir}/quarkus-test-dev-testing-test-config.adoc[opts=optional, leveloffset=+2] diff --git a/docs/src/main/asciidoc/databases-dev-services.adoc b/docs/src/main/asciidoc/databases-dev-services.adoc index e8a640c5dd1fe..18c60da6bc4fd 100644 --- a/docs/src/main/asciidoc/databases-dev-services.adoc +++ b/docs/src/main/asciidoc/databases-dev-services.adoc @@ -288,4 +288,4 @@ Dev Services have been started. Dev Services for Databases support the following configuration options: -include::{generated-dir}/config/quarkus-datasource-config-group-dev-services-build-time-config.adoc[opts=optional,leveloffset=+1] +include::{generated-dir}/quarkus-datasource-config-group-dev-services-build-time-config.adoc[opts=optional,leveloffset=+1] diff --git a/docs/src/main/asciidoc/datasource.adoc b/docs/src/main/asciidoc/datasource.adoc index 46d9f291a6692..1a4e22bb44b58 100644 --- a/docs/src/main/asciidoc/datasource.adoc +++ b/docs/src/main/asciidoc/datasource.adoc @@ -733,12 +733,12 @@ endif::no-deprecated-test-resource[] [[configuration-reference]] === Common datasource configuration reference -include::{generated-dir}/config/quarkus-datasource.adoc[opts=optional, leveloffset=+1] +include::{generated-dir}/quarkus-datasource.adoc[opts=optional, leveloffset=+1] [[jdbc-configuration]] === JDBC configuration reference -include::{generated-dir}/config/quarkus-agroal.adoc[opts=optional, leveloffset=+1] +include::{generated-dir}/quarkus-agroal.adoc[opts=optional, leveloffset=+1] [[jdbc-url]] === JDBC URL reference @@ -934,29 +934,29 @@ This automatic resolution is applicable in most cases so that driver configurati [[reactive-configuration]] === Reactive datasource configuration reference -include::{generated-dir}/config/quarkus-reactive-datasource.adoc[opts=optional, leveloffset=+1] +include::{generated-dir}/quarkus-reactive-datasource.adoc[opts=optional, leveloffset=+1] ifndef::no-quarkus-reactive-db2-client[] ==== Reactive DB2 configuration -include::{generated-dir}/config/quarkus-reactive-db2-client.adoc[opts=optional, leveloffset=+1] +include::{generated-dir}/quarkus-reactive-db2-client.adoc[opts=optional, leveloffset=+1] endif::no-quarkus-reactive-db2-client[] ==== Reactive MariaDB/MySQL specific configuration -include::{generated-dir}/config/quarkus-reactive-mysql-client.adoc[opts=optional, leveloffset=+1] +include::{generated-dir}/quarkus-reactive-mysql-client.adoc[opts=optional, leveloffset=+1] ==== Reactive Microsoft SQL server-specific configuration -include::{generated-dir}/config/quarkus-reactive-mssql-client.adoc[opts=optional, leveloffset=+1] +include::{generated-dir}/quarkus-reactive-mssql-client.adoc[opts=optional, leveloffset=+1] ==== Reactive Oracle-specific configuration -include::{generated-dir}/config/quarkus-reactive-oracle-client.adoc[opts=optional, leveloffset=+1] +include::{generated-dir}/quarkus-reactive-oracle-client.adoc[opts=optional, leveloffset=+1] ==== Reactive PostgreSQL-specific configuration -include::{generated-dir}/config/quarkus-reactive-pg-client.adoc[opts=optional, leveloffset=+1] +include::{generated-dir}/quarkus-reactive-pg-client.adoc[opts=optional, leveloffset=+1] [[reactive-url]] diff --git a/docs/src/main/asciidoc/deploying-to-kubernetes.adoc b/docs/src/main/asciidoc/deploying-to-kubernetes.adoc index 52f7f888c8e55..4599053fd31ad 100644 --- a/docs/src/main/asciidoc/deploying-to-kubernetes.adoc +++ b/docs/src/main/asciidoc/deploying-to-kubernetes.adoc @@ -1091,7 +1091,7 @@ The table below describe all the available configuration options. .Kubernetes :no-duration-note: true -include::{generated-dir}/config/quarkus-kubernetes-kubernetes-config.adoc[opts=optional, leveloffset=+1] +include::{generated-dir}/quarkus-kubernetes-kubernetes-config.adoc[opts=optional, leveloffset=+1] Properties that use non-standard types, can be referenced by expanding the property. For example to define a `kubernetes-readiness-probe` which is of type `Probe`: @@ -1119,7 +1119,7 @@ quarkus.kubernetes-client.trust-certs=true The full list of the Kubernetes client configuration properties is provided below. :no-duration-note: true -include::{generated-dir}/config/quarkus-kubernetes-client.adoc[opts=optional, leveloffset=+1] +include::{generated-dir}/quarkus-kubernetes-client.adoc[opts=optional, leveloffset=+1] [[openshift]] === OpenShift @@ -1230,7 +1230,7 @@ The OpenShift resources can be customized in a similar approach with Kubernetes. .OpenShift :no-duration-note: true -include::{generated-dir}/config/quarkus-openshift-openshift-config.adoc[opts=optional, leveloffset=+1] +include::{generated-dir}/quarkus-openshift-openshift-config.adoc[opts=optional, leveloffset=+1] [[knative]] === Knative @@ -1295,7 +1295,7 @@ The generated service can be customized using the following properties: .Knative :no-duration-note: true -include::{generated-dir}/config/quarkus-knative-knative-config.adoc[opts=optional, leveloffset=+1] +include::{generated-dir}/quarkus-knative-knative-config.adoc[opts=optional, leveloffset=+1] === Deployment targets diff --git a/docs/src/main/asciidoc/deploying-to-openshift.adoc b/docs/src/main/asciidoc/deploying-to-openshift.adoc index b4500631fa757..fd0d7ffa44494 100644 --- a/docs/src/main/asciidoc/deploying-to-openshift.adoc +++ b/docs/src/main/asciidoc/deploying-to-openshift.adoc @@ -523,4 +523,4 @@ The application can then be deployed to OpenShift Serverless by enabling the sta == Configuration Reference -include::{generated-dir}/config/quarkus-openshift-openshift-config.adoc[opts=optional, leveloffset=+1] +include::{generated-dir}/quarkus-openshift-openshift-config.adoc[opts=optional, leveloffset=+1] diff --git a/docs/src/main/asciidoc/dev-services.adoc b/docs/src/main/asciidoc/dev-services.adoc index cc0930ecc0c62..2f4aabc91d4da 100644 --- a/docs/src/main/asciidoc/dev-services.adoc +++ b/docs/src/main/asciidoc/dev-services.adoc @@ -61,7 +61,7 @@ The AMQP Dev Service will be enabled when the `quarkus-messaging-amqp` extension the broker address has not been explicitly configured. More information can be found in the xref:amqp-dev-services.adoc[AMQP Dev Services Guide]. -include::{generated-dir}/config/quarkus-smallrye-reactivemessaging-amqp-config-group-amqp-dev-services-build-time-config.adoc[opts=optional, leveloffset=+1] +include::{generated-dir}/quarkus-smallrye-reactivemessaging-amqp-config-group-amqp-dev-services-build-time-config.adoc[opts=optional, leveloffset=+1] === Apicurio Registry @@ -69,7 +69,7 @@ The Apicurio Dev Service will be enabled when the `quarkus-apicurio-registry-avr address has not been explicitly configured. More information can be found in the xref:apicurio-registry-dev-services.adoc[Apicurio Registry Dev Services Guide]. -include::{generated-dir}/config/quarkus-apicurio-registry-devservices-apicurio-registry-devservice-apicurio-registry-dev-services-build-time-config.adoc[opts=optional, leveloffset=+1] +include::{generated-dir}/quarkus-apicurio-registry-devservices-apicurio-registry-devservice-apicurio-registry-dev-services-build-time-config.adoc[opts=optional, leveloffset=+1] === Databases @@ -87,7 +87,7 @@ after each run, and can be reused. N.B. if you opt in for this feature, Quarkus will not reset the state of the database between runs unless you explicitly configure it to. -include::{generated-dir}/config/quarkus-datasource-config-group-dev-services-build-time-config.adoc[opts=optional, leveloffset=+1] +include::{generated-dir}/quarkus-datasource-config-group-dev-services-build-time-config.adoc[opts=optional, leveloffset=+1] === Kafka @@ -95,7 +95,7 @@ The Kafka Dev Service will be enabled when the `quarkus-kafka-client` extension the broker address has not been explicitly configured. More information can be found in the xref:kafka-dev-services.adoc[Kafka Dev Services Guide]. -include::{generated-dir}/config/quarkus-kafka-client-config-group-kafka-dev-services-build-time-config.adoc[opts=optional, leveloffset=+1] +include::{generated-dir}/quarkus-kafka-client-config-group-kafka-dev-services-build-time-config.adoc[opts=optional, leveloffset=+1] === Keycloak @@ -103,7 +103,7 @@ The Keycloak Dev Service will be enabled when the `quarkus-oidc` extension is pr the server address has not been explicitly configured. More information can be found in the xref:security-openid-connect-dev-services.adoc[OIDC Dev Services Guide]. -include::{generated-dir}/config/quarkus-keycloak-devservices-keycloak-keycloak-build-time-config.adoc[opts=optional, leveloffset=+1] +include::{generated-dir}/quarkus-keycloak-devservices-keycloak-keycloak-build-time-config.adoc[opts=optional, leveloffset=+1] === Kubernetes @@ -111,7 +111,7 @@ The Kubernetes Dev Service will be enabled when `kubernetes-client` extension is the API server address has not been explicitly configured. More information can be found in the xref:kubernetes-dev-services.adoc[Kubernetes Dev Services Guide]. -include::{generated-dir}/config/quarkus-kubernetes-client-config-group-kubernetes-dev-services-build-time-config.adoc[opts=optional, leveloffset=+1] +include::{generated-dir}/quarkus-kubernetes-client-config-group-kubernetes-dev-services-build-time-config.adoc[opts=optional, leveloffset=+1] === MongoDB @@ -119,7 +119,7 @@ The MongoDB Dev Service will be enabled when the `quarkus-mongodb-client` extens the server address has not been explicitly configured. More information can be found in the xref:mongodb-dev-services.adoc[MongoDB Guide]. -include::{generated-dir}/config/quarkus-mongodb-config-group-dev-services-build-time-config.adoc[opts=optional, leveloffset=+1] +include::{generated-dir}/quarkus-mongodb-config-group-dev-services-build-time-config.adoc[opts=optional, leveloffset=+1] === RabbitMQ @@ -127,7 +127,7 @@ The RabbitMQ Dev Service will be enabled when the `quarkus-messaging-rabbitmq` e the broker address has not been explicitly configured. More information can be found in the xref:rabbitmq-dev-services.adoc[RabbitMQ Dev Services Guide]. -include::{generated-dir}/config/quarkus-smallrye-reactivemessaging-rabbitmq-config-group-rabbit-mq-dev-services-build-time-config.adoc[opts=optional, leveloffset=+1] +include::{generated-dir}/quarkus-smallrye-reactivemessaging-rabbitmq-config-group-rabbit-mq-dev-services-build-time-config.adoc[opts=optional, leveloffset=+1] === Pulsar @@ -141,7 +141,7 @@ The Redis Dev Service will be enabled when the `quarkus-redis-client` extension the server address has not been explicitly configured. More information can be found in the xref:redis-dev-services.adoc[Redis Dev Services Guide]. -include::{generated-dir}/config/quarkus-redis-config-group-client-dev-services-config.adoc[opts=optional, leveloffset=+1] +include::{generated-dir}/quarkus-redis-config-group-client-dev-services-config.adoc[opts=optional, leveloffset=+1] === Vault @@ -155,7 +155,7 @@ The Infinispan Dev Service will be enabled when the `quarkus-infinispan-client` the server address has not been explicitly configured. More information can be found in the xref:infinispan-dev-services.adoc[Infinispan Dev Services Guide]. -include::{generated-dir}/config/quarkus-infinispan-client-config-group-infinispan-client-build-time-config-dev-service-configuration.adoc[opts=optional, leveloffset=+1] +include::{generated-dir}/quarkus-infinispan-client-config-group-infinispan-client-build-time-config-dev-service-configuration.adoc[opts=optional, leveloffset=+1] === Elasticsearch @@ -163,7 +163,7 @@ The Elasticsearch Dev Service will be enabled when one of the Elasticsearch base is present in your application, and the server address has not been explicitly configured. More information can be found in the xref:elasticsearch-dev-services.adoc[Elasticsearch Dev Services Guide]. -include::{generated-dir}/config/quarkus-elasticsearch-devservices-elasticsearch-dev-services-build-time-config.adoc[opts=optional, leveloffset=+1] +include::{generated-dir}/quarkus-elasticsearch-devservices-elasticsearch-dev-services-build-time-config.adoc[opts=optional, leveloffset=+1] === Observability @@ -171,7 +171,7 @@ The Observability Dev Services will be enabled when the `quarkus-observability-d there is at least one dev resource on the classpath. More information can be found in the xref:observability-devservices.adoc[Observability Dev Services Guide]. -include::{generated-dir}/config/quarkus-observability-config-observability-configuration.adoc[opts=optional, leveloffset=+1] +include::{generated-dir}/quarkus-observability-config-observability-configuration.adoc[opts=optional, leveloffset=+1] == Dev Services beyond the Quarkus Platform diff --git a/docs/src/main/asciidoc/elasticsearch-dev-services.adoc b/docs/src/main/asciidoc/elasticsearch-dev-services.adoc index 9e025adf12d8a..0740e7c8a11b1 100644 --- a/docs/src/main/asciidoc/elasticsearch-dev-services.adoc +++ b/docs/src/main/asciidoc/elasticsearch-dev-services.adoc @@ -147,4 +147,4 @@ Currently, only the default backend for Hibernate Search Elasticsearch is suppor == Configuration reference -include::{generated-dir}/config/quarkus-elasticsearch-devservices-elasticsearch-dev-services-build-time-config.adoc[opts=optional, leveloffset=+1] +include::{generated-dir}/quarkus-elasticsearch-devservices-elasticsearch-dev-services-build-time-config.adoc[opts=optional, leveloffset=+1] diff --git a/docs/src/main/asciidoc/elasticsearch.adoc b/docs/src/main/asciidoc/elasticsearch.adoc index 6006417da1aa4..aa1cd64136d65 100644 --- a/docs/src/main/asciidoc/elasticsearch.adoc +++ b/docs/src/main/asciidoc/elasticsearch.adoc @@ -481,4 +481,4 @@ Accessing an Elasticsearch cluster from the low level REST client or the Elastic == Configuration Reference -include::{generated-dir}/config/quarkus-elasticsearch-restclient-lowlevel.adoc[opts=optional, leveloffset=+1] +include::{generated-dir}/quarkus-elasticsearch-restclient-lowlevel.adoc[opts=optional, leveloffset=+1] diff --git a/docs/src/main/asciidoc/flyway.adoc b/docs/src/main/asciidoc/flyway.adoc index 0aa4178ef3956..9263a23d39c7a 100644 --- a/docs/src/main/asciidoc/flyway.adoc +++ b/docs/src/main/asciidoc/flyway.adoc @@ -166,7 +166,7 @@ implementation("org.flywaydb:flyway-database-derby") implementation("org.flywaydb:flyway-database-hsqldb") // Informix specific dependencies implementation("org.flywaydb:flyway-database-informix") -// Redshift specific dependencies +// Redshift specific dependencies implementation("org.flywaydb:flyway-database-redshift") // Saphana specific dependencies implementation("org.flywaydb:flyway-database-saphana") @@ -191,7 +191,7 @@ First, you need to add the datasource config to the `{config-file}` file in order to allow Flyway to manage the schema. Also, you can customize the Flyway behaviour by using the following properties: -include::{generated-dir}/config/quarkus-flyway.adoc[opts=optional, leveloffset=+1] +include::{generated-dir}/quarkus-flyway.adoc[opts=optional, leveloffset=+1] == Developing with Flyway diff --git a/docs/src/main/asciidoc/getting-started.adoc b/docs/src/main/asciidoc/getting-started.adoc index 7eab23affaae3..f04c4fbf65257 100644 --- a/docs/src/main/asciidoc/getting-started.adoc +++ b/docs/src/main/asciidoc/getting-started.adoc @@ -485,7 +485,7 @@ All CDI beans implementing the `InfoContributor` will be picked up and their dat ==== Configuration Reference -include::{generated-dir}/config/quarkus-info.adoc[opts=optional, leveloffset=+2] +include::{generated-dir}/quarkus-info.adoc[opts=optional, leveloffset=+2] == What's next? diff --git a/docs/src/main/asciidoc/gradle-tooling.adoc b/docs/src/main/asciidoc/gradle-tooling.adoc index 85f1531b3ca8b..551ce121b4cf5 100644 --- a/docs/src/main/asciidoc/gradle-tooling.adoc +++ b/docs/src/main/asciidoc/gradle-tooling.adoc @@ -313,7 +313,7 @@ app. All the config options are shown below: -include::{generated-dir}/config/quarkus-live-reload-live-reload-config.adoc[opts=optional, leveloffset=+1] +include::{generated-dir}/quarkus-live-reload-live-reload-config.adoc[opts=optional, leveloffset=+1] == Debugging diff --git a/docs/src/main/asciidoc/grpc-service-consumption.adoc b/docs/src/main/asciidoc/grpc-service-consumption.adoc index 5fb6f420708d6..cb6849e540ca2 100644 --- a/docs/src/main/asciidoc/grpc-service-consumption.adoc +++ b/docs/src/main/asciidoc/grpc-service-consumption.adoc @@ -204,7 +204,7 @@ public class StreamingEndpoint { For each gRPC service you inject in your application, you can configure the following attributes: -include::{generated-dir}/config/quarkus-grpc-config-group-config-grpc-client-configuration.adoc[opts=optional, leveloffset=+1] +include::{generated-dir}/quarkus-grpc-config-group-config-grpc-client-configuration.adoc[opts=optional, leveloffset=+1] The `client-name` is the name set in the `@GrpcClient` or derived from the injection point if not explicitly defined. @@ -469,7 +469,7 @@ public class HelloExceptionHandlerProvider implements ExceptionHandlerProvider { By default, when starting the application in dev mode, a gRPC server is started, even if no services are configured. You can configure the gRPC extension's dev mode behavior using the following properties. -include::{generated-dir}/config/quarkus-grpc-config-group-grpc-dev-mode-config.adoc[opts=optional, leveloffset=+1] +include::{generated-dir}/quarkus-grpc-config-group-grpc-dev-mode-config.adoc[opts=optional, leveloffset=+1] == Inject mock clients diff --git a/docs/src/main/asciidoc/grpc-service-implementation.adoc b/docs/src/main/asciidoc/grpc-service-implementation.adoc index f84fe5409470f..f91e271c6e78d 100644 --- a/docs/src/main/asciidoc/grpc-service-implementation.adoc +++ b/docs/src/main/asciidoc/grpc-service-implementation.adoc @@ -215,7 +215,7 @@ If you wish to scale your server, you can set the number of server instances by == Server Configuration -include::{generated-dir}/config/quarkus-grpc-config-group-config-grpc-server-configuration.adoc[opts=optional, leveloffset=+1] +include::{generated-dir}/quarkus-grpc-config-group-config-grpc-server-configuration.adoc[opts=optional, leveloffset=+1] IMPORTANT: When you disable `quarkus.grpc.server.use-separate-server`, you are then using the new Vert.x gRPC server implementation which uses the existing HTTP server. Which means that the server port is now `8080` (or the port configured with `quarkus.http.port`). diff --git a/docs/src/main/asciidoc/grpc-xds.adoc b/docs/src/main/asciidoc/grpc-xds.adoc index da28d6f1d45fd..e7beeae917f4c 100644 --- a/docs/src/main/asciidoc/grpc-xds.adoc +++ b/docs/src/main/asciidoc/grpc-xds.adoc @@ -38,7 +38,7 @@ NOTE: This transitively adds `io.quarkus:quarkus-grpc` extension dependency. == Server configuration -include::{generated-dir}/config/quarkus-grpc-config-group-config-xds.adoc[opts=optional, leveloffset=+1] +include::{generated-dir}/quarkus-grpc-config-group-config-xds.adoc[opts=optional, leveloffset=+1] == Server configuration example @@ -58,7 +58,7 @@ NOTE: When xDS is configured, `plain-text` is automatically disabled. == Client configuration -include::{generated-dir}/config/quarkus-grpc-config-group-config-client-xds.adoc[opts=optional, leveloffset=+1] +include::{generated-dir}/quarkus-grpc-config-group-config-client-xds.adoc[opts=optional, leveloffset=+1] NOTE: When xDS target property is used, name resolver, host, and port are not used diff --git a/docs/src/main/asciidoc/hibernate-orm.adoc b/docs/src/main/asciidoc/hibernate-orm.adoc index 80430dcb18cc6..0cd25cca8e642 100644 --- a/docs/src/main/asciidoc/hibernate-orm.adoc +++ b/docs/src/main/asciidoc/hibernate-orm.adoc @@ -291,7 +291,7 @@ and will have it use the default datasource. The configuration properties listed here allow you to override such defaults, and customize and tune various aspects. -include::{generated-dir}/config/quarkus-hibernate-orm.adoc[opts=optional, leveloffset=+2] +include::{generated-dir}/quarkus-hibernate-orm.adoc[opts=optional, leveloffset=+2] [NOTE] ==== diff --git a/docs/src/main/asciidoc/hibernate-reactive.adoc b/docs/src/main/asciidoc/hibernate-reactive.adoc index c0e32ee9b0475..6533f45892cb2 100644 --- a/docs/src/main/asciidoc/hibernate-reactive.adoc +++ b/docs/src/main/asciidoc/hibernate-reactive.adoc @@ -193,7 +193,7 @@ The configuration properties listed here allow you to override such defaults, an Hibernate Reactive uses the same properties you would use for Hibernate ORM. You will notice that some properties contain `jdbc` in the name but there is no JDBC in Hibernate Reactive, these are simply legacy property names. -include::{generated-dir}/config/quarkus-hibernate-orm.adoc[opts=optional, leveloffset=+2] +include::{generated-dir}/quarkus-hibernate-orm.adoc[opts=optional, leveloffset=+2] [TIP] ==== diff --git a/docs/src/main/asciidoc/hibernate-search-orm-elasticsearch.adoc b/docs/src/main/asciidoc/hibernate-search-orm-elasticsearch.adoc index 82faa37cf6a5b..17cab8e12ff7b 100644 --- a/docs/src/main/asciidoc/hibernate-search-orm-elasticsearch.adoc +++ b/docs/src/main/asciidoc/hibernate-search-orm-elasticsearch.adoc @@ -1246,7 +1246,7 @@ https://github.com/quarkiverse/quarkus-hibernate-search-extras/issues/179[quarki [[configuration-reference-main]] === Main Configuration -include::{generated-dir}/config/quarkus-hibernate-search-orm-elasticsearch.adoc[leveloffset=+1, opts=optional] +include::{generated-dir}/quarkus-hibernate-search-orm-elasticsearch.adoc[leveloffset=+1, opts=optional] [NOTE] [[bean-reference-note-anchor]] @@ -1280,4 +1280,4 @@ for more information. NOTE: These configuration properties require an additional extension. See <>. -include::{generated-dir}/config/quarkus-hibernate-search-orm-outboxpolling.adoc[leveloffset=+1, opts=optional] +include::{generated-dir}/quarkus-hibernate-search-orm-outboxpolling.adoc[leveloffset=+1, opts=optional] diff --git a/docs/src/main/asciidoc/hibernate-search-standalone-elasticsearch.adoc b/docs/src/main/asciidoc/hibernate-search-standalone-elasticsearch.adoc index 6e4fb29c07ae4..ce077c94ca109 100644 --- a/docs/src/main/asciidoc/hibernate-search-standalone-elasticsearch.adoc +++ b/docs/src/main/asciidoc/hibernate-search-standalone-elasticsearch.adoc @@ -1034,7 +1034,7 @@ https://github.com/quarkiverse/quarkus-hibernate-search-extras/issues/180[quarki [[configuration-reference]] == Configuration Reference for Hibernate Search Standalone -include::{generated-dir}/config/quarkus-hibernate-search-standalone-elasticsearch.adoc[leveloffset=+1, opts=optional] +include::{generated-dir}/quarkus-hibernate-search-standalone-elasticsearch.adoc[leveloffset=+1, opts=optional] [NOTE] [[bean-reference-note-anchor]] diff --git a/docs/src/main/asciidoc/http-reference.adoc b/docs/src/main/asciidoc/http-reference.adoc index b7f9786b4db77..8b5728e08a215 100644 --- a/docs/src/main/asciidoc/http-reference.adoc +++ b/docs/src/main/asciidoc/http-reference.adoc @@ -80,7 +80,7 @@ TIP: Brotli compression is not available by default. You can enable it by settin Additionally, the index page for static resources can be changed from default `index.html`, the hidden files (e.g. dot files) can be indicated as not served, the range requests can be disabled, and the caching support (e.g. caching headers and file properties cache) can be configured. -include::{generated-dir}/config/quarkus-vertx-http-config-group-static-resources-config.adoc[leveloffset=+1, opts=optional] +include::{generated-dir}/quarkus-vertx-http-config-group-static-resources-config.adoc[leveloffset=+1, opts=optional] [[context-path]] == Configuring the Context path @@ -270,7 +270,7 @@ quarkus.http.header.Pragma.methods=GET,HEAD This will apply the `Pragma` header only when the `/headers/pragma` resource is called with a `GET` or a `HEAD` method -include::{generated-dir}/config/quarkus-vertx-http-config-group-header-config.adoc[leveloffset=+1, opts=optional] +include::{generated-dir}/quarkus-vertx-http-config-group-header-config.adoc[leveloffset=+1, opts=optional] === Additional HTTP Headers per path @@ -310,7 +310,7 @@ quarkus.http.filter.any-order.matches=/paths/order.* Will include the `Cache-Control: max-age=1` header when `/paths/order` is requested. -include::{generated-dir}/config/quarkus-vertx-http-config-group-filter-config.adoc[leveloffset=+1, opts=optional] +include::{generated-dir}/quarkus-vertx-http-config-group-filter-config.adoc[leveloffset=+1, opts=optional] == Support 100-Continue in vert.x @@ -359,7 +359,7 @@ For more information about the CORS filter that Quarkus provides, see the Quarku == HTTP Limits Configuration -include::{generated-dir}/config/quarkus-vertx-http-config-group-server-limits-config.adoc[leveloffset=+1, opts=optional] +include::{generated-dir}/quarkus-vertx-http-config-group-server-limits-config.adoc[leveloffset=+1, opts=optional] == Configure traffic shaping @@ -404,7 +404,7 @@ When one of the threshold is reached, no write happens for that period of time. You can add HTTP request logging by configuring it in `application.properties`. There are two options for logging, either logging to the standard JBoss logging output, or logging to a dedicated file. -include::{generated-dir}/config/quarkus-vertx-http-config-group-access-log-config.adoc[opts=optional, leveloffset=+1] +include::{generated-dir}/quarkus-vertx-http-config-group-access-log-config.adoc[opts=optional, leveloffset=+1] [frame="topbot",options="header"] |=== diff --git a/docs/src/main/asciidoc/infinispan-client-reference.adoc b/docs/src/main/asciidoc/infinispan-client-reference.adoc index 7084c2e4ae3d9..c8d944081f172 100644 --- a/docs/src/main/asciidoc/infinispan-client-reference.adoc +++ b/docs/src/main/asciidoc/infinispan-client-reference.adoc @@ -969,4 +969,4 @@ You can set the port by configuring the `quarkus.infinispan-client.devservices.p == Configuration Reference -include::{generated-dir}/config/quarkus-infinispan-client.adoc[opts=optional, leveloffset=+1] +include::{generated-dir}/quarkus-infinispan-client.adoc[opts=optional, leveloffset=+1] diff --git a/docs/src/main/asciidoc/infinispan-dev-services.adoc b/docs/src/main/asciidoc/infinispan-dev-services.adoc index 975799b4079f5..b4fec3057afbd 100644 --- a/docs/src/main/asciidoc/infinispan-dev-services.adoc +++ b/docs/src/main/asciidoc/infinispan-dev-services.adoc @@ -16,7 +16,7 @@ Quarkus will automatically start an Infinispan container when running tests or d The following properties are available to customize the Infinispan Dev Services: -include::{generated-dir}/config/quarkus-infinispan-client-config-group-infinispan-client-build-time-config-dev-service-configuration.adoc[opts=optional, leveloffset=+1] +include::{generated-dir}/quarkus-infinispan-client-config-group-infinispan-client-build-time-config-dev-service-configuration.adoc[opts=optional, leveloffset=+1] When running the production version of the application, the Infinispan connection need to be configured as normal, so if you want to include a production database config in your `application.properties` and continue to use Dev Services diff --git a/docs/src/main/asciidoc/jfr.adoc b/docs/src/main/asciidoc/jfr.adoc index 34eebbdcd58c8..33f8db92ae11e 100644 --- a/docs/src/main/asciidoc/jfr.adoc +++ b/docs/src/main/asciidoc/jfr.adoc @@ -386,4 +386,4 @@ public class NewInterceptor { == Configuration Reference -include::{generated-dir}/config/quarkus-jfr.adoc[leveloffset=+1, opts=optional] \ No newline at end of file +include::{generated-dir}/quarkus-jfr.adoc[leveloffset=+1, opts=optional] \ No newline at end of file diff --git a/docs/src/main/asciidoc/kafka-streams.adoc b/docs/src/main/asciidoc/kafka-streams.adoc index 1119b939acdce..a77494f90ae22 100644 --- a/docs/src/main/asciidoc/kafka-streams.adoc +++ b/docs/src/main/asciidoc/kafka-streams.adoc @@ -1255,4 +1255,4 @@ Refer to the Quarkus guides on xref:telemetry-micrometer.adoc[Micrometer], xref: == Configuration Reference -include::{generated-dir}/config/quarkus-kafka-streams.adoc[opts=optional, leveloffset=+1] +include::{generated-dir}/quarkus-kafka-streams.adoc[opts=optional, leveloffset=+1] diff --git a/docs/src/main/asciidoc/kubernetes-client.adoc b/docs/src/main/asciidoc/kubernetes-client.adoc index 988ff7ffd5fe5..bd6061315016e 100644 --- a/docs/src/main/asciidoc/kubernetes-client.adoc +++ b/docs/src/main/asciidoc/kubernetes-client.adoc @@ -521,4 +521,4 @@ testImplementation("io.quarkus:quarkus-test-openshift-client") == Configuration Reference -include::{generated-dir}/config/quarkus-kubernetes-client.adoc[opts=optional, leveloffset=+1] +include::{generated-dir}/quarkus-kubernetes-client.adoc[opts=optional, leveloffset=+1] diff --git a/docs/src/main/asciidoc/kubernetes-config.adoc b/docs/src/main/asciidoc/kubernetes-config.adoc index 0654b09431b6c..a23590b443b70 100644 --- a/docs/src/main/asciidoc/kubernetes-config.adoc +++ b/docs/src/main/asciidoc/kubernetes-config.adoc @@ -149,4 +149,4 @@ See xref:deploying-to-kubernetes.adoc#secret-mapping[this] for more details. == Configuration Reference -include::{generated-dir}/config/quarkus-kubernetes-config.adoc[opts=optional, leveloffset=+1] +include::{generated-dir}/quarkus-kubernetes-config.adoc[opts=optional, leveloffset=+1] diff --git a/docs/src/main/asciidoc/liquibase-mongodb.adoc b/docs/src/main/asciidoc/liquibase-mongodb.adoc index 2efb8b798f211..af313bb8eaddb 100644 --- a/docs/src/main/asciidoc/liquibase-mongodb.adoc +++ b/docs/src/main/asciidoc/liquibase-mongodb.adoc @@ -193,4 +193,4 @@ quarkus.openshift.init-task-defaults.wait-for-container.image=my/wait-for-image: == Configuration Reference -include::{generated-dir}/config/quarkus-liquibase-mongodb.adoc[opts=optional, leveloffset=+2] +include::{generated-dir}/quarkus-liquibase-mongodb.adoc[opts=optional, leveloffset=+2] diff --git a/docs/src/main/asciidoc/liquibase.adoc b/docs/src/main/asciidoc/liquibase.adoc index 2ab713d5711a7..d62debf2d7d7b 100644 --- a/docs/src/main/asciidoc/liquibase.adoc +++ b/docs/src/main/asciidoc/liquibase.adoc @@ -276,4 +276,4 @@ quarkus.openshift.init-task-defaults.wait-for-container.image=my/wait-for-image: == Configuration Reference -include::{generated-dir}/config/quarkus-liquibase.adoc[opts=optional, leveloffset=+2] +include::{generated-dir}/quarkus-liquibase.adoc[opts=optional, leveloffset=+2] diff --git a/docs/src/main/asciidoc/load-shedding-reference.adoc b/docs/src/main/asciidoc/load-shedding-reference.adoc index f5ac732d11690..3c06424345008 100644 --- a/docs/src/main/asciidoc/load-shedding-reference.adoc +++ b/docs/src/main/asciidoc/load-shedding-reference.adoc @@ -122,7 +122,7 @@ Improvements may be necessary. == Configuration reference -include::{generated-dir}/config/quarkus-load-shedding.adoc[opts=optional, leveloffset=+1] +include::{generated-dir}/quarkus-load-shedding.adoc[opts=optional, leveloffset=+1] == Further reading diff --git a/docs/src/main/asciidoc/logging.adoc b/docs/src/main/asciidoc/logging.adoc index 4c0068b89ac8c..8173f91e25ef6 100644 --- a/docs/src/main/asciidoc/logging.adoc +++ b/docs/src/main/asciidoc/logging.adoc @@ -401,7 +401,7 @@ This can be achieved using different profiles, as shown in the following configu Configure the JSON logging extension using supported properties to customize its behavior. -include::{generated-dir}/config/quarkus-logging-json.adoc[opts=optional, leveloffset=+1] +include::{generated-dir}/quarkus-logging-json.adoc[opts=optional, leveloffset=+1] WARNING: Enabling pretty printing might cause certain processors and JSON parsers to fail. @@ -845,5 +845,5 @@ NOTE: If applicable, MDC data is stored in a _duplicated context_, which is an i [[loggingConfigurationReference]] == Logging configuration reference -include::{generated-dir}/config/quarkus-log-logging-log-build-time-config.adoc[opts=optional, leveloffset=+1] -include::{generated-dir}/config/quarkus-log-logging-log-config.adoc[opts=optional, leveloffset=+1] +include::{generated-dir}/quarkus-log-logging-log-build-time-config.adoc[opts=optional, leveloffset=+1] +include::{generated-dir}/quarkus-log-logging-log-config.adoc[opts=optional, leveloffset=+1] diff --git a/docs/src/main/asciidoc/mailer-reference.adoc b/docs/src/main/asciidoc/mailer-reference.adoc index baf7175894a2d..db1c8b9b6d75a 100644 --- a/docs/src/main/asciidoc/mailer-reference.adoc +++ b/docs/src/main/asciidoc/mailer-reference.adoc @@ -677,5 +677,5 @@ quarkus.mailer.mock=false # In dev mode, prevent from using the mock SMTP server [[configuration-reference]] == Mailer Configuration Reference -include::{generated-dir}/config/quarkus-mailer.adoc[opts=optional, leveloffset=+1] +include::{generated-dir}/quarkus-mailer.adoc[opts=optional, leveloffset=+1] diff --git a/docs/src/main/asciidoc/management-interface-reference.adoc b/docs/src/main/asciidoc/management-interface-reference.adoc index 124f558b95c92..94611b107dc81 100644 --- a/docs/src/main/asciidoc/management-interface-reference.adoc +++ b/docs/src/main/asciidoc/management-interface-reference.adoc @@ -162,9 +162,9 @@ More details about the `Router` API can be found on https://vertx.io/docs/vertx- == Management Interface Configuration -include::{generated-dir}/config/quarkus-management-management-management-interface-build-time-config.adoc[leveloffset=+1, opts=optional] +include::{generated-dir}/quarkus-management-management-management-interface-build-time-config.adoc[leveloffset=+1, opts=optional] -include::{generated-dir}/config/quarkus-management-management-management-interface-configuration.adoc[leveloffset=+1, opts=optional] +include::{generated-dir}/quarkus-management-management-management-interface-configuration.adoc[leveloffset=+1, opts=optional] [[reverse-proxy]] diff --git a/docs/src/main/asciidoc/maven-tooling.adoc b/docs/src/main/asciidoc/maven-tooling.adoc index 4ba1cf36781d2..29a7e806225fc 100644 --- a/docs/src/main/asciidoc/maven-tooling.adoc +++ b/docs/src/main/asciidoc/maven-tooling.adoc @@ -238,7 +238,7 @@ include::{includes}/devtools/build.adoc[] Before you start Quarkus on the remote host set the environment variable `QUARKUS_LAUNCH_DEVMODE=true`. If you are on bare metal you can set it via the `export QUARKUS_LAUNCH_DEVMODE=true` command and then run the application with the proper `java -jar ...` command to run the application. -If you plan on running the application via Docker, then you'll need to add `-e QUARKUS_LAUNCH_DEVMODE=true` to the `docker run` command. +If you plan on running the application via Docker, then you'll need to add `-e QUARKUS_LAUNCH_DEVMODE=true` to the `docker run` command. When the application starts you should now see the following line in the logs: `Profile dev activated. Live Coding activated`. You will also need to give the application the rights to update the deployment resources by adding `RUN chmod o+rw -R /deployments` after the `COPY` commands into your Dockerfile. For security reasons, this option should not be added to the production Dockerfile. NOTE: The remote side does not need to include Maven or any other development tools. The normal `fast-jar` Dockerfile @@ -262,7 +262,7 @@ rsync to sync to the remote application. All the config options are shown below: -include::{generated-dir}/config/quarkus-live-reload-live-reload-config.adoc[opts=optional, leveloffset=+1] +include::{generated-dir}/quarkus-live-reload-live-reload-config.adoc[opts=optional, leveloffset=+1] NOTE: It is recommended you use SSL when using remote dev mode, however even if you are using an unencrypted connection your password is never sent directly over the wire. For the initial connection request the password is hashed with the @@ -908,7 +908,7 @@ These are provided in `application.properties` the same as any other config prop The properties are shown below: -include::{generated-dir}/config/quarkus-package-pkg-package-config.adoc[opts=optional] +include::{generated-dir}/quarkus-package-pkg-package-config.adoc[opts=optional] [[custom-test-configuration-profile]] === Custom test configuration profile in JVM mode diff --git a/docs/src/main/asciidoc/mongodb.adoc b/docs/src/main/asciidoc/mongodb.adoc index 89fef1dd72449..daeff00ac7e51 100644 --- a/docs/src/main/asciidoc/mongodb.adoc +++ b/docs/src/main/asciidoc/mongodb.adoc @@ -793,4 +793,4 @@ IMPORTANT: Client-side field level encryption, and feature relying on https://gi == Configuration Reference -include::{generated-dir}/config/quarkus-mongodb.adoc[opts=optional, leveloffset=+1] +include::{generated-dir}/quarkus-mongodb.adoc[opts=optional, leveloffset=+1] diff --git a/docs/src/main/asciidoc/openapi-swaggerui.adoc b/docs/src/main/asciidoc/openapi-swaggerui.adoc index 9833a044b8f7f..bfbec48eb7bed 100644 --- a/docs/src/main/asciidoc/openapi-swaggerui.adoc +++ b/docs/src/main/asciidoc/openapi-swaggerui.adoc @@ -575,8 +575,8 @@ If you plan to consume this application from a Single Page Application running o === OpenAPI -include::{generated-dir}/config/quarkus-smallrye-openapi.adoc[opts=optional, leveloffset=+1] +include::{generated-dir}/quarkus-smallrye-openapi.adoc[opts=optional, leveloffset=+1] === Swagger UI -include::{generated-dir}/config/quarkus-swaggerui.adoc[opts=optional, leveloffset=+1] +include::{generated-dir}/quarkus-swaggerui.adoc[opts=optional, leveloffset=+1] diff --git a/docs/src/main/asciidoc/opentelemetry.adoc b/docs/src/main/asciidoc/opentelemetry.adoc index f3a79b928b7dd..7b59f79cc8eff 100644 --- a/docs/src/main/asciidoc/opentelemetry.adoc +++ b/docs/src/main/asciidoc/opentelemetry.adoc @@ -307,4 +307,4 @@ adding the usual `quarkus.*` prefix. Quarkus OpenTelemetry configuration properties now have the `quarkus.otel.*` prefix. -include::{generated-dir}/config/quarkus-opentelemetry.adoc[leveloffset=+1, opts=optional] +include::{generated-dir}/quarkus-opentelemetry.adoc[leveloffset=+1, opts=optional] diff --git a/docs/src/main/asciidoc/picocli.adoc b/docs/src/main/asciidoc/picocli.adoc index 4ec8182a34c41..c4af5f43ee1b3 100644 --- a/docs/src/main/asciidoc/picocli.adoc +++ b/docs/src/main/asciidoc/picocli.adoc @@ -370,4 +370,4 @@ Finally, the Kubernetes job will be launched every time it is installed in Kuber == Configuration Reference -include::{generated-dir}/config/quarkus-picocli.adoc[opts=optional, leveloffset=+1] +include::{generated-dir}/quarkus-picocli.adoc[opts=optional, leveloffset=+1] diff --git a/docs/src/main/asciidoc/quarkus-maven-plugin.adoc b/docs/src/main/asciidoc/quarkus-maven-plugin.adoc index 3201dca12ac5e..d1ea6ceed0ed6 100644 --- a/docs/src/main/asciidoc/quarkus-maven-plugin.adoc +++ b/docs/src/main/asciidoc/quarkus-maven-plugin.adoc @@ -24,4 +24,4 @@ It is also possible to print out detailed information about a goal, all its para Here is the list of all the Quarkus Maven Plugin goals: -include::{generated-dir}/config/quarkus-maven-plugin-goals.adoc[opts=optional, leveloffset=+2] +include::{generated-dir}/quarkus-maven-plugin-goals.adoc[opts=optional, leveloffset=+2] diff --git a/docs/src/main/asciidoc/quartz.adoc b/docs/src/main/asciidoc/quartz.adoc index bfdf94fc25eef..b75d946f02ade 100644 --- a/docs/src/main/asciidoc/quartz.adoc +++ b/docs/src/main/asciidoc/quartz.adoc @@ -481,4 +481,4 @@ If `run-blocking-method-on-quartz-thread` is set, the scheduled method runs on a [[quartz-configuration-reference]] == Quartz Configuration Reference -include::{generated-dir}/config/quarkus-quartz.adoc[leveloffset=+1, opts=optional] +include::{generated-dir}/quarkus-quartz.adoc[leveloffset=+1, opts=optional] diff --git a/docs/src/main/asciidoc/qute-reference.adoc b/docs/src/main/asciidoc/qute-reference.adoc index 9eb8dd6cc228a..07b8720d680b9 100644 --- a/docs/src/main/asciidoc/qute-reference.adoc +++ b/docs/src/main/asciidoc/qute-reference.adoc @@ -1170,7 +1170,7 @@ NOTE: If an argument does not have a name and the value is a single word string * `_args.skip(String...)` - returns only the arguments that do not match the given names * `_args.skipIdenticalKeyValue` - returns only the arguments with the name not equal to the value; typically `bar` from `{#test foo="foo" bar=true /}` * `_args.skipIt` - returns all arguments except for the first unnamed argument; typically `bar` from `{#test foo bar=true /}` -* `_args.asHtmlAttributes` - renders the arguments as HTML attributes; e.g. `foo="true" readonly="readonly"`; the arguments are sorted by name in alphabetical order and the `'`, `"`, `<`, `>`, `&` characters are escaped +* `_args.asHtmlAttributes` - renders the arguments as HTML attributes; e.g. `foo="true" readonly="readonly"`; the arguments are sorted by name in alphabetical order and the `'`, `"`, `<`, `>`, `&` characters are escaped `_args` is also iterable of `java.util.Map.Entry`: `{#each _args}{it.key}={it.value}{/each}`. @@ -2880,7 +2880,7 @@ Then it receives a generated template: {#is CONSTANT2}{msg:methodName_CONSTANT2} {/when} ---- - + Furthermore, a special message method is generated for each enum constant. Finally, each localized file must contain keys and values for all constant message keys: [source,poperties] @@ -2891,7 +2891,7 @@ methodName_CONSTANT2=Value 2 In a template, an enum constant can be localized with a message bundle method like `{msg:methodName(enumConstant)}`. -TIP: There is also <> - a convenient annotation to access enum constants in a template. +TIP: There is also <> - a convenient annotation to access enum constants in a template. ==== Message Templates @@ -2932,7 +2932,7 @@ Message templates are validated during the build. If a missing message template === Configuration Reference -include::{generated-dir}/config/quarkus-qute.adoc[leveloffset=+1, opts=optional] +include::{generated-dir}/quarkus-qute.adoc[leveloffset=+1, opts=optional] [[standalone]] diff --git a/docs/src/main/asciidoc/qute.adoc b/docs/src/main/asciidoc/qute.adoc index 658832463d1d6..3db27182a8f95 100644 --- a/docs/src/main/asciidoc/qute.adoc +++ b/docs/src/main/asciidoc/qute.adoc @@ -539,4 +539,4 @@ To learn more about Qute, please refer to the xref:qute-reference.adoc[Qute refe [[qute-configuration-reference]] == Qute Configuration Reference -include::{generated-dir}/config/quarkus-qute.adoc[leveloffset=+1, opts=optional] +include::{generated-dir}/quarkus-qute.adoc[leveloffset=+1, opts=optional] diff --git a/docs/src/main/asciidoc/rabbitmq-reference.adoc b/docs/src/main/asciidoc/rabbitmq-reference.adoc index a4bf77788ea9e..65e3f27325521 100644 --- a/docs/src/main/asciidoc/rabbitmq-reference.adoc +++ b/docs/src/main/asciidoc/rabbitmq-reference.adoc @@ -470,7 +470,7 @@ the default mount path of `rabbitmq`. If the RabbitMQ secret engine was mounted //=== Quarkus specific configuration -//include::{generated-dir}/config/quarkus-smallrye-reactivemessaging-rabbitmq.adoc[opts=optional, leveloffset=+1] +//include::{generated-dir}/quarkus-smallrye-reactivemessaging-rabbitmq.adoc[opts=optional, leveloffset=+1] === Incoming channel configuration diff --git a/docs/src/main/asciidoc/reactive-sql-clients.adoc b/docs/src/main/asciidoc/reactive-sql-clients.adoc index 5b64977d6a91c..e1db726b63345 100644 --- a/docs/src/main/asciidoc/reactive-sql-clients.adoc +++ b/docs/src/main/asciidoc/reactive-sql-clients.adoc @@ -902,28 +902,28 @@ By default, `pipelining-limit` is set to 256. === Common Datasource -include::{generated-dir}/config/quarkus-datasource.adoc[opts=optional, leveloffset=+1] +include::{generated-dir}/quarkus-datasource.adoc[opts=optional, leveloffset=+1] === Reactive Datasource -include::{generated-dir}/config/quarkus-reactive-datasource.adoc[opts=optional, leveloffset=+1] +include::{generated-dir}/quarkus-reactive-datasource.adoc[opts=optional, leveloffset=+1] === IBM Db2 -include::{generated-dir}/config/quarkus-reactive-db2-client.adoc[opts=optional, leveloffset=+1] +include::{generated-dir}/quarkus-reactive-db2-client.adoc[opts=optional, leveloffset=+1] === MariaDB/MySQL -include::{generated-dir}/config/quarkus-reactive-mysql-client.adoc[opts=optional, leveloffset=+1] +include::{generated-dir}/quarkus-reactive-mysql-client.adoc[opts=optional, leveloffset=+1] === Microsoft SQL Server -include::{generated-dir}/config/quarkus-reactive-mssql-client.adoc[opts=optional, leveloffset=+1] +include::{generated-dir}/quarkus-reactive-mssql-client.adoc[opts=optional, leveloffset=+1] === Oracle -include::{generated-dir}/config/quarkus-reactive-oracle-client.adoc[opts=optional, leveloffset=+1] +include::{generated-dir}/quarkus-reactive-oracle-client.adoc[opts=optional, leveloffset=+1] === PostgreSQL -include::{generated-dir}/config/quarkus-reactive-pg-client.adoc[opts=optional, leveloffset=+1] +include::{generated-dir}/quarkus-reactive-pg-client.adoc[opts=optional, leveloffset=+1] diff --git a/docs/src/main/asciidoc/redis-dev-services.adoc b/docs/src/main/asciidoc/redis-dev-services.adoc index 737f4e0e0d8bb..1370e18f19e35 100644 --- a/docs/src/main/asciidoc/redis-dev-services.adoc +++ b/docs/src/main/asciidoc/redis-dev-services.adoc @@ -17,7 +17,7 @@ Quarkus will automatically start a Redis container when running tests or dev mod Available properties to customize the Redis DevService. -include::{generated-dir}/config/quarkus-redis-config-group-client-dev-services-config.adoc[opts=optional, leveloffset=+1] +include::{generated-dir}/quarkus-redis-config-group-client-dev-services-config.adoc[opts=optional, leveloffset=+1] When running the production version of the application, the Redis connection need to be configured as normal, so if you want to include a production database config in your `application.properties` and continue to use Dev Services diff --git a/docs/src/main/asciidoc/redis-reference.adoc b/docs/src/main/asciidoc/redis-reference.adoc index 0de838ec7041c..c2eae5a4fb538 100644 --- a/docs/src/main/asciidoc/redis-reference.adoc +++ b/docs/src/main/asciidoc/redis-reference.adoc @@ -1024,4 +1024,4 @@ quarkus.micrometer.binder.redis.enabled=false [[redis-configuration-reference]] == Configuration reference -include::{generated-dir}/config/quarkus-redis.adoc[opts=optional, leveloffset=+1] +include::{generated-dir}/quarkus-redis.adoc[opts=optional, leveloffset=+1] diff --git a/docs/src/main/asciidoc/resteasy.adoc b/docs/src/main/asciidoc/resteasy.adoc index 7c8c4f710ef75..2e8cbe99b3bff 100644 --- a/docs/src/main/asciidoc/resteasy.adoc +++ b/docs/src/main/asciidoc/resteasy.adoc @@ -740,7 +740,7 @@ This extension slightly differs from the RESTEasy default behavior as the defaul You can configure this behavior with the following configuration properties: -include::{generated-dir}/config/quarkus-resteasy-multipart.adoc[leveloffset=+1, opts=optional] +include::{generated-dir}/quarkus-resteasy-multipart.adoc[leveloffset=+1, opts=optional] == Servlet compatibility diff --git a/docs/src/main/asciidoc/scheduler-reference.adoc b/docs/src/main/asciidoc/scheduler-reference.adoc index 943ff8319b1fe..809b2951808bd 100644 --- a/docs/src/main/asciidoc/scheduler-reference.adoc +++ b/docs/src/main/asciidoc/scheduler-reference.adoc @@ -36,8 +36,8 @@ TIP: The annotation is repeatable so a single method could be scheduled multiple === Inheritance of metadata -A subclass never inherits the metadata of a `@Scheduled` method declared on a superclass. -For example, suppose the class `org.amce.Foo` is extended by the class `org.amce.Bar`. +A subclass never inherits the metadata of a `@Scheduled` method declared on a superclass. +For example, suppose the class `org.amce.Foo` is extended by the class `org.amce.Bar`. If `Foo` declares a non-static method annotated with `@Scheduled` then `Bar` does not inherit the metadata of the scheduled method. In the following example, the `everySecond()` method is only invoked upon the instance of `Foo`. @@ -286,9 +286,9 @@ NOTE: Note that only executions within the same application instance are conside You can define the logic to skip any execution of a scheduled method via `@Scheduled#skipExecutionIf()`. The specified class must implement `io.quarkus.scheduler.Scheduled.SkipPredicate` and the execution is skipped if the result of the `test()` method is `true`. -The class must either represent a CDI bean or declare a public no-args constructor. -In case of CDI, there must be exactly one bean that has the specified class in its set of bean types, otherwise the build fails. -Furthermore, the scope of the bean must be active during execution of the job. +The class must either represent a CDI bean or declare a public no-args constructor. +In case of CDI, there must be exactly one bean that has the specified class in its set of bean types, otherwise the build fails. +Furthermore, the scope of the bean must be active during execution of the job. If the scope is `@Dependent` then the bean instance belongs exclusively to the specific scheduled method and is destroyed when the application is shut down. [source,java] @@ -509,4 +509,4 @@ Read xref:./virtual-threads.adoc[the virtual thread guide] for more details. == Configuration Reference -include::{generated-dir}/config/quarkus-scheduler.adoc[leveloffset=+1, opts=optional] +include::{generated-dir}/quarkus-scheduler.adoc[leveloffset=+1, opts=optional] diff --git a/docs/src/main/asciidoc/scheduler.adoc b/docs/src/main/asciidoc/scheduler.adoc index 0938fd2a59351..208324444742c 100644 --- a/docs/src/main/asciidoc/scheduler.adoc +++ b/docs/src/main/asciidoc/scheduler.adoc @@ -191,4 +191,4 @@ include::{includes}/devtools/build-native.adoc[] [[scheduler-configuration-reference]] == Scheduler Configuration Reference -include::{generated-dir}/config/quarkus-scheduler.adoc[leveloffset=+1, opts=optional] +include::{generated-dir}/quarkus-scheduler.adoc[leveloffset=+1, opts=optional] diff --git a/docs/src/main/asciidoc/security-authentication-mechanisms.adoc b/docs/src/main/asciidoc/security-authentication-mechanisms.adoc index f8ffa3711fc64..9b3dcde39d5d7 100644 --- a/docs/src/main/asciidoc/security-authentication-mechanisms.adoc +++ b/docs/src/main/asciidoc/security-authentication-mechanisms.adoc @@ -217,8 +217,8 @@ public Response logout() { The following properties can be used to configure form-based authentication: -include::{generated-dir}/config/quarkus-vertx-http-config-group-form-auth-config.adoc[opts=optional, leveloffset=+1] -include::{generated-dir}/config/quarkus-vertx-http-config-group-auth-runtime-config.adoc[opts=optional, leveloffset=+1] +include::{generated-dir}/quarkus-vertx-http-config-group-form-auth-config.adoc[opts=optional, leveloffset=+1] +include::{generated-dir}/quarkus-vertx-http-config-group-auth-runtime-config.adoc[opts=optional, leveloffset=+1] [[mutual-tls]] === Mutual TLS authentication diff --git a/docs/src/main/asciidoc/security-cors.adoc b/docs/src/main/asciidoc/security-cors.adoc index 0fb34242c846f..aaaccb9f02134 100644 --- a/docs/src/main/asciidoc/security-cors.adoc +++ b/docs/src/main/asciidoc/security-cors.adoc @@ -30,7 +30,7 @@ quarkus.http.cors=true When the filter is enabled and identifies an HTTP request as cross-origin, it will enforce the CORS policy. It will also add headers configured with the following properties before forwarding the request to its intended destination, like a servlet, Jakarta REST resource, or other endpoints. -include::{generated-dir}/config/quarkus-vertx-http-config-group-cors-cors-config.adoc[leveloffset=+1, opts=optional] +include::{generated-dir}/quarkus-vertx-http-config-group-cors-cors-config.adoc[leveloffset=+1, opts=optional] . An example of a full CORS filter configuration that includes a regular expression defining an allowed origin [source, properties] diff --git a/docs/src/main/asciidoc/security-csrf-prevention.adoc b/docs/src/main/asciidoc/security-csrf-prevention.adoc index 45d3b372be5a2..e23e0bbf9413a 100644 --- a/docs/src/main/asciidoc/security-csrf-prevention.adoc +++ b/docs/src/main/asciidoc/security-csrf-prevention.adoc @@ -322,7 +322,7 @@ quarkus.csrf-reactive.verify-token=false [[csrf-reactive-configuration-reference]] == Configuration Reference -include::{generated-dir}/config/quarkus-csrf-reactive.adoc[leveloffset=+1, opts=optional] +include::{generated-dir}/quarkus-csrf-reactive.adoc[leveloffset=+1, opts=optional] == References diff --git a/docs/src/main/asciidoc/security-jdbc.adoc b/docs/src/main/asciidoc/security-jdbc.adoc index fba33d27df325..5c19c3bcfe203 100644 --- a/docs/src/main/asciidoc/security-jdbc.adoc +++ b/docs/src/main/asciidoc/security-jdbc.adoc @@ -216,7 +216,7 @@ quarkus.security.jdbc.principal-query.attribute-mappings.0.to=groups The `elytron-security-jdbc` extension requires at least one principal query to authenticate the user and its identity. <1> We define a parameterized SQL statement (with exactly 1 parameter) which should return the user's password plus any additional information you want to load. -<2> The password mapper is configured with the position of the password field in the `SELECT` fields. The hash is stored in the Modular Crypt Format (MCF) because the salt and iteration count indexes are set to `-1` by default. You can override them in order to decompose each element into three separate columns. +<2> The password mapper is configured with the position of the password field in the `SELECT` fields. The hash is stored in the Modular Crypt Format (MCF) because the salt and iteration count indexes are set to `-1` by default. You can override them in order to decompose each element into three separate columns. <3> We use `attribute-mappings` to bind the `SELECT` projection fields (i.e. `u.role` here) to the target Principal representation attributes. [NOTE] @@ -319,7 +319,7 @@ quarkus.security.jdbc.principal-query.roles.attribute-mappings.0.to=groups [[configuration-reference]] == Configuration Reference -include::{generated-dir}/config/quarkus-elytron-security-jdbc.adoc[opts=optional, leveloffset=+1] +include::{generated-dir}/quarkus-elytron-security-jdbc.adoc[opts=optional, leveloffset=+1] == References diff --git a/docs/src/main/asciidoc/security-jpa.adoc b/docs/src/main/asciidoc/security-jpa.adoc index 0eefd1783de9e..32f95188491f3 100644 --- a/docs/src/main/asciidoc/security-jpa.adoc +++ b/docs/src/main/asciidoc/security-jpa.adoc @@ -218,7 +218,7 @@ However, if your `io.quarkus.hibernate.orm.runtime.tenant.TenantResolver` must a For more information about proactive authentication, see the Quarkus xref:security-proactive-authentication.adoc[Proactive authentication] guide. ==== -include::{generated-dir}/config/quarkus-security-jpa.adoc[opts=optional, leveloffset=+2] +include::{generated-dir}/quarkus-security-jpa.adoc[opts=optional, leveloffset=+2] == References diff --git a/docs/src/main/asciidoc/security-jwt.adoc b/docs/src/main/asciidoc/security-jwt.adoc index 781a24f71987e..21520fa933f6a 100644 --- a/docs/src/main/asciidoc/security-jwt.adoc +++ b/docs/src/main/asciidoc/security-jwt.adoc @@ -1040,7 +1040,7 @@ quarkus.index-dependency.smallrye-jwt.artifact-id=smallrye-jwt === Quarkus configuration -include::{generated-dir}/config/quarkus-smallrye-jwt.adoc[opts=optional, leveloffset=+1] +include::{generated-dir}/quarkus-smallrye-jwt.adoc[opts=optional, leveloffset=+1] === MicroProfile JWT configuration diff --git a/docs/src/main/asciidoc/security-keycloak-admin-client.adoc b/docs/src/main/asciidoc/security-keycloak-admin-client.adoc index b4d70655ef1b4..a14d38f868398 100644 --- a/docs/src/main/asciidoc/security-keycloak-admin-client.adoc +++ b/docs/src/main/asciidoc/security-keycloak-admin-client.adoc @@ -215,7 +215,7 @@ For example, by default, a test container will be available at a randomly alloca [[keycloak-admin-client-configuration-reference]] == Quarkus Keycloak Admin Client Configuration Reference -include::{generated-dir}/config/quarkus-keycloak-admin-client.adoc[leveloffset=+1, opts=optional] +include::{generated-dir}/quarkus-keycloak-admin-client.adoc[leveloffset=+1, opts=optional] == References diff --git a/docs/src/main/asciidoc/security-keycloak-authorization.adoc b/docs/src/main/asciidoc/security-keycloak-authorization.adoc index d2ed11cc92763..bd27a031501ae 100644 --- a/docs/src/main/asciidoc/security-keycloak-authorization.adoc +++ b/docs/src/main/asciidoc/security-keycloak-authorization.adoc @@ -623,7 +623,7 @@ public class CustomTenantPolicyConfigResolver implements TenantPolicyConfigResol This configuration adheres to the official [Keycloak Policy Enforcer Configuration](https://www.keycloak.org/docs/latest/authorization_services/index.html#_enforcer_filter) guidelines. For detailed insights into various configuration options, see the following documentation: -include::{generated-dir}/config/quarkus-keycloak-keycloak-policy-enforcer-config.adoc[opts=optional] +include::{generated-dir}/quarkus-keycloak-keycloak-policy-enforcer-config.adoc[opts=optional] == References diff --git a/docs/src/main/asciidoc/security-ldap.adoc b/docs/src/main/asciidoc/security-ldap.adoc index 83b1695367a83..94a3a8c79cab2 100644 --- a/docs/src/main/asciidoc/security-ldap.adoc +++ b/docs/src/main/asciidoc/security-ldap.adoc @@ -249,7 +249,7 @@ user% [[configuration-reference]] == Configuration Reference -include::{generated-dir}/config/quarkus-elytron-security-ldap.adoc[opts=optional, leveloffset=+1] +include::{generated-dir}/quarkus-elytron-security-ldap.adoc[opts=optional, leveloffset=+1] == References diff --git a/docs/src/main/asciidoc/security-oauth2.adoc b/docs/src/main/asciidoc/security-oauth2.adoc index 071f52b89ad9d..eeb77804c95bd 100644 --- a/docs/src/main/asciidoc/security-oauth2.adoc +++ b/docs/src/main/asciidoc/security-oauth2.adoc @@ -450,4 +450,4 @@ class TokenSecuredResourceTest { [[config-reference]] == Configuration Reference -include::{generated-dir}/config/quarkus-elytron-security-oauth2.adoc[opts=optional, leveloffset=+1] +include::{generated-dir}/quarkus-elytron-security-oauth2.adoc[opts=optional, leveloffset=+1] diff --git a/docs/src/main/asciidoc/security-oidc-configuration-properties-reference.adoc b/docs/src/main/asciidoc/security-oidc-configuration-properties-reference.adoc index e76df52eb6375..c98859136473d 100644 --- a/docs/src/main/asciidoc/security-oidc-configuration-properties-reference.adoc +++ b/docs/src/main/asciidoc/security-oidc-configuration-properties-reference.adoc @@ -13,7 +13,7 @@ include::_attributes.adoc[] As a Quarkus developer, you configure the Quarkus OpenID Connect (OIDC) extension by setting the following properties in the `src/main/resources/application.properties` file. -include::{generated-dir}/config/quarkus-oidc.adoc[opts=optional, leveloffset=+1] +include::{generated-dir}/quarkus-oidc.adoc[opts=optional, leveloffset=+1] == References diff --git a/docs/src/main/asciidoc/security-openid-connect-client-reference.adoc b/docs/src/main/asciidoc/security-openid-connect-client-reference.adoc index 7e6d7f3891189..924a7821d9bca 100644 --- a/docs/src/main/asciidoc/security-openid-connect-client-reference.adoc +++ b/docs/src/main/asciidoc/security-openid-connect-client-reference.adoc @@ -1414,11 +1414,11 @@ endif::no-quarkus-oidc-client-graphql[] === OIDC client -include::{generated-dir}/config/quarkus-oidc-client.adoc[opts=optional, leveloffset=+1] +include::{generated-dir}/quarkus-oidc-client.adoc[opts=optional, leveloffset=+1] === OIDC token propagation -include::{generated-dir}/config/quarkus-oidc-token-propagation-reactive.adoc[opts=optional, leveloffset=+1] +include::{generated-dir}/quarkus-oidc-token-propagation-reactive.adoc[opts=optional, leveloffset=+1] == References diff --git a/docs/src/main/asciidoc/security-properties.adoc b/docs/src/main/asciidoc/security-properties.adoc index d2916c7a862f3..9a1341596bc75 100644 --- a/docs/src/main/asciidoc/security-properties.adoc +++ b/docs/src/main/asciidoc/security-properties.adoc @@ -37,7 +37,7 @@ Both support storage of this information in properties files. The following sections detail the specific configuration properties. -include::{generated-dir}/config/quarkus-elytron-security.adoc[opts=optional, leveloffset=+2] +include::{generated-dir}/quarkus-elytron-security.adoc[opts=optional, leveloffset=+2] === Properties Files Realm Configuration diff --git a/docs/src/main/asciidoc/security-webauthn.adoc b/docs/src/main/asciidoc/security-webauthn.adoc index fc47d17acb45a..d3727cce71340 100644 --- a/docs/src/main/asciidoc/security-webauthn.adoc +++ b/docs/src/main/asciidoc/security-webauthn.adoc @@ -64,7 +64,7 @@ login or registration. And also there are a lot more fields to store than just a public key, but we will help you with that. Just in case you get there wondering what's the relation with https://fidoalliance.org/passkeys/[PassKeys] -and whether we support it: sure, yes, PassKeys is a way that your authenticator devices can share and sync +and whether we support it: sure, yes, PassKeys is a way that your authenticator devices can share and sync their credentials, which you can then use with our WebAuthn authentication. NOTE: The WebAuthn specification requires HTTPS to be used for communication with the server, though @@ -1291,11 +1291,11 @@ public class TestUserProvider extends MyWebAuthnSetup { [[configuration-reference]] == Configuration Reference -The security encryption key can be set with the +The security encryption key can be set with the link:all-config#quarkus-vertx-http_quarkus.http.auth.session.encryption-key[`quarkus.http.auth.session.encryption-key`] configuration option, as described in the link:security-authentication-mechanisms#form-auth[security guide]. -include::{generated-dir}/config/quarkus-security-webauthn.adoc[opts=optional, leveloffset=+1] +include::{generated-dir}/quarkus-security-webauthn.adoc[opts=optional, leveloffset=+1] == References diff --git a/docs/src/main/asciidoc/smallrye-graphql.adoc b/docs/src/main/asciidoc/smallrye-graphql.adoc index 9537d30858049..1372e363c94e1 100644 --- a/docs/src/main/asciidoc/smallrye-graphql.adoc +++ b/docs/src/main/asciidoc/smallrye-graphql.adoc @@ -1316,4 +1316,4 @@ API `evolution`. [[configuration-reference]] == Configuration Reference -include::{generated-dir}/config/quarkus-smallrye-graphql.adoc[leveloffset=+1, opts=optional] +include::{generated-dir}/quarkus-smallrye-graphql.adoc[leveloffset=+1, opts=optional] diff --git a/docs/src/main/asciidoc/smallrye-health.adoc b/docs/src/main/asciidoc/smallrye-health.adoc index 4c6995ec72f9e..a3100b3f93aef 100644 --- a/docs/src/main/asciidoc/smallrye-health.adoc +++ b/docs/src/main/asciidoc/smallrye-health.adoc @@ -468,4 +468,4 @@ implementation("io.quarkus:quarkus-smallrye-health") == Configuration Reference -include::{generated-dir}/config/quarkus-smallrye-health.adoc[opts=optional, leveloffset=+1] +include::{generated-dir}/quarkus-smallrye-health.adoc[opts=optional, leveloffset=+1] diff --git a/docs/src/main/asciidoc/smallrye-metrics.adoc b/docs/src/main/asciidoc/smallrye-metrics.adoc index 01a2ad27493fb..99fae51f04371 100644 --- a/docs/src/main/asciidoc/smallrye-metrics.adoc +++ b/docs/src/main/asciidoc/smallrye-metrics.adoc @@ -240,4 +240,4 @@ Refer to the xref:./management-interface-reference.adoc[management interface ref .Configuration Reference -include::{generated-dir}/config/quarkus-smallrye-metrics.adoc[opts=optional, leveloffset=+1] +include::{generated-dir}/quarkus-smallrye-metrics.adoc[opts=optional, leveloffset=+1] diff --git a/docs/src/main/asciidoc/spring-cloud-config-client.adoc b/docs/src/main/asciidoc/spring-cloud-config-client.adoc index 58571289c8d67..b07db43c2bbd1 100644 --- a/docs/src/main/asciidoc/spring-cloud-config-client.adoc +++ b/docs/src/main/asciidoc/spring-cloud-config-client.adoc @@ -127,7 +127,7 @@ quarkus.spring-cloud-config.url=http://localhost:8888 [TIP] ==== If you are using Gradle, the Gradle setting `rootProject.name` has precedence over `quarkus.application.name` -so be sure to set the Gradle property to the application name you want the Spring Cloud Config server to see. +so be sure to set the Gradle property to the application name you want the Spring Cloud Config server to see. ==== == Package and run the application @@ -160,5 +160,5 @@ Quarkus has more Spring compatibility features. See the following guides for mor [[spring-cloud-config-client-configuration-reference]] == Spring Cloud Config Client Reference -include::{generated-dir}/config/quarkus-spring-cloud-config-client.adoc[leveloffset=+1, opts=optional] +include::{generated-dir}/quarkus-spring-cloud-config-client.adoc[leveloffset=+1, opts=optional] diff --git a/docs/src/main/asciidoc/spring-di.adoc b/docs/src/main/asciidoc/spring-di.adoc index 22d116afabd8e..710dc04a2e9d5 100644 --- a/docs/src/main/asciidoc/spring-di.adoc +++ b/docs/src/main/asciidoc/spring-di.adoc @@ -338,7 +338,7 @@ The following table shows how Spring DI annotations can be converted to CDI and == Spring DI Configuration Reference -include::{generated-dir}/config/quarkus-spring-di.adoc[leveloffset=+1, opts=optional] +include::{generated-dir}/quarkus-spring-di.adoc[leveloffset=+1, opts=optional] == More Spring guides diff --git a/docs/src/main/asciidoc/stork-reference.adoc b/docs/src/main/asciidoc/stork-reference.adoc index 138a07a989418..ae7345148a009 100644 --- a/docs/src/main/asciidoc/stork-reference.adoc +++ b/docs/src/main/asciidoc/stork-reference.adoc @@ -134,7 +134,7 @@ quarkus.micrometer.binder.stork.enabled=false [[stork-configuration-reference]] == Configuration reference -include::{generated-dir}/config/quarkus-stork.adoc[opts=optional, leveloffset=+1] +include::{generated-dir}/quarkus-stork.adoc[opts=optional, leveloffset=+1] diff --git a/docs/src/main/asciidoc/telemetry-micrometer.adoc b/docs/src/main/asciidoc/telemetry-micrometer.adoc index a61966fa16d76..ea56e96039b74 100644 --- a/docs/src/main/asciidoc/telemetry-micrometer.adoc +++ b/docs/src/main/asciidoc/telemetry-micrometer.adoc @@ -764,4 +764,4 @@ Refer to the xref:./management-interface-reference.adoc[management interface ref == Configuration Reference -include::{generated-dir}/config/quarkus-micrometer.adoc[opts=optional, leveloffset=+1] +include::{generated-dir}/quarkus-micrometer.adoc[opts=optional, leveloffset=+1] diff --git a/docs/src/main/asciidoc/tests-with-coverage.adoc b/docs/src/main/asciidoc/tests-with-coverage.adoc index 84d37845270da..0c7efd1750067 100644 --- a/docs/src/main/asciidoc/tests-with-coverage.adoc +++ b/docs/src/main/asciidoc/tests-with-coverage.adoc @@ -198,7 +198,7 @@ the `quarkus-jacoco` extension allows JaCoCo to just work out of the box. There are some config options that affect this: -include::{generated-dir}/config/quarkus-jacoco-jacoco-config.adoc[opts=optional, leveloffset=+1] +include::{generated-dir}/quarkus-jacoco-jacoco-config.adoc[opts=optional, leveloffset=+1] [TIP] ==== diff --git a/docs/src/main/asciidoc/tls-registry-reference.adoc b/docs/src/main/asciidoc/tls-registry-reference.adoc index df2a78a0c4513..767fa496e63f1 100644 --- a/docs/src/main/asciidoc/tls-registry-reference.adoc +++ b/docs/src/main/asciidoc/tls-registry-reference.adoc @@ -437,7 +437,7 @@ quarkus.tls.hostname-verification-algorithm=NONE The following table lists the supported properties: -include::{generated-dir}/config/quarkus-tls.adoc[opts=optional, leveloffset=+1] +include::{generated-dir}/quarkus-tls.adoc[opts=optional, leveloffset=+1] == The registry API diff --git a/docs/src/main/asciidoc/validation.adoc b/docs/src/main/asciidoc/validation.adoc index 425d97b01fc7b..821e8b514572d 100644 --- a/docs/src/main/asciidoc/validation.adoc +++ b/docs/src/main/asciidoc/validation.adoc @@ -514,4 +514,4 @@ is called. [[configuration-reference]] == Hibernate Validator Configuration Reference -include::{generated-dir}/config/quarkus-hibernate-validator.adoc[leveloffset=+1, opts=optional] +include::{generated-dir}/quarkus-hibernate-validator.quarkus.hibernate-validator.adoc[leveloffset=+1, opts=optional] diff --git a/docs/src/main/asciidoc/vertx-reference.adoc b/docs/src/main/asciidoc/vertx-reference.adoc index 65e90b11fe929..626cbdd0f6c25 100644 --- a/docs/src/main/asciidoc/vertx-reference.adoc +++ b/docs/src/main/asciidoc/vertx-reference.adoc @@ -60,7 +60,7 @@ Documentation about the Vert.x Mutiny variant is available on https://smallrye.i You can configure the Vert.x instance from the `application.properties` file. The following table lists the supported properties: -include::{generated-dir}/config/quarkus-vertx-core.adoc[opts=optional, leveloffset=+1] +include::{generated-dir}/quarkus-vertx-core.adoc[opts=optional, leveloffset=+1] See <> to configure the Vert.x instance using a programmatic approach. @@ -529,9 +529,9 @@ public String consume(String name) { return name.toLowerCase(); } ---- -<1> Receive the messages sent to the address configured with the `my.consumer.address` key. +<1> Receive the messages sent to the address configured with the `my.consumer.address` key. -NOTE: If no config property with the specified key exists and no default value is set then the application startup fails. +NOTE: If no config property with the specified key exists and no default value is set then the application startup fails. === Process events asynchronously diff --git a/docs/src/main/asciidoc/websockets-next-reference.adoc b/docs/src/main/asciidoc/websockets-next-reference.adoc index 7d35092c93761..c051ddd3c667c 100644 --- a/docs/src/main/asciidoc/websockets-next-reference.adoc +++ b/docs/src/main/asciidoc/websockets-next-reference.adoc @@ -108,7 +108,7 @@ public class ChatWebSocket { Thus, client can connect to this web socket endpoint using `ws://localhost:8080/chat/your-name`. If TLS is used, the URL is `wss://localhost:8443/chat/your-name`. -NOTE: The endpoint path is relative to the xref:http-reference.adoc#context-path[root context] configured by the `quarkus.http.root-path` (which is `/` by default). For example, if you add `quarkus.http.root-path=/api` to your `application.properties` then a client can connect to this endpoint using `http://localhost:8080/api/chat/the-name`. +NOTE: The endpoint path is relative to the xref:http-reference.adoc#context-path[root context] configured by the `quarkus.http.root-path` (which is `/` by default). For example, if you add `quarkus.http.root-path=/api` to your `application.properties` then a client can connect to this endpoint using `http://localhost:8080/api/chat/the-name`. [[client-endpoints]] === Client endpoints @@ -194,7 +194,7 @@ A WebSocket endpoint may declare: * At most one `@OnPongMessage` method: Handles the pong messages from the connected client/server. * At most one `@OnOpen` method: Invoked when a connection is opened. * At most one `@OnClose` method: Executed when the connection is closed. -* Any number of `@OnError` methods: Invoked when an error occurs; that is when an endpoint callback throws a runtime error, or when a conversion errors occurs, or when a returned `io.smallrye.mutiny.Uni`/`io.smallrye.mutiny.Multi` receives a failure. +* Any number of `@OnError` methods: Invoked when an error occurs; that is when an endpoint callback throws a runtime error, or when a conversion errors occurs, or when a returned `io.smallrye.mutiny.Uni`/`io.smallrye.mutiny.Multi` receives a failure. Only some endpoints need to include all methods. However, it must contain at least `@On[Text|Binary]Message` or `@OnOpen`. @@ -240,7 +240,7 @@ However, it may also accept the following parameters: * `WebSocketConnection`/`WebSocketClientConnection` * `HandshakeRequest` * `String` parameters annotated with `@PathParam` - + The message object represents the data sent and can be accessed as either raw content (`String`, `JsonObject`, `JsonArray`, `Buffer` or `byte[]`) or deserialized high-level objects, which is the recommended approach. When receiving a `Multi`, the method is invoked once per connection, and the provided `Multi` receives the items transmitted by this connection. @@ -370,7 +370,7 @@ Methods annotated with `@OnOpen` and `@OnClose` may accept the following paramet * `WebSocketConnection`/`WebSocketClientConnection` * `HandshakeRequest` * `String` parameters annotated with `@PathParam` - + An endpoint method annotated with `@OnClose` may also accept the `io.quarkus.websockets.next.CloseReason` parameter that may indicate a reason for closing a connection. ==== Supported return types @@ -407,7 +407,7 @@ They can only send messages to the other clients by using the `WebSocketConnecti === Error handling WebSocket endpoints can also be notified when an error occurs. -A WebSocket endpoint method annotated with `@io.quarkus.websockets.next.OnError` is invoked when an endpoint callback throws a runtime error, or when a conversion errors occurs, +A WebSocket endpoint method annotated with `@io.quarkus.websockets.next.OnError` is invoked when an endpoint callback throws a runtime error, or when a conversion errors occurs, or when a returned `io.smallrye.mutiny.Uni`/`io.smallrye.mutiny.Multi` receives a failure. The method must accept exactly one _error_ parameter, i.e. a parameter that is assignable from `java.lang.Throwable`. @@ -507,7 +507,7 @@ In other words, there is no need for `@OnPingMessage` callback declared on an en The server can send ping messages to a connected client. `WebSocketConnection`/`WebSocketClientConnection` declare methods to send ping messages; there is a non-blocking variant: `sendPing(Buffer)` and a blocking variant: `sendPingAndAwait(Buffer)`. By default, the ping messages are not sent automatically. -However, the configuration properties `quarkus.websockets-next.server.auto-ping-interval` and `quarkus.websockets-next.client.auto-ping-interval` can be used to set the interval after which, the server/client sends a ping message to a connected client/server automatically. +However, the configuration properties `quarkus.websockets-next.server.auto-ping-interval` and `quarkus.websockets-next.client.auto-ping-interval` can be used to set the interval after which, the server/client sends a ping message to a connected client/server automatically. [source,properties] ---- @@ -532,7 +532,7 @@ NOTE: The server/client can also send unsolicited pong messages that may serve a [[inbound-processing-mode]] === Inbound processing mode -WebSocket endpoints can define the mode used to process incoming events for a specific connection using the `@WebSocket#inboundProcessingMode()`, and `@WebSocketClient.inboundProcessingMode()` respectively. +WebSocket endpoints can define the mode used to process incoming events for a specific connection using the `@WebSocket#inboundProcessingMode()`, and `@WebSocketClient.inboundProcessingMode()` respectively. An incoming event can represent a message (text, binary, pong), opening connection and closing connection. By default, events are processed serially and ordering is guaranteed. This means that if an endpoint receives events `A` and `B` (in this particular order) then callback for event `B` will be invoked after the callback for event `A` completed. @@ -593,7 +593,7 @@ Methods annotated with `@OnOpen`, `@OnTextMessage`, `@OnBinaryMessage`, and `@On @Inject WebSocketConnection connection; ---- -NOTE: Note that outside of these methos, the `WebSocketConnection` object is not available. However, it is possible to <>. +NOTE: Note that outside of these methos, the `WebSocketConnection` object is not available. However, it is possible to <>. The connection can be used to send messages to the client, access the path parameters, broadcast messages to all connected clients, etc. @@ -811,7 +811,7 @@ As a direct consequence of the fact this extension reuses the _main_ HTTP server === Client connectors The `io.quarkus.websockets.next.WebSocketConnector` is used to configure and create new connections for client endpoints. -A CDI bean that implements this interface is provided and can be injected in other beans. +A CDI bean that implements this interface is provided and can be injected in other beans. The actual type argument is used to determine the client endpoint. The type is validated during build - if it does not represent a client endpoint the build fails. @@ -909,7 +909,7 @@ Methods annotated with `@OnOpen`, `@OnTextMessage`, `@OnBinaryMessage`, and `@On @Inject WebSocketClientConnection connection; ---- -NOTE: Note that outside of these methos, the `WebSocketClientConnection` object is not available. However, it is possible to <>. +NOTE: Note that outside of these methos, the `WebSocketClientConnection` object is not available. However, it is possible to <>. The connection can be used to send messages to the client, access the path parameters, etc. @@ -995,9 +995,9 @@ The client will not use the default TLS configuration. When you configure a _named_ TLS configuration, TLS is enabled by default. [[traffic-logging]] -== Traffic logging +== Traffic logging -Quarkus can log the messages sent and received for debugging purposes. +Quarkus can log the messages sent and received for debugging purposes. To enable traffic logging for the server, set the `quarkus.websockets-next.server.traffic-logging.enabled` configuration property to `true`. To enable traffic logging for the client, set the `quarkus.websockets-next.client.traffic-logging.enabled` configuration property to `true`. The payload of text messages is logged as well. @@ -1022,4 +1022,4 @@ quarkus.log.category."io.quarkus.websockets.next.traffic".level=DEBUG <3> [[websocket-next-configuration-reference]] == Configuration reference -include::{generated-dir}/config/quarkus-websockets-next.adoc[opts=optional, leveloffset=+1] +include::{generated-dir}/quarkus-websockets-next.adoc[opts=optional, leveloffset=+1] diff --git a/docs/src/main/asciidoc/writing-extensions.adoc b/docs/src/main/asciidoc/writing-extensions.adoc index f47ed3ac6f318..cd975cc7c6840 100644 --- a/docs/src/main/asciidoc/writing-extensions.adoc +++ b/docs/src/main/asciidoc/writing-extensions.adoc @@ -1356,13 +1356,13 @@ To include the generated configuration reference documentation in a guide, use: [source,asciidoc] ---- -\include::{generated-dir}/config/quarkus-your-extension.adoc[opts=optional, leveloffset=+1] +\include::{generated-dir}/quarkus-your-extension.adoc[opts=optional, leveloffset=+1] ---- To include only a specific config group: [source,asciidoc] ---- -\include::{generated-dir}/config/hyphenated-config-group-class-name-with-runtime-or-deployment-namespace-replaced-by-config-group-namespace.adoc[opts=optional, leveloffset=+1] +\include::{generated-dir}/hyphenated-config-group-class-name-with-runtime-or-deployment-namespace-replaced-by-config-group-namespace.adoc[opts=optional, leveloffset=+1] ---- For example, the `io.quarkus.vertx.http.runtime.FormAuthConfig` configuration group will be generated in a file named @@ -1389,7 +1389,7 @@ And at the end of the guide, the extensive configuration documentation: [[configuration-reference]] == Configuration Reference -\include::{generated-dir}/config/quarkus-your-extension.adoc[opts=optional, leveloffset=+1] +\include::{generated-dir}/quarkus-your-extension.adoc[opts=optional, leveloffset=+1] ---- [WARNING] From 1592efd50a3464211e64c2568d92f43332b5dd3b Mon Sep 17 00:00:00 2001 From: Guillaume Smet Date: Sat, 3 Aug 2024 13:37:07 +0200 Subject: [PATCH 16/43] Fix default for mapKey --- .../documentation/config/scanner/ConfigMappingListener.java | 2 +- .../documentation/config/scanner/LegacyConfigListener.java | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/core/processor/src/main/java/io/quarkus/annotation/processor/documentation/config/scanner/ConfigMappingListener.java b/core/processor/src/main/java/io/quarkus/annotation/processor/documentation/config/scanner/ConfigMappingListener.java index a5abda56378d2..19331f0733ce4 100644 --- a/core/processor/src/main/java/io/quarkus/annotation/processor/documentation/config/scanner/ConfigMappingListener.java +++ b/core/processor/src/main/java/io/quarkus/annotation/processor/documentation/config/scanner/ConfigMappingListener.java @@ -139,7 +139,7 @@ public void onEnclosedMethod(DiscoveryRootElement discoveryRootElement, TypeElem } if (resolvedType.isMap()) { - String mapKey = name; + String mapKey = ConfigNamingUtil.hyphenate(sourceName); AnnotationMirror configDocMapKeyAnnotation = methodAnnotations.get(Types.ANNOTATION_CONFIG_DOC_MAP_KEY); if (configDocMapKeyAnnotation != null) { mapKey = configDocMapKeyAnnotation.getElementValues().values().iterator().next().getValue().toString(); diff --git a/core/processor/src/main/java/io/quarkus/annotation/processor/documentation/config/scanner/LegacyConfigListener.java b/core/processor/src/main/java/io/quarkus/annotation/processor/documentation/config/scanner/LegacyConfigListener.java index 5f6996b7e7dd2..4de6ea2df740a 100644 --- a/core/processor/src/main/java/io/quarkus/annotation/processor/documentation/config/scanner/LegacyConfigListener.java +++ b/core/processor/src/main/java/io/quarkus/annotation/processor/documentation/config/scanner/LegacyConfigListener.java @@ -145,7 +145,7 @@ public void onEnclosedField(DiscoveryRootElement discoveryRootElement, TypeEleme builder.name(name); if (resolvedType.isMap()) { - String mapKey = name; + String mapKey = ConfigNamingUtil.hyphenate(sourceName); AnnotationMirror configDocMapKeyAnnotation = fieldAnnotations.get(Types.ANNOTATION_CONFIG_DOC_MAP_KEY); if (configDocMapKeyAnnotation != null) { mapKey = configDocMapKeyAnnotation.getElementValues().values().iterator().next().getValue().toString(); From e9adc0b519646c4b4dca0b69ea09f14e8ca162ae Mon Sep 17 00:00:00 2001 From: Guillaume Smet Date: Sat, 3 Aug 2024 13:48:01 +0200 Subject: [PATCH 17/43] Improve named maps config doc for various modules Noticed thanks to the bug I just fixed. --- .../elytron/security/jdbc/PrincipalQueriesConfig.java | 6 +++++- .../io/quarkus/flyway/runtime/FlywayBuildTimeConfig.java | 6 +++++- .../io/quarkus/flyway/runtime/FlywayRuntimeConfig.java | 6 +++++- .../client/runtime/InfinispanClientsBuildTimeConfig.java | 6 +++++- .../client/runtime/InfinispanClientsRuntimeConfig.java | 7 +++++-- .../liquibase/runtime/LiquibaseBuildTimeConfig.java | 6 +++++- .../quarkus/liquibase/runtime/LiquibaseRuntimeConfig.java | 4 ++++ 7 files changed, 34 insertions(+), 7 deletions(-) diff --git a/extensions/elytron-security-jdbc/runtime/src/main/java/io/quarkus/elytron/security/jdbc/PrincipalQueriesConfig.java b/extensions/elytron-security-jdbc/runtime/src/main/java/io/quarkus/elytron/security/jdbc/PrincipalQueriesConfig.java index febd771c645e5..86d53b85d4d86 100644 --- a/extensions/elytron-security-jdbc/runtime/src/main/java/io/quarkus/elytron/security/jdbc/PrincipalQueriesConfig.java +++ b/extensions/elytron-security-jdbc/runtime/src/main/java/io/quarkus/elytron/security/jdbc/PrincipalQueriesConfig.java @@ -2,6 +2,8 @@ import java.util.Map; +import io.quarkus.runtime.annotations.ConfigDocMapKey; +import io.quarkus.runtime.annotations.ConfigDocSection; import io.quarkus.runtime.annotations.ConfigGroup; import io.smallrye.config.WithParentName; @@ -18,9 +20,11 @@ public interface PrincipalQueriesConfig { PrincipalQueryConfig defaultPrincipalQuery(); /** - * Additional principal queries + * Named queries. */ @WithParentName + @ConfigDocMapKey("query-name") + @ConfigDocSection Map namedPrincipalQueries(); String toString(); diff --git a/extensions/flyway/runtime/src/main/java/io/quarkus/flyway/runtime/FlywayBuildTimeConfig.java b/extensions/flyway/runtime/src/main/java/io/quarkus/flyway/runtime/FlywayBuildTimeConfig.java index 5560e96941cc4..76e427de6a5e4 100644 --- a/extensions/flyway/runtime/src/main/java/io/quarkus/flyway/runtime/FlywayBuildTimeConfig.java +++ b/extensions/flyway/runtime/src/main/java/io/quarkus/flyway/runtime/FlywayBuildTimeConfig.java @@ -4,6 +4,8 @@ import java.util.Map; import io.quarkus.datasource.common.runtime.DataSourceUtil; +import io.quarkus.runtime.annotations.ConfigDocMapKey; +import io.quarkus.runtime.annotations.ConfigDocSection; import io.quarkus.runtime.annotations.ConfigItem; import io.quarkus.runtime.annotations.ConfigPhase; import io.quarkus.runtime.annotations.ConfigRoot; @@ -38,8 +40,10 @@ public FlywayDataSourceBuildTimeConfig getConfigForDataSourceName(String dataSou public FlywayDataSourceBuildTimeConfig defaultDataSource; /** - * Flyway configurations for named datasources. + * Named datasources. */ @ConfigItem(name = ConfigItem.PARENT) + @ConfigDocMapKey("datasource-name") + @ConfigDocSection public Map namedDataSources = Collections.emptyMap(); } \ No newline at end of file diff --git a/extensions/flyway/runtime/src/main/java/io/quarkus/flyway/runtime/FlywayRuntimeConfig.java b/extensions/flyway/runtime/src/main/java/io/quarkus/flyway/runtime/FlywayRuntimeConfig.java index 703e3cd0b00a1..c778e2ac636d8 100644 --- a/extensions/flyway/runtime/src/main/java/io/quarkus/flyway/runtime/FlywayRuntimeConfig.java +++ b/extensions/flyway/runtime/src/main/java/io/quarkus/flyway/runtime/FlywayRuntimeConfig.java @@ -4,6 +4,8 @@ import java.util.Map; import io.quarkus.datasource.common.runtime.DataSourceUtil; +import io.quarkus.runtime.annotations.ConfigDocMapKey; +import io.quarkus.runtime.annotations.ConfigDocSection; import io.quarkus.runtime.annotations.ConfigItem; import io.quarkus.runtime.annotations.ConfigPhase; import io.quarkus.runtime.annotations.ConfigRoot; @@ -28,8 +30,10 @@ public FlywayDataSourceRuntimeConfig getConfigForDataSourceName(String dataSourc public FlywayDataSourceRuntimeConfig defaultDataSource = FlywayDataSourceRuntimeConfig.defaultConfig(); /** - * Flyway configurations for named datasources. + * Named datasources. */ @ConfigItem(name = ConfigItem.PARENT) + @ConfigDocMapKey("datasource-name") + @ConfigDocSection public Map namedDataSources = Collections.emptyMap(); } diff --git a/extensions/infinispan-client/runtime/src/main/java/io/quarkus/infinispan/client/runtime/InfinispanClientsBuildTimeConfig.java b/extensions/infinispan-client/runtime/src/main/java/io/quarkus/infinispan/client/runtime/InfinispanClientsBuildTimeConfig.java index c5e95b471c827..93e48925e9372 100644 --- a/extensions/infinispan-client/runtime/src/main/java/io/quarkus/infinispan/client/runtime/InfinispanClientsBuildTimeConfig.java +++ b/extensions/infinispan-client/runtime/src/main/java/io/quarkus/infinispan/client/runtime/InfinispanClientsBuildTimeConfig.java @@ -5,6 +5,8 @@ import java.util.Map; import java.util.Set; +import io.quarkus.runtime.annotations.ConfigDocMapKey; +import io.quarkus.runtime.annotations.ConfigDocSection; import io.quarkus.runtime.annotations.ConfigItem; import io.quarkus.runtime.annotations.ConfigPhase; import io.quarkus.runtime.annotations.ConfigRoot; @@ -18,9 +20,11 @@ public class InfinispanClientsBuildTimeConfig { public InfinispanClientBuildTimeConfig defaultInfinispanClient; /** - * Additional named Infinispan Client. + * Named clients. */ @ConfigItem(name = ConfigItem.PARENT) + @ConfigDocMapKey("client-name") + @ConfigDocSection public Map namedInfinispanClients; /** diff --git a/extensions/infinispan-client/runtime/src/main/java/io/quarkus/infinispan/client/runtime/InfinispanClientsRuntimeConfig.java b/extensions/infinispan-client/runtime/src/main/java/io/quarkus/infinispan/client/runtime/InfinispanClientsRuntimeConfig.java index d5d5031ebe096..a11558a6b6ce8 100644 --- a/extensions/infinispan-client/runtime/src/main/java/io/quarkus/infinispan/client/runtime/InfinispanClientsRuntimeConfig.java +++ b/extensions/infinispan-client/runtime/src/main/java/io/quarkus/infinispan/client/runtime/InfinispanClientsRuntimeConfig.java @@ -2,8 +2,9 @@ import java.util.Map; import java.util.Optional; -import java.util.Set; +import io.quarkus.runtime.annotations.ConfigDocMapKey; +import io.quarkus.runtime.annotations.ConfigDocSection; import io.quarkus.runtime.annotations.ConfigItem; import io.quarkus.runtime.annotations.ConfigPhase; import io.quarkus.runtime.annotations.ConfigRoot; @@ -18,9 +19,11 @@ public class InfinispanClientsRuntimeConfig { public InfinispanClientRuntimeConfig defaultInfinispanClient; /** - * Additional named Infinispan Client. + * Named clients. */ @ConfigItem(name = ConfigItem.PARENT) + @ConfigDocMapKey("client-name") + @ConfigDocSection public Map namedInfinispanClients; // @formatter:off diff --git a/extensions/liquibase/runtime/src/main/java/io/quarkus/liquibase/runtime/LiquibaseBuildTimeConfig.java b/extensions/liquibase/runtime/src/main/java/io/quarkus/liquibase/runtime/LiquibaseBuildTimeConfig.java index 1055e3bbc7b57..474203b44aa08 100644 --- a/extensions/liquibase/runtime/src/main/java/io/quarkus/liquibase/runtime/LiquibaseBuildTimeConfig.java +++ b/extensions/liquibase/runtime/src/main/java/io/quarkus/liquibase/runtime/LiquibaseBuildTimeConfig.java @@ -3,6 +3,8 @@ import java.util.Collections; import java.util.Map; +import io.quarkus.runtime.annotations.ConfigDocMapKey; +import io.quarkus.runtime.annotations.ConfigDocSection; import io.quarkus.runtime.annotations.ConfigItem; import io.quarkus.runtime.annotations.ConfigPhase; import io.quarkus.runtime.annotations.ConfigRoot; @@ -38,8 +40,10 @@ public LiquibaseDataSourceBuildTimeConfig getConfigForDataSourceName(String data public LiquibaseDataSourceBuildTimeConfig defaultDataSource; /** - * Liquibase configurations for named datasources. + * Named datasources. */ @ConfigItem(name = ConfigItem.PARENT) + @ConfigDocMapKey("datasource-name") + @ConfigDocSection public Map namedDataSources = Collections.emptyMap(); } diff --git a/extensions/liquibase/runtime/src/main/java/io/quarkus/liquibase/runtime/LiquibaseRuntimeConfig.java b/extensions/liquibase/runtime/src/main/java/io/quarkus/liquibase/runtime/LiquibaseRuntimeConfig.java index 0d9561e3ce1c8..8215a5e4995a3 100644 --- a/extensions/liquibase/runtime/src/main/java/io/quarkus/liquibase/runtime/LiquibaseRuntimeConfig.java +++ b/extensions/liquibase/runtime/src/main/java/io/quarkus/liquibase/runtime/LiquibaseRuntimeConfig.java @@ -3,6 +3,8 @@ import java.util.Collections; import java.util.Map; +import io.quarkus.runtime.annotations.ConfigDocMapKey; +import io.quarkus.runtime.annotations.ConfigDocSection; import io.quarkus.runtime.annotations.ConfigItem; import io.quarkus.runtime.annotations.ConfigPhase; import io.quarkus.runtime.annotations.ConfigRoot; @@ -46,5 +48,7 @@ public LiquibaseDataSourceRuntimeConfig getConfigForDataSourceName(String dataSo * Liquibase configurations for named datasources. */ @ConfigItem(name = ConfigItem.PARENT) + @ConfigDocMapKey("datasource-name") + @ConfigDocSection public Map namedDataSources = Collections.emptyMap(); } From b5b998f2033f50beb3849a87c4719a2f6716bb08 Mon Sep 17 00:00:00 2001 From: Guillaume Smet Date: Sat, 3 Aug 2024 14:11:12 +0200 Subject: [PATCH 18/43] Do not ignore fields that are not annotated with @ConfigItem Personnaly, I would rather ignore them but that's not the current behavior. See OpenShiftConfig for a good example of it. --- .../config/scanner/ConfigAnnotationScanner.java | 5 ++++- 1 file changed, 4 insertions(+), 1 deletion(-) diff --git a/core/processor/src/main/java/io/quarkus/annotation/processor/documentation/config/scanner/ConfigAnnotationScanner.java b/core/processor/src/main/java/io/quarkus/annotation/processor/documentation/config/scanner/ConfigAnnotationScanner.java index 88885ea7288b0..b43b294790b40 100644 --- a/core/processor/src/main/java/io/quarkus/annotation/processor/documentation/config/scanner/ConfigAnnotationScanner.java +++ b/core/processor/src/main/java/io/quarkus/annotation/processor/documentation/config/scanner/ConfigAnnotationScanner.java @@ -373,7 +373,10 @@ public boolean isFieldIgnored(VariableElement field) { return false; } - return true; + // While I would rather ignore the fields that are not annotated, this is not the current behavior. + // So let's stick to the current behavior. + // See for instance OpenshiftConfig. + return false; } private void applyListeners(Consumer listenerFunction) { From e029b23c2def1e9a578124a88ee579fd4500f2ac Mon Sep 17 00:00:00 2001 From: Guillaume Smet Date: Sat, 3 Aug 2024 14:12:18 +0200 Subject: [PATCH 19/43] Adjust separator of config doc file format --- .../java/io/quarkus/maven/config/doc/GenerateAsciidocMojo.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/devtools/config-doc-maven-plugin/src/main/java/io/quarkus/maven/config/doc/GenerateAsciidocMojo.java b/devtools/config-doc-maven-plugin/src/main/java/io/quarkus/maven/config/doc/GenerateAsciidocMojo.java index cd1d0a43c3e80..8314cd5f0c747 100644 --- a/devtools/config-doc-maven-plugin/src/main/java/io/quarkus/maven/config/doc/GenerateAsciidocMojo.java +++ b/devtools/config-doc-maven-plugin/src/main/java/io/quarkus/maven/config/doc/GenerateAsciidocMojo.java @@ -49,7 +49,7 @@ public class GenerateAsciidocMojo extends AbstractMojo { .registerModule(new ParameterNamesModule()); private static final String TARGET = "target"; - private static final String CONFIG_ROOT_FILE_FORMAT = "%s.%s.adoc"; + private static final String CONFIG_ROOT_FILE_FORMAT = "%s_%s.adoc"; private static final String EXTENSION_FILE_FORMAT = "%s.adoc"; @Parameter(defaultValue = "${session}", readonly = true) From 2532594aa16d43f088578c839084a34f20fda298 Mon Sep 17 00:00:00 2001 From: Guillaume Smet Date: Sat, 3 Aug 2024 15:56:03 +0200 Subject: [PATCH 20/43] Strip additional suffixes for extension name -common and -internal will be in the way so let's strip them too. --- .../processor/ExtensionAnnotationProcessor.java | 10 +++++++++- 1 file changed, 9 insertions(+), 1 deletion(-) diff --git a/core/processor/src/main/java/io/quarkus/annotation/processor/ExtensionAnnotationProcessor.java b/core/processor/src/main/java/io/quarkus/annotation/processor/ExtensionAnnotationProcessor.java index 1bd0ed7e448c9..3f290494cb1b4 100644 --- a/core/processor/src/main/java/io/quarkus/annotation/processor/ExtensionAnnotationProcessor.java +++ b/core/processor/src/main/java/io/quarkus/annotation/processor/ExtensionAnnotationProcessor.java @@ -42,8 +42,10 @@ public class ExtensionAnnotationProcessor extends AbstractProcessor { private static final String DEBUG = "debug-extension-annotation-processor"; private static final String ARTIFACT_DEPLOYMENT_SUFFIX = "-deployment"; + private static final String ARTIFACT_COMMON_SUFFIX = "-common"; + private static final String ARTIFACT_INTERNAL_SUFFIX = "-internal"; private static final String NAME_RUNTIME_SUFFIX = " - Runtime"; - private static final String NAME_DEPLOYMENT_SUFFIX = " - DEPLOYMENT"; + private static final String NAME_DEPLOYMENT_SUFFIX = " - Deployment"; private List extensionProcessors; @@ -201,6 +203,12 @@ private Extension getExtensionFromPom(Path pom, Document doc) { if (artifactId.endsWith(ARTIFACT_DEPLOYMENT_SUFFIX)) { artifactId = artifactId.substring(0, artifactId.length() - ARTIFACT_DEPLOYMENT_SUFFIX.length()); } + if (artifactId.endsWith(ARTIFACT_COMMON_SUFFIX)) { + artifactId = artifactId.substring(0, artifactId.length() - ARTIFACT_COMMON_SUFFIX.length()); + } + if (artifactId.endsWith(ARTIFACT_INTERNAL_SUFFIX)) { + artifactId = artifactId.substring(0, artifactId.length() - ARTIFACT_INTERNAL_SUFFIX.length()); + } if (name != null) { if (name.endsWith(NAME_DEPLOYMENT_SUFFIX)) { From 94fc9e62f61611d1e4c392a0d4d1135b124c4a91 Mon Sep 17 00:00:00 2001 From: Guillaume Smet Date: Sat, 3 Aug 2024 17:07:09 +0200 Subject: [PATCH 21/43] Only check the presence of Javadoc when collecting it Also be a little less strict: in the case of config groups, we only require a Javadoc if it is not a section. --- .../config/discovery/ResolvedType.java | 21 +++++------- .../AbstractJavadocConfigListener.java | 19 +++++++---- .../scanner/ConfigAnnotationScanner.java | 5 ++- .../config/scanner/ConfigMappingListener.java | 5 +-- .../scanner/JavadocConfigMappingListener.java | 23 +++++++++---- .../JavadocLegacyConfigRootListener.java | 23 +++++++++---- .../config/scanner/LegacyConfigListener.java | 4 --- .../processor/util/ElementUtil.java | 34 +++++++------------ 8 files changed, 74 insertions(+), 60 deletions(-) diff --git a/core/processor/src/main/java/io/quarkus/annotation/processor/documentation/config/discovery/ResolvedType.java b/core/processor/src/main/java/io/quarkus/annotation/processor/documentation/config/discovery/ResolvedType.java index d73a83198bd9e..f10b93b94fa68 100644 --- a/core/processor/src/main/java/io/quarkus/annotation/processor/documentation/config/discovery/ResolvedType.java +++ b/core/processor/src/main/java/io/quarkus/annotation/processor/documentation/config/discovery/ResolvedType.java @@ -18,7 +18,8 @@ public record ResolvedType( boolean isInterface, boolean isClass, boolean isEnum, - boolean isDuration) { + boolean isDuration, + boolean isConfigGroup) { public TypeElement unwrappedTypeElement() { if (!isDeclared) { @@ -37,18 +38,14 @@ public static ResolvedType ofPrimitive(TypeMirror unwrappedType) { String primitiveName = unwrappedType.toString(); return new ResolvedType(unwrappedType, unwrappedType, primitiveName, primitiveName, primitiveName, true, false, false, - false, false, - false, false, false, false); + false, false, false, false, false, false, false); } public static ResolvedType ofDeclaredType(TypeMirror type, String binaryName, - String qualifiedName, - String simpleName, - boolean isInterface, boolean isClass, boolean isEnum, boolean isDuration) { + String qualifiedName, String simpleName, + boolean isInterface, boolean isClass, boolean isEnum, boolean isDuration, boolean isConfigGroup) { return new ResolvedType(type, type, binaryName, qualifiedName, simpleName, false, false, false, false, true, - isInterface, - isClass, - isEnum, isDuration); + isInterface, isClass, isEnum, isDuration, isConfigGroup); } public static ResolvedType makeList(TypeMirror type, ResolvedType unwrappedResolvedType) { @@ -58,7 +55,7 @@ public static ResolvedType makeList(TypeMirror type, ResolvedType unwrappedResol unwrappedResolvedType.isMap, true, unwrappedResolvedType.isOptional, unwrappedResolvedType.isDeclared, unwrappedResolvedType.isInterface, unwrappedResolvedType.isClass, - unwrappedResolvedType.isEnum, unwrappedResolvedType.isDuration); + unwrappedResolvedType.isEnum, unwrappedResolvedType.isDuration, unwrappedResolvedType.isConfigGroup); } public static ResolvedType makeOptional(ResolvedType unwrappedResolvedType) { @@ -68,7 +65,7 @@ public static ResolvedType makeOptional(ResolvedType unwrappedResolvedType) { unwrappedResolvedType.isMap, unwrappedResolvedType.isList, true, unwrappedResolvedType.isDeclared, unwrappedResolvedType.isInterface, unwrappedResolvedType.isClass, - unwrappedResolvedType.isEnum, unwrappedResolvedType.isDuration); + unwrappedResolvedType.isEnum, unwrappedResolvedType.isDuration, unwrappedResolvedType.isConfigGroup); } public static ResolvedType makeMap(TypeMirror type, ResolvedType unwrappedResolvedType) { @@ -78,6 +75,6 @@ public static ResolvedType makeMap(TypeMirror type, ResolvedType unwrappedResolv true, unwrappedResolvedType.isList, unwrappedResolvedType.isOptional, unwrappedResolvedType.isDeclared, unwrappedResolvedType.isInterface, unwrappedResolvedType.isClass, - unwrappedResolvedType.isEnum, unwrappedResolvedType.isDuration); + unwrappedResolvedType.isEnum, unwrappedResolvedType.isDuration, unwrappedResolvedType.isConfigGroup); } } \ No newline at end of file diff --git a/core/processor/src/main/java/io/quarkus/annotation/processor/documentation/config/scanner/AbstractJavadocConfigListener.java b/core/processor/src/main/java/io/quarkus/annotation/processor/documentation/config/scanner/AbstractJavadocConfigListener.java index eb8ab4616fb6b..65dacda0e95b3 100644 --- a/core/processor/src/main/java/io/quarkus/annotation/processor/documentation/config/scanner/AbstractJavadocConfigListener.java +++ b/core/processor/src/main/java/io/quarkus/annotation/processor/documentation/config/scanner/AbstractJavadocConfigListener.java @@ -1,5 +1,7 @@ package io.quarkus.annotation.processor.documentation.config.scanner; +import java.util.Optional; + import javax.lang.model.element.Element; import javax.lang.model.element.ElementKind; import javax.lang.model.element.TypeElement; @@ -34,15 +36,18 @@ public void onResolvedEnum(TypeElement enumTypeElement) { continue; } - String rawJavadoc = utils.element().getJavadoc(enumElement); - if (rawJavadoc != null && !rawJavadoc.isBlank()) { - ParsedJavadoc parsedJavadoc = JavadocToAsciidocTransformer.INSTANCE.parseConfigItemJavadoc(rawJavadoc); + Optional rawJavadoc = utils.element().getJavadoc(enumElement); - configCollector.addJavadocElement( - enumTypeElement.getQualifiedName().toString() + Markers.DOT + enumElement.getSimpleName() - .toString(), - new JavadocElement(parsedJavadoc.description(), parsedJavadoc.since(), rawJavadoc)); + if (rawJavadoc.isEmpty()) { + continue; } + + ParsedJavadoc parsedJavadoc = JavadocToAsciidocTransformer.INSTANCE.parseConfigItemJavadoc(rawJavadoc.get()); + + configCollector.addJavadocElement( + enumTypeElement.getQualifiedName().toString() + Markers.DOT + enumElement.getSimpleName() + .toString(), + new JavadocElement(parsedJavadoc.description(), parsedJavadoc.since(), rawJavadoc.get())); } } } diff --git a/core/processor/src/main/java/io/quarkus/annotation/processor/documentation/config/scanner/ConfigAnnotationScanner.java b/core/processor/src/main/java/io/quarkus/annotation/processor/documentation/config/scanner/ConfigAnnotationScanner.java index b43b294790b40..f3fbbcaaa21b1 100644 --- a/core/processor/src/main/java/io/quarkus/annotation/processor/documentation/config/scanner/ConfigAnnotationScanner.java +++ b/core/processor/src/main/java/io/quarkus/annotation/processor/documentation/config/scanner/ConfigAnnotationScanner.java @@ -292,18 +292,21 @@ private ResolvedType resolveType(TypeMirror typeMirror) { boolean isClass = false; boolean isEnum = false; boolean isDuration = false; + boolean isConfigGroup = false; if (typeElement.getKind() == ElementKind.ENUM) { isEnum = true; } else if (typeElement.getKind() == ElementKind.INTERFACE) { isInterface = true; + isConfigGroup = utils.element().isAnnotationPresent(typeElement, Types.ANNOTATION_CONFIG_GROUP); } else if (typeElement.getKind() == ElementKind.CLASS) { isClass = true; isDuration = typeMirror.toString().equals(Duration.class.getName()); + isConfigGroup = utils.element().isAnnotationPresent(typeElement, Types.ANNOTATION_CONFIG_GROUP); } ResolvedType resolvedType = ResolvedType.ofDeclaredType(typeMirror, binaryName, qualifiedName, simplifiedName, - isInterface, isClass, isEnum, isDuration); + isInterface, isClass, isEnum, isDuration, isConfigGroup); // optional can also be present on non wrapper types (e.g. OptionalInt) if (optional) { diff --git a/core/processor/src/main/java/io/quarkus/annotation/processor/documentation/config/scanner/ConfigMappingListener.java b/core/processor/src/main/java/io/quarkus/annotation/processor/documentation/config/scanner/ConfigMappingListener.java index 19331f0733ce4..753b3de455176 100644 --- a/core/processor/src/main/java/io/quarkus/annotation/processor/documentation/config/scanner/ConfigMappingListener.java +++ b/core/processor/src/main/java/io/quarkus/annotation/processor/documentation/config/scanner/ConfigMappingListener.java @@ -156,8 +156,9 @@ public void onEnclosedMethod(DiscoveryRootElement discoveryRootElement, TypeElem builder.converted(); } - if (utils.element().isLocalClass(clazz)) { - utils.element().checkRequiredJavadoc(method); + AnnotationMirror configDocSectionAnnotation = methodAnnotations.get(Types.ANNOTATION_CONFIG_DOC_SECTION); + if (configDocSectionAnnotation != null) { + builder.section(); } discoveryRootElement.addProperty(builder.build()); diff --git a/core/processor/src/main/java/io/quarkus/annotation/processor/documentation/config/scanner/JavadocConfigMappingListener.java b/core/processor/src/main/java/io/quarkus/annotation/processor/documentation/config/scanner/JavadocConfigMappingListener.java index 21a5c93086e38..8c229e40a494a 100644 --- a/core/processor/src/main/java/io/quarkus/annotation/processor/documentation/config/scanner/JavadocConfigMappingListener.java +++ b/core/processor/src/main/java/io/quarkus/annotation/processor/documentation/config/scanner/JavadocConfigMappingListener.java @@ -1,5 +1,7 @@ package io.quarkus.annotation.processor.documentation.config.scanner; +import java.util.Optional; + import javax.lang.model.element.ExecutableElement; import javax.lang.model.element.TypeElement; @@ -9,6 +11,7 @@ import io.quarkus.annotation.processor.documentation.config.formatter.JavadocToAsciidocTransformer; import io.quarkus.annotation.processor.documentation.config.model.JavadocElements.JavadocElement; import io.quarkus.annotation.processor.documentation.config.util.Markers; +import io.quarkus.annotation.processor.documentation.config.util.Types; import io.quarkus.annotation.processor.util.Config; import io.quarkus.annotation.processor.util.Utils; @@ -34,13 +37,21 @@ public void onEnclosedMethod(DiscoveryRootElement discoveryRootElement, TypeElem return; } - String rawJavadoc = utils.element().getRequiredJavadoc(method); - if (rawJavadoc != null && !rawJavadoc.isBlank()) { - ParsedJavadoc parsedJavadoc = JavadocToAsciidocTransformer.INSTANCE.parseConfigItemJavadoc(rawJavadoc); + Optional rawJavadoc = utils.element().getJavadoc(method); - configCollector.addJavadocElement( - clazz.getQualifiedName().toString() + Markers.DOT + method.getSimpleName().toString(), - new JavadocElement(parsedJavadoc.description(), parsedJavadoc.since(), rawJavadoc)); + if (rawJavadoc.isEmpty()) { + // We require a Javadoc for config items that are not config groups except if they are a section + if (!resolvedType.isConfigGroup() + || utils.element().isAnnotationPresent(method, Types.ANNOTATION_CONFIG_DOC_SECTION)) { + utils.element().addMissingJavadocError(method); + } + return; } + + ParsedJavadoc parsedJavadoc = JavadocToAsciidocTransformer.INSTANCE.parseConfigItemJavadoc(rawJavadoc.get()); + + configCollector.addJavadocElement( + clazz.getQualifiedName().toString() + Markers.DOT + method.getSimpleName().toString(), + new JavadocElement(parsedJavadoc.description(), parsedJavadoc.since(), rawJavadoc.get())); } } diff --git a/core/processor/src/main/java/io/quarkus/annotation/processor/documentation/config/scanner/JavadocLegacyConfigRootListener.java b/core/processor/src/main/java/io/quarkus/annotation/processor/documentation/config/scanner/JavadocLegacyConfigRootListener.java index d60aa03f2abb5..934c4c7639729 100644 --- a/core/processor/src/main/java/io/quarkus/annotation/processor/documentation/config/scanner/JavadocLegacyConfigRootListener.java +++ b/core/processor/src/main/java/io/quarkus/annotation/processor/documentation/config/scanner/JavadocLegacyConfigRootListener.java @@ -1,5 +1,7 @@ package io.quarkus.annotation.processor.documentation.config.scanner; +import java.util.Optional; + import javax.lang.model.element.TypeElement; import javax.lang.model.element.VariableElement; @@ -9,6 +11,7 @@ import io.quarkus.annotation.processor.documentation.config.formatter.JavadocToAsciidocTransformer; import io.quarkus.annotation.processor.documentation.config.model.JavadocElements.JavadocElement; import io.quarkus.annotation.processor.documentation.config.util.Markers; +import io.quarkus.annotation.processor.documentation.config.util.Types; import io.quarkus.annotation.processor.util.Config; import io.quarkus.annotation.processor.util.Utils; @@ -34,13 +37,21 @@ public void onEnclosedField(DiscoveryRootElement discoveryRootElement, TypeEleme return; } - String rawJavadoc = utils.element().getRequiredJavadoc(field); - if (rawJavadoc != null && !rawJavadoc.isBlank()) { - ParsedJavadoc parsedJavadoc = JavadocToAsciidocTransformer.INSTANCE.parseConfigItemJavadoc(rawJavadoc); + Optional rawJavadoc = utils.element().getJavadoc(field); - configCollector.addJavadocElement( - clazz.getQualifiedName().toString() + Markers.DOT + field.getSimpleName().toString(), - new JavadocElement(parsedJavadoc.description(), parsedJavadoc.since(), rawJavadoc)); + if (rawJavadoc.isEmpty()) { + // We require a Javadoc for config items that are not config groups except if they are a section + if (!resolvedType.isConfigGroup() + || utils.element().isAnnotationPresent(field, Types.ANNOTATION_CONFIG_DOC_SECTION)) { + utils.element().addMissingJavadocError(field); + } + return; } + + ParsedJavadoc parsedJavadoc = JavadocToAsciidocTransformer.INSTANCE.parseConfigItemJavadoc(rawJavadoc.get()); + + configCollector.addJavadocElement( + clazz.getQualifiedName().toString() + Markers.DOT + field.getSimpleName().toString(), + new JavadocElement(parsedJavadoc.description(), parsedJavadoc.since(), rawJavadoc.get())); } } diff --git a/core/processor/src/main/java/io/quarkus/annotation/processor/documentation/config/scanner/LegacyConfigListener.java b/core/processor/src/main/java/io/quarkus/annotation/processor/documentation/config/scanner/LegacyConfigListener.java index 4de6ea2df740a..103fc09e44eda 100644 --- a/core/processor/src/main/java/io/quarkus/annotation/processor/documentation/config/scanner/LegacyConfigListener.java +++ b/core/processor/src/main/java/io/quarkus/annotation/processor/documentation/config/scanner/LegacyConfigListener.java @@ -158,10 +158,6 @@ public void onEnclosedField(DiscoveryRootElement discoveryRootElement, TypeEleme builder.converted(); } - if (utils.element().isLocalClass(clazz)) { - utils.element().checkRequiredJavadoc(field); - } - AnnotationMirror configDocSectionAnnotation = fieldAnnotations.get(Types.ANNOTATION_CONFIG_DOC_SECTION); if (configDocSectionAnnotation != null) { builder.section(); diff --git a/core/processor/src/main/java/io/quarkus/annotation/processor/util/ElementUtil.java b/core/processor/src/main/java/io/quarkus/annotation/processor/util/ElementUtil.java index 9e91eccb7e34a..c16f628798fba 100644 --- a/core/processor/src/main/java/io/quarkus/annotation/processor/util/ElementUtil.java +++ b/core/processor/src/main/java/io/quarkus/annotation/processor/util/ElementUtil.java @@ -2,6 +2,7 @@ import java.util.List; import java.util.Map; +import java.util.Optional; import java.util.Set; import java.util.function.Function; import java.util.regex.Pattern; @@ -129,35 +130,24 @@ public boolean isLocalClass(TypeElement clazz) { } } - public String checkRequiredJavadoc(Element e) { - String javadoc = getJavadoc(e); - - if (javadoc == null) { - processingEnv.getMessager() - .printMessage(Diagnostic.Kind.ERROR, - "Unable to find javadoc for config item " + e.getEnclosingElement() + " " + e, e); - return ""; - } - - return javadoc; - } - - public String getRequiredJavadoc(Element e) { - return checkRequiredJavadoc(e); - } - - public String getJavadoc(Element e) { + public Optional getJavadoc(Element e) { String docComment = processingEnv.getElementUtils().getDocComment(e); - if (docComment == null) { - return null; + if (docComment == null || docComment.isBlank()) { + return Optional.empty(); } // javax.lang.model keeps the leading space after the "*" so we need to remove it. - return REMOVE_LEADING_SPACE.matcher(docComment) + return Optional.of(REMOVE_LEADING_SPACE.matcher(docComment) .replaceAll("") - .trim(); + .trim()); + } + + public void addMissingJavadocError(Element e) { + processingEnv.getMessager() + .printMessage(Diagnostic.Kind.ERROR, + "Unable to find javadoc for config item " + e.getEnclosingElement() + " " + e, e); } public boolean isJdkClass(TypeElement e) { From 8dd0497a0134267cf55cc2b42c336ca395d6ace3 Mon Sep 17 00:00:00 2001 From: Guillaume Smet Date: Sat, 3 Aug 2024 17:51:47 +0200 Subject: [PATCH 22/43] Add placeholders for missing Javadoc in AzureFunctionsConfig --- .../azure/functions/deployment/AzureFunctionsConfig.java | 5 +++-- 1 file changed, 3 insertions(+), 2 deletions(-) diff --git a/extensions/azure-functions/deployment/src/main/java/io/quarkus/azure/functions/deployment/AzureFunctionsConfig.java b/extensions/azure-functions/deployment/src/main/java/io/quarkus/azure/functions/deployment/AzureFunctionsConfig.java index 4a29e13e3cca5..b2994e55bd132 100644 --- a/extensions/azure-functions/deployment/src/main/java/io/quarkus/azure/functions/deployment/AzureFunctionsConfig.java +++ b/extensions/azure-functions/deployment/src/main/java/io/quarkus/azure/functions/deployment/AzureFunctionsConfig.java @@ -85,7 +85,7 @@ public class AzureFunctionsConfig { public String appServicePlanName; /** - * + * The app service plan resource group. */ @ConfigItem public Optional appServicePlanResourceGroup; @@ -95,8 +95,9 @@ public class AzureFunctionsConfig { */ @ConfigItem public Optional subscriptionId; + /** - * + * The pricing tier. */ @ConfigItem public Optional pricingTier; From 6f729ea6b8c6b9ddb4bc85f6650a33659cbc7883 Mon Sep 17 00:00:00 2001 From: Guillaume Smet Date: Sat, 3 Aug 2024 18:07:46 +0200 Subject: [PATCH 23/43] Properly propagate the source class --- .../discovery/DiscoveryConfigProperty.java | 21 +++++++++++++------ .../config/resolver/ConfigResolver.java | 4 ++-- .../config/scanner/ConfigMappingListener.java | 4 ++-- .../config/scanner/LegacyConfigListener.java | 4 ++-- 4 files changed, 21 insertions(+), 12 deletions(-) diff --git a/core/processor/src/main/java/io/quarkus/annotation/processor/documentation/config/discovery/DiscoveryConfigProperty.java b/core/processor/src/main/java/io/quarkus/annotation/processor/documentation/config/discovery/DiscoveryConfigProperty.java index 952e4cac625e1..4cbadec9ea149 100644 --- a/core/processor/src/main/java/io/quarkus/annotation/processor/documentation/config/discovery/DiscoveryConfigProperty.java +++ b/core/processor/src/main/java/io/quarkus/annotation/processor/documentation/config/discovery/DiscoveryConfigProperty.java @@ -6,6 +6,7 @@ public class DiscoveryConfigProperty { private final String path; + private final String sourceClass; private final String sourceName; private final String defaultValue; private final String defaultValueForDoc; @@ -16,11 +17,12 @@ public class DiscoveryConfigProperty { private final boolean converted; private final boolean section; - public DiscoveryConfigProperty(String path, String sourceName, String defaultValue, String defaultValueForDoc, - boolean deprecated, String mapKey, boolean unnamedMapKey, + public DiscoveryConfigProperty(String path, String sourceClass, String sourceName, String defaultValue, + String defaultValueForDoc, boolean deprecated, String mapKey, boolean unnamedMapKey, ResolvedType type, boolean converted, boolean section) { this.path = path; + this.sourceClass = sourceClass; this.sourceName = sourceName; this.defaultValue = defaultValue; this.defaultValueForDoc = defaultValueForDoc; @@ -36,6 +38,10 @@ public String getPath() { return path; } + public String getSourceClass() { + return sourceClass; + } + public String getSourceName() { return sourceName; } @@ -79,6 +85,7 @@ public String toString() { public String toString(String prefix) { StringBuilder sb = new StringBuilder(); sb.append(prefix + "name = " + path + "\n"); + sb.append(prefix + "sourceClass = " + sourceClass + "\n"); sb.append(prefix + "sourceName = " + sourceName + "\n"); sb.append(prefix + "type = " + type + "\n"); if (defaultValue != null) { @@ -103,13 +110,14 @@ public String toString(String prefix) { return sb.toString(); } - public static Builder builder(String sourceName, ResolvedType type) { - return new Builder(sourceName, type); + public static Builder builder(String sourceClass, String sourceName, ResolvedType type) { + return new Builder(sourceClass, sourceName, type); } public static class Builder { private String name; + private final String sourceClass; private final String sourceName; private final ResolvedType type; private String defaultValue; @@ -120,7 +128,8 @@ public static class Builder { private boolean converted = false; private boolean section = false; - public Builder(String sourceName, ResolvedType type) { + public Builder(String sourceClass, String sourceName, ResolvedType type) { + this.sourceClass = sourceClass; this.sourceName = sourceName; this.type = type; } @@ -173,7 +182,7 @@ public DiscoveryConfigProperty build() { defaultValue = TypeUtil.normalizeDurationValue(defaultValue); } - return new DiscoveryConfigProperty(name, sourceName, defaultValue, defaultValueForDoc, deprecated, + return new DiscoveryConfigProperty(name, sourceClass, sourceName, defaultValue, defaultValueForDoc, deprecated, mapKey, unnamedMapKey, type, converted, section); } } diff --git a/core/processor/src/main/java/io/quarkus/annotation/processor/documentation/config/resolver/ConfigResolver.java b/core/processor/src/main/java/io/quarkus/annotation/processor/documentation/config/resolver/ConfigResolver.java index 7fbeaa2137424..61b80b69537d2 100644 --- a/core/processor/src/main/java/io/quarkus/annotation/processor/documentation/config/resolver/ConfigResolver.java +++ b/core/processor/src/main/java/io/quarkus/annotation/processor/documentation/config/resolver/ConfigResolver.java @@ -123,7 +123,7 @@ private void resolveProperty(ConfigRoot configRoot, ConfigPhase phase, Resolutio ResolutionContext configGroupContext; if (discoveryConfigProperty.isSection()) { - ConfigSection configSection = new ConfigSection(context.getDiscoveryRootElement().getQualifiedName(), + ConfigSection configSection = new ConfigSection(discoveryConfigProperty.getSourceClass(), discoveryConfigProperty.getSourceName(), fullPath, typeQualifiedName, deprecated); context.getItemCollection().addItem(configSection); configGroupContext = new ResolutionContext(fullPath, additionalPaths, discoveryConfigGroup, configSection, @@ -174,7 +174,7 @@ private void resolveProperty(ConfigRoot configRoot, ConfigPhase phase, Resolutio // this is a standard property ConfigProperty configProperty = new ConfigProperty(phase, - context.getDiscoveryRootElement().getQualifiedName(), + discoveryConfigProperty.getSourceClass(), discoveryConfigProperty.getSourceName(), fullPath, additionalPaths, ConfigNamingUtil.toEnvVarName(fullPath), typeQualifiedName, typeSimplifiedName, discoveryConfigProperty.getType().isMap(), discoveryConfigProperty.getType().isList(), diff --git a/core/processor/src/main/java/io/quarkus/annotation/processor/documentation/config/scanner/ConfigMappingListener.java b/core/processor/src/main/java/io/quarkus/annotation/processor/documentation/config/scanner/ConfigMappingListener.java index 753b3de455176..c7fa7a390e32a 100644 --- a/core/processor/src/main/java/io/quarkus/annotation/processor/documentation/config/scanner/ConfigMappingListener.java +++ b/core/processor/src/main/java/io/quarkus/annotation/processor/documentation/config/scanner/ConfigMappingListener.java @@ -107,8 +107,8 @@ public void onEnclosedMethod(DiscoveryRootElement discoveryRootElement, TypeElem Map methodAnnotations = utils.element().getAnnotations(method); String sourceName = method.getSimpleName().toString(); - DiscoveryConfigProperty.Builder builder = DiscoveryConfigProperty.builder(sourceName, - resolvedType); + DiscoveryConfigProperty.Builder builder = DiscoveryConfigProperty.builder(clazz.getQualifiedName().toString(), + sourceName, resolvedType); AnnotationMirror deprecatedAnnotation = methodAnnotations.get(Deprecated.class.getName()); if (deprecatedAnnotation != null) { diff --git a/core/processor/src/main/java/io/quarkus/annotation/processor/documentation/config/scanner/LegacyConfigListener.java b/core/processor/src/main/java/io/quarkus/annotation/processor/documentation/config/scanner/LegacyConfigListener.java index 103fc09e44eda..6dd2ef9e7efd9 100644 --- a/core/processor/src/main/java/io/quarkus/annotation/processor/documentation/config/scanner/LegacyConfigListener.java +++ b/core/processor/src/main/java/io/quarkus/annotation/processor/documentation/config/scanner/LegacyConfigListener.java @@ -107,8 +107,8 @@ public void onEnclosedField(DiscoveryRootElement discoveryRootElement, TypeEleme String sourceName = field.getSimpleName().toString(); String name = ConfigNamingUtil.hyphenate(sourceName); - DiscoveryConfigProperty.Builder builder = DiscoveryConfigProperty.builder(sourceName, - resolvedType); + DiscoveryConfigProperty.Builder builder = DiscoveryConfigProperty.builder(clazz.getQualifiedName().toString(), + sourceName, resolvedType); AnnotationMirror deprecatedAnnotation = fieldAnnotations.get(Deprecated.class.getName()); if (deprecatedAnnotation != null) { From c7d0579502fffddf3f659f26ca8dc66c28de7f8a Mon Sep 17 00:00:00 2001 From: Guillaume Smet Date: Sat, 3 Aug 2024 18:10:46 +0200 Subject: [PATCH 24/43] Ignore aliased types for Javadoc resolution --- .../processor/documentation/config/util/JavadocUtil.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/core/processor/src/main/java/io/quarkus/annotation/processor/documentation/config/util/JavadocUtil.java b/core/processor/src/main/java/io/quarkus/annotation/processor/documentation/config/util/JavadocUtil.java index 242094b306aaf..3e356f54a77aa 100644 --- a/core/processor/src/main/java/io/quarkus/annotation/processor/documentation/config/util/JavadocUtil.java +++ b/core/processor/src/main/java/io/quarkus/annotation/processor/documentation/config/util/JavadocUtil.java @@ -43,7 +43,7 @@ public static String getJavadocSiteLink(String binaryName) { return null; } - if (TypeUtil.isPrimitiveWrapper(binaryName)) { + if (TypeUtil.isPrimitiveWrapper(binaryName) || Types.ALIASED_TYPES.containsKey(binaryName)) { return null; } From 95241fa1f92bea74c449ba0635e72e3874ead422 Mon Sep 17 00:00:00 2001 From: Guillaume Smet Date: Sun, 4 Aug 2024 13:33:26 +0200 Subject: [PATCH 25/43] Also scan @ConfigMapping without @ConfigRoot This is used in Observability Dev Services to share a super interface between several modules. --- .../config/ConfigDocExtensionProcessor.java | 4 + .../scanner/ConfigAnnotationScanner.java | 119 +++++++++++++----- 2 files changed, 94 insertions(+), 29 deletions(-) diff --git a/core/processor/src/main/java/io/quarkus/annotation/processor/documentation/config/ConfigDocExtensionProcessor.java b/core/processor/src/main/java/io/quarkus/annotation/processor/documentation/config/ConfigDocExtensionProcessor.java index 56b2764b4f4f5..da0ae04da9b42 100644 --- a/core/processor/src/main/java/io/quarkus/annotation/processor/documentation/config/ConfigDocExtensionProcessor.java +++ b/core/processor/src/main/java/io/quarkus/annotation/processor/documentation/config/ConfigDocExtensionProcessor.java @@ -41,6 +41,7 @@ public void init(Config config, Utils utils) { public void process(Set annotations, RoundEnvironment roundEnv) { Optional configGroup = findAnnotation(annotations, Types.ANNOTATION_CONFIG_GROUP); Optional configRoot = findAnnotation(annotations, Types.ANNOTATION_CONFIG_ROOT); + Optional configMapping = findAnnotation(annotations, Types.ANNOTATION_CONFIG_MAPPING); // make sure we scan the groups before the root if (configGroup.isPresent()) { @@ -49,6 +50,9 @@ public void process(Set annotations, RoundEnvironment rou if (configRoot.isPresent()) { configAnnotationScanner.scanConfigRoots(roundEnv, configRoot.get()); } + if (configMapping.isPresent()) { + configAnnotationScanner.scanConfigMappingsWithoutConfigRoot(roundEnv, configMapping.get()); + } } private Optional findAnnotation(Set annotations, String annotationName) { diff --git a/core/processor/src/main/java/io/quarkus/annotation/processor/documentation/config/scanner/ConfigAnnotationScanner.java b/core/processor/src/main/java/io/quarkus/annotation/processor/documentation/config/scanner/ConfigAnnotationScanner.java index f3fbbcaaa21b1..7f0aa469e9364 100644 --- a/core/processor/src/main/java/io/quarkus/annotation/processor/documentation/config/scanner/ConfigAnnotationScanner.java +++ b/core/processor/src/main/java/io/quarkus/annotation/processor/documentation/config/scanner/ConfigAnnotationScanner.java @@ -34,6 +34,7 @@ import io.quarkus.annotation.processor.documentation.config.discovery.DiscoveryConfigRoot; import io.quarkus.annotation.processor.documentation.config.discovery.DiscoveryRootElement; import io.quarkus.annotation.processor.documentation.config.discovery.ResolvedType; +import io.quarkus.annotation.processor.documentation.config.model.ConfigPhase; import io.quarkus.annotation.processor.documentation.config.util.TypeUtil; import io.quarkus.annotation.processor.documentation.config.util.Types; import io.quarkus.annotation.processor.util.Config; @@ -46,37 +47,51 @@ public class ConfigAnnotationScanner { private final ConfigCollector configCollector; private final Set configGroupClassNames = new HashSet<>(); private final Set configRootClassNames = new HashSet<>(); + private final Set configMappingWithoutConfigRootClassNames = new HashSet<>(); private final Set enumClassNames = new HashSet<>(); - private final List listeners; + private final List configRootListeners; + + /** + * These are handled specifically as we just want to collect the javadoc. + * They are actually consumed as super interfaces in a config root. + */ + private final List configMappingWithoutConfigRootListeners; public ConfigAnnotationScanner(Config config, Utils utils) { this.config = config; this.utils = utils; this.configCollector = new ConfigCollector(); - List listeners = new ArrayList<>(); + List configRootListeners = new ArrayList<>(); + List configMappingWithoutConfigRootListeners = new ArrayList<>(); + if (!config.getExtension().isMixedModule()) { // This is what we aim for. We have an exception for Quarkus Core and Quarkus Messaging though. if (config.useConfigMapping()) { - listeners.add(new JavadocConfigMappingListener(config, utils, configCollector)); - listeners.add(new ConfigMappingListener(config, utils, configCollector)); + configRootListeners.add(new JavadocConfigMappingListener(config, utils, configCollector)); + configRootListeners.add(new ConfigMappingListener(config, utils, configCollector)); + + configMappingWithoutConfigRootListeners.add(new JavadocConfigMappingListener(config, utils, configCollector)); } else { - listeners.add(new JavadocLegacyConfigRootListener(config, utils, configCollector)); - listeners.add(new LegacyConfigListener(config, utils, configCollector)); + configRootListeners.add(new JavadocLegacyConfigRootListener(config, utils, configCollector)); + configRootListeners.add(new LegacyConfigListener(config, utils, configCollector)); } } else { // TODO #42114 remove once fixed // we handle both traditional config roots and config mappings if (config.getExtension().isMixedModule()) { - listeners.add(new JavadocConfigMappingListener(config, utils, configCollector)); - listeners.add(new JavadocLegacyConfigRootListener(config, utils, configCollector)); - listeners.add(new ConfigMappingListener(config, utils, configCollector)); - listeners.add(new LegacyConfigListener(config, utils, configCollector)); + configRootListeners.add(new JavadocConfigMappingListener(config, utils, configCollector)); + configRootListeners.add(new JavadocLegacyConfigRootListener(config, utils, configCollector)); + configRootListeners.add(new ConfigMappingListener(config, utils, configCollector)); + configRootListeners.add(new LegacyConfigListener(config, utils, configCollector)); + + configMappingWithoutConfigRootListeners.add(new JavadocConfigMappingListener(config, utils, configCollector)); } } - this.listeners = Collections.unmodifiableList(listeners); + this.configRootListeners = Collections.unmodifiableList(configRootListeners); + this.configMappingWithoutConfigRootListeners = Collections.unmodifiableList(configMappingWithoutConfigRootListeners); } public void scanConfigGroups(RoundEnvironment roundEnv, TypeElement annotation) { @@ -89,7 +104,7 @@ public void scanConfigGroups(RoundEnvironment roundEnv, TypeElement annotation) try { DiscoveryConfigGroup discoveryConfigGroup = applyRootListeners(l -> l.onConfigGroup(configGroup)); - scanElement(discoveryConfigGroup, configGroup); + scanElement(configRootListeners, discoveryConfigGroup, configGroup); } catch (Exception e) { throw new IllegalStateException("Unable to scan config group: " + configGroup, e); } @@ -115,20 +130,60 @@ public void scanConfigRoots(RoundEnvironment roundEnv, TypeElement annotation) { try { DiscoveryConfigRoot discoveryConfigRoot = applyRootListeners(l -> l.onConfigRoot(configRoot)); - scanElement(discoveryConfigRoot, configRoot); + scanElement(configRootListeners, discoveryConfigRoot, configRoot); } catch (Exception e) { throw new IllegalStateException("Unable to scan config root: " + configRoot, e); } } } + /** + * In this case, we will just apply the Javadoc listeners to collect Javadoc. + */ + public void scanConfigMappingsWithoutConfigRoot(RoundEnvironment roundEnv, TypeElement annotation) { + for (TypeElement configMappingWithoutConfigRoot : typesIn(roundEnv.getElementsAnnotatedWith(annotation))) { + if (utils.element().isAnnotationPresent(configMappingWithoutConfigRoot, Types.ANNOTATION_CONFIG_ROOT)) { + continue; + } + + final PackageElement pkg = utils.element().getPackageOf(configMappingWithoutConfigRoot); + if (pkg == null) { + utils.processingEnv().getMessager().printMessage(Diagnostic.Kind.ERROR, + "Element " + configMappingWithoutConfigRoot + " has no enclosing package"); + continue; + } + + if (isConfigMappingWithoutConfigRootAlreadyHandled(configMappingWithoutConfigRoot)) { + continue; + } + + debug("Detected config mapping without config root: " + configMappingWithoutConfigRoot, + configMappingWithoutConfigRoot); + + try { + // we need to forge a dummy DiscoveryConfigRoot + // it's mostly ignored in the listeners, except for checking if it's a config mapping (for mixed modules) + DiscoveryConfigRoot discoveryConfigRoot = new DiscoveryConfigRoot(config.getExtension(), "dummy", + utils.element().getBinaryName(configMappingWithoutConfigRoot), + configMappingWithoutConfigRoot.getQualifiedName().toString(), + ConfigPhase.BUILD_TIME, null, true); + scanElement(configMappingWithoutConfigRootListeners, discoveryConfigRoot, configMappingWithoutConfigRoot); + } catch (Exception e) { + throw new IllegalStateException( + "Unable to scan config mapping without config root: " + configMappingWithoutConfigRoot, e); + } + } + } + public ConfigCollector finalizeProcessing() { - applyListeners(l -> l.finalizeProcessing()); + applyListeners(configRootListeners, l -> l.finalizeProcessing()); + applyListeners(configMappingWithoutConfigRootListeners, l -> l.finalizeProcessing()); return configCollector; } - private void scanElement(DiscoveryRootElement configRootElement, TypeElement clazz) { + private void scanElement(List listeners, DiscoveryRootElement configRootElement, + TypeElement clazz) { // we scan the superclass and interfaces first so that the local elements can potentially override them if (clazz.getKind() == ElementKind.INTERFACE) { List superInterfaces = clazz.getInterfaces(); @@ -137,9 +192,9 @@ private void scanElement(DiscoveryRootElement configRootElement, TypeElement cla debug("Detected superinterface: " + superInterfaceTypeElement, clazz); - applyListeners(l -> l.onInterface(configRootElement, superInterfaceTypeElement)); + applyListeners(listeners, l -> l.onInterface(configRootElement, superInterfaceTypeElement)); if (!isConfigRootAlreadyHandled(superInterfaceTypeElement)) { - scanElement(configRootElement, superInterfaceTypeElement); + scanElement(listeners, configRootElement, superInterfaceTypeElement); } } } else { @@ -149,9 +204,9 @@ private void scanElement(DiscoveryRootElement configRootElement, TypeElement cla debug("Detected superclass: " + superclassTypeElement, clazz); - applyListeners(l -> l.onSuperclass(configRootElement, clazz)); + applyListeners(listeners, l -> l.onSuperclass(configRootElement, clazz)); if (!isConfigRootAlreadyHandled(superclassTypeElement)) { - scanElement(configRootElement, superclassTypeElement); + scanElement(listeners, configRootElement, superclassTypeElement); } } } @@ -175,7 +230,7 @@ private void scanElement(DiscoveryRootElement configRootElement, TypeElement cla ResolvedType resolvedType = resolveType(returnType); if (resolvedType.isEnum()) { - handleEnum(resolvedType.unwrappedTypeElement()); + handleEnum(listeners, resolvedType.unwrappedTypeElement()); } else if (resolvedType.isInterface()) { TypeElement unwrappedTypeElement = resolvedType.unwrappedTypeElement(); if (!utils.element().isJdkClass(unwrappedTypeElement)) { @@ -185,14 +240,14 @@ private void scanElement(DiscoveryRootElement configRootElement, TypeElement cla DiscoveryConfigGroup discoveryConfigGroup = applyRootListeners( l -> l.onConfigGroup(unwrappedTypeElement)); - scanElement(discoveryConfigGroup, unwrappedTypeElement); + scanElement(listeners, discoveryConfigGroup, unwrappedTypeElement); } } } debug("Detected enclosed method: " + method, e); - applyListeners(l -> l.onEnclosedMethod(configRootElement, clazz, method, resolvedType)); + applyListeners(listeners, l -> l.onEnclosedMethod(configRootElement, clazz, method, resolvedType)); break; } @@ -207,17 +262,17 @@ private void scanElement(DiscoveryRootElement configRootElement, TypeElement cla ResolvedType resolvedType = resolveType(field.asType()); if (resolvedType.isEnum()) { - handleEnum(resolvedType.unwrappedTypeElement()); + handleEnum(listeners, resolvedType.unwrappedTypeElement()); } debug("Detected enclosed field: " + field, clazz); - applyListeners(l -> l.onEnclosedField(configRootElement, clazz, field, resolvedType)); + applyListeners(listeners, l -> l.onEnclosedField(configRootElement, clazz, field, resolvedType)); break; } case ENUM: { - handleEnum((TypeElement) e); + handleEnum(listeners, (TypeElement) e); break; } @@ -228,12 +283,12 @@ private void scanElement(DiscoveryRootElement configRootElement, TypeElement cla } } - private void handleEnum(TypeElement enumTypeElement) { + private void handleEnum(List listeners, TypeElement enumTypeElement) { if (isEnumAlreadyHandled(enumTypeElement)) { return; } - applyListeners(l -> l.onResolvedEnum(enumTypeElement)); + applyListeners(listeners, l -> l.onResolvedEnum(enumTypeElement)); } private boolean isConfigRootAlreadyHandled(TypeElement clazz) { @@ -242,6 +297,12 @@ private boolean isConfigRootAlreadyHandled(TypeElement clazz) { return !configRootClassNames.add(qualifiedName); } + private boolean isConfigMappingWithoutConfigRootAlreadyHandled(TypeElement clazz) { + String qualifiedName = clazz.getQualifiedName().toString(); + + return !configMappingWithoutConfigRootClassNames.add(qualifiedName); + } + private boolean isConfigGroupAlreadyHandled(TypeElement clazz) { String qualifiedName = clazz.getQualifiedName().toString(); @@ -382,7 +443,7 @@ public boolean isFieldIgnored(VariableElement field) { return false; } - private void applyListeners(Consumer listenerFunction) { + private void applyListeners(List listeners, Consumer listenerFunction) { for (ConfigAnnotationListener listener : listeners) { listenerFunction.accept(listener); } @@ -392,7 +453,7 @@ private T applyRootListeners( Function> listenerFunction) { T discoveryRootElement = null; - for (ConfigAnnotationListener listener : listeners) { + for (ConfigAnnotationListener listener : configRootListeners) { Optional discoveryRootElementCandidate = listenerFunction.apply(listener); if (discoveryRootElementCandidate.isPresent()) { if (discoveryRootElement != null) { From 2ab5bffce71dfb9238ff0f65197d0173e4a9bb32 Mon Sep 17 00:00:00 2001 From: Guillaume Smet Date: Sun, 4 Aug 2024 15:22:47 +0200 Subject: [PATCH 26/43] Allow generating specific config sections We use to generate a gazillion of config groups files and most were unused. In the new annotation, we only generate specific files if a section is marked with @ConfigSection(generated = true). --- .../discovery/DiscoveryConfigProperty.java | 14 +- .../config/model/ConfigItemCollection.java | 3 + .../config/model/ConfigSection.java | 11 +- .../documentation/config/model/Extension.java | 5 + .../config/resolver/ConfigResolver.java | 24 ++- .../config/scanner/ConfigMappingListener.java | 8 +- .../config/scanner/LegacyConfigListener.java | 8 +- .../runtime/annotations/ConfigDocSection.java | 9 + .../maven/config/doc/ConfigRootKey.java | 68 ------- .../config/doc/GenerateAsciidocMojo.java | 157 +++++++++++----- .../quarkus/maven/config/doc/MergedModel.java | 29 +++ .../templates/configReference.qute.adoc | 2 +- .../runtime/DataSourceBuildTimeConfig.java | 4 +- .../DevServicesElasticsearchProcessor.java | 14 +- .../DevservicesElasticsearchBuildItem.java | 3 +- .../ElasticsearchCommonBuildTimeConfig.java | 169 ++++++++++++++++++ ...asticsearchDevServicesBuildTimeConfig.java | 155 ---------------- ...HibernateSearchElasticsearchProcessor.java | 2 +- .../HibernateSearchStandaloneProcessor.java | 2 +- .../InfinispanClientBuildTimeConfig.java | 11 +- .../deployment/KafkaBuildTimeConfig.java | 6 +- .../runtime/KubernetesClientBuildConfig.java | 2 +- .../runtime/LiquibaseRuntimeConfig.java | 2 +- .../MongoClientBuildTimeConfig.java | 6 +- .../keycloak/KeycloakBuildTimeConfig.java | 4 +- .../client/RedisBuildTimeConfig.java | 6 +- .../ApicurioRegistryBuildTimeConfig.java | 87 +++++++++ ...rioRegistryDevServicesBuildTimeConfig.java | 73 -------- .../DevServicesApicurioRegistryProcessor.java | 5 +- .../amqp/deployment/AmqpBuildTimeConfig.java | 6 +- .../deployment/PulsarBuildTimeConfig.java | 6 +- .../deployment/RabbitMQBuildTimeConfig.java | 5 +- 32 files changed, 522 insertions(+), 384 deletions(-) delete mode 100644 devtools/config-doc-maven-plugin/src/main/java/io/quarkus/maven/config/doc/ConfigRootKey.java create mode 100644 devtools/config-doc-maven-plugin/src/main/java/io/quarkus/maven/config/doc/MergedModel.java create mode 100644 extensions/elasticsearch-rest-client-common/deployment/src/main/java/io/quarkus/elasticsearch/restclient/common/deployment/ElasticsearchCommonBuildTimeConfig.java delete mode 100644 extensions/elasticsearch-rest-client-common/deployment/src/main/java/io/quarkus/elasticsearch/restclient/common/deployment/ElasticsearchDevServicesBuildTimeConfig.java create mode 100644 extensions/schema-registry/devservice/deployment/src/main/java/io/quarkus/apicurio/registry/devservice/ApicurioRegistryBuildTimeConfig.java delete mode 100644 extensions/schema-registry/devservice/deployment/src/main/java/io/quarkus/apicurio/registry/devservice/ApicurioRegistryDevServicesBuildTimeConfig.java diff --git a/core/processor/src/main/java/io/quarkus/annotation/processor/documentation/config/discovery/DiscoveryConfigProperty.java b/core/processor/src/main/java/io/quarkus/annotation/processor/documentation/config/discovery/DiscoveryConfigProperty.java index 4cbadec9ea149..84c5ff19660c7 100644 --- a/core/processor/src/main/java/io/quarkus/annotation/processor/documentation/config/discovery/DiscoveryConfigProperty.java +++ b/core/processor/src/main/java/io/quarkus/annotation/processor/documentation/config/discovery/DiscoveryConfigProperty.java @@ -16,11 +16,12 @@ public class DiscoveryConfigProperty { private final ResolvedType type; private final boolean converted; private final boolean section; + private final boolean sectionGenerated; public DiscoveryConfigProperty(String path, String sourceClass, String sourceName, String defaultValue, String defaultValueForDoc, boolean deprecated, String mapKey, boolean unnamedMapKey, ResolvedType type, boolean converted, - boolean section) { + boolean section, boolean sectionGenerated) { this.path = path; this.sourceClass = sourceClass; this.sourceName = sourceName; @@ -32,6 +33,7 @@ public DiscoveryConfigProperty(String path, String sourceClass, String sourceNam this.type = type; this.converted = converted; this.section = section; + this.sectionGenerated = sectionGenerated; } public String getPath() { @@ -78,6 +80,10 @@ public boolean isSection() { return section; } + public boolean isSectionGenerated() { + return sectionGenerated; + } + public String toString() { return toString(""); } @@ -127,6 +133,7 @@ public static class Builder { private boolean unnamedMapKey = false; private boolean converted = false; private boolean section = false; + private boolean sectionGenerated = false; public Builder(String sourceClass, String sourceName, ResolvedType type) { this.sourceClass = sourceClass; @@ -169,8 +176,9 @@ public Builder converted() { return this; } - public Builder section() { + public Builder section(boolean generated) { this.section = true; + this.sectionGenerated = generated; return this; } @@ -183,7 +191,7 @@ public DiscoveryConfigProperty build() { } return new DiscoveryConfigProperty(name, sourceClass, sourceName, defaultValue, defaultValueForDoc, deprecated, - mapKey, unnamedMapKey, type, converted, section); + mapKey, unnamedMapKey, type, converted, section, sectionGenerated); } } } diff --git a/core/processor/src/main/java/io/quarkus/annotation/processor/documentation/config/model/ConfigItemCollection.java b/core/processor/src/main/java/io/quarkus/annotation/processor/documentation/config/model/ConfigItemCollection.java index 111f3ab1ebb97..445ef620414dc 100644 --- a/core/processor/src/main/java/io/quarkus/annotation/processor/documentation/config/model/ConfigItemCollection.java +++ b/core/processor/src/main/java/io/quarkus/annotation/processor/documentation/config/model/ConfigItemCollection.java @@ -8,4 +8,7 @@ public interface ConfigItemCollection { void addItem(AbstractConfigItem item); + boolean hasDurationType(); + + boolean hasMemorySizeType(); } diff --git a/core/processor/src/main/java/io/quarkus/annotation/processor/documentation/config/model/ConfigSection.java b/core/processor/src/main/java/io/quarkus/annotation/processor/documentation/config/model/ConfigSection.java index 4681d868d57e6..7b88e9ea889ea 100644 --- a/core/processor/src/main/java/io/quarkus/annotation/processor/documentation/config/model/ConfigSection.java +++ b/core/processor/src/main/java/io/quarkus/annotation/processor/documentation/config/model/ConfigSection.java @@ -7,10 +7,13 @@ public final class ConfigSection extends AbstractConfigItem implements ConfigItemCollection { + private boolean generated; private final List items = new ArrayList<>(); - public ConfigSection(String sourceClass, String sourceName, String path, String type, boolean deprecated) { + public ConfigSection(String sourceClass, String sourceName, String path, String type, boolean generated, + boolean deprecated) { super(sourceClass, sourceName, path, type, deprecated); + this.generated = generated; } @Override @@ -36,7 +39,13 @@ public boolean isSection() { return true; } + public boolean isGenerated() { + return generated; + } + public void merge(ConfigSection other) { + this.generated = this.generated || other.generated; + for (AbstractConfigItem otherItem : other.getItems()) { if (otherItem instanceof ConfigSection configSection) { Optional similarConfigSection = findSimilarSection(configSection); diff --git a/core/processor/src/main/java/io/quarkus/annotation/processor/documentation/config/model/Extension.java b/core/processor/src/main/java/io/quarkus/annotation/processor/documentation/config/model/Extension.java index 0f45e93af2edd..4010d79390bc6 100644 --- a/core/processor/src/main/java/io/quarkus/annotation/processor/documentation/config/model/Extension.java +++ b/core/processor/src/main/java/io/quarkus/annotation/processor/documentation/config/model/Extension.java @@ -6,6 +6,11 @@ public record Extension(String groupId, String artifactId, String name) { + @Override + public final String toString() { + return groupId + ":" + artifactId; + } + @Override public int hashCode() { return Objects.hash(artifactId, groupId); diff --git a/core/processor/src/main/java/io/quarkus/annotation/processor/documentation/config/resolver/ConfigResolver.java b/core/processor/src/main/java/io/quarkus/annotation/processor/documentation/config/resolver/ConfigResolver.java index 61b80b69537d2..67ddb9ef78b84 100644 --- a/core/processor/src/main/java/io/quarkus/annotation/processor/documentation/config/resolver/ConfigResolver.java +++ b/core/processor/src/main/java/io/quarkus/annotation/processor/documentation/config/resolver/ConfigResolver.java @@ -75,7 +75,7 @@ public ResolvedModel resolveModel() { configRoot.addQualifiedName(discoveryConfigRoot.getQualifiedName()); ResolutionContext context = new ResolutionContext(configRoot.getPrefix(), new ArrayList<>(), discoveryConfigRoot, - configRoot, false, false); + configRoot, false, false, false); for (DiscoveryConfigProperty discoveryConfigProperty : discoveryConfigRoot.getProperties().values()) { resolveProperty(configRoot, discoveryConfigRoot.getPhase(), context, discoveryConfigProperty); } @@ -122,15 +122,23 @@ private void resolveProperty(ConfigRoot configRoot, ConfigPhase phase, Resolutio ResolutionContext configGroupContext; + boolean isWithinMap = context.isWithinMap() || discoveryConfigProperty.getType().isMap(); + boolean isWithMapWithUnnamedKey = context.isWithinMapWithUnnamedKey() || discoveryConfigProperty.isUnnamedMapKey(); + if (discoveryConfigProperty.isSection()) { + // we don't generate a section file for sections inside a map + boolean isSectionGenerated = discoveryConfigProperty.isSectionGenerated() && + (!isWithinMap || isWithMapWithUnnamedKey); + ConfigSection configSection = new ConfigSection(discoveryConfigProperty.getSourceClass(), - discoveryConfigProperty.getSourceName(), fullPath, typeQualifiedName, deprecated); + discoveryConfigProperty.getSourceName(), fullPath, typeQualifiedName, + isSectionGenerated, deprecated); context.getItemCollection().addItem(configSection); configGroupContext = new ResolutionContext(fullPath, additionalPaths, discoveryConfigGroup, configSection, - discoveryConfigProperty.getType().isMap(), deprecated); + isWithinMap, isWithMapWithUnnamedKey, deprecated); } else { configGroupContext = new ResolutionContext(fullPath, additionalPaths, discoveryConfigGroup, - context.getItemCollection(), discoveryConfigProperty.getType().isMap(), deprecated); + context.getItemCollection(), isWithinMap, isWithMapWithUnnamedKey, deprecated); } for (DiscoveryConfigProperty configGroupProperty : discoveryConfigGroup.getProperties().values()) { @@ -232,16 +240,18 @@ private static class ResolutionContext { private final DiscoveryRootElement discoveryRootElement; private final ConfigItemCollection itemCollection; private final boolean withinMap; + private final boolean withinMapWithUnnamedKey; private final boolean deprecated; private ResolutionContext(String path, List additionalPaths, DiscoveryRootElement discoveryRootElement, ConfigItemCollection itemCollection, - boolean withinMap, boolean deprecated) { + boolean withinMap, boolean withinMapWithUnnamedKey, boolean deprecated) { this.path = path; this.additionalPaths = additionalPaths; this.discoveryRootElement = discoveryRootElement; this.itemCollection = itemCollection; this.withinMap = withinMap; + this.withinMapWithUnnamedKey = withinMapWithUnnamedKey; this.deprecated = deprecated; } @@ -265,6 +275,10 @@ public boolean isWithinMap() { return withinMap; } + public boolean isWithinMapWithUnnamedKey() { + return withinMapWithUnnamedKey; + } + public boolean isDeprecated() { return deprecated; } diff --git a/core/processor/src/main/java/io/quarkus/annotation/processor/documentation/config/scanner/ConfigMappingListener.java b/core/processor/src/main/java/io/quarkus/annotation/processor/documentation/config/scanner/ConfigMappingListener.java index c7fa7a390e32a..3fb6b2d777c96 100644 --- a/core/processor/src/main/java/io/quarkus/annotation/processor/documentation/config/scanner/ConfigMappingListener.java +++ b/core/processor/src/main/java/io/quarkus/annotation/processor/documentation/config/scanner/ConfigMappingListener.java @@ -158,7 +158,13 @@ public void onEnclosedMethod(DiscoveryRootElement discoveryRootElement, TypeElem AnnotationMirror configDocSectionAnnotation = methodAnnotations.get(Types.ANNOTATION_CONFIG_DOC_SECTION); if (configDocSectionAnnotation != null) { - builder.section(); + Boolean sectionGenerated = (Boolean) utils.element().getAnnotationValues(configDocSectionAnnotation) + .get("generated"); + if (sectionGenerated != null && sectionGenerated) { + builder.section(true); + } else { + builder.section(false); + } } discoveryRootElement.addProperty(builder.build()); diff --git a/core/processor/src/main/java/io/quarkus/annotation/processor/documentation/config/scanner/LegacyConfigListener.java b/core/processor/src/main/java/io/quarkus/annotation/processor/documentation/config/scanner/LegacyConfigListener.java index 6dd2ef9e7efd9..8d9d3d823c85e 100644 --- a/core/processor/src/main/java/io/quarkus/annotation/processor/documentation/config/scanner/LegacyConfigListener.java +++ b/core/processor/src/main/java/io/quarkus/annotation/processor/documentation/config/scanner/LegacyConfigListener.java @@ -160,7 +160,13 @@ public void onEnclosedField(DiscoveryRootElement discoveryRootElement, TypeEleme AnnotationMirror configDocSectionAnnotation = fieldAnnotations.get(Types.ANNOTATION_CONFIG_DOC_SECTION); if (configDocSectionAnnotation != null) { - builder.section(); + Boolean sectionGenerated = (Boolean) utils.element().getAnnotationValues(configDocSectionAnnotation) + .get("generated"); + if (sectionGenerated != null && sectionGenerated) { + builder.section(true); + } else { + builder.section(false); + } } discoveryRootElement.addProperty(builder.build()); diff --git a/core/runtime/src/main/java/io/quarkus/runtime/annotations/ConfigDocSection.java b/core/runtime/src/main/java/io/quarkus/runtime/annotations/ConfigDocSection.java index 9560abb2d30a8..08544ac6e861b 100644 --- a/core/runtime/src/main/java/io/quarkus/runtime/annotations/ConfigDocSection.java +++ b/core/runtime/src/main/java/io/quarkus/runtime/annotations/ConfigDocSection.java @@ -17,4 +17,13 @@ @Retention(RUNTIME) @Target({ FIELD, PARAMETER, METHOD }) public @interface ConfigDocSection { + + /** + * If we should generate a specific file for this section. + *

+ * We used to do it for all config groups before but it's counterproductive. + * The new annotation processor only generates a file for a config group + * if this is true. + */ + boolean generated() default false; } diff --git a/devtools/config-doc-maven-plugin/src/main/java/io/quarkus/maven/config/doc/ConfigRootKey.java b/devtools/config-doc-maven-plugin/src/main/java/io/quarkus/maven/config/doc/ConfigRootKey.java deleted file mode 100644 index 32e3809004c65..0000000000000 --- a/devtools/config-doc-maven-plugin/src/main/java/io/quarkus/maven/config/doc/ConfigRootKey.java +++ /dev/null @@ -1,68 +0,0 @@ -package io.quarkus.maven.config.doc; - -import java.util.Objects; -import java.util.regex.Pattern; - -import io.quarkus.annotation.processor.documentation.config.util.Markers; - -class ConfigRootKey { - - private final String groupId; - private final String artifactId; - private final String topLevelPrefix; - - public ConfigRootKey(String groupId, String artifactId, String prefix) { - this.groupId = groupId; - this.artifactId = artifactId; - this.topLevelPrefix = buildTopLevelPrefix(prefix); - } - - public String getGroupId() { - return groupId; - } - - public String getArtifactId() { - return artifactId; - } - - public String getTopLevelPrefix() { - return topLevelPrefix; - } - - private static String buildTopLevelPrefix(String prefix) { - String[] prefixSegments = prefix.split(Pattern.quote(Markers.DOT)); - - if (prefixSegments.length == 1) { - return prefixSegments[0]; - } - - return prefixSegments[0] + Markers.DOT + prefixSegments[1]; - } - - @Override - public int hashCode() { - return Objects.hash(artifactId, groupId, topLevelPrefix); - } - - @Override - public boolean equals(Object obj) { - if (this == obj) { - return true; - } - if (obj == null) { - return false; - } - if (getClass() != obj.getClass()) { - return false; - } - ConfigRootKey other = (ConfigRootKey) obj; - return Objects.equals(artifactId, other.artifactId) && Objects.equals(groupId, other.groupId) - && Objects.equals(topLevelPrefix, other.topLevelPrefix); - } - - @Override - public String toString() { - return "ConfigRootKey [groupId=" + groupId + ", artifactId=" + artifactId + ", topLevelPrefix=" + topLevelPrefix - + "]"; - } -} \ No newline at end of file diff --git a/devtools/config-doc-maven-plugin/src/main/java/io/quarkus/maven/config/doc/GenerateAsciidocMojo.java b/devtools/config-doc-maven-plugin/src/main/java/io/quarkus/maven/config/doc/GenerateAsciidocMojo.java index 8314cd5f0c747..273fdca9d9126 100644 --- a/devtools/config-doc-maven-plugin/src/main/java/io/quarkus/maven/config/doc/GenerateAsciidocMojo.java +++ b/devtools/config-doc-maven-plugin/src/main/java/io/quarkus/maven/config/doc/GenerateAsciidocMojo.java @@ -16,7 +16,7 @@ import java.util.List; import java.util.Map; import java.util.Map.Entry; -import java.util.stream.Collectors; +import java.util.regex.Pattern; import org.apache.maven.execution.MavenSession; import org.apache.maven.plugin.AbstractMojo; @@ -31,12 +31,16 @@ import com.fasterxml.jackson.module.paramnames.ParameterNamesModule; import io.quarkus.annotation.processor.Outputs; +import io.quarkus.annotation.processor.documentation.config.model.AbstractConfigItem; +import io.quarkus.annotation.processor.documentation.config.model.ConfigItemCollection; import io.quarkus.annotation.processor.documentation.config.model.ConfigProperty; import io.quarkus.annotation.processor.documentation.config.model.ConfigRoot; import io.quarkus.annotation.processor.documentation.config.model.ConfigSection; +import io.quarkus.annotation.processor.documentation.config.model.Extension; import io.quarkus.annotation.processor.documentation.config.model.JavadocElements; import io.quarkus.annotation.processor.documentation.config.model.JavadocElements.JavadocElement; import io.quarkus.annotation.processor.documentation.config.model.ResolvedModel; +import io.quarkus.annotation.processor.documentation.config.util.Markers; import io.quarkus.qute.Engine; import io.quarkus.qute.ReflectionValueResolver; import io.quarkus.qute.UserTagSectionHelper; @@ -72,62 +76,81 @@ public void execute() throws MojoExecutionException, MojoFailureException { List targetDirectories = findTargetDirectories(resolvedScanDirectory); JavadocRepository javadocRepository = findJavadocElements(targetDirectories); - Map configRoots = findConfigRoots(targetDirectories); + MergedModel mergedModel = mergeModel(targetDirectories); AsciidocFormatter asciidocFormatter = new AsciidocFormatter(javadocRepository); Engine quteEngine = initializeQuteEngine(asciidocFormatter); // we generate a file per extension + top level prefix - for (Entry configRootEntry : configRoots.entrySet()) { - ConfigRootKey configRootKey = configRootEntry.getKey(); - ConfigRoot configRoot = configRootEntry.getValue(); - - Path configRootAdocPath = resolvedTargetDirectory.resolve(String.format(CONFIG_ROOT_FILE_FORMAT, - configRootKey.getArtifactId(), configRootKey.getTopLevelPrefix())); - String summaryTableId = asciidocFormatter - .toAnchor(configRootKey.getArtifactId() + "_" + configRootKey.getTopLevelPrefix()); - - try { - Files.writeString(configRootAdocPath, - generateConfigReference(quteEngine, summaryTableId, configRootKey, configRoot)); - } catch (Exception e) { - throw new MojoExecutionException("Unable to render config root: " + configRootKey, e); + for (Entry> extensionConfigRootsEntry : mergedModel.getConfigRoots().entrySet()) { + Extension extension = extensionConfigRootsEntry.getKey(); + + Path configRootAdocPath = null; + + for (Entry configRootEntry : extensionConfigRootsEntry.getValue().entrySet()) { + String topLevelPrefix = configRootEntry.getKey(); + ConfigRoot configRoot = configRootEntry.getValue(); + + configRootAdocPath = resolvedTargetDirectory.resolve(String.format(CONFIG_ROOT_FILE_FORMAT, + extension.artifactId(), topLevelPrefix)); + String summaryTableId = asciidocFormatter + .toAnchor(extension.artifactId() + "_" + topLevelPrefix); + + try { + Files.writeString(configRootAdocPath, + generateConfigReference(quteEngine, summaryTableId, configRoot)); + } catch (Exception e) { + throw new MojoExecutionException("Unable to render config roots for top level prefix: " + topLevelPrefix + + " in extension: " + extension.toString(), e); + } } - } - // for extensions with only one top level prefix, we also copy the file to an extension file - Map> configRootKeysPerExtension = configRoots.keySet().stream() - .collect(Collectors.groupingBy(crk -> crk.getGroupId() + ":" + crk.getArtifactId())); + // if we have only one top level prefix, we copy the generated file to a file named after the extension + // for simplicity's sake + if (extensionConfigRootsEntry.getValue().size() == 1 && configRootAdocPath != null) { + Path extensionAdocPath = resolvedTargetDirectory.resolve(String.format(EXTENSION_FILE_FORMAT, + extension.artifactId())); - for (List extensionConfigRootKeys : configRootKeysPerExtension.values()) { - if (extensionConfigRootKeys.size() != 1) { - continue; + try { + Files.copy(configRootAdocPath, extensionAdocPath, StandardCopyOption.REPLACE_EXISTING); + } catch (Exception e) { + throw new MojoExecutionException("Unable to copy extension file for: " + extension, e); + } } + } - ConfigRootKey configRootKey = extensionConfigRootKeys.get(0); - - Path extensionAdocPath = resolvedTargetDirectory.resolve(String.format(EXTENSION_FILE_FORMAT, - configRootKey.getArtifactId())); - Path configRootAdocPath = resolvedTargetDirectory.resolve(String.format(CONFIG_ROOT_FILE_FORMAT, - configRootKey.getArtifactId(), configRootKey.getTopLevelPrefix())); - - try { - Files.copy(configRootAdocPath, extensionAdocPath, StandardCopyOption.REPLACE_EXISTING); - } catch (Exception e) { - throw new MojoExecutionException("Unable to copy extension file for: " + configRootKey, e); + // we generate files for generated sections + for (Entry> extensionConfigSectionsEntry : mergedModel.getGeneratedConfigSections() + .entrySet()) { + Extension extension = extensionConfigSectionsEntry.getKey(); + + for (ConfigSection generatedConfigSection : extensionConfigSectionsEntry.getValue()) { + Path configSectionAdocPath = resolvedTargetDirectory.resolve(String.format(CONFIG_ROOT_FILE_FORMAT, + extension.artifactId(), generatedConfigSection.getPath())); + String summaryTableId = asciidocFormatter + .toAnchor(extension.artifactId() + "_" + generatedConfigSection.getPath()); + + try { + Files.writeString(configSectionAdocPath, + generateConfigReference(quteEngine, summaryTableId, generatedConfigSection)); + } catch (Exception e) { + throw new MojoExecutionException( + "Unable to render config section for section: " + generatedConfigSection.getPath() + + " in extension: " + extension.toString(), + e); + } } } } - private static String generateConfigReference(Engine quteEngine, String summaryTableId, ConfigRootKey configRootKey, - ConfigRoot configRoot) { + private static String generateConfigReference(Engine quteEngine, String summaryTableId, + ConfigItemCollection configItemCollection) { return quteEngine.getTemplate("configReference.qute.adoc") - .data("configRootKey", configRootKey) - .data("configRoot", configRoot) + .data("configItemCollection", configItemCollection) .data("searchable", true) .data("summaryTableId", summaryTableId) - .data("includeDurationNote", configRoot.hasDurationType()) - .data("includeMemorySizeNote", configRoot.hasMemorySizeType()) + .data("includeDurationNote", configItemCollection.hasDurationType()) + .data("includeMemorySizeNote", configItemCollection.hasMemorySizeType()) .render(); } @@ -164,8 +187,9 @@ private static JavadocRepository findJavadocElements(List targetDirectorie return new JavadocRepository(javadocElementsMap); } - private static Map findConfigRoots(List targetDirectories) throws MojoExecutionException { - Map configRootsMap = new HashMap<>(); + private static MergedModel mergeModel(List targetDirectories) throws MojoExecutionException { + Map> configRoots = new HashMap<>(); + Map> generatedConfigSections = new HashMap<>(); for (Path targetDirectory : targetDirectories) { Path javadocPath = targetDirectory.resolve(Outputs.QUARKUS_CONFIG_DOC_MODEL); @@ -181,13 +205,15 @@ private static Map findConfigRoots(List targetD } for (ConfigRoot configRoot : resolvedModel.getConfigRoots().values()) { - ConfigRootKey configRootKey = new ConfigRootKey(configRoot.getExtension().groupId(), - configRoot.getExtension().artifactId(), - configRoot.getPrefix()); + String topLevelPrefix = getTopLevelPrefix(configRoot.getPrefix()); + + Map extensionConfigRoots = configRoots.computeIfAbsent(configRoot.getExtension(), + e -> new HashMap<>()); + + ConfigRoot existingConfigRoot = extensionConfigRoots.get(topLevelPrefix); - ConfigRoot existingConfigRoot = configRootsMap.get(configRootKey); if (existingConfigRoot == null) { - configRootsMap.put(configRootKey, configRoot); + extensionConfigRoots.put(topLevelPrefix, configRoot); } else { existingConfigRoot.merge(configRoot); } @@ -197,7 +223,42 @@ private static Map findConfigRoots(List targetD } } - return configRootsMap; + for (Entry> extensionConfigRootsEntry : configRoots.entrySet()) { + List extensionGeneratedConfigSections = generatedConfigSections + .computeIfAbsent(extensionConfigRootsEntry.getKey(), e -> new ArrayList<>()); + + for (ConfigRoot configRoot : extensionConfigRootsEntry.getValue().values()) { + collectGeneratedConfigSections(extensionGeneratedConfigSections, configRoot); + } + } + + return new MergedModel(configRoots, generatedConfigSections); + } + + private static void collectGeneratedConfigSections(List extensionGeneratedConfigSections, + ConfigItemCollection configItemCollection) { + for (AbstractConfigItem configItem : configItemCollection.getItems()) { + if (!configItem.isSection()) { + continue; + } + + ConfigSection configSection = (ConfigSection) configItem; + if (configSection.isGenerated()) { + extensionGeneratedConfigSections.add(configSection); + } + + collectGeneratedConfigSections(extensionGeneratedConfigSections, configSection); + } + } + + private static String getTopLevelPrefix(String prefix) { + String[] prefixSegments = prefix.split(Pattern.quote(Markers.DOT)); + + if (prefixSegments.length == 1) { + return prefixSegments[0]; + } + + return prefixSegments[0] + Markers.DOT + prefixSegments[1]; } private static List findTargetDirectories(Path scanDirectory) throws MojoExecutionException { diff --git a/devtools/config-doc-maven-plugin/src/main/java/io/quarkus/maven/config/doc/MergedModel.java b/devtools/config-doc-maven-plugin/src/main/java/io/quarkus/maven/config/doc/MergedModel.java new file mode 100644 index 0000000000000..eb5c6644da6ea --- /dev/null +++ b/devtools/config-doc-maven-plugin/src/main/java/io/quarkus/maven/config/doc/MergedModel.java @@ -0,0 +1,29 @@ +package io.quarkus.maven.config.doc; + +import java.util.List; +import java.util.Map; + +import io.quarkus.annotation.processor.documentation.config.model.ConfigRoot; +import io.quarkus.annotation.processor.documentation.config.model.ConfigSection; +import io.quarkus.annotation.processor.documentation.config.model.Extension; + +public class MergedModel { + + private final Map> configRoots; + + private final Map> generatedConfigSections; + + public MergedModel(Map> configRoots, + Map> configSections) { + this.configRoots = configRoots; + this.generatedConfigSections = configSections; + } + + public Map> getConfigRoots() { + return configRoots; + } + + public Map> getGeneratedConfigSections() { + return generatedConfigSections; + } +} diff --git a/devtools/config-doc-maven-plugin/src/main/resources/templates/configReference.qute.adoc b/devtools/config-doc-maven-plugin/src/main/resources/templates/configReference.qute.adoc index 43c74456ec990..10a2c3375f76d 100644 --- a/devtools/config-doc-maven-plugin/src/main/resources/templates/configReference.qute.adoc +++ b/devtools/config-doc-maven-plugin/src/main/resources/templates/configReference.qute.adoc @@ -8,7 +8,7 @@ h|Configuration property h|Type h|Default -{#for item in configRoot.items} +{#for item in configItemCollection.items} {#if !item.deprecated} {#if item.isSection} {#configSection configSection=item /} diff --git a/extensions/datasource/runtime/src/main/java/io/quarkus/datasource/runtime/DataSourceBuildTimeConfig.java b/extensions/datasource/runtime/src/main/java/io/quarkus/datasource/runtime/DataSourceBuildTimeConfig.java index cbf195bd4704f..bb8b7d33884df 100644 --- a/extensions/datasource/runtime/src/main/java/io/quarkus/datasource/runtime/DataSourceBuildTimeConfig.java +++ b/extensions/datasource/runtime/src/main/java/io/quarkus/datasource/runtime/DataSourceBuildTimeConfig.java @@ -2,6 +2,7 @@ import java.util.Optional; +import io.quarkus.runtime.annotations.ConfigDocSection; import io.quarkus.runtime.annotations.ConfigGroup; import io.quarkus.runtime.configuration.TrimmedStringConverter; import io.smallrye.config.WithConverter; @@ -49,10 +50,11 @@ public interface DataSourceBuildTimeConfig { Optional dbVersion(); /** - * Configuration for Dev Services. + * Dev Services. *

* Dev Services allow Quarkus to automatically start a database in dev and test mode. */ + @ConfigDocSection(generated = true) DevServicesBuildTimeConfig devservices(); /** diff --git a/extensions/elasticsearch-rest-client-common/deployment/src/main/java/io/quarkus/elasticsearch/restclient/common/deployment/DevServicesElasticsearchProcessor.java b/extensions/elasticsearch-rest-client-common/deployment/src/main/java/io/quarkus/elasticsearch/restclient/common/deployment/DevServicesElasticsearchProcessor.java index e323c0b3ae939..d01d7e79a2abc 100644 --- a/extensions/elasticsearch-rest-client-common/deployment/src/main/java/io/quarkus/elasticsearch/restclient/common/deployment/DevServicesElasticsearchProcessor.java +++ b/extensions/elasticsearch-rest-client-common/deployment/src/main/java/io/quarkus/elasticsearch/restclient/common/deployment/DevServicesElasticsearchProcessor.java @@ -35,7 +35,8 @@ import io.quarkus.devservices.common.ContainerAddress; import io.quarkus.devservices.common.ContainerLocator; import io.quarkus.devservices.common.ContainerShutdownCloseable; -import io.quarkus.elasticsearch.restclient.common.deployment.ElasticsearchDevServicesBuildTimeConfig.Distribution; +import io.quarkus.elasticsearch.restclient.common.deployment.ElasticsearchCommonBuildTimeConfig.ElasticsearchDevServicesBuildTimeConfig; +import io.quarkus.elasticsearch.restclient.common.deployment.ElasticsearchCommonBuildTimeConfig.ElasticsearchDevServicesBuildTimeConfig.Distribution; import io.quarkus.runtime.configuration.ConfigUtils; /** @@ -59,14 +60,14 @@ public class DevServicesElasticsearchProcessor { private static final String DEV_SERVICE_OPENSEARCH = "opensearch"; static volatile DevServicesResultBuildItem.RunningDevService devService; - static volatile ElasticsearchDevServicesBuildTimeConfig cfg; + static volatile ElasticsearchCommonBuildTimeConfig cfg; static volatile boolean first = true; @BuildStep public DevServicesResultBuildItem startElasticsearchDevService( DockerStatusBuildItem dockerStatusBuildItem, LaunchModeBuildItem launchMode, - ElasticsearchDevServicesBuildTimeConfig configuration, + ElasticsearchCommonBuildTimeConfig configuration, List devServicesSharedNetworkBuildItem, Optional consoleInstalledBuildItem, CuratedApplicationShutdownBuildItem closeBuildItem, @@ -97,9 +98,8 @@ public DevServicesResultBuildItem startElasticsearchDevService( try { boolean useSharedNetwork = DevServicesSharedNetworkBuildItem.isSharedNetworkRequired(devServicesConfig, devServicesSharedNetworkBuildItem); - devService = startElasticsearch(dockerStatusBuildItem, configuration, buildItemsConfig, launchMode, - useSharedNetwork, - devServicesConfig.timeout); + devService = startElasticsearchDevServices(dockerStatusBuildItem, configuration.devservices, buildItemsConfig, + launchMode, useSharedNetwork, devServicesConfig.timeout); if (devService == null) { compressor.closeAndDumpCaptured(); } else { @@ -156,7 +156,7 @@ private void shutdownElasticsearch() { } } - private DevServicesResultBuildItem.RunningDevService startElasticsearch( + private DevServicesResultBuildItem.RunningDevService startElasticsearchDevServices( DockerStatusBuildItem dockerStatusBuildItem, ElasticsearchDevServicesBuildTimeConfig config, DevservicesElasticsearchBuildItemsConfiguration buildItemConfig, diff --git a/extensions/elasticsearch-rest-client-common/deployment/src/main/java/io/quarkus/elasticsearch/restclient/common/deployment/DevservicesElasticsearchBuildItem.java b/extensions/elasticsearch-rest-client-common/deployment/src/main/java/io/quarkus/elasticsearch/restclient/common/deployment/DevservicesElasticsearchBuildItem.java index c241a53ff9d1f..17cea1595808c 100644 --- a/extensions/elasticsearch-rest-client-common/deployment/src/main/java/io/quarkus/elasticsearch/restclient/common/deployment/DevservicesElasticsearchBuildItem.java +++ b/extensions/elasticsearch-rest-client-common/deployment/src/main/java/io/quarkus/elasticsearch/restclient/common/deployment/DevservicesElasticsearchBuildItem.java @@ -1,8 +1,7 @@ package io.quarkus.elasticsearch.restclient.common.deployment; -import static io.quarkus.elasticsearch.restclient.common.deployment.ElasticsearchDevServicesBuildTimeConfig.Distribution; - import io.quarkus.builder.item.MultiBuildItem; +import io.quarkus.elasticsearch.restclient.common.deployment.ElasticsearchCommonBuildTimeConfig.ElasticsearchDevServicesBuildTimeConfig.Distribution; public final class DevservicesElasticsearchBuildItem extends MultiBuildItem { private final String hostsConfigProperty; diff --git a/extensions/elasticsearch-rest-client-common/deployment/src/main/java/io/quarkus/elasticsearch/restclient/common/deployment/ElasticsearchCommonBuildTimeConfig.java b/extensions/elasticsearch-rest-client-common/deployment/src/main/java/io/quarkus/elasticsearch/restclient/common/deployment/ElasticsearchCommonBuildTimeConfig.java new file mode 100644 index 0000000000000..afec3495853d8 --- /dev/null +++ b/extensions/elasticsearch-rest-client-common/deployment/src/main/java/io/quarkus/elasticsearch/restclient/common/deployment/ElasticsearchCommonBuildTimeConfig.java @@ -0,0 +1,169 @@ +package io.quarkus.elasticsearch.restclient.common.deployment; + +import java.util.Map; +import java.util.Objects; +import java.util.Optional; + +import io.quarkus.runtime.annotations.ConfigDocMapKey; +import io.quarkus.runtime.annotations.ConfigDocSection; +import io.quarkus.runtime.annotations.ConfigGroup; +import io.quarkus.runtime.annotations.ConfigItem; +import io.quarkus.runtime.annotations.ConfigPhase; +import io.quarkus.runtime.annotations.ConfigRoot; + +@ConfigRoot(name = "elasticsearch", phase = ConfigPhase.BUILD_TIME) +public class ElasticsearchCommonBuildTimeConfig { + + /** + * Dev Services + *

+ * Dev Services allows Quarkus to automatically start Elasticsearch in dev and test mode. + */ + @ConfigItem + @ConfigDocSection(generated = true) + public ElasticsearchDevServicesBuildTimeConfig devservices; + + @ConfigGroup + public static class ElasticsearchDevServicesBuildTimeConfig { + /** + * Whether this Dev Service should start with the application in dev mode or tests. + * + * Dev Services are enabled by default + * unless connection configuration (e.g. `quarkus.elasticsearch.hosts`) is set explicitly. + * + * @asciidoclet + */ + @ConfigItem + public Optional enabled = Optional.empty(); + + /** + * Optional fixed port the dev service will listen to. + *

+ * If not defined, the port will be chosen randomly. + */ + @ConfigItem + public Optional port; + + /** + * The Elasticsearch distribution to use. + * + * Defaults to a distribution inferred from the explicitly configured `image-name` (if any), + * or by default to the distribution configured in depending extensions (e.g. Hibernate Search), + * or by default to `elastic`. + * + * @asciidoclet + */ + @ConfigItem + public Optional distribution; + + /** + * The Elasticsearch container image to use. + * + * Defaults depend on the configured `distribution`: + * + * * For the `elastic` distribution: {elasticsearch-image} + * * For the `opensearch` distribution: {opensearch-image} + * + * @asciidoclet + */ + @ConfigItem + public Optional imageName; + + /** + * The value for the ES_JAVA_OPTS env variable. + * + * @asciidoclet + */ + @ConfigItem(defaultValue = "-Xms512m -Xmx1g") + public String javaOpts; + + /** + * Whether the Elasticsearch server managed by Quarkus Dev Services is shared. + *

+ * When shared, Quarkus looks for running containers using label-based service discovery. + * If a matching container is found, it is used, and so a second one is not started. + * Otherwise, Dev Services for Elasticsearch starts a new container. + *

+ * The discovery uses the {@code quarkus-dev-service-elasticsearch} label. + * The value is configured using the {@code service-name} property. + *

+ * Container sharing is only used in dev mode. + */ + @ConfigItem(defaultValue = "true") + public boolean shared; + + /** + * The value of the {@code quarkus-dev-service-elasticsearch} label attached to the started container. + *

+ * This property is used when {@code shared} is set to {@code true}. + * In this case, before starting a container, Dev Services for Elasticsearch looks for a container with the + * {@code quarkus-dev-service-elasticsearch} label + * set to the configured value. If found, it will use this container instead of starting a new one. Otherwise it + * starts a new container with the {@code quarkus-dev-service-elasticsearch} label set to the specified value. + *

+ * This property is used when you need multiple shared Elasticsearch servers. + */ + @ConfigItem(defaultValue = "elasticsearch") + public String serviceName; + + /** + * Environment variables that are passed to the container. + */ + @ConfigItem + @ConfigDocMapKey("environment-variable-name") + public Map containerEnv; + + /** + * Whether to keep Dev Service containers running *after a dev mode session or test suite execution* + * to reuse them in the next dev mode session or test suite execution. + * + * Within a dev mode session or test suite execution, + * Quarkus will always reuse Dev Services as long as their configuration + * (username, password, environment, port bindings, ...) did not change. + * This feature is specifically about keeping containers running + * **when Quarkus is not running** to reuse them across runs. + * + * WARNING: This feature needs to be enabled explicitly in `testcontainers.properties`, + * may require changes to how you configure data initialization in dev mode and tests, + * and may leave containers running indefinitely, forcing you to stop and remove them manually. + * See xref:elasticsearch-dev-services.adoc#reuse[this section of the documentation] for more information. + * + * This configuration property is set to `true` by default, + * so it is mostly useful to *disable* reuse, + * if you enabled it in `testcontainers.properties` + * but only want to use it for some of your Quarkus applications. + * + * @asciidoclet + */ + @ConfigItem(defaultValue = "true") + public boolean reuse; + + @Override + public boolean equals(Object o) { + if (this == o) + return true; + if (o == null || getClass() != o.getClass()) + return false; + ElasticsearchDevServicesBuildTimeConfig that = (ElasticsearchDevServicesBuildTimeConfig) o; + return Objects.equals(shared, that.shared) + && Objects.equals(enabled, that.enabled) + && Objects.equals(port, that.port) + && Objects.equals(distribution, that.distribution) + && Objects.equals(imageName, that.imageName) + && Objects.equals(javaOpts, that.javaOpts) + && Objects.equals(serviceName, that.serviceName) + && Objects.equals(containerEnv, that.containerEnv) + && Objects.equals(reuse, that.reuse); + } + + @Override + public int hashCode() { + return Objects.hash(enabled, port, distribution, imageName, javaOpts, shared, serviceName, containerEnv, reuse); + } + + public enum Distribution { + ELASTIC, + OPENSEARCH + } + } +} diff --git a/extensions/elasticsearch-rest-client-common/deployment/src/main/java/io/quarkus/elasticsearch/restclient/common/deployment/ElasticsearchDevServicesBuildTimeConfig.java b/extensions/elasticsearch-rest-client-common/deployment/src/main/java/io/quarkus/elasticsearch/restclient/common/deployment/ElasticsearchDevServicesBuildTimeConfig.java deleted file mode 100644 index b5b1625001413..0000000000000 --- a/extensions/elasticsearch-rest-client-common/deployment/src/main/java/io/quarkus/elasticsearch/restclient/common/deployment/ElasticsearchDevServicesBuildTimeConfig.java +++ /dev/null @@ -1,155 +0,0 @@ -package io.quarkus.elasticsearch.restclient.common.deployment; - -import java.util.Map; -import java.util.Objects; -import java.util.Optional; - -import io.quarkus.runtime.annotations.ConfigDocMapKey; -import io.quarkus.runtime.annotations.ConfigItem; -import io.quarkus.runtime.annotations.ConfigPhase; -import io.quarkus.runtime.annotations.ConfigRoot; - -@ConfigRoot(name = "elasticsearch.devservices", phase = ConfigPhase.BUILD_TIME) -public class ElasticsearchDevServicesBuildTimeConfig { - - /** - * Whether this Dev Service should start with the application in dev mode or tests. - * - * Dev Services are enabled by default - * unless connection configuration (e.g. `quarkus.elasticsearch.hosts`) is set explicitly. - * - * @asciidoclet - */ - @ConfigItem - public Optional enabled = Optional.empty(); - - /** - * Optional fixed port the dev service will listen to. - *

- * If not defined, the port will be chosen randomly. - */ - @ConfigItem - public Optional port; - - /** - * The Elasticsearch distribution to use. - * - * Defaults to a distribution inferred from the explicitly configured `image-name` (if any), - * or by default to the distribution configured in depending extensions (e.g. Hibernate Search), - * or by default to `elastic`. - * - * @asciidoclet - */ - @ConfigItem - public Optional distribution; - - /** - * The Elasticsearch container image to use. - * - * Defaults depend on the configured `distribution`: - * - * * For the `elastic` distribution: {elasticsearch-image} - * * For the `opensearch` distribution: {opensearch-image} - * - * @asciidoclet - */ - @ConfigItem - public Optional imageName; - - /** - * The value for the ES_JAVA_OPTS env variable. - * - * @asciidoclet - */ - @ConfigItem(defaultValue = "-Xms512m -Xmx1g") - public String javaOpts; - - /** - * Whether the Elasticsearch server managed by Quarkus Dev Services is shared. - *

- * When shared, Quarkus looks for running containers using label-based service discovery. - * If a matching container is found, it is used, and so a second one is not started. - * Otherwise, Dev Services for Elasticsearch starts a new container. - *

- * The discovery uses the {@code quarkus-dev-service-elasticsearch} label. - * The value is configured using the {@code service-name} property. - *

- * Container sharing is only used in dev mode. - */ - @ConfigItem(defaultValue = "true") - public boolean shared; - - /** - * The value of the {@code quarkus-dev-service-elasticsearch} label attached to the started container. - *

- * This property is used when {@code shared} is set to {@code true}. - * In this case, before starting a container, Dev Services for Elasticsearch looks for a container with the - * {@code quarkus-dev-service-elasticsearch} label - * set to the configured value. If found, it will use this container instead of starting a new one. Otherwise it - * starts a new container with the {@code quarkus-dev-service-elasticsearch} label set to the specified value. - *

- * This property is used when you need multiple shared Elasticsearch servers. - */ - @ConfigItem(defaultValue = "elasticsearch") - public String serviceName; - - /** - * Environment variables that are passed to the container. - */ - @ConfigItem - @ConfigDocMapKey("environment-variable-name") - public Map containerEnv; - - /** - * Whether to keep Dev Service containers running *after a dev mode session or test suite execution* - * to reuse them in the next dev mode session or test suite execution. - * - * Within a dev mode session or test suite execution, - * Quarkus will always reuse Dev Services as long as their configuration - * (username, password, environment, port bindings, ...) did not change. - * This feature is specifically about keeping containers running - * **when Quarkus is not running** to reuse them across runs. - * - * WARNING: This feature needs to be enabled explicitly in `testcontainers.properties`, - * may require changes to how you configure data initialization in dev mode and tests, - * and may leave containers running indefinitely, forcing you to stop and remove them manually. - * See xref:elasticsearch-dev-services.adoc#reuse[this section of the documentation] for more information. - * - * This configuration property is set to `true` by default, - * so it is mostly useful to *disable* reuse, - * if you enabled it in `testcontainers.properties` - * but only want to use it for some of your Quarkus applications. - * - * @asciidoclet - */ - @ConfigItem(defaultValue = "true") - public boolean reuse; - - @Override - public boolean equals(Object o) { - if (this == o) - return true; - if (o == null || getClass() != o.getClass()) - return false; - ElasticsearchDevServicesBuildTimeConfig that = (ElasticsearchDevServicesBuildTimeConfig) o; - return Objects.equals(shared, that.shared) - && Objects.equals(enabled, that.enabled) - && Objects.equals(port, that.port) - && Objects.equals(distribution, that.distribution) - && Objects.equals(imageName, that.imageName) - && Objects.equals(javaOpts, that.javaOpts) - && Objects.equals(serviceName, that.serviceName) - && Objects.equals(containerEnv, that.containerEnv) - && Objects.equals(reuse, that.reuse); - } - - @Override - public int hashCode() { - return Objects.hash(enabled, port, distribution, imageName, javaOpts, shared, serviceName, containerEnv, reuse); - } - - public enum Distribution { - ELASTIC, - OPENSEARCH - } -} diff --git a/extensions/hibernate-search-orm-elasticsearch/deployment/src/main/java/io/quarkus/hibernate/search/orm/elasticsearch/deployment/HibernateSearchElasticsearchProcessor.java b/extensions/hibernate-search-orm-elasticsearch/deployment/src/main/java/io/quarkus/hibernate/search/orm/elasticsearch/deployment/HibernateSearchElasticsearchProcessor.java index 5df805957096a..819a898f6a16c 100644 --- a/extensions/hibernate-search-orm-elasticsearch/deployment/src/main/java/io/quarkus/hibernate/search/orm/elasticsearch/deployment/HibernateSearchElasticsearchProcessor.java +++ b/extensions/hibernate-search-orm-elasticsearch/deployment/src/main/java/io/quarkus/hibernate/search/orm/elasticsearch/deployment/HibernateSearchElasticsearchProcessor.java @@ -1,6 +1,5 @@ package io.quarkus.hibernate.search.orm.elasticsearch.deployment; -import static io.quarkus.elasticsearch.restclient.common.deployment.ElasticsearchDevServicesBuildTimeConfig.Distribution; import static io.quarkus.hibernate.search.orm.elasticsearch.deployment.ClassNames.INDEXED; import static io.quarkus.hibernate.search.orm.elasticsearch.deployment.ClassNames.PROJECTION_CONSTRUCTOR; import static io.quarkus.hibernate.search.orm.elasticsearch.deployment.ClassNames.ROOT_MAPPING; @@ -52,6 +51,7 @@ import io.quarkus.deployment.recording.RecorderContext; import io.quarkus.deployment.util.JandexUtil; import io.quarkus.elasticsearch.restclient.common.deployment.DevservicesElasticsearchBuildItem; +import io.quarkus.elasticsearch.restclient.common.deployment.ElasticsearchCommonBuildTimeConfig.ElasticsearchDevServicesBuildTimeConfig.Distribution; import io.quarkus.hibernate.orm.deployment.PersistenceUnitDescriptorBuildItem; import io.quarkus.hibernate.orm.deployment.integration.HibernateOrmIntegrationRuntimeConfiguredBuildItem; import io.quarkus.hibernate.orm.deployment.integration.HibernateOrmIntegrationStaticConfiguredBuildItem; diff --git a/extensions/hibernate-search-standalone-elasticsearch/deployment/src/main/java/io/quarkus/hibernate/search/standalone/elasticsearch/deployment/HibernateSearchStandaloneProcessor.java b/extensions/hibernate-search-standalone-elasticsearch/deployment/src/main/java/io/quarkus/hibernate/search/standalone/elasticsearch/deployment/HibernateSearchStandaloneProcessor.java index e1357b9f3cb52..27daba2f11426 100644 --- a/extensions/hibernate-search-standalone-elasticsearch/deployment/src/main/java/io/quarkus/hibernate/search/standalone/elasticsearch/deployment/HibernateSearchStandaloneProcessor.java +++ b/extensions/hibernate-search-standalone-elasticsearch/deployment/src/main/java/io/quarkus/hibernate/search/standalone/elasticsearch/deployment/HibernateSearchStandaloneProcessor.java @@ -1,6 +1,5 @@ package io.quarkus.hibernate.search.standalone.elasticsearch.deployment; -import static io.quarkus.elasticsearch.restclient.common.deployment.ElasticsearchDevServicesBuildTimeConfig.Distribution; import static io.quarkus.hibernate.search.standalone.elasticsearch.deployment.HibernateSearchTypes.BUILT_IN_ROOT_MAPPING_ANNOTATIONS; import static io.quarkus.hibernate.search.standalone.elasticsearch.deployment.HibernateSearchTypes.INDEXED; import static io.quarkus.hibernate.search.standalone.elasticsearch.deployment.HibernateSearchTypes.ROOT_MAPPING; @@ -57,6 +56,7 @@ import io.quarkus.deployment.recording.RecorderContext; import io.quarkus.deployment.util.JandexUtil; import io.quarkus.elasticsearch.restclient.common.deployment.DevservicesElasticsearchBuildItem; +import io.quarkus.elasticsearch.restclient.common.deployment.ElasticsearchCommonBuildTimeConfig.ElasticsearchDevServicesBuildTimeConfig.Distribution; import io.quarkus.hibernate.search.standalone.elasticsearch.runtime.ElasticsearchVersionSubstitution; import io.quarkus.hibernate.search.standalone.elasticsearch.runtime.HibernateSearchStandaloneBuildTimeConfig; import io.quarkus.hibernate.search.standalone.elasticsearch.runtime.HibernateSearchStandaloneBuildTimeConfig.ElasticsearchBackendBuildTimeConfig; diff --git a/extensions/infinispan-client/runtime/src/main/java/io/quarkus/infinispan/client/runtime/InfinispanClientBuildTimeConfig.java b/extensions/infinispan-client/runtime/src/main/java/io/quarkus/infinispan/client/runtime/InfinispanClientBuildTimeConfig.java index 5ab65898dba2f..6fe17807543c6 100644 --- a/extensions/infinispan-client/runtime/src/main/java/io/quarkus/infinispan/client/runtime/InfinispanClientBuildTimeConfig.java +++ b/extensions/infinispan-client/runtime/src/main/java/io/quarkus/infinispan/client/runtime/InfinispanClientBuildTimeConfig.java @@ -5,6 +5,7 @@ import java.util.Objects; import java.util.Optional; +import io.quarkus.runtime.annotations.ConfigDocSection; import io.quarkus.runtime.annotations.ConfigGroup; import io.quarkus.runtime.annotations.ConfigItem; @@ -50,21 +51,23 @@ public static class RemoteCacheConfig { } /** - * Configuration for DevServices. DevServices allows Quarkus to automatically start an Infinispan Server in dev and test + * Dev Services. + *

+ * Dev Services allows Quarkus to automatically start an Infinispan Server in dev and test * mode. */ - @ConfigItem(name = ConfigItem.PARENT) public DevServiceConfiguration devService; @ConfigGroup public static class DevServiceConfiguration { /** - * Configuration for DevServices + * Dev Services *

- * DevServices allows Quarkus to automatically start Infinispan in dev and test mode. + * Dev Services allows Quarkus to automatically start Infinispan in dev and test mode. */ @ConfigItem + @ConfigDocSection(generated = true) public InfinispanDevServicesConfig devservices; @Override diff --git a/extensions/kafka-client/deployment/src/main/java/io/quarkus/kafka/client/deployment/KafkaBuildTimeConfig.java b/extensions/kafka-client/deployment/src/main/java/io/quarkus/kafka/client/deployment/KafkaBuildTimeConfig.java index a4fd0b9f2951b..e84db5c16bc44 100644 --- a/extensions/kafka-client/deployment/src/main/java/io/quarkus/kafka/client/deployment/KafkaBuildTimeConfig.java +++ b/extensions/kafka-client/deployment/src/main/java/io/quarkus/kafka/client/deployment/KafkaBuildTimeConfig.java @@ -1,5 +1,6 @@ package io.quarkus.kafka.client.deployment; +import io.quarkus.runtime.annotations.ConfigDocSection; import io.quarkus.runtime.annotations.ConfigItem; import io.quarkus.runtime.annotations.ConfigPhase; import io.quarkus.runtime.annotations.ConfigRoot; @@ -32,9 +33,12 @@ public class KafkaBuildTimeConfig { public boolean snappyLoadFromSharedClassLoader; /** - * Configuration for DevServices. DevServices allows Quarkus to automatically start Kafka in dev and test mode. + * Dev Services. + *

+ * Dev Services allows Quarkus to automatically start Kafka in dev and test mode. */ @ConfigItem + @ConfigDocSection(generated = true) public KafkaDevServicesBuildTimeConfig devservices; } diff --git a/extensions/kubernetes-client/runtime-internal/src/main/java/io/quarkus/kubernetes/client/runtime/KubernetesClientBuildConfig.java b/extensions/kubernetes-client/runtime-internal/src/main/java/io/quarkus/kubernetes/client/runtime/KubernetesClientBuildConfig.java index df2259f287b37..b6a2e71d2b35c 100644 --- a/extensions/kubernetes-client/runtime-internal/src/main/java/io/quarkus/kubernetes/client/runtime/KubernetesClientBuildConfig.java +++ b/extensions/kubernetes-client/runtime-internal/src/main/java/io/quarkus/kubernetes/client/runtime/KubernetesClientBuildConfig.java @@ -163,6 +163,6 @@ public interface KubernetesClientBuildConfig { /** * Dev Services */ - @ConfigDocSection + @ConfigDocSection(generated = true) KubernetesDevServicesBuildTimeConfig devservices(); } diff --git a/extensions/liquibase/runtime/src/main/java/io/quarkus/liquibase/runtime/LiquibaseRuntimeConfig.java b/extensions/liquibase/runtime/src/main/java/io/quarkus/liquibase/runtime/LiquibaseRuntimeConfig.java index 8215a5e4995a3..8db555447dfc1 100644 --- a/extensions/liquibase/runtime/src/main/java/io/quarkus/liquibase/runtime/LiquibaseRuntimeConfig.java +++ b/extensions/liquibase/runtime/src/main/java/io/quarkus/liquibase/runtime/LiquibaseRuntimeConfig.java @@ -45,7 +45,7 @@ public LiquibaseDataSourceRuntimeConfig getConfigForDataSourceName(String dataSo public LiquibaseDataSourceRuntimeConfig defaultDataSource = LiquibaseDataSourceRuntimeConfig.defaultConfig(); /** - * Liquibase configurations for named datasources. + * Named datasources. */ @ConfigItem(name = ConfigItem.PARENT) @ConfigDocMapKey("datasource-name") diff --git a/extensions/mongodb-client/deployment/src/main/java/io/quarkus/mongodb/deployment/MongoClientBuildTimeConfig.java b/extensions/mongodb-client/deployment/src/main/java/io/quarkus/mongodb/deployment/MongoClientBuildTimeConfig.java index c2332e6628603..4f81fe077ca05 100644 --- a/extensions/mongodb-client/deployment/src/main/java/io/quarkus/mongodb/deployment/MongoClientBuildTimeConfig.java +++ b/extensions/mongodb-client/deployment/src/main/java/io/quarkus/mongodb/deployment/MongoClientBuildTimeConfig.java @@ -1,5 +1,6 @@ package io.quarkus.mongodb.deployment; +import io.quarkus.runtime.annotations.ConfigDocSection; import io.quarkus.runtime.annotations.ConfigItem; import io.quarkus.runtime.annotations.ConfigPhase; import io.quarkus.runtime.annotations.ConfigRoot; @@ -31,8 +32,11 @@ public class MongoClientBuildTimeConfig { public boolean tracingEnabled; /** - * Configuration for DevServices. DevServices allows Quarkus to automatically start MongoDB in dev and test mode. + * Dev Services. + *

+ * Dev Services allows Quarkus to automatically start MongoDB in dev and test mode. */ @ConfigItem + @ConfigDocSection(generated = true) public DevServicesBuildTimeConfig devservices; } diff --git a/extensions/oidc/deployment/src/main/java/io/quarkus/oidc/deployment/devservices/keycloak/KeycloakBuildTimeConfig.java b/extensions/oidc/deployment/src/main/java/io/quarkus/oidc/deployment/devservices/keycloak/KeycloakBuildTimeConfig.java index 68e71831acdcb..d30df58effb70 100644 --- a/extensions/oidc/deployment/src/main/java/io/quarkus/oidc/deployment/devservices/keycloak/KeycloakBuildTimeConfig.java +++ b/extensions/oidc/deployment/src/main/java/io/quarkus/oidc/deployment/devservices/keycloak/KeycloakBuildTimeConfig.java @@ -1,5 +1,6 @@ package io.quarkus.oidc.deployment.devservices.keycloak; +import io.quarkus.runtime.annotations.ConfigDocSection; import io.quarkus.runtime.annotations.ConfigItem; import io.quarkus.runtime.annotations.ConfigRoot; @@ -9,8 +10,9 @@ @ConfigRoot public class KeycloakBuildTimeConfig { /** - * Dev services configuration. + * Dev Services. */ @ConfigItem + @ConfigDocSection(generated = true) public DevServicesConfig devservices; } diff --git a/extensions/redis-client/deployment/src/main/java/io/quarkus/redis/deployment/client/RedisBuildTimeConfig.java b/extensions/redis-client/deployment/src/main/java/io/quarkus/redis/deployment/client/RedisBuildTimeConfig.java index b8388186140a2..82aba9963d4b2 100644 --- a/extensions/redis-client/deployment/src/main/java/io/quarkus/redis/deployment/client/RedisBuildTimeConfig.java +++ b/extensions/redis-client/deployment/src/main/java/io/quarkus/redis/deployment/client/RedisBuildTimeConfig.java @@ -3,6 +3,7 @@ import java.util.Map; import io.quarkus.runtime.annotations.ConfigDocMapKey; +import io.quarkus.runtime.annotations.ConfigDocSection; import io.quarkus.runtime.annotations.ConfigGroup; import io.quarkus.runtime.annotations.ConfigPhase; import io.quarkus.runtime.annotations.ConfigRoot; @@ -75,10 +76,11 @@ public interface RedisBuildTimeConfig { @ConfigGroup public interface DevServiceConfiguration { /** - * Configuration for DevServices + * Dev Services *

- * DevServices allows Quarkus to automatically start Redis in dev and test mode. + * Dev Services allows Quarkus to automatically start Redis in dev and test mode. */ + @ConfigDocSection(generated = true) DevServicesConfig devservices(); } } diff --git a/extensions/schema-registry/devservice/deployment/src/main/java/io/quarkus/apicurio/registry/devservice/ApicurioRegistryBuildTimeConfig.java b/extensions/schema-registry/devservice/deployment/src/main/java/io/quarkus/apicurio/registry/devservice/ApicurioRegistryBuildTimeConfig.java new file mode 100644 index 0000000000000..1465a4e6738f2 --- /dev/null +++ b/extensions/schema-registry/devservice/deployment/src/main/java/io/quarkus/apicurio/registry/devservice/ApicurioRegistryBuildTimeConfig.java @@ -0,0 +1,87 @@ +package io.quarkus.apicurio.registry.devservice; + +import java.util.Map; +import java.util.Optional; + +import io.quarkus.runtime.annotations.ConfigDocMapKey; +import io.quarkus.runtime.annotations.ConfigDocSection; +import io.quarkus.runtime.annotations.ConfigGroup; +import io.quarkus.runtime.annotations.ConfigItem; +import io.quarkus.runtime.annotations.ConfigPhase; +import io.quarkus.runtime.annotations.ConfigRoot; + +@ConfigRoot(name = "apicurio-registry", phase = ConfigPhase.BUILD_TIME) +public class ApicurioRegistryBuildTimeConfig { + + /** + * Dev Services + *

+ * Dev Services allows Quarkus to automatically start Apicurio Registry in dev and test mode. + */ + @ConfigItem + @ConfigDocSection(generated = true) + public ApicurioRegistryDevServicesBuildTimeConfig devservices; + + @ConfigGroup + public static class ApicurioRegistryDevServicesBuildTimeConfig { + + /** + * If Dev Services for Apicurio Registry has been explicitly enabled or disabled. Dev Services are generally enabled + * by default, unless there is an existing configuration present. For Apicurio Registry, Dev Services starts a registry + * unless {@code mp.messaging.connector.smallrye-kafka.apicurio.registry.url} or + * {@code mp.messaging.connector.smallrye-kafka.schema.registry.url} is set. + */ + @ConfigItem + public Optional enabled = Optional.empty(); + + /** + * Optional fixed port the dev service will listen to. + *

+ * If not defined, the port will be chosen randomly. + */ + @ConfigItem + public Optional port; + + /** + * The Apicurio Registry image to use. + * Note that only Apicurio Registry 2.x images are supported. + * Specifically, the image repository must end with {@code apicurio/apicurio-registry-mem}. + */ + @ConfigItem(defaultValue = "quay.io/apicurio/apicurio-registry-mem:2.4.2.Final") + public String imageName; + + /** + * Indicates if the Apicurio Registry instance managed by Quarkus Dev Services is shared. + * When shared, Quarkus looks for running containers using label-based service discovery. + * If a matching container is found, it is used, and so a second one is not started. + * Otherwise, Dev Services for Apicurio Registry starts a new container. + *

+ * The discovery uses the {@code quarkus-dev-service-apicurio-registry} label. + * The value is configured using the {@code service-name} property. + *

+ * Container sharing is only used in dev mode. + */ + @ConfigItem(defaultValue = "true") + public boolean shared; + + /** + * The value of the {@code quarkus-dev-service-apicurio-registry} label attached to the started container. + * This property is used when {@code shared} is set to {@code true}. + * In this case, before starting a container, Dev Services for Apicurio Registry looks for a container with the + * {@code quarkus-dev-service-apicurio-registry} label + * set to the configured value. If found, it will use this container instead of starting a new one. Otherwise, it + * starts a new container with the {@code quarkus-dev-service-apicurio-registry} label set to the specified value. + *

+ * This property is used when you need multiple shared Apicurio Registry instances. + */ + @ConfigItem(defaultValue = "apicurio-registry") + public String serviceName; + + /** + * Environment variables that are passed to the container. + */ + @ConfigItem + @ConfigDocMapKey("environment-variable-name") + public Map containerEnv; + } +} diff --git a/extensions/schema-registry/devservice/deployment/src/main/java/io/quarkus/apicurio/registry/devservice/ApicurioRegistryDevServicesBuildTimeConfig.java b/extensions/schema-registry/devservice/deployment/src/main/java/io/quarkus/apicurio/registry/devservice/ApicurioRegistryDevServicesBuildTimeConfig.java deleted file mode 100644 index acad0830a63eb..0000000000000 --- a/extensions/schema-registry/devservice/deployment/src/main/java/io/quarkus/apicurio/registry/devservice/ApicurioRegistryDevServicesBuildTimeConfig.java +++ /dev/null @@ -1,73 +0,0 @@ -package io.quarkus.apicurio.registry.devservice; - -import java.util.Map; -import java.util.Optional; - -import io.quarkus.runtime.annotations.ConfigDocMapKey; -import io.quarkus.runtime.annotations.ConfigItem; -import io.quarkus.runtime.annotations.ConfigPhase; -import io.quarkus.runtime.annotations.ConfigRoot; - -@ConfigRoot(name = "apicurio-registry.devservices", phase = ConfigPhase.BUILD_TIME) -public class ApicurioRegistryDevServicesBuildTimeConfig { - - /** - * If Dev Services for Apicurio Registry has been explicitly enabled or disabled. Dev Services are generally enabled - * by default, unless there is an existing configuration present. For Apicurio Registry, Dev Services starts a registry - * unless {@code mp.messaging.connector.smallrye-kafka.apicurio.registry.url} or - * {@code mp.messaging.connector.smallrye-kafka.schema.registry.url} is set. - */ - @ConfigItem - public Optional enabled = Optional.empty(); - - /** - * Optional fixed port the dev service will listen to. - *

- * If not defined, the port will be chosen randomly. - */ - @ConfigItem - public Optional port; - - /** - * The Apicurio Registry image to use. - * Note that only Apicurio Registry 2.x images are supported. - * Specifically, the image repository must end with {@code apicurio/apicurio-registry-mem}. - */ - @ConfigItem(defaultValue = "quay.io/apicurio/apicurio-registry-mem:2.4.2.Final") - public String imageName; - - /** - * Indicates if the Apicurio Registry instance managed by Quarkus Dev Services is shared. - * When shared, Quarkus looks for running containers using label-based service discovery. - * If a matching container is found, it is used, and so a second one is not started. - * Otherwise, Dev Services for Apicurio Registry starts a new container. - *

- * The discovery uses the {@code quarkus-dev-service-apicurio-registry} label. - * The value is configured using the {@code service-name} property. - *

- * Container sharing is only used in dev mode. - */ - @ConfigItem(defaultValue = "true") - public boolean shared; - - /** - * The value of the {@code quarkus-dev-service-apicurio-registry} label attached to the started container. - * This property is used when {@code shared} is set to {@code true}. - * In this case, before starting a container, Dev Services for Apicurio Registry looks for a container with the - * {@code quarkus-dev-service-apicurio-registry} label - * set to the configured value. If found, it will use this container instead of starting a new one. Otherwise, it - * starts a new container with the {@code quarkus-dev-service-apicurio-registry} label set to the specified value. - *

- * This property is used when you need multiple shared Apicurio Registry instances. - */ - @ConfigItem(defaultValue = "apicurio-registry") - public String serviceName; - - /** - * Environment variables that are passed to the container. - */ - @ConfigItem - @ConfigDocMapKey("environment-variable-name") - public Map containerEnv; - -} diff --git a/extensions/schema-registry/devservice/deployment/src/main/java/io/quarkus/apicurio/registry/devservice/DevServicesApicurioRegistryProcessor.java b/extensions/schema-registry/devservice/deployment/src/main/java/io/quarkus/apicurio/registry/devservice/DevServicesApicurioRegistryProcessor.java index 8449a96010e3c..d0c4ba0497c9a 100644 --- a/extensions/schema-registry/devservice/deployment/src/main/java/io/quarkus/apicurio/registry/devservice/DevServicesApicurioRegistryProcessor.java +++ b/extensions/schema-registry/devservice/deployment/src/main/java/io/quarkus/apicurio/registry/devservice/DevServicesApicurioRegistryProcessor.java @@ -12,6 +12,7 @@ import org.testcontainers.containers.GenericContainer; import org.testcontainers.utility.DockerImageName; +import io.quarkus.apicurio.registry.devservice.ApicurioRegistryBuildTimeConfig.ApicurioRegistryDevServicesBuildTimeConfig; import io.quarkus.deployment.Feature; import io.quarkus.deployment.IsNormal; import io.quarkus.deployment.annotations.BuildStep; @@ -59,13 +60,13 @@ public class DevServicesApicurioRegistryProcessor { @BuildStep public DevServicesResultBuildItem startApicurioRegistryDevService(LaunchModeBuildItem launchMode, DockerStatusBuildItem dockerStatusBuildItem, - ApicurioRegistryDevServicesBuildTimeConfig apicurioRegistryDevServices, + ApicurioRegistryBuildTimeConfig apicurioRegistryConfiguration, List devServicesSharedNetworkBuildItem, Optional consoleInstalledBuildItem, CuratedApplicationShutdownBuildItem closeBuildItem, LoggingSetupBuildItem loggingSetupBuildItem, GlobalDevServicesConfig devServicesConfig) { - ApicurioRegistryDevServiceCfg configuration = getConfiguration(apicurioRegistryDevServices); + ApicurioRegistryDevServiceCfg configuration = getConfiguration(apicurioRegistryConfiguration.devservices); if (devService != null) { boolean restartRequired = !configuration.equals(cfg); diff --git a/extensions/smallrye-reactive-messaging-amqp/deployment/src/main/java/io/quarkus/smallrye/reactivemessaging/amqp/deployment/AmqpBuildTimeConfig.java b/extensions/smallrye-reactive-messaging-amqp/deployment/src/main/java/io/quarkus/smallrye/reactivemessaging/amqp/deployment/AmqpBuildTimeConfig.java index f5cb2fdda8f86..8db1e0ef04b32 100644 --- a/extensions/smallrye-reactive-messaging-amqp/deployment/src/main/java/io/quarkus/smallrye/reactivemessaging/amqp/deployment/AmqpBuildTimeConfig.java +++ b/extensions/smallrye-reactive-messaging-amqp/deployment/src/main/java/io/quarkus/smallrye/reactivemessaging/amqp/deployment/AmqpBuildTimeConfig.java @@ -1,5 +1,6 @@ package io.quarkus.smallrye.reactivemessaging.amqp.deployment; +import io.quarkus.runtime.annotations.ConfigDocSection; import io.quarkus.runtime.annotations.ConfigItem; import io.quarkus.runtime.annotations.ConfigPhase; import io.quarkus.runtime.annotations.ConfigRoot; @@ -8,8 +9,11 @@ public class AmqpBuildTimeConfig { /** - * Configuration for DevServices. DevServices allows Quarkus to automatically start an AMQP broker in dev and test mode. + * Dev Services. + *

+ * Dev Services allows Quarkus to automatically start an AMQP broker in dev and test mode. */ @ConfigItem + @ConfigDocSection(generated = true) public AmqpDevServicesBuildTimeConfig devservices; } diff --git a/extensions/smallrye-reactive-messaging-pulsar/deployment/src/main/java/io/quarkus/smallrye/reactivemessaging/pulsar/deployment/PulsarBuildTimeConfig.java b/extensions/smallrye-reactive-messaging-pulsar/deployment/src/main/java/io/quarkus/smallrye/reactivemessaging/pulsar/deployment/PulsarBuildTimeConfig.java index 76faf20c24a07..d7c82b3814c08 100644 --- a/extensions/smallrye-reactive-messaging-pulsar/deployment/src/main/java/io/quarkus/smallrye/reactivemessaging/pulsar/deployment/PulsarBuildTimeConfig.java +++ b/extensions/smallrye-reactive-messaging-pulsar/deployment/src/main/java/io/quarkus/smallrye/reactivemessaging/pulsar/deployment/PulsarBuildTimeConfig.java @@ -1,5 +1,6 @@ package io.quarkus.smallrye.reactivemessaging.pulsar.deployment; +import io.quarkus.runtime.annotations.ConfigDocSection; import io.quarkus.runtime.annotations.ConfigItem; import io.quarkus.runtime.annotations.ConfigPhase; import io.quarkus.runtime.annotations.ConfigRoot; @@ -8,8 +9,11 @@ public class PulsarBuildTimeConfig { /** - * Configuration for DevServices. DevServices allows Quarkus to automatically start a Pulsar Container in dev and test mode. + * Dev Services. + *

+ * Dev Services allows Quarkus to automatically start a Pulsar Container in dev and test mode. */ @ConfigItem + @ConfigDocSection(generated = true) public PulsarDevServicesBuildTimeConfig devservices; } diff --git a/extensions/smallrye-reactive-messaging-rabbitmq/deployment/src/main/java/io/quarkus/smallrye/reactivemessaging/rabbitmq/deployment/RabbitMQBuildTimeConfig.java b/extensions/smallrye-reactive-messaging-rabbitmq/deployment/src/main/java/io/quarkus/smallrye/reactivemessaging/rabbitmq/deployment/RabbitMQBuildTimeConfig.java index 2368c16e6e40e..ea478a7074ef2 100644 --- a/extensions/smallrye-reactive-messaging-rabbitmq/deployment/src/main/java/io/quarkus/smallrye/reactivemessaging/rabbitmq/deployment/RabbitMQBuildTimeConfig.java +++ b/extensions/smallrye-reactive-messaging-rabbitmq/deployment/src/main/java/io/quarkus/smallrye/reactivemessaging/rabbitmq/deployment/RabbitMQBuildTimeConfig.java @@ -2,6 +2,7 @@ import java.util.Optional; +import io.quarkus.runtime.annotations.ConfigDocSection; import io.quarkus.runtime.annotations.ConfigItem; import io.quarkus.runtime.annotations.ConfigPhase; import io.quarkus.runtime.annotations.ConfigRoot; @@ -10,10 +11,12 @@ public class RabbitMQBuildTimeConfig { /** - * Configuration for DevServices. + * Dev Services. + *

* DevServices allows Quarkus to start a RabbitMQ broker in dev and test mode automatically. */ @ConfigItem + @ConfigDocSection(generated = true) public RabbitMQDevServicesBuildTimeConfig devservices; /** From e4410fbda0a4e78ad227986780d48295fd9d4f93 Mon Sep 17 00:00:00 2001 From: Guillaume Smet Date: Sat, 3 Aug 2024 15:53:42 +0200 Subject: [PATCH 27/43] Point to the newly generated documentation files --- docs/pom.xml | 9 ++++-- docs/src/main/asciidoc/_attributes-local.adoc | 6 ++-- docs/src/main/asciidoc/all-builditems.adoc | 2 +- docs/src/main/asciidoc/all-config.adoc | 2 +- docs/src/main/asciidoc/amqp-reference.adoc | 2 +- .../main/asciidoc/building-native-image.adoc | 2 +- .../asciidoc/cache-infinispan-reference.adoc | 2 +- .../main/asciidoc/cache-redis-reference.adoc | 2 +- docs/src/main/asciidoc/cache.adoc | 4 +-- docs/src/main/asciidoc/cdi-reference.adoc | 2 +- .../asciidoc/centralized-log-management.adoc | 2 +- .../asciidoc/class-loading-reference.adoc | 2 +- docs/src/main/asciidoc/config-reference.adoc | 2 +- docs/src/main/asciidoc/container-image.adoc | 10 +++--- .../src/main/asciidoc/continuous-testing.adoc | 2 +- .../main/asciidoc/databases-dev-services.adoc | 4 +-- docs/src/main/asciidoc/datasource.adoc | 16 +++++----- .../asciidoc/deploying-to-kubernetes.adoc | 12 +++---- .../main/asciidoc/deploying-to-openshift.adoc | 6 ++-- docs/src/main/asciidoc/dev-services.adoc | 31 ++++++++++--------- .../asciidoc/elasticsearch-dev-services.adoc | 4 +-- docs/src/main/asciidoc/elasticsearch.adoc | 2 +- docs/src/main/asciidoc/flyway.adoc | 2 +- .../getting-started-dev-services.adoc | 2 +- docs/src/main/asciidoc/getting-started.adoc | 2 +- docs/src/main/asciidoc/gradle-tooling.adoc | 2 +- .../asciidoc/grpc-service-consumption.adoc | 4 +-- .../asciidoc/grpc-service-implementation.adoc | 2 +- docs/src/main/asciidoc/grpc-xds.adoc | 4 +-- docs/src/main/asciidoc/hibernate-orm.adoc | 2 +- .../src/main/asciidoc/hibernate-reactive.adoc | 2 +- .../hibernate-search-orm-elasticsearch.adoc | 24 +++++++------- ...rnate-search-standalone-elasticsearch.adoc | 2 +- docs/src/main/asciidoc/http-reference.adoc | 10 +++--- .../asciidoc/infinispan-client-reference.adoc | 2 +- .../asciidoc/infinispan-dev-services.adoc | 2 +- docs/src/main/asciidoc/jfr.adoc | 2 +- docs/src/main/asciidoc/kafka-streams.adoc | 2 +- docs/src/main/asciidoc/kubernetes-client.adoc | 4 +-- docs/src/main/asciidoc/kubernetes-config.adoc | 2 +- docs/src/main/asciidoc/liquibase-mongodb.adoc | 2 +- docs/src/main/asciidoc/liquibase.adoc | 2 +- .../asciidoc/load-shedding-reference.adoc | 2 +- docs/src/main/asciidoc/logging.adoc | 11 +++---- docs/src/main/asciidoc/mailer-reference.adoc | 2 +- .../management-interface-reference.adoc | 7 ++--- docs/src/main/asciidoc/maven-tooling.adoc | 4 +-- docs/src/main/asciidoc/mongodb.adoc | 2 +- docs/src/main/asciidoc/openapi-swaggerui.adoc | 4 +-- docs/src/main/asciidoc/opentelemetry.adoc | 2 +- docs/src/main/asciidoc/picocli.adoc | 2 +- docs/src/main/asciidoc/quartz.adoc | 2 +- docs/src/main/asciidoc/qute-reference.adoc | 2 +- docs/src/main/asciidoc/qute.adoc | 2 +- .../src/main/asciidoc/rabbitmq-reference.adoc | 2 +- .../main/asciidoc/reactive-sql-clients.adoc | 14 ++++----- .../src/main/asciidoc/redis-dev-services.adoc | 4 +-- docs/src/main/asciidoc/redis-reference.adoc | 2 +- docs/src/main/asciidoc/resteasy.adoc | 2 +- .../main/asciidoc/scheduler-reference.adoc | 2 +- docs/src/main/asciidoc/scheduler.adoc | 2 +- .../security-authentication-mechanisms.adoc | 3 +- docs/src/main/asciidoc/security-cors.adoc | 2 +- .../asciidoc/security-csrf-prevention.adoc | 2 +- docs/src/main/asciidoc/security-jdbc.adoc | 2 +- docs/src/main/asciidoc/security-jpa.adoc | 2 +- docs/src/main/asciidoc/security-jwt.adoc | 2 +- .../security-keycloak-admin-client.adoc | 2 +- .../security-keycloak-authorization.adoc | 2 +- docs/src/main/asciidoc/security-ldap.adoc | 2 +- docs/src/main/asciidoc/security-oauth2.adoc | 2 +- ...dc-configuration-properties-reference.adoc | 8 ++++- ...urity-openid-connect-client-reference.adoc | 4 +-- .../main/asciidoc/security-properties.adoc | 2 +- docs/src/main/asciidoc/security-webauthn.adoc | 2 +- docs/src/main/asciidoc/smallrye-graphql.adoc | 2 +- docs/src/main/asciidoc/smallrye-health.adoc | 2 +- docs/src/main/asciidoc/smallrye-metrics.adoc | 2 +- .../asciidoc/spring-cloud-config-client.adoc | 2 +- docs/src/main/asciidoc/spring-di.adoc | 2 +- docs/src/main/asciidoc/stork-reference.adoc | 2 +- .../main/asciidoc/telemetry-micrometer.adoc | 2 +- .../main/asciidoc/tests-with-coverage.adoc | 2 +- .../main/asciidoc/tls-registry-reference.adoc | 2 +- docs/src/main/asciidoc/validation.adoc | 2 +- docs/src/main/asciidoc/vertx-reference.adoc | 2 +- .../asciidoc/websockets-next-reference.adoc | 2 +- .../src/main/asciidoc/writing-extensions.adoc | 4 +-- .../grpc/deployment/GrpcBuildTimeConfig.java | 2 ++ .../config/GrpcClientConfiguration.java | 2 ++ .../runtime/config/GrpcConfiguration.java | 4 +-- .../config/GrpcServerConfiguration.java | 2 ++ .../vertx/http/runtime/HttpConfiguration.java | 23 ++++++++++++-- 93 files changed, 201 insertions(+), 169 deletions(-) diff --git a/docs/pom.xml b/docs/pom.xml index 7a4e0effb9955..fa8b6a0ae2a3f 100644 --- a/docs/pom.xml +++ b/docs/pom.xml @@ -34,7 +34,9 @@ https://quarkus.io https://github.com/quarkusio/quarkus https://github.com/quarkusio/quarkus-quickstarts - ${project.build.directory}/quarkus-config-doc + ${project.build.directory}/quarkus-config-doc + ${project.build.directory}/quarkus-generated-doc + ${generated-dir}/infra ${generated-dir}/examples docker.io/jdkato/vale:v2.15.5 @@ -3250,7 +3252,7 @@ false io.quarkus.docs.generation.QuarkusBuildItemDoc - ${generated-dir}/config/quarkus-all-build-items.adoc + ${infra-doc-dir}/quarkus-all-build-items.adoc ${project.basedir}/../core/deployment ${project.basedir}/../extensions @@ -3377,7 +3379,8 @@ target/asciidoc/sources true - ${generated-dir} + ${infra-doc-dir} + ${generated-config-doc-dir} ${code-examples-dir} ./images font diff --git a/docs/src/main/asciidoc/_attributes-local.adoc b/docs/src/main/asciidoc/_attributes-local.adoc index 63916a17c1c0e..795d134a66f73 100644 --- a/docs/src/main/asciidoc/_attributes-local.adoc +++ b/docs/src/main/asciidoc/_attributes-local.adoc @@ -5,8 +5,10 @@ :idprefix: :idseparator: - :icons: font -:generated-dir: ../../../../target/asciidoc/generated -:code-examples: {generated-dir}/examples +:target-dir: ../../../target +:generated-config-doc-dir: {target-dir}/quarkus-config-doc +:infra-doc-dir: {target-dir}/quarkus-generated-doc/infra +:code-examples: {target-dir}/quarkus-generated-doc/examples :doc-examples: ./_examples :imagesdir: ./images :includes: ./_includes diff --git a/docs/src/main/asciidoc/all-builditems.adoc b/docs/src/main/asciidoc/all-builditems.adoc index dfd5cb014be96..5f0c51f724584 100644 --- a/docs/src/main/asciidoc/all-builditems.adoc +++ b/docs/src/main/asciidoc/all-builditems.adoc @@ -15,4 +15,4 @@ Here you can find a list of Build Items and the extension that provides them. icon:building[title=Non-instantiatable Build Item] Build item can't be instantiated directly, but can be extended/inherited from -include::{generated-dir}/quarkus-all-build-items.adoc[opts=optional] +include::{infra-doc-dir}/quarkus-all-build-items.adoc[opts=optional] diff --git a/docs/src/main/asciidoc/all-config.adoc b/docs/src/main/asciidoc/all-config.adoc index 3cf03166362a7..dcc4c823db06b 100644 --- a/docs/src/main/asciidoc/all-config.adoc +++ b/docs/src/main/asciidoc/all-config.adoc @@ -11,4 +11,4 @@ include::_attributes.adoc[] :categories: core :summary: List all the configuration properties per extensions -include::{generated-dir}/quarkus-all-config.adoc[opts=optional] +include::{generated-config-doc-dir}/quarkus-all-config.adoc[opts=optional] diff --git a/docs/src/main/asciidoc/amqp-reference.adoc b/docs/src/main/asciidoc/amqp-reference.adoc index 5394d249fa2ac..7c32a6504912d 100644 --- a/docs/src/main/asciidoc/amqp-reference.adoc +++ b/docs/src/main/asciidoc/amqp-reference.adoc @@ -549,7 +549,7 @@ For more information on sending Cloud Events, see https://smallrye.io/smallrye-r === Quarkus specific configuration -include::{generated-dir}/quarkus-smallrye-reactivemessaging-amqp.adoc[opts=optional, leveloffset=+1] +include::{generated-config-doc-dir}/quarkus-messaging-amqp.adoc[opts=optional, leveloffset=+1] === Incoming channel configuration diff --git a/docs/src/main/asciidoc/building-native-image.adoc b/docs/src/main/asciidoc/building-native-image.adoc index 0cf3df7b5b83f..fa28a44c06030 100644 --- a/docs/src/main/asciidoc/building-native-image.adoc +++ b/docs/src/main/asciidoc/building-native-image.adoc @@ -942,7 +942,7 @@ These are provided in `application.properties` the same as any other config prop The properties are shown below: -include::{generated-dir}/quarkus-native-pkg-native-config.adoc[opts=optional] +include::{generated-config-doc-dir}/quarkus-core_quarkus.native.adoc[opts=optional] == What's next? diff --git a/docs/src/main/asciidoc/cache-infinispan-reference.adoc b/docs/src/main/asciidoc/cache-infinispan-reference.adoc index 0216fc2c426f3..57e128ea54367 100644 --- a/docs/src/main/asciidoc/cache-infinispan-reference.adoc +++ b/docs/src/main/asciidoc/cache-infinispan-reference.adoc @@ -209,4 +209,4 @@ the cache. quarkus.cache.infinispan.my-cache.max-idle=100s ---- -include::{generated-dir}/quarkus-cache-infinispan.adoc[opts=optional, leveloffset=+1] \ No newline at end of file +include::{generated-config-doc-dir}/quarkus-infinispan-cache.adoc[opts=optional, leveloffset=+1] diff --git a/docs/src/main/asciidoc/cache-redis-reference.adoc b/docs/src/main/asciidoc/cache-redis-reference.adoc index e6c71e979b413..71677eb03c47c 100644 --- a/docs/src/main/asciidoc/cache-redis-reference.adoc +++ b/docs/src/main/asciidoc/cache-redis-reference.adoc @@ -114,7 +114,7 @@ You would need to invalidate the values using the `@CacheInvalidateAll` or `@Cac The following table lists the supported properties: -include::{generated-dir}/quarkus-cache-redis.adoc[opts=optional, leveloffset=+1] +include::{generated-config-doc-dir}/quarkus-redis-cache.adoc[opts=optional, leveloffset=+1] == Configure the Redis key diff --git a/docs/src/main/asciidoc/cache.adoc b/docs/src/main/asciidoc/cache.adoc index 5e519c0134b39..55c1e387ca3f1 100644 --- a/docs/src/main/asciidoc/cache.adoc +++ b/docs/src/main/asciidoc/cache.adoc @@ -747,7 +747,7 @@ properties in the `application.properties` file. By default, caches do not perfo You need to replace `cache-name` in all the following properties with the real name of the cache you want to configure. ==== -include::{generated-dir}/quarkus-cache-cache-config.adoc[opts=optional, leveloffset=+1] +include::{generated-config-doc-dir}/quarkus-cache.adoc[opts=optional, leveloffset=+1] Here's what your cache configuration could look like: @@ -1076,4 +1076,4 @@ When you encounter this error, you can easily fix it by adding the following ann <1> It is an array, so you can register several cache implementations in one go if your configuration requires several of them. This annotation will register the cache implementation classes for reflection and this will include the classes into the native executable. -More details about the `@RegisterForReflection` annotation can be found on the xref:writing-native-applications-tips.adoc#registerForReflection[native application tips] page. \ No newline at end of file +More details about the `@RegisterForReflection` annotation can be found on the xref:writing-native-applications-tips.adoc#registerForReflection[native application tips] page. diff --git a/docs/src/main/asciidoc/cdi-reference.adoc b/docs/src/main/asciidoc/cdi-reference.adoc index b43240d289b9b..3aa29b599aab4 100644 --- a/docs/src/main/asciidoc/cdi-reference.adoc +++ b/docs/src/main/asciidoc/cdi-reference.adoc @@ -1382,4 +1382,4 @@ The "strictness" of the strict mode (the set of additional validations and the s [[arc-configuration-reference]] == ArC Configuration Reference -include::{generated-dir}/quarkus-arc.adoc[leveloffset=+1, opts=optional] +include::{generated-config-doc-dir}/quarkus-arc.adoc[leveloffset=+1, opts=optional] diff --git a/docs/src/main/asciidoc/centralized-log-management.adoc b/docs/src/main/asciidoc/centralized-log-management.adoc index f20cfeedaf86b..2e098d0596dfc 100644 --- a/docs/src/main/asciidoc/centralized-log-management.adoc +++ b/docs/src/main/asciidoc/centralized-log-management.adoc @@ -450,7 +450,7 @@ See the following documentation for Graylog (but the same issue exists for the o Configuration is done through the usual `application.properties` file. -include::{generated-dir}/quarkus-logging-gelf.adoc[opts=optional, leveloffset=+1] +include::{generated-config-doc-dir}/quarkus-logging-gelf.adoc[opts=optional, leveloffset=+1] This extension uses the `logstash-gelf` library that allow more configuration options via system properties, you can access its documentation here: https://logging.paluch.biz/ . diff --git a/docs/src/main/asciidoc/class-loading-reference.adoc b/docs/src/main/asciidoc/class-loading-reference.adoc index 611979ca3d262..16bb54b501b75 100644 --- a/docs/src/main/asciidoc/class-loading-reference.adoc +++ b/docs/src/main/asciidoc/class-loading-reference.adoc @@ -192,7 +192,7 @@ Note that class loading config is different to normal config, in that it does no (as it is needed too early), so only supports `application.properties`. The following options are supported. -include::{generated-dir}/quarkus-class-loading-configuration-class-loading-config.adoc[opts=optional, leveloffset=+1] +include::{generated-config-doc-dir}/quarkus-core_quarkus.class-loading.adoc[opts=optional, leveloffset=+1] == Hiding/Removing classes and resources from dependencies diff --git a/docs/src/main/asciidoc/config-reference.adoc b/docs/src/main/asciidoc/config-reference.adoc index 6071eea39109b..a4aabf159b832 100644 --- a/docs/src/main/asciidoc/config-reference.adoc +++ b/docs/src/main/asciidoc/config-reference.adoc @@ -847,4 +847,4 @@ link:https://smallrye.io/smallrye-config/Main[SmallRye Config documentation]. == Configuration Reference -include::{generated-dir}/quarkus-config-config.adoc[opts=optional, leveloffset=+1] +include::{generated-config-doc-dir}/quarkus-config-config.adoc[opts=optional, leveloffset=+1] diff --git a/docs/src/main/asciidoc/container-image.adoc b/docs/src/main/asciidoc/container-image.adoc index 344ca3001807d..99e097c39d67e 100644 --- a/docs/src/main/asciidoc/container-image.adoc +++ b/docs/src/main/asciidoc/container-image.adoc @@ -250,7 +250,7 @@ The following properties can be used to customize the container image build proc === Container Image Options -include::{generated-dir}/quarkus-container-image.adoc[opts=optional, leveloffset=+1] +include::{generated-config-doc-dir}/quarkus-container-image.adoc[opts=optional, leveloffset=+1] ==== Using CI Environments @@ -272,24 +272,24 @@ NOTE: See xref:config-reference.adoc#with-environment-variables[this] for more i In addition to the generic container image options, the `container-image-jib` also provides the following options: -include::{generated-dir}/quarkus-container-image-jib.adoc[opts=optional, leveloffset=+1] +include::{generated-config-doc-dir}/quarkus-container-image-jib.adoc[opts=optional, leveloffset=+1] [[DockerOptions]] === Docker Options In addition to the generic container image options, the `container-image-docker` also provides the following options: -include::{generated-dir}/quarkus-container-image-docker.adoc[opts=optional, leveloffset=+1] +include::{generated-config-doc-dir}/quarkus-container-image-docker.adoc[opts=optional, leveloffset=+1] [[PodmanOptions]] === Podman Options In addition to the generic container image options, the `container-image-podman` also provides the following options: -include::{generated-dir}/quarkus-container-image-podman.adoc[opts=optional, leveloffset=+1] +include::{generated-config-doc-dir}/quarkus-container-image-podman.adoc[opts=optional, leveloffset=+1] === OpenShift Options In addition to the generic container image options, the `container-image-openshift` also provides the following options: -include::{generated-dir}/quarkus-container-image-openshift.adoc[opts=optional, leveloffset=+1] +include::{generated-config-doc-dir}/quarkus-container-image-openshift_quarkus.openshift.adoc[opts=optional, leveloffset=+1] diff --git a/docs/src/main/asciidoc/continuous-testing.adoc b/docs/src/main/asciidoc/continuous-testing.adoc index 6fb104c1557ae..a66ef873fbdb7 100644 --- a/docs/src/main/asciidoc/continuous-testing.adoc +++ b/docs/src/main/asciidoc/continuous-testing.adoc @@ -155,5 +155,5 @@ This is enabled by default, and can be disabled via `quarkus.test.only-test-appl Continuous testing supports multiple configuration options that can be used to limit the tests that are run, and to control the output. The configuration properties are shown below: -include::{generated-dir}/quarkus-test-dev-testing-test-config.adoc[opts=optional, leveloffset=+2] +include::{generated-config-doc-dir}/quarkus-core_quarkus.test.adoc[opts=optional, leveloffset=+2] diff --git a/docs/src/main/asciidoc/databases-dev-services.adoc b/docs/src/main/asciidoc/databases-dev-services.adoc index 18c60da6bc4fd..843617348ba5a 100644 --- a/docs/src/main/asciidoc/databases-dev-services.adoc +++ b/docs/src/main/asciidoc/databases-dev-services.adoc @@ -121,7 +121,7 @@ In that case, you will need to stop and remove these containers manually. If you want to reuse containers for some Quarkus applications but not all of them, or some Dev Services but not all of them, you can disable this feature for a specific Dev Service by setting the configuration property -xref:databases-dev-services.adoc#quarkus-datasource-config-group-dev-services-build-time-config_quarkus-datasource-devservices-reuse[`quarkus.datasource.devservices.reuse`/`quarkus.datasource."datasource-name".devservices.reuse`] +xref:quarkus-datasource_quarkus-datasource-devservices-reuse[`quarkus.datasource.devservices.reuse`/`quarkus.datasource."datasource-name".devservices.reuse`] to `false`. == Mapping volumes into Dev Services for Database @@ -288,4 +288,4 @@ Dev Services have been started. Dev Services for Databases support the following configuration options: -include::{generated-dir}/quarkus-datasource-config-group-dev-services-build-time-config.adoc[opts=optional,leveloffset=+1] +include::{generated-config-doc-dir}/quarkus-datasource_quarkus.datasource.devservices.adoc[opts=optional,leveloffset=+1] diff --git a/docs/src/main/asciidoc/datasource.adoc b/docs/src/main/asciidoc/datasource.adoc index 1a4e22bb44b58..474da7a231fd9 100644 --- a/docs/src/main/asciidoc/datasource.adoc +++ b/docs/src/main/asciidoc/datasource.adoc @@ -733,12 +733,12 @@ endif::no-deprecated-test-resource[] [[configuration-reference]] === Common datasource configuration reference -include::{generated-dir}/quarkus-datasource.adoc[opts=optional, leveloffset=+1] +include::{generated-config-doc-dir}/quarkus-datasource.adoc[opts=optional, leveloffset=+1] [[jdbc-configuration]] === JDBC configuration reference -include::{generated-dir}/quarkus-agroal.adoc[opts=optional, leveloffset=+1] +include::{generated-config-doc-dir}/quarkus-agroal.adoc[opts=optional, leveloffset=+1] [[jdbc-url]] === JDBC URL reference @@ -934,29 +934,29 @@ This automatic resolution is applicable in most cases so that driver configurati [[reactive-configuration]] === Reactive datasource configuration reference -include::{generated-dir}/quarkus-reactive-datasource.adoc[opts=optional, leveloffset=+1] +include::{generated-config-doc-dir}/quarkus-reactive-datasource.adoc[opts=optional, leveloffset=+1] ifndef::no-quarkus-reactive-db2-client[] ==== Reactive DB2 configuration -include::{generated-dir}/quarkus-reactive-db2-client.adoc[opts=optional, leveloffset=+1] +include::{generated-config-doc-dir}/quarkus-reactive-db2-client.adoc[opts=optional, leveloffset=+1] endif::no-quarkus-reactive-db2-client[] ==== Reactive MariaDB/MySQL specific configuration -include::{generated-dir}/quarkus-reactive-mysql-client.adoc[opts=optional, leveloffset=+1] +include::{generated-config-doc-dir}/quarkus-reactive-mysql-client.adoc[opts=optional, leveloffset=+1] ==== Reactive Microsoft SQL server-specific configuration -include::{generated-dir}/quarkus-reactive-mssql-client.adoc[opts=optional, leveloffset=+1] +include::{generated-config-doc-dir}/quarkus-reactive-mssql-client.adoc[opts=optional, leveloffset=+1] ==== Reactive Oracle-specific configuration -include::{generated-dir}/quarkus-reactive-oracle-client.adoc[opts=optional, leveloffset=+1] +include::{generated-config-doc-dir}/quarkus-reactive-oracle-client.adoc[opts=optional, leveloffset=+1] ==== Reactive PostgreSQL-specific configuration -include::{generated-dir}/quarkus-reactive-pg-client.adoc[opts=optional, leveloffset=+1] +include::{generated-config-doc-dir}/quarkus-reactive-pg-client.adoc[opts=optional, leveloffset=+1] [[reactive-url]] diff --git a/docs/src/main/asciidoc/deploying-to-kubernetes.adoc b/docs/src/main/asciidoc/deploying-to-kubernetes.adoc index 4599053fd31ad..99938920b782a 100644 --- a/docs/src/main/asciidoc/deploying-to-kubernetes.adoc +++ b/docs/src/main/asciidoc/deploying-to-kubernetes.adoc @@ -238,7 +238,7 @@ You can provide the arguments that will be used by the Kubernetes Job via the pr Finally, the Kubernetes job will be launched every time it is installed in Kubernetes. You can know more about how to run Kubernetes jobs in this https://kubernetes.io/docs/concepts/workloads/controllers/job/#running-an-example-job[link]. -You can configure the rest of the Kubernetes Job configuration using the properties under `quarkus.kubernetes.job.xxx` (see xref:deploying-to-kubernetes.adoc#quarkus-kubernetes-kubernetes-config_quarkus-kubernetes-job-parallelism[link]). +You can configure the rest of the Kubernetes Job configuration using the properties under `quarkus.kubernetes.job.xxx` (see xref:deploying-to-kubernetes.adoc#quarkus-kubernetes_quarkus-kubernetes-job-parallelism[link]). ==== Generating CronJob resources @@ -253,7 +253,7 @@ quarkus.kubernetes.cron-job.schedule=0 * * * * IMPORTANT: CronJob resources require the https://en.wikipedia.org/wiki/Cron[Cron] expression to specify when to launch the job via the property `quarkus.kubernetes.cron-job.schedule`. If not provide, the build will fail. -You can configure the rest of the Kubernetes CronJob configuration using the properties under `quarkus.kubernetes.cron-job.xxx` (see xref:deploying-to-kubernetes.adoc#quarkus-kubernetes-kubernetes-config_quarkus-kubernetes-cron-job-parallelism[link]). +You can configure the rest of the Kubernetes CronJob configuration using the properties under `quarkus.kubernetes.cron-job.xxx` (see xref:deploying-to-kubernetes.adoc#quarkus-kubernetes_quarkus-kubernetes-cron-job-parallelism[link]). === Namespace @@ -1091,7 +1091,7 @@ The table below describe all the available configuration options. .Kubernetes :no-duration-note: true -include::{generated-dir}/quarkus-kubernetes-kubernetes-config.adoc[opts=optional, leveloffset=+1] +include::{generated-config-doc-dir}/quarkus-kubernetes_quarkus.kubernetes.adoc[opts=optional, leveloffset=+1] Properties that use non-standard types, can be referenced by expanding the property. For example to define a `kubernetes-readiness-probe` which is of type `Probe`: @@ -1119,7 +1119,7 @@ quarkus.kubernetes-client.trust-certs=true The full list of the Kubernetes client configuration properties is provided below. :no-duration-note: true -include::{generated-dir}/quarkus-kubernetes-client.adoc[opts=optional, leveloffset=+1] +include::{generated-config-doc-dir}/quarkus-kubernetes-client.adoc[opts=optional, leveloffset=+1] [[openshift]] === OpenShift @@ -1230,7 +1230,7 @@ The OpenShift resources can be customized in a similar approach with Kubernetes. .OpenShift :no-duration-note: true -include::{generated-dir}/quarkus-openshift-openshift-config.adoc[opts=optional, leveloffset=+1] +include::{generated-config-doc-dir}/quarkus-kubernetes_quarkus.openshift.adoc[opts=optional, leveloffset=+1] [[knative]] === Knative @@ -1295,7 +1295,7 @@ The generated service can be customized using the following properties: .Knative :no-duration-note: true -include::{generated-dir}/quarkus-knative-knative-config.adoc[opts=optional, leveloffset=+1] +include::{generated-config-doc-dir}/quarkus-kubernetes_quarkus.knative.adoc[opts=optional, leveloffset=+1] === Deployment targets diff --git a/docs/src/main/asciidoc/deploying-to-openshift.adoc b/docs/src/main/asciidoc/deploying-to-openshift.adoc index fd0d7ffa44494..659c5664eafe7 100644 --- a/docs/src/main/asciidoc/deploying-to-openshift.adoc +++ b/docs/src/main/asciidoc/deploying-to-openshift.adoc @@ -417,7 +417,7 @@ You can provide the arguments that will be used by the Kubernetes Job via the pr Finally, the Kubernetes job will be launched every time that is installed in OpenShift. You can know more about how to run Kubernetes jobs in this https://kubernetes.io/docs/concepts/workloads/controllers/job/#running-an-example-job[link]. -You can configure the rest of the Kubernetes Job configuration using the properties under `quarkus.openshift.job.xxx` (see xref:deploying-to-openshift#quarkus-openshift-openshift-config_quarkus-openshift-job-parallelism[link]). +You can configure the rest of the Kubernetes Job configuration using the properties under `quarkus.openshift.job.xxx` (see xref:deploying-to-openshift#quarkus-kubernetes_quarkus-openshift-job-parallelism[link]). ===== Generating CronJob resources @@ -432,7 +432,7 @@ quarkus.openshift.cron-job.schedule=0 * * * * IMPORTANT: CronJob resources require the https://en.wikipedia.org/wiki/Cron[Cron] expression to specify when to launch the job via the property `quarkus.openshift.cron-job.schedule`. If not provide, the build will fail. -You can configure the rest of the Kubernetes CronJob configuration using the properties under `quarkus.openshift.cron-job.xxx` (see xref:deploying-to-openshift.adoc#quarkus-openshift-openshift-config_quarkus-openshift-cron-job-parallelism[link]). +You can configure the rest of the Kubernetes CronJob configuration using the properties under `quarkus.openshift.cron-job.xxx` (see xref:deploying-to-openshift.adoc#quarkus-kubernetes_quarkus-openshift-cron-job-parallelism[link]). ==== Validation @@ -523,4 +523,4 @@ The application can then be deployed to OpenShift Serverless by enabling the sta == Configuration Reference -include::{generated-dir}/quarkus-openshift-openshift-config.adoc[opts=optional, leveloffset=+1] +include::{generated-config-doc-dir}/quarkus-kubernetes_quarkus.openshift.adoc[opts=optional, leveloffset=+1] diff --git a/docs/src/main/asciidoc/dev-services.adoc b/docs/src/main/asciidoc/dev-services.adoc index 2f4aabc91d4da..35a04c76969d4 100644 --- a/docs/src/main/asciidoc/dev-services.adoc +++ b/docs/src/main/asciidoc/dev-services.adoc @@ -54,14 +54,13 @@ in most cases this is not necessary as simply configuring the service will resul This section lists all the Dev Services available in the Quarkus Platform. - === AMQP The AMQP Dev Service will be enabled when the `quarkus-messaging-amqp` extension is present in your application, and the broker address has not been explicitly configured. More information can be found in the xref:amqp-dev-services.adoc[AMQP Dev Services Guide]. -include::{generated-dir}/quarkus-smallrye-reactivemessaging-amqp-config-group-amqp-dev-services-build-time-config.adoc[opts=optional, leveloffset=+1] +include::{generated-config-doc-dir}/quarkus-messaging-amqp_quarkus.amqp.devservices.adoc[opts=optional, leveloffset=+1] === Apicurio Registry @@ -69,7 +68,7 @@ The Apicurio Dev Service will be enabled when the `quarkus-apicurio-registry-avr address has not been explicitly configured. More information can be found in the xref:apicurio-registry-dev-services.adoc[Apicurio Registry Dev Services Guide]. -include::{generated-dir}/quarkus-apicurio-registry-devservices-apicurio-registry-devservice-apicurio-registry-dev-services-build-time-config.adoc[opts=optional, leveloffset=+1] +include::{generated-config-doc-dir}/quarkus-schema-registry-devservice_quarkus.apicurio-registry.devservices.adoc[opts=optional, leveloffset=+1] === Databases @@ -87,7 +86,7 @@ after each run, and can be reused. N.B. if you opt in for this feature, Quarkus will not reset the state of the database between runs unless you explicitly configure it to. -include::{generated-dir}/quarkus-datasource-config-group-dev-services-build-time-config.adoc[opts=optional, leveloffset=+1] +include::{generated-config-doc-dir}/quarkus-datasource_quarkus.datasource.devservices.adoc[opts=optional, leveloffset=+1] === Kafka @@ -95,7 +94,7 @@ The Kafka Dev Service will be enabled when the `quarkus-kafka-client` extension the broker address has not been explicitly configured. More information can be found in the xref:kafka-dev-services.adoc[Kafka Dev Services Guide]. -include::{generated-dir}/quarkus-kafka-client-config-group-kafka-dev-services-build-time-config.adoc[opts=optional, leveloffset=+1] +include::{generated-config-doc-dir}/quarkus-kafka-client_quarkus.kafka.devservices.adoc[opts=optional, leveloffset=+1] === Keycloak @@ -103,15 +102,15 @@ The Keycloak Dev Service will be enabled when the `quarkus-oidc` extension is pr the server address has not been explicitly configured. More information can be found in the xref:security-openid-connect-dev-services.adoc[OIDC Dev Services Guide]. -include::{generated-dir}/quarkus-keycloak-devservices-keycloak-keycloak-build-time-config.adoc[opts=optional, leveloffset=+1] +include::{generated-config-doc-dir}/quarkus-oidc_quarkus.keycloak.devservices.adoc[opts=optional, leveloffset=+1] === Kubernetes -The Kubernetes Dev Service will be enabled when `kubernetes-client` extension is present in your application, and +The Kubernetes Dev Service will be enabled when the `kubernetes-client` extension is present in your application, and the API server address has not been explicitly configured. More information can be found in the xref:kubernetes-dev-services.adoc[Kubernetes Dev Services Guide]. -include::{generated-dir}/quarkus-kubernetes-client-config-group-kubernetes-dev-services-build-time-config.adoc[opts=optional, leveloffset=+1] +include::{generated-config-doc-dir}/quarkus-kubernetes-client_quarkus.kubernetes-client.devservices.adoc[opts=optional, leveloffset=+1] === MongoDB @@ -119,7 +118,7 @@ The MongoDB Dev Service will be enabled when the `quarkus-mongodb-client` extens the server address has not been explicitly configured. More information can be found in the xref:mongodb-dev-services.adoc[MongoDB Guide]. -include::{generated-dir}/quarkus-mongodb-config-group-dev-services-build-time-config.adoc[opts=optional, leveloffset=+1] +include::{generated-config-doc-dir}/quarkus-mongodb-client_quarkus.mongodb.devservices.adoc[opts=optional, leveloffset=+1] === RabbitMQ @@ -127,7 +126,7 @@ The RabbitMQ Dev Service will be enabled when the `quarkus-messaging-rabbitmq` e the broker address has not been explicitly configured. More information can be found in the xref:rabbitmq-dev-services.adoc[RabbitMQ Dev Services Guide]. -include::{generated-dir}/quarkus-smallrye-reactivemessaging-rabbitmq-config-group-rabbit-mq-dev-services-build-time-config.adoc[opts=optional, leveloffset=+1] +include::{generated-config-doc-dir}/quarkus-messaging-rabbitmq_quarkus.rabbitmq.devservices.adoc[opts=optional, leveloffset=+1] === Pulsar @@ -135,13 +134,15 @@ The Pulsar Dev Service will be enabled when the `quarkus-messaging-pulsar` exten the broker address has not been explicitly configured. More information can be found in the xref:pulsar-dev-services.adoc[Pulsar Dev Services Guide]. +include::{generated-config-doc-dir}/quarkus-messaging-pulsar_quarkus.pulsar.devservices.adoc[opts=optional, leveloffset=+1] + === Redis The Redis Dev Service will be enabled when the `quarkus-redis-client` extension is present in your application, and the server address has not been explicitly configured. More information can be found in the xref:redis-dev-services.adoc[Redis Dev Services Guide]. -include::{generated-dir}/quarkus-redis-config-group-client-dev-services-config.adoc[opts=optional, leveloffset=+1] +include::{generated-config-doc-dir}/quarkus-redis-client_quarkus.redis.devservices.adoc[opts=optional, leveloffset=+1] === Vault @@ -155,7 +156,7 @@ The Infinispan Dev Service will be enabled when the `quarkus-infinispan-client` the server address has not been explicitly configured. More information can be found in the xref:infinispan-dev-services.adoc[Infinispan Dev Services Guide]. -include::{generated-dir}/quarkus-infinispan-client-config-group-infinispan-client-build-time-config-dev-service-configuration.adoc[opts=optional, leveloffset=+1] +include::{generated-config-doc-dir}/quarkus-infinispan-client_quarkus.infinispan-client.devservices.adoc[opts=optional, leveloffset=+1] === Elasticsearch @@ -163,7 +164,7 @@ The Elasticsearch Dev Service will be enabled when one of the Elasticsearch base is present in your application, and the server address has not been explicitly configured. More information can be found in the xref:elasticsearch-dev-services.adoc[Elasticsearch Dev Services Guide]. -include::{generated-dir}/quarkus-elasticsearch-devservices-elasticsearch-dev-services-build-time-config.adoc[opts=optional, leveloffset=+1] +include::{generated-config-doc-dir}/quarkus-elasticsearch-rest-client_quarkus.elasticsearch.devservices.adoc[opts=optional, leveloffset=+1] === Observability @@ -171,7 +172,7 @@ The Observability Dev Services will be enabled when the `quarkus-observability-d there is at least one dev resource on the classpath. More information can be found in the xref:observability-devservices.adoc[Observability Dev Services Guide]. -include::{generated-dir}/quarkus-observability-config-observability-configuration.adoc[opts=optional, leveloffset=+1] +include::{generated-config-doc-dir}/quarkus-observability-devservices.adoc[opts=optional, leveloffset=+1] == Dev Services beyond the Quarkus Platform @@ -193,4 +194,4 @@ More information can be found in the https://docs.quarkiverse.io/quarkus-wiremoc === Microcks The Microcks Quarkus extension includes a Microcks Dev Service. The Dev Service manages mocks for dependencies and contract-testing your API endpoints. -See the extension https://github.com/microcks/microcks-quarkus[README.md] for more information. \ No newline at end of file +See the extension https://github.com/microcks/microcks-quarkus[README.md] for more information. diff --git a/docs/src/main/asciidoc/elasticsearch-dev-services.adoc b/docs/src/main/asciidoc/elasticsearch-dev-services.adoc index 0740e7c8a11b1..c00434fa20add 100644 --- a/docs/src/main/asciidoc/elasticsearch-dev-services.adoc +++ b/docs/src/main/asciidoc/elasticsearch-dev-services.adoc @@ -138,7 +138,7 @@ In that case, you will need to stop and remove these containers manually. If you want to reuse containers for some Quarkus applications but not all of them, or some Dev Services but not all of them, you can disable this feature for a specific Dev Service by setting the configuration property -xref:elasticsearch-dev-services.adoc#quarkus-elasticsearch-devservices-elasticsearch-dev-services-build-time-config_quarkus-elasticsearch-devservices-reuse[`quarkus.elasticsearch.devservices.reuse`] +xref:elasticsearch-dev-services.adoc#quarkus-elasticsearch-rest-client_quarkus-elasticsearch-devservices-reuse[`quarkus.elasticsearch.devservices.reuse`] to `false`. == Current limitations @@ -147,4 +147,4 @@ Currently, only the default backend for Hibernate Search Elasticsearch is suppor == Configuration reference -include::{generated-dir}/quarkus-elasticsearch-devservices-elasticsearch-dev-services-build-time-config.adoc[opts=optional, leveloffset=+1] +include::{generated-config-doc-dir}/quarkus-elasticsearch-rest-client_quarkus.elasticsearch.devservices.adoc[opts=optional, leveloffset=+1] diff --git a/docs/src/main/asciidoc/elasticsearch.adoc b/docs/src/main/asciidoc/elasticsearch.adoc index aa1cd64136d65..aecb8e852bbc2 100644 --- a/docs/src/main/asciidoc/elasticsearch.adoc +++ b/docs/src/main/asciidoc/elasticsearch.adoc @@ -481,4 +481,4 @@ Accessing an Elasticsearch cluster from the low level REST client or the Elastic == Configuration Reference -include::{generated-dir}/quarkus-elasticsearch-restclient-lowlevel.adoc[opts=optional, leveloffset=+1] +include::{generated-config-doc-dir}/quarkus-elasticsearch-rest-client.adoc[opts=optional, leveloffset=+1] diff --git a/docs/src/main/asciidoc/flyway.adoc b/docs/src/main/asciidoc/flyway.adoc index 9263a23d39c7a..90e87d8323c75 100644 --- a/docs/src/main/asciidoc/flyway.adoc +++ b/docs/src/main/asciidoc/flyway.adoc @@ -191,7 +191,7 @@ First, you need to add the datasource config to the `{config-file}` file in order to allow Flyway to manage the schema. Also, you can customize the Flyway behaviour by using the following properties: -include::{generated-dir}/quarkus-flyway.adoc[opts=optional, leveloffset=+1] +include::{generated-config-doc-dir}/quarkus-flyway.adoc[opts=optional, leveloffset=+1] == Developing with Flyway diff --git a/docs/src/main/asciidoc/getting-started-dev-services.adoc b/docs/src/main/asciidoc/getting-started-dev-services.adoc index d42e2fbfc7f11..985c03fca65e2 100644 --- a/docs/src/main/asciidoc/getting-started-dev-services.adoc +++ b/docs/src/main/asciidoc/getting-started-dev-services.adoc @@ -238,7 +238,7 @@ Quarkus will automatically stop the container when your application stops. If you play with your code some more, you may notice that sometimes, after making an application change, http://localhost:8080/hello/names doesn't list any names. What's going on? By default, in dev mode, with a Dev Services database, Quarkus configures Hibernate ORM database generation to be `drop-and-create`. - See the xref:hibernate-orm.adoc#quarkus-hibernate-orm_quarkus-hibernate-orm-database-database-related-configuration[Hibernate configuration reference] for more details. + See the xref:hibernate-orm.adoc#quarkus-hibernate-orm_quarkus-hibernate-orm-database-generation[Hibernate configuration reference] for more details. If a code change triggers an application restart, the database tables will be dropped (deleted) and then re-created. diff --git a/docs/src/main/asciidoc/getting-started.adoc b/docs/src/main/asciidoc/getting-started.adoc index f04c4fbf65257..bd8192399614f 100644 --- a/docs/src/main/asciidoc/getting-started.adoc +++ b/docs/src/main/asciidoc/getting-started.adoc @@ -485,7 +485,7 @@ All CDI beans implementing the `InfoContributor` will be picked up and their dat ==== Configuration Reference -include::{generated-dir}/quarkus-info.adoc[opts=optional, leveloffset=+2] +include::{generated-config-doc-dir}/quarkus-info.adoc[opts=optional, leveloffset=+2] == What's next? diff --git a/docs/src/main/asciidoc/gradle-tooling.adoc b/docs/src/main/asciidoc/gradle-tooling.adoc index 551ce121b4cf5..4cc2b1e2b0775 100644 --- a/docs/src/main/asciidoc/gradle-tooling.adoc +++ b/docs/src/main/asciidoc/gradle-tooling.adoc @@ -313,7 +313,7 @@ app. All the config options are shown below: -include::{generated-dir}/quarkus-live-reload-live-reload-config.adoc[opts=optional, leveloffset=+1] +include::{generated-config-doc-dir}/quarkus-core_quarkus.live-reload.adoc[opts=optional, leveloffset=+1] == Debugging diff --git a/docs/src/main/asciidoc/grpc-service-consumption.adoc b/docs/src/main/asciidoc/grpc-service-consumption.adoc index cb6849e540ca2..83f14bf0b8e9e 100644 --- a/docs/src/main/asciidoc/grpc-service-consumption.adoc +++ b/docs/src/main/asciidoc/grpc-service-consumption.adoc @@ -204,7 +204,7 @@ public class StreamingEndpoint { For each gRPC service you inject in your application, you can configure the following attributes: -include::{generated-dir}/quarkus-grpc-config-group-config-grpc-client-configuration.adoc[opts=optional, leveloffset=+1] +include::{generated-config-doc-dir}/quarkus-grpc_quarkus.grpc-client.adoc[opts=optional, leveloffset=+1] The `client-name` is the name set in the `@GrpcClient` or derived from the injection point if not explicitly defined. @@ -469,7 +469,7 @@ public class HelloExceptionHandlerProvider implements ExceptionHandlerProvider { By default, when starting the application in dev mode, a gRPC server is started, even if no services are configured. You can configure the gRPC extension's dev mode behavior using the following properties. -include::{generated-dir}/quarkus-grpc-config-group-grpc-dev-mode-config.adoc[opts=optional, leveloffset=+1] +include::{generated-config-doc-dir}/quarkus-grpc_quarkus.grpc.dev-mode.adoc[opts=optional, leveloffset=+1] == Inject mock clients diff --git a/docs/src/main/asciidoc/grpc-service-implementation.adoc b/docs/src/main/asciidoc/grpc-service-implementation.adoc index f91e271c6e78d..98228e2990b97 100644 --- a/docs/src/main/asciidoc/grpc-service-implementation.adoc +++ b/docs/src/main/asciidoc/grpc-service-implementation.adoc @@ -215,7 +215,7 @@ If you wish to scale your server, you can set the number of server instances by == Server Configuration -include::{generated-dir}/quarkus-grpc-config-group-config-grpc-server-configuration.adoc[opts=optional, leveloffset=+1] +include::{generated-config-doc-dir}/quarkus-grpc_quarkus.grpc.server.adoc[opts=optional, leveloffset=+1] IMPORTANT: When you disable `quarkus.grpc.server.use-separate-server`, you are then using the new Vert.x gRPC server implementation which uses the existing HTTP server. Which means that the server port is now `8080` (or the port configured with `quarkus.http.port`). diff --git a/docs/src/main/asciidoc/grpc-xds.adoc b/docs/src/main/asciidoc/grpc-xds.adoc index e7beeae917f4c..d68cb48c65811 100644 --- a/docs/src/main/asciidoc/grpc-xds.adoc +++ b/docs/src/main/asciidoc/grpc-xds.adoc @@ -38,7 +38,7 @@ NOTE: This transitively adds `io.quarkus:quarkus-grpc` extension dependency. == Server configuration -include::{generated-dir}/quarkus-grpc-config-group-config-xds.adoc[opts=optional, leveloffset=+1] +include::{generated-config-doc-dir}/quarkus-grpc_quarkus.grpc.server.xds.adoc[opts=optional, leveloffset=+1] == Server configuration example @@ -58,7 +58,7 @@ NOTE: When xDS is configured, `plain-text` is automatically disabled. == Client configuration -include::{generated-dir}/quarkus-grpc-config-group-config-client-xds.adoc[opts=optional, leveloffset=+1] +include::{generated-config-doc-dir}/quarkus-grpc_quarkus.grpc.clients.-client-name-.xds.adoc[opts=optional, leveloffset=+1] NOTE: When xDS target property is used, name resolver, host, and port are not used diff --git a/docs/src/main/asciidoc/hibernate-orm.adoc b/docs/src/main/asciidoc/hibernate-orm.adoc index 0cd25cca8e642..68fef845af676 100644 --- a/docs/src/main/asciidoc/hibernate-orm.adoc +++ b/docs/src/main/asciidoc/hibernate-orm.adoc @@ -291,7 +291,7 @@ and will have it use the default datasource. The configuration properties listed here allow you to override such defaults, and customize and tune various aspects. -include::{generated-dir}/quarkus-hibernate-orm.adoc[opts=optional, leveloffset=+2] +include::{generated-config-doc-dir}/quarkus-hibernate-orm.adoc[opts=optional, leveloffset=+2] [NOTE] ==== diff --git a/docs/src/main/asciidoc/hibernate-reactive.adoc b/docs/src/main/asciidoc/hibernate-reactive.adoc index 6533f45892cb2..4c3ecc2afb08e 100644 --- a/docs/src/main/asciidoc/hibernate-reactive.adoc +++ b/docs/src/main/asciidoc/hibernate-reactive.adoc @@ -193,7 +193,7 @@ The configuration properties listed here allow you to override such defaults, an Hibernate Reactive uses the same properties you would use for Hibernate ORM. You will notice that some properties contain `jdbc` in the name but there is no JDBC in Hibernate Reactive, these are simply legacy property names. -include::{generated-dir}/quarkus-hibernate-orm.adoc[opts=optional, leveloffset=+2] +include::{generated-config-doc-dir}/quarkus-hibernate-orm.adoc[opts=optional, leveloffset=+2] [TIP] ==== diff --git a/docs/src/main/asciidoc/hibernate-search-orm-elasticsearch.adoc b/docs/src/main/asciidoc/hibernate-search-orm-elasticsearch.adoc index 17cab8e12ff7b..33e1e9ed95fd1 100644 --- a/docs/src/main/asciidoc/hibernate-search-orm-elasticsearch.adoc +++ b/docs/src/main/asciidoc/hibernate-search-orm-elasticsearch.adoc @@ -1062,16 +1062,16 @@ link:{hibernate-search-docs-url}#coordination-outbox-polling-schema[manually alt The database schema Hibernate Search will expect for outbox-polling coordination may be customized through the following configuration properties: -* <> -* <> -* <> -* <> -* <> -* <> -* <> -* <> -* <> -* <> +* <> +* <> +* <> +* <> +* <> +* <> +* <> +* <> +* <> +* <> ==== @@ -1246,7 +1246,7 @@ https://github.com/quarkiverse/quarkus-hibernate-search-extras/issues/179[quarki [[configuration-reference-main]] === Main Configuration -include::{generated-dir}/quarkus-hibernate-search-orm-elasticsearch.adoc[leveloffset=+1, opts=optional] +include::{generated-config-doc-dir}/quarkus-hibernate-search-orm-elasticsearch.adoc[leveloffset=+1, opts=optional] [NOTE] [[bean-reference-note-anchor]] @@ -1280,4 +1280,4 @@ for more information. NOTE: These configuration properties require an additional extension. See <>. -include::{generated-dir}/quarkus-hibernate-search-orm-outboxpolling.adoc[leveloffset=+1, opts=optional] +include::{generated-config-doc-dir}/quarkus-hibernate-search-orm-outbox-polling.adoc[leveloffset=+1, opts=optional] diff --git a/docs/src/main/asciidoc/hibernate-search-standalone-elasticsearch.adoc b/docs/src/main/asciidoc/hibernate-search-standalone-elasticsearch.adoc index ce077c94ca109..a4add91647ce6 100644 --- a/docs/src/main/asciidoc/hibernate-search-standalone-elasticsearch.adoc +++ b/docs/src/main/asciidoc/hibernate-search-standalone-elasticsearch.adoc @@ -1034,7 +1034,7 @@ https://github.com/quarkiverse/quarkus-hibernate-search-extras/issues/180[quarki [[configuration-reference]] == Configuration Reference for Hibernate Search Standalone -include::{generated-dir}/quarkus-hibernate-search-standalone-elasticsearch.adoc[leveloffset=+1, opts=optional] +include::{generated-config-doc-dir}/quarkus-hibernate-search-standalone-elasticsearch.adoc[leveloffset=+1, opts=optional] [NOTE] [[bean-reference-note-anchor]] diff --git a/docs/src/main/asciidoc/http-reference.adoc b/docs/src/main/asciidoc/http-reference.adoc index 8b5728e08a215..b876695f4b63d 100644 --- a/docs/src/main/asciidoc/http-reference.adoc +++ b/docs/src/main/asciidoc/http-reference.adoc @@ -80,7 +80,7 @@ TIP: Brotli compression is not available by default. You can enable it by settin Additionally, the index page for static resources can be changed from default `index.html`, the hidden files (e.g. dot files) can be indicated as not served, the range requests can be disabled, and the caching support (e.g. caching headers and file properties cache) can be configured. -include::{generated-dir}/quarkus-vertx-http-config-group-static-resources-config.adoc[leveloffset=+1, opts=optional] +include::{generated-config-doc-dir}/quarkus-vertx-http_quarkus.http.static-resources.adoc[leveloffset=+1, opts=optional] [[context-path]] == Configuring the Context path @@ -270,7 +270,7 @@ quarkus.http.header.Pragma.methods=GET,HEAD This will apply the `Pragma` header only when the `/headers/pragma` resource is called with a `GET` or a `HEAD` method -include::{generated-dir}/quarkus-vertx-http-config-group-header-config.adoc[leveloffset=+1, opts=optional] +include::{generated-config-doc-dir}/quarkus-vertx-http_quarkus.http.header.-header-.adoc[leveloffset=+1, opts=optional] === Additional HTTP Headers per path @@ -310,7 +310,7 @@ quarkus.http.filter.any-order.matches=/paths/order.* Will include the `Cache-Control: max-age=1` header when `/paths/order` is requested. -include::{generated-dir}/quarkus-vertx-http-config-group-filter-config.adoc[leveloffset=+1, opts=optional] +include::{generated-config-doc-dir}/quarkus-vertx-http_quarkus.http.filter.-filter-.adoc[leveloffset=+1, opts=optional] == Support 100-Continue in vert.x @@ -359,7 +359,7 @@ For more information about the CORS filter that Quarkus provides, see the Quarku == HTTP Limits Configuration -include::{generated-dir}/quarkus-vertx-http-config-group-server-limits-config.adoc[leveloffset=+1, opts=optional] +include::{generated-config-doc-dir}/quarkus-vertx-http_quarkus.http.limits.adoc[leveloffset=+1, opts=optional] == Configure traffic shaping @@ -404,7 +404,7 @@ When one of the threshold is reached, no write happens for that period of time. You can add HTTP request logging by configuring it in `application.properties`. There are two options for logging, either logging to the standard JBoss logging output, or logging to a dedicated file. -include::{generated-dir}/quarkus-vertx-http-config-group-access-log-config.adoc[opts=optional, leveloffset=+1] +include::{generated-config-doc-dir}/quarkus-vertx-http_quarkus.http.access-log.adoc[opts=optional, leveloffset=+1] [frame="topbot",options="header"] |=== diff --git a/docs/src/main/asciidoc/infinispan-client-reference.adoc b/docs/src/main/asciidoc/infinispan-client-reference.adoc index c8d944081f172..5c1d22831c6d1 100644 --- a/docs/src/main/asciidoc/infinispan-client-reference.adoc +++ b/docs/src/main/asciidoc/infinispan-client-reference.adoc @@ -969,4 +969,4 @@ You can set the port by configuring the `quarkus.infinispan-client.devservices.p == Configuration Reference -include::{generated-dir}/quarkus-infinispan-client.adoc[opts=optional, leveloffset=+1] +include::{generated-config-doc-dir}/quarkus-infinispan-client.adoc[opts=optional, leveloffset=+1] diff --git a/docs/src/main/asciidoc/infinispan-dev-services.adoc b/docs/src/main/asciidoc/infinispan-dev-services.adoc index b4fec3057afbd..13827511d4157 100644 --- a/docs/src/main/asciidoc/infinispan-dev-services.adoc +++ b/docs/src/main/asciidoc/infinispan-dev-services.adoc @@ -16,7 +16,7 @@ Quarkus will automatically start an Infinispan container when running tests or d The following properties are available to customize the Infinispan Dev Services: -include::{generated-dir}/quarkus-infinispan-client-config-group-infinispan-client-build-time-config-dev-service-configuration.adoc[opts=optional, leveloffset=+1] +include::{generated-config-doc-dir}/quarkus-infinispan-client_quarkus.infinispan-client.devservices.adoc[opts=optional, leveloffset=+1] When running the production version of the application, the Infinispan connection need to be configured as normal, so if you want to include a production database config in your `application.properties` and continue to use Dev Services diff --git a/docs/src/main/asciidoc/jfr.adoc b/docs/src/main/asciidoc/jfr.adoc index 33f8db92ae11e..f745754e6b68c 100644 --- a/docs/src/main/asciidoc/jfr.adoc +++ b/docs/src/main/asciidoc/jfr.adoc @@ -386,4 +386,4 @@ public class NewInterceptor { == Configuration Reference -include::{generated-dir}/quarkus-jfr.adoc[leveloffset=+1, opts=optional] \ No newline at end of file +include::{generated-config-doc-dir}/quarkus-jfr.adoc[leveloffset=+1, opts=optional] \ No newline at end of file diff --git a/docs/src/main/asciidoc/kafka-streams.adoc b/docs/src/main/asciidoc/kafka-streams.adoc index a77494f90ae22..9fa8e037f6404 100644 --- a/docs/src/main/asciidoc/kafka-streams.adoc +++ b/docs/src/main/asciidoc/kafka-streams.adoc @@ -1255,4 +1255,4 @@ Refer to the Quarkus guides on xref:telemetry-micrometer.adoc[Micrometer], xref: == Configuration Reference -include::{generated-dir}/quarkus-kafka-streams.adoc[opts=optional, leveloffset=+1] +include::{generated-config-doc-dir}/quarkus-kafka-streams.adoc[opts=optional, leveloffset=+1] diff --git a/docs/src/main/asciidoc/kubernetes-client.adoc b/docs/src/main/asciidoc/kubernetes-client.adoc index bd6061315016e..4483de695f9e0 100644 --- a/docs/src/main/asciidoc/kubernetes-client.adoc +++ b/docs/src/main/asciidoc/kubernetes-client.adoc @@ -54,7 +54,7 @@ quarkus.kubernetes-client.trust-certs=false quarkus.kubernetes-client.namespace=default ---- -Note that the full list of properties is available in the <>. +Note that the full list of properties is available in the <>. In dev mode and when running tests, xref:kubernetes-dev-services.adoc[Dev Services for Kubernetes] automatically starts a Kubernetes API server. @@ -521,4 +521,4 @@ testImplementation("io.quarkus:quarkus-test-openshift-client") == Configuration Reference -include::{generated-dir}/quarkus-kubernetes-client.adoc[opts=optional, leveloffset=+1] +include::{generated-config-doc-dir}/quarkus-kubernetes-client.adoc[opts=optional, leveloffset=+1] diff --git a/docs/src/main/asciidoc/kubernetes-config.adoc b/docs/src/main/asciidoc/kubernetes-config.adoc index a23590b443b70..8c4d0267a2d20 100644 --- a/docs/src/main/asciidoc/kubernetes-config.adoc +++ b/docs/src/main/asciidoc/kubernetes-config.adoc @@ -149,4 +149,4 @@ See xref:deploying-to-kubernetes.adoc#secret-mapping[this] for more details. == Configuration Reference -include::{generated-dir}/quarkus-kubernetes-config.adoc[opts=optional, leveloffset=+1] +include::{generated-config-doc-dir}/quarkus-kubernetes-config.adoc[opts=optional, leveloffset=+1] diff --git a/docs/src/main/asciidoc/liquibase-mongodb.adoc b/docs/src/main/asciidoc/liquibase-mongodb.adoc index af313bb8eaddb..bb0ebdc430e6c 100644 --- a/docs/src/main/asciidoc/liquibase-mongodb.adoc +++ b/docs/src/main/asciidoc/liquibase-mongodb.adoc @@ -193,4 +193,4 @@ quarkus.openshift.init-task-defaults.wait-for-container.image=my/wait-for-image: == Configuration Reference -include::{generated-dir}/quarkus-liquibase-mongodb.adoc[opts=optional, leveloffset=+2] +include::{generated-config-doc-dir}/quarkus-liquibase-mongodb.adoc[opts=optional, leveloffset=+2] diff --git a/docs/src/main/asciidoc/liquibase.adoc b/docs/src/main/asciidoc/liquibase.adoc index d62debf2d7d7b..0c097a5ea4cf1 100644 --- a/docs/src/main/asciidoc/liquibase.adoc +++ b/docs/src/main/asciidoc/liquibase.adoc @@ -276,4 +276,4 @@ quarkus.openshift.init-task-defaults.wait-for-container.image=my/wait-for-image: == Configuration Reference -include::{generated-dir}/quarkus-liquibase.adoc[opts=optional, leveloffset=+2] +include::{generated-config-doc-dir}/quarkus-liquibase.adoc[opts=optional, leveloffset=+2] diff --git a/docs/src/main/asciidoc/load-shedding-reference.adoc b/docs/src/main/asciidoc/load-shedding-reference.adoc index 3c06424345008..1c84eaea4c956 100644 --- a/docs/src/main/asciidoc/load-shedding-reference.adoc +++ b/docs/src/main/asciidoc/load-shedding-reference.adoc @@ -122,7 +122,7 @@ Improvements may be necessary. == Configuration reference -include::{generated-dir}/quarkus-load-shedding.adoc[opts=optional, leveloffset=+1] +include::{generated-config-doc-dir}/quarkus-load-shedding.adoc[opts=optional, leveloffset=+1] == Further reading diff --git a/docs/src/main/asciidoc/logging.adoc b/docs/src/main/asciidoc/logging.adoc index 8173f91e25ef6..15c157386c3bf 100644 --- a/docs/src/main/asciidoc/logging.adoc +++ b/docs/src/main/asciidoc/logging.adoc @@ -401,7 +401,7 @@ This can be achieved using different profiles, as shown in the following configu Configure the JSON logging extension using supported properties to customize its behavior. -include::{generated-dir}/quarkus-logging-json.adoc[opts=optional, leveloffset=+1] +include::{generated-config-doc-dir}/quarkus-logging-json.adoc[opts=optional, leveloffset=+1] WARNING: Enabling pretty printing might cause certain processors and JSON parsers to fail. @@ -437,7 +437,7 @@ quarkus.log.category."com.example".handlers=my-console-handler quarkus.log.category."com.example".use-parent-handlers=false ---- -For details about its configuration, see the xref:#quarkus-log-logging-log-config_quarkus-log-console-console-logging[console logging configuration] reference. +For details about its configuration, see the xref:#quarkus-core_section_quarkus-log-console[console logging configuration] reference. === File log handler @@ -470,7 +470,7 @@ quarkus.log.category."com.example".handlers=my-file-handler quarkus.log.category."com.example".use-parent-handlers=false ---- -For details about its configuration, see the xref:#quarkus-log-logging-log-config_quarkus-log-file-file-logging[file logging configuration] reference. +For details about its configuration, see the xref:#quarkus-core_section_quarkus-log-file[file logging configuration] reference. === Syslog log handler @@ -502,7 +502,7 @@ quarkus.log.category."com.example".handlers=my-syslog-handler quarkus.log.category."com.example".use-parent-handlers=false ---- -For details about its configuration, see the xref:#quarkus-log-logging-log-config_quarkus-log-syslog-syslog-logging[Syslog logging configuration] reference. +For details about its configuration, see the xref:#quarkus-core_section_quarkus-log-syslog[Syslog logging configuration] reference. == Add a logging filter to your log handler @@ -845,5 +845,4 @@ NOTE: If applicable, MDC data is stored in a _duplicated context_, which is an i [[loggingConfigurationReference]] == Logging configuration reference -include::{generated-dir}/quarkus-log-logging-log-build-time-config.adoc[opts=optional, leveloffset=+1] -include::{generated-dir}/quarkus-log-logging-log-config.adoc[opts=optional, leveloffset=+1] +include::{generated-config-doc-dir}/quarkus-core_quarkus.log.adoc[opts=optional, leveloffset=+1] diff --git a/docs/src/main/asciidoc/mailer-reference.adoc b/docs/src/main/asciidoc/mailer-reference.adoc index db1c8b9b6d75a..53c199dc77161 100644 --- a/docs/src/main/asciidoc/mailer-reference.adoc +++ b/docs/src/main/asciidoc/mailer-reference.adoc @@ -677,5 +677,5 @@ quarkus.mailer.mock=false # In dev mode, prevent from using the mock SMTP server [[configuration-reference]] == Mailer Configuration Reference -include::{generated-dir}/quarkus-mailer.adoc[opts=optional, leveloffset=+1] +include::{generated-config-doc-dir}/quarkus-mailer.adoc[opts=optional, leveloffset=+1] diff --git a/docs/src/main/asciidoc/management-interface-reference.adoc b/docs/src/main/asciidoc/management-interface-reference.adoc index 94611b107dc81..261e9b23894be 100644 --- a/docs/src/main/asciidoc/management-interface-reference.adoc +++ b/docs/src/main/asciidoc/management-interface-reference.adoc @@ -162,10 +162,7 @@ More details about the `Router` API can be found on https://vertx.io/docs/vertx- == Management Interface Configuration -include::{generated-dir}/quarkus-management-management-management-interface-build-time-config.adoc[leveloffset=+1, opts=optional] - -include::{generated-dir}/quarkus-management-management-management-interface-configuration.adoc[leveloffset=+1, opts=optional] - +include::{generated-config-doc-dir}/quarkus-vertx-http_quarkus.management.adoc[leveloffset=+1, opts=optional] [[reverse-proxy]] == Running behind a reverse proxy @@ -280,4 +277,4 @@ Thus, in the previous example, the injected URL is `http://localhost:9001/q/mana [source, properties] ----] quarkus.management.test-port=0 ----- \ No newline at end of file +---- diff --git a/docs/src/main/asciidoc/maven-tooling.adoc b/docs/src/main/asciidoc/maven-tooling.adoc index 29a7e806225fc..20f3fa0ee3292 100644 --- a/docs/src/main/asciidoc/maven-tooling.adoc +++ b/docs/src/main/asciidoc/maven-tooling.adoc @@ -262,7 +262,7 @@ rsync to sync to the remote application. All the config options are shown below: -include::{generated-dir}/quarkus-live-reload-live-reload-config.adoc[opts=optional, leveloffset=+1] +include::{generated-config-doc-dir}/quarkus-core_quarkus.live-reload.adoc[opts=optional, leveloffset=+1] NOTE: It is recommended you use SSL when using remote dev mode, however even if you are using an unencrypted connection your password is never sent directly over the wire. For the initial connection request the password is hashed with the @@ -908,7 +908,7 @@ These are provided in `application.properties` the same as any other config prop The properties are shown below: -include::{generated-dir}/quarkus-package-pkg-package-config.adoc[opts=optional] +include::{generated-config-doc-dir}/quarkus-core_quarkus.package.adoc[opts=optional] [[custom-test-configuration-profile]] === Custom test configuration profile in JVM mode diff --git a/docs/src/main/asciidoc/mongodb.adoc b/docs/src/main/asciidoc/mongodb.adoc index daeff00ac7e51..738ef30c97a67 100644 --- a/docs/src/main/asciidoc/mongodb.adoc +++ b/docs/src/main/asciidoc/mongodb.adoc @@ -793,4 +793,4 @@ IMPORTANT: Client-side field level encryption, and feature relying on https://gi == Configuration Reference -include::{generated-dir}/quarkus-mongodb.adoc[opts=optional, leveloffset=+1] +include::{generated-config-doc-dir}/quarkus-mongodb-client.adoc[opts=optional, leveloffset=+1] diff --git a/docs/src/main/asciidoc/openapi-swaggerui.adoc b/docs/src/main/asciidoc/openapi-swaggerui.adoc index bfbec48eb7bed..4dd71d13c5b11 100644 --- a/docs/src/main/asciidoc/openapi-swaggerui.adoc +++ b/docs/src/main/asciidoc/openapi-swaggerui.adoc @@ -575,8 +575,8 @@ If you plan to consume this application from a Single Page Application running o === OpenAPI -include::{generated-dir}/quarkus-smallrye-openapi.adoc[opts=optional, leveloffset=+1] +include::{generated-config-doc-dir}/quarkus-smallrye-openapi.adoc[opts=optional, leveloffset=+1] === Swagger UI -include::{generated-dir}/quarkus-swaggerui.adoc[opts=optional, leveloffset=+1] +include::{generated-config-doc-dir}/quarkus-swagger-ui.adoc[opts=optional, leveloffset=+1] diff --git a/docs/src/main/asciidoc/opentelemetry.adoc b/docs/src/main/asciidoc/opentelemetry.adoc index 7b59f79cc8eff..19f798a316417 100644 --- a/docs/src/main/asciidoc/opentelemetry.adoc +++ b/docs/src/main/asciidoc/opentelemetry.adoc @@ -307,4 +307,4 @@ adding the usual `quarkus.*` prefix. Quarkus OpenTelemetry configuration properties now have the `quarkus.otel.*` prefix. -include::{generated-dir}/quarkus-opentelemetry.adoc[leveloffset=+1, opts=optional] +include::{generated-config-doc-dir}/quarkus-opentelemetry.adoc[leveloffset=+1, opts=optional] diff --git a/docs/src/main/asciidoc/picocli.adoc b/docs/src/main/asciidoc/picocli.adoc index c4af5f43ee1b3..5ffac7b79ed00 100644 --- a/docs/src/main/asciidoc/picocli.adoc +++ b/docs/src/main/asciidoc/picocli.adoc @@ -370,4 +370,4 @@ Finally, the Kubernetes job will be launched every time it is installed in Kuber == Configuration Reference -include::{generated-dir}/quarkus-picocli.adoc[opts=optional, leveloffset=+1] +include::{generated-config-doc-dir}/quarkus-picocli.adoc[opts=optional, leveloffset=+1] diff --git a/docs/src/main/asciidoc/quartz.adoc b/docs/src/main/asciidoc/quartz.adoc index b75d946f02ade..45b0c52a85bd1 100644 --- a/docs/src/main/asciidoc/quartz.adoc +++ b/docs/src/main/asciidoc/quartz.adoc @@ -481,4 +481,4 @@ If `run-blocking-method-on-quartz-thread` is set, the scheduled method runs on a [[quartz-configuration-reference]] == Quartz Configuration Reference -include::{generated-dir}/quarkus-quartz.adoc[leveloffset=+1, opts=optional] +include::{generated-config-doc-dir}/quarkus-quartz.adoc[leveloffset=+1, opts=optional] diff --git a/docs/src/main/asciidoc/qute-reference.adoc b/docs/src/main/asciidoc/qute-reference.adoc index 07b8720d680b9..707126d72bfb4 100644 --- a/docs/src/main/asciidoc/qute-reference.adoc +++ b/docs/src/main/asciidoc/qute-reference.adoc @@ -2932,7 +2932,7 @@ Message templates are validated during the build. If a missing message template === Configuration Reference -include::{generated-dir}/quarkus-qute.adoc[leveloffset=+1, opts=optional] +include::{generated-config-doc-dir}/quarkus-qute.adoc[leveloffset=+1, opts=optional] [[standalone]] diff --git a/docs/src/main/asciidoc/qute.adoc b/docs/src/main/asciidoc/qute.adoc index 3db27182a8f95..f1835d2ee0524 100644 --- a/docs/src/main/asciidoc/qute.adoc +++ b/docs/src/main/asciidoc/qute.adoc @@ -539,4 +539,4 @@ To learn more about Qute, please refer to the xref:qute-reference.adoc[Qute refe [[qute-configuration-reference]] == Qute Configuration Reference -include::{generated-dir}/quarkus-qute.adoc[leveloffset=+1, opts=optional] +include::{generated-config-doc-dir}/quarkus-qute.adoc[leveloffset=+1, opts=optional] diff --git a/docs/src/main/asciidoc/rabbitmq-reference.adoc b/docs/src/main/asciidoc/rabbitmq-reference.adoc index 65e3f27325521..1d809650487cc 100644 --- a/docs/src/main/asciidoc/rabbitmq-reference.adoc +++ b/docs/src/main/asciidoc/rabbitmq-reference.adoc @@ -470,7 +470,7 @@ the default mount path of `rabbitmq`. If the RabbitMQ secret engine was mounted //=== Quarkus specific configuration -//include::{generated-dir}/quarkus-smallrye-reactivemessaging-rabbitmq.adoc[opts=optional, leveloffset=+1] +//include::{generated-config-doc-dir}/quarkus-smallrye-reactivemessaging-rabbitmq.adoc[opts=optional, leveloffset=+1] === Incoming channel configuration diff --git a/docs/src/main/asciidoc/reactive-sql-clients.adoc b/docs/src/main/asciidoc/reactive-sql-clients.adoc index e1db726b63345..0f7cff6be12e7 100644 --- a/docs/src/main/asciidoc/reactive-sql-clients.adoc +++ b/docs/src/main/asciidoc/reactive-sql-clients.adoc @@ -902,28 +902,28 @@ By default, `pipelining-limit` is set to 256. === Common Datasource -include::{generated-dir}/quarkus-datasource.adoc[opts=optional, leveloffset=+1] +include::{generated-config-doc-dir}/quarkus-datasource.adoc[opts=optional, leveloffset=+1] === Reactive Datasource -include::{generated-dir}/quarkus-reactive-datasource.adoc[opts=optional, leveloffset=+1] +include::{generated-config-doc-dir}/quarkus-reactive-datasource.adoc[opts=optional, leveloffset=+1] === IBM Db2 -include::{generated-dir}/quarkus-reactive-db2-client.adoc[opts=optional, leveloffset=+1] +include::{generated-config-doc-dir}/quarkus-reactive-db2-client.adoc[opts=optional, leveloffset=+1] === MariaDB/MySQL -include::{generated-dir}/quarkus-reactive-mysql-client.adoc[opts=optional, leveloffset=+1] +include::{generated-config-doc-dir}/quarkus-reactive-mysql-client.adoc[opts=optional, leveloffset=+1] === Microsoft SQL Server -include::{generated-dir}/quarkus-reactive-mssql-client.adoc[opts=optional, leveloffset=+1] +include::{generated-config-doc-dir}/quarkus-reactive-mssql-client.adoc[opts=optional, leveloffset=+1] === Oracle -include::{generated-dir}/quarkus-reactive-oracle-client.adoc[opts=optional, leveloffset=+1] +include::{generated-config-doc-dir}/quarkus-reactive-oracle-client.adoc[opts=optional, leveloffset=+1] === PostgreSQL -include::{generated-dir}/quarkus-reactive-pg-client.adoc[opts=optional, leveloffset=+1] +include::{generated-config-doc-dir}/quarkus-reactive-pg-client.adoc[opts=optional, leveloffset=+1] diff --git a/docs/src/main/asciidoc/redis-dev-services.adoc b/docs/src/main/asciidoc/redis-dev-services.adoc index 1370e18f19e35..e568c80df1fd6 100644 --- a/docs/src/main/asciidoc/redis-dev-services.adoc +++ b/docs/src/main/asciidoc/redis-dev-services.adoc @@ -15,9 +15,9 @@ Quarkus supports a feature called Dev Services that allows you to create various What that means practically, is that if you have docker running and have not configured `quarkus.redis.hosts`, Quarkus will automatically start a Redis container when running tests or dev mode, and automatically configure the connection. -Available properties to customize the Redis DevService. +Available properties to customize the Redis Dev Service. -include::{generated-dir}/quarkus-redis-config-group-client-dev-services-config.adoc[opts=optional, leveloffset=+1] +include::{generated-config-doc-dir}/quarkus-redis-client_quarkus.redis.devservices.adoc[opts=optional, leveloffset=+1] When running the production version of the application, the Redis connection need to be configured as normal, so if you want to include a production database config in your `application.properties` and continue to use Dev Services diff --git a/docs/src/main/asciidoc/redis-reference.adoc b/docs/src/main/asciidoc/redis-reference.adoc index c2eae5a4fb538..e739f357df475 100644 --- a/docs/src/main/asciidoc/redis-reference.adoc +++ b/docs/src/main/asciidoc/redis-reference.adoc @@ -1024,4 +1024,4 @@ quarkus.micrometer.binder.redis.enabled=false [[redis-configuration-reference]] == Configuration reference -include::{generated-dir}/quarkus-redis.adoc[opts=optional, leveloffset=+1] +include::{generated-config-doc-dir}/quarkus-redis-client.adoc[opts=optional, leveloffset=+1] diff --git a/docs/src/main/asciidoc/resteasy.adoc b/docs/src/main/asciidoc/resteasy.adoc index 2e8cbe99b3bff..c0a9c6a0d4832 100644 --- a/docs/src/main/asciidoc/resteasy.adoc +++ b/docs/src/main/asciidoc/resteasy.adoc @@ -740,7 +740,7 @@ This extension slightly differs from the RESTEasy default behavior as the defaul You can configure this behavior with the following configuration properties: -include::{generated-dir}/quarkus-resteasy-multipart.adoc[leveloffset=+1, opts=optional] +include::{generated-config-doc-dir}/quarkus-resteasy-multipart.adoc[leveloffset=+1, opts=optional] == Servlet compatibility diff --git a/docs/src/main/asciidoc/scheduler-reference.adoc b/docs/src/main/asciidoc/scheduler-reference.adoc index 809b2951808bd..78ad35cbe679d 100644 --- a/docs/src/main/asciidoc/scheduler-reference.adoc +++ b/docs/src/main/asciidoc/scheduler-reference.adoc @@ -509,4 +509,4 @@ Read xref:./virtual-threads.adoc[the virtual thread guide] for more details. == Configuration Reference -include::{generated-dir}/quarkus-scheduler.adoc[leveloffset=+1, opts=optional] +include::{generated-config-doc-dir}/quarkus-scheduler.adoc[leveloffset=+1, opts=optional] diff --git a/docs/src/main/asciidoc/scheduler.adoc b/docs/src/main/asciidoc/scheduler.adoc index 208324444742c..851d94865e7ac 100644 --- a/docs/src/main/asciidoc/scheduler.adoc +++ b/docs/src/main/asciidoc/scheduler.adoc @@ -191,4 +191,4 @@ include::{includes}/devtools/build-native.adoc[] [[scheduler-configuration-reference]] == Scheduler Configuration Reference -include::{generated-dir}/quarkus-scheduler.adoc[leveloffset=+1, opts=optional] +include::{generated-config-doc-dir}/quarkus-scheduler.adoc[leveloffset=+1, opts=optional] diff --git a/docs/src/main/asciidoc/security-authentication-mechanisms.adoc b/docs/src/main/asciidoc/security-authentication-mechanisms.adoc index 9b3dcde39d5d7..94799e6e037cc 100644 --- a/docs/src/main/asciidoc/security-authentication-mechanisms.adoc +++ b/docs/src/main/asciidoc/security-authentication-mechanisms.adoc @@ -217,8 +217,7 @@ public Response logout() { The following properties can be used to configure form-based authentication: -include::{generated-dir}/quarkus-vertx-http-config-group-form-auth-config.adoc[opts=optional, leveloffset=+1] -include::{generated-dir}/quarkus-vertx-http-config-group-auth-runtime-config.adoc[opts=optional, leveloffset=+1] +include::{generated-config-doc-dir}/quarkus-vertx-http_quarkus.http.auth.adoc[opts=optional, leveloffset=+1] [[mutual-tls]] === Mutual TLS authentication diff --git a/docs/src/main/asciidoc/security-cors.adoc b/docs/src/main/asciidoc/security-cors.adoc index aaaccb9f02134..d9a2950877a49 100644 --- a/docs/src/main/asciidoc/security-cors.adoc +++ b/docs/src/main/asciidoc/security-cors.adoc @@ -30,7 +30,7 @@ quarkus.http.cors=true When the filter is enabled and identifies an HTTP request as cross-origin, it will enforce the CORS policy. It will also add headers configured with the following properties before forwarding the request to its intended destination, like a servlet, Jakarta REST resource, or other endpoints. -include::{generated-dir}/quarkus-vertx-http-config-group-cors-cors-config.adoc[leveloffset=+1, opts=optional] +include::{generated-config-doc-dir}/quarkus-vertx-http_quarkus.http.cors.adoc[leveloffset=+1, opts=optional] . An example of a full CORS filter configuration that includes a regular expression defining an allowed origin [source, properties] diff --git a/docs/src/main/asciidoc/security-csrf-prevention.adoc b/docs/src/main/asciidoc/security-csrf-prevention.adoc index e23e0bbf9413a..7aed0e53e2f49 100644 --- a/docs/src/main/asciidoc/security-csrf-prevention.adoc +++ b/docs/src/main/asciidoc/security-csrf-prevention.adoc @@ -322,7 +322,7 @@ quarkus.csrf-reactive.verify-token=false [[csrf-reactive-configuration-reference]] == Configuration Reference -include::{generated-dir}/quarkus-csrf-reactive.adoc[leveloffset=+1, opts=optional] +include::{generated-config-doc-dir}/quarkus-rest-csrf.adoc[leveloffset=+1, opts=optional] == References diff --git a/docs/src/main/asciidoc/security-jdbc.adoc b/docs/src/main/asciidoc/security-jdbc.adoc index 5c19c3bcfe203..fe5b61b80a5e4 100644 --- a/docs/src/main/asciidoc/security-jdbc.adoc +++ b/docs/src/main/asciidoc/security-jdbc.adoc @@ -319,7 +319,7 @@ quarkus.security.jdbc.principal-query.roles.attribute-mappings.0.to=groups [[configuration-reference]] == Configuration Reference -include::{generated-dir}/quarkus-elytron-security-jdbc.adoc[opts=optional, leveloffset=+1] +include::{generated-config-doc-dir}/quarkus-elytron-security-jdbc.adoc[opts=optional, leveloffset=+1] == References diff --git a/docs/src/main/asciidoc/security-jpa.adoc b/docs/src/main/asciidoc/security-jpa.adoc index 32f95188491f3..71c9743dbbfba 100644 --- a/docs/src/main/asciidoc/security-jpa.adoc +++ b/docs/src/main/asciidoc/security-jpa.adoc @@ -218,7 +218,7 @@ However, if your `io.quarkus.hibernate.orm.runtime.tenant.TenantResolver` must a For more information about proactive authentication, see the Quarkus xref:security-proactive-authentication.adoc[Proactive authentication] guide. ==== -include::{generated-dir}/quarkus-security-jpa.adoc[opts=optional, leveloffset=+2] +include::{generated-config-doc-dir}/quarkus-security-jpa.adoc[opts=optional, leveloffset=+2] == References diff --git a/docs/src/main/asciidoc/security-jwt.adoc b/docs/src/main/asciidoc/security-jwt.adoc index 21520fa933f6a..439867a1a4cb2 100644 --- a/docs/src/main/asciidoc/security-jwt.adoc +++ b/docs/src/main/asciidoc/security-jwt.adoc @@ -1040,7 +1040,7 @@ quarkus.index-dependency.smallrye-jwt.artifact-id=smallrye-jwt === Quarkus configuration -include::{generated-dir}/quarkus-smallrye-jwt.adoc[opts=optional, leveloffset=+1] +include::{generated-config-doc-dir}/quarkus-smallrye-jwt.adoc[opts=optional, leveloffset=+1] === MicroProfile JWT configuration diff --git a/docs/src/main/asciidoc/security-keycloak-admin-client.adoc b/docs/src/main/asciidoc/security-keycloak-admin-client.adoc index a14d38f868398..0969330df70af 100644 --- a/docs/src/main/asciidoc/security-keycloak-admin-client.adoc +++ b/docs/src/main/asciidoc/security-keycloak-admin-client.adoc @@ -215,7 +215,7 @@ For example, by default, a test container will be available at a randomly alloca [[keycloak-admin-client-configuration-reference]] == Quarkus Keycloak Admin Client Configuration Reference -include::{generated-dir}/quarkus-keycloak-admin-client.adoc[leveloffset=+1, opts=optional] +include::{generated-config-doc-dir}/quarkus-keycloak-admin-client.adoc[leveloffset=+1, opts=optional] == References diff --git a/docs/src/main/asciidoc/security-keycloak-authorization.adoc b/docs/src/main/asciidoc/security-keycloak-authorization.adoc index bd27a031501ae..0016429574f4a 100644 --- a/docs/src/main/asciidoc/security-keycloak-authorization.adoc +++ b/docs/src/main/asciidoc/security-keycloak-authorization.adoc @@ -623,7 +623,7 @@ public class CustomTenantPolicyConfigResolver implements TenantPolicyConfigResol This configuration adheres to the official [Keycloak Policy Enforcer Configuration](https://www.keycloak.org/docs/latest/authorization_services/index.html#_enforcer_filter) guidelines. For detailed insights into various configuration options, see the following documentation: -include::{generated-dir}/quarkus-keycloak-keycloak-policy-enforcer-config.adoc[opts=optional] +include::{generated-config-doc-dir}/quarkus-keycloak-authorization.adoc[opts=optional] == References diff --git a/docs/src/main/asciidoc/security-ldap.adoc b/docs/src/main/asciidoc/security-ldap.adoc index 94a3a8c79cab2..169fc3348629f 100644 --- a/docs/src/main/asciidoc/security-ldap.adoc +++ b/docs/src/main/asciidoc/security-ldap.adoc @@ -249,7 +249,7 @@ user% [[configuration-reference]] == Configuration Reference -include::{generated-dir}/quarkus-elytron-security-ldap.adoc[opts=optional, leveloffset=+1] +include::{generated-config-doc-dir}/quarkus-elytron-security-ldap.adoc[opts=optional, leveloffset=+1] == References diff --git a/docs/src/main/asciidoc/security-oauth2.adoc b/docs/src/main/asciidoc/security-oauth2.adoc index eeb77804c95bd..a03657f209e97 100644 --- a/docs/src/main/asciidoc/security-oauth2.adoc +++ b/docs/src/main/asciidoc/security-oauth2.adoc @@ -450,4 +450,4 @@ class TokenSecuredResourceTest { [[config-reference]] == Configuration Reference -include::{generated-dir}/quarkus-elytron-security-oauth2.adoc[opts=optional, leveloffset=+1] +include::{generated-config-doc-dir}/quarkus-elytron-security-oauth2.adoc[opts=optional, leveloffset=+1] diff --git a/docs/src/main/asciidoc/security-oidc-configuration-properties-reference.adoc b/docs/src/main/asciidoc/security-oidc-configuration-properties-reference.adoc index c98859136473d..ed5254942620b 100644 --- a/docs/src/main/asciidoc/security-oidc-configuration-properties-reference.adoc +++ b/docs/src/main/asciidoc/security-oidc-configuration-properties-reference.adoc @@ -13,7 +13,13 @@ include::_attributes.adoc[] As a Quarkus developer, you configure the Quarkus OpenID Connect (OIDC) extension by setting the following properties in the `src/main/resources/application.properties` file. -include::{generated-dir}/quarkus-oidc.adoc[opts=optional, leveloffset=+1] +== OIDC configuration + +include::{generated-config-doc-dir}/quarkus-oidc_quarkus.oidc.adoc[opts=optional, leveloffset=+1] + +== Keycloak Dev Services configuration + +include::{generated-config-doc-dir}/quarkus-oidc_quarkus.keycloak.adoc[opts=optional, leveloffset=+1] == References diff --git a/docs/src/main/asciidoc/security-openid-connect-client-reference.adoc b/docs/src/main/asciidoc/security-openid-connect-client-reference.adoc index 924a7821d9bca..a39fd98e16f88 100644 --- a/docs/src/main/asciidoc/security-openid-connect-client-reference.adoc +++ b/docs/src/main/asciidoc/security-openid-connect-client-reference.adoc @@ -1414,11 +1414,11 @@ endif::no-quarkus-oidc-client-graphql[] === OIDC client -include::{generated-dir}/quarkus-oidc-client.adoc[opts=optional, leveloffset=+1] +include::{generated-config-doc-dir}/quarkus-oidc-client.adoc[opts=optional, leveloffset=+1] === OIDC token propagation -include::{generated-dir}/quarkus-oidc-token-propagation-reactive.adoc[opts=optional, leveloffset=+1] +include::{generated-config-doc-dir}/quarkus-rest-client-oidc-token-propagation.adoc[opts=optional, leveloffset=+1] == References diff --git a/docs/src/main/asciidoc/security-properties.adoc b/docs/src/main/asciidoc/security-properties.adoc index 9a1341596bc75..65814617de728 100644 --- a/docs/src/main/asciidoc/security-properties.adoc +++ b/docs/src/main/asciidoc/security-properties.adoc @@ -37,7 +37,7 @@ Both support storage of this information in properties files. The following sections detail the specific configuration properties. -include::{generated-dir}/quarkus-elytron-security.adoc[opts=optional, leveloffset=+2] +include::{generated-config-doc-dir}/quarkus-elytron-security-properties-file.adoc[opts=optional, leveloffset=+2] === Properties Files Realm Configuration diff --git a/docs/src/main/asciidoc/security-webauthn.adoc b/docs/src/main/asciidoc/security-webauthn.adoc index d3727cce71340..fa36b02526782 100644 --- a/docs/src/main/asciidoc/security-webauthn.adoc +++ b/docs/src/main/asciidoc/security-webauthn.adoc @@ -1295,7 +1295,7 @@ The security encryption key can be set with the link:all-config#quarkus-vertx-http_quarkus.http.auth.session.encryption-key[`quarkus.http.auth.session.encryption-key`] configuration option, as described in the link:security-authentication-mechanisms#form-auth[security guide]. -include::{generated-dir}/quarkus-security-webauthn.adoc[opts=optional, leveloffset=+1] +include::{generated-config-doc-dir}/quarkus-security-webauthn.adoc[opts=optional, leveloffset=+1] == References diff --git a/docs/src/main/asciidoc/smallrye-graphql.adoc b/docs/src/main/asciidoc/smallrye-graphql.adoc index 1372e363c94e1..660f1eafe63c5 100644 --- a/docs/src/main/asciidoc/smallrye-graphql.adoc +++ b/docs/src/main/asciidoc/smallrye-graphql.adoc @@ -1316,4 +1316,4 @@ API `evolution`. [[configuration-reference]] == Configuration Reference -include::{generated-dir}/quarkus-smallrye-graphql.adoc[leveloffset=+1, opts=optional] +include::{generated-config-doc-dir}/quarkus-smallrye-graphql.adoc[leveloffset=+1, opts=optional] diff --git a/docs/src/main/asciidoc/smallrye-health.adoc b/docs/src/main/asciidoc/smallrye-health.adoc index a3100b3f93aef..09d3321e9b40b 100644 --- a/docs/src/main/asciidoc/smallrye-health.adoc +++ b/docs/src/main/asciidoc/smallrye-health.adoc @@ -468,4 +468,4 @@ implementation("io.quarkus:quarkus-smallrye-health") == Configuration Reference -include::{generated-dir}/quarkus-smallrye-health.adoc[opts=optional, leveloffset=+1] +include::{generated-config-doc-dir}/quarkus-smallrye-health_quarkus.smallrye-health.adoc[opts=optional, leveloffset=+1] diff --git a/docs/src/main/asciidoc/smallrye-metrics.adoc b/docs/src/main/asciidoc/smallrye-metrics.adoc index 99fae51f04371..f293ff9a7d486 100644 --- a/docs/src/main/asciidoc/smallrye-metrics.adoc +++ b/docs/src/main/asciidoc/smallrye-metrics.adoc @@ -240,4 +240,4 @@ Refer to the xref:./management-interface-reference.adoc[management interface ref .Configuration Reference -include::{generated-dir}/quarkus-smallrye-metrics.adoc[opts=optional, leveloffset=+1] +include::{generated-config-doc-dir}/quarkus-smallrye-metrics.adoc[opts=optional, leveloffset=+1] diff --git a/docs/src/main/asciidoc/spring-cloud-config-client.adoc b/docs/src/main/asciidoc/spring-cloud-config-client.adoc index b07db43c2bbd1..c75c8dcfe4eae 100644 --- a/docs/src/main/asciidoc/spring-cloud-config-client.adoc +++ b/docs/src/main/asciidoc/spring-cloud-config-client.adoc @@ -160,5 +160,5 @@ Quarkus has more Spring compatibility features. See the following guides for mor [[spring-cloud-config-client-configuration-reference]] == Spring Cloud Config Client Reference -include::{generated-dir}/quarkus-spring-cloud-config-client.adoc[leveloffset=+1, opts=optional] +include::{generated-config-doc-dir}/quarkus-spring-cloud-config-client.adoc[leveloffset=+1, opts=optional] diff --git a/docs/src/main/asciidoc/spring-di.adoc b/docs/src/main/asciidoc/spring-di.adoc index 710dc04a2e9d5..23bd69c79cb74 100644 --- a/docs/src/main/asciidoc/spring-di.adoc +++ b/docs/src/main/asciidoc/spring-di.adoc @@ -338,7 +338,7 @@ The following table shows how Spring DI annotations can be converted to CDI and == Spring DI Configuration Reference -include::{generated-dir}/quarkus-spring-di.adoc[leveloffset=+1, opts=optional] +include::{generated-config-doc-dir}/quarkus-spring-di.adoc[leveloffset=+1, opts=optional] == More Spring guides diff --git a/docs/src/main/asciidoc/stork-reference.adoc b/docs/src/main/asciidoc/stork-reference.adoc index ae7345148a009..704e170f646d4 100644 --- a/docs/src/main/asciidoc/stork-reference.adoc +++ b/docs/src/main/asciidoc/stork-reference.adoc @@ -134,7 +134,7 @@ quarkus.micrometer.binder.stork.enabled=false [[stork-configuration-reference]] == Configuration reference -include::{generated-dir}/quarkus-stork.adoc[opts=optional, leveloffset=+1] +include::{generated-config-doc-dir}/quarkus-smallrye-stork.adoc[opts=optional, leveloffset=+1] diff --git a/docs/src/main/asciidoc/telemetry-micrometer.adoc b/docs/src/main/asciidoc/telemetry-micrometer.adoc index ea56e96039b74..ba2748f6cd53f 100644 --- a/docs/src/main/asciidoc/telemetry-micrometer.adoc +++ b/docs/src/main/asciidoc/telemetry-micrometer.adoc @@ -764,4 +764,4 @@ Refer to the xref:./management-interface-reference.adoc[management interface ref == Configuration Reference -include::{generated-dir}/quarkus-micrometer.adoc[opts=optional, leveloffset=+1] +include::{generated-config-doc-dir}/quarkus-micrometer.adoc[opts=optional, leveloffset=+1] diff --git a/docs/src/main/asciidoc/tests-with-coverage.adoc b/docs/src/main/asciidoc/tests-with-coverage.adoc index 0c7efd1750067..bf88ea692ead6 100644 --- a/docs/src/main/asciidoc/tests-with-coverage.adoc +++ b/docs/src/main/asciidoc/tests-with-coverage.adoc @@ -198,7 +198,7 @@ the `quarkus-jacoco` extension allows JaCoCo to just work out of the box. There are some config options that affect this: -include::{generated-dir}/quarkus-jacoco-jacoco-config.adoc[opts=optional, leveloffset=+1] +include::{generated-config-doc-dir}/quarkus-jacoco.adoc[opts=optional, leveloffset=+1] [TIP] ==== diff --git a/docs/src/main/asciidoc/tls-registry-reference.adoc b/docs/src/main/asciidoc/tls-registry-reference.adoc index 767fa496e63f1..c758e3f7d414c 100644 --- a/docs/src/main/asciidoc/tls-registry-reference.adoc +++ b/docs/src/main/asciidoc/tls-registry-reference.adoc @@ -437,7 +437,7 @@ quarkus.tls.hostname-verification-algorithm=NONE The following table lists the supported properties: -include::{generated-dir}/quarkus-tls.adoc[opts=optional, leveloffset=+1] +include::{generated-config-doc-dir}/quarkus-tls-registry.adoc[opts=optional, leveloffset=+1] == The registry API diff --git a/docs/src/main/asciidoc/validation.adoc b/docs/src/main/asciidoc/validation.adoc index 821e8b514572d..3fea25f130915 100644 --- a/docs/src/main/asciidoc/validation.adoc +++ b/docs/src/main/asciidoc/validation.adoc @@ -514,4 +514,4 @@ is called. [[configuration-reference]] == Hibernate Validator Configuration Reference -include::{generated-dir}/quarkus-hibernate-validator.quarkus.hibernate-validator.adoc[leveloffset=+1, opts=optional] +include::{generated-config-doc-dir}/quarkus-hibernate-validator.adoc[leveloffset=+1, opts=optional] diff --git a/docs/src/main/asciidoc/vertx-reference.adoc b/docs/src/main/asciidoc/vertx-reference.adoc index 626cbdd0f6c25..05dc47e22f53f 100644 --- a/docs/src/main/asciidoc/vertx-reference.adoc +++ b/docs/src/main/asciidoc/vertx-reference.adoc @@ -60,7 +60,7 @@ Documentation about the Vert.x Mutiny variant is available on https://smallrye.i You can configure the Vert.x instance from the `application.properties` file. The following table lists the supported properties: -include::{generated-dir}/quarkus-vertx-core.adoc[opts=optional, leveloffset=+1] +include::{generated-config-doc-dir}/quarkus-vertx.adoc[opts=optional, leveloffset=+1] See <> to configure the Vert.x instance using a programmatic approach. diff --git a/docs/src/main/asciidoc/websockets-next-reference.adoc b/docs/src/main/asciidoc/websockets-next-reference.adoc index c051ddd3c667c..55bb2fd407eca 100644 --- a/docs/src/main/asciidoc/websockets-next-reference.adoc +++ b/docs/src/main/asciidoc/websockets-next-reference.adoc @@ -1022,4 +1022,4 @@ quarkus.log.category."io.quarkus.websockets.next.traffic".level=DEBUG <3> [[websocket-next-configuration-reference]] == Configuration reference -include::{generated-dir}/quarkus-websockets-next.adoc[opts=optional, leveloffset=+1] +include::{generated-config-doc-dir}/quarkus-websockets-next.adoc[opts=optional, leveloffset=+1] diff --git a/docs/src/main/asciidoc/writing-extensions.adoc b/docs/src/main/asciidoc/writing-extensions.adoc index cd975cc7c6840..61082f0fc19ec 100644 --- a/docs/src/main/asciidoc/writing-extensions.adoc +++ b/docs/src/main/asciidoc/writing-extensions.adoc @@ -1356,7 +1356,7 @@ To include the generated configuration reference documentation in a guide, use: [source,asciidoc] ---- -\include::{generated-dir}/quarkus-your-extension.adoc[opts=optional, leveloffset=+1] +\include::{generated-config-doc-dir}/quarkus-your-extension.adoc[opts=optional, leveloffset=+1] ---- To include only a specific config group: @@ -1389,7 +1389,7 @@ And at the end of the guide, the extensive configuration documentation: [[configuration-reference]] == Configuration Reference -\include::{generated-dir}/quarkus-your-extension.adoc[opts=optional, leveloffset=+1] +\include::{generated-config-doc-dir}/quarkus-your-extension.adoc[opts=optional, leveloffset=+1] ---- [WARNING] diff --git a/extensions/grpc/deployment/src/main/java/io/quarkus/grpc/deployment/GrpcBuildTimeConfig.java b/extensions/grpc/deployment/src/main/java/io/quarkus/grpc/deployment/GrpcBuildTimeConfig.java index bb0f282bb9551..33874f303a2e9 100644 --- a/extensions/grpc/deployment/src/main/java/io/quarkus/grpc/deployment/GrpcBuildTimeConfig.java +++ b/extensions/grpc/deployment/src/main/java/io/quarkus/grpc/deployment/GrpcBuildTimeConfig.java @@ -1,5 +1,6 @@ package io.quarkus.grpc.deployment; +import io.quarkus.runtime.annotations.ConfigDocSection; import io.quarkus.runtime.annotations.ConfigItem; import io.quarkus.runtime.annotations.ConfigPhase; import io.quarkus.runtime.annotations.ConfigRoot; @@ -11,6 +12,7 @@ public class GrpcBuildTimeConfig { * Configuration gRPC dev mode. */ @ConfigItem + @ConfigDocSection(generated = true) public GrpcDevModeConfig devMode; } diff --git a/extensions/grpc/runtime/src/main/java/io/quarkus/grpc/runtime/config/GrpcClientConfiguration.java b/extensions/grpc/runtime/src/main/java/io/quarkus/grpc/runtime/config/GrpcClientConfiguration.java index 903af86158e1a..c083659d93f5b 100644 --- a/extensions/grpc/runtime/src/main/java/io/quarkus/grpc/runtime/config/GrpcClientConfiguration.java +++ b/extensions/grpc/runtime/src/main/java/io/quarkus/grpc/runtime/config/GrpcClientConfiguration.java @@ -5,6 +5,7 @@ import java.util.OptionalInt; import java.util.OptionalLong; +import io.quarkus.runtime.annotations.ConfigDocSection; import io.quarkus.runtime.annotations.ConfigGroup; import io.quarkus.runtime.annotations.ConfigItem; @@ -26,6 +27,7 @@ public class GrpcClientConfiguration { * Configure XDS usage, if enabled. */ @ConfigItem + @ConfigDocSection(generated = true) public ClientXds xds; /** diff --git a/extensions/grpc/runtime/src/main/java/io/quarkus/grpc/runtime/config/GrpcConfiguration.java b/extensions/grpc/runtime/src/main/java/io/quarkus/grpc/runtime/config/GrpcConfiguration.java index 1cc2406f666c6..862bd70ba1d7f 100644 --- a/extensions/grpc/runtime/src/main/java/io/quarkus/grpc/runtime/config/GrpcConfiguration.java +++ b/extensions/grpc/runtime/src/main/java/io/quarkus/grpc/runtime/config/GrpcConfiguration.java @@ -18,14 +18,14 @@ public class GrpcConfiguration { * Configures the gRPC clients. */ @ConfigItem - @ConfigDocSection + @ConfigDocSection(generated = true) @ConfigDocMapKey("client-name") public Map clients; /** * Configure the gRPC server. */ - @ConfigDocSection + @ConfigDocSection(generated = true) public GrpcServerConfiguration server; } diff --git a/extensions/grpc/runtime/src/main/java/io/quarkus/grpc/runtime/config/GrpcServerConfiguration.java b/extensions/grpc/runtime/src/main/java/io/quarkus/grpc/runtime/config/GrpcServerConfiguration.java index 471df3983534d..6eb707986648f 100644 --- a/extensions/grpc/runtime/src/main/java/io/quarkus/grpc/runtime/config/GrpcServerConfiguration.java +++ b/extensions/grpc/runtime/src/main/java/io/quarkus/grpc/runtime/config/GrpcServerConfiguration.java @@ -4,6 +4,7 @@ import java.util.Optional; import java.util.OptionalInt; +import io.quarkus.runtime.annotations.ConfigDocSection; import io.quarkus.runtime.annotations.ConfigGroup; import io.quarkus.runtime.annotations.ConfigItem; @@ -23,6 +24,7 @@ public class GrpcServerConfiguration { * Configure XDS usage, if enabled. */ @ConfigItem + @ConfigDocSection(generated = true) public Xds xds; /** diff --git a/extensions/vertx-http/runtime/src/main/java/io/quarkus/vertx/http/runtime/HttpConfiguration.java b/extensions/vertx-http/runtime/src/main/java/io/quarkus/vertx/http/runtime/HttpConfiguration.java index 8a5465f671650..b79377c6547f4 100644 --- a/extensions/vertx-http/runtime/src/main/java/io/quarkus/vertx/http/runtime/HttpConfiguration.java +++ b/extensions/vertx-http/runtime/src/main/java/io/quarkus/vertx/http/runtime/HttpConfiguration.java @@ -6,6 +6,7 @@ import java.util.OptionalInt; import io.quarkus.runtime.LaunchMode; +import io.quarkus.runtime.annotations.ConfigDocSection; import io.quarkus.runtime.annotations.ConfigItem; import io.quarkus.runtime.annotations.ConfigPhase; import io.quarkus.runtime.annotations.ConfigRoot; @@ -17,6 +18,7 @@ public class HttpConfiguration { /** * Authentication configuration */ + @ConfigDocSection(generated = true) public AuthRuntimeConfig auth; /** @@ -119,6 +121,7 @@ public class HttpConfiguration { /** * The CORS config */ + @ConfigDocSection(generated = true) public CORSConfig cors; /** @@ -139,8 +142,9 @@ public class HttpConfiguration { public Optional tlsConfigurationName; /** - * The Static Resources config + * Static Resources. */ + @ConfigDocSection(generated = true) public StaticResourcesConfig staticResources; /** @@ -162,8 +166,9 @@ public class HttpConfiguration { public OptionalInt ioThreads; /** - * Server limits configuration + * Server limits. */ + @ConfigDocSection(generated = true) public ServerLimitsConfig limits; /** @@ -253,8 +258,16 @@ public class HttpConfiguration { @ConfigItem public boolean recordRequestStartTime; + /** + * Access logs. + */ + @ConfigDocSection(generated = true) public AccessLogConfig accessLog; + /** + * Traffic shaping. + */ + @ConfigDocSection public TrafficShapingConfig trafficShaping; /** @@ -281,14 +294,20 @@ public class HttpConfiguration { * Additional HTTP Headers always sent in the response */ @ConfigItem + @ConfigDocSection(generated = true) public Map header; /** * Additional HTTP configuration per path */ @ConfigItem + @ConfigDocSection(generated = true) public Map filter; + /** + * Proxy. + */ + @ConfigDocSection public ProxyConfig proxy; public int determinePort(LaunchMode launchMode) { From 91046073896568d25589ceedcab2a42e7ccc722c Mon Sep 17 00:00:00 2001 From: Guillaume Smet Date: Mon, 5 Aug 2024 10:41:25 +0200 Subject: [PATCH 28/43] Add the extension artifactId to the generated anchor --- .../maven/config/doc/GenerateAsciidocMojo.java | 15 ++++++++++++--- .../resources/templates/configReference.qute.adoc | 4 ++-- .../templates/tags/configProperty.qute.adoc | 6 ++---- .../templates/tags/configSection.qute.adoc | 8 +++----- 4 files changed, 19 insertions(+), 14 deletions(-) diff --git a/devtools/config-doc-maven-plugin/src/main/java/io/quarkus/maven/config/doc/GenerateAsciidocMojo.java b/devtools/config-doc-maven-plugin/src/main/java/io/quarkus/maven/config/doc/GenerateAsciidocMojo.java index 273fdca9d9126..339471bed98a9 100644 --- a/devtools/config-doc-maven-plugin/src/main/java/io/quarkus/maven/config/doc/GenerateAsciidocMojo.java +++ b/devtools/config-doc-maven-plugin/src/main/java/io/quarkus/maven/config/doc/GenerateAsciidocMojo.java @@ -98,7 +98,7 @@ public void execute() throws MojoExecutionException, MojoFailureException { try { Files.writeString(configRootAdocPath, - generateConfigReference(quteEngine, summaryTableId, configRoot)); + generateConfigReference(quteEngine, summaryTableId, extension, configRoot)); } catch (Exception e) { throw new MojoExecutionException("Unable to render config roots for top level prefix: " + topLevelPrefix + " in extension: " + extension.toString(), e); @@ -132,7 +132,7 @@ public void execute() throws MojoExecutionException, MojoFailureException { try { Files.writeString(configSectionAdocPath, - generateConfigReference(quteEngine, summaryTableId, generatedConfigSection)); + generateConfigReference(quteEngine, summaryTableId, extension, generatedConfigSection)); } catch (Exception e) { throw new MojoExecutionException( "Unable to render config section for section: " + generatedConfigSection.getPath() @@ -143,9 +143,10 @@ public void execute() throws MojoExecutionException, MojoFailureException { } } - private static String generateConfigReference(Engine quteEngine, String summaryTableId, + private static String generateConfigReference(Engine quteEngine, String summaryTableId, Extension extension, ConfigItemCollection configItemCollection) { return quteEngine.getTemplate("configReference.qute.adoc") + .data("extension", extension) .data("configItemCollection", configItemCollection) .data("searchable", true) .data("summaryTableId", summaryTableId) @@ -308,6 +309,14 @@ private static Engine initializeQuteEngine(AsciidocFormatter asciidocFormatter) .applyToNoParameters() .resolveSync(ctx -> asciidocFormatter.toAnchor((String) ctx.getBase())) .build()) + .addValueResolver(ValueResolver.builder() + .applyToBaseClass(AbstractConfigItem.class) + .applyToName("toAnchor") + .applyToParameters(1) + .resolveAsync(ctx -> ctx.evaluate(ctx.getParams().get(0)) + .thenApply(o -> asciidocFormatter.toAnchor( + ((Extension) o).artifactId() + "_" + ((AbstractConfigItem) ctx.getBase()).getPath()))) + .build()) .addValueResolver(ValueResolver.builder() .applyToBaseClass(ConfigProperty.class) .applyToName("typeDescription") diff --git a/devtools/config-doc-maven-plugin/src/main/resources/templates/configReference.qute.adoc b/devtools/config-doc-maven-plugin/src/main/resources/templates/configReference.qute.adoc index 10a2c3375f76d..3fe7092a6be20 100644 --- a/devtools/config-doc-maven-plugin/src/main/resources/templates/configReference.qute.adoc +++ b/devtools/config-doc-maven-plugin/src/main/resources/templates/configReference.qute.adoc @@ -11,10 +11,10 @@ h|Default {#for item in configItemCollection.items} {#if !item.deprecated} {#if item.isSection} -{#configSection configSection=item /} +{#configSection configSection=item extension=extension /} {#else} -{#configProperty configProperty=item /} +{#configProperty configProperty=item extension=extension /} {/if} {/if} diff --git a/devtools/config-doc-maven-plugin/src/main/resources/templates/tags/configProperty.qute.adoc b/devtools/config-doc-maven-plugin/src/main/resources/templates/tags/configProperty.qute.adoc index 39ccdcb83cda5..33d7ca0c5430d 100644 --- a/devtools/config-doc-maven-plugin/src/main/resources/templates/tags/configProperty.qute.adoc +++ b/devtools/config-doc-maven-plugin/src/main/resources/templates/tags/configProperty.qute.adoc @@ -1,8 +1,7 @@ -{#let anchor = configProperty.path.toAnchor} -a|{#if configProperty.phase.fixedAtBuildTime}icon:lock[title=Fixed at build time]{/if} [[{configProperty.path.toAnchor}]]link:#{anchor}[`{configProperty.path}`] +a|{#if configProperty.phase.fixedAtBuildTime}icon:lock[title=Fixed at build time]{/if} [[{configProperty.toAnchor(extension)}]] `{configProperty.path}` {#for additionalPath in configProperty.additionalPaths} -link:#{anchor}[`{additionalPath}`] +`{additionalPath}` {/for} [.description] @@ -12,4 +11,3 @@ link:#{anchor}[`{additionalPath}`] -- {#if configProperty.enum}a{/if}|{configProperty.typeDescription} |{#if configProperty.defaultValue}`{configProperty.defaultValue.escapeCellContent}`{#else if !configProperty.optional}required icon:exclamation-circle[title=Configuration property is required]{/if} -{/let} diff --git a/devtools/config-doc-maven-plugin/src/main/resources/templates/tags/configSection.qute.adoc b/devtools/config-doc-maven-plugin/src/main/resources/templates/tags/configSection.qute.adoc index 5c0467b831b9e..c3100613be598 100644 --- a/devtools/config-doc-maven-plugin/src/main/resources/templates/tags/configSection.qute.adoc +++ b/devtools/config-doc-maven-plugin/src/main/resources/templates/tags/configSection.qute.adoc @@ -1,16 +1,14 @@ -{#let anchor = configSection.path.toAnchor} -h|[[%s]]link:#%s[{configSection.title.escapeCellContent}] +h|[[{configSection.toAnchor(extension)}]] {configSection.title.escapeCellContent} h|Type h|Default -{/let} {#for item in configSection.items} {#if !item.deprecated} {#if item.isSection} -{#configSection configSection=item /} +{#configSection configSection=item extension=extension /} {#else} -{#configProperty configProperty=item /} +{#configProperty configProperty=item extension=extension /} {/if} {/if} From b154fdf5d9588ab76ae301d53324e4856828928c Mon Sep 17 00:00:00 2001 From: Guillaume Smet Date: Mon, 5 Aug 2024 10:57:59 +0200 Subject: [PATCH 29/43] Improve how ConfigSections/ConfigRoots are merged ConfigSections have to be merged inside a given ConfigRoot. Typically, HibernateORMConfig has sections that are both in a simple element and in an unnamed map thus leading to the same section path. As for ConfigRoots, let's not merge them at all at resolution stage, given we already do some merging in the Maven plugin, let's do the merging at the end. Also drops some code related to having ConfigGroups in the model as we don't need them. --- .../config/model/AbstractConfigItem.java | 2 +- .../config/model/ConfigGroup.java | 5 -- .../config/model/ConfigRoot.java | 34 ++++++++------ .../config/model/ConfigSection.java | 43 +++++++++-------- .../config/model/ResolvedModel.java | 46 ++++++------------- .../config/resolver/ConfigResolver.java | 40 ++++++++-------- .../config/doc/GenerateAsciidocMojo.java | 17 +++++-- 7 files changed, 95 insertions(+), 92 deletions(-) delete mode 100644 core/processor/src/main/java/io/quarkus/annotation/processor/documentation/config/model/ConfigGroup.java diff --git a/core/processor/src/main/java/io/quarkus/annotation/processor/documentation/config/model/AbstractConfigItem.java b/core/processor/src/main/java/io/quarkus/annotation/processor/documentation/config/model/AbstractConfigItem.java index 83e7b9a291dac..b2d5a7b5de760 100644 --- a/core/processor/src/main/java/io/quarkus/annotation/processor/documentation/config/model/AbstractConfigItem.java +++ b/core/processor/src/main/java/io/quarkus/annotation/processor/documentation/config/model/AbstractConfigItem.java @@ -13,7 +13,7 @@ public sealed abstract class AbstractConfigItem implements Comparable getItems() { public void merge(ConfigRoot other) { this.qualifiedNames.addAll(other.getQualifiedNames()); + Map existingConfigSections = new HashMap<>(); + collectConfigSections(existingConfigSections, this); + for (AbstractConfigItem otherItem : other.getItems()) { - if (otherItem instanceof ConfigSection configSection) { - Optional similarConfigSection = findSimilarSection(configSection); - if (similarConfigSection.isEmpty()) { - this.items.add(configSection); + if (otherItem instanceof ConfigSection otherConfigSection) { + ConfigSection similarConfigSection = existingConfigSections.get(otherConfigSection.getPath()); + + if (similarConfigSection == null) { + this.items.add(otherConfigSection); } else { - similarConfigSection.get().merge(configSection); + similarConfigSection.merge(otherConfigSection, existingConfigSections); } } else if (otherItem instanceof ConfigProperty configProperty) { this.items.add(configProperty); @@ -80,15 +85,14 @@ public void merge(ConfigRoot other) { Collections.sort(this.items); } - private Optional findSimilarSection(ConfigSection configSection) { - // this is a bit naive as a section could be nested differently but with a similar path - // it should be sufficient for now - // also, it's not exactly optimal, maybe we should have a map (but we need to be careful about the order), we'll see - return this.getItems().stream() - .filter(i -> i.isSection()) - .filter(i -> i.getPath().equals(configSection.getPath())) - .map(i -> (ConfigSection) i) - .findFirst(); + private void collectConfigSections(Map configSections, ConfigItemCollection configItemCollection) { + for (AbstractConfigItem item : configItemCollection.getItems()) { + if (item instanceof ConfigSection configSection) { + configSections.put(item.getPath(), configSection); + + collectConfigSections(configSections, configSection); + } + } } public boolean hasDurationType() { diff --git a/core/processor/src/main/java/io/quarkus/annotation/processor/documentation/config/model/ConfigSection.java b/core/processor/src/main/java/io/quarkus/annotation/processor/documentation/config/model/ConfigSection.java index 7b88e9ea889ea..5f008988c0361 100644 --- a/core/processor/src/main/java/io/quarkus/annotation/processor/documentation/config/model/ConfigSection.java +++ b/core/processor/src/main/java/io/quarkus/annotation/processor/documentation/config/model/ConfigSection.java @@ -3,7 +3,7 @@ import java.util.ArrayList; import java.util.Collections; import java.util.List; -import java.util.Optional; +import java.util.Map; public final class ConfigSection extends AbstractConfigItem implements ConfigItemCollection { @@ -43,17 +43,33 @@ public boolean isGenerated() { return generated; } - public void merge(ConfigSection other) { + /** + * This is used when we merge ConfigSection at the ConfigRoot level. + * It can happen when for instance a path is both used at a given level and in an unnamed map. + * For instance in: HibernateOrmConfig. + */ + public void appendState(boolean generated, boolean deprecated) { + // we generate the section if at least one of the sections should be generated + // (the output will contain all the items of the section) + this.generated = this.generated || generated; + // we unmark the section as deprecated if one of the merged section is not deprecated + // as we will have to generate the section + this.deprecated = this.deprecated && deprecated; + } + + /** + * This is used to merge ConfigRoot when generating the AsciiDoc output. + */ + public void merge(ConfigSection other, Map existingConfigSections) { this.generated = this.generated || other.generated; for (AbstractConfigItem otherItem : other.getItems()) { - if (otherItem instanceof ConfigSection configSection) { - Optional similarConfigSection = findSimilarSection(configSection); - if (similarConfigSection.isEmpty()) { - this.items.add(configSection); + if (otherItem instanceof ConfigSection otherConfigSection) { + ConfigSection similarConfigSection = existingConfigSections.get(otherConfigSection.getPath()); + if (similarConfigSection == null) { + this.items.add(otherConfigSection); } else { - similarConfigSection.get().merge(configSection); - Collections.sort(similarConfigSection.get().items); + similarConfigSection.merge(otherConfigSection, existingConfigSections); } } else if (otherItem instanceof ConfigProperty configProperty) { this.items.add(configProperty); @@ -61,17 +77,8 @@ public void merge(ConfigSection other) { throw new IllegalStateException("Unknown item type: " + otherItem.getClass()); } } - } - private Optional findSimilarSection(ConfigSection configSection) { - // this is a bit naive as a section could be nested differently but with a similar path - // it should be sufficient for now - // also, it's not exactly optimal, maybe we should have a map (but we need to be careful about the order), we'll see - return this.getItems().stream() - .filter(i -> i.isSection()) - .filter(i -> i.getPath().equals(configSection.getPath())) - .map(i -> (ConfigSection) i) - .findFirst(); + Collections.sort(this.items); } @Override diff --git a/core/processor/src/main/java/io/quarkus/annotation/processor/documentation/config/model/ResolvedModel.java b/core/processor/src/main/java/io/quarkus/annotation/processor/documentation/config/model/ResolvedModel.java index 2ae697f7d0801..cab08a441abeb 100644 --- a/core/processor/src/main/java/io/quarkus/annotation/processor/documentation/config/model/ResolvedModel.java +++ b/core/processor/src/main/java/io/quarkus/annotation/processor/documentation/config/model/ResolvedModel.java @@ -1,54 +1,36 @@ package io.quarkus.annotation.processor.documentation.config.model; import java.util.Collections; -import java.util.Map; +import java.util.List; import com.fasterxml.jackson.annotation.JsonCreator; /** * This is the fully resolved model for a given module. *

- * Note that while it's fully resolved at the module level, it might not be fully resolved in case a config group, an interface - * or a superclass is in another module. + * This model doesn't contain the Javadoc: the Javadoc is generated per module and can't be part of the model + * as when referencing a ConfigGroup that is outside of the boundaries of the module, the Javadoc is not available. *

- * When assembling all the models at a more global level (for instance when generating the doc or in the IDE), - * an additional resolution step might be needed if the model is not fully resolved. + * The model is fully resolved though as all the config annotations have a runtime retention so, even if the source + * is not available in the module, we can resolve all the annotations and the model. + *

+ * It is the responsibility of the model consumer to assemble the config roots (if needed) and to get the Javadoc from the files + * containing it. */ public class ResolvedModel { /** - * Key is the prefix of the config root (all config roots with the same prefix are merged). + * List of config roots: note that at this point they are not merged: you have one object per {@code @ConfigRoot} + * annotation. */ - private Map configRoots; - - /** - * In some cases, we have a shared config mapping in a separate shared module. - *

- * These mappings are not resolved to config roots but might be useful when fully resolving the unresolved interfaces and - * superclasses of a config root. - * This is only useful for corner cases, for instance in the observability dev services. - *

- * Key is the prefix of the mapping. - */ - // TODO implement unresolved config mappings - //private Map unresolvedConfigMappings; - - /** - * Key is the qualified name of the class of the config group. - */ - private Map configGroups; + private List configRoots; @JsonCreator - public ResolvedModel(Map configRoots, Map configGroups) { - this.configRoots = configRoots == null ? Map.of() : Collections.unmodifiableMap(configRoots); - this.configGroups = configGroups == null ? Map.of() : Collections.unmodifiableMap(configGroups); + public ResolvedModel(List configRoots) { + this.configRoots = configRoots == null ? List.of() : Collections.unmodifiableList(configRoots); } - public Map getConfigRoots() { + public List getConfigRoots() { return configRoots; } - - public Map getConfigGroups() { - return configGroups; - } } diff --git a/core/processor/src/main/java/io/quarkus/annotation/processor/documentation/config/resolver/ConfigResolver.java b/core/processor/src/main/java/io/quarkus/annotation/processor/documentation/config/resolver/ConfigResolver.java index 67ddb9ef78b84..84b2693099bb1 100644 --- a/core/processor/src/main/java/io/quarkus/annotation/processor/documentation/config/resolver/ConfigResolver.java +++ b/core/processor/src/main/java/io/quarkus/annotation/processor/documentation/config/resolver/ConfigResolver.java @@ -19,7 +19,6 @@ import io.quarkus.annotation.processor.documentation.config.discovery.DiscoveryRootElement; import io.quarkus.annotation.processor.documentation.config.discovery.EnumDefinition; import io.quarkus.annotation.processor.documentation.config.discovery.ResolvedType; -import io.quarkus.annotation.processor.documentation.config.model.ConfigGroup; import io.quarkus.annotation.processor.documentation.config.model.ConfigItemCollection; import io.quarkus.annotation.processor.documentation.config.model.ConfigPhase; import io.quarkus.annotation.processor.documentation.config.model.ConfigProperty; @@ -65,11 +64,11 @@ public JavadocElements resolveJavadoc() { } public ResolvedModel resolveModel() { - Map configRoots = new HashMap<>(); + List configRoots = new ArrayList<>(); for (DiscoveryConfigRoot discoveryConfigRoot : configCollector.getConfigRoots()) { - ConfigRoot configRoot = configRoots.computeIfAbsent(discoveryConfigRoot.getPrefix(), - k -> new ConfigRoot(discoveryConfigRoot.getExtension(), discoveryConfigRoot.getPrefix())); + ConfigRoot configRoot = new ConfigRoot(discoveryConfigRoot.getExtension(), discoveryConfigRoot.getPrefix()); + Map existingRootConfigSections = new HashMap<>(); configRoot.setOverriddenDocFileName(discoveryConfigRoot.getOverriddenDocFileName()); configRoot.addQualifiedName(discoveryConfigRoot.getQualifiedName()); @@ -77,21 +76,18 @@ public ResolvedModel resolveModel() { ResolutionContext context = new ResolutionContext(configRoot.getPrefix(), new ArrayList<>(), discoveryConfigRoot, configRoot, false, false, false); for (DiscoveryConfigProperty discoveryConfigProperty : discoveryConfigRoot.getProperties().values()) { - resolveProperty(configRoot, discoveryConfigRoot.getPhase(), context, discoveryConfigProperty); + resolveProperty(configRoot, existingRootConfigSections, discoveryConfigRoot.getPhase(), context, + discoveryConfigProperty); } - configRoots.put(configRoot.getPrefix(), configRoot); + configRoots.add(configRoot); } - Map configGroups = new HashMap<>(); - - // TODO GSM: config groups - - return new ResolvedModel(configRoots, configGroups); + return new ResolvedModel(configRoots); } - private void resolveProperty(ConfigRoot configRoot, ConfigPhase phase, ResolutionContext context, - DiscoveryConfigProperty discoveryConfigProperty) { + private void resolveProperty(ConfigRoot configRoot, Map existingRootConfigSections, + ConfigPhase phase, ResolutionContext context, DiscoveryConfigProperty discoveryConfigProperty) { String fullPath = appendPath(context.getPath(), discoveryConfigProperty.getPath()); List additionalPaths = context.getAdditionalPaths().stream() .map(p -> appendPath(p, discoveryConfigProperty.getPath())) @@ -130,10 +126,18 @@ private void resolveProperty(ConfigRoot configRoot, ConfigPhase phase, Resolutio boolean isSectionGenerated = discoveryConfigProperty.isSectionGenerated() && (!isWithinMap || isWithMapWithUnnamedKey); - ConfigSection configSection = new ConfigSection(discoveryConfigProperty.getSourceClass(), - discoveryConfigProperty.getSourceName(), fullPath, typeQualifiedName, - isSectionGenerated, deprecated); - context.getItemCollection().addItem(configSection); + ConfigSection configSection = existingRootConfigSections.get(fullPath); + + if (configSection != null) { + configSection.appendState(isSectionGenerated, deprecated); + } else { + configSection = new ConfigSection(discoveryConfigProperty.getSourceClass(), + discoveryConfigProperty.getSourceName(), fullPath, typeQualifiedName, + isSectionGenerated, deprecated); + context.getItemCollection().addItem(configSection); + existingRootConfigSections.put(configSection.getPath(), configSection); + } + configGroupContext = new ResolutionContext(fullPath, additionalPaths, discoveryConfigGroup, configSection, isWithinMap, isWithMapWithUnnamedKey, deprecated); } else { @@ -142,7 +146,7 @@ private void resolveProperty(ConfigRoot configRoot, ConfigPhase phase, Resolutio } for (DiscoveryConfigProperty configGroupProperty : discoveryConfigGroup.getProperties().values()) { - resolveProperty(configRoot, phase, configGroupContext, configGroupProperty); + resolveProperty(configRoot, existingRootConfigSections, phase, configGroupContext, configGroupProperty); } } else { String typeBinaryName = discoveryConfigProperty.getType().binaryName(); diff --git a/devtools/config-doc-maven-plugin/src/main/java/io/quarkus/maven/config/doc/GenerateAsciidocMojo.java b/devtools/config-doc-maven-plugin/src/main/java/io/quarkus/maven/config/doc/GenerateAsciidocMojo.java index 339471bed98a9..d84b7d03b6393 100644 --- a/devtools/config-doc-maven-plugin/src/main/java/io/quarkus/maven/config/doc/GenerateAsciidocMojo.java +++ b/devtools/config-doc-maven-plugin/src/main/java/io/quarkus/maven/config/doc/GenerateAsciidocMojo.java @@ -205,7 +205,7 @@ private static MergedModel mergeModel(List targetDirectories) throws MojoE continue; } - for (ConfigRoot configRoot : resolvedModel.getConfigRoots().values()) { + for (ConfigRoot configRoot : resolvedModel.getConfigRoots()) { String topLevelPrefix = getTopLevelPrefix(configRoot.getPrefix()); Map extensionConfigRoots = configRoots.computeIfAbsent(configRoot.getExtension(), @@ -310,12 +310,23 @@ private static Engine initializeQuteEngine(AsciidocFormatter asciidocFormatter) .resolveSync(ctx -> asciidocFormatter.toAnchor((String) ctx.getBase())) .build()) .addValueResolver(ValueResolver.builder() - .applyToBaseClass(AbstractConfigItem.class) + .applyToBaseClass(ConfigProperty.class) + .applyToName("toAnchor") + .applyToParameters(1) + .resolveAsync(ctx -> ctx.evaluate(ctx.getParams().get(0)) + .thenApply(o -> asciidocFormatter.toAnchor( + ((Extension) o).artifactId() + "_" + ((ConfigProperty) ctx.getBase()).getPath()))) + .build()) + // we need a different anchor for sections as otherwise we can have a conflict + // (typically when you have an `enabled` property with parent name just under the section level) + .addValueResolver(ValueResolver.builder() + .applyToBaseClass(ConfigSection.class) .applyToName("toAnchor") .applyToParameters(1) .resolveAsync(ctx -> ctx.evaluate(ctx.getParams().get(0)) .thenApply(o -> asciidocFormatter.toAnchor( - ((Extension) o).artifactId() + "_" + ((AbstractConfigItem) ctx.getBase()).getPath()))) + ((Extension) o).artifactId() + "_section_" + + ((ConfigSection) ctx.getBase()).getPath()))) .build()) .addValueResolver(ValueResolver.builder() .applyToBaseClass(ConfigProperty.class) From f15a1bdec3fd3a518c85a637be4a5d3fff238728 Mon Sep 17 00:00:00 2001 From: Guillaume Smet Date: Mon, 5 Aug 2024 17:37:36 +0200 Subject: [PATCH 30/43] Also generate section files for Maps This is useful in the case of gRPC XDS client config. --- .../config/resolver/ConfigResolver.java | 8 ++------ .../maven/config/doc/GenerateAsciidocMojo.java | 12 +++++++++++- 2 files changed, 13 insertions(+), 7 deletions(-) diff --git a/core/processor/src/main/java/io/quarkus/annotation/processor/documentation/config/resolver/ConfigResolver.java b/core/processor/src/main/java/io/quarkus/annotation/processor/documentation/config/resolver/ConfigResolver.java index 84b2693099bb1..bddeaaacf1259 100644 --- a/core/processor/src/main/java/io/quarkus/annotation/processor/documentation/config/resolver/ConfigResolver.java +++ b/core/processor/src/main/java/io/quarkus/annotation/processor/documentation/config/resolver/ConfigResolver.java @@ -122,18 +122,14 @@ private void resolveProperty(ConfigRoot configRoot, Map e boolean isWithMapWithUnnamedKey = context.isWithinMapWithUnnamedKey() || discoveryConfigProperty.isUnnamedMapKey(); if (discoveryConfigProperty.isSection()) { - // we don't generate a section file for sections inside a map - boolean isSectionGenerated = discoveryConfigProperty.isSectionGenerated() && - (!isWithinMap || isWithMapWithUnnamedKey); - ConfigSection configSection = existingRootConfigSections.get(fullPath); if (configSection != null) { - configSection.appendState(isSectionGenerated, deprecated); + configSection.appendState(discoveryConfigProperty.isSectionGenerated(), deprecated); } else { configSection = new ConfigSection(discoveryConfigProperty.getSourceClass(), discoveryConfigProperty.getSourceName(), fullPath, typeQualifiedName, - isSectionGenerated, deprecated); + discoveryConfigProperty.isSectionGenerated(), deprecated); context.getItemCollection().addItem(configSection); existingRootConfigSections.put(configSection.getPath(), configSection); } diff --git a/devtools/config-doc-maven-plugin/src/main/java/io/quarkus/maven/config/doc/GenerateAsciidocMojo.java b/devtools/config-doc-maven-plugin/src/main/java/io/quarkus/maven/config/doc/GenerateAsciidocMojo.java index d84b7d03b6393..4de24ab3d277d 100644 --- a/devtools/config-doc-maven-plugin/src/main/java/io/quarkus/maven/config/doc/GenerateAsciidocMojo.java +++ b/devtools/config-doc-maven-plugin/src/main/java/io/quarkus/maven/config/doc/GenerateAsciidocMojo.java @@ -126,7 +126,7 @@ public void execute() throws MojoExecutionException, MojoFailureException { for (ConfigSection generatedConfigSection : extensionConfigSectionsEntry.getValue()) { Path configSectionAdocPath = resolvedTargetDirectory.resolve(String.format(CONFIG_ROOT_FILE_FORMAT, - extension.artifactId(), generatedConfigSection.getPath())); + extension.artifactId(), cleanSectionPath(generatedConfigSection.getPath()))); String summaryTableId = asciidocFormatter .toAnchor(extension.artifactId() + "_" + generatedConfigSection.getPath()); @@ -382,4 +382,14 @@ private static String getTemplate(String template) { } } } + + /** + * A section path can contain quotes when being inside a Map. + *

+ * While not very common, we sometimes have to generate a section inside a Map + * e.g. for the XDS config of the gRPC client. + */ + private static String cleanSectionPath(String sectionPath) { + return sectionPath.replace('"', '-'); + } } From b5b8cc9ab512c4114955ebfe1e18a2b0121da853 Mon Sep 17 00:00:00 2001 From: Guillaume Smet Date: Mon, 5 Aug 2024 18:45:12 +0200 Subject: [PATCH 31/43] Allow saving a ConfigRoot in a specific file This was introduced for Quarkus CXF but it's now also useful for the very weird core config ConfigRoot. --- .../config/model/ConfigRoot.java | 4 ++ .../java/io/quarkus/runtime/ConfigConfig.java | 2 + .../config/doc/GenerateAsciidocMojo.java | 58 +++++++++++++++++-- .../quarkus/maven/config/doc/MergedModel.java | 8 +++ docs/src/main/asciidoc/config-reference.adoc | 2 +- 5 files changed, 68 insertions(+), 6 deletions(-) diff --git a/core/processor/src/main/java/io/quarkus/annotation/processor/documentation/config/model/ConfigRoot.java b/core/processor/src/main/java/io/quarkus/annotation/processor/documentation/config/model/ConfigRoot.java index 9cd8bde915046..583e081199d3e 100644 --- a/core/processor/src/main/java/io/quarkus/annotation/processor/documentation/config/model/ConfigRoot.java +++ b/core/processor/src/main/java/io/quarkus/annotation/processor/documentation/config/model/ConfigRoot.java @@ -35,6 +35,10 @@ public String getPrefix() { return prefix; } + public String getOverriddenDocFileName() { + return overriddenDocFileName; + } + public void setOverriddenDocFileName(String overriddenDocFileName) { if (this.overriddenDocFileName != null) { return; diff --git a/core/runtime/src/main/java/io/quarkus/runtime/ConfigConfig.java b/core/runtime/src/main/java/io/quarkus/runtime/ConfigConfig.java index 3289d992a7280..075f0b6dc70fe 100644 --- a/core/runtime/src/main/java/io/quarkus/runtime/ConfigConfig.java +++ b/core/runtime/src/main/java/io/quarkus/runtime/ConfigConfig.java @@ -4,6 +4,7 @@ import java.util.List; import java.util.Optional; +import io.quarkus.runtime.annotations.ConfigDocFilename; import io.quarkus.runtime.annotations.ConfigPhase; import io.quarkus.runtime.annotations.ConfigRoot; import io.smallrye.config.ConfigMapping; @@ -18,6 +19,7 @@ */ @ConfigMapping(prefix = "quarkus") @ConfigRoot(phase = ConfigPhase.RUN_TIME) +@ConfigDocFilename("quarkus-core_quarkus-config.adoc") public interface ConfigConfig { /** * A comma separated list of profiles that will be active when Quarkus launches. diff --git a/devtools/config-doc-maven-plugin/src/main/java/io/quarkus/maven/config/doc/GenerateAsciidocMojo.java b/devtools/config-doc-maven-plugin/src/main/java/io/quarkus/maven/config/doc/GenerateAsciidocMojo.java index 4de24ab3d277d..cd4ab4b0fe64c 100644 --- a/devtools/config-doc-maven-plugin/src/main/java/io/quarkus/maven/config/doc/GenerateAsciidocMojo.java +++ b/devtools/config-doc-maven-plugin/src/main/java/io/quarkus/maven/config/doc/GenerateAsciidocMojo.java @@ -53,8 +53,9 @@ public class GenerateAsciidocMojo extends AbstractMojo { .registerModule(new ParameterNamesModule()); private static final String TARGET = "target"; - private static final String CONFIG_ROOT_FILE_FORMAT = "%s_%s.adoc"; - private static final String EXTENSION_FILE_FORMAT = "%s.adoc"; + private static final String ADOC_SUFFIX = ".adoc"; + private static final String CONFIG_ROOT_FILE_FORMAT = "%s_%s" + ADOC_SUFFIX; + private static final String EXTENSION_FILE_FORMAT = "%s" + ADOC_SUFFIX; @Parameter(defaultValue = "${session}", readonly = true) private MavenSession mavenSession; @@ -101,7 +102,7 @@ public void execute() throws MojoExecutionException, MojoFailureException { generateConfigReference(quteEngine, summaryTableId, extension, configRoot)); } catch (Exception e) { throw new MojoExecutionException("Unable to render config roots for top level prefix: " + topLevelPrefix - + " in extension: " + extension.toString(), e); + + " in extension: " + extension, e); } } @@ -119,6 +120,28 @@ public void execute() throws MojoExecutionException, MojoFailureException { } } + // we generate the config roots that are saved in a specific file + for (Entry specificFileConfigRootEntry : mergedModel.getConfigRootsInSpecificFile().entrySet()) { + String fileName = specificFileConfigRootEntry.getKey(); + ConfigRoot configRoot = specificFileConfigRootEntry.getValue(); + Extension extension = configRoot.getExtension(); + + if (!fileName.endsWith(".adoc")) { + fileName += ".adoc"; + } + + Path configRootAdocPath = resolvedTargetDirectory.resolve(fileName); + String summaryTableId = asciidocFormatter.toAnchor(stripAdocSuffix(fileName)); + + try { + Files.writeString(configRootAdocPath, + generateConfigReference(quteEngine, summaryTableId, extension, configRoot)); + } catch (Exception e) { + throw new MojoExecutionException("Unable to render config roots for specific file: " + fileName + + " in extension: " + extension, e); + } + } + // we generate files for generated sections for (Entry> extensionConfigSectionsEntry : mergedModel.getGeneratedConfigSections() .entrySet()) { @@ -136,7 +159,7 @@ public void execute() throws MojoExecutionException, MojoFailureException { } catch (Exception e) { throw new MojoExecutionException( "Unable to render config section for section: " + generatedConfigSection.getPath() - + " in extension: " + extension.toString(), + + " in extension: " + extension, e); } } @@ -190,6 +213,7 @@ private static JavadocRepository findJavadocElements(List targetDirectorie private static MergedModel mergeModel(List targetDirectories) throws MojoExecutionException { Map> configRoots = new HashMap<>(); + Map configRootsInSpecificFile = new HashMap<>(); Map> generatedConfigSections = new HashMap<>(); for (Path targetDirectory : targetDirectories) { @@ -206,6 +230,26 @@ private static MergedModel mergeModel(List targetDirectories) throws MojoE } for (ConfigRoot configRoot : resolvedModel.getConfigRoots()) { + if (configRoot.getOverriddenDocFileName() != null) { + ConfigRoot existingConfigRootInSpecificFile = configRootsInSpecificFile + .get(configRoot.getOverriddenDocFileName()); + + if (existingConfigRootInSpecificFile == null) { + configRootsInSpecificFile.put(configRoot.getOverriddenDocFileName(), configRoot); + } else { + if (!existingConfigRootInSpecificFile.getExtension().equals(configRoot.getExtension()) + || !existingConfigRootInSpecificFile.getPrefix().equals(configRoot.getPrefix())) { + throw new MojoExecutionException( + "Two config roots with different extensions or prefixes cannot be merged in the same specific config file: " + + configRoot.getOverriddenDocFileName()); + } + + existingConfigRootInSpecificFile.merge(configRoot); + } + + continue; + } + String topLevelPrefix = getTopLevelPrefix(configRoot.getPrefix()); Map extensionConfigRoots = configRoots.computeIfAbsent(configRoot.getExtension(), @@ -233,7 +277,7 @@ private static MergedModel mergeModel(List targetDirectories) throws MojoE } } - return new MergedModel(configRoots, generatedConfigSections); + return new MergedModel(configRoots, configRootsInSpecificFile, generatedConfigSections); } private static void collectGeneratedConfigSections(List extensionGeneratedConfigSections, @@ -392,4 +436,8 @@ private static String getTemplate(String template) { private static String cleanSectionPath(String sectionPath) { return sectionPath.replace('"', '-'); } + + private String stripAdocSuffix(String fileName) { + return fileName.substring(0, fileName.length() - ADOC_SUFFIX.length()); + } } diff --git a/devtools/config-doc-maven-plugin/src/main/java/io/quarkus/maven/config/doc/MergedModel.java b/devtools/config-doc-maven-plugin/src/main/java/io/quarkus/maven/config/doc/MergedModel.java index eb5c6644da6ea..2c7f8a9feccbe 100644 --- a/devtools/config-doc-maven-plugin/src/main/java/io/quarkus/maven/config/doc/MergedModel.java +++ b/devtools/config-doc-maven-plugin/src/main/java/io/quarkus/maven/config/doc/MergedModel.java @@ -11,11 +11,15 @@ public class MergedModel { private final Map> configRoots; + private final Map configRootsInSpecificFile; + private final Map> generatedConfigSections; public MergedModel(Map> configRoots, + Map configRootsInSpecificFile, Map> configSections) { this.configRoots = configRoots; + this.configRootsInSpecificFile = configRootsInSpecificFile; this.generatedConfigSections = configSections; } @@ -23,6 +27,10 @@ public Map> getConfigRoots() { return configRoots; } + public Map getConfigRootsInSpecificFile() { + return configRootsInSpecificFile; + } + public Map> getGeneratedConfigSections() { return generatedConfigSections; } diff --git a/docs/src/main/asciidoc/config-reference.adoc b/docs/src/main/asciidoc/config-reference.adoc index a4aabf159b832..18869398d72ca 100644 --- a/docs/src/main/asciidoc/config-reference.adoc +++ b/docs/src/main/asciidoc/config-reference.adoc @@ -847,4 +847,4 @@ link:https://smallrye.io/smallrye-config/Main[SmallRye Config documentation]. == Configuration Reference -include::{generated-config-doc-dir}/quarkus-config-config.adoc[opts=optional, leveloffset=+1] +include::{generated-config-doc-dir}/quarkus-core_quarkus-config.adoc[opts=optional, leveloffset=+1] From 9008ab75167c0af185447cc597abf5b13c87e5fe Mon Sep 17 00:00:00 2001 From: Guillaume Smet Date: Tue, 6 Aug 2024 09:18:06 +0200 Subject: [PATCH 32/43] Also resolve the name from the extension metadata And make sure we keep the best name when merging the config roots. This will be useful for the file centralizing all the config doc. Finally, make sure we have a consistent ordering. --- .../ExtensionAnnotationProcessor.java | 118 +------------ .../documentation/config/model/Extension.java | 39 ++++- .../processor/util/ExtensionUtil.java | 162 ++++++++++++++++++ .../annotation/processor/util/FilerUtil.java | 36 ++++ .../annotation/processor/util/Utils.java | 6 + .../config/doc/GenerateAsciidocMojo.java | 35 +++- .../quarkus/maven/config/doc/MergedModel.java | 7 +- 7 files changed, 282 insertions(+), 121 deletions(-) create mode 100644 core/processor/src/main/java/io/quarkus/annotation/processor/util/ExtensionUtil.java diff --git a/core/processor/src/main/java/io/quarkus/annotation/processor/ExtensionAnnotationProcessor.java b/core/processor/src/main/java/io/quarkus/annotation/processor/ExtensionAnnotationProcessor.java index 3f290494cb1b4..06a8df7615b88 100644 --- a/core/processor/src/main/java/io/quarkus/annotation/processor/ExtensionAnnotationProcessor.java +++ b/core/processor/src/main/java/io/quarkus/annotation/processor/ExtensionAnnotationProcessor.java @@ -1,8 +1,5 @@ package io.quarkus.annotation.processor; -import java.io.IOException; -import java.nio.file.Path; -import java.nio.file.Paths; import java.util.ArrayList; import java.util.Collections; import java.util.List; @@ -19,15 +16,8 @@ import javax.lang.model.element.ExecutableElement; import javax.lang.model.element.TypeElement; import javax.tools.Diagnostic; -import javax.tools.StandardLocation; -import javax.xml.XMLConstants; -import javax.xml.parsers.DocumentBuilder; -import javax.xml.parsers.DocumentBuilderFactory; import org.jboss.jdeparser.JDeparser; -import org.w3c.dom.Document; -import org.w3c.dom.Node; -import org.w3c.dom.NodeList; import io.quarkus.annotation.processor.documentation.config.ConfigDocExtensionProcessor; import io.quarkus.annotation.processor.documentation.config.model.Extension; @@ -41,12 +31,8 @@ public class ExtensionAnnotationProcessor extends AbstractProcessor { private static final String DEBUG = "debug-extension-annotation-processor"; - private static final String ARTIFACT_DEPLOYMENT_SUFFIX = "-deployment"; - private static final String ARTIFACT_COMMON_SUFFIX = "-common"; - private static final String ARTIFACT_INTERNAL_SUFFIX = "-internal"; - private static final String NAME_RUNTIME_SUFFIX = " - Runtime"; - private static final String NAME_DEPLOYMENT_SUFFIX = " - Deployment"; + private Utils utils; private List extensionProcessors; @Override @@ -70,13 +56,13 @@ public synchronized void init(ProcessingEnvironment processingEnv) { this.extensionProcessors = Collections.unmodifiableList(extensionProcessors); - Utils utils = new Utils(processingEnv); + utils = new Utils(processingEnv); boolean useConfigMapping = !Boolean .parseBoolean(utils.processingEnv().getOptions().getOrDefault(Options.LEGACY_CONFIG_ROOT, "false")); boolean debug = Boolean.getBoolean(DEBUG); - Extension extension = getExtension(processingEnv); + Extension extension = utils.extension().getExtension(); Config config = new Config(extension, useConfigMapping, debug); if (!useConfigMapping) { @@ -122,102 +108,4 @@ public boolean process(Set annotations, RoundEnvironment JDeparser.dropCaches(); } } - - /** - * This is not exactly pretty but it's actually not easy to get the artifact id of the current artifact. - * One option would be to pass it through the annotation processor but it's not exactly ideal. - */ - private Extension getExtension(ProcessingEnvironment processingEnv) { - Path pom; - - try { - pom = Paths.get(processingEnv.getFiler().getResource(StandardLocation.CLASS_OUTPUT, "", "dummy").toUri()) - .getParent().getParent().getParent().resolve("pom.xml").toAbsolutePath(); - } catch (IOException e) { - throw new IllegalStateException("Unable to determine path to pom.xml"); - } - - Document doc; - - try { - DocumentBuilderFactory dbf = DocumentBuilderFactory.newInstance(); - dbf.setFeature(XMLConstants.FEATURE_SECURE_PROCESSING, true); - DocumentBuilder db = dbf.newDocumentBuilder(); - doc = db.parse(pom.toFile()); - doc.getDocumentElement().normalize(); - } catch (Exception e) { - throw new IllegalStateException("Unable parse pom file: " + pom, e); - } - - return getExtensionFromPom(pom, doc); - } - - private Extension getExtensionFromPom(Path pom, Document doc) { - String parentGroupId = null; - String artifactId = null; - String groupId = null; - String name = null; - - NodeList children = doc.getDocumentElement().getChildNodes(); - for (int i = 0; i < children.getLength(); i++) { - if (groupId != null && artifactId != null && name != null) { - break; - } - - Node child = children.item(i); - - if ("parent".equals(child.getNodeName())) { - NodeList parentChildren = child.getChildNodes(); - for (int j = 0; j < parentChildren.getLength(); j++) { - Node parentChild = parentChildren.item(j); - if ("groupId".equals(parentChild.getNodeName())) { - parentGroupId = parentChild.getTextContent() != null ? parentChild.getTextContent().trim() : null; - ; - break; - } - } - continue; - } - if ("groupId".equals(child.getNodeName())) { - groupId = child.getTextContent() != null ? child.getTextContent().trim() : null; - continue; - } - if ("artifactId".equals(child.getNodeName())) { - artifactId = child.getTextContent() != null ? child.getTextContent().trim() : null; - continue; - } - if ("name".equals(child.getNodeName())) { - name = child.getTextContent() != null ? child.getTextContent().trim() : null; - continue; - } - } - - if (groupId == null) { - groupId = parentGroupId; - } - - if (groupId == null || groupId.isBlank() || artifactId == null || artifactId.isBlank()) { - throw new IllegalStateException("Unable to determine artifact coordinates from: " + pom); - } - - if (artifactId.endsWith(ARTIFACT_DEPLOYMENT_SUFFIX)) { - artifactId = artifactId.substring(0, artifactId.length() - ARTIFACT_DEPLOYMENT_SUFFIX.length()); - } - if (artifactId.endsWith(ARTIFACT_COMMON_SUFFIX)) { - artifactId = artifactId.substring(0, artifactId.length() - ARTIFACT_COMMON_SUFFIX.length()); - } - if (artifactId.endsWith(ARTIFACT_INTERNAL_SUFFIX)) { - artifactId = artifactId.substring(0, artifactId.length() - ARTIFACT_INTERNAL_SUFFIX.length()); - } - - if (name != null) { - if (name.endsWith(NAME_DEPLOYMENT_SUFFIX)) { - name = name.substring(0, name.length() - NAME_DEPLOYMENT_SUFFIX.length()); - } else if (name.endsWith(NAME_RUNTIME_SUFFIX)) { - name = name.substring(0, name.length() - NAME_RUNTIME_SUFFIX.length()); - } - } - - return new Extension(groupId, artifactId, name); - } } diff --git a/core/processor/src/main/java/io/quarkus/annotation/processor/documentation/config/model/Extension.java b/core/processor/src/main/java/io/quarkus/annotation/processor/documentation/config/model/Extension.java index 4010d79390bc6..2a13590b6d686 100644 --- a/core/processor/src/main/java/io/quarkus/annotation/processor/documentation/config/model/Extension.java +++ b/core/processor/src/main/java/io/quarkus/annotation/processor/documentation/config/model/Extension.java @@ -4,7 +4,8 @@ import com.fasterxml.jackson.annotation.JsonIgnore; -public record Extension(String groupId, String artifactId, String name) { +public record Extension(String groupId, String artifactId, String name, + NameSource nameSource) implements Comparable { @Override public final String toString() { @@ -37,4 +38,40 @@ public boolean equals(Object obj) { public boolean isMixedModule() { return "io.quarkus".equals(groupId) && ("quarkus-core".equals(artifactId) || "quarkus-messaging".equals(artifactId)); } + + @Override + public int compareTo(Extension other) { + if (name != null && other.name != null) { + int nameComparison = name.compareToIgnoreCase(other.name); + if (nameComparison != 0) { + return nameComparison; + } + } + + int groupIdComparison = groupId.compareToIgnoreCase(other.groupId); + if (groupIdComparison != 0) { + return groupIdComparison; + } + + return artifactId.compareToIgnoreCase(other.artifactId); + } + + public static enum NameSource { + + EXTENSION_METADATA(100), + EXTENSION_METADATA_COMMON_INTERNAL(90), + POM_XML(50), + POM_XML_COMMON_INTERNAL(40), + NONE(-1); + + private final int priority; + + NameSource(int priority) { + this.priority = priority; + } + + public boolean isBetterThan(NameSource other) { + return this.priority > other.priority; + } + } } diff --git a/core/processor/src/main/java/io/quarkus/annotation/processor/util/ExtensionUtil.java b/core/processor/src/main/java/io/quarkus/annotation/processor/util/ExtensionUtil.java new file mode 100644 index 0000000000000..7d834e1551186 --- /dev/null +++ b/core/processor/src/main/java/io/quarkus/annotation/processor/util/ExtensionUtil.java @@ -0,0 +1,162 @@ +package io.quarkus.annotation.processor.util; + +import java.nio.file.Path; +import java.util.Map; +import java.util.Optional; + +import javax.xml.XMLConstants; +import javax.xml.parsers.DocumentBuilder; +import javax.xml.parsers.DocumentBuilderFactory; + +import org.w3c.dom.Document; +import org.w3c.dom.Node; +import org.w3c.dom.NodeList; + +import io.quarkus.annotation.processor.documentation.config.model.Extension; +import io.quarkus.annotation.processor.documentation.config.model.Extension.NameSource; + +public final class ExtensionUtil { + + private static final String ARTIFACT_DEPLOYMENT_SUFFIX = "-deployment"; + private static final String ARTIFACT_COMMON_SUFFIX = "-common"; + private static final String ARTIFACT_INTERNAL_SUFFIX = "-internal"; + private static final String NAME_QUARKUS_PREFIX = "Quarkus - "; + private static final String NAME_RUNTIME_SUFFIX = " - Runtime"; + private static final String NAME_DEPLOYMENT_SUFFIX = " - Deployment"; + private static final String NAME_COMMON_SUFFIX = " - Common"; + private static final String NAME_INTERNAL_SUFFIX = " - Internal"; + + private final FilerUtil filerUtil; + + ExtensionUtil(FilerUtil filerUtil) { + this.filerUtil = filerUtil; + } + + /** + * This is not exactly pretty but it's actually not easy to get the artifact id of the current artifact. + * One option would be to pass it through the annotation processor but it's not exactly ideal. + */ + public Extension getExtension() { + Path pom = filerUtil.getPomPath(); + + Document doc; + + try { + DocumentBuilderFactory dbf = DocumentBuilderFactory.newInstance(); + dbf.setFeature(XMLConstants.FEATURE_SECURE_PROCESSING, true); + DocumentBuilder db = dbf.newDocumentBuilder(); + doc = db.parse(pom.toFile()); + doc.getDocumentElement().normalize(); + } catch (Exception e) { + throw new IllegalStateException("Unable to parse pom file: " + pom, e); + } + + return getExtensionFromPom(pom, doc); + } + + private Extension getExtensionFromPom(Path pom, Document doc) { + String parentGroupId = null; + String artifactId = null; + String groupId = null; + String name = null; + + NodeList children = doc.getDocumentElement().getChildNodes(); + for (int i = 0; i < children.getLength(); i++) { + if (groupId != null && artifactId != null && name != null) { + break; + } + + Node child = children.item(i); + + if ("parent".equals(child.getNodeName())) { + NodeList parentChildren = child.getChildNodes(); + for (int j = 0; j < parentChildren.getLength(); j++) { + Node parentChild = parentChildren.item(j); + if ("groupId".equals(parentChild.getNodeName())) { + parentGroupId = parentChild.getTextContent() != null ? parentChild.getTextContent().trim() : null; + ; + break; + } + } + continue; + } + if ("groupId".equals(child.getNodeName())) { + groupId = child.getTextContent() != null ? child.getTextContent().trim() : null; + continue; + } + if ("artifactId".equals(child.getNodeName())) { + artifactId = child.getTextContent() != null ? child.getTextContent().trim() : null; + continue; + } + if ("name".equals(child.getNodeName())) { + name = child.getTextContent() != null ? child.getTextContent().trim() : null; + continue; + } + } + + if (groupId == null) { + groupId = parentGroupId; + } + + if (groupId == null || groupId.isBlank() || artifactId == null || artifactId.isBlank()) { + throw new IllegalStateException("Unable to determine artifact coordinates from: " + pom); + } + + boolean commonOrInternal = false; + + if (artifactId.endsWith(ARTIFACT_DEPLOYMENT_SUFFIX)) { + artifactId = artifactId.substring(0, artifactId.length() - ARTIFACT_DEPLOYMENT_SUFFIX.length()); + } + if (artifactId.endsWith(ARTIFACT_COMMON_SUFFIX)) { + artifactId = artifactId.substring(0, artifactId.length() - ARTIFACT_COMMON_SUFFIX.length()); + commonOrInternal = true; + } + if (artifactId.endsWith(ARTIFACT_INTERNAL_SUFFIX)) { + artifactId = artifactId.substring(0, artifactId.length() - ARTIFACT_INTERNAL_SUFFIX.length()); + commonOrInternal = true; + } + + NameSource nameSource; + Optional nameFromExtensionMetadata = getExtensionNameFromExtensionMetadata(); + if (nameFromExtensionMetadata.isPresent()) { + name = nameFromExtensionMetadata.get(); + nameSource = commonOrInternal ? NameSource.EXTENSION_METADATA_COMMON_INTERNAL : NameSource.EXTENSION_METADATA; + } else if (name != null) { + nameSource = commonOrInternal ? NameSource.POM_XML_COMMON_INTERNAL : NameSource.POM_XML; + } else { + nameSource = NameSource.NONE; + } + + if (name != null) { + if (name.startsWith(NAME_QUARKUS_PREFIX)) { + name = name.substring(NAME_QUARKUS_PREFIX.length()).trim(); + } + if (name.endsWith(NAME_DEPLOYMENT_SUFFIX)) { + name = name.substring(0, name.length() - NAME_DEPLOYMENT_SUFFIX.length()); + } else if (name.endsWith(NAME_RUNTIME_SUFFIX)) { + name = name.substring(0, name.length() - NAME_RUNTIME_SUFFIX.length()); + } else if (name.endsWith(NAME_COMMON_SUFFIX)) { + name = name.substring(0, name.length() - NAME_COMMON_SUFFIX.length()); + } else if (name.endsWith(NAME_INTERNAL_SUFFIX)) { + name = name.substring(0, name.length() - NAME_INTERNAL_SUFFIX.length()); + } + } + + return new Extension(groupId, artifactId, name, nameSource); + } + + private Optional getExtensionNameFromExtensionMetadata() { + Optional> extensionMetadata = filerUtil.getExtensionMetadata(); + + if (extensionMetadata.isEmpty()) { + return Optional.empty(); + } + + String extensionName = (String) extensionMetadata.get().get("name"); + if (extensionName == null || extensionName.isBlank()) { + return Optional.empty(); + } + + return Optional.of(extensionName.trim()); + } +} diff --git a/core/processor/src/main/java/io/quarkus/annotation/processor/util/FilerUtil.java b/core/processor/src/main/java/io/quarkus/annotation/processor/util/FilerUtil.java index fd2543ba4c0e9..176dded94bf89 100644 --- a/core/processor/src/main/java/io/quarkus/annotation/processor/util/FilerUtil.java +++ b/core/processor/src/main/java/io/quarkus/annotation/processor/util/FilerUtil.java @@ -2,6 +2,7 @@ import java.io.BufferedWriter; import java.io.IOException; +import java.io.InputStream; import java.io.OutputStream; import java.io.OutputStreamWriter; import java.io.UncheckedIOException; @@ -9,11 +10,14 @@ import java.nio.file.Files; import java.nio.file.Path; import java.nio.file.Paths; +import java.util.Map; +import java.util.Optional; import java.util.Properties; import java.util.Set; import javax.annotation.processing.ProcessingEnvironment; import javax.tools.Diagnostic; +import javax.tools.Diagnostic.Kind; import javax.tools.FileObject; import javax.tools.StandardLocation; @@ -128,4 +132,36 @@ public Path getTargetPath() { throw new UncheckedIOException(e); } } + + public Path getPomPath() { + try { + return Paths.get(processingEnv.getFiler().getResource(StandardLocation.CLASS_OUTPUT, "", "dummy").toUri()) + .getParent().getParent().getParent().resolve("pom.xml").toAbsolutePath(); + } catch (IOException e) { + throw new IllegalStateException("Unable to determine path to pom.xml"); + } + } + + public Optional> getExtensionMetadata() { + String extensionMetadataDescriptor = "META-INF/quarkus-extension.yaml"; + + try { + FileObject fileObject = processingEnv.getFiler().getResource(StandardLocation.CLASS_OUTPUT, "", + extensionMetadataDescriptor); + if (fileObject == null) { + return Optional.empty(); + } + + try (InputStream is = fileObject.openInputStream()) { + String yamlMetadata = new String(is.readAllBytes(), StandardCharsets.UTF_8); + Map extensionMetadata = YAML_OBJECT_MAPPER.readValue(yamlMetadata, Map.class); + + return Optional.of(extensionMetadata); + } + } catch (IOException e) { + processingEnv.getMessager().printMessage(Kind.WARNING, + "Unable to read extension metadata file: " + extensionMetadataDescriptor + " because of " + e.getMessage()); + return Optional.empty(); + } + } } diff --git a/core/processor/src/main/java/io/quarkus/annotation/processor/util/Utils.java b/core/processor/src/main/java/io/quarkus/annotation/processor/util/Utils.java index 5e65ec56a55b3..7888817d3f14b 100644 --- a/core/processor/src/main/java/io/quarkus/annotation/processor/util/Utils.java +++ b/core/processor/src/main/java/io/quarkus/annotation/processor/util/Utils.java @@ -8,12 +8,14 @@ public final class Utils { private final ElementUtil elementUtil; private final AccessorGenerator accessorGenerator; private final FilerUtil filerUtil; + private final ExtensionUtil extensionUtil; public Utils(ProcessingEnvironment processingEnv) { this.processingEnv = processingEnv; this.elementUtil = new ElementUtil(processingEnv); this.accessorGenerator = new AccessorGenerator(processingEnv, elementUtil); this.filerUtil = new FilerUtil(processingEnv); + this.extensionUtil = new ExtensionUtil(filerUtil); } public ElementUtil element() { @@ -31,4 +33,8 @@ public AccessorGenerator accessorGenerator() { public FilerUtil filer() { return filerUtil; } + + public ExtensionUtil extension() { + return extensionUtil; + } } diff --git a/devtools/config-doc-maven-plugin/src/main/java/io/quarkus/maven/config/doc/GenerateAsciidocMojo.java b/devtools/config-doc-maven-plugin/src/main/java/io/quarkus/maven/config/doc/GenerateAsciidocMojo.java index cd4ab4b0fe64c..1abd4c3b57bc3 100644 --- a/devtools/config-doc-maven-plugin/src/main/java/io/quarkus/maven/config/doc/GenerateAsciidocMojo.java +++ b/devtools/config-doc-maven-plugin/src/main/java/io/quarkus/maven/config/doc/GenerateAsciidocMojo.java @@ -12,11 +12,14 @@ import java.nio.file.StandardCopyOption; import java.nio.file.attribute.BasicFileAttributes; import java.util.ArrayList; +import java.util.Collections; import java.util.HashMap; import java.util.List; import java.util.Map; import java.util.Map.Entry; +import java.util.TreeMap; import java.util.regex.Pattern; +import java.util.stream.Collectors; import org.apache.maven.execution.MavenSession; import org.apache.maven.plugin.AbstractMojo; @@ -37,6 +40,7 @@ import io.quarkus.annotation.processor.documentation.config.model.ConfigRoot; import io.quarkus.annotation.processor.documentation.config.model.ConfigSection; import io.quarkus.annotation.processor.documentation.config.model.Extension; +import io.quarkus.annotation.processor.documentation.config.model.Extension.NameSource; import io.quarkus.annotation.processor.documentation.config.model.JavadocElements; import io.quarkus.annotation.processor.documentation.config.model.JavadocElements.JavadocElement; import io.quarkus.annotation.processor.documentation.config.model.ResolvedModel; @@ -212,9 +216,12 @@ private static JavadocRepository findJavadocElements(List targetDirectorie } private static MergedModel mergeModel(List targetDirectories) throws MojoExecutionException { + // keyed on extension and then top level prefix Map> configRoots = new HashMap<>(); - Map configRootsInSpecificFile = new HashMap<>(); - Map> generatedConfigSections = new HashMap<>(); + // keyed on file name + Map configRootsInSpecificFile = new TreeMap<>(); + // keyed on extension + Map> generatedConfigSections = new TreeMap<>(); for (Path targetDirectory : targetDirectories) { Path javadocPath = targetDirectory.resolve(Outputs.QUARKUS_CONFIG_DOC_MODEL); @@ -268,6 +275,8 @@ private static MergedModel mergeModel(List targetDirectories) throws MojoE } } + configRoots = retainBestExtensionKey(configRoots); + for (Entry> extensionConfigRootsEntry : configRoots.entrySet()) { List extensionGeneratedConfigSections = generatedConfigSections .computeIfAbsent(extensionConfigRootsEntry.getKey(), e -> new ArrayList<>()); @@ -280,6 +289,25 @@ private static MergedModel mergeModel(List targetDirectories) throws MojoE return new MergedModel(configRoots, configRootsInSpecificFile, generatedConfigSections); } + private static Map> retainBestExtensionKey( + Map> configRoots) { + return configRoots.entrySet().stream().collect(Collectors.toMap(e -> { + Extension extension = e.getKey(); + + for (ConfigRoot configRoot : e.getValue().values()) { + if (configRoot.getExtension().nameSource().isBetterThan(extension.nameSource())) { + extension = configRoot.getExtension(); + } + if (NameSource.EXTENSION_METADATA.equals(extension.nameSource())) { + // we won't find any better + break; + } + } + + return extension; + }, e -> e.getValue(), (k1, k2) -> k1, TreeMap::new)); + } + private static void collectGeneratedConfigSections(List extensionGeneratedConfigSections, ConfigItemCollection configItemCollection) { for (AbstractConfigItem configItem : configItemCollection.getItems()) { @@ -326,6 +354,9 @@ public FileVisitResult preVisitDirectory(Path dir, BasicFileAttributes attrs) th } }); + // Make sure we are deterministic + Collections.sort(targets); + return targets; } catch (IOException e) { throw new MojoExecutionException("Unable to collect the target directories", e); diff --git a/devtools/config-doc-maven-plugin/src/main/java/io/quarkus/maven/config/doc/MergedModel.java b/devtools/config-doc-maven-plugin/src/main/java/io/quarkus/maven/config/doc/MergedModel.java index 2c7f8a9feccbe..11d93d54d8331 100644 --- a/devtools/config-doc-maven-plugin/src/main/java/io/quarkus/maven/config/doc/MergedModel.java +++ b/devtools/config-doc-maven-plugin/src/main/java/io/quarkus/maven/config/doc/MergedModel.java @@ -1,5 +1,6 @@ package io.quarkus.maven.config.doc; +import java.util.Collections; import java.util.List; import java.util.Map; @@ -18,9 +19,9 @@ public class MergedModel { public MergedModel(Map> configRoots, Map configRootsInSpecificFile, Map> configSections) { - this.configRoots = configRoots; - this.configRootsInSpecificFile = configRootsInSpecificFile; - this.generatedConfigSections = configSections; + this.configRoots = Collections.unmodifiableMap(configRoots); + this.configRootsInSpecificFile = Collections.unmodifiableMap(configRootsInSpecificFile); + this.generatedConfigSections = Collections.unmodifiableMap(configSections); } public Map> getConfigRoots() { From bcc437d05d2baf31db32874ee38d55f746a6b986 Mon Sep 17 00:00:00 2001 From: Guillaume Smet Date: Tue, 6 Aug 2024 10:10:01 +0200 Subject: [PATCH 33/43] Disable annotation processors in docs module We have one in the classpath and we really don't want it to be executed so let's disable them. --- docs/pom.xml | 6 ++++++ 1 file changed, 6 insertions(+) diff --git a/docs/pom.xml b/docs/pom.xml index fa8b6a0ae2a3f..efdfd283e73c4 100644 --- a/docs/pom.xml +++ b/docs/pom.xml @@ -3184,6 +3184,12 @@ ${project.version} true + + maven-compiler-plugin + + none + + org.apache.maven.plugins maven-surefire-plugin From bdccab1b7e542c0679e77d46aaf8305bc4f317e5 Mon Sep 17 00:00:00 2001 From: Guillaume Smet Date: Tue, 6 Aug 2024 10:27:21 +0200 Subject: [PATCH 34/43] Reimplement all config generation Using the new model, it's a lot easier to implement. --- .../config/doc/GenerateAsciidocMojo.java | 36 ++- .../resources/templates/allConfig.qute.adoc | 35 +++ docs/pom.xml | 22 +- .../docs/generation/AllConfigGenerator.java | 231 ------------------ 4 files changed, 70 insertions(+), 254 deletions(-) create mode 100644 devtools/config-doc-maven-plugin/src/main/resources/templates/allConfig.qute.adoc delete mode 100644 docs/src/main/java/io/quarkus/docs/generation/AllConfigGenerator.java diff --git a/devtools/config-doc-maven-plugin/src/main/java/io/quarkus/maven/config/doc/GenerateAsciidocMojo.java b/devtools/config-doc-maven-plugin/src/main/java/io/quarkus/maven/config/doc/GenerateAsciidocMojo.java index 1abd4c3b57bc3..92a2f2715a491 100644 --- a/devtools/config-doc-maven-plugin/src/main/java/io/quarkus/maven/config/doc/GenerateAsciidocMojo.java +++ b/devtools/config-doc-maven-plugin/src/main/java/io/quarkus/maven/config/doc/GenerateAsciidocMojo.java @@ -58,18 +58,22 @@ public class GenerateAsciidocMojo extends AbstractMojo { private static final String TARGET = "target"; private static final String ADOC_SUFFIX = ".adoc"; - private static final String CONFIG_ROOT_FILE_FORMAT = "%s_%s" + ADOC_SUFFIX; - private static final String EXTENSION_FILE_FORMAT = "%s" + ADOC_SUFFIX; + private static final String CONFIG_ROOT_FILE_FORMAT = "%s_%s.adoc"; + private static final String EXTENSION_FILE_FORMAT = "%s.adoc"; + private static final String ALL_CONFIG_FILE_NAME = "quarkus-all-config.adoc"; @Parameter(defaultValue = "${session}", readonly = true) private MavenSession mavenSession; - @Parameter(readonly = true) + @Parameter private File scanDirectory; - @Parameter(defaultValue = "${project.build.directory}/quarkus-config-doc", readonly = true, required = true) + @Parameter(defaultValue = "${project.build.directory}/quarkus-config-doc", required = true) private File targetDirectory; + @Parameter(defaultValue = "false") + private boolean generateAllConfig; + @Override public void execute() throws MojoExecutionException, MojoFailureException { // I was unable to find an easy way to get the root directory of the project @@ -168,6 +172,17 @@ public void execute() throws MojoExecutionException, MojoFailureException { } } } + + if (generateAllConfig) { + // we generate the file centralizing all the config properties + try { + Path allConfigAdocPath = resolvedTargetDirectory.resolve(ALL_CONFIG_FILE_NAME); + + Files.writeString(allConfigAdocPath, generateAllConfig(quteEngine, mergedModel.getConfigRoots())); + } catch (Exception e) { + throw new MojoExecutionException("Unable to render all config", e); + } + } } private static String generateConfigReference(Engine quteEngine, String summaryTableId, Extension extension, @@ -182,6 +197,17 @@ private static String generateConfigReference(Engine quteEngine, String summaryT .render(); } + private static String generateAllConfig(Engine quteEngine, + Map> configRootsByExtensions) { + return quteEngine.getTemplate("allConfig.qute.adoc") + .data("configRootsByExtensions", configRootsByExtensions) + .data("searchable", true) + .data("summaryTableId", "all-config") + .data("includeDurationNote", true) + .data("includeMemorySizeNote", true) + .render(); + } + private static void initTargetDirectory(Path resolvedTargetDirectory) throws MojoExecutionException { try { Files.createDirectories(resolvedTargetDirectory); @@ -425,6 +451,8 @@ private static Engine initializeQuteEngine(AsciidocFormatter asciidocFormatter) engine.putTemplate("configReference.qute.adoc", engine.parse(getTemplate("templates/configReference.qute.adoc"))); + engine.putTemplate("allConfig.qute.adoc", + engine.parse(getTemplate("templates/allConfig.qute.adoc"))); engine.putTemplate("configProperty.qute.adoc", engine.parse(getTemplate("templates/tags/configProperty.qute.adoc"))); engine.putTemplate("configSection.qute.adoc", diff --git a/devtools/config-doc-maven-plugin/src/main/resources/templates/allConfig.qute.adoc b/devtools/config-doc-maven-plugin/src/main/resources/templates/allConfig.qute.adoc new file mode 100644 index 0000000000000..c4004ad655d26 --- /dev/null +++ b/devtools/config-doc-maven-plugin/src/main/resources/templates/allConfig.qute.adoc @@ -0,0 +1,35 @@ +:summaryTableId: {summaryTableId} +[.configuration-legend] +icon:lock[title=Fixed at build time] Configuration property fixed at build time - All other configuration properties are overridable at runtime +[.configuration-reference{#if searchable}.searchable{/if}, cols="80,.^10,.^10"] +|=== +{#for extensionConfigRootsEntry in configRootsByExtensions} + +h|{extensionConfigRootsEntry.key.name.or(extensionConfigRootsEntry.key.artifactId)} +h|Type +h|Default + +{#for configRoot in extensionConfigRootsEntry.value.values} +{#for item in configRoot.items} +{#if !item.deprecated} +{#if item.isSection} +{#configSection configSection=item extension=extensionConfigRootsEntry.key /} + +{#else} +{#configProperty configProperty=item extension=extensionConfigRootsEntry.key /} + +{/if} +{/if} +{/for} +{/for} +{/for} +|=== + +{#if includeDurationNote} +{#durationNote summaryTableId /} +{/if} +{#if includeMemorySizeNote} +{#memorySizeNote summaryTableId /} +{/if} + +:!summaryTableId: \ No newline at end of file diff --git a/docs/pom.xml b/docs/pom.xml index efdfd283e73c4..b26911a6886d6 100644 --- a/docs/pom.xml +++ b/docs/pom.xml @@ -3183,6 +3183,9 @@ quarkus-config-doc-maven-plugin ${project.version} true + + true + maven-compiler-plugin @@ -3208,25 +3211,6 @@ ${skipDocs} - - all-config-classes - process-classes - - java - - - ${skipDocs} - - false - io.quarkus.docs.generation.AllConfigGenerator - - ${project.basedir}/../devtools/bom-descriptor-json/target/quarkus-bom-quarkus-platform-descriptor-${project.version}-${project.version}.json - - - ${env.MAVEN_CMD_LINE_ARGS} - - - generate-quarkus-mvn-plugin-docs process-classes diff --git a/docs/src/main/java/io/quarkus/docs/generation/AllConfigGenerator.java b/docs/src/main/java/io/quarkus/docs/generation/AllConfigGenerator.java deleted file mode 100644 index 97d36a9390542..0000000000000 --- a/docs/src/main/java/io/quarkus/docs/generation/AllConfigGenerator.java +++ /dev/null @@ -1,231 +0,0 @@ -package io.quarkus.docs.generation; - -import java.io.BufferedReader; -import java.io.File; -import java.io.IOException; -import java.io.InputStreamReader; -import java.nio.charset.StandardCharsets; -import java.util.ArrayList; -import java.util.HashMap; -import java.util.List; -import java.util.Map; -import java.util.Map.Entry; -import java.util.Properties; -import java.util.SortedMap; -import java.util.TreeMap; -import java.util.zip.ZipEntry; -import java.util.zip.ZipFile; - -import org.eclipse.aether.artifact.Artifact; -import org.eclipse.aether.artifact.DefaultArtifact; -import org.eclipse.aether.resolution.ArtifactRequest; -import org.eclipse.aether.resolution.ArtifactResult; - -import io.quarkus.annotation.processor.generate_doc.ConfigDocGeneratedOutput; -import io.quarkus.annotation.processor.generate_doc.ConfigDocItem; -import io.quarkus.annotation.processor.generate_doc.ConfigDocItemScanner; -import io.quarkus.annotation.processor.generate_doc.ConfigDocSection; -import io.quarkus.annotation.processor.generate_doc.ConfigDocWriter; -import io.quarkus.annotation.processor.generate_doc.DocGeneratorUtil; -import io.quarkus.bootstrap.resolver.maven.MavenArtifactResolver; -import io.quarkus.maven.dependency.ArtifactCoords; -import io.quarkus.registry.catalog.Extension; -import io.quarkus.registry.catalog.ExtensionCatalog; - -public class AllConfigGenerator { - - public static Artifact toAetherArtifact(ArtifactCoords coords) { - return new DefaultArtifact(coords.getGroupId(), coords.getArtifactId(), coords.getClassifier(), coords.getType(), - coords.getVersion()); - } - - public static void main(String[] args) throws Exception { - if (args.length != 1) { - // exit 1 will break Maven - throw new IllegalArgumentException("Usage: "); - } - String jsonCatalog = args[0]; - - // This is where we produce the entire list of extensions - File jsonFile = new File(jsonCatalog); - if (!jsonFile.exists()) { - throw new RuntimeException( - "Could not generate all-config file because extension catalog file is missing: " + jsonFile); - } - MavenArtifactResolver resolver = MavenArtifactResolver.builder().setWorkspaceDiscovery(false).build(); - - final ExtensionCatalog extensionJson = ExtensionCatalog.fromFile(jsonFile.toPath()); - - // now get all the listed extension jars via Maven - List requests = new ArrayList<>(extensionJson.getExtensions().size()); - Map extensionsByGav = new HashMap<>(); - Map extensionsByConfigRoots = new HashMap<>(); - for (Extension extension : extensionJson.getExtensions()) { - final Artifact artifact = toAetherArtifact(extension.getArtifact()); - requests.add(new ArtifactRequest().setArtifact(artifact)); - // record the extension for this GAV - extensionsByGav.put(artifact.getGroupId() + ":" + artifact.getArtifactId(), extension); - } - - // examine all the extension jars - List deploymentRequests = new ArrayList<>(extensionJson.getExtensions().size()); - for (ArtifactResult result : resolver.resolve(requests)) { - final Artifact artifact = result.getArtifact(); - // which extension was this for? - Extension extension = extensionsByGav.get(artifact.getGroupId() + ":" + artifact.getArtifactId()); - try (ZipFile zf = new ZipFile(artifact.getFile())) { - // collect all its config roots - collectConfigRoots(zf, extension, extensionsByConfigRoots); - - // see if it has a deployment artifact we need to load - ZipEntry entry = zf.getEntry("META-INF/quarkus-extension.properties"); - if (entry != null) { - try (BufferedReader reader = new BufferedReader( - new InputStreamReader(zf.getInputStream(entry), StandardCharsets.UTF_8))) { - Properties properties = new Properties(); - properties.load(reader); - final String deploymentCoords = (String) properties.get("deployment-artifact"); - // if it has one, load it - if (deploymentCoords != null) { - final Artifact deploymentArtifact = toAetherArtifact(ArtifactCoords.fromString(deploymentCoords)); - deploymentRequests.add(new ArtifactRequest().setArtifact(deploymentArtifact)); - // tie this artifact to its extension - extensionsByGav.put(deploymentArtifact.getGroupId() + ":" + deploymentArtifact.getArtifactId(), - extension); - } - } - } - } - } - - // now examine all the extension deployment jars - for (ArtifactResult result : resolver.resolve(deploymentRequests)) { - final Artifact artifact = result.getArtifact(); - // which extension was this for? - Extension extension = extensionsByGav.get(artifact.getGroupId() + ":" + artifact.getArtifactId()); - try (ZipFile zf = new ZipFile(artifact.getFile())) { - // collect all its config roots - collectConfigRoots(zf, extension, extensionsByConfigRoots); - } - } - - // load all the config items per config root - final ConfigDocItemScanner configDocItemScanner = new ConfigDocItemScanner(); - final Map> docItemsByConfigRoots = configDocItemScanner - .loadAllExtensionsConfigurationItems(); - final Map artifactIdsByName = new HashMap<>(); - ConfigDocWriter configDocWriter = new ConfigDocWriter(); - - // Temporary fix for https://github.com/quarkusio/quarkus/issues/5214 until we figure out how to fix it - Extension openApi = extensionsByGav.get("io.quarkus:quarkus-smallrye-openapi"); - if (openApi != null) { - extensionsByConfigRoots.put("io.quarkus.smallrye.openapi.common.deployment.SmallRyeOpenApiConfig", openApi); - } - - // build a list of sorted config items by extension - final SortedMap> sortedConfigItemsByExtension = new TreeMap<>(); - - // sort extensions by name, assign their config items based on their config roots - for (Entry entry : extensionsByConfigRoots.entrySet()) { - List items = docItemsByConfigRoots.get(entry.getKey()); - if (items != null) { - String extensionName = entry.getValue().getName(); - if (extensionName == null) { - // compute the docs file name for this extension - String docFileName = DocGeneratorUtil.computeExtensionDocFileName(entry.getKey()); - // now approximate an extension file name based on it - extensionName = guessExtensionNameFromDocumentationFileName(docFileName); - System.err.println("WARNING: Extension name missing for " - + (entry.getValue().getArtifact().getGroupId() + ":" - + entry.getValue().getArtifact().getArtifactId()) - + " using guessed extension name: " + extensionName); - } - artifactIdsByName.put(extensionName, entry.getValue().getArtifact().getArtifactId()); - List existingConfigDocItems = sortedConfigItemsByExtension.get(extensionName); - if (existingConfigDocItems != null) { - DocGeneratorUtil.appendConfigItemsIntoExistingOnes(existingConfigDocItems, items); - } else { - ArrayList configItems = new ArrayList<>(); - sortedConfigItemsByExtension.put(extensionName, configItems); - configItems.addAll(items); - } - } - } - - // now we have all the config items sorted by extension, let's build the entire list - final List allItems = new ArrayList<>(); - for (Map.Entry> entry : sortedConfigItemsByExtension.entrySet()) { - final List configDocItems = entry.getValue(); - // sort the items - DocGeneratorUtil.sort(configDocItems); - // insert a header - ConfigDocSection header = new ConfigDocSection(); - header.setShowSection(true); - header.setSectionDetailsTitle(entry.getKey()); - header.setAnchorPrefix(artifactIdsByName.get(entry.getKey())); - header.setName(artifactIdsByName.get(entry.getKey())); - allItems.add(new ConfigDocItem(header, null)); - // add all the configs for this extension - allItems.addAll(configDocItems); - } - - // write our docs - ConfigDocGeneratedOutput allConfigGeneratedOutput = new ConfigDocGeneratedOutput("quarkus-all-config.adoc", true, - allItems, - false); - configDocWriter.writeAllExtensionConfigDocumentation(allConfigGeneratedOutput); - } - - private static String guessExtensionNameFromDocumentationFileName(String docFileName) { - // sanitise - if (docFileName.startsWith("quarkus-")) { - docFileName = docFileName.substring(8); - } - - if (docFileName.endsWith(".adoc")) { - docFileName = docFileName.substring(0, docFileName.length() - 5); - } - - if (docFileName.endsWith("-config")) { - docFileName = docFileName.substring(0, docFileName.length() - 7); - } - - if (docFileName.endsWith("-configuration")) { - docFileName = docFileName.substring(0, docFileName.length() - 14); - } - - docFileName = docFileName.replace('-', ' '); - return capitalize(docFileName); - } - - private static String capitalize(String title) { - char[] chars = title.toCharArray(); - boolean capitalize = true; - for (int i = 0; i < chars.length; i++) { - char c = chars[i]; - if (Character.isSpaceChar(c)) { - capitalize = true; - continue; - } - if (capitalize) { - if (Character.isLetter(c)) - chars[i] = Character.toUpperCase(c); - capitalize = false; - } - } - return new String(chars); - } - - private static void collectConfigRoots(ZipFile zf, Extension extension, Map extensionsByConfigRoots) - throws IOException { - ZipEntry entry = zf.getEntry("META-INF/quarkus-config-roots.list"); - if (entry != null) { - try (BufferedReader reader = new BufferedReader( - new InputStreamReader(zf.getInputStream(entry), StandardCharsets.UTF_8))) { - // make sure we turn $ into . because javadoc-scanned class names are dot-separated - reader.lines().map(String::trim).filter(str -> !str.isEmpty()).map(str -> str.replace('$', '.')) - .forEach(klass -> extensionsByConfigRoots.put(klass, extension)); - } - } - } -} From 41267b0d35a163eaf468e7133491d2d4f9dae3b6 Mon Sep 17 00:00:00 2001 From: Guillaume Smet Date: Tue, 6 Aug 2024 10:37:21 +0200 Subject: [PATCH 35/43] Adjust how the Maven plugin is executed and add a skip parameter While we will use true in the external projects to simplify the setup, using it in a reactor where the plugin is built generates a warning. While it works file, it's less than ideal to have a warning so we register the plugin manually. --- .../maven/config/doc/GenerateAsciidocMojo.java | 7 +++++++ docs/pom.xml | 17 +++++++++++++---- 2 files changed, 20 insertions(+), 4 deletions(-) diff --git a/devtools/config-doc-maven-plugin/src/main/java/io/quarkus/maven/config/doc/GenerateAsciidocMojo.java b/devtools/config-doc-maven-plugin/src/main/java/io/quarkus/maven/config/doc/GenerateAsciidocMojo.java index 92a2f2715a491..df37f7ba84f53 100644 --- a/devtools/config-doc-maven-plugin/src/main/java/io/quarkus/maven/config/doc/GenerateAsciidocMojo.java +++ b/devtools/config-doc-maven-plugin/src/main/java/io/quarkus/maven/config/doc/GenerateAsciidocMojo.java @@ -74,8 +74,15 @@ public class GenerateAsciidocMojo extends AbstractMojo { @Parameter(defaultValue = "false") private boolean generateAllConfig; + @Parameter(defaultValue = "false") + private boolean skip; + @Override public void execute() throws MojoExecutionException, MojoFailureException { + if (skip) { + return; + } + // I was unable to find an easy way to get the root directory of the project Path resolvedScanDirectory = scanDirectory != null ? scanDirectory.toPath() : mavenSession.getCurrentProject().getBasedir().toPath().getParent(); diff --git a/docs/pom.xml b/docs/pom.xml index b26911a6886d6..28f03a86e22d8 100644 --- a/docs/pom.xml +++ b/docs/pom.xml @@ -3182,10 +3182,19 @@ io.quarkus quarkus-config-doc-maven-plugin ${project.version} - true - - true - + + + generate-config-doc + process-resources + + generate-asciidoc + + + ${skipDocs} + true + + + maven-compiler-plugin From 5c76ea920912b57e93b90a13188cc379f768ad5c Mon Sep 17 00:00:00 2001 From: Guillaume Smet Date: Tue, 6 Aug 2024 13:10:23 +0200 Subject: [PATCH 36/43] Split Maven plugin generation from extension processor We should have never used the extension processor infra to generate the Maven plugin reference doc. This commit makes sure we don't use anything from the annotation processor. --- docs/pom.xml | 1 + .../main/asciidoc/quarkus-maven-plugin.adoc | 4 +- .../QuarkusMavenPluginDocsGenerator.java | 112 +++++++++--------- 3 files changed, 61 insertions(+), 56 deletions(-) diff --git a/docs/pom.xml b/docs/pom.xml index 28f03a86e22d8..5955dfd906a44 100644 --- a/docs/pom.xml +++ b/docs/pom.xml @@ -3233,6 +3233,7 @@ io.quarkus.docs.generation.QuarkusMavenPluginDocsGenerator ${project.basedir}/../devtools/maven/target/classes/META-INF/maven/plugin.xml + ${infra-doc-dir}/quarkus-maven-plugin-goals.adoc ${env.MAVEN_CMD_LINE_ARGS} diff --git a/docs/src/main/asciidoc/quarkus-maven-plugin.adoc b/docs/src/main/asciidoc/quarkus-maven-plugin.adoc index d1ea6ceed0ed6..f89477d9378e6 100644 --- a/docs/src/main/asciidoc/quarkus-maven-plugin.adoc +++ b/docs/src/main/asciidoc/quarkus-maven-plugin.adoc @@ -6,6 +6,8 @@ https://github.com/quarkusio/quarkus/tree/main/docs/src/main/asciidoc = Quarkus Maven Plugin include::_attributes.adoc[] :topics: maven,tooling +:diataxis-type: reference +:categories: tooling The Quarkus Maven Plugin builds the Quarkus applications, and provides helpers to launch dev mode or build native executables. For more information about how to use the Quarkus Maven Plugin, please refer to the xref:maven-tooling.adoc[Maven Tooling guide]. @@ -24,4 +26,4 @@ It is also possible to print out detailed information about a goal, all its para Here is the list of all the Quarkus Maven Plugin goals: -include::{generated-dir}/quarkus-maven-plugin-goals.adoc[opts=optional, leveloffset=+2] +include::{infra-doc-dir}/quarkus-maven-plugin-goals.adoc[opts=optional, leveloffset=+2] diff --git a/docs/src/main/java/io/quarkus/docs/generation/QuarkusMavenPluginDocsGenerator.java b/docs/src/main/java/io/quarkus/docs/generation/QuarkusMavenPluginDocsGenerator.java index 991810aef9657..28def5d1b06cf 100644 --- a/docs/src/main/java/io/quarkus/docs/generation/QuarkusMavenPluginDocsGenerator.java +++ b/docs/src/main/java/io/quarkus/docs/generation/QuarkusMavenPluginDocsGenerator.java @@ -13,99 +13,86 @@ import org.apache.maven.plugin.descriptor.PluginDescriptorBuilder; import org.codehaus.plexus.util.xml.XmlStreamReader; -import io.quarkus.annotation.processor.generate_doc.ConfigDocWriter; -import io.quarkus.annotation.processor.generate_doc.Constants; -import io.quarkus.annotation.processor.generate_doc.MavenConfigDocBuilder; -import io.quarkus.annotation.processor.generate_doc.MavenConfigDocBuilder.GoalParamsBuilder; - /** * Generates documentation for the Quarkus Maven Plugin from plugin descriptor. */ public class QuarkusMavenPluginDocsGenerator { private static final String QUARKUS_MAVEN_PLUGIN = "quarkus-maven-plugin-"; - private static final String GOALS_OUTPUT_FILE_NAME = QUARKUS_MAVEN_PLUGIN + "goals" + Constants.ADOC_EXTENSION; - private static final String GOAL_PARAMETER_ANCHOR_PREFIX = QUARKUS_MAVEN_PLUGIN + "goal-%s-"; + private static final String GOAL_PARAMETER_ANCHOR_FORMAT = QUARKUS_MAVEN_PLUGIN + "goal-%s-%s"; public static void main(String[] args) throws Exception { - - String errorMessage = null; - - // Path to Quarkus Maven Plugin descriptor (plugin.xml) - final Path pluginXmlDescriptorPath; - if (args.length == 1) { - pluginXmlDescriptorPath = Path.of(args[0]); - } else { - pluginXmlDescriptorPath = null; - errorMessage = String.format("Expected 1 argument ('plugin.xml' file path), got %s", args.length); + if (args.length != 2) { + throw new IllegalArgumentException("Path for input and output were not provided"); } - // Check the file exist - if (pluginXmlDescriptorPath != null - && (!Files.exists(pluginXmlDescriptorPath) || !Files.isRegularFile(pluginXmlDescriptorPath))) { - errorMessage = String.format("File does not exist: %s", pluginXmlDescriptorPath.toAbsolutePath()); + Path pluginXmlDescriptorPath = Path.of(args[0]); + Path mavenPluginAdocPath = Path.of(args[1]); + + if (!Files.exists(pluginXmlDescriptorPath) || !Files.isRegularFile(pluginXmlDescriptorPath)) { + throw new IllegalArgumentException(pluginXmlDescriptorPath + " does not exist or is not a regular file"); } // Deserialize plugin.xml to PluginDescriptor PluginDescriptor pluginDescriptor = null; - if (errorMessage == null) { - try (Reader input = new XmlStreamReader(new FileInputStream(pluginXmlDescriptorPath.toFile()))) { - pluginDescriptor = new PluginDescriptorBuilder().build(input); - } catch (IOException e) { - errorMessage = String.format("Failed to deserialize PluginDescriptor: %s", e.getMessage()); - } + try (Reader input = new XmlStreamReader(new FileInputStream(pluginXmlDescriptorPath.toFile()))) { + pluginDescriptor = new PluginDescriptorBuilder().build(input); + } catch (IOException e) { + throw new IllegalStateException("Failed to deserialize PluginDescriptor", e); } // Don't generate documentation if there are no goals (shouldn't happen if correct descriptor is available) if (pluginDescriptor != null && (pluginDescriptor.getMojos() == null || pluginDescriptor.getMojos().isEmpty())) { - errorMessage = "Found no goals"; - } - - // Don't break the build if Quarkus Maven Plugin Descriptor is not available - if (errorMessage != null) { - System.err.printf("Can't generate the documentation for the Quarkus Maven Plugin\n: %s\n", errorMessage); return; } + StringBuilder asciidoc = new StringBuilder(); + // Build Goals documentation - final var goalsConfigDocBuilder = new MavenConfigDocBuilder(); for (MojoDescriptor mojo : pluginDescriptor.getMojos()) { - // Add Goal Title - goalsConfigDocBuilder.addTableTitle(mojo.getFullGoalName()); + asciidoc.append("= ").append(mojo.getFullGoalName()).append("\n\n"); // Add Goal Description if (mojo.getDescription() != null && !mojo.getDescription().isBlank()) { - goalsConfigDocBuilder.addTableDescription(mojo.getDescription()); + asciidoc.append(mojo.getDescription()).append("\n\n"); } - // Collect Goal Parameters - final GoalParamsBuilder goalParamsBuilder = goalsConfigDocBuilder.newGoalParamsBuilder(); - if (mojo.getParameters() != null) { + if (mojo.getParameters() != null && !mojo.getParameters().isEmpty()) { + asciidoc.append("[.configuration-reference, cols=\"70,15,15\"]\n"); + asciidoc.append("|===\n\n"); + + asciidoc.append("h|[[").append(String.format(GOAL_PARAMETER_ANCHOR_FORMAT, mojo.getGoal(), "parameter-table")) + .append("]] Parameter\n"); + asciidoc.append("h|Type\n"); + asciidoc.append("h|Default value\n\n"); + for (Parameter parameter : mojo.getParameters()) { String property = getPropertyFromExpression(parameter.getExpression()); - String name = Optional.ofNullable(property).orElseGet(parameter::getName); - goalParamsBuilder.addParam(parameter.getType(), name, parameter.getDefaultValue(), - parameter.isRequired(), parameter.getDescription()); + asciidoc.append("a| [[").append(String.format(GOAL_PARAMETER_ANCHOR_FORMAT, mojo.getGoal(), name)) + .append("]] ").append(name).append("\n"); + if (parameter.getDescription() != null && !parameter.getDescription().isBlank()) { + asciidoc.append("\n[.description]\n--\n").append(escapeCellContent(parameter.getDescription())) + .append("\n--\n"); + } + asciidoc.append("|").append("`" + simplifyType(parameter.getType()) + "`") + .append(parameter.isRequired() ? " (required)" : "") + .append("\n"); + asciidoc.append("|") + .append(parameter.getDefaultValue() != null && !parameter.getDefaultValue().isEmpty() + ? "`" + escapeCellContent(parameter.getDefaultValue()) + "`" + : "") + .append("\n\n"); } - } - - // Add Parameters Summary Table if the goal has parameters - if (goalParamsBuilder.tableIsNotEmpty()) { - goalsConfigDocBuilder.addSummaryTable(String.format(GOAL_PARAMETER_ANCHOR_PREFIX, mojo.getGoal()), false, - goalParamsBuilder.build(), GOALS_OUTPUT_FILE_NAME, false); - // Start next table on a new line - goalsConfigDocBuilder.addNewLine(); + asciidoc.append("|===\n\n"); } } - // Generate Goals documentation - if (goalsConfigDocBuilder.hasWriteItems()) { - new ConfigDocWriter().generateDocumentation(GOALS_OUTPUT_FILE_NAME, goalsConfigDocBuilder); - } + Files.createDirectories(mavenPluginAdocPath.getParent()); + Files.writeString(mavenPluginAdocPath, asciidoc.toString()); } private static String getPropertyFromExpression(String expression) { @@ -120,4 +107,19 @@ private static String getPropertyFromExpression(String expression) { return null; } + private static String simplifyType(String type) { + if (type == null || type.isBlank() || type.indexOf('.') == -1) { + return type; + } + + return type.substring(type.lastIndexOf('.') + 1); + } + + private static String escapeCellContent(String value) { + if (value == null) { + return null; + } + + return value.replace("|", "\\|"); + } } From 646134212e361325d81f8ee0126215f08bd6ce3c Mon Sep 17 00:00:00 2001 From: Guillaume Smet Date: Tue, 6 Aug 2024 13:31:34 +0200 Subject: [PATCH 37/43] Convert AssembleDownstreamDocumentation to new generated doc structure --- docs/pom.xml | 6 +- docs/src/main/asciidoc/_attributes-local.adoc | 2 +- docs/src/main/asciidoc/all-builditems.adoc | 2 +- .../main/asciidoc/quarkus-maven-plugin.adoc | 2 +- .../AssembleDownstreamDocumentation.java | 85 ++++++++++++++----- 5 files changed, 69 insertions(+), 28 deletions(-) diff --git a/docs/pom.xml b/docs/pom.xml index 5955dfd906a44..ddd03d2f8c8b4 100644 --- a/docs/pom.xml +++ b/docs/pom.xml @@ -36,7 +36,7 @@ https://github.com/quarkusio/quarkus-quickstarts ${project.build.directory}/quarkus-config-doc ${project.build.directory}/quarkus-generated-doc - ${generated-dir}/infra + ${generated-dir}/infra ${generated-dir}/examples docker.io/jdkato/vale:v2.15.5 @@ -3233,7 +3233,7 @@ io.quarkus.docs.generation.QuarkusMavenPluginDocsGenerator ${project.basedir}/../devtools/maven/target/classes/META-INF/maven/plugin.xml - ${infra-doc-dir}/quarkus-maven-plugin-goals.adoc + ${generated-infra-doc-dir}/quarkus-maven-plugin-goals.adoc ${env.MAVEN_CMD_LINE_ARGS} @@ -3252,7 +3252,7 @@ false io.quarkus.docs.generation.QuarkusBuildItemDoc - ${infra-doc-dir}/quarkus-all-build-items.adoc + ${generated-infra-doc-dir}/quarkus-all-build-items.adoc ${project.basedir}/../core/deployment ${project.basedir}/../extensions diff --git a/docs/src/main/asciidoc/_attributes-local.adoc b/docs/src/main/asciidoc/_attributes-local.adoc index 795d134a66f73..8a4d499c87811 100644 --- a/docs/src/main/asciidoc/_attributes-local.adoc +++ b/docs/src/main/asciidoc/_attributes-local.adoc @@ -7,7 +7,7 @@ :icons: font :target-dir: ../../../target :generated-config-doc-dir: {target-dir}/quarkus-config-doc -:infra-doc-dir: {target-dir}/quarkus-generated-doc/infra +:generated-infra-doc-dir: {target-dir}/quarkus-generated-doc/infra :code-examples: {target-dir}/quarkus-generated-doc/examples :doc-examples: ./_examples :imagesdir: ./images diff --git a/docs/src/main/asciidoc/all-builditems.adoc b/docs/src/main/asciidoc/all-builditems.adoc index 5f0c51f724584..22ec96f53ada1 100644 --- a/docs/src/main/asciidoc/all-builditems.adoc +++ b/docs/src/main/asciidoc/all-builditems.adoc @@ -15,4 +15,4 @@ Here you can find a list of Build Items and the extension that provides them. icon:building[title=Non-instantiatable Build Item] Build item can't be instantiated directly, but can be extended/inherited from -include::{infra-doc-dir}/quarkus-all-build-items.adoc[opts=optional] +include::{generated-infra-doc-dir}/quarkus-all-build-items.adoc[opts=optional] diff --git a/docs/src/main/asciidoc/quarkus-maven-plugin.adoc b/docs/src/main/asciidoc/quarkus-maven-plugin.adoc index f89477d9378e6..9054883fffbd1 100644 --- a/docs/src/main/asciidoc/quarkus-maven-plugin.adoc +++ b/docs/src/main/asciidoc/quarkus-maven-plugin.adoc @@ -26,4 +26,4 @@ It is also possible to print out detailed information about a goal, all its para Here is the list of all the Quarkus Maven Plugin goals: -include::{infra-doc-dir}/quarkus-maven-plugin-goals.adoc[opts=optional, leveloffset=+2] +include::{generated-infra-doc-dir}/quarkus-maven-plugin-goals.adoc[opts=optional, leveloffset=+2] diff --git a/docs/src/main/java/io/quarkus/docs/generation/AssembleDownstreamDocumentation.java b/docs/src/main/java/io/quarkus/docs/generation/AssembleDownstreamDocumentation.java index a12f247b1ecb7..29bd3e2abf681 100755 --- a/docs/src/main/java/io/quarkus/docs/generation/AssembleDownstreamDocumentation.java +++ b/docs/src/main/java/io/quarkus/docs/generation/AssembleDownstreamDocumentation.java @@ -40,7 +40,9 @@ public class AssembleDownstreamDocumentation { private static final Path SOURCE_DOC_PATH = Path.of("src", "main", "asciidoc"); private static final Path DOC_PATH = Path.of("target", "asciidoc", "sources"); private static final Path INCLUDES_PATH = DOC_PATH.resolve("_includes"); - private static final Path GENERATED_FILES_PATH = Path.of("..", "target", "asciidoc", "generated"); + private static final Path GENERATED_CONFIG_DOC_FILES_PATH = Path.of("target", "quarkus-config-doc"); + private static final Path GENERATED_INFRA_DOC_FILES_PATH = Path.of("target", "quarkus-generated-doc", "infra"); + private static final Path GENERATED_CODE_EXAMPLE_FILES_PATH = Path.of("target", "quarkus-generated-doc", "examples"); private static final Path IMAGES_PATH = DOC_PATH.resolve("images"); private static final Path TARGET_ROOT_DIRECTORY = Path.of("target", "downstream-tree"); private static final Path TARGET_IMAGES_DIRECTORY = TARGET_ROOT_DIRECTORY.resolve("images"); @@ -99,8 +101,17 @@ public static void main(String[] args) throws Exception { throw new IllegalStateException( "Transformed AsciiDoc sources directory does not exist. Have you built the documentation?"); } - if (!Files.isDirectory(GENERATED_FILES_PATH)) { - throw new IllegalStateException("Generated files directory does not exist. Have you built the documentation?"); + if (!Files.isDirectory(GENERATED_CONFIG_DOC_FILES_PATH)) { + throw new IllegalStateException("Generated files directory `" + GENERATED_CONFIG_DOC_FILES_PATH + + "` does not exist. Have you built the documentation?"); + } + if (!Files.isDirectory(GENERATED_INFRA_DOC_FILES_PATH)) { + throw new IllegalStateException("Generated files directory `" + GENERATED_INFRA_DOC_FILES_PATH + + "` does not exist. Have you built the documentation?"); + } + if (!Files.isDirectory(GENERATED_CODE_EXAMPLE_FILES_PATH)) { + throw new IllegalStateException("Generated files directory `" + GENERATED_CODE_EXAMPLE_FILES_PATH + + "` does not exist. Have you built the documentation?"); } Path referenceIndexPath = Path.of(args[0]); if (!Files.isReadable(Path.of(args[0]))) { @@ -149,7 +160,9 @@ public static void main(String[] args) throws Exception { Set guides = new TreeSet<>(); Set simpleIncludes = new TreeSet<>(); Set includes = new TreeSet<>(); - Set generatedFiles = new TreeSet<>(); + Set generatedConfigDocFiles = new TreeSet<>(); + Set generatedInfraDocFiles = new TreeSet<>(); + Set generatedCodeExampleFiles = new TreeSet<>(); Set images = new TreeSet<>(); Set allResolvedPaths = new TreeSet<>(); @@ -173,7 +186,9 @@ public static void main(String[] args) throws Exception { guides.add(guidePath); simpleIncludes.addAll(guideContent.simpleIncludes); includes.addAll(guideContent.includes); - generatedFiles.addAll(guideContent.generatedFiles); + generatedConfigDocFiles.addAll(guideContent.generatedConfigDocFiles); + generatedInfraDocFiles.addAll(guideContent.generatedInfraDocFiles); + generatedCodeExampleFiles.addAll(guideContent.generatedCodeExampleFiles); images.addAll(guideContent.images); } @@ -211,19 +226,14 @@ public static void main(String[] args) throws Exception { Files.createDirectories(targetFile.getParent()); copyAsciidoc(sourceFile, targetFile, downstreamGuides, titlesByReference, linkRewritingErrors); } - for (Path generatedFile : generatedFiles) { - Path sourceFile = GENERATED_FILES_PATH.resolve(generatedFile); - if (EXCLUDED_FILES.contains(sourceFile)) { - continue; - } - if (!Files.isReadable(sourceFile)) { - LOG.error("Unable to read generated file " + sourceFile); - } - allResolvedPaths.add(sourceFile); - Path targetFile = TARGET_GENERATED_DIRECTORY.resolve(generatedFile); - Files.createDirectories(targetFile.getParent()); - copyAsciidoc(sourceFile, targetFile, downstreamGuides, titlesByReference, linkRewritingErrors); - } + + copyGeneratedFiles(linkRewritingErrors, titlesByReference, allResolvedPaths, + downstreamGuides, GENERATED_CONFIG_DOC_FILES_PATH, generatedConfigDocFiles, Path.of("config")); + copyGeneratedFiles(linkRewritingErrors, titlesByReference, allResolvedPaths, + downstreamGuides, GENERATED_INFRA_DOC_FILES_PATH, generatedInfraDocFiles, Path.of("infra")); + copyGeneratedFiles(linkRewritingErrors, titlesByReference, allResolvedPaths, + downstreamGuides, GENERATED_CODE_EXAMPLE_FILES_PATH, generatedCodeExampleFiles, Path.of("examples")); + for (Path image : images) { Path sourceFile = IMAGES_PATH.resolve(image); if (EXCLUDED_FILES.contains(sourceFile)) { @@ -266,6 +276,25 @@ public static void main(String[] args) throws Exception { } } + private static void copyGeneratedFiles(Map> linkRewritingErrors, Map titlesByReference, + Set allResolvedPaths, Set downstreamGuides, Path generatedSourceFilesDirectory, + Set generatedFiles, Path targetSubdirectory) + throws IOException { + for (Path generatedConfigDocFile : generatedFiles) { + Path sourceFile = generatedSourceFilesDirectory.resolve(generatedConfigDocFile); + if (EXCLUDED_FILES.contains(sourceFile)) { + continue; + } + if (!Files.isReadable(sourceFile)) { + LOG.error("Unable to read generated file " + sourceFile); + } + allResolvedPaths.add(sourceFile); + Path targetFile = TARGET_GENERATED_DIRECTORY.resolve(targetSubdirectory).resolve(generatedConfigDocFile); + Files.createDirectories(targetFile.getParent()); + copyAsciidoc(sourceFile, targetFile, downstreamGuides, titlesByReference, linkRewritingErrors); + } + } + private static void getFiles(GuideContent guideContent, Path currentFile) throws IOException { List lines = Files.readAllLines(currentFile); @@ -276,9 +305,19 @@ private static void getFiles(GuideContent guideContent, Path currentFile) throws getFurtherIncludes(guideContent, INCLUDES_PATH.resolve(possibleInclude.get())); continue; } - Optional possibleGeneratedFile = extractPath(line, "include::{generated-dir}"); - if (possibleGeneratedFile.isPresent()) { - guideContent.generatedFiles.add(possibleGeneratedFile.get()); + Optional possibleGeneratedConfigDocFile = extractPath(line, "include::{generated-config-doc-dir}"); + if (possibleGeneratedConfigDocFile.isPresent()) { + guideContent.generatedConfigDocFiles.add(possibleGeneratedConfigDocFile.get()); + continue; + } + Optional possibleGeneratedInfraDocFile = extractPath(line, "include::{generated-infra-doc-dir}"); + if (possibleGeneratedInfraDocFile.isPresent()) { + guideContent.generatedInfraDocFiles.add(possibleGeneratedInfraDocFile.get()); + continue; + } + Optional possibleCodeExampleFile = extractPath(line, "include::{code-examples-dir}"); + if (possibleGeneratedInfraDocFile.isPresent()) { + guideContent.generatedCodeExampleFiles.add(possibleCodeExampleFile.get()); continue; } Optional possibleSimpleInclude = extractPath(line, "include::"); @@ -536,7 +575,9 @@ public static class GuideContent { public Set simpleIncludes = new TreeSet<>(); public Set includes = new TreeSet<>(); public Set images = new TreeSet<>(); - public Set generatedFiles = new TreeSet<>(); + public Set generatedConfigDocFiles = new TreeSet<>(); + public Set generatedInfraDocFiles = new TreeSet<>(); + public Set generatedCodeExampleFiles = new TreeSet<>(); public GuideContent(Path guide) { this.guide = guide; From 11c3181eb69ebaf6887e731d1d5096b98b16e348 Mon Sep 17 00:00:00 2001 From: Guillaume Smet Date: Tue, 6 Aug 2024 14:39:23 +0200 Subject: [PATCH 38/43] Get rid of all the old annotation processor code Also port some of the tests to the new infrastructure. --- .../ExtensionAnnotationProcessor.java | 7 +- .../quarkus/annotation/processor/Options.java | 1 - .../discovery/ParsedJavadocSection.java | 2 +- .../JavadocToAsciidocTransformer.java | 28 +- .../config/util/ConfigNamingUtil.java | 2 +- .../config/util/JavadocUtil.java | 8 +- .../extension/ExtensionBuildProcessor.java | 15 +- .../processor/generate_doc/ConfigDoc.java | 20 - .../generate_doc/ConfigDocBuilder.java | 89 --- .../generate_doc/ConfigDocElement.java | 35 - .../ConfigDocGeneratedOutput.java | 68 -- .../processor/generate_doc/ConfigDocItem.java | 170 ----- .../generate_doc/ConfigDocItemFinder.java | 686 ------------------ .../generate_doc/ConfigDocItemScanner.java | 289 -------- .../processor/generate_doc/ConfigDocKey.java | 259 ------- .../generate_doc/ConfigDocSection.java | 173 ----- .../generate_doc/ConfigDocWriter.java | 45 -- .../processor/generate_doc/ConfigPhase.java | 78 -- .../generate_doc/ConfigRootInfo.java | 69 -- .../processor/generate_doc/Constants.java | 139 ---- .../processor/generate_doc/DocFormatter.java | 70 -- .../generate_doc/DocGeneratorUtil.java | 532 -------------- .../processor/generate_doc/FsMap.java | 95 --- .../processor/generate_doc/FsMultiMap.java | 60 -- .../processor/generate_doc/JavaDocParser.java | 544 -------------- .../LegacyConfigDocExtensionProcessor.java | 210 ------ .../generate_doc/MavenConfigDocBuilder.java | 93 --- .../ScannedConfigDocsItemHolder.java | 59 -- .../SummaryTableDocFormatter.java | 154 ---- .../processor/util/AccessorGenerator.java | 9 +- ...cToAsciidocTransformerConfigItemTest.java} | 205 +++--- ...oAsciidocTransformerConfigSectionTest.java | 127 ++++ .../config/util/ConfigNamingUtilTest.java | 106 +++ .../config/util/JavadocUtilTest.java | 121 +++ .../config/util/TypeUtilTest.java | 20 + .../generate_doc/ConfigDocKeyTest.java | 54 -- .../generate_doc/DocGeneratorUtilTest.java | 427 ----------- .../JavaDocConfigSectionParserTest.java | 150 ---- 38 files changed, 515 insertions(+), 4704 deletions(-) delete mode 100644 core/processor/src/main/java/io/quarkus/annotation/processor/generate_doc/ConfigDoc.java delete mode 100644 core/processor/src/main/java/io/quarkus/annotation/processor/generate_doc/ConfigDocBuilder.java delete mode 100644 core/processor/src/main/java/io/quarkus/annotation/processor/generate_doc/ConfigDocElement.java delete mode 100644 core/processor/src/main/java/io/quarkus/annotation/processor/generate_doc/ConfigDocGeneratedOutput.java delete mode 100644 core/processor/src/main/java/io/quarkus/annotation/processor/generate_doc/ConfigDocItem.java delete mode 100644 core/processor/src/main/java/io/quarkus/annotation/processor/generate_doc/ConfigDocItemFinder.java delete mode 100644 core/processor/src/main/java/io/quarkus/annotation/processor/generate_doc/ConfigDocItemScanner.java delete mode 100644 core/processor/src/main/java/io/quarkus/annotation/processor/generate_doc/ConfigDocKey.java delete mode 100644 core/processor/src/main/java/io/quarkus/annotation/processor/generate_doc/ConfigDocSection.java delete mode 100644 core/processor/src/main/java/io/quarkus/annotation/processor/generate_doc/ConfigDocWriter.java delete mode 100644 core/processor/src/main/java/io/quarkus/annotation/processor/generate_doc/ConfigPhase.java delete mode 100644 core/processor/src/main/java/io/quarkus/annotation/processor/generate_doc/ConfigRootInfo.java delete mode 100644 core/processor/src/main/java/io/quarkus/annotation/processor/generate_doc/Constants.java delete mode 100644 core/processor/src/main/java/io/quarkus/annotation/processor/generate_doc/DocFormatter.java delete mode 100644 core/processor/src/main/java/io/quarkus/annotation/processor/generate_doc/DocGeneratorUtil.java delete mode 100644 core/processor/src/main/java/io/quarkus/annotation/processor/generate_doc/FsMap.java delete mode 100644 core/processor/src/main/java/io/quarkus/annotation/processor/generate_doc/FsMultiMap.java delete mode 100644 core/processor/src/main/java/io/quarkus/annotation/processor/generate_doc/JavaDocParser.java delete mode 100644 core/processor/src/main/java/io/quarkus/annotation/processor/generate_doc/LegacyConfigDocExtensionProcessor.java delete mode 100644 core/processor/src/main/java/io/quarkus/annotation/processor/generate_doc/MavenConfigDocBuilder.java delete mode 100644 core/processor/src/main/java/io/quarkus/annotation/processor/generate_doc/ScannedConfigDocsItemHolder.java delete mode 100644 core/processor/src/main/java/io/quarkus/annotation/processor/generate_doc/SummaryTableDocFormatter.java rename core/processor/src/test/java/io/quarkus/annotation/processor/{generate_doc/JavaDocConfigDescriptionParserTest.java => documentation/config/formatter/JavadocToAsciidocTransformerConfigItemTest.java} (51%) create mode 100644 core/processor/src/test/java/io/quarkus/annotation/processor/documentation/config/formatter/JavadocToAsciidocTransformerConfigSectionTest.java create mode 100644 core/processor/src/test/java/io/quarkus/annotation/processor/documentation/config/util/ConfigNamingUtilTest.java create mode 100644 core/processor/src/test/java/io/quarkus/annotation/processor/documentation/config/util/JavadocUtilTest.java create mode 100644 core/processor/src/test/java/io/quarkus/annotation/processor/documentation/config/util/TypeUtilTest.java delete mode 100644 core/processor/src/test/java/io/quarkus/annotation/processor/generate_doc/ConfigDocKeyTest.java delete mode 100644 core/processor/src/test/java/io/quarkus/annotation/processor/generate_doc/DocGeneratorUtilTest.java delete mode 100644 core/processor/src/test/java/io/quarkus/annotation/processor/generate_doc/JavaDocConfigSectionParserTest.java diff --git a/core/processor/src/main/java/io/quarkus/annotation/processor/ExtensionAnnotationProcessor.java b/core/processor/src/main/java/io/quarkus/annotation/processor/ExtensionAnnotationProcessor.java index 06a8df7615b88..fa3758b7c61a7 100644 --- a/core/processor/src/main/java/io/quarkus/annotation/processor/ExtensionAnnotationProcessor.java +++ b/core/processor/src/main/java/io/quarkus/annotation/processor/ExtensionAnnotationProcessor.java @@ -23,11 +23,10 @@ import io.quarkus.annotation.processor.documentation.config.model.Extension; import io.quarkus.annotation.processor.documentation.config.util.Types; import io.quarkus.annotation.processor.extension.ExtensionBuildProcessor; -import io.quarkus.annotation.processor.generate_doc.LegacyConfigDocExtensionProcessor; import io.quarkus.annotation.processor.util.Config; import io.quarkus.annotation.processor.util.Utils; -@SupportedOptions({ Options.LEGACY_CONFIG_ROOT, Options.GENERATE_DOC, Options.GENERATE_LEGACY_CONFIG_DOC }) +@SupportedOptions({ Options.LEGACY_CONFIG_ROOT, Options.GENERATE_DOC }) public class ExtensionAnnotationProcessor extends AbstractProcessor { private static final String DEBUG = "debug-extension-annotation-processor"; @@ -48,10 +47,6 @@ public synchronized void init(ProcessingEnvironment processingEnv) { // for now, we generate the old config doc by default but we will change this behavior soon if (generateDoc) { extensionProcessors.add(new ConfigDocExtensionProcessor()); - - if (!"false".equals(processingEnv.getOptions().get(Options.GENERATE_LEGACY_CONFIG_DOC))) { - extensionProcessors.add(new LegacyConfigDocExtensionProcessor()); - } } this.extensionProcessors = Collections.unmodifiableList(extensionProcessors); diff --git a/core/processor/src/main/java/io/quarkus/annotation/processor/Options.java b/core/processor/src/main/java/io/quarkus/annotation/processor/Options.java index dbbd252be8e31..0d11b2104a373 100644 --- a/core/processor/src/main/java/io/quarkus/annotation/processor/Options.java +++ b/core/processor/src/main/java/io/quarkus/annotation/processor/Options.java @@ -3,6 +3,5 @@ public final class Options { public static final String LEGACY_CONFIG_ROOT = "legacyConfigRoot"; - public static final String GENERATE_LEGACY_CONFIG_DOC = "generateLegacyConfigDoc"; public static final String GENERATE_DOC = "generateDoc"; } diff --git a/core/processor/src/main/java/io/quarkus/annotation/processor/documentation/config/discovery/ParsedJavadocSection.java b/core/processor/src/main/java/io/quarkus/annotation/processor/documentation/config/discovery/ParsedJavadocSection.java index 5342e394c4870..e93fce5e7b400 100644 --- a/core/processor/src/main/java/io/quarkus/annotation/processor/documentation/config/discovery/ParsedJavadocSection.java +++ b/core/processor/src/main/java/io/quarkus/annotation/processor/documentation/config/discovery/ParsedJavadocSection.java @@ -1,4 +1,4 @@ package io.quarkus.annotation.processor.documentation.config.discovery; -public record ParsedJavadocSection(String title, String description) { +public record ParsedJavadocSection(String title, String details) { } \ No newline at end of file diff --git a/core/processor/src/main/java/io/quarkus/annotation/processor/documentation/config/formatter/JavadocToAsciidocTransformer.java b/core/processor/src/main/java/io/quarkus/annotation/processor/documentation/config/formatter/JavadocToAsciidocTransformer.java index 62100a8596f18..2775f2360a6cf 100644 --- a/core/processor/src/main/java/io/quarkus/annotation/processor/documentation/config/formatter/JavadocToAsciidocTransformer.java +++ b/core/processor/src/main/java/io/quarkus/annotation/processor/documentation/config/formatter/JavadocToAsciidocTransformer.java @@ -30,7 +30,6 @@ public final class JavadocToAsciidocTransformer { private static final Pattern REPLACE_MACOS_EOL = Pattern.compile("\r"); private static final Pattern STARTING_SPACE = Pattern.compile("^ +"); - private static final String EMPTY = ""; private static final String DOT = "."; private static final String BACKTICK = "`"; @@ -112,12 +111,16 @@ public ParsedJavadoc parseConfigItemJavadoc(String rawJavadoc) { .map(JavadocDescription::toText) .findFirst(); + if (description != null && description.isBlank()) { + description = null; + } + return new ParsedJavadoc(description, since.isPresent() ? since.get() : null, originalFormat); } public ParsedJavadocSection parseConfigSectionJavadoc(String javadocComment) { if (javadocComment == null || javadocComment.trim().isEmpty()) { - return new ParsedJavadocSection(EMPTY, EMPTY); + return new ParsedJavadocSection(null, null); } // the parser expects all the lines to start with "* " @@ -133,19 +136,28 @@ public ParsedJavadocSection parseConfigSectionJavadoc(String javadocComment) { } if (asciidoc == null || asciidoc.isBlank()) { - return new ParsedJavadocSection(EMPTY, EMPTY); + return new ParsedJavadocSection(null, null); + } + + final int newLineIndex = asciidoc.indexOf(NEW_LINE); + final int dotIndex = asciidoc.indexOf(DOT); + + final int endOfTitleIndex; + if (newLineIndex > 0 && newLineIndex < dotIndex) { + endOfTitleIndex = newLineIndex; + } else { + endOfTitleIndex = dotIndex; } - final int endOfTitleIndex = asciidoc.indexOf(DOT); if (endOfTitleIndex == -1) { - final String title = asciidoc.replaceAll("^([^\\w])+", EMPTY).trim(); + final String title = asciidoc.replaceAll("^([^\\w])+", "").trim(); - return new ParsedJavadocSection(title, EMPTY); + return new ParsedJavadocSection(title, null); } else { - final String title = asciidoc.substring(0, endOfTitleIndex).replaceAll("^([^\\w])+", EMPTY).trim(); + final String title = asciidoc.substring(0, endOfTitleIndex).replaceAll("^([^\\w])+", "").trim(); final String details = asciidoc.substring(endOfTitleIndex + 1).trim(); - return new ParsedJavadocSection(title, details); + return new ParsedJavadocSection(title, details.isBlank() ? null : details); } } diff --git a/core/processor/src/main/java/io/quarkus/annotation/processor/documentation/config/util/ConfigNamingUtil.java b/core/processor/src/main/java/io/quarkus/annotation/processor/documentation/config/util/ConfigNamingUtil.java index 1cb8a1090b6a9..100e78e9898e1 100644 --- a/core/processor/src/main/java/io/quarkus/annotation/processor/documentation/config/util/ConfigNamingUtil.java +++ b/core/processor/src/main/java/io/quarkus/annotation/processor/documentation/config/util/ConfigNamingUtil.java @@ -42,7 +42,7 @@ public static String getRootPrefix(String prefix, String name, String simpleClas return rootPrefix; } - private static String deriveConfigRootName(String simpleClassName, String prefix, ConfigPhase configPhase) { + static String deriveConfigRootName(String simpleClassName, String prefix, ConfigPhase configPhase) { String simpleNameInLowerCase = simpleClassName.toLowerCase(); int length = simpleNameInLowerCase.length(); diff --git a/core/processor/src/main/java/io/quarkus/annotation/processor/documentation/config/util/JavadocUtil.java b/core/processor/src/main/java/io/quarkus/annotation/processor/documentation/config/util/JavadocUtil.java index 3e356f54a77aa..c9970cefcf8d3 100644 --- a/core/processor/src/main/java/io/quarkus/annotation/processor/documentation/config/util/JavadocUtil.java +++ b/core/processor/src/main/java/io/quarkus/annotation/processor/documentation/config/util/JavadocUtil.java @@ -10,10 +10,10 @@ public final class JavadocUtil { - private static final String VERTX_JAVA_DOC_SITE = "https://vertx.io/docs/apidocs/"; - private static final String OFFICIAL_JAVA_DOC_BASE_LINK = "https://docs.oracle.com/en/java/javase/17/docs/api/"; - private static final String AGROAL_API_JAVA_DOC_SITE = "https://javadoc.io/doc/io.agroal/agroal-api/latest/"; - private static final String LOG_LEVEL_REDIRECT_URL = "https://javadoc.io/doc/org.jboss.logmanager/jboss-logmanager/latest/org/jboss/logmanager/Level.html"; + static final String VERTX_JAVA_DOC_SITE = "https://vertx.io/docs/apidocs/"; + static final String OFFICIAL_JAVA_DOC_BASE_LINK = "https://docs.oracle.com/en/java/javase/17/docs/api/"; + static final String AGROAL_API_JAVA_DOC_SITE = "https://javadoc.io/doc/io.agroal/agroal-api/latest/"; + static final String LOG_LEVEL_REDIRECT_URL = "https://javadoc.io/doc/org.jboss.logmanager/jboss-logmanager/latest/org/jboss/logmanager/Level.html"; private static final Pattern PACKAGE_PATTERN = Pattern.compile("^(\\w+)\\.(\\w+)\\..*$"); diff --git a/core/processor/src/main/java/io/quarkus/annotation/processor/extension/ExtensionBuildProcessor.java b/core/processor/src/main/java/io/quarkus/annotation/processor/extension/ExtensionBuildProcessor.java index de94fa8e122b3..0c408d0bb494f 100644 --- a/core/processor/src/main/java/io/quarkus/annotation/processor/extension/ExtensionBuildProcessor.java +++ b/core/processor/src/main/java/io/quarkus/annotation/processor/extension/ExtensionBuildProcessor.java @@ -21,7 +21,6 @@ import io.quarkus.annotation.processor.ExtensionProcessor; import io.quarkus.annotation.processor.Outputs; import io.quarkus.annotation.processor.documentation.config.util.Types; -import io.quarkus.annotation.processor.generate_doc.Constants; import io.quarkus.annotation.processor.util.Config; import io.quarkus.annotation.processor.util.Utils; @@ -51,15 +50,15 @@ public void process(Set annotations, RoundEnvironment rou processBuildStep(roundEnv, annotation); break; case Types.ANNOTATION_RECORDER: - trackAnnotationUsed(Constants.ANNOTATION_RECORDER); + trackAnnotationUsed(Types.ANNOTATION_RECORDER); processRecorder(roundEnv, annotation); break; case Types.ANNOTATION_CONFIG_ROOT: - trackAnnotationUsed(Constants.ANNOTATION_CONFIG_ROOT); + trackAnnotationUsed(Types.ANNOTATION_CONFIG_ROOT); processConfigRoot(roundEnv, annotation); break; case Types.ANNOTATION_CONFIG_GROUP: - trackAnnotationUsed(Constants.ANNOTATION_CONFIG_GROUP); + trackAnnotationUsed(Types.ANNOTATION_CONFIG_GROUP); processConfigGroup(roundEnv, annotation); break; } @@ -103,10 +102,10 @@ private void validateRecordBuildSteps(TypeElement clazz) { continue; } ExecutableElement ex = (ExecutableElement) e; - if (!utils.element().isAnnotationPresent(ex, Constants.ANNOTATION_BUILD_STEP)) { + if (!utils.element().isAnnotationPresent(ex, Types.ANNOTATION_BUILD_STEP)) { continue; } - if (!utils.element().isAnnotationPresent(ex, Constants.ANNOTATION_RECORD)) { + if (!utils.element().isAnnotationPresent(ex, Types.ANNOTATION_RECORD)) { continue; } @@ -118,7 +117,7 @@ private void validateRecordBuildSteps(TypeElement clazz) { if (parameterTypeElement == null) { allTypesResolvable = false; } else { - if (utils.element().isAnnotationPresent(parameterTypeElement, Constants.ANNOTATION_RECORDER)) { + if (utils.element().isAnnotationPresent(parameterTypeElement, Types.ANNOTATION_RECORDER)) { if (parameterTypeElement.getModifiers().contains(Modifier.FINAL)) { utils.processingEnv().getMessager().printMessage(Diagnostic.Kind.ERROR, "Class '" + parameterTypeElement.getQualifiedName() @@ -176,7 +175,7 @@ private void processConfigGroup(RoundEnvironment roundEnv, TypeElement annotatio } private void validateAnnotationUsage() { - if (isAnnotationUsed(Constants.ANNOTATION_BUILD_STEP) && isAnnotationUsed(Constants.ANNOTATION_RECORDER)) { + if (isAnnotationUsed(Types.ANNOTATION_BUILD_STEP) && isAnnotationUsed(Types.ANNOTATION_RECORDER)) { utils.processingEnv().getMessager().printMessage(Diagnostic.Kind.ERROR, "Detected use of @Recorder annotation in 'deployment' module. Classes annotated with @Recorder must be part of the extension's 'runtime' module"); } diff --git a/core/processor/src/main/java/io/quarkus/annotation/processor/generate_doc/ConfigDoc.java b/core/processor/src/main/java/io/quarkus/annotation/processor/generate_doc/ConfigDoc.java deleted file mode 100644 index 0ad3e5a327d4d..0000000000000 --- a/core/processor/src/main/java/io/quarkus/annotation/processor/generate_doc/ConfigDoc.java +++ /dev/null @@ -1,20 +0,0 @@ -package io.quarkus.annotation.processor.generate_doc; - -import java.io.IOException; -import java.io.Writer; -import java.util.List; - -/** - * Represent one output file, its items are going to be appended to the file - */ -interface ConfigDoc { - - List getWriteItems(); - - /** - * An item is a summary table, note below the table, ... - */ - interface WriteItem { - void accept(Writer writer) throws IOException; - } -} diff --git a/core/processor/src/main/java/io/quarkus/annotation/processor/generate_doc/ConfigDocBuilder.java b/core/processor/src/main/java/io/quarkus/annotation/processor/generate_doc/ConfigDocBuilder.java deleted file mode 100644 index 60e8eeddb6ba9..0000000000000 --- a/core/processor/src/main/java/io/quarkus/annotation/processor/generate_doc/ConfigDocBuilder.java +++ /dev/null @@ -1,89 +0,0 @@ -package io.quarkus.annotation.processor.generate_doc; - -import static io.quarkus.annotation.processor.generate_doc.Constants.SUMMARY_TABLE_ID_VARIABLE; -import static java.util.Objects.requireNonNull; - -import java.util.ArrayList; -import java.util.List; - -/** - * {@link ConfigDoc} builder - */ -class ConfigDocBuilder { - - /** - * Declare AsciiDoc variable - */ - private static final String DECLARE_VAR = "\n:%s: %s\n"; - private final DocFormatter summaryTableDocFormatter; - protected final List writeItems = new ArrayList<>(); - - public ConfigDocBuilder() { - summaryTableDocFormatter = new SummaryTableDocFormatter(); - } - - protected ConfigDocBuilder(boolean showEnvVars) { - summaryTableDocFormatter = new SummaryTableDocFormatter(showEnvVars); - } - - /** - * Add documentation in a summary table and descriptive format - */ - public final ConfigDocBuilder addSummaryTable(String initialAnchorPrefix, boolean activateSearch, - List configDocItems, String fileName, - boolean includeConfigPhaseLegend) { - - writeItems.add(writer -> { - - // Create var with unique value for each summary table that will make DURATION_FORMAT_NOTE (see below) unique - var fileNameWithoutExtension = fileName.substring(0, fileName.length() - Constants.ADOC_EXTENSION.length()); - writer.append(String.format(DECLARE_VAR, SUMMARY_TABLE_ID_VARIABLE, fileNameWithoutExtension)); - - summaryTableDocFormatter.format(writer, initialAnchorPrefix, activateSearch, configDocItems, - includeConfigPhaseLegend); - - boolean hasDuration = false, hasMemory = false; - for (ConfigDocItem item : configDocItems) { - if (item.hasDurationInformationNote()) { - hasDuration = true; - } - - if (item.hasMemoryInformationNote()) { - hasMemory = true; - } - } - - if (hasDuration) { - writer.append(Constants.DURATION_FORMAT_NOTE); - } - - if (hasMemory) { - writer.append(Constants.MEMORY_SIZE_FORMAT_NOTE); - } - }); - return this; - } - - public boolean hasWriteItems() { - return !writeItems.isEmpty(); - } - - /** - * Passed strings are appended to the file - */ - public final ConfigDocBuilder write(String... strings) { - requireNonNull(strings); - writeItems.add(writer -> { - for (String str : strings) { - writer.append(str); - } - }); - return this; - } - - public final ConfigDoc build() { - final List docItemsCopy = List.copyOf(writeItems); - return () -> docItemsCopy; - } - -} diff --git a/core/processor/src/main/java/io/quarkus/annotation/processor/generate_doc/ConfigDocElement.java b/core/processor/src/main/java/io/quarkus/annotation/processor/generate_doc/ConfigDocElement.java deleted file mode 100644 index e23d313841fbe..0000000000000 --- a/core/processor/src/main/java/io/quarkus/annotation/processor/generate_doc/ConfigDocElement.java +++ /dev/null @@ -1,35 +0,0 @@ -package io.quarkus.annotation.processor.generate_doc; - -import static io.quarkus.annotation.processor.generate_doc.ConfigPhase.COMPARATOR; - -import java.io.IOException; -import java.io.Writer; - -public interface ConfigDocElement { - void accept(Writer writer, DocFormatter docFormatter) throws IOException; - - ConfigPhase getConfigPhase(); - - boolean isWithinAMap(); - - String getTopLevelGrouping(); - - /** - * - * Map config will be at the end of generated doc. - * Order build time config first - * Otherwise maintain source code order. - */ - default int compare(ConfigDocElement item) { - if (isWithinAMap()) { - if (item.isWithinAMap()) { - return COMPARATOR.compare(getConfigPhase(), item.getConfigPhase()); - } - return 1; - } else if (item.isWithinAMap()) { - return -1; - } - - return COMPARATOR.compare(getConfigPhase(), item.getConfigPhase()); - } -} diff --git a/core/processor/src/main/java/io/quarkus/annotation/processor/generate_doc/ConfigDocGeneratedOutput.java b/core/processor/src/main/java/io/quarkus/annotation/processor/generate_doc/ConfigDocGeneratedOutput.java deleted file mode 100644 index 215b15f6c53e0..0000000000000 --- a/core/processor/src/main/java/io/quarkus/annotation/processor/generate_doc/ConfigDocGeneratedOutput.java +++ /dev/null @@ -1,68 +0,0 @@ -package io.quarkus.annotation.processor.generate_doc; - -import java.util.List; -import java.util.Objects; - -public class ConfigDocGeneratedOutput { - private final String fileName; - private final boolean searchable; - private final boolean hasAnchorPrefix; - private final List configDocItems; - - public ConfigDocGeneratedOutput(String fileName, boolean searchable, List configDocItems, - boolean hasAnchorPrefix) { - this.fileName = fileName; - this.searchable = searchable; - this.configDocItems = configDocItems; - this.hasAnchorPrefix = hasAnchorPrefix; - } - - public String getFileName() { - return fileName; - } - - public boolean isSearchable() { - return searchable; - } - - public List getConfigDocItems() { - return configDocItems; - } - - public String getAnchorPrefix() { - if (!hasAnchorPrefix) { - return Constants.EMPTY; - } - - String anchorPrefix = fileName; - if (fileName.endsWith(Constants.ADOC_EXTENSION)) { - anchorPrefix = anchorPrefix.substring(0, anchorPrefix.length() - 5); - } - - return anchorPrefix + "_"; - } - - @Override - public boolean equals(Object o) { - if (this == o) - return true; - if (o == null || getClass() != o.getClass()) - return false; - ConfigDocGeneratedOutput that = (ConfigDocGeneratedOutput) o; - return Objects.equals(fileName, that.fileName); - } - - @Override - public int hashCode() { - return Objects.hash(fileName); - } - - @Override - public String toString() { - return "ConfigItemsOutput{" + - "fileName='" + fileName + '\'' + - ", searchable=" + searchable + - ", configDocItems=" + configDocItems + - '}'; - } -} diff --git a/core/processor/src/main/java/io/quarkus/annotation/processor/generate_doc/ConfigDocItem.java b/core/processor/src/main/java/io/quarkus/annotation/processor/generate_doc/ConfigDocItem.java deleted file mode 100644 index 3055ab5165bd7..0000000000000 --- a/core/processor/src/main/java/io/quarkus/annotation/processor/generate_doc/ConfigDocItem.java +++ /dev/null @@ -1,170 +0,0 @@ -package io.quarkus.annotation.processor.generate_doc; - -import java.io.IOException; -import java.io.Writer; - -import com.fasterxml.jackson.annotation.JsonIgnore; -import com.fasterxml.jackson.annotation.JsonInclude; - -/** - * A config doc item is either a config section {@link ConfigDocSection} or a config key {@link ConfigDocKey} - */ -@JsonInclude(JsonInclude.Include.NON_NULL) -final public class ConfigDocItem implements ConfigDocElement, Comparable { - private ConfigDocKey configDocKey; - private ConfigDocSection configDocSection; - - public ConfigDocItem() { - } - - public ConfigDocItem(ConfigDocSection configDocSection, ConfigDocKey configDocKey) { - this.configDocSection = configDocSection; - this.configDocKey = configDocKey; - } - - public ConfigDocKey getConfigDocKey() { - return configDocKey; - } - - public void setConfigDocKey(ConfigDocKey configDocKey) { - this.configDocKey = configDocKey; - } - - public ConfigDocSection getConfigDocSection() { - return configDocSection; - } - - public void setConfigDocSection(ConfigDocSection configDocSection) { - this.configDocSection = configDocSection; - } - - @JsonIgnore - boolean isConfigSection() { - return configDocSection != null; - } - - @JsonIgnore - boolean isConfigKey() { - return configDocKey != null; - } - - @Override - public String toString() { - return "ConfigDocItem{" + - "configDocSection=" + configDocSection + - ", configDocKey=" + configDocKey + - '}'; - } - - @Override - public void accept(Writer writer, DocFormatter docFormatter) throws IOException { - if (isConfigSection()) { - configDocSection.accept(writer, docFormatter); - } else if (isConfigKey()) { - configDocKey.accept(writer, docFormatter); - } - } - - @JsonIgnore - @Override - public ConfigPhase getConfigPhase() { - if (isConfigSection()) { - return configDocSection.getConfigPhase(); - } else if (isConfigKey()) { - return configDocKey.getConfigPhase(); - } - - return null; - } - - @JsonIgnore - @Override - public boolean isWithinAMap() { - if (isConfigSection()) { - return configDocSection.isWithinAMap(); - } else if (isConfigKey()) { - return configDocKey.isWithinAMap(); - } - - return false; - } - - @Override - @JsonIgnore - public String getTopLevelGrouping() { - if (isConfigKey()) { - return configDocKey.getTopLevelGrouping(); - } else if (isConfigSection()) { - return configDocSection.getTopLevelGrouping(); - } - - return null; - } - - @JsonIgnore - public boolean isWithinAConfigGroup() { - if (isConfigSection()) { - return true; - } else if (isConfigKey() && configDocKey.isWithinAConfigGroup()) { - return true; - } - - return false; - } - - /** - * TODO determine section ordering - * - * @param item - * @return - */ - @Override - public int compareTo(ConfigDocItem item) { - // ensure that different config objects in the same extension don't cross streams - if (isConfigKey() && item.isConfigKey() && (!getTopLevelGrouping().equals(item.getTopLevelGrouping()))) { - return getTopLevelGrouping().compareTo(item.getTopLevelGrouping()); - } - - if (isConfigSection() && item.isConfigKey()) { - return 1; // push sections to the end of the list - } else if (isConfigKey() && item.isConfigSection()) { - return -1; // push section to the end of the list - } - - return compare(item); - } - - public boolean hasDurationInformationNote() { - if (isConfigKey()) { - return DocGeneratorUtil.hasDurationInformationNote(configDocKey); - } else if (isConfigSection()) { - return configDocSection.hasDurationInformationNote(); - } - return false; - } - - public boolean hasMemoryInformationNote() { - if (isConfigKey()) { - return DocGeneratorUtil.hasMemoryInformationNote(configDocKey); - } else if (isConfigSection()) { - return configDocSection.hasMemoryInformationNote(); - } - return false; - } - - public void configPhase(ConfigPhase phase) { - if (isConfigKey()) { - configDocKey.setConfigPhase(phase); - } else { - configDocSection.setConfigPhase(phase); - } - } - - public void withinAMap(boolean withinAMap) { - if (isConfigKey()) { - configDocKey.setWithinAMap(configDocKey.isWithinAMap() || withinAMap); - } else { - configDocSection.setWithinAMap(configDocSection.isWithinAMap() || withinAMap); - } - } -} diff --git a/core/processor/src/main/java/io/quarkus/annotation/processor/generate_doc/ConfigDocItemFinder.java b/core/processor/src/main/java/io/quarkus/annotation/processor/generate_doc/ConfigDocItemFinder.java deleted file mode 100644 index e12797fc59e6d..0000000000000 --- a/core/processor/src/main/java/io/quarkus/annotation/processor/generate_doc/ConfigDocItemFinder.java +++ /dev/null @@ -1,686 +0,0 @@ -package io.quarkus.annotation.processor.generate_doc; - -import static io.quarkus.annotation.processor.generate_doc.Constants.ANNOTATION_CONFIG_DOC_DEFAULT; -import static io.quarkus.annotation.processor.generate_doc.Constants.ANNOTATION_CONFIG_DOC_ENUM_VALUE; -import static io.quarkus.annotation.processor.generate_doc.Constants.ANNOTATION_CONFIG_DOC_IGNORE; -import static io.quarkus.annotation.processor.generate_doc.Constants.ANNOTATION_CONFIG_DOC_MAP_KEY; -import static io.quarkus.annotation.processor.generate_doc.Constants.ANNOTATION_CONFIG_DOC_SECTION; -import static io.quarkus.annotation.processor.generate_doc.Constants.ANNOTATION_CONFIG_ITEM; -import static io.quarkus.annotation.processor.generate_doc.Constants.ANNOTATION_CONFIG_WITH_DEFAULT; -import static io.quarkus.annotation.processor.generate_doc.Constants.ANNOTATION_CONFIG_WITH_NAME; -import static io.quarkus.annotation.processor.generate_doc.Constants.ANNOTATION_CONFIG_WITH_PARENT_NAME; -import static io.quarkus.annotation.processor.generate_doc.Constants.ANNOTATION_CONFIG_WITH_UNNAMED_KEY; -import static io.quarkus.annotation.processor.generate_doc.Constants.ANNOTATION_CONVERT_WITH; -import static io.quarkus.annotation.processor.generate_doc.Constants.ANNOTATION_DEFAULT_CONVERTER; -import static io.quarkus.annotation.processor.generate_doc.Constants.DOT; -import static io.quarkus.annotation.processor.generate_doc.Constants.EMPTY; -import static io.quarkus.annotation.processor.generate_doc.Constants.HYPHENATED_ELEMENT_NAME; -import static io.quarkus.annotation.processor.generate_doc.Constants.LIST_OF_CONFIG_ITEMS_TYPE_REF; -import static io.quarkus.annotation.processor.generate_doc.Constants.NEW_LINE; -import static io.quarkus.annotation.processor.generate_doc.Constants.NO_DEFAULT; -import static io.quarkus.annotation.processor.generate_doc.Constants.OBJECT_MAPPER; -import static io.quarkus.annotation.processor.generate_doc.Constants.PARENT; -import static io.quarkus.annotation.processor.generate_doc.DocGeneratorUtil.getJavaDocSiteLink; -import static io.quarkus.annotation.processor.generate_doc.DocGeneratorUtil.getKnownGenericType; -import static io.quarkus.annotation.processor.generate_doc.DocGeneratorUtil.hyphenate; -import static io.quarkus.annotation.processor.generate_doc.DocGeneratorUtil.hyphenateEnumValue; -import static java.util.Collections.emptyList; -import static java.util.stream.Collectors.toList; -import static javax.lang.model.element.Modifier.ABSTRACT; - -import java.io.IOException; -import java.time.Duration; -import java.util.ArrayList; -import java.util.Arrays; -import java.util.HashSet; -import java.util.List; -import java.util.Map; -import java.util.Optional; -import java.util.Properties; -import java.util.Set; -import java.util.stream.Collectors; - -import javax.lang.model.element.AnnotationMirror; -import javax.lang.model.element.AnnotationValue; -import javax.lang.model.element.Element; -import javax.lang.model.element.ElementKind; -import javax.lang.model.element.ExecutableElement; -import javax.lang.model.element.Modifier; -import javax.lang.model.element.Name; -import javax.lang.model.element.TypeElement; -import javax.lang.model.type.ArrayType; -import javax.lang.model.type.DeclaredType; -import javax.lang.model.type.ExecutableType; -import javax.lang.model.type.TypeKind; -import javax.lang.model.type.TypeMirror; - -import com.fasterxml.jackson.core.JsonProcessingException; - -import io.quarkus.annotation.processor.generate_doc.JavaDocParser.SectionHolder; - -class ConfigDocItemFinder { - - private static final String COMMA = ","; - private static final String BACK_TICK = "`"; - private static final String NAMED_MAP_CONFIG_ITEM_FORMAT = ".\"%s\""; - private static final Set PRIMITIVE_TYPES = new HashSet<>( - Arrays.asList("byte", "short", "int", "long", "float", "double", "boolean", "char")); - - private final JavaDocParser javaDocParser = new JavaDocParser(); - private final JavaDocParser enumJavaDocParser = new JavaDocParser(true); - private final ScannedConfigDocsItemHolder holder = new ScannedConfigDocsItemHolder(); - - private final Set configRoots; - private final Properties javaDocProperties; - private final Map configGroupQualifiedNameToTypeElementMap; - private final FsMap allConfigurationGroups; - private final FsMap allConfigurationRoots; - private final boolean configMapping; - - public ConfigDocItemFinder(Set configRoots, - Map configGroupQualifiedNameToTypeElementMap, - Properties javaDocProperties, FsMap allConfigurationGroups, FsMap allConfigurationRoots, - boolean configMapping) { - this.configRoots = configRoots; - this.configGroupQualifiedNameToTypeElementMap = configGroupQualifiedNameToTypeElementMap; - this.javaDocProperties = javaDocProperties; - this.allConfigurationGroups = allConfigurationGroups; - this.allConfigurationRoots = allConfigurationRoots; - this.configMapping = configMapping; - } - - /** - * Find configuration items from current encountered configuration roots. - * Scan configuration group first and record them in a properties file as they can be shared across - * different modules. - * - */ - ScannedConfigDocsItemHolder findInMemoryConfigurationItems() throws IOException { - for (Map.Entry entry : configGroupQualifiedNameToTypeElementMap.entrySet()) { - ConfigPhase buildTime = ConfigPhase.BUILD_TIME; - final List configDocItems = recursivelyFindConfigItems(entry.getValue(), EMPTY, EMPTY, buildTime, - false, 1, - false, configMapping); - allConfigurationGroups.put(entry.getKey(), OBJECT_MAPPER.writeValueAsString(configDocItems)); - } - - for (ConfigRootInfo configRootInfo : configRoots) { - final int sectionLevel = 0; - final TypeElement element = configRootInfo.getClazz(); - String rootName = configRootInfo.getName(); - ConfigPhase configPhase = configRootInfo.getConfigPhase(); - final List configDocItems = recursivelyFindConfigItems(element, rootName, rootName, configPhase, - false, sectionLevel, true, configMapping); - holder.addConfigRootItems(configRootInfo, configDocItems); - allConfigurationRoots.put(configRootInfo.getClazz().toString(), OBJECT_MAPPER.writeValueAsString(configDocItems)); - } - - return holder; - } - - /** - * Recursively find config item found in a config root or config group given as {@link Element} - */ - private List recursivelyFindConfigItems(Element element, String rootName, String parentName, - ConfigPhase configPhase, boolean withinAMap, int sectionLevel, boolean generateSeparateConfigGroupDocsFiles, - boolean configMapping) - throws JsonProcessingException { - List configDocItems = new ArrayList<>(); - TypeElement asTypeElement = (TypeElement) element; - List superTypes = new ArrayList<>(); - superTypes.add(asTypeElement.getSuperclass()); - superTypes.addAll(asTypeElement.getInterfaces()); - - for (TypeMirror superType : superTypes) { - if (superType.getKind() != TypeKind.NONE && !superType.toString().equals(Object.class.getName())) { - String key = superType.toString(); - String rawConfigItems = allConfigurationGroups.get(key); - if (rawConfigItems == null) { - rawConfigItems = allConfigurationRoots.get(key); - } - final List superTypeConfigItems; - if (rawConfigItems == null) { // element not yet scanned - Element superElement = ((DeclaredType) superType).asElement(); - superTypeConfigItems = recursivelyFindConfigItems(superElement, rootName, parentName, - configPhase, withinAMap, sectionLevel, generateSeparateConfigGroupDocsFiles, - configMapping); - } else { - superTypeConfigItems = OBJECT_MAPPER.readValue(rawConfigItems, LIST_OF_CONFIG_ITEMS_TYPE_REF); - } - - configDocItems.addAll(superTypeConfigItems); - } - } - - for (Element enclosedElement : element.getEnclosedElements()) { - if (!shouldProcessElement(enclosedElement, configMapping)) { - continue; - } - - boolean isStaticField = enclosedElement - .getModifiers() - .stream() - .anyMatch(Modifier.STATIC::equals); - - if (isStaticField) { - continue; - } - - String name = null; - String defaultValue = NO_DEFAULT; - String defaultValueDoc = EMPTY; - List acceptedValues = null; - final TypeElement clazz = (TypeElement) element; - final String fieldName = enclosedElement.getSimpleName().toString(); - final String javaDocKey = clazz.getQualifiedName().toString() + DOT + fieldName; - final List annotationMirrors = enclosedElement.getAnnotationMirrors(); - final String rawJavaDoc = javaDocProperties.getProperty(javaDocKey); - boolean useHyphenateEnumValue = true; - - String hyphenatedFieldName = hyphenate(fieldName); - String configDocMapKey = hyphenatedFieldName; - boolean unnamedMapKey = false; - boolean isDeprecated = false; - boolean generateDocumentation = true; - ConfigDocSection configSection = new ConfigDocSection(); - configSection.setTopLevelGrouping(rootName); - configSection.setWithinAMap(withinAMap); - configSection.setConfigPhase(configPhase); - - for (AnnotationMirror annotationMirror : annotationMirrors) { - String annotationName = annotationMirror.getAnnotationType().toString(); - if (annotationName.equals(Deprecated.class.getName())) { - isDeprecated = true; - break; - } - if (annotationName.equals(ANNOTATION_CONFIG_ITEM) - || annotationName.equals(ANNOTATION_CONFIG_DOC_MAP_KEY)) { - for (Map.Entry entry : annotationMirror - .getElementValues().entrySet()) { - final String key = entry.getKey().toString(); - final Object value = entry.getValue().getValue(); - if (annotationName.equals(ANNOTATION_CONFIG_DOC_MAP_KEY) && "value()".equals(key)) { - configDocMapKey = value.toString(); - } else if (annotationName.equals(ANNOTATION_CONFIG_ITEM)) { - if ("name()".equals(key)) { - switch (value.toString()) { - case HYPHENATED_ELEMENT_NAME: - name = parentName + DOT + hyphenatedFieldName; - break; - case PARENT: - name = parentName; - break; - default: - name = parentName + DOT + value; - } - } else if ("defaultValue()".equals(key)) { - defaultValue = value.toString(); - } else if ("defaultValueDocumentation()".equals(key)) { - defaultValueDoc = value.toString(); - } else if ("generateDocumentation()".equals(key)) { - generateDocumentation = (Boolean) value; - } - } - } - } else if (annotationName.equals(ANNOTATION_CONFIG_DOC_SECTION)) { - final SectionHolder sectionHolder = javaDocParser.parseConfigSection(rawJavaDoc, sectionLevel); - configSection.setShowSection(true); - configSection.setSectionDetails(sectionHolder.details); - configSection.setSectionDetailsTitle(sectionHolder.title); - configSection.setName(parentName + DOT + hyphenatedFieldName); - } else if (annotationName.equals(ANNOTATION_DEFAULT_CONVERTER) - || annotationName.equals(ANNOTATION_CONVERT_WITH)) { - useHyphenateEnumValue = false; - } - - // Mappings - if (annotationName.equals(ANNOTATION_CONFIG_WITH_NAME)) { - name = parentName + DOT + annotationMirror.getElementValues().values().iterator().next().getValue(); - } else if (annotationName.equals(ANNOTATION_CONFIG_WITH_PARENT_NAME)) { - name = parentName; - } else if (annotationName.equals(ANNOTATION_CONFIG_DOC_DEFAULT)) { - defaultValueDoc = annotationMirror.getElementValues().values().iterator().next().getValue().toString(); - } else if (annotationName.equals(ANNOTATION_CONFIG_WITH_DEFAULT)) { - defaultValue = annotationMirror.getElementValues().values().isEmpty() ? null - : annotationMirror.getElementValues().values().iterator().next().getValue().toString(); - } else if (annotationName.equals(ANNOTATION_CONFIG_WITH_UNNAMED_KEY)) { - unnamedMapKey = true; - } else if (annotationName.equals(ANNOTATION_CONFIG_DOC_IGNORE)) { - generateDocumentation = false; - } - } - - if (isDeprecated) { - continue; // do not include deprecated config items - } - if (!generateDocumentation) { - continue; // documentation for this item was explicitly disabled - } - - if (name == null) { - name = parentName + DOT + hyphenatedFieldName; - } - if (NO_DEFAULT.equals(defaultValue)) { - defaultValue = EMPTY; - } - - TypeMirror typeMirror = unwrapTypeMirror(enclosedElement.asType()); - String type = getType(typeMirror); - - if (isConfigGroup(type)) { - List groupConfigItems = readConfigGroupItems(configPhase, rootName, name, emptyList(), type, - configSection, withinAMap, generateSeparateConfigGroupDocsFiles, configMapping); - DocGeneratorUtil.appendConfigItemsIntoExistingOnes(configDocItems, groupConfigItems); - } else { - final ConfigDocKey configDocKey = new ConfigDocKey(); - configDocKey.setWithinAMap(withinAMap); - boolean list = false; - boolean optional = false; - if (!typeMirror.getKind().isPrimitive()) { - DeclaredType declaredType = (DeclaredType) typeMirror; - TypeElement typeElement = (TypeElement) declaredType.asElement(); - Name qualifiedName = typeElement.getQualifiedName(); - optional = qualifiedName.toString().startsWith(Optional.class.getName()) - || qualifiedName.contentEquals(Map.class.getName()); - list = qualifiedName.contentEquals(List.class.getName()) - || qualifiedName.contentEquals(Set.class.getName()); - - List typeArguments = declaredType.getTypeArguments(); - if (!typeArguments.isEmpty()) { - // FIXME: this is super dodgy: we should check the type!! - if (typeArguments.size() == 2) { - type = getType(typeArguments.get(1)); - List additionalNames; - if (unnamedMapKey) { - additionalNames = List - .of(name + String.format(NAMED_MAP_CONFIG_ITEM_FORMAT, configDocMapKey)); - } else { - name += String.format(NAMED_MAP_CONFIG_ITEM_FORMAT, configDocMapKey); - additionalNames = emptyList(); - } - if (isConfigGroup(type)) { - List groupConfigItems = readConfigGroupItems(configPhase, rootName, name, - additionalNames, type, configSection, true, generateSeparateConfigGroupDocsFiles, - configMapping); - DocGeneratorUtil.appendConfigItemsIntoExistingOnes(configDocItems, groupConfigItems); - continue; - } else { - configDocKey.setWithinAMap(true); - } - } else { - // FIXME: this is for Optional and List - TypeMirror realTypeMirror = typeArguments.get(0); - String typeInString = realTypeMirror.toString(); - - if (optional) { - if (isConfigGroup(typeInString)) { - if (!configSection.isShowSection()) { - final SectionHolder sectionHolder = javaDocParser.parseConfigSection( - rawJavaDoc, - sectionLevel); - configSection.setSectionDetails(sectionHolder.details); - configSection.setSectionDetailsTitle(sectionHolder.title); - configSection.setName(parentName + DOT + hyphenatedFieldName); - configSection.setShowSection(true); - } - configSection.setOptional(true); - List groupConfigItems = readConfigGroupItems(configPhase, rootName, name, - emptyList(), typeInString, configSection, withinAMap, - generateSeparateConfigGroupDocsFiles, configMapping); - DocGeneratorUtil.appendConfigItemsIntoExistingOnes(configDocItems, groupConfigItems); - continue; - } else if ((typeInString.startsWith(List.class.getName()) - || typeInString.startsWith(Set.class.getName()) - || realTypeMirror.getKind() == TypeKind.ARRAY)) { - list = true; - DeclaredType declaredRealType = (DeclaredType) typeMirror; - typeArguments = declaredRealType.getTypeArguments(); - if (!typeArguments.isEmpty()) { - realTypeMirror = typeArguments.get(0); - } - } - } - - type = simpleTypeToString(realTypeMirror); - if (isEnumType(realTypeMirror)) { - if (defaultValueDoc.isBlank()) { - if (useHyphenateEnumValue) { - defaultValue = Arrays.stream(defaultValue.split(COMMA)) - .map(defaultEnumValue -> hyphenateEnumValue(defaultEnumValue.trim())) - .collect(Collectors.joining(COMMA)); - } - } else { - defaultValue = defaultValueDoc; - } - acceptedValues = extractEnumValues(realTypeMirror, useHyphenateEnumValue, - clazz.getQualifiedName().toString()); - configDocKey.setEnum(true); - } else { - if (!defaultValueDoc.isBlank()) { - defaultValue = defaultValueDoc; - } - } - } - } else { - type = simpleTypeToString(declaredType); - - if (defaultValueDoc.isBlank()) { - if (isEnumType(declaredType)) { - defaultValue = hyphenateEnumValue(defaultValue); - acceptedValues = extractEnumValues(declaredType, useHyphenateEnumValue, - clazz.getQualifiedName().toString()); - configDocKey.setEnum(true); - } else if (isDurationType(declaredType) && !defaultValue.isEmpty()) { - defaultValue = DocGeneratorUtil.normalizeDurationValue(defaultValue); - } - } else { - defaultValue = defaultValueDoc; - } - } - } - - configDocKey.setKey(name); - configDocKey.setAdditionalKeys(emptyList()); - configDocKey.setType(type); - configDocKey.setList(list); - configDocKey.setOptional(optional); - configDocKey.setWithinAConfigGroup(sectionLevel > 0); - configDocKey.setTopLevelGrouping(rootName); - configDocKey.setConfigPhase(configPhase); - configDocKey.setDefaultValue(defaultValue); - configDocKey.setDocMapKey(configDocMapKey); - javaDocParser.parseConfigDescription(rawJavaDoc, configDocKey::setConfigDoc, configDocKey::setSince); - configDocKey.setEnvironmentVariable(DocGeneratorUtil.toEnvVarName(name)); - configDocKey.setAcceptedValues(acceptedValues); - configDocKey.setJavaDocSiteLink(getJavaDocSiteLink(type)); - ConfigDocItem configDocItem = new ConfigDocItem(); - configDocItem.setConfigDocKey(configDocKey); - - // If there is already a config item with the same key it comes from a super type, and we need to override it - ConfigDocItem parent = null; - for (ConfigDocItem docItem : configDocItems) { - if (docItem.getConfigDocKey() != null && docItem.getConfigDocKey().getKey().equals(configDocKey.getKey())) { - parent = docItem; - break; - } - } - // We may want to merge the metadata, but let's keep this simple for now - if (parent != null) { - configDocItems.remove(parent); - } - configDocItems.add(configDocItem); - } - } - - return configDocItems; - } - - private TypeMirror unwrapTypeMirror(TypeMirror typeMirror) { - if (typeMirror instanceof DeclaredType) { - return typeMirror; - } - - if (typeMirror instanceof ExecutableType) { - ExecutableType executableType = (ExecutableType) typeMirror; - return executableType.getReturnType(); - } - - return typeMirror; - } - - private String getType(TypeMirror typeMirror) { - if (typeMirror instanceof DeclaredType) { - DeclaredType declaredType = (DeclaredType) typeMirror; - TypeElement typeElement = (TypeElement) declaredType.asElement(); - return typeElement.getQualifiedName().toString(); - } - return typeMirror.toString(); - } - - private boolean isConfigGroup(String type) { - if (type.startsWith("java.") || PRIMITIVE_TYPES.contains(type)) { - return false; - } - return configGroupQualifiedNameToTypeElementMap.containsKey(type) || allConfigurationGroups.hasKey(type); - } - - private boolean shouldProcessElement(final Element enclosedElement, final boolean configMapping) { - if (enclosedElement.getKind().isField()) { - return true; - } - - if (!configMapping && enclosedElement.getKind() == ElementKind.METHOD) { - return false; - } - - // A ConfigMapping method - if (enclosedElement.getKind().equals(ElementKind.METHOD)) { - ExecutableElement method = (ExecutableElement) enclosedElement; - // Skip toString method, because mappings can include it and generate it - if (method.getSimpleName().contentEquals("toString") && method.getParameters().size() == 0) { - return false; - } - Element enclosingElement = enclosedElement.getEnclosingElement(); - return enclosingElement.getModifiers().contains(ABSTRACT) && enclosedElement.getModifiers().contains(ABSTRACT); - } - - return false; - } - - private String simpleTypeToString(TypeMirror typeMirror) { - if (typeMirror.getKind().isPrimitive()) { - return typeMirror.toString(); - } else if (typeMirror.getKind() == TypeKind.ARRAY) { - return simpleTypeToString(((ArrayType) typeMirror).getComponentType()); - } - - final String knownGenericType = getKnownGenericType((DeclaredType) typeMirror); - - if (knownGenericType != null) { - return knownGenericType; - } - - List typeArguments = ((DeclaredType) typeMirror).getTypeArguments(); - if (!typeArguments.isEmpty()) { - return simpleTypeToString(typeArguments.get(0)); - } - - return getType(typeMirror); - } - - private List extractEnumValues(TypeMirror realTypeMirror, boolean useHyphenatedEnumValue, String javaDocKey) { - Element declaredTypeElement = ((DeclaredType) realTypeMirror).asElement(); - List acceptedValues = new ArrayList<>(); - - for (Element field : declaredTypeElement.getEnclosedElements()) { - if (field.getKind() == ElementKind.ENUM_CONSTANT) { - String enumValue = field.getSimpleName().toString(); - - // Find enum constant description - final String constantJavaDocKey = javaDocKey + DOT + enumValue; - final String rawJavaDoc = javaDocProperties.getProperty(constantJavaDocKey); - - String explicitEnumValueName = extractEnumValueName(field); - if (explicitEnumValueName != null) { - enumValue = explicitEnumValueName; - } else { - enumValue = useHyphenatedEnumValue ? hyphenateEnumValue(enumValue) : enumValue; - } - if (rawJavaDoc != null && !rawJavaDoc.isBlank()) { - // Show enum constant description as a Tooltip - String javaDoc = enumJavaDocParser.parseConfigDescription(rawJavaDoc); - acceptedValues.add(String.format(Constants.TOOLTIP, enumValue, - javaDoc.replace("

", EMPTY).replace("

", EMPTY).replace(NEW_LINE, " "))); - } else { - acceptedValues.add(Constants.CODE_DELIMITER - + enumValue + Constants.CODE_DELIMITER); - } - } - } - - return acceptedValues; - } - - private String extractEnumValueName(Element enumField) { - for (AnnotationMirror annotationMirror : enumField.getAnnotationMirrors()) { - String annotationName = annotationMirror.getAnnotationType().toString(); - if (annotationName.equals(ANNOTATION_CONFIG_DOC_ENUM_VALUE)) { - for (var entry : annotationMirror.getElementValues().entrySet()) { - var key = entry.getKey().toString(); - var value = entry.getValue().getValue(); - if ("value()".equals(key)) { - return value.toString(); - } - } - } - } - return null; - } - - private boolean isEnumType(TypeMirror realTypeMirror) { - return realTypeMirror instanceof DeclaredType - && ((DeclaredType) realTypeMirror).asElement().getKind() == ElementKind.ENUM; - } - - private boolean isDurationType(TypeMirror realTypeMirror) { - return realTypeMirror.toString().equals(Duration.class.getName()); - } - - /** - * Scan or parse configuration items of a given configuration group. - *

- * If the configuration group is already scanned, retrieve the scanned items and parse them - * If not, make sure that items of a given configuration group are properly scanned and the record of scanned - * configuration group if properly updated afterwards. - * - */ - private List readConfigGroupItems( - ConfigPhase configPhase, - String topLevelRootName, - String parentName, - List additionalNames, - String configGroup, - ConfigDocSection configSection, - boolean withinAMap, - boolean generateSeparateConfigGroupDocs, - boolean configMapping) - throws JsonProcessingException { - - configSection.setConfigGroupType(configGroup); - if (configSection.getSectionDetailsTitle() == null) { - configSection.setSectionDetailsTitle(parentName); - } - - if (configSection.getName() == null) { - configSection.setName(EMPTY); - } - - final List configDocItems = new ArrayList<>(); - String property = allConfigurationGroups.get(configGroup); - List groupConfigItems; - if (property != null) { - groupConfigItems = OBJECT_MAPPER.readValue(property, LIST_OF_CONFIG_ITEMS_TYPE_REF); - } else { - TypeElement configGroupTypeElement = configGroupQualifiedNameToTypeElementMap.get(configGroup); - groupConfigItems = recursivelyFindConfigItems(configGroupTypeElement, EMPTY, EMPTY, configPhase, - false, 1, generateSeparateConfigGroupDocs, configMapping); - allConfigurationGroups.put(configGroup, OBJECT_MAPPER.writeValueAsString(groupConfigItems)); - } - - groupConfigItems = decorateGroupItems(groupConfigItems, configPhase, topLevelRootName, parentName, additionalNames, - withinAMap, generateSeparateConfigGroupDocs); - - // make sure that the config section is added if it is to be shown or when scanning parent configuration group - // priory to scanning configuration roots. This is useful as we get indication of whether the config items are part - // of a configuration section (i.e. configuration group) we are current scanning. - if (configSection.isShowSection() || !generateSeparateConfigGroupDocs) { - final ConfigDocItem configDocItem = new ConfigDocItem(); - configDocItem.setConfigDocSection(configSection); - configDocItems.add(configDocItem); - configSection.addConfigDocItems(groupConfigItems); - } else { - configDocItems.addAll(groupConfigItems); - } - - if (generateSeparateConfigGroupDocs) { - addConfigGroupItemToHolder(configDocItems, configGroup); - } - - return configDocItems; - } - - /** - * Add some information which are missing from configuration items scanned from configuration groups. - * The missing information come from configuration roots and these are config phase, top level root name and parent name (as - * we are traversing down the tree) - */ - private List decorateGroupItems( - List groupConfigItems, - ConfigPhase configPhase, - String topLevelRootName, - String parentName, - List additionalNames, - boolean withinAMap, - boolean generateSeparateConfigGroupDocs) { - - List decoratedItems = new ArrayList<>(); - for (ConfigDocItem configDocItem : groupConfigItems) { - if (configDocItem.isConfigKey()) { - ConfigDocKey configDocKey = configDocItem.getConfigDocKey(); - configDocKey.setConfigPhase(configPhase); - configDocKey.setWithinAMap(configDocKey.isWithinAMap() || withinAMap); - configDocKey.setWithinAConfigGroup(true); - configDocKey.setTopLevelGrouping(topLevelRootName); - List additionalKeys = new ArrayList<>(); - for (String key : configDocKey.getAdditionalKeys()) { - additionalKeys.add(parentName + key); - for (String name : additionalNames) { - additionalKeys.add(name + key); - } - } - additionalKeys.addAll(additionalNames.stream().map(k -> k + configDocKey.getKey()).collect(toList())); - configDocKey.setAdditionalKeys(additionalKeys); - configDocKey.setKey(parentName + configDocKey.getKey()); - configDocKey.setEnvironmentVariable( - DocGeneratorUtil.toEnvVarName(parentName) + configDocKey.getEnvironmentVariable()); - decoratedItems.add(configDocItem); - } else { - ConfigDocSection section = configDocItem.getConfigDocSection(); - section.setConfigPhase(configPhase); - section.setTopLevelGrouping(topLevelRootName); - section.setWithinAMap(section.isWithinAMap() || withinAMap); - section.setName(parentName + section.getName()); - List configDocItems = decorateGroupItems( - section.getConfigDocItems(), - configPhase, - topLevelRootName, - parentName, - additionalNames, - section.isWithinAMap(), - generateSeparateConfigGroupDocs); - String configGroupType = section.getConfigGroupType(); - if (generateSeparateConfigGroupDocs) { - addConfigGroupItemToHolder(configDocItems, configGroupType); - } - - if (section.isShowSection()) { - decoratedItems.add(configDocItem); - } else { - decoratedItems.addAll(configDocItems); - } - } - } - - return decoratedItems; - } - - private void addConfigGroupItemToHolder(List configDocItems, String configGroupType) { - List previousConfigGroupConfigItems = holder.getConfigGroupConfigItems() - .get(configGroupType); - if (previousConfigGroupConfigItems == null) { - holder.addConfigGroupItems(configGroupType, configDocItems); - } else { - previousConfigGroupConfigItems.addAll(configDocItems); - } - } -} diff --git a/core/processor/src/main/java/io/quarkus/annotation/processor/generate_doc/ConfigDocItemScanner.java b/core/processor/src/main/java/io/quarkus/annotation/processor/generate_doc/ConfigDocItemScanner.java deleted file mode 100644 index 43d212c9393b4..0000000000000 --- a/core/processor/src/main/java/io/quarkus/annotation/processor/generate_doc/ConfigDocItemScanner.java +++ /dev/null @@ -1,289 +0,0 @@ -package io.quarkus.annotation.processor.generate_doc; - -import static io.quarkus.annotation.processor.generate_doc.DocGeneratorUtil.computeConfigGroupDocFileName; -import static io.quarkus.annotation.processor.generate_doc.DocGeneratorUtil.computeConfigRootDocFileName; -import static io.quarkus.annotation.processor.generate_doc.DocGeneratorUtil.getName; - -import java.io.IOException; -import java.util.ArrayList; -import java.util.HashMap; -import java.util.HashSet; -import java.util.List; -import java.util.Map; -import java.util.Map.Entry; -import java.util.Properties; -import java.util.Set; -import java.util.regex.Matcher; -import java.util.stream.Collectors; - -import javax.lang.model.element.AnnotationMirror; -import javax.lang.model.element.AnnotationValue; -import javax.lang.model.element.ExecutableElement; -import javax.lang.model.element.PackageElement; -import javax.lang.model.element.TypeElement; - -final public class ConfigDocItemScanner { - private static final String IO_QUARKUS_TEST_EXTENSION_PACKAGE = "io.quarkus.extest."; - - private final Set configRoots = new HashSet<>(); - private final Map configGroupsToTypeElement = new HashMap<>(); - - private final FsMap allExtensionGeneratedDocs; - private final FsMap allConfigGroupGeneratedDocs; - private final FsMultiMap configurationRootsParExtensionFileName; - - public ConfigDocItemScanner() { - this.allExtensionGeneratedDocs = new FsMap(Constants.GENERATED_DOCS_PATH - .resolve("all-configuration-roots-generated-doc")); - this.allConfigGroupGeneratedDocs = new FsMap(Constants.GENERATED_DOCS_PATH - .resolve("all-configuration-groups-generated-doc")); - this.configurationRootsParExtensionFileName = new FsMultiMap(Constants.GENERATED_DOCS_PATH - .resolve("extensions-configuration-roots-list")); - - } - - /** - * Record configuration group. It will later be visited to find configuration items. - */ - public void addConfigGroups(TypeElement configGroup) { - String configGroupName = configGroup.getQualifiedName().toString(); - if (configGroupName.startsWith(IO_QUARKUS_TEST_EXTENSION_PACKAGE)) { - return; - } - - configGroupsToTypeElement.put(configGroupName, configGroup); - } - - /** - * Record a configuration root class. It will later be visited to find configuration items. - */ - public void addConfigRoot(final PackageElement pkg, TypeElement clazz) { - if (pkg.toString().startsWith(IO_QUARKUS_TEST_EXTENSION_PACKAGE)) { - return; - } - - String prefix = Constants.QUARKUS; - ConfigPhase configPhase = ConfigPhase.BUILD_TIME; - - for (AnnotationMirror annotationMirror : clazz.getAnnotationMirrors()) { - String annotationName = annotationMirror.getAnnotationType().toString(); - if (annotationName.equals(Constants.ANNOTATION_CONFIG_ROOT)) { - final Map elementValues = annotationMirror - .getElementValues(); - String name = Constants.HYPHENATED_ELEMENT_NAME; - for (Map.Entry entry : elementValues.entrySet()) { - final String key = entry.getKey().toString(); - final String value = entry.getValue().getValue().toString(); - if ("name()".equals(key)) { - name = value; - } else if ("phase()".equals(key)) { - configPhase = ConfigPhase.valueOf(value); - } else if ("prefix()".equals(key)) { - prefix = value; - } - } - - for (AnnotationMirror mirror : clazz.getAnnotationMirrors()) { - if (mirror.getAnnotationType().toString().equals(Constants.ANNOTATION_CONFIG_MAPPING)) { - name = Constants.EMPTY; - for (Entry entry : mirror.getElementValues() - .entrySet()) { - if ("prefix()".equals(entry.getKey().toString())) { - prefix = entry.getValue().getValue().toString(); - } - } - } - } - - String docFileName = null; - for (AnnotationMirror mirror : clazz.getAnnotationMirrors()) { - if (mirror.getAnnotationType().toString().equals(Constants.ANNOTATION_CONFIG_DOC_FILE_NAME)) { - for (Entry entry : mirror.getElementValues() - .entrySet()) { - if ("value()".equals(entry.getKey().toString())) { - docFileName = entry.getValue().getValue().toString(); - break; - } - } - break; - } - } - - name = getName(prefix, name, clazz.getSimpleName().toString(), configPhase); - if (name.endsWith(Constants.DOT + Constants.PARENT)) { - // take into account the root case which would contain characters that can't be used to create the final file - name = name.replace(Constants.DOT + Constants.PARENT, ""); - } - - if (docFileName == null || docFileName.isEmpty()) { - final Matcher pkgMatcher = Constants.PKG_PATTERN.matcher(pkg.toString()); - if (pkgMatcher.find()) { - docFileName = DocGeneratorUtil.computeExtensionDocFileName(clazz.toString()); - } else { - docFileName = name.replace(Constants.DOT, Constants.DASH.charAt(0)) - + Constants.ADOC_EXTENSION; - } - } - ConfigRootInfo configRootInfo = new ConfigRootInfo(name, clazz, configPhase, docFileName); - configRoots.add(configRootInfo); - break; - } - } - } - - public Set scanExtensionsConfigurationItems(Properties javaDocProperties, boolean configMapping) - throws IOException { - - Set configDocGeneratedOutputs = new HashSet<>(); - final ConfigDocItemFinder configDocItemFinder = new ConfigDocItemFinder(configRoots, configGroupsToTypeElement, - javaDocProperties, allConfigGroupGeneratedDocs, allExtensionGeneratedDocs, configMapping); - final ScannedConfigDocsItemHolder inMemoryScannedItemsHolder = configDocItemFinder.findInMemoryConfigurationItems(); - - if (!inMemoryScannedItemsHolder.isEmpty()) { - updateScannedExtensionArtifactFiles(inMemoryScannedItemsHolder); - } - - Set allConfigItemsPerExtension = generateAllConfigItemsOutputs(inMemoryScannedItemsHolder); - Set configGroupConfigItems = generateAllConfigGroupOutputs(inMemoryScannedItemsHolder); - Set configRootConfigItems = generateAllConfigRootOutputs(inMemoryScannedItemsHolder); - - configDocGeneratedOutputs.addAll(configGroupConfigItems); - configDocGeneratedOutputs.addAll(allConfigItemsPerExtension); - configDocGeneratedOutputs.addAll(configRootConfigItems); - - return configDocGeneratedOutputs; - } - - /** - * Loads the list of configuration items per configuration root - * - */ - private Properties loadAllExtensionConfigItemsParConfigRoot() { - return allExtensionGeneratedDocs.asProperties(); - } - - /** - * Update extensions config roots. We need to gather the complete list of configuration roots of an extension - * when generating the documentation. - * - */ - private void updateConfigurationRootsList(Map.Entry> entry) { - String extensionFileName = entry.getKey().getFileName(); - String clazz = entry.getKey().getClazz().getQualifiedName().toString(); - configurationRootsParExtensionFileName.put(extensionFileName, clazz); - } - - private void updateScannedExtensionArtifactFiles(ScannedConfigDocsItemHolder inMemoryScannedItemsHolder) - throws IOException { - - for (Map.Entry> entry : inMemoryScannedItemsHolder.getConfigRootConfigItems() - .entrySet()) { - String serializableConfigRootDoc = Constants.OBJECT_MAPPER.writeValueAsString(entry.getValue()); - String clazz = entry.getKey().getClazz().getQualifiedName().toString(); - allExtensionGeneratedDocs.put(clazz, serializableConfigRootDoc); - updateConfigurationRootsList(entry); - } - - } - - private Set generateAllConfigItemsOutputs(ScannedConfigDocsItemHolder inMemoryScannedItemsHolder) - throws IOException { - Set outputs = new HashSet<>(); - - Set extensionFileNamesToGenerate = inMemoryScannedItemsHolder - .getConfigRootConfigItems() - .keySet() - .stream() - .map(ConfigRootInfo::getFileName) - .collect(Collectors.toSet()); - - for (String extensionFileName : extensionFileNamesToGenerate) { - List extensionConfigItems = new ArrayList<>(); - - for (String configRoot : configurationRootsParExtensionFileName.get(extensionFileName)) { - - List configDocItems = inMemoryScannedItemsHolder.getConfigItemsByRootClassName(configRoot); - if (configDocItems == null) { - String serializedContent = allExtensionGeneratedDocs.get(configRoot); - configDocItems = Constants.OBJECT_MAPPER.readValue(serializedContent, - Constants.LIST_OF_CONFIG_ITEMS_TYPE_REF); - } - - DocGeneratorUtil.appendConfigItemsIntoExistingOnes(extensionConfigItems, configDocItems); - } - - outputs.add(new ConfigDocGeneratedOutput(extensionFileName, true, extensionConfigItems, true)); - - List generalConfigItems = extensionConfigItems - .stream() - .filter(ConfigDocItem::isWithinAConfigGroup) - .collect(Collectors.toList()); - - if (!generalConfigItems.isEmpty()) { - String fileName = extensionFileName.replaceAll("\\.adoc$", "-general-config-items.adoc"); - outputs.add(new ConfigDocGeneratedOutput(fileName, false, generalConfigItems, true)); - } - - } - - return outputs; - } - - private Set generateAllConfigGroupOutputs( - ScannedConfigDocsItemHolder inMemoryScannedItemsHolder) { - - return inMemoryScannedItemsHolder - .getConfigGroupConfigItems() - .entrySet() - .stream() - .map(entry -> new ConfigDocGeneratedOutput(computeConfigGroupDocFileName(entry.getKey()), false, - entry.getValue(), true)) - .collect(Collectors.toSet()); - } - - private Set generateAllConfigRootOutputs(ScannedConfigDocsItemHolder inMemoryScannedItemsHolder) { - Set outputs = new HashSet<>(); - for (ConfigRootInfo configRootInfo : configRoots) { - String clazz = configRootInfo.getClazz().getQualifiedName().toString(); - List configDocItems = inMemoryScannedItemsHolder.getConfigItemsByRootClassName(clazz); - String fileName = computeConfigRootDocFileName(clazz, configRootInfo.getName()); - outputs.add(new ConfigDocGeneratedOutput(fileName, false, configDocItems, true)); - } - - return outputs; - } - - /** - * Return a Map structure which contains extension name as key and generated doc value. - */ - public Map> loadAllExtensionsConfigurationItems() - throws IOException { - - final Properties allExtensionGeneratedDocs = loadAllExtensionConfigItemsParConfigRoot(); - - final Map> foundExtensionConfigurationItems = new HashMap<>(); - - for (Entry entry : allExtensionGeneratedDocs.entrySet()) { - - final String serializedContent = (String) entry.getValue(); - if (serializedContent == null) { - continue; - } - - List configDocItems = Constants.OBJECT_MAPPER.readValue(serializedContent, - Constants.LIST_OF_CONFIG_ITEMS_TYPE_REF); - - foundExtensionConfigurationItems.put((String) entry.getKey(), configDocItems); - } - - return foundExtensionConfigurationItems; - } - - @Override - public String toString() { - return "ConfigDocItemScanner{" + - "configRoots=" + configRoots + - ", configGroups=" + configGroupsToTypeElement + - '}'; - } -} diff --git a/core/processor/src/main/java/io/quarkus/annotation/processor/generate_doc/ConfigDocKey.java b/core/processor/src/main/java/io/quarkus/annotation/processor/generate_doc/ConfigDocKey.java deleted file mode 100644 index f6733e7a30187..0000000000000 --- a/core/processor/src/main/java/io/quarkus/annotation/processor/generate_doc/ConfigDocKey.java +++ /dev/null @@ -1,259 +0,0 @@ -package io.quarkus.annotation.processor.generate_doc; - -import java.io.IOException; -import java.io.Writer; -import java.util.ArrayList; -import java.util.List; -import java.util.Objects; -import java.util.regex.Matcher; - -final public class ConfigDocKey implements ConfigDocElement, Comparable { - private String type; - private String key; - private List additionalKeys = new ArrayList<>(); - private String configDoc; - private boolean withinAMap; - private String defaultValue; - private String javaDocSiteLink; - private String docMapKey; - private ConfigPhase configPhase; - private List acceptedValues; - private boolean optional; - private boolean list; - private boolean withinAConfigGroup; - // if a key is "quarkus.kubernetes.part-of", then the value of this would be "kubernetes" - private String topLevelGrouping; - private boolean isEnum; - private String since; - private String environmentVariable; - - public ConfigDocKey() { - } - - public boolean hasType() { - return type != null && !type.isEmpty(); - } - - public String getType() { - return type; - } - - public void setType(String type) { - this.type = type; - } - - public boolean hasAcceptedValues() { - return acceptedValues != null && !acceptedValues.isEmpty(); - } - - public List getAcceptedValues() { - return acceptedValues; - } - - public void setAcceptedValues(List acceptedValues) { - this.acceptedValues = acceptedValues; - } - - public String getKey() { - return key; - } - - public void setKey(String key) { - this.key = key; - } - - public List getAdditionalKeys() { - return additionalKeys; - } - - public void setAdditionalKeys(final List additionalKeys) { - this.additionalKeys = additionalKeys; - } - - public void setTopLevelGrouping(String topLevelGrouping) { - this.topLevelGrouping = topLevelGrouping; - } - - public String getConfigDoc() { - return configDoc; - } - - public void setConfigDoc(String configDoc) { - this.configDoc = configDoc; - } - - public String getJavaDocSiteLink() { - if (javaDocSiteLink == null) { - return Constants.EMPTY; - } - - return javaDocSiteLink; - } - - public void setJavaDocSiteLink(String javaDocSiteLink) { - this.javaDocSiteLink = javaDocSiteLink; - } - - public String getDefaultValue() { - if (!defaultValue.isEmpty()) { - return defaultValue; - } - - final String defaultValue = DocGeneratorUtil.getPrimitiveDefaultValue(type); - - if (defaultValue == null) { - return Constants.EMPTY; - } - - return defaultValue; - } - - public void setDefaultValue(String defaultValue) { - this.defaultValue = defaultValue; - } - - public ConfigPhase getConfigPhase() { - return configPhase; - } - - public void setConfigPhase(ConfigPhase configPhase) { - this.configPhase = configPhase; - } - - public void setWithinAMap(boolean withinAMap) { - this.withinAMap = withinAMap; - } - - @SuppressWarnings("unused") - public boolean isWithinAMap() { - return withinAMap; - } - - public String computeTypeSimpleName() { - String unwrappedType = DocGeneratorUtil.unbox(type); - - Matcher matcher = Constants.CLASS_NAME_PATTERN.matcher(unwrappedType); - if (matcher.find()) { - return matcher.group(1); - } - - return unwrappedType; - } - - public void setOptional(boolean optional) { - this.optional = optional; - } - - public boolean isOptional() { - return optional; - } - - public void setList(boolean list) { - this.list = list; - } - - public boolean isList() { - return list; - } - - public String getDocMapKey() { - return docMapKey; - } - - public void setDocMapKey(String docMapKey) { - this.docMapKey = docMapKey; - } - - public boolean isWithinAConfigGroup() { - return withinAConfigGroup; - } - - public void setWithinAConfigGroup(boolean withinAConfigGroup) { - this.withinAConfigGroup = withinAConfigGroup; - } - - public String getTopLevelGrouping() { - return topLevelGrouping; - } - - public boolean isEnum() { - return isEnum; - } - - public void setEnum(boolean anEnum) { - isEnum = anEnum; - } - - public String getSince() { - return since; - } - - public void setSince(String since) { - this.since = since; - } - - public String getEnvironmentVariable() { - return environmentVariable; - } - - public void setEnvironmentVariable(String environmentVariable) { - this.environmentVariable = environmentVariable; - } - - @Override - public void accept(Writer writer, DocFormatter docFormatter) throws IOException { - docFormatter.format(writer, this); - } - - @Override - public int compareTo(ConfigDocElement o) { - return compare(o); - } - - @Override - public boolean equals(Object o) { - if (this == o) - return true; - if (o == null || getClass() != o.getClass()) - return false; - ConfigDocKey that = (ConfigDocKey) o; - return withinAMap == that.withinAMap && - optional == that.optional && - list == that.list && - withinAConfigGroup == that.withinAConfigGroup && - Objects.equals(type, that.type) && - Objects.equals(key, that.key) && - Objects.equals(configDoc, that.configDoc) && - Objects.equals(defaultValue, that.defaultValue) && - Objects.equals(javaDocSiteLink, that.javaDocSiteLink) && - Objects.equals(docMapKey, that.docMapKey) && - configPhase == that.configPhase && - Objects.equals(acceptedValues, that.acceptedValues) && - Objects.equals(topLevelGrouping, that.topLevelGrouping); - } - - @Override - public int hashCode() { - return Objects.hash(type, key, configDoc, withinAMap, defaultValue, javaDocSiteLink, docMapKey, configPhase, - acceptedValues, optional, list, withinAConfigGroup, topLevelGrouping); - } - - @Override - public String toString() { - return "ConfigDocKey{" + - "type='" + type + '\'' + - ", key='" + key + '\'' + - ", configDoc='" + configDoc + '\'' + - ", withinAMap=" + withinAMap + - ", defaultValue='" + defaultValue + '\'' + - ", javaDocSiteLink='" + javaDocSiteLink + '\'' + - ", docMapKey='" + docMapKey + '\'' + - ", configPhase=" + configPhase + - ", acceptedValues=" + acceptedValues + - ", optional=" + optional + - ", list=" + list + - ", withinAConfigGroup=" + withinAConfigGroup + - ", topLevelGrouping='" + topLevelGrouping + '\'' + - '}'; - } -} diff --git a/core/processor/src/main/java/io/quarkus/annotation/processor/generate_doc/ConfigDocSection.java b/core/processor/src/main/java/io/quarkus/annotation/processor/generate_doc/ConfigDocSection.java deleted file mode 100644 index ff04da6813831..0000000000000 --- a/core/processor/src/main/java/io/quarkus/annotation/processor/generate_doc/ConfigDocSection.java +++ /dev/null @@ -1,173 +0,0 @@ -package io.quarkus.annotation.processor.generate_doc; - -import java.io.IOException; -import java.io.Writer; -import java.util.ArrayList; -import java.util.List; -import java.util.Objects; - -final public class ConfigDocSection implements ConfigDocElement, Comparable { - private String name; - private boolean optional; - private boolean withinAMap; - private String sectionDetails; - private String sectionDetailsTitle; - private ConfigPhase configPhase; - private String topLevelGrouping; - private String configGroupType; - private boolean showSection; - - private List configDocItems = new ArrayList<>(); - private String anchorPrefix; - - public ConfigDocSection() { - } - - public String getConfigGroupType() { - return configGroupType; - } - - public void setConfigGroupType(String configGroupType) { - this.configGroupType = configGroupType; - } - - public boolean isShowSection() { - return showSection; - } - - public void setShowSection(boolean showSection) { - this.showSection = showSection; - } - - public boolean isWithinAMap() { - return withinAMap; - } - - public void setWithinAMap(boolean withinAMap) { - this.withinAMap = withinAMap; - } - - public ConfigPhase getConfigPhase() { - return configPhase; - } - - public void setConfigPhase(ConfigPhase configPhase) { - this.configPhase = configPhase; - } - - public String getName() { - return name; - } - - public void setName(String name) { - this.name = name; - } - - public String getSectionDetails() { - return sectionDetails; - } - - public void setSectionDetails(String sectionDetails) { - this.sectionDetails = sectionDetails; - } - - public String getSectionDetailsTitle() { - return sectionDetailsTitle; - } - - public void setSectionDetailsTitle(String sectionDetailsTitle) { - this.sectionDetailsTitle = sectionDetailsTitle; - } - - public List getConfigDocItems() { - return configDocItems; - } - - public void setConfigDocItems(List configDocItems) { - this.configDocItems = configDocItems; - } - - public void addConfigDocItems(List configDocItems) { - this.configDocItems.addAll(configDocItems); - } - - @Override - public void accept(Writer writer, DocFormatter docFormatter) throws IOException { - docFormatter.format(writer, this); - } - - @Override - public int compareTo(ConfigDocElement o) { - return compare(o); - } - - @Override - public boolean equals(Object o) { - if (this == o) - return true; - if (o == null || getClass() != o.getClass()) - return false; - ConfigDocSection that = (ConfigDocSection) o; - return sectionDetailsTitle.equals(that.sectionDetailsTitle); - } - - @Override - public int hashCode() { - return Objects.hash(sectionDetailsTitle); - } - - @Override - public String toString() { - return "ConfigDocSection{" + - "name='" + name + '\'' + - ", optional=" + optional + - ", withinAMap=" + withinAMap + - ", sectionDetails='" + sectionDetails + '\'' + - ", sectionDetailsTitle='" + sectionDetailsTitle + '\'' + - ", configPhase=" + configPhase + - ", topLevelGrouping='" + topLevelGrouping + '\'' + - ", configDocItems=" + configDocItems + - ", anchorPrefix='" + anchorPrefix + '\'' + - '}'; - } - - public boolean hasDurationInformationNote() { - for (ConfigDocItem item : configDocItems) { - if (item.hasDurationInformationNote()) - return true; - } - return false; - } - - public boolean hasMemoryInformationNote() { - for (ConfigDocItem item : configDocItems) { - if (item.hasMemoryInformationNote()) - return true; - } - return false; - } - - public void setAnchorPrefix(String anchorPrefix) { - this.anchorPrefix = anchorPrefix; - } - - public String getAnchorPrefix() { - return anchorPrefix; - } - - public boolean isOptional() { - return optional; - } - - public void setOptional(boolean optional) { - this.optional = optional; - } - - public String getTopLevelGrouping() { - return topLevelGrouping; - } - - public void setTopLevelGrouping(String topLevelGrouping) { - this.topLevelGrouping = topLevelGrouping; - } -} diff --git a/core/processor/src/main/java/io/quarkus/annotation/processor/generate_doc/ConfigDocWriter.java b/core/processor/src/main/java/io/quarkus/annotation/processor/generate_doc/ConfigDocWriter.java deleted file mode 100644 index 773cab80eae2b..0000000000000 --- a/core/processor/src/main/java/io/quarkus/annotation/processor/generate_doc/ConfigDocWriter.java +++ /dev/null @@ -1,45 +0,0 @@ -package io.quarkus.annotation.processor.generate_doc; - -import java.io.IOException; -import java.io.Writer; -import java.nio.file.Files; -import java.nio.file.Path; - -final public class ConfigDocWriter { - - /** - * Write all extension configuration in AsciiDoc format in `{root}/target/asciidoc/generated/config/` directory - */ - public void writeAllExtensionConfigDocumentation(ConfigDocGeneratedOutput output) - throws IOException { - - if (output.getConfigDocItems().isEmpty()) { - return; - } - - // Create single summary table - final var configDocBuilder = new ConfigDocBuilder().addSummaryTable(output.getAnchorPrefix(), output.isSearchable(), - output.getConfigDocItems(), output.getFileName(), true); - - generateDocumentation(output.getFileName(), configDocBuilder); - } - - public void generateDocumentation(String fileName, ConfigDocBuilder configDocBuilder) throws IOException { - generateDocumentation( - // Resolve output file path - Constants.GENERATED_DOCS_PATH.resolve(fileName), - // Write all items - configDocBuilder.build()); - } - - private void generateDocumentation(Path targetPath, ConfigDoc configDoc) - throws IOException { - try (Writer writer = Files.newBufferedWriter(targetPath)) { - for (ConfigDoc.WriteItem writeItem : configDoc.getWriteItems()) { - // Write documentation item, f.e. summary table - writeItem.accept(writer); - } - } - } - -} diff --git a/core/processor/src/main/java/io/quarkus/annotation/processor/generate_doc/ConfigPhase.java b/core/processor/src/main/java/io/quarkus/annotation/processor/generate_doc/ConfigPhase.java deleted file mode 100644 index 95d47e7b6cf6b..0000000000000 --- a/core/processor/src/main/java/io/quarkus/annotation/processor/generate_doc/ConfigPhase.java +++ /dev/null @@ -1,78 +0,0 @@ -package io.quarkus.annotation.processor.generate_doc; - -import java.util.Comparator; - -public enum ConfigPhase implements Comparable { - RUN_TIME("The configuration is overridable at runtime", "", "RunTime"), - BUILD_TIME("The configuration is not overridable at runtime", Constants.CONFIG_PHASE_BUILD_TIME_ILLUSTRATION, "BuildTime"), - BUILD_AND_RUN_TIME_FIXED("The configuration is not overridable at runtime", Constants.CONFIG_PHASE_BUILD_TIME_ILLUSTRATION, - "BuildTime"); - - static final Comparator COMPARATOR = new Comparator() { - /** - * Order built time phase first - * Then build time run time fixed phase - * Then runtime one - */ - @Override - public int compare(ConfigPhase firstPhase, ConfigPhase secondPhase) { - switch (firstPhase) { - case BUILD_TIME: { - switch (secondPhase) { - case BUILD_TIME: - return 0; - default: - return -1; - } - } - case BUILD_AND_RUN_TIME_FIXED: { - switch (secondPhase) { - case BUILD_TIME: - return 1; - case BUILD_AND_RUN_TIME_FIXED: - return 0; - default: - return -1; - } - } - case RUN_TIME: { - switch (secondPhase) { - case RUN_TIME: - return 0; - default: - return 1; - } - } - default: - return 0; - } - } - }; - - private String description; - private String illustration; - private String configSuffix; - - ConfigPhase(String description, String illustration, String configSuffix) { - this.description = description; - this.illustration = illustration; - this.configSuffix = configSuffix; - } - - @Override - public String toString() { - return "ConfigPhase{" + - "description='" + description + '\'' + - ", illustration='" + illustration + '\'' + - ", configSuffix='" + configSuffix + '\'' + - '}'; - } - - public String getIllustration() { - return illustration; - } - - public String getConfigSuffix() { - return configSuffix; - } -} diff --git a/core/processor/src/main/java/io/quarkus/annotation/processor/generate_doc/ConfigRootInfo.java b/core/processor/src/main/java/io/quarkus/annotation/processor/generate_doc/ConfigRootInfo.java deleted file mode 100644 index 786c07fc87186..0000000000000 --- a/core/processor/src/main/java/io/quarkus/annotation/processor/generate_doc/ConfigRootInfo.java +++ /dev/null @@ -1,69 +0,0 @@ -package io.quarkus.annotation.processor.generate_doc; - -import java.util.Objects; - -import javax.lang.model.element.TypeElement; - -final public class ConfigRootInfo { - private final String name; - private final TypeElement clazz; - private final ConfigPhase configPhase; - private final String fileName; - - public ConfigRootInfo( - final String name, - final TypeElement clazz, - final ConfigPhase configPhase, - final String fileName) { - this.name = name; - this.clazz = clazz; - this.configPhase = configPhase; - this.fileName = fileName; - } - - public String getFileName() { - return fileName; - } - - @Override - public boolean equals(final Object o) { - if (this == o) { - return true; - } - if (o == null || getClass() != o.getClass()) { - return false; - } - final ConfigRootInfo that = (ConfigRootInfo) o; - return name.equals(that.name) && - clazz.equals(that.clazz) && - configPhase == that.configPhase && - fileName.equals(that.fileName); - } - - @Override - public int hashCode() { - return Objects.hash(name, clazz, configPhase, fileName); - } - - @Override - public String toString() { - return "ConfigRootInfo{" + - "name='" + name + '\'' + - ", clazz=" + clazz + - ", configPhase=" + configPhase + - ", fileName='" + fileName + '\'' + - '}'; - } - - public String getName() { - return name; - } - - public TypeElement getClazz() { - return clazz; - } - - public ConfigPhase getConfigPhase() { - return configPhase; - } -} diff --git a/core/processor/src/main/java/io/quarkus/annotation/processor/generate_doc/Constants.java b/core/processor/src/main/java/io/quarkus/annotation/processor/generate_doc/Constants.java deleted file mode 100644 index 75ce923e755dd..0000000000000 --- a/core/processor/src/main/java/io/quarkus/annotation/processor/generate_doc/Constants.java +++ /dev/null @@ -1,139 +0,0 @@ -package io.quarkus.annotation.processor.generate_doc; - -import java.nio.file.Path; -import java.nio.file.Paths; -import java.time.Duration; -import java.util.List; -import java.util.Map; -import java.util.OptionalDouble; -import java.util.OptionalInt; -import java.util.OptionalLong; -import java.util.Properties; -import java.util.Set; -import java.util.regex.Pattern; - -import com.fasterxml.jackson.core.type.TypeReference; -import com.fasterxml.jackson.databind.ObjectMapper; - -final public class Constants { - public static final ObjectMapper OBJECT_MAPPER = new ObjectMapper(); - public static TypeReference> LIST_OF_CONFIG_ITEMS_TYPE_REF = new TypeReference<>() { - }; - - public static final char DOT = '.'; - public static final String CODE_DELIMITER = "`"; - public static final String EMPTY = ""; - public static final String DASH = "-"; - public static final String ADOC_EXTENSION = ".adoc"; - public static final String DIGIT_OR_LOWERCASE = "^[a-z0-9]+$"; - public static final String NEW_LINE = "\n"; - public static final String SECTION_TITLE_L1 = "= "; - - public static final String PARENT = "<>"; - public static final String NO_DEFAULT = "<>"; - public static final String HYPHENATED_ELEMENT_NAME = "<>"; - - public static final String COMMON = "common"; - public static final String RUNTIME = "runtime"; - public static final String DEPLOYMENT = "deployment"; - public static final String CONFIG = "config"; - - public static final Pattern CLASS_NAME_PATTERN = Pattern.compile("^.+[\\.$](\\w+)$"); - public static final Pattern PKG_PATTERN = Pattern - .compile("^io\\.quarkus\\.(\\w+)\\.?(\\w+)?\\.?(\\w+)?\\.?(\\w+)?\\.?(\\w+)?"); - - public static final String INSTANCE_SYM = "__instance"; - public static final String QUARKUS = "quarkus"; - - public static final String ANNOTATION_RECORDER = "io.quarkus.runtime.annotations.Recorder"; - public static final String ANNOTATION_RECORD = "io.quarkus.deployment.annotations.Record"; - - public static final String MEMORY_SIZE_TYPE = "io.quarkus.runtime.configuration.MemorySize"; - public static final String ANNOTATION_CONFIG_ITEM = "io.quarkus.runtime.annotations.ConfigItem"; - public static final String ANNOTATION_BUILD_STEP = "io.quarkus.deployment.annotations.BuildStep"; - public static final String ANNOTATION_CONFIG_ROOT = "io.quarkus.runtime.annotations.ConfigRoot"; - public static final String ANNOTATION_CONFIG_MAPPING = "io.smallrye.config.ConfigMapping"; - public static final String ANNOTATION_DEFAULT_CONVERTER = "io.quarkus.runtime.annotations.DefaultConverter"; - public static final String ANNOTATION_CONVERT_WITH = "io.quarkus.runtime.annotations.ConvertWith"; - public static final String ANNOTATION_CONFIG_GROUP = "io.quarkus.runtime.annotations.ConfigGroup"; - public static final String ANNOTATION_CONFIG_DOC_IGNORE = "io.quarkus.runtime.annotations.ConfigDocIgnore"; - public static final String ANNOTATION_CONFIG_DOC_MAP_KEY = "io.quarkus.runtime.annotations.ConfigDocMapKey"; - public static final String ANNOTATION_CONFIG_DOC_SECTION = "io.quarkus.runtime.annotations.ConfigDocSection"; - public static final String ANNOTATION_CONFIG_DOC_ENUM_VALUE = "io.quarkus.runtime.annotations.ConfigDocEnumValue"; - public static final String ANNOTATION_CONFIG_DOC_DEFAULT = "io.quarkus.runtime.annotations.ConfigDocDefault"; - public static final String ANNOTATION_CONFIG_DOC_FILE_NAME = "io.quarkus.runtime.annotations.ConfigDocFilename"; - - public static final String ANNOTATION_CONFIG_WITH_NAME = "io.smallrye.config.WithName"; - public static final String ANNOTATION_CONFIG_WITH_PARENT_NAME = "io.smallrye.config.WithParentName"; - public static final String ANNOTATION_CONFIG_WITH_DEFAULT = "io.smallrye.config.WithDefault"; - public static final String ANNOTATION_CONFIG_WITH_UNNAMED_KEY = "io.smallrye.config.WithUnnamedKey"; - - public static final Set SUPPORTED_ANNOTATIONS_TYPES = Set.of(ANNOTATION_BUILD_STEP, ANNOTATION_CONFIG_GROUP, - ANNOTATION_CONFIG_ROOT, ANNOTATION_RECORDER, ANNOTATION_CONFIG_MAPPING); - - public static final Map ALIASED_TYPES = Map.of( - OptionalLong.class.getName(), Long.class.getName(), - OptionalInt.class.getName(), Integer.class.getName(), - OptionalDouble.class.getName(), Double.class.getName(), - "java.lang.Class", "class name", - "java.net.InetSocketAddress", "host:port", - Path.class.getName(), "path", - String.class.getName(), "string"); - - private static final Properties SYSTEM_PROPERTIES = System.getProperties(); - - private static final String DOCS_SRC_MAIN_ASCIIDOC_GENERATED = "/target/asciidoc/generated/config/"; - private static final String DOCS_OUT_DIR = System.getProperty("quarkus.docsOutputDir", - SYSTEM_PROPERTIES.getProperty("maven.multiModuleProjectDirectory", ".")); - public static final Path GENERATED_DOCS_PATH = Paths.get(DOCS_OUT_DIR + DOCS_SRC_MAIN_ASCIIDOC_GENERATED).toAbsolutePath(); - public static final String SUMMARY_TABLE_ID_VARIABLE = "summaryTableId"; - public static final String DURATION_NOTE_ANCHOR = String.format("duration-note-anchor-{%s}", - SUMMARY_TABLE_ID_VARIABLE); - public static final String MEMORY_SIZE_NOTE_ANCHOR = "memory-size-note-anchor"; - public static final String MORE_INFO_ABOUT_TYPE_FORMAT = " link:#%s[icon:question-circle[title=More information about the %s format]]"; - public static final String DURATION_INFORMATION = String.format(Constants.MORE_INFO_ABOUT_TYPE_FORMAT, - Constants.DURATION_NOTE_ANCHOR, Duration.class.getSimpleName()); - public static final String MEMORY_SIZE_INFORMATION = String.format(Constants.MORE_INFO_ABOUT_TYPE_FORMAT, - Constants.MEMORY_SIZE_NOTE_ANCHOR, "MemorySize"); - - public static final String CONFIG_PHASE_BUILD_TIME_ILLUSTRATION = "icon:lock[title=Fixed at build time]"; - public static final String CONFIG_PHASE_LEGEND = String.format( - "%n%s Configuration property fixed at build time - All other configuration properties are overridable at runtime", - CONFIG_PHASE_BUILD_TIME_ILLUSTRATION); - - public static final String DURATION_FORMAT_NOTE = "\nifndef::no-duration-note[]\n[NOTE]" + - "\n[id='" + DURATION_NOTE_ANCHOR + "']\n" + - ".About the Duration format\n" + - "====\n" + - "To write duration values, use the standard `java.time.Duration` format.\n" + - "See the link:https://docs.oracle.com/en/java/javase/17/docs/api/java.base/java/time/Duration.html#parse(java.lang.CharSequence)[Duration#parse() Java API documentation] for more information.\n" - + - "\n" + - "You can also use a simplified format, starting with a number:\n" + - "\n" + - "* If the value is only a number, it represents time in seconds.\n" + - "* If the value is a number followed by `ms`, it represents time in milliseconds.\n" + - "\n" + - "In other cases, the simplified format is translated to the `java.time.Duration` format for parsing:\n" + - "\n" + - "* If the value is a number followed by `h`, `m`, or `s`, it is prefixed with `PT`.\n" + - "* If the value is a number followed by `d`, it is prefixed with `P`" + - ".\n" + - "====\n" + - "endif::no-duration-note[]\n"; - - public static final String MEMORY_SIZE_FORMAT_NOTE = "\n[NOTE]" + - "\n[[" + MEMORY_SIZE_NOTE_ANCHOR + "]]\n" + - ".About the MemorySize format\n" + - "====\n" + - "A size configuration option recognises string in this format (shown as a regular expression): `[0-9]+[KkMmGgTtPpEeZzYy]?`.\n" - + - "If no suffix is given, assume bytes.\n" + - "====\n"; - - /** - * Tooltip is custom AsciiDoc inline macro that transforms inputs to a CSS Tooltip. - */ - public static final String TOOLTIP = "tooltip:%s[%s]"; - -} diff --git a/core/processor/src/main/java/io/quarkus/annotation/processor/generate_doc/DocFormatter.java b/core/processor/src/main/java/io/quarkus/annotation/processor/generate_doc/DocFormatter.java deleted file mode 100644 index e153f1aa0afc6..0000000000000 --- a/core/processor/src/main/java/io/quarkus/annotation/processor/generate_doc/DocFormatter.java +++ /dev/null @@ -1,70 +0,0 @@ -package io.quarkus.annotation.processor.generate_doc; - -import java.io.IOException; -import java.io.Writer; -import java.text.Normalizer; -import java.util.List; - -interface DocFormatter { - default String getAnchor(String string) { - // remove accents - string = Normalizer.normalize(string, Normalizer.Form.NFKC) - .replaceAll("[àáâãäåāąă]", "a") - .replaceAll("[çćčĉċ]", "c") - .replaceAll("[ďđð]", "d") - .replaceAll("[èéêëēęěĕė]", "e") - .replaceAll("[ƒſ]", "f") - .replaceAll("[ĝğġģ]", "g") - .replaceAll("[ĥħ]", "h") - .replaceAll("[ìíîïīĩĭįı]", "i") - .replaceAll("[ijĵ]", "j") - .replaceAll("[ķĸ]", "k") - .replaceAll("[łľĺļŀ]", "l") - .replaceAll("[ñńňņʼnŋ]", "n") - .replaceAll("[òóôõöøōőŏœ]", "o") - .replaceAll("[Þþ]", "p") - .replaceAll("[ŕřŗ]", "r") - .replaceAll("[śšşŝș]", "s") - .replaceAll("[ťţŧț]", "t") - .replaceAll("[ùúûüūůűŭũų]", "u") - .replaceAll("[ŵ]", "w") - .replaceAll("[ýÿŷ]", "y") - .replaceAll("[žżź]", "z") - .replaceAll("[æ]", "ae") - .replaceAll("[ÀÁÂÃÄÅĀĄĂ]", "A") - .replaceAll("[ÇĆČĈĊ]", "C") - .replaceAll("[ĎĐÐ]", "D") - .replaceAll("[ÈÉÊËĒĘĚĔĖ]", "E") - .replaceAll("[ĜĞĠĢ]", "G") - .replaceAll("[ĤĦ]", "H") - .replaceAll("[ÌÍÎÏĪĨĬĮİ]", "I") - .replaceAll("[Ĵ]", "J") - .replaceAll("[Ķ]", "K") - .replaceAll("[ŁĽĹĻĿ]", "L") - .replaceAll("[ÑŃŇŅŊ]", "N") - .replaceAll("[ÒÓÔÕÖØŌŐŎ]", "O") - .replaceAll("[ŔŘŖ]", "R") - .replaceAll("[ŚŠŞŜȘ]", "S") - .replaceAll("[ÙÚÛÜŪŮŰŬŨŲ]", "U") - .replaceAll("[Ŵ]", "W") - .replaceAll("[ÝŶŸ]", "Y") - .replaceAll("[ŹŽŻ]", "Z") - .replaceAll("[ß]", "ss"); - - // Apostrophes. - string = string.replaceAll("([a-z])'s([^a-z])", "$1s$2"); - // Allow only letters, -, _ - string = string.replaceAll("[^\\w-_]", "-").replaceAll("-{2,}", "-"); - // Get rid of any - at the start and end. - string = string.replaceAll("-+$", "").replaceAll("^-+", ""); - - return string.toLowerCase(); - } - - void format(Writer writer, String initialAnchorPrefix, boolean activateSearch, List configDocItems, - boolean includeConfigPhaseLegend) throws IOException; - - void format(Writer writer, ConfigDocKey configDocKey) throws IOException; - - void format(Writer writer, ConfigDocSection configDocSection) throws IOException; -} diff --git a/core/processor/src/main/java/io/quarkus/annotation/processor/generate_doc/DocGeneratorUtil.java b/core/processor/src/main/java/io/quarkus/annotation/processor/generate_doc/DocGeneratorUtil.java deleted file mode 100644 index ae33d07e253d7..0000000000000 --- a/core/processor/src/main/java/io/quarkus/annotation/processor/generate_doc/DocGeneratorUtil.java +++ /dev/null @@ -1,532 +0,0 @@ -package io.quarkus.annotation.processor.generate_doc; - -import java.time.Duration; -import java.util.Collections; -import java.util.HashMap; -import java.util.Iterator; -import java.util.List; -import java.util.Locale; -import java.util.Map; -import java.util.NoSuchElementException; -import java.util.logging.Level; -import java.util.regex.Matcher; -import java.util.regex.Pattern; -import java.util.stream.Collectors; - -import javax.lang.model.type.DeclaredType; -import javax.lang.model.type.TypeMirror; - -public class DocGeneratorUtil { - private static final String NEW_LINE = "\n"; - private static final String CORE = "core"; - private static final String CONFIG = "Config"; - private static final String CONFIGURATION = "Configuration"; - public static final String LEVEL_HACK_URL = "https://docs.jboss.org/jbossas/javadoc/7.1.2.Final/org/jboss/logmanager/Level.html"; - private static String CONFIG_GROUP_DOC_PREFIX = "config-group-"; - static final String VERTX_JAVA_DOC_SITE = "https://vertx.io/docs/apidocs/"; - static final String OFFICIAL_JAVA_DOC_BASE_LINK = "https://docs.oracle.com/javase/8/docs/api/"; - static final String AGROAL_API_JAVA_DOC_SITE = "https://jar-download.com/javaDoc/io.agroal/agroal-api/1.5/index.html?"; - - private static final Map JAVA_PRIMITIVE_WRAPPERS = new HashMap<>(); - private static final Map PRIMITIVE_DEFAULT_VALUES = new HashMap<>(); - private static final Map EXTENSION_JAVA_DOC_LINK = new HashMap<>(); - private static Pattern PACKAGE_PATTERN = Pattern.compile("^(\\w+)\\.(\\w+)\\..*$"); - private static final String HYPHEN = "-"; - private static final Pattern PATTERN = Pattern.compile("([-_]+)"); - - static { - PRIMITIVE_DEFAULT_VALUES.put("int", "0"); - PRIMITIVE_DEFAULT_VALUES.put("byte", "0"); - PRIMITIVE_DEFAULT_VALUES.put("char", ""); - PRIMITIVE_DEFAULT_VALUES.put("short", "0"); - PRIMITIVE_DEFAULT_VALUES.put("long", "0l"); - PRIMITIVE_DEFAULT_VALUES.put("float", "0f"); - PRIMITIVE_DEFAULT_VALUES.put("double", "0d"); - PRIMITIVE_DEFAULT_VALUES.put("boolean", "false"); - - JAVA_PRIMITIVE_WRAPPERS.put("java.lang.Character", "char"); - JAVA_PRIMITIVE_WRAPPERS.put("java.lang.Boolean", "boolean"); - JAVA_PRIMITIVE_WRAPPERS.put("java.lang.Byte", "byte"); - JAVA_PRIMITIVE_WRAPPERS.put("java.lang.Short", "short"); - JAVA_PRIMITIVE_WRAPPERS.put("java.lang.Integer", "int"); - JAVA_PRIMITIVE_WRAPPERS.put("java.lang.Long", "long"); - JAVA_PRIMITIVE_WRAPPERS.put("java.lang.Float", "float"); - JAVA_PRIMITIVE_WRAPPERS.put("java.lang.Double", "double"); - - EXTENSION_JAVA_DOC_LINK.put("io.vertx.", VERTX_JAVA_DOC_SITE); - EXTENSION_JAVA_DOC_LINK.put("io.agroal.", AGROAL_API_JAVA_DOC_SITE); - } - - /** - * Retrieve a default value of a primitive type. - * If type is not a primitive, returns false - * - */ - static String getPrimitiveDefaultValue(String primitiveType) { - return PRIMITIVE_DEFAULT_VALUES.get(primitiveType); - } - - /** - * Replaces Java primitive wrapper types with primitive types - */ - static String unbox(String type) { - String mapping = JAVA_PRIMITIVE_WRAPPERS.get(type); - return mapping == null ? type : mapping; - } - - /** - * Get javadoc link of a given type value - */ - static String getJavaDocSiteLink(String type) { - if (type.equals(Level.class.getName())) { - //hack, we don't want to link to the JUL version, but the jboss logging version - //this seems like a one off use case so for now it is just hacked in here - //if there are other use cases we should do something more generic - return LEVEL_HACK_URL; - } - Matcher packageMatcher = PACKAGE_PATTERN.matcher(type); - - if (!packageMatcher.find()) { - return Constants.EMPTY; - } - - if (JAVA_PRIMITIVE_WRAPPERS.containsKey(type)) { - return Constants.EMPTY; - } - - if ("java".equals(packageMatcher.group(1))) { - return OFFICIAL_JAVA_DOC_BASE_LINK + getJavaDocLinkForType(type); - } - - String basePkgName = packageMatcher.group(1) + "." + packageMatcher.group(2) + "."; - String javaDocBaseUrl = EXTENSION_JAVA_DOC_LINK.get(basePkgName); - - if (javaDocBaseUrl != null) { - return javaDocBaseUrl + getJavaDocLinkForType(type); - } - - return Constants.EMPTY; - } - - private static String getJavaDocLinkForType(String type) { - int beginOfWrappedTypeIndex = type.indexOf("<"); - if (beginOfWrappedTypeIndex != -1) { - type = type.substring(0, beginOfWrappedTypeIndex); - } - - int indexOfFirstUpperCase = 0; - for (int index = 0; index < type.length(); index++) { - char charAt = type.charAt(index); - if (charAt >= 'A' && charAt <= 'Z') { - indexOfFirstUpperCase = index; - break; - } - } - - final String base = type.substring(0, indexOfFirstUpperCase).replace('.', '/'); - final String html = type.substring(indexOfFirstUpperCase).replace('$', '.') + ".html"; - - return base + html; - } - - /** - * Retrieve enclosed type from known optional types - */ - static String getKnownGenericType(DeclaredType declaredType) { - return Constants.ALIASED_TYPES.get(declaredType.toString()); - } - - static Iterator camelHumpsIterator(String str) { - return new Iterator() { - int idx; - - @Override - public boolean hasNext() { - return idx < str.length(); - } - - @Override - public String next() { - if (idx == str.length()) - throw new NoSuchElementException(); - // known mixed-case rule-breakers - if (str.startsWith("JBoss", idx)) { - idx += 5; - return "JBoss"; - } - final int start = idx; - int c = str.codePointAt(idx); - if (Character.isUpperCase(c)) { - // an uppercase-starting word - idx = str.offsetByCodePoints(idx, 1); - if (idx < str.length()) { - c = str.codePointAt(idx); - if (Character.isUpperCase(c)) { - // all-caps word; need one look-ahead - int nextIdx = str.offsetByCodePoints(idx, 1); - while (nextIdx < str.length()) { - c = str.codePointAt(nextIdx); - if (Character.isLowerCase(c)) { - // ended at idx - return str.substring(start, idx); - } - idx = nextIdx; - nextIdx = str.offsetByCodePoints(idx, 1); - } - // consumed the whole remainder, update idx to length - idx = str.length(); - return str.substring(start); - } else { - // initial caps, trailing lowercase - idx = str.offsetByCodePoints(idx, 1); - while (idx < str.length()) { - c = str.codePointAt(idx); - if (Character.isUpperCase(c)) { - // end - return str.substring(start, idx); - } - idx = str.offsetByCodePoints(idx, 1); - } - // consumed the whole remainder - return str.substring(start); - } - } else { - // one-letter word - return str.substring(start); - } - } else { - // a lowercase-starting word - idx = str.offsetByCodePoints(idx, 1); - while (idx < str.length()) { - c = str.codePointAt(idx); - if (Character.isUpperCase(c)) { - // end - return str.substring(start, idx); - } - idx = str.offsetByCodePoints(idx, 1); - } - // consumed the whole remainder - return str.substring(start); - } - } - }; - } - - static Iterator lowerCase(Iterator orig) { - return new Iterator() { - @Override - public boolean hasNext() { - return orig.hasNext(); - } - - @Override - public String next() { - return orig.next().toLowerCase(Locale.ROOT); - } - }; - } - - static String join(Iterator it) { - final StringBuilder b = new StringBuilder(); - if (it.hasNext()) { - b.append(it.next()); - while (it.hasNext()) { - b.append("-"); - b.append(it.next()); - } - } - return b.toString(); - } - - static String hyphenate(String orig) { - return join(lowerCase(camelHumpsIterator(orig))); - } - - /** - * This needs to be consistent with io.quarkus.runtime.configuration.HyphenateEnumConverter. - */ - static String hyphenateEnumValue(String orig) { - StringBuffer target = new StringBuffer(); - String hyphenate = hyphenate(orig); - Matcher matcher = PATTERN.matcher(hyphenate); - while (matcher.find()) { - matcher.appendReplacement(target, HYPHEN); - } - matcher.appendTail(target); - return target.toString(); - } - - static String normalizeDurationValue(String value) { - if (!value.isEmpty() && Character.isDigit(value.charAt(value.length() - 1))) { - try { - value = Integer.parseInt(value) + "S"; - } catch (NumberFormatException ignore) { - } - } - value = value.toUpperCase(Locale.ROOT); - return value; - } - - static String joinAcceptedValues(List acceptedValues) { - if (acceptedValues == null || acceptedValues.isEmpty()) { - return ""; - } - - return acceptedValues.stream().collect(Collectors.joining("`, `", Constants.CODE_DELIMITER, Constants.CODE_DELIMITER)); - } - - static String joinEnumValues(List enumValues) { - if (enumValues == null || enumValues.isEmpty()) { - return Constants.EMPTY; - } - - // nested macros are only detected when cell starts with a new line, e.g. a|\n myMacro::[] - return NEW_LINE + String.join(", ", enumValues); - } - - static String getTypeFormatInformationNote(ConfigDocKey configDocKey) { - if (configDocKey.getType().equals(Duration.class.getName())) { - return Constants.DURATION_INFORMATION; - } else if (configDocKey.getType().equals(Constants.MEMORY_SIZE_TYPE)) { - return Constants.MEMORY_SIZE_INFORMATION; - } - - return Constants.EMPTY; - } - - static boolean hasDurationInformationNote(ConfigDocKey configDocKey) { - return configDocKey.hasType() && configDocKey.getType().equals(Duration.class.getName()); - } - - static boolean hasMemoryInformationNote(ConfigDocKey configDocKey) { - return configDocKey.hasType() && configDocKey.getType().equals(Constants.MEMORY_SIZE_TYPE); - } - - /** - * Guess extension name from given configuration root class name - */ - public static String computeExtensionDocFileName(String configRoot) { - StringBuilder extensionNameBuilder = new StringBuilder(); - final Matcher matcher = Constants.PKG_PATTERN.matcher(configRoot); - if (!matcher.find()) { - extensionNameBuilder.append(configRoot); - } else { - String extensionName = matcher.group(1); - extensionNameBuilder.append(Constants.QUARKUS); - extensionNameBuilder.append(Constants.DASH); - - if (Constants.DEPLOYMENT.equals(extensionName) || Constants.RUNTIME.equals(extensionName)) { - extensionNameBuilder.append(CORE); - } else { - extensionNameBuilder.append(extensionName); - for (int i = 2; i <= matcher.groupCount(); i++) { - String subgroup = matcher.group(i); - if (Constants.DEPLOYMENT.equals(subgroup) - || Constants.RUNTIME.equals(subgroup) - || Constants.COMMON.equals(subgroup) - || !subgroup.matches(Constants.DIGIT_OR_LOWERCASE)) { - break; - } - if (i > 3 && Constants.CONFIG.equals(subgroup)) { - // this is a bit dark magic, but we have config packages as valid extension names - // and config packages where the configuration is stored - break; - } - extensionNameBuilder.append(Constants.DASH); - extensionNameBuilder.append(matcher.group(i)); - } - } - } - - extensionNameBuilder.append(Constants.ADOC_EXTENSION); - return extensionNameBuilder.toString(); - } - - /** - * Guess config group file name from given configuration group class name - */ - public static String computeConfigGroupDocFileName(String configGroupClassName) { - final String sanitizedClassName; - final Matcher matcher = Constants.PKG_PATTERN.matcher(configGroupClassName); - - if (!matcher.find()) { - sanitizedClassName = CONFIG_GROUP_DOC_PREFIX + Constants.DASH + hyphenate(configGroupClassName); - } else { - String replacement = Constants.DASH + CONFIG_GROUP_DOC_PREFIX + Constants.DASH; - sanitizedClassName = configGroupClassName - .replaceFirst("io.", "") - .replaceFirst("\\.runtime\\.", replacement) - .replaceFirst("\\.deployment\\.", replacement); - } - - return hyphenate(sanitizedClassName) - .replaceAll("[\\.-]+", Constants.DASH) - + Constants.ADOC_EXTENSION; - } - - /** - * Guess config root file name from given configuration root class name. - */ - public static String computeConfigRootDocFileName(String configRootClassName, String rootName) { - String sanitizedClassName; - final Matcher matcher = Constants.PKG_PATTERN.matcher(configRootClassName); - - if (!matcher.find()) { - sanitizedClassName = rootName + Constants.DASH + hyphenate(configRootClassName); - } else { - String deployment = Constants.DOT + Constants.DEPLOYMENT + Constants.DOT; - String runtime = Constants.DOT + Constants.RUNTIME + Constants.DOT; - - if (configRootClassName.contains(deployment)) { - sanitizedClassName = configRootClassName - .substring(configRootClassName.indexOf(deployment) + deployment.length()); - } else if (configRootClassName.contains(runtime)) { - sanitizedClassName = configRootClassName.substring(configRootClassName.indexOf(runtime) + runtime.length()); - } else { - sanitizedClassName = configRootClassName.replaceFirst("io.quarkus.", ""); - } - - sanitizedClassName = rootName + Constants.DASH + sanitizedClassName; - } - - return hyphenate(sanitizedClassName) - .replaceAll("[\\.-]+", Constants.DASH) - + Constants.ADOC_EXTENSION; - } - - public static void appendConfigItemsIntoExistingOnes(List existingConfigItems, - List configDocItems) { - for (ConfigDocItem configDocItem : configDocItems) { - if (configDocItem.isConfigKey()) { - existingConfigItems.add(configDocItem); - } else { - ConfigDocSection configDocSection = configDocItem.getConfigDocSection(); - boolean configSectionMerged = mergeSectionIntoPreviousExistingConfigItems(configDocSection, - existingConfigItems); - if (!configSectionMerged) { - existingConfigItems.add(configDocItem); - } - } - } - } - - /** - * returns true if section is merged into one of the existing config items, false otherwise - */ - private static boolean mergeSectionIntoPreviousExistingConfigItems(ConfigDocSection section, - List configDocItems) { - for (ConfigDocItem configDocItem : configDocItems) { - if (configDocItem.isConfigKey()) { - continue; - } - - ConfigDocSection configDocSection = configDocItem.getConfigDocSection(); - if (configDocSection.equals(section)) { - appendConfigItemsIntoExistingOnes(configDocSection.getConfigDocItems(), section.getConfigDocItems()); - return true; - } else { - boolean configSectionMerged = mergeSectionIntoPreviousExistingConfigItems(section, - configDocSection.getConfigDocItems()); - if (configSectionMerged) { - return true; - } - } - } - - return false; - } - - static String stringifyType(TypeMirror typeMirror) { - List typeArguments = ((DeclaredType) typeMirror).getTypeArguments(); - String simpleName = typeSimpleName(typeMirror); - if (typeArguments.isEmpty()) { - return simpleName; - } else if (typeArguments.size() == 1) { - return String.format("%s<%s>", simpleName, stringifyType(typeArguments.get(0))); - } else if (typeArguments.size() == 2) { - return String.format("%s<%s,%s>", simpleName, stringifyType(typeArguments.get(0)), - stringifyType(typeArguments.get(1))); - } - - return "unknown"; // we should not reach here - } - - private static String typeSimpleName(TypeMirror typeMirror) { - String type = ((DeclaredType) typeMirror).asElement().toString(); - return type.substring(1 + type.lastIndexOf(Constants.DOT)); - } - - static String getName(String prefix, String name, String simpleClassName, ConfigPhase configPhase) { - if (name.equals(Constants.HYPHENATED_ELEMENT_NAME)) { - return deriveConfigRootName(simpleClassName, prefix, configPhase); - } - - if (!prefix.isEmpty()) { - if (!name.isEmpty()) { - return prefix + Constants.DOT + name; - } else { - return prefix; - } - } else { - return name; - } - } - - /** - * Replace each character that is neither alphanumeric nor _ with _ then convert the name to upper case, e.g. - * quarkus.datasource.jdbc.initial-size -> QUARKUS_DATASOURCE_JDBC_INITIAL_SIZE - * See also: io.smallrye.config.common.utils.StringUtil#replaceNonAlphanumericByUnderscores(java.lang.String) - */ - static String toEnvVarName(final String name) { - int length = name.length(); - StringBuilder sb = new StringBuilder(length); - for (int i = 0; i < length; i++) { - char c = name.charAt(i); - if ('a' <= c && c <= 'z' || - 'A' <= c && c <= 'Z' || - '0' <= c && c <= '9') { - sb.append(c); - } else { - sb.append('_'); - } - } - return sb.toString().toUpperCase(); - } - - static String deriveConfigRootName(String simpleClassName, String prefix, ConfigPhase configPhase) { - String simpleNameInLowerCase = simpleClassName.toLowerCase(); - int length = simpleNameInLowerCase.length(); - - if (simpleNameInLowerCase.endsWith(CONFIG.toLowerCase())) { - String sanitized = simpleClassName.substring(0, length - CONFIG.length()); - return deriveConfigRootName(sanitized, prefix, configPhase); - } else if (simpleNameInLowerCase.endsWith(CONFIGURATION.toLowerCase())) { - String sanitized = simpleClassName.substring(0, length - CONFIGURATION.length()); - return deriveConfigRootName(sanitized, prefix, configPhase); - } else if (simpleNameInLowerCase.endsWith(configPhase.getConfigSuffix().toLowerCase())) { - String sanitized = simpleClassName.substring(0, length - configPhase.getConfigSuffix().length()); - return deriveConfigRootName(sanitized, prefix, configPhase); - } - - return !prefix.isEmpty() ? prefix + Constants.DOT + hyphenate(simpleClassName) - : Constants.QUARKUS + Constants.DOT + hyphenate(simpleClassName); - } - - /** - * Sort docs keys. The sorted list will contain the properties in the following order - * - 1. Map config items as last elements of the generated docs. - * - 2. Build time properties will come first. - * - 3. Otherwise, respect source code declaration order. - * - 4. Elements within a configuration section will appear at the end of the generated doc while preserving described in - * 1-4. - */ - public static void sort(List configDocItems) { - Collections.sort(configDocItems); - for (ConfigDocItem configDocItem : configDocItems) { - if (configDocItem.isConfigSection()) { - sort(configDocItem.getConfigDocSection().getConfigDocItems()); - } - } - } - -} diff --git a/core/processor/src/main/java/io/quarkus/annotation/processor/generate_doc/FsMap.java b/core/processor/src/main/java/io/quarkus/annotation/processor/generate_doc/FsMap.java deleted file mode 100644 index 2cb0492bd8430..0000000000000 --- a/core/processor/src/main/java/io/quarkus/annotation/processor/generate_doc/FsMap.java +++ /dev/null @@ -1,95 +0,0 @@ -package io.quarkus.annotation.processor.generate_doc; - -import java.io.IOException; -import java.nio.charset.StandardCharsets; -import java.nio.file.Files; -import java.nio.file.Path; -import java.util.Properties; -import java.util.stream.Stream; - -/** - * A file system backed map. - */ -public class FsMap { - - private final Path dir; - - public FsMap(Path dir) { - this.dir = safeCreateDirectories(dir); - } - - public String get(String key) { - final Path file = dir.resolve(key); - if (Files.exists(file)) { - try { - return Files.readString(file); - } catch (IOException e) { - throw new RuntimeException("Could not read " + file, e); - } - } else { - return null; - } - } - - public void put(String key, String value) { - final Path file = dir.resolve(key); - try { - Files.write(file, value.getBytes(StandardCharsets.UTF_8)); - } catch (IOException e) { - throw new RuntimeException("Could not write " + file, e); - } - } - - public boolean hasKey(String key) { - final Path file = dir.resolve(key); - return Files.exists(file); - } - - /** - * Attempts to call {@link Files#createDirectories(Path, java.nio.file.attribute.FileAttribute...)} with the given - * {@code dir} at most {@code dir.getNameCount()} times as long as it does not exist, assuming that other treads - * may try to create the same directory concurrently. - * - * @param dir the directory to create - * @throws RuntimeException A wrapped {@link IOException} thrown by the last call to - * {@link Files#createDirectories(Path, java.nio.file.attribute.FileAttribute...)} - */ - static Path safeCreateDirectories(Path dir) { - IOException lastException; - int retries = dir.getNameCount(); - do { - if (Files.exists(dir)) { - return dir; - } - try { - Files.createDirectories(dir); - return dir; - } catch (IOException e) { - lastException = e; - } - } while (retries-- > 0); - throw new RuntimeException("Could not create directories " + dir, lastException); - } - - public Properties asProperties() { - final Properties result = new Properties(); - if (Files.exists(dir)) { - try (Stream files = Files.list(dir)) { - files - .filter(Files::isRegularFile) - .forEach(f -> { - try { - result.setProperty(f.getFileName().toString(), - Files.readString(f)); - } catch (IOException e) { - throw new IllegalStateException("Could not read from " + f, e); - } - }); - } catch (IOException e) { - throw new RuntimeException("Could not list " + dir, e); - } - } - return result; - } - -} diff --git a/core/processor/src/main/java/io/quarkus/annotation/processor/generate_doc/FsMultiMap.java b/core/processor/src/main/java/io/quarkus/annotation/processor/generate_doc/FsMultiMap.java deleted file mode 100644 index b7842182161a1..0000000000000 --- a/core/processor/src/main/java/io/quarkus/annotation/processor/generate_doc/FsMultiMap.java +++ /dev/null @@ -1,60 +0,0 @@ -package io.quarkus.annotation.processor.generate_doc; - -import java.io.IOException; -import java.nio.charset.StandardCharsets; -import java.nio.file.Files; -import java.nio.file.Path; -import java.util.Collections; -import java.util.List; -import java.util.stream.Collectors; -import java.util.stream.Stream; - -/** - * A file system backed map associating each key with a collection of values - */ -public class FsMultiMap { - - private final Path dir; - - public FsMultiMap(Path dir) { - this.dir = FsMap.safeCreateDirectories(dir); - } - - /** - * @param key - * @return the collection associated with the given {@code key}; never {@code null} - */ - public List get(String key) { - final Path entryDir = dir.resolve(key); - if (Files.exists(entryDir)) { - try (Stream files = Files.list(entryDir)) { - return files - .filter(Files::isRegularFile) - .map(f -> f.getFileName().toString()) - .collect(Collectors.toList()); - - } catch (IOException e) { - throw new RuntimeException("Could not list " + entryDir, e); - } - } - return Collections.emptyList(); - } - - /** - * Add the given {@code value} to the collection associated with the given {@code key}. - * - * @param key - * @param value - */ - public void put(String key, String value) { - final Path entryDir = dir.resolve(key); - FsMap.safeCreateDirectories(entryDir); - final Path itemPath = entryDir.resolve(value); - try { - Files.write(itemPath, value.getBytes(StandardCharsets.UTF_8)); - } catch (IOException e) { - throw new RuntimeException("Could not write to " + itemPath, e); - } - } - -} diff --git a/core/processor/src/main/java/io/quarkus/annotation/processor/generate_doc/JavaDocParser.java b/core/processor/src/main/java/io/quarkus/annotation/processor/generate_doc/JavaDocParser.java deleted file mode 100644 index 4d8955c3ae503..0000000000000 --- a/core/processor/src/main/java/io/quarkus/annotation/processor/generate_doc/JavaDocParser.java +++ /dev/null @@ -1,544 +0,0 @@ -package io.quarkus.annotation.processor.generate_doc; - -import static io.quarkus.annotation.processor.generate_doc.DocGeneratorUtil.hyphenate; - -import java.util.concurrent.atomic.AtomicReference; -import java.util.function.Consumer; -import java.util.regex.Pattern; -import java.util.stream.Collectors; -import java.util.stream.IntStream; - -import org.jsoup.Jsoup; -import org.jsoup.nodes.Node; -import org.jsoup.nodes.TextNode; - -import com.github.javaparser.StaticJavaParser; -import com.github.javaparser.javadoc.Javadoc; -import com.github.javaparser.javadoc.JavadocBlockTag; -import com.github.javaparser.javadoc.JavadocBlockTag.Type; -import com.github.javaparser.javadoc.description.JavadocDescription; -import com.github.javaparser.javadoc.description.JavadocDescriptionElement; -import com.github.javaparser.javadoc.description.JavadocInlineTag; - -final class JavaDocParser { - - private static final Pattern START_OF_LINE = Pattern.compile("^", Pattern.MULTILINE); - private static final Pattern REPLACE_WINDOWS_EOL = Pattern.compile("\r\n"); - private static final Pattern REPLACE_MACOS_EOL = Pattern.compile("\r"); - private static final Pattern STARTING_SPACE = Pattern.compile("^ +"); - - private static final String BACKTICK = "`"; - private static final String HASH = "#"; - private static final String STAR = "*"; - private static final String S_NODE = "s"; - private static final String UNDERSCORE = "_"; - private static final String NEW_LINE = "\n"; - private static final String LINK_NODE = "a"; - private static final String BOLD_NODE = "b"; - private static final String STRONG_NODE = "strong"; - private static final String BIG_NODE = "big"; - private static final String CODE_NODE = "code"; - private static final String DEL_NODE = "del"; - private static final String ITALICS_NODE = "i"; - private static final String EMPHASIS_NODE = "em"; - private static final String TEXT_NODE = "#text"; - private static final String UNDERLINE_NODE = "u"; - private static final String NEW_LINE_NODE = "br"; - private static final String PARAGRAPH_NODE = "p"; - private static final String SMALL_NODE = "small"; - private static final String LIST_ITEM_NODE = "li"; - private static final String HREF_ATTRIBUTE = "href"; - private static final String STRIKE_NODE = "strike"; - private static final String SUB_SCRIPT_NODE = "sub"; - private static final String ORDERED_LIST_NODE = "ol"; - private static final String SUPER_SCRIPT_NODE = "sup"; - private static final String UN_ORDERED_LIST_NODE = "ul"; - private static final String PREFORMATED_NODE = "pre"; - private static final String BLOCKQUOTE_NODE = "blockquote"; - - private static final String BIG_ASCIDOC_STYLE = "[.big]"; - private static final String LINK_ATTRIBUTE_FORMAT = "[%s]"; - private static final String SUB_SCRIPT_ASCIDOC_STYLE = "~"; - private static final String SUPER_SCRIPT_ASCIDOC_STYLE = "^"; - private static final String SMALL_ASCIDOC_STYLE = "[.small]"; - private static final String ORDERED_LIST_ITEM_ASCIDOC_STYLE = " . "; - private static final String UNORDERED_LIST_ITEM_ASCIDOC_STYLE = " - "; - private static final String UNDERLINE_ASCIDOC_STYLE = "[.underline]"; - private static final String LINE_THROUGH_ASCIDOC_STYLE = "[.line-through]"; - private static final String HARD_LINE_BREAK_ASCIDOC_STYLE = " +\n"; - private static final String CODE_BLOCK_ASCIDOC_STYLE = "```"; - private static final String BLOCKQUOTE_BLOCK_ASCIDOC_STYLE = "[quote]\n____"; - private static final String BLOCKQUOTE_BLOCK_ASCIDOC_STYLE_END = "____"; - - private final boolean inlineMacroMode; - - public JavaDocParser(boolean inlineMacroMode) { - this.inlineMacroMode = inlineMacroMode; - } - - public JavaDocParser() { - this(false); - } - - public String parseConfigDescription(String javadocComment) { - final AtomicReference ref = new AtomicReference<>(); - parseConfigDescription(javadocComment, ref::set, s -> { - }); - return ref.get(); - } - - public void parseConfigDescription( - String javadocComment, - Consumer javadocTextConsumer, - Consumer sinceConsumer) { - - if (javadocComment == null || javadocComment.trim().isEmpty()) { - javadocTextConsumer.accept(Constants.EMPTY); - return; - } - - // the parser expects all the lines to start with "* " - // we add it as it has been previously removed - javadocComment = START_OF_LINE.matcher(javadocComment).replaceAll("* "); - Javadoc javadoc = StaticJavaParser.parseJavadoc(javadocComment); - - if (isAsciidoc(javadoc)) { - javadocTextConsumer.accept(handleEolInAsciidoc(javadoc)); - } else { - javadocTextConsumer.accept(htmlJavadocToAsciidoc(javadoc.getDescription())); - } - javadoc.getBlockTags().stream() - .filter(t -> t.getType() == Type.SINCE) - .map(JavadocBlockTag::getContent) - .map(JavadocDescription::toText) - .findFirst() - .ifPresent(sinceConsumer::accept); - } - - public SectionHolder parseConfigSection(String javadocComment, int sectionLevel) { - if (javadocComment == null || javadocComment.trim().isEmpty()) { - return new SectionHolder(Constants.EMPTY, Constants.EMPTY); - } - - // the parser expects all the lines to start with "* " - // we add it as it has been previously removed - javadocComment = START_OF_LINE.matcher(javadocComment).replaceAll("* "); - Javadoc javadoc = StaticJavaParser.parseJavadoc(javadocComment); - - if (isAsciidoc(javadoc)) { - final String details = handleEolInAsciidoc(javadoc); - final int endOfTitleIndex = details.indexOf(Constants.DOT); - final String title = details.substring(0, endOfTitleIndex).replaceAll("^([^\\w])+", Constants.EMPTY).trim(); - return new SectionHolder(title, details); - } - - return generateConfigSection(javadoc, sectionLevel); - } - - private SectionHolder generateConfigSection(Javadoc javadoc, int sectionLevel) { - final String generatedAsciiDoc = htmlJavadocToAsciidoc(javadoc.getDescription()); - if (generatedAsciiDoc.isEmpty()) { - return new SectionHolder(Constants.EMPTY, Constants.EMPTY); - } - - final String beginSectionDetails = IntStream - .rangeClosed(0, Math.max(0, sectionLevel)) - .mapToObj(x -> "=").collect(Collectors.joining()) - + " "; - - final int endOfTitleIndex = generatedAsciiDoc.indexOf(Constants.DOT); - if (endOfTitleIndex == -1) { - return new SectionHolder(generatedAsciiDoc.trim(), beginSectionDetails + generatedAsciiDoc); - } else { - final String title = generatedAsciiDoc.substring(0, endOfTitleIndex).trim(); - final String introduction = generatedAsciiDoc.substring(endOfTitleIndex + 1).trim(); - final String details = beginSectionDetails + title + "\n\n" + introduction; - - return new SectionHolder(title, details.trim()); - } - } - - private String handleEolInAsciidoc(Javadoc javadoc) { - // it's Asciidoc, so we just pass through - // it also uses platform specific EOL, so we need to convert them back to \n - String asciidoc = javadoc.getDescription().toText(); - asciidoc = REPLACE_WINDOWS_EOL.matcher(asciidoc).replaceAll("\n"); - asciidoc = REPLACE_MACOS_EOL.matcher(asciidoc).replaceAll("\n"); - return asciidoc; - } - - private boolean isAsciidoc(Javadoc javadoc) { - for (JavadocBlockTag blockTag : javadoc.getBlockTags()) { - if ("asciidoclet".equals(blockTag.getTagName())) { - return true; - } - } - return false; - } - - private String htmlJavadocToAsciidoc(JavadocDescription javadocDescription) { - StringBuilder sb = new StringBuilder(); - - for (JavadocDescriptionElement javadocDescriptionElement : javadocDescription.getElements()) { - if (javadocDescriptionElement instanceof JavadocInlineTag) { - JavadocInlineTag inlineTag = (JavadocInlineTag) javadocDescriptionElement; - String content = inlineTag.getContent().trim(); - switch (inlineTag.getType()) { - case CODE: - case VALUE: - case LITERAL: - case SYSTEM_PROPERTY: - sb.append('`'); - appendEscapedAsciiDoc(sb, content); - sb.append('`'); - break; - case LINK: - case LINKPLAIN: - if (content.startsWith(HASH)) { - content = hyphenate(content.substring(1)); - } - sb.append('`'); - appendEscapedAsciiDoc(sb, content); - sb.append('`'); - break; - default: - sb.append(content); - break; - } - } else { - appendHtml(sb, Jsoup.parseBodyFragment(javadocDescriptionElement.toText())); - } - } - - return trim(sb); - } - - private void appendHtml(StringBuilder sb, Node node) { - for (Node childNode : node.childNodes()) { - switch (childNode.nodeName()) { - case PARAGRAPH_NODE: - newLine(sb); - newLine(sb); - appendHtml(sb, childNode); - break; - case PREFORMATED_NODE: - newLine(sb); - newLine(sb); - sb.append(CODE_BLOCK_ASCIDOC_STYLE); - newLine(sb); - for (Node grandChildNode : childNode.childNodes()) { - unescapeHtmlEntities(sb, grandChildNode.toString()); - } - newLineIfNeeded(sb); - sb.append(CODE_BLOCK_ASCIDOC_STYLE); - newLine(sb); - newLine(sb); - break; - case BLOCKQUOTE_NODE: - newLine(sb); - newLine(sb); - sb.append(BLOCKQUOTE_BLOCK_ASCIDOC_STYLE); - newLine(sb); - appendHtml(sb, childNode); - newLineIfNeeded(sb); - sb.append(BLOCKQUOTE_BLOCK_ASCIDOC_STYLE_END); - newLine(sb); - newLine(sb); - break; - case ORDERED_LIST_NODE: - case UN_ORDERED_LIST_NODE: - newLine(sb); - appendHtml(sb, childNode); - break; - case LIST_ITEM_NODE: - final String marker = childNode.parent().nodeName().equals(ORDERED_LIST_NODE) - ? ORDERED_LIST_ITEM_ASCIDOC_STYLE - : UNORDERED_LIST_ITEM_ASCIDOC_STYLE; - newLine(sb); - sb.append(marker); - appendHtml(sb, childNode); - break; - case LINK_NODE: - final String link = childNode.attr(HREF_ATTRIBUTE); - sb.append("link:"); - sb.append(link); - final StringBuilder caption = new StringBuilder(); - appendHtml(caption, childNode); - sb.append(String.format(LINK_ATTRIBUTE_FORMAT, trim(caption))); - break; - case CODE_NODE: - sb.append(BACKTICK); - appendHtml(sb, childNode); - sb.append(BACKTICK); - break; - case BOLD_NODE: - case STRONG_NODE: - sb.append(STAR); - appendHtml(sb, childNode); - sb.append(STAR); - break; - case EMPHASIS_NODE: - case ITALICS_NODE: - sb.append(UNDERSCORE); - appendHtml(sb, childNode); - sb.append(UNDERSCORE); - break; - case UNDERLINE_NODE: - sb.append(UNDERLINE_ASCIDOC_STYLE); - sb.append(HASH); - appendHtml(sb, childNode); - sb.append(HASH); - break; - case SMALL_NODE: - sb.append(SMALL_ASCIDOC_STYLE); - sb.append(HASH); - appendHtml(sb, childNode); - sb.append(HASH); - break; - case BIG_NODE: - sb.append(BIG_ASCIDOC_STYLE); - sb.append(HASH); - appendHtml(sb, childNode); - sb.append(HASH); - break; - case SUB_SCRIPT_NODE: - sb.append(SUB_SCRIPT_ASCIDOC_STYLE); - appendHtml(sb, childNode); - sb.append(SUB_SCRIPT_ASCIDOC_STYLE); - break; - case SUPER_SCRIPT_NODE: - sb.append(SUPER_SCRIPT_ASCIDOC_STYLE); - appendHtml(sb, childNode); - sb.append(SUPER_SCRIPT_ASCIDOC_STYLE); - break; - case DEL_NODE: - case S_NODE: - case STRIKE_NODE: - sb.append(LINE_THROUGH_ASCIDOC_STYLE); - sb.append(HASH); - appendHtml(sb, childNode); - sb.append(HASH); - break; - case NEW_LINE_NODE: - sb.append(HARD_LINE_BREAK_ASCIDOC_STYLE); - break; - case TEXT_NODE: - String text = ((TextNode) childNode).text(); - - if (text.isEmpty()) { - break; - } - - // Indenting the first line of a paragraph by one or more spaces makes the block literal - // Please see https://docs.asciidoctor.org/asciidoc/latest/verbatim/literal-blocks/ for more info - // This prevents literal blocks f.e. after
- final var startingSpaceMatcher = STARTING_SPACE.matcher(text); - if (sb.length() > 0 && '\n' == sb.charAt(sb.length() - 1) && startingSpaceMatcher.find()) { - text = startingSpaceMatcher.replaceFirst(""); - } - - appendEscapedAsciiDoc(sb, text); - break; - default: - appendHtml(sb, childNode); - break; - } - } - } - - /** - * Trim the content of the given {@link StringBuilder} holding also AsciiDoc had line break {@code " +\n"} - * for whitespace in addition to characters <= {@code ' '}. - * - * @param sb the {@link StringBuilder} to trim - * @return the trimmed content of the given {@link StringBuilder} - */ - static String trim(StringBuilder sb) { - int length = sb.length(); - int offset = 0; - while (offset < length) { - final char ch = sb.charAt(offset); - if (ch == ' ' - && offset + 2 < length - && sb.charAt(offset + 1) == '+' - && sb.charAt(offset + 2) == '\n') { - /* Space followed by + and newline is AsciiDoc hard break that we consider whitespace */ - offset += 3; - continue; - } else if (ch > ' ') { - /* Non-whitespace as defined by String.trim() */ - break; - } - offset++; - } - if (offset > 0) { - sb.delete(0, offset); - } - if (sb.length() > 0) { - offset = sb.length() - 1; - while (offset >= 0) { - final char ch = sb.charAt(offset); - if (ch == '\n' - && offset - 2 >= 0 - && sb.charAt(offset - 1) == '+' - && sb.charAt(offset - 2) == ' ') { - /* Space followed by + is AsciiDoc hard break that we consider whitespace */ - offset -= 3; - continue; - } else if (ch > ' ') { - /* Non-whitespace as defined by String.trim() */ - break; - } - offset--; - } - if (offset < sb.length() - 1) { - sb.setLength(offset + 1); - } - } - return sb.toString(); - } - - private static StringBuilder newLineIfNeeded(StringBuilder sb) { - trimText(sb, " \t\r\n"); - return sb.append(NEW_LINE); - } - - private static StringBuilder newLine(StringBuilder sb) { - /* Trim trailing spaces and tabs at the end of line */ - trimText(sb, " \t"); - return sb.append(NEW_LINE); - } - - private static StringBuilder trimText(StringBuilder sb, String charsToTrim) { - while (sb.length() > 0 && charsToTrim.indexOf(sb.charAt(sb.length() - 1)) >= 0) { - sb.setLength(sb.length() - 1); - } - return sb; - } - - private StringBuilder unescapeHtmlEntities(StringBuilder sb, String text) { - int i = 0; - /* trim leading whitespace */ - LOOP: while (i < text.length()) { - switch (text.charAt(i++)) { - case ' ': - case '\t': - case '\r': - case '\n': - break; - default: - i--; - break LOOP; - } - } - for (; i < text.length(); i++) { - final char ch = text.charAt(i); - switch (ch) { - case '&': - int start = ++i; - while (i < text.length() && text.charAt(i) != ';') { - i++; - } - if (i > start) { - final String abbrev = text.substring(start, i); - switch (abbrev) { - case "lt": - sb.append('<'); - break; - case "gt": - sb.append('>'); - break; - case "nbsp": - sb.append("{nbsp}"); - break; - case "amp": - sb.append('&'); - break; - default: - try { - int code = Integer.parseInt(abbrev); - sb.append((char) code); - } catch (NumberFormatException e) { - throw new RuntimeException( - "Could not parse HTML entity &" + abbrev + "; in\n\n" + text + "\n\n"); - } - break; - } - } - break; - case '\r': - if (i + 1 < text.length() && text.charAt(i + 1) == '\n') { - /* Ignore \r followed by \n */ - } else { - /* A Mac single \r: replace by \n */ - sb.append('\n'); - } - break; - default: - sb.append(ch); - - } - } - return sb; - } - - private StringBuilder appendEscapedAsciiDoc(StringBuilder sb, String text) { - boolean escaping = false; - for (int i = 0; i < text.length(); i++) { - final char ch = text.charAt(i); - switch (ch) { - case ']': - // don't escape closing square bracket in the attribute list of an inline element with passThrough - // https://docs.asciidoctor.org/asciidoc/latest/attributes/positional-and-named-attributes/#substitutions - if (inlineMacroMode) { - if (escaping) { - sb.append("++"); - escaping = false; - } - sb.append("]"); - break; - } - case '#': - case '*': - case '\\': - case '{': - case '}': - case '[': - case '|': - if (!escaping) { - sb.append("++"); - escaping = true; - } - sb.append(ch); - break; - case '+': - if (escaping) { - sb.append("++"); - escaping = false; - } - sb.append("{plus}"); - break; - default: - if (escaping) { - sb.append("++"); - escaping = false; - } - sb.append(ch); - } - } - if (escaping) { - sb.append("++"); - } - return sb; - } - - static class SectionHolder { - final String title; - final String details; - - public SectionHolder(String title, String details) { - this.title = title; - this.details = details; - } - } -} diff --git a/core/processor/src/main/java/io/quarkus/annotation/processor/generate_doc/LegacyConfigDocExtensionProcessor.java b/core/processor/src/main/java/io/quarkus/annotation/processor/generate_doc/LegacyConfigDocExtensionProcessor.java deleted file mode 100644 index 6c5e77aa1be45..0000000000000 --- a/core/processor/src/main/java/io/quarkus/annotation/processor/generate_doc/LegacyConfigDocExtensionProcessor.java +++ /dev/null @@ -1,210 +0,0 @@ -package io.quarkus.annotation.processor.generate_doc; - -import static io.quarkus.annotation.processor.generate_doc.Constants.ANNOTATION_CONFIG_GROUP; -import static io.quarkus.annotation.processor.generate_doc.Constants.ANNOTATION_CONFIG_MAPPING; -import static javax.lang.model.util.ElementFilter.typesIn; - -import java.io.IOException; -import java.io.InputStream; -import java.nio.file.Files; -import java.nio.file.Path; -import java.util.HashSet; -import java.util.List; -import java.util.Map; -import java.util.Optional; -import java.util.Properties; -import java.util.Set; -import java.util.concurrent.ConcurrentHashMap; - -import javax.annotation.processing.RoundEnvironment; -import javax.lang.model.element.AnnotationMirror; -import javax.lang.model.element.Element; -import javax.lang.model.element.ElementKind; -import javax.lang.model.element.ExecutableElement; -import javax.lang.model.element.Modifier; -import javax.lang.model.element.PackageElement; -import javax.lang.model.element.TypeElement; -import javax.lang.model.type.DeclaredType; -import javax.lang.model.type.TypeKind; -import javax.lang.model.type.TypeMirror; -import javax.lang.model.util.ElementFilter; -import javax.tools.Diagnostic; - -import io.quarkus.annotation.processor.ExtensionProcessor; -import io.quarkus.annotation.processor.Outputs; -import io.quarkus.annotation.processor.documentation.config.util.Types; -import io.quarkus.annotation.processor.util.Config; -import io.quarkus.annotation.processor.util.Utils; - -public class LegacyConfigDocExtensionProcessor implements ExtensionProcessor { - - private Utils utils; - private final ConfigDocItemScanner configDocItemScanner; - private final ConfigDocWriter configDocWriter; - - private final Map annotationUsageTracker = new ConcurrentHashMap<>(); - private boolean configMappingUsed; - - public LegacyConfigDocExtensionProcessor() { - this.configDocItemScanner = new ConfigDocItemScanner(); - this.configDocWriter = new ConfigDocWriter(); - } - - @Override - public void init(Config config, Utils utils) { - this.utils = utils; - } - - @Override - public void process(Set annotations, RoundEnvironment roundEnv) { - configMappingUsed = annotations.stream() - .anyMatch(a -> a.getQualifiedName().toString().equals(Types.ANNOTATION_CONFIG_MAPPING)); - - for (TypeElement annotation : annotations) { - switch (annotation.getQualifiedName().toString()) { - case Types.ANNOTATION_CONFIG_ROOT: - trackAnnotationUsed(Types.ANNOTATION_CONFIG_ROOT); - processConfigRoot(roundEnv, annotation); - break; - case Types.ANNOTATION_CONFIG_GROUP: - trackAnnotationUsed(Types.ANNOTATION_CONFIG_GROUP); - processConfigGroup(roundEnv, annotation); - break; - case Types.ANNOTATION_CONFIG_MAPPING: - configMappingUsed = true; - break; - } - } - } - - private void processConfigRoot(RoundEnvironment roundEnv, TypeElement annotation) { - for (TypeElement clazz : typesIn(roundEnv.getElementsAnnotatedWith(annotation))) { - final PackageElement pkg = utils.element().getPackageOf(clazz); - if (pkg == null) { - utils.processingEnv().getMessager().printMessage(Diagnostic.Kind.ERROR, - "Element " + clazz + " has no enclosing package"); - continue; - } - - configDocItemScanner.addConfigRoot(pkg, clazz); - } - } - - private void processConfigGroup(RoundEnvironment roundEnv, TypeElement annotation) { - final Set groupClassNames = new HashSet<>(); - for (TypeElement i : ElementFilter.typesIn(roundEnv.getElementsAnnotatedWith(annotation))) { - if (groupClassNames.add(i.getQualifiedName().toString())) { - configDocItemScanner.addConfigGroups(i); - } - } - } - - private void recordMappingJavadoc(TypeElement clazz) { - String className = clazz.getQualifiedName().toString(); - if (!utils.element().isAnnotationPresent(clazz, ANNOTATION_CONFIG_MAPPING)) { - configDocItemScanner.addConfigGroups(clazz); - } - Properties javadocProps = new Properties(); - - for (Element e : clazz.getEnclosedElements()) { - switch (e.getKind()) { - case INTERFACE: { - recordMappingJavadoc(((TypeElement) e)); - break; - } - - case METHOD: { - if (!isConfigMappingMethodIgnored(e)) { - processMethodConfigMapping((ExecutableElement) e, javadocProps, className); - } - break; - } - default: - } - } - } - - private void processMethodConfigMapping(ExecutableElement method, Properties javadocProps, String className) { - if (method.getModifiers().contains(Modifier.ABSTRACT)) { - TypeMirror returnType = method.getReturnType(); - if (TypeKind.DECLARED.equals(returnType.getKind())) { - DeclaredType declaredType = (DeclaredType) returnType; - if (!utils.element().isAnnotationPresent(declaredType.asElement(), ANNOTATION_CONFIG_GROUP)) { - TypeElement type = unwrapConfigGroup(returnType); - if (type != null && ElementKind.INTERFACE.equals(type.getKind())) { - recordMappingJavadoc(type); - configDocItemScanner.addConfigGroups(type); - } - } - } - } - } - - private TypeElement unwrapConfigGroup(TypeMirror typeMirror) { - if (typeMirror == null) { - return null; - } - - DeclaredType declaredType = (DeclaredType) typeMirror; - String name = declaredType.asElement() - .toString(); - List typeArguments = declaredType.getTypeArguments(); - if (typeArguments.isEmpty()) { - if (!name.startsWith("java.")) { - return (TypeElement) declaredType.asElement(); - } - } else if (typeArguments.size() == 1) { - if (name.equals(Optional.class.getName()) || - name.equals(List.class.getName()) || - name.equals(Set.class.getName())) { - return unwrapConfigGroup(typeArguments.get(0)); - } - } else if (typeArguments.size() == 2) { - if (name.equals(Map.class.getName())) { - return unwrapConfigGroup(typeArguments.get(1)); - } - } - return null; - } - - private static boolean isConfigMappingMethodIgnored(Element element) { - for (AnnotationMirror annotationMirror : element.getAnnotationMirrors()) { - String annotationName = ((TypeElement) annotationMirror.getAnnotationType().asElement()) - .getQualifiedName().toString(); - if (Constants.ANNOTATION_CONFIG_DOC_IGNORE.equals(annotationName)) { - return true; - } - } - return false; - } - - private void trackAnnotationUsed(String annotation) { - annotationUsageTracker.put(annotation, true); - } - - @Override - public void finalizeProcessing() { - try { - // not ideal but let's load the javadoc properties (we can't use the filer API here as we can't open the same file twice)... - Properties javadocProperties = new Properties(); - Path javadocPropertiesPath = utils.filer().getTargetPath().resolve("classes") - .resolve(Outputs.META_INF_QUARKUS_JAVADOC); - if (Files.isReadable(javadocPropertiesPath)) { - try (InputStream is = Files.newInputStream(javadocPropertiesPath)) { - javadocProperties.load(is); - } - } - - final Set outputs = configDocItemScanner - .scanExtensionsConfigurationItems(javadocProperties, configMappingUsed); - for (ConfigDocGeneratedOutput output : outputs) { - DocGeneratorUtil.sort(output.getConfigDocItems()); // sort before writing - configDocWriter.writeAllExtensionConfigDocumentation(output); - } - } catch (IOException e) { - utils.processingEnv().getMessager().printMessage(Diagnostic.Kind.ERROR, "Failed to generate extension doc: " + e); - return; - } - } - -} diff --git a/core/processor/src/main/java/io/quarkus/annotation/processor/generate_doc/MavenConfigDocBuilder.java b/core/processor/src/main/java/io/quarkus/annotation/processor/generate_doc/MavenConfigDocBuilder.java deleted file mode 100644 index 0e538bb2169aa..0000000000000 --- a/core/processor/src/main/java/io/quarkus/annotation/processor/generate_doc/MavenConfigDocBuilder.java +++ /dev/null @@ -1,93 +0,0 @@ -package io.quarkus.annotation.processor.generate_doc; - -import static io.quarkus.annotation.processor.generate_doc.Constants.NEW_LINE; -import static io.quarkus.annotation.processor.generate_doc.Constants.SECTION_TITLE_L1; - -import java.util.ArrayList; -import java.util.List; - -public final class MavenConfigDocBuilder extends ConfigDocBuilder { - - public MavenConfigDocBuilder() { - super(false); - } - - private final JavaDocParser javaDocParser = new JavaDocParser(); - - public void addTableTitle(String goalTitle) { - write(SECTION_TITLE_L1, goalTitle, NEW_LINE); - } - - public void addNewLine() { - write(NEW_LINE); - } - - public void addTableDescription(String goalDescription) { - write(NEW_LINE, javaDocParser.parseConfigDescription(goalDescription), NEW_LINE); - } - - public GoalParamsBuilder newGoalParamsBuilder() { - return new GoalParamsBuilder(javaDocParser); - } - - private static abstract class TableBuilder { - - protected final List configDocItems = new ArrayList<>(); - - /** - * Section name that is displayed in a table header - */ - abstract protected String getSectionName(); - - public List build() { - - // a summary table - final ConfigDocSection parameterSection = new ConfigDocSection(); - parameterSection.setShowSection(true); - parameterSection.setName(getSectionName()); - parameterSection.setSectionDetailsTitle(getSectionName()); - parameterSection.setOptional(false); - parameterSection.setConfigDocItems(List.copyOf(configDocItems)); - - // topConfigDocItem wraps the summary table - final ConfigDocItem topConfigDocItem = new ConfigDocItem(); - topConfigDocItem.setConfigDocSection(parameterSection); - - return List.of(topConfigDocItem); - } - - public boolean tableIsNotEmpty() { - return !configDocItems.isEmpty(); - } - } - - public static final class GoalParamsBuilder extends TableBuilder { - - private final JavaDocParser javaDocParser; - - private GoalParamsBuilder(JavaDocParser javaDocParser) { - this.javaDocParser = javaDocParser; - } - - public void addParam(String type, String name, String defaultValue, boolean required, String description) { - final ConfigDocKey configDocKey = new ConfigDocKey(); - configDocKey.setType(type); - configDocKey.setKey(name); - configDocKey.setAdditionalKeys(List.of(name)); - configDocKey.setConfigPhase(ConfigPhase.RUN_TIME); - configDocKey.setDefaultValue(defaultValue == null ? Constants.EMPTY : defaultValue); - javaDocParser.parseConfigDescription(description, configDocKey::setConfigDoc, configDocKey::setSince); - configDocKey.setEnvironmentVariable(DocGeneratorUtil.toEnvVarName(name)); - configDocKey.setOptional(!required); - final ConfigDocItem configDocItem = new ConfigDocItem(); - configDocItem.setConfigDocKey(configDocKey); - configDocItems.add(configDocItem); - } - - @Override - protected String getSectionName() { - return "Parameter"; - } - } - -} diff --git a/core/processor/src/main/java/io/quarkus/annotation/processor/generate_doc/ScannedConfigDocsItemHolder.java b/core/processor/src/main/java/io/quarkus/annotation/processor/generate_doc/ScannedConfigDocsItemHolder.java deleted file mode 100644 index cba9d2bed6cab..0000000000000 --- a/core/processor/src/main/java/io/quarkus/annotation/processor/generate_doc/ScannedConfigDocsItemHolder.java +++ /dev/null @@ -1,59 +0,0 @@ -package io.quarkus.annotation.processor.generate_doc; - -import java.util.HashMap; -import java.util.List; -import java.util.Map; - -final class ScannedConfigDocsItemHolder { - private final Map> configGroupConfigItems; - private final Map> configRootConfigItems; - private final Map configRootClassToConfigRootInfo = new HashMap<>(); - - public ScannedConfigDocsItemHolder() { - this(new HashMap<>(), new HashMap<>()); - } - - public ScannedConfigDocsItemHolder(Map> configRootConfigItems, - Map> configGroupConfigItems) { - this.configRootConfigItems = configRootConfigItems; - this.configGroupConfigItems = configGroupConfigItems; - } - - public Map> getConfigGroupConfigItems() { - return configGroupConfigItems; - } - - public Map> getConfigRootConfigItems() { - return configRootConfigItems; - } - - public void addConfigGroupItems(String configGroupName, List configDocItems) { - configGroupConfigItems.put(configGroupName, configDocItems); - } - - public void addConfigRootItems(ConfigRootInfo configRoot, List configDocItems) { - configRootConfigItems.put(configRoot, configDocItems); - configRootClassToConfigRootInfo.put(configRoot.getClazz().getQualifiedName().toString(), configRoot); - } - - public List getConfigItemsByRootClassName(String configRootClassName) { - ConfigRootInfo configRootInfo = configRootClassToConfigRootInfo.get(configRootClassName); - if (configRootInfo == null) { - return null; - } - - return configRootConfigItems.get(configRootInfo); - } - - public boolean isEmpty() { - return configRootConfigItems.isEmpty(); - } - - @Override - public String toString() { - return "ScannedConfigDocsItemHolder{" + - ", configRootConfigItems=" + configRootConfigItems + - ", configGroupConfigItems=" + configGroupConfigItems + - '}'; - } -} diff --git a/core/processor/src/main/java/io/quarkus/annotation/processor/generate_doc/SummaryTableDocFormatter.java b/core/processor/src/main/java/io/quarkus/annotation/processor/generate_doc/SummaryTableDocFormatter.java deleted file mode 100644 index 1fe3040fe6dca..0000000000000 --- a/core/processor/src/main/java/io/quarkus/annotation/processor/generate_doc/SummaryTableDocFormatter.java +++ /dev/null @@ -1,154 +0,0 @@ -package io.quarkus.annotation.processor.generate_doc; - -import static io.quarkus.annotation.processor.generate_doc.Constants.CONFIG_PHASE_LEGEND; -import static io.quarkus.annotation.processor.generate_doc.Constants.NEW_LINE; -import static io.quarkus.annotation.processor.generate_doc.DocGeneratorUtil.toEnvVarName; - -import java.io.IOException; -import java.io.Writer; -import java.util.List; - -final class SummaryTableDocFormatter implements DocFormatter { - private static final String TWO_NEW_LINES = "\n\n"; - private static final String TABLE_CLOSING_TAG = "\n|==="; - public static final String SEARCHABLE_TABLE_CLASS = ".searchable"; // a css class indicating if a table is searchable - public static final String CONFIGURATION_TABLE_CLASS = ".configuration-reference"; - private static final String TABLE_ROW_FORMAT = "\n\na|%s [[%s]]`link:#%s[%s]`\n\n[.description]\n--\n%s\n--%s|%s %s\n|%s\n"; - private static final String SECTION_TITLE = "[[%s]]link:#%s[%s]"; - private static final String TABLE_HEADER_FORMAT = "[%s, cols=\"80,.^10,.^10\"]\n|==="; - private static final String TABLE_SECTION_ROW_FORMAT = "\n\nh|%s\n%s\nh|Type\nh|Default"; - private final boolean showEnvVars; - - private String anchorPrefix = ""; - - public SummaryTableDocFormatter(boolean showEnvVars) { - this.showEnvVars = showEnvVars; - } - - public SummaryTableDocFormatter() { - this(true); - } - - /** - * Generate configuration keys in table format with search engine activated or not. - * Useful when we want to optionally activate or deactivate search engine - */ - @Override - public void format(Writer writer, String initialAnchorPrefix, boolean activateSearch, - List configDocItems, boolean includeConfigPhaseLegend) - throws IOException { - if (includeConfigPhaseLegend) { - writer.append("[.configuration-legend]").append(CONFIG_PHASE_LEGEND).append(NEW_LINE); - } - String searchableClass = activateSearch ? SEARCHABLE_TABLE_CLASS : Constants.EMPTY; - String tableClasses = CONFIGURATION_TABLE_CLASS + searchableClass; - writer.append(String.format(TABLE_HEADER_FORMAT, tableClasses)); - anchorPrefix = initialAnchorPrefix; - - // make sure that section-less configs get a legend - if (configDocItems.isEmpty() || configDocItems.get(0).isConfigKey()) { - String anchor = anchorPrefix + getAnchor("configuration"); - writer.append(String.format(TABLE_SECTION_ROW_FORMAT, - String.format(SECTION_TITLE, anchor, anchor, "Configuration property"), - Constants.EMPTY)); - } - - for (ConfigDocItem configDocItem : configDocItems) { - if (configDocItem.isConfigSection() && configDocItem.getConfigDocSection().isShowSection() - && configDocItem.getConfigDocSection().getAnchorPrefix() != null) { - anchorPrefix = configDocItem.getConfigDocSection().getAnchorPrefix() + "_"; - } - configDocItem.accept(writer, this); - } - - writer.append(TABLE_CLOSING_TAG); // close table - } - - @Override - public void format(Writer writer, ConfigDocKey configDocKey) throws IOException { - String typeContent = ""; - if (configDocKey.hasAcceptedValues()) { - if (configDocKey.isEnum()) { - typeContent = DocGeneratorUtil.joinEnumValues(configDocKey.getAcceptedValues()); - } else { - typeContent = DocGeneratorUtil.joinAcceptedValues(configDocKey.getAcceptedValues()); - } - } else if (configDocKey.hasType()) { - typeContent = configDocKey.computeTypeSimpleName(); - final String javaDocLink = configDocKey.getJavaDocSiteLink(); - if (!javaDocLink.isEmpty()) { - typeContent = String.format("link:%s[%s]\n", javaDocLink, typeContent); - } - } - if (configDocKey.isList()) { - typeContent = "list of " + typeContent; - } - - String doc = configDocKey.getConfigDoc(); - - if (showEnvVars) { - // Convert a property name to an environment variable name and show it in the config description - final String envVarExample = String.format("ifdef::add-copy-button-to-env-var[]\n" + - "Environment variable: env_var_with_copy_button:+++%1$s+++[]\n" + - "endif::add-copy-button-to-env-var[]\n" + - "ifndef::add-copy-button-to-env-var[]\n" + - "Environment variable: `+++%1$s+++`\n" + - "endif::add-copy-button-to-env-var[]", toEnvVarName(configDocKey.getKey())); - if (configDocKey.getConfigDoc().isEmpty()) { - doc = envVarExample; - } else { - // Add 2 new lines in order to show the environment variable on next line - doc += TWO_NEW_LINES + envVarExample; - } - } - - final String typeDetail = DocGeneratorUtil.getTypeFormatInformationNote(configDocKey); - final String defaultValue = configDocKey.getDefaultValue(); - // this is not strictly true, because we can have a required value with a default value, but - // for documentation it will do - String required = configDocKey.isOptional() || !defaultValue.isEmpty() ? "" - : "required icon:exclamation-circle[title=Configuration property is required]"; - String key = configDocKey.getKey(); - String configKeyAnchor = getAnchor(key); - String anchor = anchorPrefix + configKeyAnchor; - - StringBuilder keys = new StringBuilder(); - keys.append( - String.format("%s [[%s]]`link:#%s[%s]`\n\n", configDocKey.getConfigPhase().getIllustration(), anchor, anchor, - key)); - for (String additionalKey : configDocKey.getAdditionalKeys()) { - if (!additionalKey.equals(key)) { - keys.append(String.format("`link:#%s[%s]`\n\n", anchor, additionalKey)); - } - } - - writer.append(String.format("\n\na|%s\n[.description]\n--\n%s\n--%s|%s %s\n|%s\n", - keys, - // make sure nobody inserts a table cell separator here - doc.replace("|", "\\|"), - // if ConfigDocKey is enum, cell style operator must support block elements - configDocKey.isEnum() ? " a" : Constants.EMPTY, - typeContent, typeDetail, - defaultValue.isEmpty() ? required - : String.format("`%s`", defaultValue.replace("|", "\\|") - .replace("`", "\\`")))); - } - - @Override - public void format(Writer writer, ConfigDocSection configDocSection) throws IOException { - if (configDocSection.isShowSection()) { - String anchor = anchorPrefix - + getAnchor(configDocSection.getName() + Constants.DASH + configDocSection.getSectionDetailsTitle()); - String sectionTitle = String.format(SECTION_TITLE, anchor, anchor, configDocSection.getSectionDetailsTitle()); - final String sectionRow = String.format(TABLE_SECTION_ROW_FORMAT, sectionTitle, - configDocSection.isOptional() ? "This configuration section is optional" : Constants.EMPTY); - - writer.append(sectionRow); - } - - for (ConfigDocItem configDocItem : configDocSection.getConfigDocItems()) { - configDocItem.accept(writer, this); - } - } - -} diff --git a/core/processor/src/main/java/io/quarkus/annotation/processor/util/AccessorGenerator.java b/core/processor/src/main/java/io/quarkus/annotation/processor/util/AccessorGenerator.java index 130d969d2762c..2eb1efd69e24e 100644 --- a/core/processor/src/main/java/io/quarkus/annotation/processor/util/AccessorGenerator.java +++ b/core/processor/src/main/java/io/quarkus/annotation/processor/util/AccessorGenerator.java @@ -34,11 +34,10 @@ import org.jboss.jdeparser.JType; import org.jboss.jdeparser.JTypes; -import io.quarkus.annotation.processor.generate_doc.Constants; - public final class AccessorGenerator { private static final String QUARKUS_GENERATED = "io.quarkus.Generated"; + private static final String INSTANCE_SYM = "__instance"; private final ProcessingEnvironment processingEnv; private final ElementUtil elementUtil; @@ -75,7 +74,7 @@ public void generateAccessor(final TypeElement clazz) { classDef.constructor(JMod.PRIVATE); // no construction classDef.annotate(QUARKUS_GENERATED) .value("Quarkus annotation processor"); - final JAssignableExpr instanceName = JExprs.name(Constants.INSTANCE_SYM); + final JAssignableExpr instanceName = JExprs.name(INSTANCE_SYM); boolean isEnclosingClassPublic = clazz.getModifiers() .contains(Modifier.PUBLIC); // iterate fields @@ -114,14 +113,14 @@ public void generateAccessor(final TypeElement clazz) { final JMethodDef getter = classDef.method(JMod.PUBLIC | JMod.STATIC, publicType, "get_" + fieldName); getter.annotate(SuppressWarnings.class) .value("unchecked"); - getter.param(JType.OBJECT, Constants.INSTANCE_SYM); + getter.param(JType.OBJECT, INSTANCE_SYM); getter.body() ._return(instanceName.cast(clazzType) .field(fieldName)); final JMethodDef setter = classDef.method(JMod.PUBLIC | JMod.STATIC, JType.VOID, "set_" + fieldName); setter.annotate(SuppressWarnings.class) .value("unchecked"); - setter.param(JType.OBJECT, Constants.INSTANCE_SYM); + setter.param(JType.OBJECT, INSTANCE_SYM); setter.param(publicType, fieldName); final JAssignableExpr fieldExpr = JExprs.name(fieldName); setter.body() diff --git a/core/processor/src/test/java/io/quarkus/annotation/processor/generate_doc/JavaDocConfigDescriptionParserTest.java b/core/processor/src/test/java/io/quarkus/annotation/processor/documentation/config/formatter/JavadocToAsciidocTransformerConfigItemTest.java similarity index 51% rename from core/processor/src/test/java/io/quarkus/annotation/processor/generate_doc/JavaDocConfigDescriptionParserTest.java rename to core/processor/src/test/java/io/quarkus/annotation/processor/documentation/config/formatter/JavadocToAsciidocTransformerConfigItemTest.java index 60d4200fe52a3..3bab12d00c215 100644 --- a/core/processor/src/test/java/io/quarkus/annotation/processor/generate_doc/JavaDocConfigDescriptionParserTest.java +++ b/core/processor/src/test/java/io/quarkus/annotation/processor/documentation/config/formatter/JavadocToAsciidocTransformerConfigItemTest.java @@ -1,66 +1,61 @@ -package io.quarkus.annotation.processor.generate_doc; +package io.quarkus.annotation.processor.documentation.config.formatter; import static org.junit.jupiter.api.Assertions.assertEquals; +import static org.junit.jupiter.api.Assertions.assertNull; import java.util.Collections; -import java.util.concurrent.atomic.AtomicReference; import org.asciidoctor.Asciidoctor.Factory; -import org.junit.jupiter.api.BeforeEach; import org.junit.jupiter.api.Test; import org.junit.jupiter.params.ParameterizedTest; import org.junit.jupiter.params.provider.ValueSource; -public class JavaDocConfigDescriptionParserTest { +import io.quarkus.annotation.processor.documentation.config.discovery.ParsedJavadoc; - private JavaDocParser parser; - - @BeforeEach - public void setup() { - parser = new JavaDocParser(); - } +public class JavadocToAsciidocTransformerConfigItemTest { @Test public void parseNullJavaDoc() { - String parsed = parser.parseConfigDescription(null); - assertEquals("", parsed); + ParsedJavadoc parsed = JavadocToAsciidocTransformer.INSTANCE.parseConfigItemJavadoc(null); + assertNull(parsed.description()); } @Test public void removeParagraphIndentation() { - String parsed = parser.parseConfigDescription("First paragraph

Second Paragraph"); - assertEquals("First paragraph +\n +\nSecond Paragraph", parsed); + ParsedJavadoc parsed = JavadocToAsciidocTransformer.INSTANCE + .parseConfigItemJavadoc("First paragraph

Second Paragraph"); + assertEquals("First paragraph +\n +\nSecond Paragraph", parsed.description()); } @Test public void parseUntrimmedJavaDoc() { - String parsed = parser.parseConfigDescription(" "); - assertEquals("", parsed); - parsed = parser.parseConfigDescription("

"); - assertEquals("", parsed); + ParsedJavadoc parsed = JavadocToAsciidocTransformer.INSTANCE.parseConfigItemJavadoc(" "); + assertNull(parsed.description()); + parsed = JavadocToAsciidocTransformer.INSTANCE.parseConfigItemJavadoc("

"); + assertNull(parsed.description()); } @Test public void parseSimpleJavaDoc() { String javaDoc = "hello world"; - String parsed = parser.parseConfigDescription(javaDoc); + ParsedJavadoc parsed = JavadocToAsciidocTransformer.INSTANCE.parseConfigItemJavadoc(javaDoc); - assertEquals(javaDoc, parsed); + assertEquals(javaDoc, parsed.description()); } @Test public void parseJavaDocWithParagraph() { String javaDoc = "hello

world

"; String expectedOutput = "hello\n\nworld"; - String parsed = parser.parseConfigDescription(javaDoc); + ParsedJavadoc parsed = JavadocToAsciidocTransformer.INSTANCE.parseConfigItemJavadoc(javaDoc); - assertEquals(expectedOutput, parsed); + assertEquals(expectedOutput, parsed.description()); javaDoc = "hello world

bonjour

le monde

"; expectedOutput = "hello world\n\nbonjour\n\nle monde"; - parsed = parser.parseConfigDescription(javaDoc); + parsed = JavadocToAsciidocTransformer.INSTANCE.parseConfigItemJavadoc(javaDoc); - assertEquals(expectedOutput, parsed); + assertEquals(expectedOutput, parsed.description()); } @Test @@ -68,55 +63,55 @@ public void parseJavaDocWithStyles() { // Bold String javaDoc = "hello world"; String expectedOutput = "hello *world*"; - String parsed = parser.parseConfigDescription(javaDoc); - assertEquals(expectedOutput, parsed); + ParsedJavadoc parsed = JavadocToAsciidocTransformer.INSTANCE.parseConfigItemJavadoc(javaDoc); + assertEquals(expectedOutput, parsed.description()); javaDoc = "hello world"; expectedOutput = "hello *world*"; - parsed = parser.parseConfigDescription(javaDoc); - assertEquals(expectedOutput, parsed); + parsed = JavadocToAsciidocTransformer.INSTANCE.parseConfigItemJavadoc(javaDoc); + assertEquals(expectedOutput, parsed.description()); // Emphasized javaDoc = "hello world"; expectedOutput = "_hello world_"; - parsed = parser.parseConfigDescription(javaDoc); - assertEquals(expectedOutput, parsed); + parsed = JavadocToAsciidocTransformer.INSTANCE.parseConfigItemJavadoc(javaDoc); + assertEquals(expectedOutput, parsed.description()); // Italics javaDoc = "hello world"; expectedOutput = "_hello world_"; - parsed = parser.parseConfigDescription(javaDoc); - assertEquals(expectedOutput, parsed); + parsed = JavadocToAsciidocTransformer.INSTANCE.parseConfigItemJavadoc(javaDoc); + assertEquals(expectedOutput, parsed.description()); // Underline javaDoc = "hello world"; expectedOutput = "[.underline]#hello world#"; - parsed = parser.parseConfigDescription(javaDoc); - assertEquals(expectedOutput, parsed); + parsed = JavadocToAsciidocTransformer.INSTANCE.parseConfigItemJavadoc(javaDoc); + assertEquals(expectedOutput, parsed.description()); // small javaDoc = "quarkus subatomic"; expectedOutput = "[.small]#quarkus subatomic#"; - parsed = parser.parseConfigDescription(javaDoc); - assertEquals(expectedOutput, parsed); + parsed = JavadocToAsciidocTransformer.INSTANCE.parseConfigItemJavadoc(javaDoc); + assertEquals(expectedOutput, parsed.description()); // big javaDoc = "hello world"; expectedOutput = "[.big]#hello world#"; - parsed = parser.parseConfigDescription(javaDoc); - assertEquals(expectedOutput, parsed); + parsed = JavadocToAsciidocTransformer.INSTANCE.parseConfigItemJavadoc(javaDoc); + assertEquals(expectedOutput, parsed.description()); // line through javaDoc = "hello monolith world"; expectedOutput = "[.line-through]#hello #[.line-through]#monolith #[.line-through]#world#"; - parsed = parser.parseConfigDescription(javaDoc); - assertEquals(expectedOutput, parsed); + parsed = JavadocToAsciidocTransformer.INSTANCE.parseConfigItemJavadoc(javaDoc); + assertEquals(expectedOutput, parsed.description()); // superscript and subscript javaDoc = "cloud in-premise"; expectedOutput = "^cloud ^~in-premise~"; - parsed = parser.parseConfigDescription(javaDoc); - assertEquals(expectedOutput, parsed); + parsed = JavadocToAsciidocTransformer.INSTANCE.parseConfigItemJavadoc(javaDoc); + assertEquals(expectedOutput, parsed.description()); } @Test @@ -128,9 +123,9 @@ public void parseJavaDocWithLiTagsInsideUlTag() { "" + ""; String expectedOutput = "List:\n\n - 1\n - 2"; - String parsed = parser.parseConfigDescription(javaDoc); + ParsedJavadoc parsed = JavadocToAsciidocTransformer.INSTANCE.parseConfigItemJavadoc(javaDoc); - assertEquals(expectedOutput, parsed); + assertEquals(expectedOutput, parsed.description()); } @Test @@ -142,72 +137,72 @@ public void parseJavaDocWithLiTagsInsideOlTag() { "" + ""; String expectedOutput = "List:\n\n . 1\n . 2"; - String parsed = parser.parseConfigDescription(javaDoc); + ParsedJavadoc parsed = JavadocToAsciidocTransformer.INSTANCE.parseConfigItemJavadoc(javaDoc); - assertEquals(expectedOutput, parsed); + assertEquals(expectedOutput, parsed.description()); } @Test public void parseJavaDocWithLinkInlineSnippet() { String javaDoc = "{@link firstlink} {@link #secondlink} \n {@linkplain #third.link}"; String expectedOutput = "`firstlink` `secondlink` `third.link`"; - String parsed = parser.parseConfigDescription(javaDoc); + ParsedJavadoc parsed = JavadocToAsciidocTransformer.INSTANCE.parseConfigItemJavadoc(javaDoc); - assertEquals(expectedOutput, parsed); + assertEquals(expectedOutput, parsed.description()); } @Test public void parseJavaDocWithLinkTag() { String javaDoc = "this is a hello link"; String expectedOutput = "this is a link:http://link.com[hello] link"; - String parsed = parser.parseConfigDescription(javaDoc); + ParsedJavadoc parsed = JavadocToAsciidocTransformer.INSTANCE.parseConfigItemJavadoc(javaDoc); - assertEquals(expectedOutput, parsed); + assertEquals(expectedOutput, parsed.description()); } @Test public void parseJavaDocWithCodeInlineSnippet() { String javaDoc = "{@code true} {@code false}"; String expectedOutput = "`true` `false`"; - String parsed = parser.parseConfigDescription(javaDoc); + ParsedJavadoc parsed = JavadocToAsciidocTransformer.INSTANCE.parseConfigItemJavadoc(javaDoc); - assertEquals(expectedOutput, parsed); + assertEquals(expectedOutput, parsed.description()); } @Test public void parseJavaDocWithLiteralInlineSnippet() { String javaDoc = "{@literal java.util.Boolean}"; String expectedOutput = "`java.util.Boolean`"; - String parsed = parser.parseConfigDescription(javaDoc); + ParsedJavadoc parsed = JavadocToAsciidocTransformer.INSTANCE.parseConfigItemJavadoc(javaDoc); - assertEquals(expectedOutput, parsed); + assertEquals(expectedOutput, parsed.description()); } @Test public void parseJavaDocWithValueInlineSnippet() { String javaDoc = "{@value 10s}"; String expectedOutput = "`10s`"; - String parsed = parser.parseConfigDescription(javaDoc); + ParsedJavadoc parsed = JavadocToAsciidocTransformer.INSTANCE.parseConfigItemJavadoc(javaDoc); - assertEquals(expectedOutput, parsed); + assertEquals(expectedOutput, parsed.description()); } @Test public void parseJavaDocWithUnknownInlineSnippet() { String javaDoc = "{@see java.util.Boolean}"; String expectedOutput = "java.util.Boolean"; - String parsed = parser.parseConfigDescription(javaDoc); + ParsedJavadoc parsed = JavadocToAsciidocTransformer.INSTANCE.parseConfigItemJavadoc(javaDoc); - assertEquals(expectedOutput, parsed); + assertEquals(expectedOutput, parsed.description()); } @Test public void parseJavaDocWithUnknownNode() { String javaDoc = "hello"; String expectedOutput = "hello"; - String parsed = parser.parseConfigDescription(javaDoc); + ParsedJavadoc parsed = JavadocToAsciidocTransformer.INSTANCE.parseConfigItemJavadoc(javaDoc); - assertEquals(expectedOutput, parsed); + assertEquals(expectedOutput, parsed.description()); } @Test @@ -220,46 +215,49 @@ public void parseJavaDocWithBlockquoteBlock() { + "____\n" + "\n" + "That was interesting, wasn't it?", - parser.parseConfigDescription("See Section 4.5.5 of the JSR 380 specification, specifically\n" - + "\n" - + "
\n" - + "In sub types (be it sub classes/interfaces or interface implementations), no parameter constraints may\n" - + "be declared on overridden or implemented methods, nor may parameters be marked for cascaded validation.\n" - + "This would pose a strengthening of preconditions to be fulfilled by the caller.\n" - + "
\nThat was interesting, wasn't it?")); + JavadocToAsciidocTransformer.INSTANCE + .parseConfigItemJavadoc("See Section 4.5.5 of the JSR 380 specification, specifically\n" + + "\n" + + "
\n" + + "In sub types (be it sub classes/interfaces or interface implementations), no parameter constraints may\n" + + "be declared on overridden or implemented methods, nor may parameters be marked for cascaded validation.\n" + + "This would pose a strengthening of preconditions to be fulfilled by the caller.\n" + + "
\nThat was interesting, wasn't it?") + .description()); assertEquals( "Some HTML entities & special characters:\n\n```\n|[/variant]|/[/variant]\n```\n\nbaz", - parser.parseConfigDescription( - "Some HTML entities & special characters:\n\n
<os>|<arch>[/variant]|<os>/<arch>[/variant]\n
\n\nbaz")); + JavadocToAsciidocTransformer.INSTANCE.parseConfigItemJavadoc( + "Some HTML entities & special characters:\n\n
<os>|<arch>[/variant]|<os>/<arch>[/variant]\n
\n\nbaz") + .description()); // TODO // assertEquals("Example:\n\n```\nfoo\nbar\n```", - // parser.parseConfigDescription("Example:\n\n
{@code\nfoo\nbar\n}
")); + // JavadocToAsciidocTransformer.INSTANCE.parseConfigItemJavadoc("Example:\n\n
{@code\nfoo\nbar\n}
")); } @Test public void parseJavaDocWithCodeBlock() { assertEquals("Example:\n\n```\nfoo\nbar\n```\n\nbaz", - parser.parseConfigDescription("Example:\n\n
\nfoo\nbar\n
\n\nbaz")); + JavadocToAsciidocTransformer.INSTANCE.parseConfigItemJavadoc("Example:\n\n
\nfoo\nbar\n
\n\nbaz") + .description()); assertEquals( "Some HTML entities & special characters:\n\n```\n|[/variant]|/[/variant]\n```\n\nbaz", - parser.parseConfigDescription( - "Some HTML entities & special characters:\n\n
<os>|<arch>[/variant]|<os>/<arch>[/variant]\n
\n\nbaz")); + JavadocToAsciidocTransformer.INSTANCE.parseConfigItemJavadoc( + "Some HTML entities & special characters:\n\n
<os>|<arch>[/variant]|<os>/<arch>[/variant]\n
\n\nbaz") + .description()); // TODO // assertEquals("Example:\n\n```\nfoo\nbar\n```", - // parser.parseConfigDescription("Example:\n\n
{@code\nfoo\nbar\n}
")); + // JavadocToAsciidocTransformer.INSTANCE.parseConfigItemJavadoc("Example:\n\n
{@code\nfoo\nbar\n}
")); } @Test public void since() { - AtomicReference javadoc = new AtomicReference<>(); - AtomicReference since = new AtomicReference<>(); - parser.parseConfigDescription("Javadoc text\n\n@since 1.2.3", javadoc::set, since::set); - assertEquals("Javadoc text", javadoc.get()); - assertEquals("1.2.3", since.get()); + ParsedJavadoc parsed = JavadocToAsciidocTransformer.INSTANCE.parseConfigItemJavadoc("Javadoc text\n\n@since 1.2.3"); + assertEquals("Javadoc text", parsed.description()); + assertEquals("1.2.3", parsed.since()); } @Test @@ -278,7 +276,8 @@ public void asciidoc() { "And some code\n" + "----"; - assertEquals(asciidoc, parser.parseConfigDescription(asciidoc + "\n" + "@asciidoclet")); + assertEquals(asciidoc, + JavadocToAsciidocTransformer.INSTANCE.parseConfigItemJavadoc(asciidoc + "\n" + "@asciidoclet").description()); } @Test @@ -290,7 +289,8 @@ public void asciidocLists() { " * 1.2\n" + "* 2"; - assertEquals(asciidoc, parser.parseConfigDescription(asciidoc + "\n" + "@asciidoclet")); + assertEquals(asciidoc, + JavadocToAsciidocTransformer.INSTANCE.parseConfigItemJavadoc(asciidoc + "\n" + "@asciidoclet").description()); } @ParameterizedTest @@ -299,7 +299,7 @@ public void escape(String ch) { final String javaDoc = "Inline " + ch + " " + ch + ch + ", HTML tag glob " + ch + " " + ch + ch + ", {@code JavaDoc tag " + ch + " " + ch + ch + "}"; - final String asciiDoc = parser.parseConfigDescription(javaDoc); + final String asciiDoc = JavadocToAsciidocTransformer.INSTANCE.parseConfigItemJavadoc(javaDoc).description(); final String actual = Factory.create().convert(asciiDoc, Collections.emptyMap()); final String expected = "
\n

Inline " + ch + " " + ch + ch + ", HTML tag glob " + ch + " " + ch + ch + ", JavaDoc tag " + ch + " " + ch + ch + "

\n
"; @@ -312,7 +312,8 @@ public void escapeInsideInlineElement(String ch) { final String javaDoc = "Inline " + ch + " " + ch + ch + ", HTML tag glob " + ch + " " + ch + ch + ", {@code JavaDoc tag " + ch + " " + ch + ch + "}"; - final String asciiDoc = new JavaDocParser(true).parseConfigDescription(javaDoc); + final String asciiDoc = JavadocToAsciidocTransformer.INLINE_MACRO_INSTANCE.parseConfigItemJavadoc(javaDoc) + .description(); final String actual = Factory.create().convert(asciiDoc, Collections.emptyMap()); if (ch.equals("]")) { @@ -328,7 +329,7 @@ public void escapePlus() { final String javaDoc = "Inline + ++, HTML tag glob + ++, {@code JavaDoc tag + ++}"; final String expected = "
\n

Inline + ++, HTML tag glob + ++, JavaDoc tag + ++

\n
"; - final String asciiDoc = parser.parseConfigDescription(javaDoc); + final String asciiDoc = JavadocToAsciidocTransformer.INSTANCE.parseConfigItemJavadoc(javaDoc).description(); final String actual = Factory.create().convert(asciiDoc, Collections.emptyMap()); assertEquals(expected, actual); } @@ -341,30 +342,30 @@ public void escapeBrackets(String ch) { final String expected = "
\n

Inline " + ch + " " + ch + ch + ", HTML tag glob " + ch + " " + ch + ch + "

\n
"; - final String asciiDoc = parser.parseConfigDescription(javaDoc); + final String asciiDoc = JavadocToAsciidocTransformer.INSTANCE.parseConfigItemJavadoc(javaDoc).description(); final String actual = Factory.create().convert(asciiDoc, Collections.emptyMap()); assertEquals(expected, actual); } @Test void trim() { - assertEquals("+ \nfoo", JavaDocParser.trim(new StringBuilder("+ \nfoo"))); - assertEquals("+", JavaDocParser.trim(new StringBuilder(" +"))); - assertEquals("foo", JavaDocParser.trim(new StringBuilder(" +\nfoo"))); - assertEquals("foo +", JavaDocParser.trim(new StringBuilder("foo +"))); - assertEquals("foo", JavaDocParser.trim(new StringBuilder("foo"))); - assertEquals("+", JavaDocParser.trim(new StringBuilder("+ \n"))); - assertEquals("+", JavaDocParser.trim(new StringBuilder(" +\n+ \n"))); - assertEquals("", JavaDocParser.trim(new StringBuilder(" +\n"))); - assertEquals("foo", JavaDocParser.trim(new StringBuilder(" \n\tfoo"))); - assertEquals("foo", JavaDocParser.trim(new StringBuilder("foo \n\t"))); - assertEquals("foo", JavaDocParser.trim(new StringBuilder(" \n\tfoo \n\t"))); - assertEquals("", JavaDocParser.trim(new StringBuilder(""))); - assertEquals("", JavaDocParser.trim(new StringBuilder(" \n\t"))); - assertEquals("+", JavaDocParser.trim(new StringBuilder(" +"))); - assertEquals("", JavaDocParser.trim(new StringBuilder(" +\n"))); - assertEquals("", JavaDocParser.trim(new StringBuilder(" +\n +\n"))); - assertEquals("foo +\nbar", JavaDocParser.trim(new StringBuilder(" foo +\nbar +\n"))); + assertEquals("+ \nfoo", JavadocToAsciidocTransformer.trim(new StringBuilder("+ \nfoo"))); + assertEquals("+", JavadocToAsciidocTransformer.trim(new StringBuilder(" +"))); + assertEquals("foo", JavadocToAsciidocTransformer.trim(new StringBuilder(" +\nfoo"))); + assertEquals("foo +", JavadocToAsciidocTransformer.trim(new StringBuilder("foo +"))); + assertEquals("foo", JavadocToAsciidocTransformer.trim(new StringBuilder("foo"))); + assertEquals("+", JavadocToAsciidocTransformer.trim(new StringBuilder("+ \n"))); + assertEquals("+", JavadocToAsciidocTransformer.trim(new StringBuilder(" +\n+ \n"))); + assertEquals("", JavadocToAsciidocTransformer.trim(new StringBuilder(" +\n"))); + assertEquals("foo", JavadocToAsciidocTransformer.trim(new StringBuilder(" \n\tfoo"))); + assertEquals("foo", JavadocToAsciidocTransformer.trim(new StringBuilder("foo \n\t"))); + assertEquals("foo", JavadocToAsciidocTransformer.trim(new StringBuilder(" \n\tfoo \n\t"))); + assertEquals("", JavadocToAsciidocTransformer.trim(new StringBuilder(""))); + assertEquals("", JavadocToAsciidocTransformer.trim(new StringBuilder(" \n\t"))); + assertEquals("+", JavadocToAsciidocTransformer.trim(new StringBuilder(" +"))); + assertEquals("", JavadocToAsciidocTransformer.trim(new StringBuilder(" +\n"))); + assertEquals("", JavadocToAsciidocTransformer.trim(new StringBuilder(" +\n +\n"))); + assertEquals("foo +\nbar", JavadocToAsciidocTransformer.trim(new StringBuilder(" foo +\nbar +\n"))); } } diff --git a/core/processor/src/test/java/io/quarkus/annotation/processor/documentation/config/formatter/JavadocToAsciidocTransformerConfigSectionTest.java b/core/processor/src/test/java/io/quarkus/annotation/processor/documentation/config/formatter/JavadocToAsciidocTransformerConfigSectionTest.java new file mode 100644 index 0000000000000..190b32c9bba84 --- /dev/null +++ b/core/processor/src/test/java/io/quarkus/annotation/processor/documentation/config/formatter/JavadocToAsciidocTransformerConfigSectionTest.java @@ -0,0 +1,127 @@ +package io.quarkus.annotation.processor.documentation.config.formatter; + +import static org.junit.jupiter.api.Assertions.assertEquals; + +import org.junit.jupiter.api.Test; + +import io.quarkus.annotation.processor.documentation.config.discovery.ParsedJavadocSection; + +public class JavadocToAsciidocTransformerConfigSectionTest { + + @Test + public void parseNullSection() { + ParsedJavadocSection parsed = JavadocToAsciidocTransformer.INSTANCE.parseConfigSectionJavadoc(null); + assertEquals(null, parsed.details()); + assertEquals(null, parsed.title()); + } + + @Test + public void parseUntrimmedJavaDoc() { + ParsedJavadocSection parsed = JavadocToAsciidocTransformer.INSTANCE.parseConfigSectionJavadoc(" "); + assertEquals(null, parsed.title()); + assertEquals(null, parsed.details()); + + parsed = JavadocToAsciidocTransformer.INSTANCE.parseConfigSectionJavadoc("

"); + assertEquals(null, parsed.title()); + assertEquals(null, parsed.details()); + } + + @Test + public void passThroughAConfigSectionInAsciiDoc() { + String title = "My Asciidoc"; + String details = "Let's have a https://quarkus.io[link to our website].\n" + + "\n" + + "[TIP]\n" + + "====\n" + + "A nice tip\n" + + "====\n" + + "\n" + + "[source,java]\n" + + "----\n" + + "And some code\n" + + "----"; + + String asciidoc = "=== " + title + "\n\n" + details; + + ParsedJavadocSection sectionHolder = JavadocToAsciidocTransformer.INSTANCE + .parseConfigSectionJavadoc(asciidoc + "\n" + "@asciidoclet"); + assertEquals(title, sectionHolder.title()); + assertEquals(details, sectionHolder.details()); + + asciidoc = "Asciidoc title. \n" + + "\n" + + "Let's have a https://quarkus.io[link to our website].\n" + + "\n" + + "[TIP]\n" + + "====\n" + + "A nice tip\n" + + "====\n" + + "\n" + + "[source,java]\n" + + "----\n" + + "And some code\n" + + "----"; + + sectionHolder = JavadocToAsciidocTransformer.INSTANCE.parseConfigSectionJavadoc(asciidoc + "\n" + "@asciidoclet"); + assertEquals("Asciidoc title", sectionHolder.title()); + } + + @Test + public void parseSectionWithoutIntroduction() { + /** + * Simple javadoc + */ + String javaDoc = "Config Section"; + String expectedTitle = "Config Section"; + String expectedDetails = null; + ParsedJavadocSection sectionHolder = JavadocToAsciidocTransformer.INSTANCE.parseConfigSectionJavadoc(javaDoc); + assertEquals(expectedDetails, sectionHolder.details()); + assertEquals(expectedTitle, sectionHolder.title()); + + javaDoc = "Config Section."; + expectedTitle = "Config Section"; + expectedDetails = null; + sectionHolder = JavadocToAsciidocTransformer.INSTANCE.parseConfigSectionJavadoc(javaDoc); + assertEquals(expectedDetails, sectionHolder.details()); + assertEquals(expectedTitle, sectionHolder.title()); + + /** + * html javadoc + */ + javaDoc = "

Config Section

"; + expectedTitle = "Config Section"; + expectedDetails = null; + sectionHolder = JavadocToAsciidocTransformer.INSTANCE.parseConfigSectionJavadoc(javaDoc); + assertEquals(expectedDetails, sectionHolder.details()); + assertEquals(expectedTitle, sectionHolder.title()); + } + + @Test + public void parseSectionWithIntroduction() { + /** + * Simple javadoc + */ + String javaDoc = "Config Section .Introduction"; + String expectedDetails = "Introduction"; + String expectedTitle = "Config Section"; + assertEquals(expectedTitle, JavadocToAsciidocTransformer.INSTANCE.parseConfigSectionJavadoc(javaDoc).title()); + assertEquals(expectedDetails, JavadocToAsciidocTransformer.INSTANCE.parseConfigSectionJavadoc(javaDoc).details()); + + /** + * html javadoc + */ + javaDoc = "

Config Section

. Introduction"; + expectedDetails = "Introduction"; + assertEquals(expectedDetails, JavadocToAsciidocTransformer.INSTANCE.parseConfigSectionJavadoc(javaDoc).details()); + assertEquals(expectedTitle, JavadocToAsciidocTransformer.INSTANCE.parseConfigSectionJavadoc(javaDoc).title()); + } + + @Test + public void properlyParseConfigSectionWrittenInHtml() { + String javaDoc = "

Config Section.

This is section introduction"; + String expectedDetails = "This is section introduction"; + String title = "Config Section"; + assertEquals(expectedDetails, JavadocToAsciidocTransformer.INSTANCE.parseConfigSectionJavadoc(javaDoc).details()); + assertEquals(title, JavadocToAsciidocTransformer.INSTANCE.parseConfigSectionJavadoc(javaDoc).title()); + } +} diff --git a/core/processor/src/test/java/io/quarkus/annotation/processor/documentation/config/util/ConfigNamingUtilTest.java b/core/processor/src/test/java/io/quarkus/annotation/processor/documentation/config/util/ConfigNamingUtilTest.java new file mode 100644 index 0000000000000..ae98968392ea6 --- /dev/null +++ b/core/processor/src/test/java/io/quarkus/annotation/processor/documentation/config/util/ConfigNamingUtilTest.java @@ -0,0 +1,106 @@ +package io.quarkus.annotation.processor.documentation.config.util; + +import static org.junit.jupiter.api.Assertions.assertEquals; + +import org.junit.jupiter.api.Test; + +import io.quarkus.annotation.processor.documentation.config.model.ConfigPhase; + +public class ConfigNamingUtilTest { + + @Test + public void replaceNonAlphanumericByUnderscoresThenConvertToUpperCase() { + assertEquals("QUARKUS_DATASOURCE__DATASOURCE_NAME__JDBC_BACKGROUND_VALIDATION_INTERVAL", + ConfigNamingUtil.toEnvVarName("quarkus.datasource.\"datasource-name\".jdbc.background-validation-interval")); + assertEquals( + "QUARKUS_SECURITY_JDBC_PRINCIPAL_QUERY__NAMED_PRINCIPAL_QUERIES__BCRYPT_PASSWORD_MAPPER_ITERATION_COUNT_INDEX", + ConfigNamingUtil.toEnvVarName( + "quarkus.security.jdbc.principal-query.\"named-principal-queries\".bcrypt-password-mapper.iteration-count-index")); + } + + @Test + void getRootPrefixTest() { + String prefix = "quarkus"; + String name = Markers.HYPHENATED_ELEMENT_NAME; + String simpleClassName = "MyConfig"; + String actual = ConfigNamingUtil.getRootPrefix(prefix, name, simpleClassName, ConfigPhase.RUN_TIME); + assertEquals("quarkus.my", actual); + + prefix = "my.prefix"; + name = ""; + simpleClassName = "MyPrefix"; + actual = ConfigNamingUtil.getRootPrefix(prefix, name, simpleClassName, ConfigPhase.RUN_TIME); + assertEquals("my.prefix", actual); + + prefix = ""; + name = "my.prefix"; + simpleClassName = "MyPrefix"; + actual = ConfigNamingUtil.getRootPrefix(prefix, name, simpleClassName, ConfigPhase.RUN_TIME); + assertEquals("my.prefix", actual); + + prefix = "my"; + name = "prefix"; + simpleClassName = "MyPrefix"; + actual = ConfigNamingUtil.getRootPrefix(prefix, name, simpleClassName, ConfigPhase.RUN_TIME); + assertEquals("my.prefix", actual); + + prefix = "quarkus"; + name = "prefix"; + simpleClassName = "SomethingElse"; + actual = ConfigNamingUtil.getRootPrefix(prefix, name, simpleClassName, ConfigPhase.RUN_TIME); + assertEquals("quarkus.prefix", actual); + + prefix = ""; + name = Markers.HYPHENATED_ELEMENT_NAME; + simpleClassName = "SomethingElse"; + actual = ConfigNamingUtil.getRootPrefix(prefix, name, simpleClassName, ConfigPhase.RUN_TIME); + assertEquals("quarkus.something-else", actual); + } + + @Test + public void derivingConfigRootNameTestCase() { + // should hyphenate class name + String simpleClassName = "RootName"; + String actual = ConfigNamingUtil.deriveConfigRootName(simpleClassName, "", ConfigPhase.RUN_TIME); + assertEquals("quarkus.root-name", actual); + + // should hyphenate class name after removing Config(uration) suffix + simpleClassName = "RootNameConfig"; + actual = ConfigNamingUtil.deriveConfigRootName(simpleClassName, "", ConfigPhase.BUILD_TIME); + assertEquals("quarkus.root-name", actual); + + simpleClassName = "RootNameConfiguration"; + actual = ConfigNamingUtil.deriveConfigRootName(simpleClassName, "", ConfigPhase.BUILD_AND_RUN_TIME_FIXED); + assertEquals("quarkus.root-name", actual); + + // should hyphenate class name after removing RunTimeConfig(uration) suffix + simpleClassName = "RootNameRunTimeConfig"; + actual = ConfigNamingUtil.deriveConfigRootName(simpleClassName, "", ConfigPhase.RUN_TIME); + assertEquals("quarkus.root-name", actual); + + simpleClassName = "RootNameRuntimeConfig"; + actual = ConfigNamingUtil.deriveConfigRootName(simpleClassName, "", ConfigPhase.RUN_TIME); + assertEquals("quarkus.root-name", actual); + + simpleClassName = "RootNameRunTimeConfiguration"; + actual = ConfigNamingUtil.deriveConfigRootName(simpleClassName, "", ConfigPhase.RUN_TIME); + assertEquals("quarkus.root-name", actual); + + // should hyphenate class name after removing BuildTimeConfig(uration) suffix + simpleClassName = "RootNameBuildTimeConfig"; + actual = ConfigNamingUtil.deriveConfigRootName(simpleClassName, "", ConfigPhase.BUILD_AND_RUN_TIME_FIXED); + assertEquals("quarkus.root-name", actual); + + simpleClassName = "RootNameBuildTimeConfiguration"; + actual = ConfigNamingUtil.deriveConfigRootName(simpleClassName, "", ConfigPhase.BUILD_TIME); + assertEquals("quarkus.root-name", actual); + + simpleClassName = "RootName"; + actual = ConfigNamingUtil.deriveConfigRootName(simpleClassName, "prefix", ConfigPhase.RUN_TIME); + assertEquals("prefix.root-name", actual); + + simpleClassName = "RootName"; + actual = ConfigNamingUtil.deriveConfigRootName(simpleClassName, "my.prefix", ConfigPhase.RUN_TIME); + assertEquals("my.prefix.root-name", actual); + } +} diff --git a/core/processor/src/test/java/io/quarkus/annotation/processor/documentation/config/util/JavadocUtilTest.java b/core/processor/src/test/java/io/quarkus/annotation/processor/documentation/config/util/JavadocUtilTest.java new file mode 100644 index 0000000000000..9fab0e55e0e52 --- /dev/null +++ b/core/processor/src/test/java/io/quarkus/annotation/processor/documentation/config/util/JavadocUtilTest.java @@ -0,0 +1,121 @@ +package io.quarkus.annotation.processor.documentation.config.util; + +import static org.junit.jupiter.api.Assertions.assertEquals; +import static org.junit.jupiter.api.Assertions.assertNull; + +import java.math.BigInteger; +import java.net.InetAddress; +import java.time.Duration; +import java.util.List; +import java.util.Map; + +import org.junit.jupiter.api.Test; + +public class JavadocUtilTest { + + @Test + public void shouldReturnEmptyListForPrimitiveValue() { + String value = JavadocUtil.getJavadocSiteLink("int"); + assertNull(value); + + value = JavadocUtil.getJavadocSiteLink("long"); + assertNull(value); + + value = JavadocUtil.getJavadocSiteLink("float"); + assertNull(value); + + value = JavadocUtil.getJavadocSiteLink("boolean"); + assertNull(value); + + value = JavadocUtil.getJavadocSiteLink("double"); + assertNull(value); + + value = JavadocUtil.getJavadocSiteLink("char"); + assertNull(value); + + value = JavadocUtil.getJavadocSiteLink("short"); + assertNull(value); + + value = JavadocUtil.getJavadocSiteLink("byte"); + assertNull(value); + + value = JavadocUtil.getJavadocSiteLink(Boolean.class.getName()); + assertNull(value); + + value = JavadocUtil.getJavadocSiteLink(Byte.class.getName()); + assertNull(value); + + value = JavadocUtil.getJavadocSiteLink(Short.class.getName()); + assertNull(value); + + value = JavadocUtil.getJavadocSiteLink(Integer.class.getName()); + assertNull(value); + + value = JavadocUtil.getJavadocSiteLink(Long.class.getName()); + assertNull(value); + + value = JavadocUtil.getJavadocSiteLink(Float.class.getName()); + assertNull(value); + + value = JavadocUtil.getJavadocSiteLink(Double.class.getName()); + assertNull(value); + + value = JavadocUtil.getJavadocSiteLink(Character.class.getName()); + assertNull(value); + } + + @Test + public void shouldReturnALinkToOfficialJavaDocIfIsJavaOfficialType() { + String value = JavadocUtil.getJavadocSiteLink(String.class.getName()); + // for String, we don't return a Javadoc link as it's a very basic type + assertNull(value); + + value = JavadocUtil.getJavadocSiteLink(InetAddress.class.getName()); + assertEquals(JavadocUtil.OFFICIAL_JAVA_DOC_BASE_LINK + "java/net/InetAddress.html", value); + + value = JavadocUtil.getJavadocSiteLink(BigInteger.class.getName()); + assertEquals(JavadocUtil.OFFICIAL_JAVA_DOC_BASE_LINK + "java/math/BigInteger.html", value); + + value = JavadocUtil.getJavadocSiteLink(Duration.class.getName()); + assertEquals(JavadocUtil.OFFICIAL_JAVA_DOC_BASE_LINK + "java/time/Duration.html", value); + + value = JavadocUtil.getJavadocSiteLink((Map.Entry.class.getName().replace('$', '.'))); + assertEquals(JavadocUtil.OFFICIAL_JAVA_DOC_BASE_LINK + "java/util/Map.Entry.html", value); + + value = JavadocUtil.getJavadocSiteLink(Map.Entry.class.getName()); + assertEquals(JavadocUtil.OFFICIAL_JAVA_DOC_BASE_LINK + "java/util/Map.Entry.html", value); + + value = JavadocUtil.getJavadocSiteLink(List.class.getName()); + assertEquals(JavadocUtil.OFFICIAL_JAVA_DOC_BASE_LINK + "java/util/List.html", value); + + value = JavadocUtil.getJavadocSiteLink("java.util.List"); + assertEquals(JavadocUtil.OFFICIAL_JAVA_DOC_BASE_LINK + "java/util/List.html", value); + } + + @Test + public void shouldReturnALinkToAgroalJavaDocIfTypeIsDeclaredInAgroalPackage() { + String value = JavadocUtil.getJavadocSiteLink( + "io.agroal.api.configuration.AgroalConnectionFactoryConfiguration.TransactionIsolation"); + assertEquals(JavadocUtil.AGROAL_API_JAVA_DOC_SITE + + "io/agroal/api/configuration/AgroalConnectionFactoryConfiguration.TransactionIsolation.html", value); + + value = JavadocUtil.getJavadocSiteLink("io.agroal.api.AgroalDataSource.FlushMode"); + assertEquals(JavadocUtil.AGROAL_API_JAVA_DOC_SITE + "io/agroal/api/AgroalDataSource.FlushMode.html", value); + } + + @Test + public void shouldReturnALinkToVertxJavaDocIfTypeIsDeclaredInVertxPackage() { + String value = JavadocUtil.getJavadocSiteLink( + "io.vertx.core.Context"); + assertEquals(JavadocUtil.VERTX_JAVA_DOC_SITE + "io/vertx/core/Context.html", value); + + value = JavadocUtil.getJavadocSiteLink("io.vertx.amqp.AmqpMessage"); + assertEquals(JavadocUtil.VERTX_JAVA_DOC_SITE + "io/vertx/amqp/AmqpMessage.html", value); + } + + @Test + public void shouldReturnEmptyLinkIfUnknownJavaDocType() { + String value = JavadocUtil.getJavadocSiteLink("io.quarkus.ConfigDocKey"); + assertNull(value); + } +} diff --git a/core/processor/src/test/java/io/quarkus/annotation/processor/documentation/config/util/TypeUtilTest.java b/core/processor/src/test/java/io/quarkus/annotation/processor/documentation/config/util/TypeUtilTest.java new file mode 100644 index 0000000000000..e25c5d652087f --- /dev/null +++ b/core/processor/src/test/java/io/quarkus/annotation/processor/documentation/config/util/TypeUtilTest.java @@ -0,0 +1,20 @@ +package io.quarkus.annotation.processor.documentation.config.util; + +import static org.junit.jupiter.api.Assertions.assertEquals; + +import org.junit.jupiter.api.Test; + +public class TypeUtilTest { + + @Test + public void normalizeDurationValueTest() { + assertEquals("", TypeUtil.normalizeDurationValue("")); + assertEquals("1S", TypeUtil.normalizeDurationValue("1")); + assertEquals("1S", TypeUtil.normalizeDurationValue("1S")); + assertEquals("1S", TypeUtil.normalizeDurationValue("1s")); + + // values are not validated here + assertEquals("1_000", TypeUtil.normalizeDurationValue("1_000")); + assertEquals("FOO", TypeUtil.normalizeDurationValue("foo")); + } +} diff --git a/core/processor/src/test/java/io/quarkus/annotation/processor/generate_doc/ConfigDocKeyTest.java b/core/processor/src/test/java/io/quarkus/annotation/processor/generate_doc/ConfigDocKeyTest.java deleted file mode 100644 index 8a5c4b0ba8324..0000000000000 --- a/core/processor/src/test/java/io/quarkus/annotation/processor/generate_doc/ConfigDocKeyTest.java +++ /dev/null @@ -1,54 +0,0 @@ -package io.quarkus.annotation.processor.generate_doc; - -import static org.junit.jupiter.api.Assertions.assertEquals; - -import java.time.Duration; -import java.util.List; -import java.util.Map; - -import org.junit.jupiter.api.BeforeEach; -import org.junit.jupiter.api.Test; - -public class ConfigDocKeyTest { - - private ConfigDocKey configDocKey; - - @BeforeEach - public void setup() { - configDocKey = new ConfigDocKey(); - } - - @Test - public void shouldComputePrimitiveSimpleName() { - configDocKey.setType(int.class.getSimpleName()); - String simpleName = configDocKey.computeTypeSimpleName(); - assertEquals(int.class.getSimpleName(), simpleName); - - configDocKey.setType(long.class.getSimpleName()); - simpleName = configDocKey.computeTypeSimpleName(); - assertEquals(long.class.getSimpleName(), simpleName); - - configDocKey.setType(boolean.class.getSimpleName()); - simpleName = configDocKey.computeTypeSimpleName(); - assertEquals(boolean.class.getSimpleName(), simpleName); - } - - @Test - public void shouldComputeClassSimpleName() { - configDocKey.setType(Duration.class.getName()); - String simpleName = configDocKey.computeTypeSimpleName(); - assertEquals(Duration.class.getSimpleName(), simpleName); - - configDocKey.setType(List.class.getName()); - simpleName = configDocKey.computeTypeSimpleName(); - assertEquals(List.class.getSimpleName(), simpleName); - - configDocKey.setType(String.class.getName()); - simpleName = configDocKey.computeTypeSimpleName(); - assertEquals(String.class.getSimpleName(), simpleName); - - configDocKey.setType(Map.Entry.class.getName()); - simpleName = configDocKey.computeTypeSimpleName(); - assertEquals(Map.Entry.class.getSimpleName(), simpleName); - } -} diff --git a/core/processor/src/test/java/io/quarkus/annotation/processor/generate_doc/DocGeneratorUtilTest.java b/core/processor/src/test/java/io/quarkus/annotation/processor/generate_doc/DocGeneratorUtilTest.java deleted file mode 100644 index 57fc8df1dee9f..0000000000000 --- a/core/processor/src/test/java/io/quarkus/annotation/processor/generate_doc/DocGeneratorUtilTest.java +++ /dev/null @@ -1,427 +0,0 @@ -package io.quarkus.annotation.processor.generate_doc; - -import static io.quarkus.annotation.processor.generate_doc.DocGeneratorUtil.AGROAL_API_JAVA_DOC_SITE; -import static io.quarkus.annotation.processor.generate_doc.DocGeneratorUtil.OFFICIAL_JAVA_DOC_BASE_LINK; -import static io.quarkus.annotation.processor.generate_doc.DocGeneratorUtil.VERTX_JAVA_DOC_SITE; -import static io.quarkus.annotation.processor.generate_doc.DocGeneratorUtil.appendConfigItemsIntoExistingOnes; -import static io.quarkus.annotation.processor.generate_doc.DocGeneratorUtil.computeConfigGroupDocFileName; -import static io.quarkus.annotation.processor.generate_doc.DocGeneratorUtil.computeConfigRootDocFileName; -import static io.quarkus.annotation.processor.generate_doc.DocGeneratorUtil.computeExtensionDocFileName; -import static io.quarkus.annotation.processor.generate_doc.DocGeneratorUtil.deriveConfigRootName; -import static io.quarkus.annotation.processor.generate_doc.DocGeneratorUtil.getJavaDocSiteLink; -import static io.quarkus.annotation.processor.generate_doc.DocGeneratorUtil.getName; -import static io.quarkus.annotation.processor.generate_doc.DocGeneratorUtil.normalizeDurationValue; -import static io.quarkus.annotation.processor.generate_doc.DocGeneratorUtil.toEnvVarName; -import static org.junit.jupiter.api.Assertions.assertEquals; - -import java.math.BigInteger; -import java.net.InetAddress; -import java.time.Duration; -import java.util.ArrayList; -import java.util.Arrays; -import java.util.Collections; -import java.util.List; -import java.util.Map; - -import org.junit.jupiter.api.Test; - -public class DocGeneratorUtilTest { - @Test - public void shouldReturnEmptyListForPrimitiveValue() { - String value = getJavaDocSiteLink("int"); - assertEquals(Constants.EMPTY, value); - - value = getJavaDocSiteLink("long"); - assertEquals(Constants.EMPTY, value); - - value = getJavaDocSiteLink("float"); - assertEquals(Constants.EMPTY, value); - - value = getJavaDocSiteLink("boolean"); - assertEquals(Constants.EMPTY, value); - - value = getJavaDocSiteLink("double"); - assertEquals(Constants.EMPTY, value); - - value = getJavaDocSiteLink("char"); - assertEquals(Constants.EMPTY, value); - - value = getJavaDocSiteLink("short"); - assertEquals(Constants.EMPTY, value); - - value = getJavaDocSiteLink("byte"); - assertEquals(Constants.EMPTY, value); - - value = getJavaDocSiteLink(Boolean.class.getName()); - assertEquals(Constants.EMPTY, value); - - value = getJavaDocSiteLink(Byte.class.getName()); - assertEquals(Constants.EMPTY, value); - - value = getJavaDocSiteLink(Short.class.getName()); - assertEquals(Constants.EMPTY, value); - - value = getJavaDocSiteLink(Integer.class.getName()); - assertEquals(Constants.EMPTY, value); - - value = getJavaDocSiteLink(Long.class.getName()); - assertEquals(Constants.EMPTY, value); - - value = getJavaDocSiteLink(Float.class.getName()); - assertEquals(Constants.EMPTY, value); - - value = getJavaDocSiteLink(Double.class.getName()); - assertEquals(Constants.EMPTY, value); - - value = getJavaDocSiteLink(Character.class.getName()); - assertEquals(Constants.EMPTY, value); - } - - @Test - public void shouldReturnALinkToOfficialJavaDocIfIsJavaOfficialType() { - String value = getJavaDocSiteLink(String.class.getName()); - assertEquals(OFFICIAL_JAVA_DOC_BASE_LINK + "java/lang/String.html", value); - - value = getJavaDocSiteLink(InetAddress.class.getName()); - assertEquals(OFFICIAL_JAVA_DOC_BASE_LINK + "java/net/InetAddress.html", value); - - value = getJavaDocSiteLink(BigInteger.class.getName()); - assertEquals(OFFICIAL_JAVA_DOC_BASE_LINK + "java/math/BigInteger.html", value); - - value = getJavaDocSiteLink(Duration.class.getName()); - assertEquals(OFFICIAL_JAVA_DOC_BASE_LINK + "java/time/Duration.html", value); - - value = getJavaDocSiteLink((Map.Entry.class.getName().replace('$', '.'))); - assertEquals(OFFICIAL_JAVA_DOC_BASE_LINK + "java/util/Map.Entry.html", value); - - value = getJavaDocSiteLink(Map.Entry.class.getName()); - assertEquals(OFFICIAL_JAVA_DOC_BASE_LINK + "java/util/Map.Entry.html", value); - - value = getJavaDocSiteLink(List.class.getName()); - assertEquals(OFFICIAL_JAVA_DOC_BASE_LINK + "java/util/List.html", value); - - value = getJavaDocSiteLink("java.util.List"); - assertEquals(OFFICIAL_JAVA_DOC_BASE_LINK + "java/util/List.html", value); - } - - @Test - public void replaceNonAlphanumericByUnderscoresThenConvertToUpperCase() { - assertEquals("QUARKUS_DATASOURCE__DATASOURCE_NAME__JDBC_BACKGROUND_VALIDATION_INTERVAL", - toEnvVarName("quarkus.datasource.\"datasource-name\".jdbc.background-validation-interval")); - assertEquals( - "QUARKUS_SECURITY_JDBC_PRINCIPAL_QUERY__NAMED_PRINCIPAL_QUERIES__BCRYPT_PASSWORD_MAPPER_ITERATION_COUNT_INDEX", - toEnvVarName( - "quarkus.security.jdbc.principal-query.\"named-principal-queries\".bcrypt-password-mapper.iteration-count-index")); - } - - @Test - public void shouldReturnALinkToAgroalJavaDocIfTypeIsDeclaredInAgroalPackage() { - String value = getJavaDocSiteLink( - "io.agroal.api.configuration.AgroalConnectionFactoryConfiguration.TransactionIsolation"); - assertEquals(AGROAL_API_JAVA_DOC_SITE - + "io/agroal/api/configuration/AgroalConnectionFactoryConfiguration.TransactionIsolation.html", value); - - value = getJavaDocSiteLink("io.agroal.api.AgroalDataSource.FlushMode"); - assertEquals(AGROAL_API_JAVA_DOC_SITE + "io/agroal/api/AgroalDataSource.FlushMode.html", value); - } - - @Test - public void shouldReturnALinkToVertxJavaDocIfTypeIsDeclaredInVertxPackage() { - String value = getJavaDocSiteLink( - "io.vertx.core.Context"); - assertEquals(VERTX_JAVA_DOC_SITE + "io/vertx/core/Context.html", value); - - value = getJavaDocSiteLink("io.vertx.amqp.AmqpMessage"); - assertEquals(VERTX_JAVA_DOC_SITE + "io/vertx/amqp/AmqpMessage.html", value); - } - - @Test - public void shouldReturnEmptyLinkIfUnknownJavaDocType() { - String value = getJavaDocSiteLink("io.quarkus.ConfigDocKey"); - assertEquals(Constants.EMPTY, value); - } - - @Test - public void shouldReturnConfigRootNameWhenComputingExtensionName() { - String configRoot = "org.acme.ConfigRoot"; - String expected = "org.acme.ConfigRoot.adoc"; - String fileName = computeExtensionDocFileName(configRoot); - assertEquals(expected, fileName); - } - - @Test - public void shouldUseCoreForConfigRootsCoreModuleWhenComputingExtensionName() { - String configRoot = "io.quarkus.runtime.RuntimeConfig"; - String expected = "quarkus-core.adoc"; - String fileName = computeExtensionDocFileName(configRoot); - assertEquals(expected, fileName); - - configRoot = "io.quarkus.deployment.BuildTimeConfig"; - expected = "quarkus-core.adoc"; - fileName = computeExtensionDocFileName(configRoot); - assertEquals(expected, fileName); - - configRoot = "io.quarkus.deployment.path.BuildTimeConfig"; - expected = "quarkus-core.adoc"; - fileName = computeExtensionDocFileName(configRoot); - assertEquals(expected, fileName); - } - - @Test - public void shouldGuessArtifactIdWhenComputingExtensionName() { - String configRoot = "io.quarkus.agroal.Config"; - String expected = "quarkus-agroal.adoc"; - String fileName = computeExtensionDocFileName(configRoot); - assertEquals(expected, fileName); - - configRoot = "io.quarkus.keycloak.Config"; - expected = "quarkus-keycloak.adoc"; - fileName = computeExtensionDocFileName(configRoot); - assertEquals(expected, fileName); - - configRoot = "io.quarkus.extension.name.BuildTimeConfig"; - expected = "quarkus-extension-name.adoc"; - fileName = computeExtensionDocFileName(configRoot); - assertEquals(expected, fileName); - } - - @Test - public void shouldUseHyphenatedClassNameWithoutRuntimeOrDeploymentNamespaceWhenComputingConfigGroupFileName() { - String configRoot = "ClassName"; - String expected = "config-group-class-name.adoc"; - String fileName = computeConfigGroupDocFileName(configRoot); - assertEquals(expected, fileName); - - configRoot = "io.quarkus.agroal.ConfigGroup"; - expected = "quarkus-agroal-config-group.adoc"; - fileName = computeConfigGroupDocFileName(configRoot); - assertEquals(expected, fileName); - - configRoot = "io.quarkus.agroal.runtime.ClassName"; - expected = "quarkus-agroal-config-group-class-name.adoc"; - fileName = computeConfigGroupDocFileName(configRoot); - assertEquals(expected, fileName); - - configRoot = "io.quarkus.keycloak.deployment.RealmConfig"; - expected = "quarkus-keycloak-config-group-realm-config.adoc"; - fileName = computeConfigGroupDocFileName(configRoot); - assertEquals(expected, fileName); - - configRoot = "io.quarkus.extension.deployment.BuildTimeConfig"; - expected = "quarkus-extension-config-group-build-time-config.adoc"; - fileName = computeConfigGroupDocFileName(configRoot); - assertEquals(expected, fileName); - - configRoot = "io.quarkus.extension.deployment.name.BuildTimeConfig"; - expected = "quarkus-extension-config-group-name-build-time-config.adoc"; - fileName = computeConfigGroupDocFileName(configRoot); - assertEquals(expected, fileName); - } - - @Test - public void shouldUseHyphenatedClassNameWithEverythingBeforeRuntimeOrDeploymentNamespaceReplacedByConfigRootNameWhenComputingConfigRootFileName() { - String configRoot = "ClassName"; - String expected = "root-name-class-name.adoc"; - String fileName = computeConfigRootDocFileName(configRoot, "root-name"); - assertEquals(expected, fileName); - - configRoot = "io.quarkus.agroal.runtime.ClassName"; - expected = "quarkus-datasource-class-name.adoc"; - fileName = computeConfigRootDocFileName(configRoot, "quarkus-datasource"); - assertEquals(expected, fileName); - - configRoot = "io.quarkus.keycloak.deployment.RealmConfig"; - expected = "quarkus-keycloak-realm-config.adoc"; - fileName = computeConfigRootDocFileName(configRoot, "quarkus-keycloak"); - assertEquals(expected, fileName); - - configRoot = "io.quarkus.extension.deployment.BuildTimeConfig"; - expected = "quarkus-root-10-build-time-config.adoc"; - fileName = computeConfigRootDocFileName(configRoot, "quarkus-root-10"); - assertEquals(expected, fileName); - - configRoot = "io.quarkus.extension.deployment.name.BuildTimeConfig"; - expected = "quarkus-config-root-name-build-time-config.adoc"; - fileName = computeConfigRootDocFileName(configRoot, "quarkus-config-root"); - assertEquals(expected, fileName); - } - - @Test - public void shouldPreserveExistingConfigItemsWhenAppendAnEmptyConfigItems() { - List existingConfigItems = Arrays.asList(new ConfigDocItem(), new ConfigDocItem()); - appendConfigItemsIntoExistingOnes(existingConfigItems, Collections.emptyList()); - assertEquals(2, existingConfigItems.size()); - } - - @Test - public void shouldAppendNewConfigItemsAtTheEndOfExistingConfigItems() { - List existingConfigItems = new ArrayList<>( - Arrays.asList(new ConfigDocItem(null, new ConfigDocKey()), new ConfigDocItem(null, new ConfigDocKey()))); - ConfigDocItem newItem = new ConfigDocItem(null, new ConfigDocKey()); - ConfigDocSection configDocSection = new ConfigDocSection(); - configDocSection.setSectionDetailsTitle("title"); - ConfigDocItem section = new ConfigDocItem(configDocSection, null); - List newConfigItems = Arrays.asList(newItem, section); - - appendConfigItemsIntoExistingOnes(existingConfigItems, newConfigItems); - - assertEquals(4, existingConfigItems.size()); - List addedList = existingConfigItems.subList(2, 4); - assertEquals(newItem, addedList.get(0)); - assertEquals(section, addedList.get(1)); - } - - @Test - public void shouldAppendConfigSectionConfigItemsIntoExistingConfigItemsOfConfigSectionWithSameTitle() { - ConfigDocSection existingSection = new ConfigDocSection(); - existingSection.setSectionDetailsTitle("title"); - ConfigDocItem configItem = new ConfigDocItem(null, new ConfigDocKey()); - existingSection.addConfigDocItems(Arrays.asList(configItem)); - - ConfigDocItem configDocItem = new ConfigDocItem(existingSection, null); - List existingConfigItems = new ArrayList<>(Arrays.asList(configDocItem)); - - ConfigDocSection configDocSection = new ConfigDocSection(); - configDocSection.setSectionDetailsTitle("title"); - ConfigDocItem newConfigItem = new ConfigDocItem(null, new ConfigDocKey()); - configDocSection.addConfigDocItems(Arrays.asList(newConfigItem)); - ConfigDocItem section = new ConfigDocItem(configDocSection, null); - - appendConfigItemsIntoExistingOnes(existingConfigItems, Arrays.asList(section)); - - assertEquals(1, existingConfigItems.size()); - assertEquals(2, existingSection.getConfigDocItems().size()); - - assertEquals(configItem, existingSection.getConfigDocItems().get(0)); - assertEquals(newConfigItem, existingSection.getConfigDocItems().get(1)); - } - - // TODO - should deep merge be supported? Or we should only merge top level sections? - @Test - public void shouldDeepAppendConfigSectionConfigItemsIntoExistingConfigItemsOfConfigSectionWithSameTitle() { - ConfigDocSection deepSection = new ConfigDocSection(); - deepSection.setSectionDetailsTitle("title"); - ConfigDocItem deepConfigKey = new ConfigDocItem(null, new ConfigDocKey()); - deepSection.addConfigDocItems(Arrays.asList(deepConfigKey)); - ConfigDocItem deepConfigItem = new ConfigDocItem(deepSection, null); - - ConfigDocSection section = new ConfigDocSection(); - section.setSectionDetailsTitle(""); - section.addConfigDocItems(Arrays.asList(deepConfigItem)); - - ConfigDocItem configItemWithDeepSection = new ConfigDocItem(section, null); - List existingConfigItems = new ArrayList<>(Arrays.asList(configItemWithDeepSection)); - - ConfigDocSection configDocSection = new ConfigDocSection(); - configDocSection.setSectionDetailsTitle("title"); - ConfigDocItem configItem = new ConfigDocItem(null, new ConfigDocKey()); - configDocSection.addConfigDocItems(Arrays.asList(configItem)); - ConfigDocItem configDocItem = new ConfigDocItem(configDocSection, null); - - appendConfigItemsIntoExistingOnes(existingConfigItems, Arrays.asList(configDocItem)); - - assertEquals(1, existingConfigItems.size()); - assertEquals(2, deepSection.getConfigDocItems().size()); - - assertEquals(deepConfigKey, deepSection.getConfigDocItems().get(0)); - assertEquals(configItem, deepSection.getConfigDocItems().get(1)); - } - - @Test - void getNameTest() { - String prefix = Constants.QUARKUS; - String name = Constants.HYPHENATED_ELEMENT_NAME; - String simpleClassName = "MyConfig"; - String actual = getName(prefix, name, simpleClassName, ConfigPhase.RUN_TIME); - assertEquals("quarkus.my", actual); - - prefix = "my.prefix"; - name = ""; - simpleClassName = "MyPrefix"; - actual = getName(prefix, name, simpleClassName, ConfigPhase.RUN_TIME); - assertEquals("my.prefix", actual); - - prefix = ""; - name = "my.prefix"; - simpleClassName = "MyPrefix"; - actual = getName(prefix, name, simpleClassName, ConfigPhase.RUN_TIME); - assertEquals("my.prefix", actual); - - prefix = "my"; - name = "prefix"; - simpleClassName = "MyPrefix"; - actual = getName(prefix, name, simpleClassName, ConfigPhase.RUN_TIME); - assertEquals("my.prefix", actual); - - prefix = Constants.QUARKUS; - name = "prefix"; - simpleClassName = "SomethingElse"; - actual = getName(prefix, name, simpleClassName, ConfigPhase.RUN_TIME); - assertEquals("quarkus.prefix", actual); - - prefix = ""; - name = Constants.HYPHENATED_ELEMENT_NAME; - simpleClassName = "SomethingElse"; - actual = getName(prefix, name, simpleClassName, ConfigPhase.RUN_TIME); - assertEquals("quarkus.something-else", actual); - } - - @Test - public void derivingConfigRootNameTestCase() { - // should hyphenate class name - String simpleClassName = "RootName"; - String actual = deriveConfigRootName(simpleClassName, "", ConfigPhase.RUN_TIME); - assertEquals("quarkus.root-name", actual); - - // should hyphenate class name after removing Config(uration) suffix - simpleClassName = "RootNameConfig"; - actual = deriveConfigRootName(simpleClassName, "", ConfigPhase.BUILD_TIME); - assertEquals("quarkus.root-name", actual); - - simpleClassName = "RootNameConfiguration"; - actual = deriveConfigRootName(simpleClassName, "", ConfigPhase.BUILD_AND_RUN_TIME_FIXED); - assertEquals("quarkus.root-name", actual); - - // should hyphenate class name after removing RunTimeConfig(uration) suffix - simpleClassName = "RootNameRunTimeConfig"; - actual = deriveConfigRootName(simpleClassName, "", ConfigPhase.RUN_TIME); - assertEquals("quarkus.root-name", actual); - - simpleClassName = "RootNameRuntimeConfig"; - actual = deriveConfigRootName(simpleClassName, "", ConfigPhase.RUN_TIME); - assertEquals("quarkus.root-name", actual); - - simpleClassName = "RootNameRunTimeConfiguration"; - actual = deriveConfigRootName(simpleClassName, "", ConfigPhase.RUN_TIME); - assertEquals("quarkus.root-name", actual); - - // should hyphenate class name after removing BuildTimeConfig(uration) suffix - simpleClassName = "RootNameBuildTimeConfig"; - actual = deriveConfigRootName(simpleClassName, "", ConfigPhase.BUILD_AND_RUN_TIME_FIXED); - assertEquals("quarkus.root-name", actual); - - simpleClassName = "RootNameBuildTimeConfiguration"; - actual = deriveConfigRootName(simpleClassName, "", ConfigPhase.BUILD_TIME); - assertEquals("quarkus.root-name", actual); - - simpleClassName = "RootName"; - actual = deriveConfigRootName(simpleClassName, "prefix", ConfigPhase.RUN_TIME); - assertEquals("prefix.root-name", actual); - - simpleClassName = "RootName"; - actual = deriveConfigRootName(simpleClassName, "my.prefix", ConfigPhase.RUN_TIME); - assertEquals("my.prefix.root-name", actual); - } - - @Test - public void normalizeDurationValueTest() { - assertEquals("", normalizeDurationValue("")); - assertEquals("1S", normalizeDurationValue("1")); - assertEquals("1S", normalizeDurationValue("1S")); - assertEquals("1S", normalizeDurationValue("1s")); - - // values are not validated here - assertEquals("1_000", normalizeDurationValue("1_000")); - assertEquals("FOO", normalizeDurationValue("foo")); - } -} diff --git a/core/processor/src/test/java/io/quarkus/annotation/processor/generate_doc/JavaDocConfigSectionParserTest.java b/core/processor/src/test/java/io/quarkus/annotation/processor/generate_doc/JavaDocConfigSectionParserTest.java deleted file mode 100644 index bae3690f84962..0000000000000 --- a/core/processor/src/test/java/io/quarkus/annotation/processor/generate_doc/JavaDocConfigSectionParserTest.java +++ /dev/null @@ -1,150 +0,0 @@ -package io.quarkus.annotation.processor.generate_doc; - -import static org.junit.jupiter.api.Assertions.assertEquals; - -import org.junit.jupiter.api.BeforeEach; -import org.junit.jupiter.api.Test; - -public class JavaDocConfigSectionParserTest { - - private JavaDocParser parser; - - @BeforeEach - public void setup() { - parser = new JavaDocParser(); - } - - @Test - public void parseNullSection() { - JavaDocParser.SectionHolder parsed = parser.parseConfigSection(null, 1); - assertEquals("", parsed.details); - assertEquals("", parsed.title); - } - - @Test - public void parseUntrimmedJavaDoc() { - JavaDocParser.SectionHolder parsed = parser.parseConfigSection(" ", 1); - assertEquals("", parsed.details); - assertEquals("", parsed.title); - - parsed = parser.parseConfigSection("

", 1); - assertEquals("", parsed.details); - assertEquals("", parsed.title); - } - - @Test - public void passThroughAConfigSectionInAsciiDoc() { - String asciidoc = "=== My Asciidoc\n" + - "\n" + - ".Let's have a https://quarkus.io[link to our website].\n" + - "\n" + - "[TIP]\n" + - "====\n" + - "A nice tip\n" + - "====\n" + - "\n" + - "[source,java]\n" + - "----\n" + - "And some code\n" + - "----"; - - JavaDocParser.SectionHolder sectionHolder = parser.parseConfigSection(asciidoc + "\n" + "@asciidoclet", 1); - assertEquals(asciidoc, sectionHolder.details); - assertEquals("My Asciidoc", sectionHolder.title); - - asciidoc = "Asciidoc title. \n" + - "\n" + - "Let's have a https://quarkus.io[link to our website].\n" + - "\n" + - "[TIP]\n" + - "====\n" + - "A nice tip\n" + - "====\n" + - "\n" + - "[source,java]\n" + - "----\n" + - "And some code\n" + - "----"; - - sectionHolder = parser.parseConfigSection(asciidoc + "\n" + "@asciidoclet", 1); - assertEquals("Asciidoc title", sectionHolder.title); - } - - @Test - public void parseSectionWithoutIntroduction() { - /** - * Simple javadoc - */ - String javaDoc = "Config Section"; - String expectedTitle = "Config Section"; - String expectedDetails = "== Config Section"; - JavaDocParser.SectionHolder sectionHolder = parser.parseConfigSection(javaDoc, 1); - assertEquals(expectedDetails, sectionHolder.details); - assertEquals(expectedTitle, sectionHolder.title); - - javaDoc = "Config Section."; - expectedTitle = "Config Section"; - expectedDetails = "== Config Section"; - assertEquals(expectedDetails, parser.parseConfigSection(javaDoc, 1).details); - assertEquals(expectedTitle, sectionHolder.title); - - /** - * html javadoc - */ - javaDoc = "

Config Section

"; - expectedTitle = "Config Section"; - expectedDetails = "== Config Section"; - assertEquals(expectedDetails, parser.parseConfigSection(javaDoc, 1).details); - assertEquals(expectedTitle, sectionHolder.title); - } - - @Test - public void parseSectionWithIntroduction() { - /** - * Simple javadoc - */ - String javaDoc = "Config Section .Introduction"; - String expectedDetails = "== Config Section\n\nIntroduction"; - String expectedTitle = "Config Section"; - assertEquals(expectedTitle, parser.parseConfigSection(javaDoc, 1).title); - assertEquals(expectedDetails, parser.parseConfigSection(javaDoc, 1).details); - - /** - * html javadoc - */ - javaDoc = "

Config Section

. Introduction"; - expectedDetails = "== Config Section\n\nIntroduction"; - assertEquals(expectedDetails, parser.parseConfigSection(javaDoc, 1).details); - assertEquals(expectedTitle, parser.parseConfigSection(javaDoc, 1).title); - } - - @Test - public void properlyParseConfigSectionWrittenInHtml() { - String javaDoc = "

Config Section.

This is section introduction"; - String expectedDetails = "== Config Section\n\nThis is section introduction"; - String title = "Config Section"; - assertEquals(expectedDetails, parser.parseConfigSection(javaDoc, 1).details); - assertEquals(title, parser.parseConfigSection(javaDoc, 1).title); - } - - @Test - public void handleSectionLevelCorrectly() { - String javaDoc = "

Config Section.

This is section introduction"; - - // level 0 should default to 1 - String expectedDetails = "= Config Section\n\nThis is section introduction"; - assertEquals(expectedDetails, parser.parseConfigSection(javaDoc, 0).details); - - // level 1 - expectedDetails = "== Config Section\n\nThis is section introduction"; - assertEquals(expectedDetails, parser.parseConfigSection(javaDoc, 1).details); - - // level 2 - expectedDetails = "=== Config Section\n\nThis is section introduction"; - assertEquals(expectedDetails, parser.parseConfigSection(javaDoc, 2).details); - - // level 3 - expectedDetails = "==== Config Section\n\nThis is section introduction"; - assertEquals(expectedDetails, parser.parseConfigSection(javaDoc, 3).details); - } -} From 348ff550449fc53e6bcb63948d35ee6f5d54401b Mon Sep 17 00:00:00 2001 From: Guillaume Smet Date: Tue, 6 Aug 2024 15:24:02 +0200 Subject: [PATCH 39/43] Simplify generated doc directory structure This should be a lot easier to maintain in the future. Also adapt sync-web-site.sh to the new structure. --- .../config/doc/GenerateAsciidocMojo.java | 2 +- docs/pom.xml | 13 ++--- docs/src/main/asciidoc/_attributes-local.adoc | 5 +- docs/src/main/asciidoc/all-builditems.adoc | 2 +- docs/src/main/asciidoc/all-config.adoc | 2 +- docs/src/main/asciidoc/amqp-reference.adoc | 2 +- .../main/asciidoc/building-native-image.adoc | 2 +- .../asciidoc/cache-infinispan-reference.adoc | 2 +- .../main/asciidoc/cache-redis-reference.adoc | 2 +- docs/src/main/asciidoc/cache.adoc | 2 +- docs/src/main/asciidoc/cdi-reference.adoc | 2 +- .../asciidoc/centralized-log-management.adoc | 2 +- .../asciidoc/class-loading-reference.adoc | 2 +- docs/src/main/asciidoc/config-reference.adoc | 2 +- docs/src/main/asciidoc/container-image.adoc | 10 ++-- .../src/main/asciidoc/continuous-testing.adoc | 2 +- .../main/asciidoc/databases-dev-services.adoc | 2 +- docs/src/main/asciidoc/datasource.adoc | 16 +++--- .../asciidoc/deploying-to-kubernetes.adoc | 8 +-- .../main/asciidoc/deploying-to-openshift.adoc | 2 +- docs/src/main/asciidoc/dev-services.adoc | 26 +++++----- .../asciidoc/elasticsearch-dev-services.adoc | 2 +- docs/src/main/asciidoc/elasticsearch.adoc | 2 +- docs/src/main/asciidoc/flyway.adoc | 2 +- docs/src/main/asciidoc/getting-started.adoc | 2 +- docs/src/main/asciidoc/gradle-tooling.adoc | 2 +- .../asciidoc/grpc-service-consumption.adoc | 4 +- .../asciidoc/grpc-service-implementation.adoc | 2 +- docs/src/main/asciidoc/grpc-xds.adoc | 4 +- docs/src/main/asciidoc/hibernate-orm.adoc | 2 +- .../src/main/asciidoc/hibernate-reactive.adoc | 2 +- .../hibernate-search-orm-elasticsearch.adoc | 4 +- ...rnate-search-standalone-elasticsearch.adoc | 2 +- docs/src/main/asciidoc/http-reference.adoc | 10 ++-- .../asciidoc/infinispan-client-reference.adoc | 2 +- .../asciidoc/infinispan-dev-services.adoc | 2 +- docs/src/main/asciidoc/jfr.adoc | 2 +- docs/src/main/asciidoc/kafka-streams.adoc | 2 +- docs/src/main/asciidoc/kubernetes-client.adoc | 2 +- docs/src/main/asciidoc/kubernetes-config.adoc | 2 +- docs/src/main/asciidoc/liquibase-mongodb.adoc | 2 +- docs/src/main/asciidoc/liquibase.adoc | 2 +- .../asciidoc/load-shedding-reference.adoc | 2 +- docs/src/main/asciidoc/logging.adoc | 4 +- docs/src/main/asciidoc/mailer-reference.adoc | 2 +- .../management-interface-reference.adoc | 2 +- docs/src/main/asciidoc/maven-tooling.adoc | 4 +- docs/src/main/asciidoc/mongodb.adoc | 2 +- docs/src/main/asciidoc/openapi-swaggerui.adoc | 4 +- docs/src/main/asciidoc/opentelemetry.adoc | 2 +- docs/src/main/asciidoc/picocli.adoc | 2 +- .../main/asciidoc/quarkus-maven-plugin.adoc | 2 +- docs/src/main/asciidoc/quartz.adoc | 2 +- docs/src/main/asciidoc/qute-reference.adoc | 2 +- docs/src/main/asciidoc/qute.adoc | 2 +- .../src/main/asciidoc/rabbitmq-reference.adoc | 2 +- .../main/asciidoc/reactive-sql-clients.adoc | 14 ++--- .../src/main/asciidoc/redis-dev-services.adoc | 2 +- docs/src/main/asciidoc/redis-reference.adoc | 2 +- docs/src/main/asciidoc/resteasy.adoc | 2 +- .../main/asciidoc/scheduler-reference.adoc | 2 +- docs/src/main/asciidoc/scheduler.adoc | 2 +- .../security-authentication-mechanisms.adoc | 2 +- docs/src/main/asciidoc/security-cors.adoc | 2 +- .../asciidoc/security-csrf-prevention.adoc | 2 +- docs/src/main/asciidoc/security-jdbc.adoc | 2 +- docs/src/main/asciidoc/security-jpa.adoc | 2 +- docs/src/main/asciidoc/security-jwt.adoc | 2 +- .../security-keycloak-admin-client.adoc | 2 +- .../security-keycloak-authorization.adoc | 2 +- docs/src/main/asciidoc/security-ldap.adoc | 2 +- docs/src/main/asciidoc/security-oauth2.adoc | 2 +- ...dc-configuration-properties-reference.adoc | 4 +- ...urity-openid-connect-client-reference.adoc | 4 +- .../main/asciidoc/security-properties.adoc | 2 +- docs/src/main/asciidoc/security-webauthn.adoc | 2 +- docs/src/main/asciidoc/smallrye-graphql.adoc | 2 +- docs/src/main/asciidoc/smallrye-health.adoc | 2 +- docs/src/main/asciidoc/smallrye-metrics.adoc | 2 +- .../asciidoc/spring-cloud-config-client.adoc | 2 +- docs/src/main/asciidoc/spring-di.adoc | 2 +- docs/src/main/asciidoc/stork-reference.adoc | 2 +- .../telemetry-micrometer-tutorial.adoc | 10 ++-- .../main/asciidoc/telemetry-micrometer.adoc | 2 +- .../main/asciidoc/tests-with-coverage.adoc | 2 +- .../main/asciidoc/tls-registry-reference.adoc | 2 +- docs/src/main/asciidoc/validation.adoc | 2 +- docs/src/main/asciidoc/vertx-reference.adoc | 2 +- .../asciidoc/websockets-next-reference.adoc | 2 +- .../src/main/asciidoc/writing-extensions.adoc | 4 +- .../AssembleDownstreamDocumentation.java | 52 ++++--------------- docs/sync-web-site.sh | 14 ++--- 92 files changed, 160 insertions(+), 198 deletions(-) diff --git a/devtools/config-doc-maven-plugin/src/main/java/io/quarkus/maven/config/doc/GenerateAsciidocMojo.java b/devtools/config-doc-maven-plugin/src/main/java/io/quarkus/maven/config/doc/GenerateAsciidocMojo.java index df37f7ba84f53..94f3d5d48ce6f 100644 --- a/devtools/config-doc-maven-plugin/src/main/java/io/quarkus/maven/config/doc/GenerateAsciidocMojo.java +++ b/devtools/config-doc-maven-plugin/src/main/java/io/quarkus/maven/config/doc/GenerateAsciidocMojo.java @@ -68,7 +68,7 @@ public class GenerateAsciidocMojo extends AbstractMojo { @Parameter private File scanDirectory; - @Parameter(defaultValue = "${project.build.directory}/quarkus-config-doc", required = true) + @Parameter(defaultValue = "${project.build.directory}/quarkus-generated-doc/config", required = true) private File targetDirectory; @Parameter(defaultValue = "false") diff --git a/docs/pom.xml b/docs/pom.xml index ddd03d2f8c8b4..da9bc9f05edeb 100644 --- a/docs/pom.xml +++ b/docs/pom.xml @@ -34,10 +34,7 @@ https://quarkus.io https://github.com/quarkusio/quarkus https://github.com/quarkusio/quarkus-quickstarts - ${project.build.directory}/quarkus-config-doc ${project.build.directory}/quarkus-generated-doc - ${generated-dir}/infra - ${generated-dir}/examples docker.io/jdkato/vale:v2.15.5 @@ -3233,7 +3230,7 @@ io.quarkus.docs.generation.QuarkusMavenPluginDocsGenerator ${project.basedir}/../devtools/maven/target/classes/META-INF/maven/plugin.xml - ${generated-infra-doc-dir}/quarkus-maven-plugin-goals.adoc + ${generated-dir}/infra/quarkus-maven-plugin-goals.adoc ${env.MAVEN_CMD_LINE_ARGS} @@ -3252,7 +3249,7 @@ false io.quarkus.docs.generation.QuarkusBuildItemDoc - ${generated-infra-doc-dir}/quarkus-all-build-items.adoc + ${generated-dir}/infra/quarkus-all-build-items.adoc ${project.basedir}/../core/deployment ${project.basedir}/../extensions @@ -3273,7 +3270,7 @@ false io.quarkus.docs.generation.CopyExampleSource - ${code-examples-dir} + ${generated-dir}/examples ${project.basedir}/.. ${project.basedir}/target/asciidoc/sources @@ -3379,9 +3376,7 @@ target/asciidoc/sources true - ${infra-doc-dir} - ${generated-config-doc-dir} - ${code-examples-dir} + ${generated-dir} ./images font true diff --git a/docs/src/main/asciidoc/_attributes-local.adoc b/docs/src/main/asciidoc/_attributes-local.adoc index 8a4d499c87811..dc2433d8ff0d8 100644 --- a/docs/src/main/asciidoc/_attributes-local.adoc +++ b/docs/src/main/asciidoc/_attributes-local.adoc @@ -5,10 +5,7 @@ :idprefix: :idseparator: - :icons: font -:target-dir: ../../../target -:generated-config-doc-dir: {target-dir}/quarkus-config-doc -:generated-infra-doc-dir: {target-dir}/quarkus-generated-doc/infra -:code-examples: {target-dir}/quarkus-generated-doc/examples +:generated-dir: ../../../target/quarkus-generated-doc :doc-examples: ./_examples :imagesdir: ./images :includes: ./_includes diff --git a/docs/src/main/asciidoc/all-builditems.adoc b/docs/src/main/asciidoc/all-builditems.adoc index 22ec96f53ada1..2fcb996bfdc37 100644 --- a/docs/src/main/asciidoc/all-builditems.adoc +++ b/docs/src/main/asciidoc/all-builditems.adoc @@ -15,4 +15,4 @@ Here you can find a list of Build Items and the extension that provides them. icon:building[title=Non-instantiatable Build Item] Build item can't be instantiated directly, but can be extended/inherited from -include::{generated-infra-doc-dir}/quarkus-all-build-items.adoc[opts=optional] +include::{generated-dir}/infra/quarkus-all-build-items.adoc[opts=optional] diff --git a/docs/src/main/asciidoc/all-config.adoc b/docs/src/main/asciidoc/all-config.adoc index dcc4c823db06b..4a97e523641ae 100644 --- a/docs/src/main/asciidoc/all-config.adoc +++ b/docs/src/main/asciidoc/all-config.adoc @@ -11,4 +11,4 @@ include::_attributes.adoc[] :categories: core :summary: List all the configuration properties per extensions -include::{generated-config-doc-dir}/quarkus-all-config.adoc[opts=optional] +include::{generated-dir}/config/quarkus-all-config.adoc[opts=optional] diff --git a/docs/src/main/asciidoc/amqp-reference.adoc b/docs/src/main/asciidoc/amqp-reference.adoc index 7c32a6504912d..e5bcdce9ecf22 100644 --- a/docs/src/main/asciidoc/amqp-reference.adoc +++ b/docs/src/main/asciidoc/amqp-reference.adoc @@ -549,7 +549,7 @@ For more information on sending Cloud Events, see https://smallrye.io/smallrye-r === Quarkus specific configuration -include::{generated-config-doc-dir}/quarkus-messaging-amqp.adoc[opts=optional, leveloffset=+1] +include::{generated-dir}/config/quarkus-messaging-amqp.adoc[opts=optional, leveloffset=+1] === Incoming channel configuration diff --git a/docs/src/main/asciidoc/building-native-image.adoc b/docs/src/main/asciidoc/building-native-image.adoc index fa28a44c06030..605dbf6afd5a4 100644 --- a/docs/src/main/asciidoc/building-native-image.adoc +++ b/docs/src/main/asciidoc/building-native-image.adoc @@ -942,7 +942,7 @@ These are provided in `application.properties` the same as any other config prop The properties are shown below: -include::{generated-config-doc-dir}/quarkus-core_quarkus.native.adoc[opts=optional] +include::{generated-dir}/config/quarkus-core_quarkus.native.adoc[opts=optional] == What's next? diff --git a/docs/src/main/asciidoc/cache-infinispan-reference.adoc b/docs/src/main/asciidoc/cache-infinispan-reference.adoc index 57e128ea54367..f4c614ad413c7 100644 --- a/docs/src/main/asciidoc/cache-infinispan-reference.adoc +++ b/docs/src/main/asciidoc/cache-infinispan-reference.adoc @@ -209,4 +209,4 @@ the cache. quarkus.cache.infinispan.my-cache.max-idle=100s ---- -include::{generated-config-doc-dir}/quarkus-infinispan-cache.adoc[opts=optional, leveloffset=+1] +include::{generated-dir}/config/quarkus-infinispan-cache.adoc[opts=optional, leveloffset=+1] diff --git a/docs/src/main/asciidoc/cache-redis-reference.adoc b/docs/src/main/asciidoc/cache-redis-reference.adoc index 71677eb03c47c..c12625b00df1e 100644 --- a/docs/src/main/asciidoc/cache-redis-reference.adoc +++ b/docs/src/main/asciidoc/cache-redis-reference.adoc @@ -114,7 +114,7 @@ You would need to invalidate the values using the `@CacheInvalidateAll` or `@Cac The following table lists the supported properties: -include::{generated-config-doc-dir}/quarkus-redis-cache.adoc[opts=optional, leveloffset=+1] +include::{generated-dir}/config/quarkus-redis-cache.adoc[opts=optional, leveloffset=+1] == Configure the Redis key diff --git a/docs/src/main/asciidoc/cache.adoc b/docs/src/main/asciidoc/cache.adoc index 55c1e387ca3f1..49cc33cb70b8a 100644 --- a/docs/src/main/asciidoc/cache.adoc +++ b/docs/src/main/asciidoc/cache.adoc @@ -747,7 +747,7 @@ properties in the `application.properties` file. By default, caches do not perfo You need to replace `cache-name` in all the following properties with the real name of the cache you want to configure. ==== -include::{generated-config-doc-dir}/quarkus-cache.adoc[opts=optional, leveloffset=+1] +include::{generated-dir}/config/quarkus-cache.adoc[opts=optional, leveloffset=+1] Here's what your cache configuration could look like: diff --git a/docs/src/main/asciidoc/cdi-reference.adoc b/docs/src/main/asciidoc/cdi-reference.adoc index 3aa29b599aab4..41161c3799adf 100644 --- a/docs/src/main/asciidoc/cdi-reference.adoc +++ b/docs/src/main/asciidoc/cdi-reference.adoc @@ -1382,4 +1382,4 @@ The "strictness" of the strict mode (the set of additional validations and the s [[arc-configuration-reference]] == ArC Configuration Reference -include::{generated-config-doc-dir}/quarkus-arc.adoc[leveloffset=+1, opts=optional] +include::{generated-dir}/config/quarkus-arc.adoc[leveloffset=+1, opts=optional] diff --git a/docs/src/main/asciidoc/centralized-log-management.adoc b/docs/src/main/asciidoc/centralized-log-management.adoc index 2e098d0596dfc..663df993637c1 100644 --- a/docs/src/main/asciidoc/centralized-log-management.adoc +++ b/docs/src/main/asciidoc/centralized-log-management.adoc @@ -450,7 +450,7 @@ See the following documentation for Graylog (but the same issue exists for the o Configuration is done through the usual `application.properties` file. -include::{generated-config-doc-dir}/quarkus-logging-gelf.adoc[opts=optional, leveloffset=+1] +include::{generated-dir}/config/quarkus-logging-gelf.adoc[opts=optional, leveloffset=+1] This extension uses the `logstash-gelf` library that allow more configuration options via system properties, you can access its documentation here: https://logging.paluch.biz/ . diff --git a/docs/src/main/asciidoc/class-loading-reference.adoc b/docs/src/main/asciidoc/class-loading-reference.adoc index 16bb54b501b75..293e32da138fb 100644 --- a/docs/src/main/asciidoc/class-loading-reference.adoc +++ b/docs/src/main/asciidoc/class-loading-reference.adoc @@ -192,7 +192,7 @@ Note that class loading config is different to normal config, in that it does no (as it is needed too early), so only supports `application.properties`. The following options are supported. -include::{generated-config-doc-dir}/quarkus-core_quarkus.class-loading.adoc[opts=optional, leveloffset=+1] +include::{generated-dir}/config/quarkus-core_quarkus.class-loading.adoc[opts=optional, leveloffset=+1] == Hiding/Removing classes and resources from dependencies diff --git a/docs/src/main/asciidoc/config-reference.adoc b/docs/src/main/asciidoc/config-reference.adoc index 18869398d72ca..5ca6fb93d3191 100644 --- a/docs/src/main/asciidoc/config-reference.adoc +++ b/docs/src/main/asciidoc/config-reference.adoc @@ -847,4 +847,4 @@ link:https://smallrye.io/smallrye-config/Main[SmallRye Config documentation]. == Configuration Reference -include::{generated-config-doc-dir}/quarkus-core_quarkus-config.adoc[opts=optional, leveloffset=+1] +include::{generated-dir}/config/quarkus-core_quarkus-config.adoc[opts=optional, leveloffset=+1] diff --git a/docs/src/main/asciidoc/container-image.adoc b/docs/src/main/asciidoc/container-image.adoc index 99e097c39d67e..3d24d1b2a7aeb 100644 --- a/docs/src/main/asciidoc/container-image.adoc +++ b/docs/src/main/asciidoc/container-image.adoc @@ -250,7 +250,7 @@ The following properties can be used to customize the container image build proc === Container Image Options -include::{generated-config-doc-dir}/quarkus-container-image.adoc[opts=optional, leveloffset=+1] +include::{generated-dir}/config/quarkus-container-image.adoc[opts=optional, leveloffset=+1] ==== Using CI Environments @@ -272,24 +272,24 @@ NOTE: See xref:config-reference.adoc#with-environment-variables[this] for more i In addition to the generic container image options, the `container-image-jib` also provides the following options: -include::{generated-config-doc-dir}/quarkus-container-image-jib.adoc[opts=optional, leveloffset=+1] +include::{generated-dir}/config/quarkus-container-image-jib.adoc[opts=optional, leveloffset=+1] [[DockerOptions]] === Docker Options In addition to the generic container image options, the `container-image-docker` also provides the following options: -include::{generated-config-doc-dir}/quarkus-container-image-docker.adoc[opts=optional, leveloffset=+1] +include::{generated-dir}/config/quarkus-container-image-docker.adoc[opts=optional, leveloffset=+1] [[PodmanOptions]] === Podman Options In addition to the generic container image options, the `container-image-podman` also provides the following options: -include::{generated-config-doc-dir}/quarkus-container-image-podman.adoc[opts=optional, leveloffset=+1] +include::{generated-dir}/config/quarkus-container-image-podman.adoc[opts=optional, leveloffset=+1] === OpenShift Options In addition to the generic container image options, the `container-image-openshift` also provides the following options: -include::{generated-config-doc-dir}/quarkus-container-image-openshift_quarkus.openshift.adoc[opts=optional, leveloffset=+1] +include::{generated-dir}/config/quarkus-container-image-openshift_quarkus.openshift.adoc[opts=optional, leveloffset=+1] diff --git a/docs/src/main/asciidoc/continuous-testing.adoc b/docs/src/main/asciidoc/continuous-testing.adoc index a66ef873fbdb7..e1e11b6f05d59 100644 --- a/docs/src/main/asciidoc/continuous-testing.adoc +++ b/docs/src/main/asciidoc/continuous-testing.adoc @@ -155,5 +155,5 @@ This is enabled by default, and can be disabled via `quarkus.test.only-test-appl Continuous testing supports multiple configuration options that can be used to limit the tests that are run, and to control the output. The configuration properties are shown below: -include::{generated-config-doc-dir}/quarkus-core_quarkus.test.adoc[opts=optional, leveloffset=+2] +include::{generated-dir}/config/quarkus-core_quarkus.test.adoc[opts=optional, leveloffset=+2] diff --git a/docs/src/main/asciidoc/databases-dev-services.adoc b/docs/src/main/asciidoc/databases-dev-services.adoc index 843617348ba5a..ae563a67dc2f2 100644 --- a/docs/src/main/asciidoc/databases-dev-services.adoc +++ b/docs/src/main/asciidoc/databases-dev-services.adoc @@ -288,4 +288,4 @@ Dev Services have been started. Dev Services for Databases support the following configuration options: -include::{generated-config-doc-dir}/quarkus-datasource_quarkus.datasource.devservices.adoc[opts=optional,leveloffset=+1] +include::{generated-dir}/config/quarkus-datasource_quarkus.datasource.devservices.adoc[opts=optional,leveloffset=+1] diff --git a/docs/src/main/asciidoc/datasource.adoc b/docs/src/main/asciidoc/datasource.adoc index 474da7a231fd9..46d9f291a6692 100644 --- a/docs/src/main/asciidoc/datasource.adoc +++ b/docs/src/main/asciidoc/datasource.adoc @@ -733,12 +733,12 @@ endif::no-deprecated-test-resource[] [[configuration-reference]] === Common datasource configuration reference -include::{generated-config-doc-dir}/quarkus-datasource.adoc[opts=optional, leveloffset=+1] +include::{generated-dir}/config/quarkus-datasource.adoc[opts=optional, leveloffset=+1] [[jdbc-configuration]] === JDBC configuration reference -include::{generated-config-doc-dir}/quarkus-agroal.adoc[opts=optional, leveloffset=+1] +include::{generated-dir}/config/quarkus-agroal.adoc[opts=optional, leveloffset=+1] [[jdbc-url]] === JDBC URL reference @@ -934,29 +934,29 @@ This automatic resolution is applicable in most cases so that driver configurati [[reactive-configuration]] === Reactive datasource configuration reference -include::{generated-config-doc-dir}/quarkus-reactive-datasource.adoc[opts=optional, leveloffset=+1] +include::{generated-dir}/config/quarkus-reactive-datasource.adoc[opts=optional, leveloffset=+1] ifndef::no-quarkus-reactive-db2-client[] ==== Reactive DB2 configuration -include::{generated-config-doc-dir}/quarkus-reactive-db2-client.adoc[opts=optional, leveloffset=+1] +include::{generated-dir}/config/quarkus-reactive-db2-client.adoc[opts=optional, leveloffset=+1] endif::no-quarkus-reactive-db2-client[] ==== Reactive MariaDB/MySQL specific configuration -include::{generated-config-doc-dir}/quarkus-reactive-mysql-client.adoc[opts=optional, leveloffset=+1] +include::{generated-dir}/config/quarkus-reactive-mysql-client.adoc[opts=optional, leveloffset=+1] ==== Reactive Microsoft SQL server-specific configuration -include::{generated-config-doc-dir}/quarkus-reactive-mssql-client.adoc[opts=optional, leveloffset=+1] +include::{generated-dir}/config/quarkus-reactive-mssql-client.adoc[opts=optional, leveloffset=+1] ==== Reactive Oracle-specific configuration -include::{generated-config-doc-dir}/quarkus-reactive-oracle-client.adoc[opts=optional, leveloffset=+1] +include::{generated-dir}/config/quarkus-reactive-oracle-client.adoc[opts=optional, leveloffset=+1] ==== Reactive PostgreSQL-specific configuration -include::{generated-config-doc-dir}/quarkus-reactive-pg-client.adoc[opts=optional, leveloffset=+1] +include::{generated-dir}/config/quarkus-reactive-pg-client.adoc[opts=optional, leveloffset=+1] [[reactive-url]] diff --git a/docs/src/main/asciidoc/deploying-to-kubernetes.adoc b/docs/src/main/asciidoc/deploying-to-kubernetes.adoc index 99938920b782a..0092891b43bb9 100644 --- a/docs/src/main/asciidoc/deploying-to-kubernetes.adoc +++ b/docs/src/main/asciidoc/deploying-to-kubernetes.adoc @@ -1091,7 +1091,7 @@ The table below describe all the available configuration options. .Kubernetes :no-duration-note: true -include::{generated-config-doc-dir}/quarkus-kubernetes_quarkus.kubernetes.adoc[opts=optional, leveloffset=+1] +include::{generated-dir}/config/quarkus-kubernetes_quarkus.kubernetes.adoc[opts=optional, leveloffset=+1] Properties that use non-standard types, can be referenced by expanding the property. For example to define a `kubernetes-readiness-probe` which is of type `Probe`: @@ -1119,7 +1119,7 @@ quarkus.kubernetes-client.trust-certs=true The full list of the Kubernetes client configuration properties is provided below. :no-duration-note: true -include::{generated-config-doc-dir}/quarkus-kubernetes-client.adoc[opts=optional, leveloffset=+1] +include::{generated-dir}/config/quarkus-kubernetes-client.adoc[opts=optional, leveloffset=+1] [[openshift]] === OpenShift @@ -1230,7 +1230,7 @@ The OpenShift resources can be customized in a similar approach with Kubernetes. .OpenShift :no-duration-note: true -include::{generated-config-doc-dir}/quarkus-kubernetes_quarkus.openshift.adoc[opts=optional, leveloffset=+1] +include::{generated-dir}/config/quarkus-kubernetes_quarkus.openshift.adoc[opts=optional, leveloffset=+1] [[knative]] === Knative @@ -1295,7 +1295,7 @@ The generated service can be customized using the following properties: .Knative :no-duration-note: true -include::{generated-config-doc-dir}/quarkus-kubernetes_quarkus.knative.adoc[opts=optional, leveloffset=+1] +include::{generated-dir}/config/quarkus-kubernetes_quarkus.knative.adoc[opts=optional, leveloffset=+1] === Deployment targets diff --git a/docs/src/main/asciidoc/deploying-to-openshift.adoc b/docs/src/main/asciidoc/deploying-to-openshift.adoc index 659c5664eafe7..523c6308fec4a 100644 --- a/docs/src/main/asciidoc/deploying-to-openshift.adoc +++ b/docs/src/main/asciidoc/deploying-to-openshift.adoc @@ -523,4 +523,4 @@ The application can then be deployed to OpenShift Serverless by enabling the sta == Configuration Reference -include::{generated-config-doc-dir}/quarkus-kubernetes_quarkus.openshift.adoc[opts=optional, leveloffset=+1] +include::{generated-dir}/config/quarkus-kubernetes_quarkus.openshift.adoc[opts=optional, leveloffset=+1] diff --git a/docs/src/main/asciidoc/dev-services.adoc b/docs/src/main/asciidoc/dev-services.adoc index 35a04c76969d4..4910d26e336a3 100644 --- a/docs/src/main/asciidoc/dev-services.adoc +++ b/docs/src/main/asciidoc/dev-services.adoc @@ -60,7 +60,7 @@ The AMQP Dev Service will be enabled when the `quarkus-messaging-amqp` extension the broker address has not been explicitly configured. More information can be found in the xref:amqp-dev-services.adoc[AMQP Dev Services Guide]. -include::{generated-config-doc-dir}/quarkus-messaging-amqp_quarkus.amqp.devservices.adoc[opts=optional, leveloffset=+1] +include::{generated-dir}/config/quarkus-messaging-amqp_quarkus.amqp.devservices.adoc[opts=optional, leveloffset=+1] === Apicurio Registry @@ -68,7 +68,7 @@ The Apicurio Dev Service will be enabled when the `quarkus-apicurio-registry-avr address has not been explicitly configured. More information can be found in the xref:apicurio-registry-dev-services.adoc[Apicurio Registry Dev Services Guide]. -include::{generated-config-doc-dir}/quarkus-schema-registry-devservice_quarkus.apicurio-registry.devservices.adoc[opts=optional, leveloffset=+1] +include::{generated-dir}/config/quarkus-schema-registry-devservice_quarkus.apicurio-registry.devservices.adoc[opts=optional, leveloffset=+1] === Databases @@ -86,7 +86,7 @@ after each run, and can be reused. N.B. if you opt in for this feature, Quarkus will not reset the state of the database between runs unless you explicitly configure it to. -include::{generated-config-doc-dir}/quarkus-datasource_quarkus.datasource.devservices.adoc[opts=optional, leveloffset=+1] +include::{generated-dir}/config/quarkus-datasource_quarkus.datasource.devservices.adoc[opts=optional, leveloffset=+1] === Kafka @@ -94,7 +94,7 @@ The Kafka Dev Service will be enabled when the `quarkus-kafka-client` extension the broker address has not been explicitly configured. More information can be found in the xref:kafka-dev-services.adoc[Kafka Dev Services Guide]. -include::{generated-config-doc-dir}/quarkus-kafka-client_quarkus.kafka.devservices.adoc[opts=optional, leveloffset=+1] +include::{generated-dir}/config/quarkus-kafka-client_quarkus.kafka.devservices.adoc[opts=optional, leveloffset=+1] === Keycloak @@ -102,7 +102,7 @@ The Keycloak Dev Service will be enabled when the `quarkus-oidc` extension is pr the server address has not been explicitly configured. More information can be found in the xref:security-openid-connect-dev-services.adoc[OIDC Dev Services Guide]. -include::{generated-config-doc-dir}/quarkus-oidc_quarkus.keycloak.devservices.adoc[opts=optional, leveloffset=+1] +include::{generated-dir}/config/quarkus-oidc_quarkus.keycloak.devservices.adoc[opts=optional, leveloffset=+1] === Kubernetes @@ -110,7 +110,7 @@ The Kubernetes Dev Service will be enabled when the `kubernetes-client` extensio the API server address has not been explicitly configured. More information can be found in the xref:kubernetes-dev-services.adoc[Kubernetes Dev Services Guide]. -include::{generated-config-doc-dir}/quarkus-kubernetes-client_quarkus.kubernetes-client.devservices.adoc[opts=optional, leveloffset=+1] +include::{generated-dir}/config/quarkus-kubernetes-client_quarkus.kubernetes-client.devservices.adoc[opts=optional, leveloffset=+1] === MongoDB @@ -118,7 +118,7 @@ The MongoDB Dev Service will be enabled when the `quarkus-mongodb-client` extens the server address has not been explicitly configured. More information can be found in the xref:mongodb-dev-services.adoc[MongoDB Guide]. -include::{generated-config-doc-dir}/quarkus-mongodb-client_quarkus.mongodb.devservices.adoc[opts=optional, leveloffset=+1] +include::{generated-dir}/config/quarkus-mongodb-client_quarkus.mongodb.devservices.adoc[opts=optional, leveloffset=+1] === RabbitMQ @@ -126,7 +126,7 @@ The RabbitMQ Dev Service will be enabled when the `quarkus-messaging-rabbitmq` e the broker address has not been explicitly configured. More information can be found in the xref:rabbitmq-dev-services.adoc[RabbitMQ Dev Services Guide]. -include::{generated-config-doc-dir}/quarkus-messaging-rabbitmq_quarkus.rabbitmq.devservices.adoc[opts=optional, leveloffset=+1] +include::{generated-dir}/config/quarkus-messaging-rabbitmq_quarkus.rabbitmq.devservices.adoc[opts=optional, leveloffset=+1] === Pulsar @@ -134,7 +134,7 @@ The Pulsar Dev Service will be enabled when the `quarkus-messaging-pulsar` exten the broker address has not been explicitly configured. More information can be found in the xref:pulsar-dev-services.adoc[Pulsar Dev Services Guide]. -include::{generated-config-doc-dir}/quarkus-messaging-pulsar_quarkus.pulsar.devservices.adoc[opts=optional, leveloffset=+1] +include::{generated-dir}/config/quarkus-messaging-pulsar_quarkus.pulsar.devservices.adoc[opts=optional, leveloffset=+1] === Redis @@ -142,7 +142,7 @@ The Redis Dev Service will be enabled when the `quarkus-redis-client` extension the server address has not been explicitly configured. More information can be found in the xref:redis-dev-services.adoc[Redis Dev Services Guide]. -include::{generated-config-doc-dir}/quarkus-redis-client_quarkus.redis.devservices.adoc[opts=optional, leveloffset=+1] +include::{generated-dir}/config/quarkus-redis-client_quarkus.redis.devservices.adoc[opts=optional, leveloffset=+1] === Vault @@ -156,7 +156,7 @@ The Infinispan Dev Service will be enabled when the `quarkus-infinispan-client` the server address has not been explicitly configured. More information can be found in the xref:infinispan-dev-services.adoc[Infinispan Dev Services Guide]. -include::{generated-config-doc-dir}/quarkus-infinispan-client_quarkus.infinispan-client.devservices.adoc[opts=optional, leveloffset=+1] +include::{generated-dir}/config/quarkus-infinispan-client_quarkus.infinispan-client.devservices.adoc[opts=optional, leveloffset=+1] === Elasticsearch @@ -164,7 +164,7 @@ The Elasticsearch Dev Service will be enabled when one of the Elasticsearch base is present in your application, and the server address has not been explicitly configured. More information can be found in the xref:elasticsearch-dev-services.adoc[Elasticsearch Dev Services Guide]. -include::{generated-config-doc-dir}/quarkus-elasticsearch-rest-client_quarkus.elasticsearch.devservices.adoc[opts=optional, leveloffset=+1] +include::{generated-dir}/config/quarkus-elasticsearch-rest-client_quarkus.elasticsearch.devservices.adoc[opts=optional, leveloffset=+1] === Observability @@ -172,7 +172,7 @@ The Observability Dev Services will be enabled when the `quarkus-observability-d there is at least one dev resource on the classpath. More information can be found in the xref:observability-devservices.adoc[Observability Dev Services Guide]. -include::{generated-config-doc-dir}/quarkus-observability-devservices.adoc[opts=optional, leveloffset=+1] +include::{generated-dir}/config/quarkus-observability-devservices.adoc[opts=optional, leveloffset=+1] == Dev Services beyond the Quarkus Platform diff --git a/docs/src/main/asciidoc/elasticsearch-dev-services.adoc b/docs/src/main/asciidoc/elasticsearch-dev-services.adoc index c00434fa20add..1f92726c7f973 100644 --- a/docs/src/main/asciidoc/elasticsearch-dev-services.adoc +++ b/docs/src/main/asciidoc/elasticsearch-dev-services.adoc @@ -147,4 +147,4 @@ Currently, only the default backend for Hibernate Search Elasticsearch is suppor == Configuration reference -include::{generated-config-doc-dir}/quarkus-elasticsearch-rest-client_quarkus.elasticsearch.devservices.adoc[opts=optional, leveloffset=+1] +include::{generated-dir}/config/quarkus-elasticsearch-rest-client_quarkus.elasticsearch.devservices.adoc[opts=optional, leveloffset=+1] diff --git a/docs/src/main/asciidoc/elasticsearch.adoc b/docs/src/main/asciidoc/elasticsearch.adoc index aecb8e852bbc2..2fb01d9eba966 100644 --- a/docs/src/main/asciidoc/elasticsearch.adoc +++ b/docs/src/main/asciidoc/elasticsearch.adoc @@ -481,4 +481,4 @@ Accessing an Elasticsearch cluster from the low level REST client or the Elastic == Configuration Reference -include::{generated-config-doc-dir}/quarkus-elasticsearch-rest-client.adoc[opts=optional, leveloffset=+1] +include::{generated-dir}/config/quarkus-elasticsearch-rest-client.adoc[opts=optional, leveloffset=+1] diff --git a/docs/src/main/asciidoc/flyway.adoc b/docs/src/main/asciidoc/flyway.adoc index 90e87d8323c75..84120b19321e2 100644 --- a/docs/src/main/asciidoc/flyway.adoc +++ b/docs/src/main/asciidoc/flyway.adoc @@ -191,7 +191,7 @@ First, you need to add the datasource config to the `{config-file}` file in order to allow Flyway to manage the schema. Also, you can customize the Flyway behaviour by using the following properties: -include::{generated-config-doc-dir}/quarkus-flyway.adoc[opts=optional, leveloffset=+1] +include::{generated-dir}/config/quarkus-flyway.adoc[opts=optional, leveloffset=+1] == Developing with Flyway diff --git a/docs/src/main/asciidoc/getting-started.adoc b/docs/src/main/asciidoc/getting-started.adoc index bd8192399614f..7eab23affaae3 100644 --- a/docs/src/main/asciidoc/getting-started.adoc +++ b/docs/src/main/asciidoc/getting-started.adoc @@ -485,7 +485,7 @@ All CDI beans implementing the `InfoContributor` will be picked up and their dat ==== Configuration Reference -include::{generated-config-doc-dir}/quarkus-info.adoc[opts=optional, leveloffset=+2] +include::{generated-dir}/config/quarkus-info.adoc[opts=optional, leveloffset=+2] == What's next? diff --git a/docs/src/main/asciidoc/gradle-tooling.adoc b/docs/src/main/asciidoc/gradle-tooling.adoc index 4cc2b1e2b0775..6cd28b895a85a 100644 --- a/docs/src/main/asciidoc/gradle-tooling.adoc +++ b/docs/src/main/asciidoc/gradle-tooling.adoc @@ -313,7 +313,7 @@ app. All the config options are shown below: -include::{generated-config-doc-dir}/quarkus-core_quarkus.live-reload.adoc[opts=optional, leveloffset=+1] +include::{generated-dir}/config/quarkus-core_quarkus.live-reload.adoc[opts=optional, leveloffset=+1] == Debugging diff --git a/docs/src/main/asciidoc/grpc-service-consumption.adoc b/docs/src/main/asciidoc/grpc-service-consumption.adoc index 83f14bf0b8e9e..177d8c14a5db5 100644 --- a/docs/src/main/asciidoc/grpc-service-consumption.adoc +++ b/docs/src/main/asciidoc/grpc-service-consumption.adoc @@ -204,7 +204,7 @@ public class StreamingEndpoint { For each gRPC service you inject in your application, you can configure the following attributes: -include::{generated-config-doc-dir}/quarkus-grpc_quarkus.grpc-client.adoc[opts=optional, leveloffset=+1] +include::{generated-dir}/config/quarkus-grpc_quarkus.grpc-client.adoc[opts=optional, leveloffset=+1] The `client-name` is the name set in the `@GrpcClient` or derived from the injection point if not explicitly defined. @@ -469,7 +469,7 @@ public class HelloExceptionHandlerProvider implements ExceptionHandlerProvider { By default, when starting the application in dev mode, a gRPC server is started, even if no services are configured. You can configure the gRPC extension's dev mode behavior using the following properties. -include::{generated-config-doc-dir}/quarkus-grpc_quarkus.grpc.dev-mode.adoc[opts=optional, leveloffset=+1] +include::{generated-dir}/config/quarkus-grpc_quarkus.grpc.dev-mode.adoc[opts=optional, leveloffset=+1] == Inject mock clients diff --git a/docs/src/main/asciidoc/grpc-service-implementation.adoc b/docs/src/main/asciidoc/grpc-service-implementation.adoc index 98228e2990b97..ab736562e20ba 100644 --- a/docs/src/main/asciidoc/grpc-service-implementation.adoc +++ b/docs/src/main/asciidoc/grpc-service-implementation.adoc @@ -215,7 +215,7 @@ If you wish to scale your server, you can set the number of server instances by == Server Configuration -include::{generated-config-doc-dir}/quarkus-grpc_quarkus.grpc.server.adoc[opts=optional, leveloffset=+1] +include::{generated-dir}/config/quarkus-grpc_quarkus.grpc.server.adoc[opts=optional, leveloffset=+1] IMPORTANT: When you disable `quarkus.grpc.server.use-separate-server`, you are then using the new Vert.x gRPC server implementation which uses the existing HTTP server. Which means that the server port is now `8080` (or the port configured with `quarkus.http.port`). diff --git a/docs/src/main/asciidoc/grpc-xds.adoc b/docs/src/main/asciidoc/grpc-xds.adoc index d68cb48c65811..9fd307ad2cb09 100644 --- a/docs/src/main/asciidoc/grpc-xds.adoc +++ b/docs/src/main/asciidoc/grpc-xds.adoc @@ -38,7 +38,7 @@ NOTE: This transitively adds `io.quarkus:quarkus-grpc` extension dependency. == Server configuration -include::{generated-config-doc-dir}/quarkus-grpc_quarkus.grpc.server.xds.adoc[opts=optional, leveloffset=+1] +include::{generated-dir}/config/quarkus-grpc_quarkus.grpc.server.xds.adoc[opts=optional, leveloffset=+1] == Server configuration example @@ -58,7 +58,7 @@ NOTE: When xDS is configured, `plain-text` is automatically disabled. == Client configuration -include::{generated-config-doc-dir}/quarkus-grpc_quarkus.grpc.clients.-client-name-.xds.adoc[opts=optional, leveloffset=+1] +include::{generated-dir}/config/quarkus-grpc_quarkus.grpc.clients.-client-name-.xds.adoc[opts=optional, leveloffset=+1] NOTE: When xDS target property is used, name resolver, host, and port are not used diff --git a/docs/src/main/asciidoc/hibernate-orm.adoc b/docs/src/main/asciidoc/hibernate-orm.adoc index 68fef845af676..80430dcb18cc6 100644 --- a/docs/src/main/asciidoc/hibernate-orm.adoc +++ b/docs/src/main/asciidoc/hibernate-orm.adoc @@ -291,7 +291,7 @@ and will have it use the default datasource. The configuration properties listed here allow you to override such defaults, and customize and tune various aspects. -include::{generated-config-doc-dir}/quarkus-hibernate-orm.adoc[opts=optional, leveloffset=+2] +include::{generated-dir}/config/quarkus-hibernate-orm.adoc[opts=optional, leveloffset=+2] [NOTE] ==== diff --git a/docs/src/main/asciidoc/hibernate-reactive.adoc b/docs/src/main/asciidoc/hibernate-reactive.adoc index 4c3ecc2afb08e..c0e32ee9b0475 100644 --- a/docs/src/main/asciidoc/hibernate-reactive.adoc +++ b/docs/src/main/asciidoc/hibernate-reactive.adoc @@ -193,7 +193,7 @@ The configuration properties listed here allow you to override such defaults, an Hibernate Reactive uses the same properties you would use for Hibernate ORM. You will notice that some properties contain `jdbc` in the name but there is no JDBC in Hibernate Reactive, these are simply legacy property names. -include::{generated-config-doc-dir}/quarkus-hibernate-orm.adoc[opts=optional, leveloffset=+2] +include::{generated-dir}/config/quarkus-hibernate-orm.adoc[opts=optional, leveloffset=+2] [TIP] ==== diff --git a/docs/src/main/asciidoc/hibernate-search-orm-elasticsearch.adoc b/docs/src/main/asciidoc/hibernate-search-orm-elasticsearch.adoc index 33e1e9ed95fd1..6963c8491c95a 100644 --- a/docs/src/main/asciidoc/hibernate-search-orm-elasticsearch.adoc +++ b/docs/src/main/asciidoc/hibernate-search-orm-elasticsearch.adoc @@ -1246,7 +1246,7 @@ https://github.com/quarkiverse/quarkus-hibernate-search-extras/issues/179[quarki [[configuration-reference-main]] === Main Configuration -include::{generated-config-doc-dir}/quarkus-hibernate-search-orm-elasticsearch.adoc[leveloffset=+1, opts=optional] +include::{generated-dir}/config/quarkus-hibernate-search-orm-elasticsearch.adoc[leveloffset=+1, opts=optional] [NOTE] [[bean-reference-note-anchor]] @@ -1280,4 +1280,4 @@ for more information. NOTE: These configuration properties require an additional extension. See <>. -include::{generated-config-doc-dir}/quarkus-hibernate-search-orm-outbox-polling.adoc[leveloffset=+1, opts=optional] +include::{generated-dir}/config/quarkus-hibernate-search-orm-outbox-polling.adoc[leveloffset=+1, opts=optional] diff --git a/docs/src/main/asciidoc/hibernate-search-standalone-elasticsearch.adoc b/docs/src/main/asciidoc/hibernate-search-standalone-elasticsearch.adoc index a4add91647ce6..6e4fb29c07ae4 100644 --- a/docs/src/main/asciidoc/hibernate-search-standalone-elasticsearch.adoc +++ b/docs/src/main/asciidoc/hibernate-search-standalone-elasticsearch.adoc @@ -1034,7 +1034,7 @@ https://github.com/quarkiverse/quarkus-hibernate-search-extras/issues/180[quarki [[configuration-reference]] == Configuration Reference for Hibernate Search Standalone -include::{generated-config-doc-dir}/quarkus-hibernate-search-standalone-elasticsearch.adoc[leveloffset=+1, opts=optional] +include::{generated-dir}/config/quarkus-hibernate-search-standalone-elasticsearch.adoc[leveloffset=+1, opts=optional] [NOTE] [[bean-reference-note-anchor]] diff --git a/docs/src/main/asciidoc/http-reference.adoc b/docs/src/main/asciidoc/http-reference.adoc index b876695f4b63d..6c81a4767b268 100644 --- a/docs/src/main/asciidoc/http-reference.adoc +++ b/docs/src/main/asciidoc/http-reference.adoc @@ -80,7 +80,7 @@ TIP: Brotli compression is not available by default. You can enable it by settin Additionally, the index page for static resources can be changed from default `index.html`, the hidden files (e.g. dot files) can be indicated as not served, the range requests can be disabled, and the caching support (e.g. caching headers and file properties cache) can be configured. -include::{generated-config-doc-dir}/quarkus-vertx-http_quarkus.http.static-resources.adoc[leveloffset=+1, opts=optional] +include::{generated-dir}/config/quarkus-vertx-http_quarkus.http.static-resources.adoc[leveloffset=+1, opts=optional] [[context-path]] == Configuring the Context path @@ -270,7 +270,7 @@ quarkus.http.header.Pragma.methods=GET,HEAD This will apply the `Pragma` header only when the `/headers/pragma` resource is called with a `GET` or a `HEAD` method -include::{generated-config-doc-dir}/quarkus-vertx-http_quarkus.http.header.-header-.adoc[leveloffset=+1, opts=optional] +include::{generated-dir}/config/quarkus-vertx-http_quarkus.http.header.-header-.adoc[leveloffset=+1, opts=optional] === Additional HTTP Headers per path @@ -310,7 +310,7 @@ quarkus.http.filter.any-order.matches=/paths/order.* Will include the `Cache-Control: max-age=1` header when `/paths/order` is requested. -include::{generated-config-doc-dir}/quarkus-vertx-http_quarkus.http.filter.-filter-.adoc[leveloffset=+1, opts=optional] +include::{generated-dir}/config/quarkus-vertx-http_quarkus.http.filter.-filter-.adoc[leveloffset=+1, opts=optional] == Support 100-Continue in vert.x @@ -359,7 +359,7 @@ For more information about the CORS filter that Quarkus provides, see the Quarku == HTTP Limits Configuration -include::{generated-config-doc-dir}/quarkus-vertx-http_quarkus.http.limits.adoc[leveloffset=+1, opts=optional] +include::{generated-dir}/config/quarkus-vertx-http_quarkus.http.limits.adoc[leveloffset=+1, opts=optional] == Configure traffic shaping @@ -404,7 +404,7 @@ When one of the threshold is reached, no write happens for that period of time. You can add HTTP request logging by configuring it in `application.properties`. There are two options for logging, either logging to the standard JBoss logging output, or logging to a dedicated file. -include::{generated-config-doc-dir}/quarkus-vertx-http_quarkus.http.access-log.adoc[opts=optional, leveloffset=+1] +include::{generated-dir}/config/quarkus-vertx-http_quarkus.http.access-log.adoc[opts=optional, leveloffset=+1] [frame="topbot",options="header"] |=== diff --git a/docs/src/main/asciidoc/infinispan-client-reference.adoc b/docs/src/main/asciidoc/infinispan-client-reference.adoc index 5c1d22831c6d1..7084c2e4ae3d9 100644 --- a/docs/src/main/asciidoc/infinispan-client-reference.adoc +++ b/docs/src/main/asciidoc/infinispan-client-reference.adoc @@ -969,4 +969,4 @@ You can set the port by configuring the `quarkus.infinispan-client.devservices.p == Configuration Reference -include::{generated-config-doc-dir}/quarkus-infinispan-client.adoc[opts=optional, leveloffset=+1] +include::{generated-dir}/config/quarkus-infinispan-client.adoc[opts=optional, leveloffset=+1] diff --git a/docs/src/main/asciidoc/infinispan-dev-services.adoc b/docs/src/main/asciidoc/infinispan-dev-services.adoc index 13827511d4157..fc3e0868cfe6a 100644 --- a/docs/src/main/asciidoc/infinispan-dev-services.adoc +++ b/docs/src/main/asciidoc/infinispan-dev-services.adoc @@ -16,7 +16,7 @@ Quarkus will automatically start an Infinispan container when running tests or d The following properties are available to customize the Infinispan Dev Services: -include::{generated-config-doc-dir}/quarkus-infinispan-client_quarkus.infinispan-client.devservices.adoc[opts=optional, leveloffset=+1] +include::{generated-dir}/config/quarkus-infinispan-client_quarkus.infinispan-client.devservices.adoc[opts=optional, leveloffset=+1] When running the production version of the application, the Infinispan connection need to be configured as normal, so if you want to include a production database config in your `application.properties` and continue to use Dev Services diff --git a/docs/src/main/asciidoc/jfr.adoc b/docs/src/main/asciidoc/jfr.adoc index f745754e6b68c..34eebbdcd58c8 100644 --- a/docs/src/main/asciidoc/jfr.adoc +++ b/docs/src/main/asciidoc/jfr.adoc @@ -386,4 +386,4 @@ public class NewInterceptor { == Configuration Reference -include::{generated-config-doc-dir}/quarkus-jfr.adoc[leveloffset=+1, opts=optional] \ No newline at end of file +include::{generated-dir}/config/quarkus-jfr.adoc[leveloffset=+1, opts=optional] \ No newline at end of file diff --git a/docs/src/main/asciidoc/kafka-streams.adoc b/docs/src/main/asciidoc/kafka-streams.adoc index 9fa8e037f6404..1119b939acdce 100644 --- a/docs/src/main/asciidoc/kafka-streams.adoc +++ b/docs/src/main/asciidoc/kafka-streams.adoc @@ -1255,4 +1255,4 @@ Refer to the Quarkus guides on xref:telemetry-micrometer.adoc[Micrometer], xref: == Configuration Reference -include::{generated-config-doc-dir}/quarkus-kafka-streams.adoc[opts=optional, leveloffset=+1] +include::{generated-dir}/config/quarkus-kafka-streams.adoc[opts=optional, leveloffset=+1] diff --git a/docs/src/main/asciidoc/kubernetes-client.adoc b/docs/src/main/asciidoc/kubernetes-client.adoc index 4483de695f9e0..e6fdd89305b3d 100644 --- a/docs/src/main/asciidoc/kubernetes-client.adoc +++ b/docs/src/main/asciidoc/kubernetes-client.adoc @@ -521,4 +521,4 @@ testImplementation("io.quarkus:quarkus-test-openshift-client") == Configuration Reference -include::{generated-config-doc-dir}/quarkus-kubernetes-client.adoc[opts=optional, leveloffset=+1] +include::{generated-dir}/config/quarkus-kubernetes-client.adoc[opts=optional, leveloffset=+1] diff --git a/docs/src/main/asciidoc/kubernetes-config.adoc b/docs/src/main/asciidoc/kubernetes-config.adoc index 8c4d0267a2d20..0654b09431b6c 100644 --- a/docs/src/main/asciidoc/kubernetes-config.adoc +++ b/docs/src/main/asciidoc/kubernetes-config.adoc @@ -149,4 +149,4 @@ See xref:deploying-to-kubernetes.adoc#secret-mapping[this] for more details. == Configuration Reference -include::{generated-config-doc-dir}/quarkus-kubernetes-config.adoc[opts=optional, leveloffset=+1] +include::{generated-dir}/config/quarkus-kubernetes-config.adoc[opts=optional, leveloffset=+1] diff --git a/docs/src/main/asciidoc/liquibase-mongodb.adoc b/docs/src/main/asciidoc/liquibase-mongodb.adoc index bb0ebdc430e6c..2efb8b798f211 100644 --- a/docs/src/main/asciidoc/liquibase-mongodb.adoc +++ b/docs/src/main/asciidoc/liquibase-mongodb.adoc @@ -193,4 +193,4 @@ quarkus.openshift.init-task-defaults.wait-for-container.image=my/wait-for-image: == Configuration Reference -include::{generated-config-doc-dir}/quarkus-liquibase-mongodb.adoc[opts=optional, leveloffset=+2] +include::{generated-dir}/config/quarkus-liquibase-mongodb.adoc[opts=optional, leveloffset=+2] diff --git a/docs/src/main/asciidoc/liquibase.adoc b/docs/src/main/asciidoc/liquibase.adoc index 0c097a5ea4cf1..2ab713d5711a7 100644 --- a/docs/src/main/asciidoc/liquibase.adoc +++ b/docs/src/main/asciidoc/liquibase.adoc @@ -276,4 +276,4 @@ quarkus.openshift.init-task-defaults.wait-for-container.image=my/wait-for-image: == Configuration Reference -include::{generated-config-doc-dir}/quarkus-liquibase.adoc[opts=optional, leveloffset=+2] +include::{generated-dir}/config/quarkus-liquibase.adoc[opts=optional, leveloffset=+2] diff --git a/docs/src/main/asciidoc/load-shedding-reference.adoc b/docs/src/main/asciidoc/load-shedding-reference.adoc index 1c84eaea4c956..f5ac732d11690 100644 --- a/docs/src/main/asciidoc/load-shedding-reference.adoc +++ b/docs/src/main/asciidoc/load-shedding-reference.adoc @@ -122,7 +122,7 @@ Improvements may be necessary. == Configuration reference -include::{generated-config-doc-dir}/quarkus-load-shedding.adoc[opts=optional, leveloffset=+1] +include::{generated-dir}/config/quarkus-load-shedding.adoc[opts=optional, leveloffset=+1] == Further reading diff --git a/docs/src/main/asciidoc/logging.adoc b/docs/src/main/asciidoc/logging.adoc index 15c157386c3bf..bb2bd14698df9 100644 --- a/docs/src/main/asciidoc/logging.adoc +++ b/docs/src/main/asciidoc/logging.adoc @@ -401,7 +401,7 @@ This can be achieved using different profiles, as shown in the following configu Configure the JSON logging extension using supported properties to customize its behavior. -include::{generated-config-doc-dir}/quarkus-logging-json.adoc[opts=optional, leveloffset=+1] +include::{generated-dir}/config/quarkus-logging-json.adoc[opts=optional, leveloffset=+1] WARNING: Enabling pretty printing might cause certain processors and JSON parsers to fail. @@ -845,4 +845,4 @@ NOTE: If applicable, MDC data is stored in a _duplicated context_, which is an i [[loggingConfigurationReference]] == Logging configuration reference -include::{generated-config-doc-dir}/quarkus-core_quarkus.log.adoc[opts=optional, leveloffset=+1] +include::{generated-dir}/config/quarkus-core_quarkus.log.adoc[opts=optional, leveloffset=+1] diff --git a/docs/src/main/asciidoc/mailer-reference.adoc b/docs/src/main/asciidoc/mailer-reference.adoc index 53c199dc77161..baf7175894a2d 100644 --- a/docs/src/main/asciidoc/mailer-reference.adoc +++ b/docs/src/main/asciidoc/mailer-reference.adoc @@ -677,5 +677,5 @@ quarkus.mailer.mock=false # In dev mode, prevent from using the mock SMTP server [[configuration-reference]] == Mailer Configuration Reference -include::{generated-config-doc-dir}/quarkus-mailer.adoc[opts=optional, leveloffset=+1] +include::{generated-dir}/config/quarkus-mailer.adoc[opts=optional, leveloffset=+1] diff --git a/docs/src/main/asciidoc/management-interface-reference.adoc b/docs/src/main/asciidoc/management-interface-reference.adoc index 261e9b23894be..2d2badaa9e4da 100644 --- a/docs/src/main/asciidoc/management-interface-reference.adoc +++ b/docs/src/main/asciidoc/management-interface-reference.adoc @@ -162,7 +162,7 @@ More details about the `Router` API can be found on https://vertx.io/docs/vertx- == Management Interface Configuration -include::{generated-config-doc-dir}/quarkus-vertx-http_quarkus.management.adoc[leveloffset=+1, opts=optional] +include::{generated-dir}/config/quarkus-vertx-http_quarkus.management.adoc[leveloffset=+1, opts=optional] [[reverse-proxy]] == Running behind a reverse proxy diff --git a/docs/src/main/asciidoc/maven-tooling.adoc b/docs/src/main/asciidoc/maven-tooling.adoc index 20f3fa0ee3292..233cb4bf9e772 100644 --- a/docs/src/main/asciidoc/maven-tooling.adoc +++ b/docs/src/main/asciidoc/maven-tooling.adoc @@ -262,7 +262,7 @@ rsync to sync to the remote application. All the config options are shown below: -include::{generated-config-doc-dir}/quarkus-core_quarkus.live-reload.adoc[opts=optional, leveloffset=+1] +include::{generated-dir}/config/quarkus-core_quarkus.live-reload.adoc[opts=optional, leveloffset=+1] NOTE: It is recommended you use SSL when using remote dev mode, however even if you are using an unencrypted connection your password is never sent directly over the wire. For the initial connection request the password is hashed with the @@ -908,7 +908,7 @@ These are provided in `application.properties` the same as any other config prop The properties are shown below: -include::{generated-config-doc-dir}/quarkus-core_quarkus.package.adoc[opts=optional] +include::{generated-dir}/config/quarkus-core_quarkus.package.adoc[opts=optional] [[custom-test-configuration-profile]] === Custom test configuration profile in JVM mode diff --git a/docs/src/main/asciidoc/mongodb.adoc b/docs/src/main/asciidoc/mongodb.adoc index 738ef30c97a67..8ba13a1958695 100644 --- a/docs/src/main/asciidoc/mongodb.adoc +++ b/docs/src/main/asciidoc/mongodb.adoc @@ -793,4 +793,4 @@ IMPORTANT: Client-side field level encryption, and feature relying on https://gi == Configuration Reference -include::{generated-config-doc-dir}/quarkus-mongodb-client.adoc[opts=optional, leveloffset=+1] +include::{generated-dir}/config/quarkus-mongodb-client.adoc[opts=optional, leveloffset=+1] diff --git a/docs/src/main/asciidoc/openapi-swaggerui.adoc b/docs/src/main/asciidoc/openapi-swaggerui.adoc index 4dd71d13c5b11..ab660bbb6b9a0 100644 --- a/docs/src/main/asciidoc/openapi-swaggerui.adoc +++ b/docs/src/main/asciidoc/openapi-swaggerui.adoc @@ -575,8 +575,8 @@ If you plan to consume this application from a Single Page Application running o === OpenAPI -include::{generated-config-doc-dir}/quarkus-smallrye-openapi.adoc[opts=optional, leveloffset=+1] +include::{generated-dir}/config/quarkus-smallrye-openapi.adoc[opts=optional, leveloffset=+1] === Swagger UI -include::{generated-config-doc-dir}/quarkus-swagger-ui.adoc[opts=optional, leveloffset=+1] +include::{generated-dir}/config/quarkus-swagger-ui.adoc[opts=optional, leveloffset=+1] diff --git a/docs/src/main/asciidoc/opentelemetry.adoc b/docs/src/main/asciidoc/opentelemetry.adoc index 19f798a316417..f3a79b928b7dd 100644 --- a/docs/src/main/asciidoc/opentelemetry.adoc +++ b/docs/src/main/asciidoc/opentelemetry.adoc @@ -307,4 +307,4 @@ adding the usual `quarkus.*` prefix. Quarkus OpenTelemetry configuration properties now have the `quarkus.otel.*` prefix. -include::{generated-config-doc-dir}/quarkus-opentelemetry.adoc[leveloffset=+1, opts=optional] +include::{generated-dir}/config/quarkus-opentelemetry.adoc[leveloffset=+1, opts=optional] diff --git a/docs/src/main/asciidoc/picocli.adoc b/docs/src/main/asciidoc/picocli.adoc index 5ffac7b79ed00..4ec8182a34c41 100644 --- a/docs/src/main/asciidoc/picocli.adoc +++ b/docs/src/main/asciidoc/picocli.adoc @@ -370,4 +370,4 @@ Finally, the Kubernetes job will be launched every time it is installed in Kuber == Configuration Reference -include::{generated-config-doc-dir}/quarkus-picocli.adoc[opts=optional, leveloffset=+1] +include::{generated-dir}/config/quarkus-picocli.adoc[opts=optional, leveloffset=+1] diff --git a/docs/src/main/asciidoc/quarkus-maven-plugin.adoc b/docs/src/main/asciidoc/quarkus-maven-plugin.adoc index 9054883fffbd1..2bcc876108da1 100644 --- a/docs/src/main/asciidoc/quarkus-maven-plugin.adoc +++ b/docs/src/main/asciidoc/quarkus-maven-plugin.adoc @@ -26,4 +26,4 @@ It is also possible to print out detailed information about a goal, all its para Here is the list of all the Quarkus Maven Plugin goals: -include::{generated-infra-doc-dir}/quarkus-maven-plugin-goals.adoc[opts=optional, leveloffset=+2] +include::{generated-dir}/infra/quarkus-maven-plugin-goals.adoc[opts=optional, leveloffset=+2] diff --git a/docs/src/main/asciidoc/quartz.adoc b/docs/src/main/asciidoc/quartz.adoc index 45b0c52a85bd1..bfdf94fc25eef 100644 --- a/docs/src/main/asciidoc/quartz.adoc +++ b/docs/src/main/asciidoc/quartz.adoc @@ -481,4 +481,4 @@ If `run-blocking-method-on-quartz-thread` is set, the scheduled method runs on a [[quartz-configuration-reference]] == Quartz Configuration Reference -include::{generated-config-doc-dir}/quarkus-quartz.adoc[leveloffset=+1, opts=optional] +include::{generated-dir}/config/quarkus-quartz.adoc[leveloffset=+1, opts=optional] diff --git a/docs/src/main/asciidoc/qute-reference.adoc b/docs/src/main/asciidoc/qute-reference.adoc index 707126d72bfb4..82b8259f7aa01 100644 --- a/docs/src/main/asciidoc/qute-reference.adoc +++ b/docs/src/main/asciidoc/qute-reference.adoc @@ -2932,7 +2932,7 @@ Message templates are validated during the build. If a missing message template === Configuration Reference -include::{generated-config-doc-dir}/quarkus-qute.adoc[leveloffset=+1, opts=optional] +include::{generated-dir}/config/quarkus-qute.adoc[leveloffset=+1, opts=optional] [[standalone]] diff --git a/docs/src/main/asciidoc/qute.adoc b/docs/src/main/asciidoc/qute.adoc index f1835d2ee0524..658832463d1d6 100644 --- a/docs/src/main/asciidoc/qute.adoc +++ b/docs/src/main/asciidoc/qute.adoc @@ -539,4 +539,4 @@ To learn more about Qute, please refer to the xref:qute-reference.adoc[Qute refe [[qute-configuration-reference]] == Qute Configuration Reference -include::{generated-config-doc-dir}/quarkus-qute.adoc[leveloffset=+1, opts=optional] +include::{generated-dir}/config/quarkus-qute.adoc[leveloffset=+1, opts=optional] diff --git a/docs/src/main/asciidoc/rabbitmq-reference.adoc b/docs/src/main/asciidoc/rabbitmq-reference.adoc index 1d809650487cc..a4bf77788ea9e 100644 --- a/docs/src/main/asciidoc/rabbitmq-reference.adoc +++ b/docs/src/main/asciidoc/rabbitmq-reference.adoc @@ -470,7 +470,7 @@ the default mount path of `rabbitmq`. If the RabbitMQ secret engine was mounted //=== Quarkus specific configuration -//include::{generated-config-doc-dir}/quarkus-smallrye-reactivemessaging-rabbitmq.adoc[opts=optional, leveloffset=+1] +//include::{generated-dir}/config/quarkus-smallrye-reactivemessaging-rabbitmq.adoc[opts=optional, leveloffset=+1] === Incoming channel configuration diff --git a/docs/src/main/asciidoc/reactive-sql-clients.adoc b/docs/src/main/asciidoc/reactive-sql-clients.adoc index 0f7cff6be12e7..5b64977d6a91c 100644 --- a/docs/src/main/asciidoc/reactive-sql-clients.adoc +++ b/docs/src/main/asciidoc/reactive-sql-clients.adoc @@ -902,28 +902,28 @@ By default, `pipelining-limit` is set to 256. === Common Datasource -include::{generated-config-doc-dir}/quarkus-datasource.adoc[opts=optional, leveloffset=+1] +include::{generated-dir}/config/quarkus-datasource.adoc[opts=optional, leveloffset=+1] === Reactive Datasource -include::{generated-config-doc-dir}/quarkus-reactive-datasource.adoc[opts=optional, leveloffset=+1] +include::{generated-dir}/config/quarkus-reactive-datasource.adoc[opts=optional, leveloffset=+1] === IBM Db2 -include::{generated-config-doc-dir}/quarkus-reactive-db2-client.adoc[opts=optional, leveloffset=+1] +include::{generated-dir}/config/quarkus-reactive-db2-client.adoc[opts=optional, leveloffset=+1] === MariaDB/MySQL -include::{generated-config-doc-dir}/quarkus-reactive-mysql-client.adoc[opts=optional, leveloffset=+1] +include::{generated-dir}/config/quarkus-reactive-mysql-client.adoc[opts=optional, leveloffset=+1] === Microsoft SQL Server -include::{generated-config-doc-dir}/quarkus-reactive-mssql-client.adoc[opts=optional, leveloffset=+1] +include::{generated-dir}/config/quarkus-reactive-mssql-client.adoc[opts=optional, leveloffset=+1] === Oracle -include::{generated-config-doc-dir}/quarkus-reactive-oracle-client.adoc[opts=optional, leveloffset=+1] +include::{generated-dir}/config/quarkus-reactive-oracle-client.adoc[opts=optional, leveloffset=+1] === PostgreSQL -include::{generated-config-doc-dir}/quarkus-reactive-pg-client.adoc[opts=optional, leveloffset=+1] +include::{generated-dir}/config/quarkus-reactive-pg-client.adoc[opts=optional, leveloffset=+1] diff --git a/docs/src/main/asciidoc/redis-dev-services.adoc b/docs/src/main/asciidoc/redis-dev-services.adoc index e568c80df1fd6..8074a58e887b6 100644 --- a/docs/src/main/asciidoc/redis-dev-services.adoc +++ b/docs/src/main/asciidoc/redis-dev-services.adoc @@ -17,7 +17,7 @@ Quarkus will automatically start a Redis container when running tests or dev mod Available properties to customize the Redis Dev Service. -include::{generated-config-doc-dir}/quarkus-redis-client_quarkus.redis.devservices.adoc[opts=optional, leveloffset=+1] +include::{generated-dir}/config/quarkus-redis-client_quarkus.redis.devservices.adoc[opts=optional, leveloffset=+1] When running the production version of the application, the Redis connection need to be configured as normal, so if you want to include a production database config in your `application.properties` and continue to use Dev Services diff --git a/docs/src/main/asciidoc/redis-reference.adoc b/docs/src/main/asciidoc/redis-reference.adoc index e739f357df475..313b6f7df5bf0 100644 --- a/docs/src/main/asciidoc/redis-reference.adoc +++ b/docs/src/main/asciidoc/redis-reference.adoc @@ -1024,4 +1024,4 @@ quarkus.micrometer.binder.redis.enabled=false [[redis-configuration-reference]] == Configuration reference -include::{generated-config-doc-dir}/quarkus-redis-client.adoc[opts=optional, leveloffset=+1] +include::{generated-dir}/config/quarkus-redis-client.adoc[opts=optional, leveloffset=+1] diff --git a/docs/src/main/asciidoc/resteasy.adoc b/docs/src/main/asciidoc/resteasy.adoc index c0a9c6a0d4832..7c8c4f710ef75 100644 --- a/docs/src/main/asciidoc/resteasy.adoc +++ b/docs/src/main/asciidoc/resteasy.adoc @@ -740,7 +740,7 @@ This extension slightly differs from the RESTEasy default behavior as the defaul You can configure this behavior with the following configuration properties: -include::{generated-config-doc-dir}/quarkus-resteasy-multipart.adoc[leveloffset=+1, opts=optional] +include::{generated-dir}/config/quarkus-resteasy-multipart.adoc[leveloffset=+1, opts=optional] == Servlet compatibility diff --git a/docs/src/main/asciidoc/scheduler-reference.adoc b/docs/src/main/asciidoc/scheduler-reference.adoc index 78ad35cbe679d..8039175bb7a53 100644 --- a/docs/src/main/asciidoc/scheduler-reference.adoc +++ b/docs/src/main/asciidoc/scheduler-reference.adoc @@ -509,4 +509,4 @@ Read xref:./virtual-threads.adoc[the virtual thread guide] for more details. == Configuration Reference -include::{generated-config-doc-dir}/quarkus-scheduler.adoc[leveloffset=+1, opts=optional] +include::{generated-dir}/config/quarkus-scheduler.adoc[leveloffset=+1, opts=optional] diff --git a/docs/src/main/asciidoc/scheduler.adoc b/docs/src/main/asciidoc/scheduler.adoc index 851d94865e7ac..0938fd2a59351 100644 --- a/docs/src/main/asciidoc/scheduler.adoc +++ b/docs/src/main/asciidoc/scheduler.adoc @@ -191,4 +191,4 @@ include::{includes}/devtools/build-native.adoc[] [[scheduler-configuration-reference]] == Scheduler Configuration Reference -include::{generated-config-doc-dir}/quarkus-scheduler.adoc[leveloffset=+1, opts=optional] +include::{generated-dir}/config/quarkus-scheduler.adoc[leveloffset=+1, opts=optional] diff --git a/docs/src/main/asciidoc/security-authentication-mechanisms.adoc b/docs/src/main/asciidoc/security-authentication-mechanisms.adoc index 94799e6e037cc..704e7d3d3359d 100644 --- a/docs/src/main/asciidoc/security-authentication-mechanisms.adoc +++ b/docs/src/main/asciidoc/security-authentication-mechanisms.adoc @@ -217,7 +217,7 @@ public Response logout() { The following properties can be used to configure form-based authentication: -include::{generated-config-doc-dir}/quarkus-vertx-http_quarkus.http.auth.adoc[opts=optional, leveloffset=+1] +include::{generated-dir}/config/quarkus-vertx-http_quarkus.http.auth.adoc[opts=optional, leveloffset=+1] [[mutual-tls]] === Mutual TLS authentication diff --git a/docs/src/main/asciidoc/security-cors.adoc b/docs/src/main/asciidoc/security-cors.adoc index d9a2950877a49..c86f879b748ea 100644 --- a/docs/src/main/asciidoc/security-cors.adoc +++ b/docs/src/main/asciidoc/security-cors.adoc @@ -30,7 +30,7 @@ quarkus.http.cors=true When the filter is enabled and identifies an HTTP request as cross-origin, it will enforce the CORS policy. It will also add headers configured with the following properties before forwarding the request to its intended destination, like a servlet, Jakarta REST resource, or other endpoints. -include::{generated-config-doc-dir}/quarkus-vertx-http_quarkus.http.cors.adoc[leveloffset=+1, opts=optional] +include::{generated-dir}/config/quarkus-vertx-http_quarkus.http.cors.adoc[leveloffset=+1, opts=optional] . An example of a full CORS filter configuration that includes a regular expression defining an allowed origin [source, properties] diff --git a/docs/src/main/asciidoc/security-csrf-prevention.adoc b/docs/src/main/asciidoc/security-csrf-prevention.adoc index 7aed0e53e2f49..7cc847dfe5dce 100644 --- a/docs/src/main/asciidoc/security-csrf-prevention.adoc +++ b/docs/src/main/asciidoc/security-csrf-prevention.adoc @@ -322,7 +322,7 @@ quarkus.csrf-reactive.verify-token=false [[csrf-reactive-configuration-reference]] == Configuration Reference -include::{generated-config-doc-dir}/quarkus-rest-csrf.adoc[leveloffset=+1, opts=optional] +include::{generated-dir}/config/quarkus-rest-csrf.adoc[leveloffset=+1, opts=optional] == References diff --git a/docs/src/main/asciidoc/security-jdbc.adoc b/docs/src/main/asciidoc/security-jdbc.adoc index fe5b61b80a5e4..11e498e594f3a 100644 --- a/docs/src/main/asciidoc/security-jdbc.adoc +++ b/docs/src/main/asciidoc/security-jdbc.adoc @@ -319,7 +319,7 @@ quarkus.security.jdbc.principal-query.roles.attribute-mappings.0.to=groups [[configuration-reference]] == Configuration Reference -include::{generated-config-doc-dir}/quarkus-elytron-security-jdbc.adoc[opts=optional, leveloffset=+1] +include::{generated-dir}/config/quarkus-elytron-security-jdbc.adoc[opts=optional, leveloffset=+1] == References diff --git a/docs/src/main/asciidoc/security-jpa.adoc b/docs/src/main/asciidoc/security-jpa.adoc index 71c9743dbbfba..0eefd1783de9e 100644 --- a/docs/src/main/asciidoc/security-jpa.adoc +++ b/docs/src/main/asciidoc/security-jpa.adoc @@ -218,7 +218,7 @@ However, if your `io.quarkus.hibernate.orm.runtime.tenant.TenantResolver` must a For more information about proactive authentication, see the Quarkus xref:security-proactive-authentication.adoc[Proactive authentication] guide. ==== -include::{generated-config-doc-dir}/quarkus-security-jpa.adoc[opts=optional, leveloffset=+2] +include::{generated-dir}/config/quarkus-security-jpa.adoc[opts=optional, leveloffset=+2] == References diff --git a/docs/src/main/asciidoc/security-jwt.adoc b/docs/src/main/asciidoc/security-jwt.adoc index 439867a1a4cb2..781a24f71987e 100644 --- a/docs/src/main/asciidoc/security-jwt.adoc +++ b/docs/src/main/asciidoc/security-jwt.adoc @@ -1040,7 +1040,7 @@ quarkus.index-dependency.smallrye-jwt.artifact-id=smallrye-jwt === Quarkus configuration -include::{generated-config-doc-dir}/quarkus-smallrye-jwt.adoc[opts=optional, leveloffset=+1] +include::{generated-dir}/config/quarkus-smallrye-jwt.adoc[opts=optional, leveloffset=+1] === MicroProfile JWT configuration diff --git a/docs/src/main/asciidoc/security-keycloak-admin-client.adoc b/docs/src/main/asciidoc/security-keycloak-admin-client.adoc index 0969330df70af..b4d70655ef1b4 100644 --- a/docs/src/main/asciidoc/security-keycloak-admin-client.adoc +++ b/docs/src/main/asciidoc/security-keycloak-admin-client.adoc @@ -215,7 +215,7 @@ For example, by default, a test container will be available at a randomly alloca [[keycloak-admin-client-configuration-reference]] == Quarkus Keycloak Admin Client Configuration Reference -include::{generated-config-doc-dir}/quarkus-keycloak-admin-client.adoc[leveloffset=+1, opts=optional] +include::{generated-dir}/config/quarkus-keycloak-admin-client.adoc[leveloffset=+1, opts=optional] == References diff --git a/docs/src/main/asciidoc/security-keycloak-authorization.adoc b/docs/src/main/asciidoc/security-keycloak-authorization.adoc index 0016429574f4a..6e9354c790f2c 100644 --- a/docs/src/main/asciidoc/security-keycloak-authorization.adoc +++ b/docs/src/main/asciidoc/security-keycloak-authorization.adoc @@ -623,7 +623,7 @@ public class CustomTenantPolicyConfigResolver implements TenantPolicyConfigResol This configuration adheres to the official [Keycloak Policy Enforcer Configuration](https://www.keycloak.org/docs/latest/authorization_services/index.html#_enforcer_filter) guidelines. For detailed insights into various configuration options, see the following documentation: -include::{generated-config-doc-dir}/quarkus-keycloak-authorization.adoc[opts=optional] +include::{generated-dir}/config/quarkus-keycloak-authorization.adoc[opts=optional] == References diff --git a/docs/src/main/asciidoc/security-ldap.adoc b/docs/src/main/asciidoc/security-ldap.adoc index 169fc3348629f..83b1695367a83 100644 --- a/docs/src/main/asciidoc/security-ldap.adoc +++ b/docs/src/main/asciidoc/security-ldap.adoc @@ -249,7 +249,7 @@ user% [[configuration-reference]] == Configuration Reference -include::{generated-config-doc-dir}/quarkus-elytron-security-ldap.adoc[opts=optional, leveloffset=+1] +include::{generated-dir}/config/quarkus-elytron-security-ldap.adoc[opts=optional, leveloffset=+1] == References diff --git a/docs/src/main/asciidoc/security-oauth2.adoc b/docs/src/main/asciidoc/security-oauth2.adoc index a03657f209e97..071f52b89ad9d 100644 --- a/docs/src/main/asciidoc/security-oauth2.adoc +++ b/docs/src/main/asciidoc/security-oauth2.adoc @@ -450,4 +450,4 @@ class TokenSecuredResourceTest { [[config-reference]] == Configuration Reference -include::{generated-config-doc-dir}/quarkus-elytron-security-oauth2.adoc[opts=optional, leveloffset=+1] +include::{generated-dir}/config/quarkus-elytron-security-oauth2.adoc[opts=optional, leveloffset=+1] diff --git a/docs/src/main/asciidoc/security-oidc-configuration-properties-reference.adoc b/docs/src/main/asciidoc/security-oidc-configuration-properties-reference.adoc index ed5254942620b..6ada18cfc2b2c 100644 --- a/docs/src/main/asciidoc/security-oidc-configuration-properties-reference.adoc +++ b/docs/src/main/asciidoc/security-oidc-configuration-properties-reference.adoc @@ -15,11 +15,11 @@ As a Quarkus developer, you configure the Quarkus OpenID Connect (OIDC) extensio == OIDC configuration -include::{generated-config-doc-dir}/quarkus-oidc_quarkus.oidc.adoc[opts=optional, leveloffset=+1] +include::{generated-dir}/config/quarkus-oidc_quarkus.oidc.adoc[opts=optional, leveloffset=+1] == Keycloak Dev Services configuration -include::{generated-config-doc-dir}/quarkus-oidc_quarkus.keycloak.adoc[opts=optional, leveloffset=+1] +include::{generated-dir}/config/quarkus-oidc_quarkus.keycloak.adoc[opts=optional, leveloffset=+1] == References diff --git a/docs/src/main/asciidoc/security-openid-connect-client-reference.adoc b/docs/src/main/asciidoc/security-openid-connect-client-reference.adoc index a39fd98e16f88..f4526a7752c64 100644 --- a/docs/src/main/asciidoc/security-openid-connect-client-reference.adoc +++ b/docs/src/main/asciidoc/security-openid-connect-client-reference.adoc @@ -1414,11 +1414,11 @@ endif::no-quarkus-oidc-client-graphql[] === OIDC client -include::{generated-config-doc-dir}/quarkus-oidc-client.adoc[opts=optional, leveloffset=+1] +include::{generated-dir}/config/quarkus-oidc-client.adoc[opts=optional, leveloffset=+1] === OIDC token propagation -include::{generated-config-doc-dir}/quarkus-rest-client-oidc-token-propagation.adoc[opts=optional, leveloffset=+1] +include::{generated-dir}/config/quarkus-rest-client-oidc-token-propagation.adoc[opts=optional, leveloffset=+1] == References diff --git a/docs/src/main/asciidoc/security-properties.adoc b/docs/src/main/asciidoc/security-properties.adoc index 65814617de728..259f678162723 100644 --- a/docs/src/main/asciidoc/security-properties.adoc +++ b/docs/src/main/asciidoc/security-properties.adoc @@ -37,7 +37,7 @@ Both support storage of this information in properties files. The following sections detail the specific configuration properties. -include::{generated-config-doc-dir}/quarkus-elytron-security-properties-file.adoc[opts=optional, leveloffset=+2] +include::{generated-dir}/config/quarkus-elytron-security-properties-file.adoc[opts=optional, leveloffset=+2] === Properties Files Realm Configuration diff --git a/docs/src/main/asciidoc/security-webauthn.adoc b/docs/src/main/asciidoc/security-webauthn.adoc index fa36b02526782..996691c7a8183 100644 --- a/docs/src/main/asciidoc/security-webauthn.adoc +++ b/docs/src/main/asciidoc/security-webauthn.adoc @@ -1295,7 +1295,7 @@ The security encryption key can be set with the link:all-config#quarkus-vertx-http_quarkus.http.auth.session.encryption-key[`quarkus.http.auth.session.encryption-key`] configuration option, as described in the link:security-authentication-mechanisms#form-auth[security guide]. -include::{generated-config-doc-dir}/quarkus-security-webauthn.adoc[opts=optional, leveloffset=+1] +include::{generated-dir}/config/quarkus-security-webauthn.adoc[opts=optional, leveloffset=+1] == References diff --git a/docs/src/main/asciidoc/smallrye-graphql.adoc b/docs/src/main/asciidoc/smallrye-graphql.adoc index 660f1eafe63c5..9537d30858049 100644 --- a/docs/src/main/asciidoc/smallrye-graphql.adoc +++ b/docs/src/main/asciidoc/smallrye-graphql.adoc @@ -1316,4 +1316,4 @@ API `evolution`. [[configuration-reference]] == Configuration Reference -include::{generated-config-doc-dir}/quarkus-smallrye-graphql.adoc[leveloffset=+1, opts=optional] +include::{generated-dir}/config/quarkus-smallrye-graphql.adoc[leveloffset=+1, opts=optional] diff --git a/docs/src/main/asciidoc/smallrye-health.adoc b/docs/src/main/asciidoc/smallrye-health.adoc index 09d3321e9b40b..6041797a540fc 100644 --- a/docs/src/main/asciidoc/smallrye-health.adoc +++ b/docs/src/main/asciidoc/smallrye-health.adoc @@ -468,4 +468,4 @@ implementation("io.quarkus:quarkus-smallrye-health") == Configuration Reference -include::{generated-config-doc-dir}/quarkus-smallrye-health_quarkus.smallrye-health.adoc[opts=optional, leveloffset=+1] +include::{generated-dir}/config/quarkus-smallrye-health_quarkus.smallrye-health.adoc[opts=optional, leveloffset=+1] diff --git a/docs/src/main/asciidoc/smallrye-metrics.adoc b/docs/src/main/asciidoc/smallrye-metrics.adoc index f293ff9a7d486..01a2ad27493fb 100644 --- a/docs/src/main/asciidoc/smallrye-metrics.adoc +++ b/docs/src/main/asciidoc/smallrye-metrics.adoc @@ -240,4 +240,4 @@ Refer to the xref:./management-interface-reference.adoc[management interface ref .Configuration Reference -include::{generated-config-doc-dir}/quarkus-smallrye-metrics.adoc[opts=optional, leveloffset=+1] +include::{generated-dir}/config/quarkus-smallrye-metrics.adoc[opts=optional, leveloffset=+1] diff --git a/docs/src/main/asciidoc/spring-cloud-config-client.adoc b/docs/src/main/asciidoc/spring-cloud-config-client.adoc index c75c8dcfe4eae..ddc26dfceb9d6 100644 --- a/docs/src/main/asciidoc/spring-cloud-config-client.adoc +++ b/docs/src/main/asciidoc/spring-cloud-config-client.adoc @@ -160,5 +160,5 @@ Quarkus has more Spring compatibility features. See the following guides for mor [[spring-cloud-config-client-configuration-reference]] == Spring Cloud Config Client Reference -include::{generated-config-doc-dir}/quarkus-spring-cloud-config-client.adoc[leveloffset=+1, opts=optional] +include::{generated-dir}/config/quarkus-spring-cloud-config-client.adoc[leveloffset=+1, opts=optional] diff --git a/docs/src/main/asciidoc/spring-di.adoc b/docs/src/main/asciidoc/spring-di.adoc index 23bd69c79cb74..22d116afabd8e 100644 --- a/docs/src/main/asciidoc/spring-di.adoc +++ b/docs/src/main/asciidoc/spring-di.adoc @@ -338,7 +338,7 @@ The following table shows how Spring DI annotations can be converted to CDI and == Spring DI Configuration Reference -include::{generated-config-doc-dir}/quarkus-spring-di.adoc[leveloffset=+1, opts=optional] +include::{generated-dir}/config/quarkus-spring-di.adoc[leveloffset=+1, opts=optional] == More Spring guides diff --git a/docs/src/main/asciidoc/stork-reference.adoc b/docs/src/main/asciidoc/stork-reference.adoc index 704e170f646d4..7188aa60dd3a2 100644 --- a/docs/src/main/asciidoc/stork-reference.adoc +++ b/docs/src/main/asciidoc/stork-reference.adoc @@ -134,7 +134,7 @@ quarkus.micrometer.binder.stork.enabled=false [[stork-configuration-reference]] == Configuration reference -include::{generated-config-doc-dir}/quarkus-smallrye-stork.adoc[opts=optional, leveloffset=+1] +include::{generated-dir}/config/quarkus-smallrye-stork.adoc[opts=optional, leveloffset=+1] diff --git a/docs/src/main/asciidoc/telemetry-micrometer-tutorial.adoc b/docs/src/main/asciidoc/telemetry-micrometer-tutorial.adoc index 3fee28c02168b..4d83350cef63f 100644 --- a/docs/src/main/asciidoc/telemetry-micrometer-tutorial.adoc +++ b/docs/src/main/asciidoc/telemetry-micrometer-tutorial.adoc @@ -46,7 +46,7 @@ Let's first add a simple endpoint that calculates prime numbers. [source,java] ---- -include::{code-examples}/telemetry-micrometer-tutorial-example-resource.java[tags=example;!ignore;!registry;!gauge;!counted;!timed] +include::{generated-dir}/examples/telemetry-micrometer-tutorial-example-resource.java[tags=example;!ignore;!registry;!gauge;!counted;!timed] ---- Start your application in dev mode: @@ -107,7 +107,7 @@ The `MeterRegistry` can be injected into your application as follows: [source,java] ---- -include::{code-examples}/telemetry-micrometer-tutorial-example-resource.java[tags=registry;!gauge] +include::{generated-dir}/examples/telemetry-micrometer-tutorial-example-resource.java[tags=registry;!gauge] ---- == Add a Counter @@ -119,7 +119,7 @@ We'll add a dimensional label (also called an attribute or a tag) that will allo [source,java] ---- -include::{code-examples}/telemetry-micrometer-tutorial-example-resource.java[tags=primeMethod;counted;!ignore;!timed] +include::{generated-dir}/examples/telemetry-micrometer-tutorial-example-resource.java[tags=primeMethod;counted;!ignore;!timed] ---- <1> Find or create a counter called `example.prime.number` that has a `type` label with the specified value. @@ -167,7 +167,7 @@ Let's add a timer to measure how long it takes to determine if a number is prime [source,java] ---- -include::{code-examples}/telemetry-micrometer-tutorial-example-resource.java[tags=primeMethod;counted;timed;!ignore;!default] +include::{generated-dir}/examples/telemetry-micrometer-tutorial-example-resource.java[tags=primeMethod;counted;timed;!ignore;!default] ---- <1> Find or create a counter called `example.prime.number` that has a `type` label with the specified value. @@ -212,7 +212,7 @@ Use a gauge to observe the size of a collection, or the value returned from a fu [source,java] ---- -include::{code-examples}/telemetry-micrometer-tutorial-example-resource.java[tags=ctor;gauge] +include::{generated-dir}/examples/telemetry-micrometer-tutorial-example-resource.java[tags=ctor;gauge] ---- <1> Define list that will hold arbitrary numbers. diff --git a/docs/src/main/asciidoc/telemetry-micrometer.adoc b/docs/src/main/asciidoc/telemetry-micrometer.adoc index ba2748f6cd53f..a61966fa16d76 100644 --- a/docs/src/main/asciidoc/telemetry-micrometer.adoc +++ b/docs/src/main/asciidoc/telemetry-micrometer.adoc @@ -764,4 +764,4 @@ Refer to the xref:./management-interface-reference.adoc[management interface ref == Configuration Reference -include::{generated-config-doc-dir}/quarkus-micrometer.adoc[opts=optional, leveloffset=+1] +include::{generated-dir}/config/quarkus-micrometer.adoc[opts=optional, leveloffset=+1] diff --git a/docs/src/main/asciidoc/tests-with-coverage.adoc b/docs/src/main/asciidoc/tests-with-coverage.adoc index bf88ea692ead6..732b946ce1428 100644 --- a/docs/src/main/asciidoc/tests-with-coverage.adoc +++ b/docs/src/main/asciidoc/tests-with-coverage.adoc @@ -198,7 +198,7 @@ the `quarkus-jacoco` extension allows JaCoCo to just work out of the box. There are some config options that affect this: -include::{generated-config-doc-dir}/quarkus-jacoco.adoc[opts=optional, leveloffset=+1] +include::{generated-dir}/config/quarkus-jacoco.adoc[opts=optional, leveloffset=+1] [TIP] ==== diff --git a/docs/src/main/asciidoc/tls-registry-reference.adoc b/docs/src/main/asciidoc/tls-registry-reference.adoc index c758e3f7d414c..955917ba94063 100644 --- a/docs/src/main/asciidoc/tls-registry-reference.adoc +++ b/docs/src/main/asciidoc/tls-registry-reference.adoc @@ -437,7 +437,7 @@ quarkus.tls.hostname-verification-algorithm=NONE The following table lists the supported properties: -include::{generated-config-doc-dir}/quarkus-tls-registry.adoc[opts=optional, leveloffset=+1] +include::{generated-dir}/config/quarkus-tls-registry.adoc[opts=optional, leveloffset=+1] == The registry API diff --git a/docs/src/main/asciidoc/validation.adoc b/docs/src/main/asciidoc/validation.adoc index 3fea25f130915..425d97b01fc7b 100644 --- a/docs/src/main/asciidoc/validation.adoc +++ b/docs/src/main/asciidoc/validation.adoc @@ -514,4 +514,4 @@ is called. [[configuration-reference]] == Hibernate Validator Configuration Reference -include::{generated-config-doc-dir}/quarkus-hibernate-validator.adoc[leveloffset=+1, opts=optional] +include::{generated-dir}/config/quarkus-hibernate-validator.adoc[leveloffset=+1, opts=optional] diff --git a/docs/src/main/asciidoc/vertx-reference.adoc b/docs/src/main/asciidoc/vertx-reference.adoc index 05dc47e22f53f..b542c1ff0f2d4 100644 --- a/docs/src/main/asciidoc/vertx-reference.adoc +++ b/docs/src/main/asciidoc/vertx-reference.adoc @@ -60,7 +60,7 @@ Documentation about the Vert.x Mutiny variant is available on https://smallrye.i You can configure the Vert.x instance from the `application.properties` file. The following table lists the supported properties: -include::{generated-config-doc-dir}/quarkus-vertx.adoc[opts=optional, leveloffset=+1] +include::{generated-dir}/config/quarkus-vertx.adoc[opts=optional, leveloffset=+1] See <> to configure the Vert.x instance using a programmatic approach. diff --git a/docs/src/main/asciidoc/websockets-next-reference.adoc b/docs/src/main/asciidoc/websockets-next-reference.adoc index 55bb2fd407eca..024567a8ab97c 100644 --- a/docs/src/main/asciidoc/websockets-next-reference.adoc +++ b/docs/src/main/asciidoc/websockets-next-reference.adoc @@ -1022,4 +1022,4 @@ quarkus.log.category."io.quarkus.websockets.next.traffic".level=DEBUG <3> [[websocket-next-configuration-reference]] == Configuration reference -include::{generated-config-doc-dir}/quarkus-websockets-next.adoc[opts=optional, leveloffset=+1] +include::{generated-dir}/config/quarkus-websockets-next.adoc[opts=optional, leveloffset=+1] diff --git a/docs/src/main/asciidoc/writing-extensions.adoc b/docs/src/main/asciidoc/writing-extensions.adoc index 61082f0fc19ec..b371e3f200400 100644 --- a/docs/src/main/asciidoc/writing-extensions.adoc +++ b/docs/src/main/asciidoc/writing-extensions.adoc @@ -1356,7 +1356,7 @@ To include the generated configuration reference documentation in a guide, use: [source,asciidoc] ---- -\include::{generated-config-doc-dir}/quarkus-your-extension.adoc[opts=optional, leveloffset=+1] +\include::{generated-dir}/config/quarkus-your-extension.adoc[opts=optional, leveloffset=+1] ---- To include only a specific config group: @@ -1389,7 +1389,7 @@ And at the end of the guide, the extensive configuration documentation: [[configuration-reference]] == Configuration Reference -\include::{generated-config-doc-dir}/quarkus-your-extension.adoc[opts=optional, leveloffset=+1] +\include::{generated-dir}/config/quarkus-your-extension.adoc[opts=optional, leveloffset=+1] ---- [WARNING] diff --git a/docs/src/main/java/io/quarkus/docs/generation/AssembleDownstreamDocumentation.java b/docs/src/main/java/io/quarkus/docs/generation/AssembleDownstreamDocumentation.java index 29bd3e2abf681..f87a9763c1238 100755 --- a/docs/src/main/java/io/quarkus/docs/generation/AssembleDownstreamDocumentation.java +++ b/docs/src/main/java/io/quarkus/docs/generation/AssembleDownstreamDocumentation.java @@ -40,9 +40,7 @@ public class AssembleDownstreamDocumentation { private static final Path SOURCE_DOC_PATH = Path.of("src", "main", "asciidoc"); private static final Path DOC_PATH = Path.of("target", "asciidoc", "sources"); private static final Path INCLUDES_PATH = DOC_PATH.resolve("_includes"); - private static final Path GENERATED_CONFIG_DOC_FILES_PATH = Path.of("target", "quarkus-config-doc"); - private static final Path GENERATED_INFRA_DOC_FILES_PATH = Path.of("target", "quarkus-generated-doc", "infra"); - private static final Path GENERATED_CODE_EXAMPLE_FILES_PATH = Path.of("target", "quarkus-generated-doc", "examples"); + private static final Path GENERATED_DOC_FILES_PATH = Path.of("target", "quarkus-generated-doc"); private static final Path IMAGES_PATH = DOC_PATH.resolve("images"); private static final Path TARGET_ROOT_DIRECTORY = Path.of("target", "downstream-tree"); private static final Path TARGET_IMAGES_DIRECTORY = TARGET_ROOT_DIRECTORY.resolve("images"); @@ -101,16 +99,8 @@ public static void main(String[] args) throws Exception { throw new IllegalStateException( "Transformed AsciiDoc sources directory does not exist. Have you built the documentation?"); } - if (!Files.isDirectory(GENERATED_CONFIG_DOC_FILES_PATH)) { - throw new IllegalStateException("Generated files directory `" + GENERATED_CONFIG_DOC_FILES_PATH - + "` does not exist. Have you built the documentation?"); - } - if (!Files.isDirectory(GENERATED_INFRA_DOC_FILES_PATH)) { - throw new IllegalStateException("Generated files directory `" + GENERATED_INFRA_DOC_FILES_PATH - + "` does not exist. Have you built the documentation?"); - } - if (!Files.isDirectory(GENERATED_CODE_EXAMPLE_FILES_PATH)) { - throw new IllegalStateException("Generated files directory `" + GENERATED_CODE_EXAMPLE_FILES_PATH + if (!Files.isDirectory(GENERATED_DOC_FILES_PATH)) { + throw new IllegalStateException("Generated files directory `" + GENERATED_DOC_FILES_PATH + "` does not exist. Have you built the documentation?"); } Path referenceIndexPath = Path.of(args[0]); @@ -160,9 +150,7 @@ public static void main(String[] args) throws Exception { Set guides = new TreeSet<>(); Set simpleIncludes = new TreeSet<>(); Set includes = new TreeSet<>(); - Set generatedConfigDocFiles = new TreeSet<>(); - Set generatedInfraDocFiles = new TreeSet<>(); - Set generatedCodeExampleFiles = new TreeSet<>(); + Set generatedDocFiles = new TreeSet<>(); Set images = new TreeSet<>(); Set allResolvedPaths = new TreeSet<>(); @@ -186,9 +174,7 @@ public static void main(String[] args) throws Exception { guides.add(guidePath); simpleIncludes.addAll(guideContent.simpleIncludes); includes.addAll(guideContent.includes); - generatedConfigDocFiles.addAll(guideContent.generatedConfigDocFiles); - generatedInfraDocFiles.addAll(guideContent.generatedInfraDocFiles); - generatedCodeExampleFiles.addAll(guideContent.generatedCodeExampleFiles); + generatedDocFiles.addAll(guideContent.generatedDocFiles); images.addAll(guideContent.images); } @@ -228,11 +214,7 @@ public static void main(String[] args) throws Exception { } copyGeneratedFiles(linkRewritingErrors, titlesByReference, allResolvedPaths, - downstreamGuides, GENERATED_CONFIG_DOC_FILES_PATH, generatedConfigDocFiles, Path.of("config")); - copyGeneratedFiles(linkRewritingErrors, titlesByReference, allResolvedPaths, - downstreamGuides, GENERATED_INFRA_DOC_FILES_PATH, generatedInfraDocFiles, Path.of("infra")); - copyGeneratedFiles(linkRewritingErrors, titlesByReference, allResolvedPaths, - downstreamGuides, GENERATED_CODE_EXAMPLE_FILES_PATH, generatedCodeExampleFiles, Path.of("examples")); + downstreamGuides, GENERATED_DOC_FILES_PATH, generatedDocFiles); for (Path image : images) { Path sourceFile = IMAGES_PATH.resolve(image); @@ -278,7 +260,7 @@ public static void main(String[] args) throws Exception { private static void copyGeneratedFiles(Map> linkRewritingErrors, Map titlesByReference, Set allResolvedPaths, Set downstreamGuides, Path generatedSourceFilesDirectory, - Set generatedFiles, Path targetSubdirectory) + Set generatedFiles) throws IOException { for (Path generatedConfigDocFile : generatedFiles) { Path sourceFile = generatedSourceFilesDirectory.resolve(generatedConfigDocFile); @@ -289,7 +271,7 @@ private static void copyGeneratedFiles(Map> linkRewritingEr LOG.error("Unable to read generated file " + sourceFile); } allResolvedPaths.add(sourceFile); - Path targetFile = TARGET_GENERATED_DIRECTORY.resolve(targetSubdirectory).resolve(generatedConfigDocFile); + Path targetFile = TARGET_GENERATED_DIRECTORY.resolve(generatedConfigDocFile); Files.createDirectories(targetFile.getParent()); copyAsciidoc(sourceFile, targetFile, downstreamGuides, titlesByReference, linkRewritingErrors); } @@ -305,19 +287,9 @@ private static void getFiles(GuideContent guideContent, Path currentFile) throws getFurtherIncludes(guideContent, INCLUDES_PATH.resolve(possibleInclude.get())); continue; } - Optional possibleGeneratedConfigDocFile = extractPath(line, "include::{generated-config-doc-dir}"); + Optional possibleGeneratedConfigDocFile = extractPath(line, "include::{generated-dir}"); if (possibleGeneratedConfigDocFile.isPresent()) { - guideContent.generatedConfigDocFiles.add(possibleGeneratedConfigDocFile.get()); - continue; - } - Optional possibleGeneratedInfraDocFile = extractPath(line, "include::{generated-infra-doc-dir}"); - if (possibleGeneratedInfraDocFile.isPresent()) { - guideContent.generatedInfraDocFiles.add(possibleGeneratedInfraDocFile.get()); - continue; - } - Optional possibleCodeExampleFile = extractPath(line, "include::{code-examples-dir}"); - if (possibleGeneratedInfraDocFile.isPresent()) { - guideContent.generatedCodeExampleFiles.add(possibleCodeExampleFile.get()); + guideContent.generatedDocFiles.add(possibleGeneratedConfigDocFile.get()); continue; } Optional possibleSimpleInclude = extractPath(line, "include::"); @@ -575,9 +547,7 @@ public static class GuideContent { public Set simpleIncludes = new TreeSet<>(); public Set includes = new TreeSet<>(); public Set images = new TreeSet<>(); - public Set generatedConfigDocFiles = new TreeSet<>(); - public Set generatedInfraDocFiles = new TreeSet<>(); - public Set generatedCodeExampleFiles = new TreeSet<>(); + public Set generatedDocFiles = new TreeSet<>(); public GuideContent(Path guide) { this.guide = guide; diff --git a/docs/sync-web-site.sh b/docs/sync-web-site.sh index f65b3d3f8abfa..9d707130a72fd 100755 --- a/docs/sync-web-site.sh +++ b/docs/sync-web-site.sh @@ -46,11 +46,11 @@ fi if [ $BRANCH == "main" ] && [ "$QUARKUS_RELEASE" == "true" ]; then TARGET_GUIDES=${TARGET_DIR}/_guides - TARGET_CONFIG=${TARGET_DIR}/_generated-doc/latest + TARGET_GENERATED_DOC=${TARGET_DIR}/_generated-doc/latest TARGET_INDEX=${TARGET_DIR}/_data/versioned/latest/index else TARGET_GUIDES=${TARGET_DIR}/_versions/${BRANCH}/guides - TARGET_CONFIG=${TARGET_DIR}/_generated-doc/${BRANCH} + TARGET_GENERATED_DOC=${TARGET_DIR}/_generated-doc/${BRANCH} TARGET_INDEX=${TARGET_DIR}/_data/versioned/${BRANCH//[.]/-}/index mkdir -p ${TARGET_GUIDES} mkdir -p ${TARGET_INDEX} @@ -109,16 +109,16 @@ rsync -vr --delete \ target/asciidoc/sources/ \ $TARGET_GUIDES -if [ -d ../target/asciidoc/generated/ ]; then +if [ -d target/quarkus-generated-doc/ ]; then echo - echo "Copying from ../target/asciidoc/generated/ to $TARGET_CONFIG" + echo "Copying from target/quarkus-generated-doc/ to $TARGET_GENERATED_DOC" echo rsync -vr --delete \ --exclude='**/*.html' \ --exclude='**/index.adoc' \ --exclude='**/_attributes.adoc' \ - ../target/asciidoc/generated/ \ - $TARGET_CONFIG + target/quarkus-generated-doc/ \ + $TARGET_GENERATED_DOC fi if [ -f target/indexByType.yaml ]; then @@ -167,7 +167,7 @@ Run one of the following command to check the web site (if not done already): cd target/web-site docker run --rm --volume=\"$PWD:/srv/jekyll:Z\" \\ --publish 4000:4000 jekyll/jekyll:4.1.0 jekyll serve --incremental - + - If you have Podman, something similar should work, but... - you may need to set the Jekyll user/group id to match yours: -e JEKYLL_UID=501 -e JEKYLL_GID=503 - you may need to add an environment variable if you are running rootless: -e JEKYLL_ROOTLESS=1 From 9ee3782c03ca619a2b04d36c949597e2964fece6 Mon Sep 17 00:00:00 2001 From: Guillaume Smet Date: Tue, 6 Aug 2024 16:17:20 +0200 Subject: [PATCH 40/43] Allow not detecting the extension We actually have some level of support for building an extension with Gradle so we need to make it work. However, at the moment, it's close to impossible to determine the extension we are in in a Gradle extension. So we allow not detecting the extension and disable the config doc generation in this case. --- .../ExtensionAnnotationProcessor.java | 34 +++++++++++-------- .../documentation/config/model/Extension.java | 6 +++- .../processor/util/ExtensionUtil.java | 21 ++++++++---- .../annotation/processor/util/FilerUtil.java | 14 +++++--- .../annotation/processor/util/Utils.java | 2 +- 5 files changed, 51 insertions(+), 26 deletions(-) diff --git a/core/processor/src/main/java/io/quarkus/annotation/processor/ExtensionAnnotationProcessor.java b/core/processor/src/main/java/io/quarkus/annotation/processor/ExtensionAnnotationProcessor.java index fa3758b7c61a7..c224ba30c764b 100644 --- a/core/processor/src/main/java/io/quarkus/annotation/processor/ExtensionAnnotationProcessor.java +++ b/core/processor/src/main/java/io/quarkus/annotation/processor/ExtensionAnnotationProcessor.java @@ -16,6 +16,7 @@ import javax.lang.model.element.ExecutableElement; import javax.lang.model.element.TypeElement; import javax.tools.Diagnostic; +import javax.tools.Diagnostic.Kind; import org.jboss.jdeparser.JDeparser; @@ -38,19 +39,6 @@ public class ExtensionAnnotationProcessor extends AbstractProcessor { public synchronized void init(ProcessingEnvironment processingEnv) { super.init(processingEnv); - List extensionProcessors = new ArrayList<>(); - extensionProcessors.add(new ExtensionBuildProcessor()); - - boolean skipDocs = Boolean.getBoolean("skipDocs") || Boolean.getBoolean("quickly"); - boolean generateDoc = !skipDocs && !"false".equals(processingEnv.getOptions().get(Options.GENERATE_DOC)); - - // for now, we generate the old config doc by default but we will change this behavior soon - if (generateDoc) { - extensionProcessors.add(new ConfigDocExtensionProcessor()); - } - - this.extensionProcessors = Collections.unmodifiableList(extensionProcessors); - utils = new Utils(processingEnv); boolean useConfigMapping = !Boolean @@ -65,7 +53,25 @@ public synchronized void init(ProcessingEnvironment processingEnv) { + " config implementation is deprecated. Please migrate to use @ConfigMapping: https://quarkus.io/guides/writing-extensions#configuration"); } - for (ExtensionProcessor extensionProcessor : extensionProcessors) { + List extensionProcessors = new ArrayList<>(); + extensionProcessors.add(new ExtensionBuildProcessor()); + + boolean skipDocs = Boolean.getBoolean("skipDocs") || Boolean.getBoolean("quickly"); + boolean generateDoc = !skipDocs && !"false".equals(processingEnv.getOptions().get(Options.GENERATE_DOC)); + + // for now, we generate the old config doc by default but we will change this behavior soon + if (generateDoc) { + if (extension.detected()) { + extensionProcessors.add(new ConfigDocExtensionProcessor()); + } else { + processingEnv.getMessager().printMessage(Kind.WARNING, + "We could not detect the groupId and artifactId of this module (maybe you are using Gradle to build your extension?). The generation of the configuration documentation has been disabled."); + } + } + + this.extensionProcessors = Collections.unmodifiableList(extensionProcessors); + + for (ExtensionProcessor extensionProcessor : this.extensionProcessors) { extensionProcessor.init(config, utils); } } diff --git a/core/processor/src/main/java/io/quarkus/annotation/processor/documentation/config/model/Extension.java b/core/processor/src/main/java/io/quarkus/annotation/processor/documentation/config/model/Extension.java index 2a13590b6d686..a6c2941fea672 100644 --- a/core/processor/src/main/java/io/quarkus/annotation/processor/documentation/config/model/Extension.java +++ b/core/processor/src/main/java/io/quarkus/annotation/processor/documentation/config/model/Extension.java @@ -5,7 +5,11 @@ import com.fasterxml.jackson.annotation.JsonIgnore; public record Extension(String groupId, String artifactId, String name, - NameSource nameSource) implements Comparable { + NameSource nameSource, boolean detected) implements Comparable { + + public static Extension createNotDetected() { + return new Extension("not.detected", "not.detected", "Not detected", NameSource.NONE, false); + } @Override public final String toString() { diff --git a/core/processor/src/main/java/io/quarkus/annotation/processor/util/ExtensionUtil.java b/core/processor/src/main/java/io/quarkus/annotation/processor/util/ExtensionUtil.java index 7d834e1551186..6634c70469e59 100644 --- a/core/processor/src/main/java/io/quarkus/annotation/processor/util/ExtensionUtil.java +++ b/core/processor/src/main/java/io/quarkus/annotation/processor/util/ExtensionUtil.java @@ -4,6 +4,8 @@ import java.util.Map; import java.util.Optional; +import javax.annotation.processing.ProcessingEnvironment; +import javax.tools.Diagnostic.Kind; import javax.xml.XMLConstants; import javax.xml.parsers.DocumentBuilder; import javax.xml.parsers.DocumentBuilderFactory; @@ -26,9 +28,11 @@ public final class ExtensionUtil { private static final String NAME_COMMON_SUFFIX = " - Common"; private static final String NAME_INTERNAL_SUFFIX = " - Internal"; + private final ProcessingEnvironment processingEnv; private final FilerUtil filerUtil; - ExtensionUtil(FilerUtil filerUtil) { + ExtensionUtil(ProcessingEnvironment processingEnv, FilerUtil filerUtil) { + this.processingEnv = processingEnv; this.filerUtil = filerUtil; } @@ -37,7 +41,11 @@ public final class ExtensionUtil { * One option would be to pass it through the annotation processor but it's not exactly ideal. */ public Extension getExtension() { - Path pom = filerUtil.getPomPath(); + Optional pom = filerUtil.getPomPath(); + + if (pom.isEmpty()) { + return Extension.createNotDetected(); + } Document doc; @@ -45,13 +53,13 @@ public Extension getExtension() { DocumentBuilderFactory dbf = DocumentBuilderFactory.newInstance(); dbf.setFeature(XMLConstants.FEATURE_SECURE_PROCESSING, true); DocumentBuilder db = dbf.newDocumentBuilder(); - doc = db.parse(pom.toFile()); + doc = db.parse(pom.get().toFile()); doc.getDocumentElement().normalize(); } catch (Exception e) { throw new IllegalStateException("Unable to parse pom file: " + pom, e); } - return getExtensionFromPom(pom, doc); + return getExtensionFromPom(pom.get(), doc); } private Extension getExtensionFromPom(Path pom, Document doc) { @@ -99,7 +107,8 @@ private Extension getExtensionFromPom(Path pom, Document doc) { } if (groupId == null || groupId.isBlank() || artifactId == null || artifactId.isBlank()) { - throw new IllegalStateException("Unable to determine artifact coordinates from: " + pom); + processingEnv.getMessager().printMessage(Kind.WARNING, "Unable to determine artifact coordinates from: " + pom); + return Extension.createNotDetected(); } boolean commonOrInternal = false; @@ -142,7 +151,7 @@ private Extension getExtensionFromPom(Path pom, Document doc) { } } - return new Extension(groupId, artifactId, name, nameSource); + return new Extension(groupId, artifactId, name, nameSource, true); } private Optional getExtensionNameFromExtensionMetadata() { diff --git a/core/processor/src/main/java/io/quarkus/annotation/processor/util/FilerUtil.java b/core/processor/src/main/java/io/quarkus/annotation/processor/util/FilerUtil.java index 176dded94bf89..158f9d1621703 100644 --- a/core/processor/src/main/java/io/quarkus/annotation/processor/util/FilerUtil.java +++ b/core/processor/src/main/java/io/quarkus/annotation/processor/util/FilerUtil.java @@ -133,12 +133,18 @@ public Path getTargetPath() { } } - public Path getPomPath() { + public Optional getPomPath() { try { - return Paths.get(processingEnv.getFiler().getResource(StandardLocation.CLASS_OUTPUT, "", "dummy").toUri()) - .getParent().getParent().getParent().resolve("pom.xml").toAbsolutePath(); + Path pomPath = Paths.get(processingEnv.getFiler().getResource(StandardLocation.CLASS_OUTPUT, "", "dummy").toUri()) + .getParent().getParent().getParent().resolve("pom.xml"); + + if (!Files.isReadable(pomPath)) { + return Optional.empty(); + } + + return Optional.of(pomPath.toAbsolutePath()); } catch (IOException e) { - throw new IllegalStateException("Unable to determine path to pom.xml"); + return Optional.empty(); } } diff --git a/core/processor/src/main/java/io/quarkus/annotation/processor/util/Utils.java b/core/processor/src/main/java/io/quarkus/annotation/processor/util/Utils.java index 7888817d3f14b..66b3c2b161b07 100644 --- a/core/processor/src/main/java/io/quarkus/annotation/processor/util/Utils.java +++ b/core/processor/src/main/java/io/quarkus/annotation/processor/util/Utils.java @@ -15,7 +15,7 @@ public Utils(ProcessingEnvironment processingEnv) { this.elementUtil = new ElementUtil(processingEnv); this.accessorGenerator = new AccessorGenerator(processingEnv, elementUtil); this.filerUtil = new FilerUtil(processingEnv); - this.extensionUtil = new ExtensionUtil(filerUtil); + this.extensionUtil = new ExtensionUtil(processingEnv, filerUtil); } public ElementUtil element() { From ec9ade1e18960c0b9587aa4494101f51130dbd8b Mon Sep 17 00:00:00 2001 From: Guillaume Smet Date: Tue, 6 Aug 2024 18:32:06 +0200 Subject: [PATCH 41/43] Fix new extension annotation processor compatibility with Windows The annotation processor Filer API doesn't support Windows separators so let's use a plain string. --- .../quarkus/annotation/processor/Outputs.java | 14 ++++++++------ .../annotation/processor/util/FilerUtil.java | 17 ++++++++++++++--- 2 files changed, 22 insertions(+), 9 deletions(-) diff --git a/core/processor/src/main/java/io/quarkus/annotation/processor/Outputs.java b/core/processor/src/main/java/io/quarkus/annotation/processor/Outputs.java index ba297dd7a7486..5980f39830f29 100644 --- a/core/processor/src/main/java/io/quarkus/annotation/processor/Outputs.java +++ b/core/processor/src/main/java/io/quarkus/annotation/processor/Outputs.java @@ -9,15 +9,17 @@ */ public final class Outputs { - public static final Path META_INF_QUARKUS_BUILD_STEPS = Path.of("META-INF", "quarkus-build-steps.list"); - public static final Path META_INF_QUARKUS_CONFIG_ROOTS = Path.of("META-INF", "quarkus-config-roots.list"); + public static final String META_INF_QUARKUS_BUILD_STEPS = "META-INF/quarkus-build-steps.list"; + public static final String META_INF_QUARKUS_CONFIG_ROOTS = "META-INF/quarkus-config-roots.list"; - public static final Path META_INF_QUARKUS_CONFIG = Path.of("META-INF", "quarkus-config"); - public static final Path META_INF_QUARKUS_CONFIG_JAVADOC = META_INF_QUARKUS_CONFIG.resolve("quarkus-config-javadoc.json"); - public static final Path META_INF_QUARKUS_CONFIG_MODEL = META_INF_QUARKUS_CONFIG.resolve("quarkus-config-model.json"); + public static final String META_INF_QUARKUS_CONFIG = "META-INF/quarkus-config"; + public static final String META_INF_QUARKUS_CONFIG_JAVADOC = META_INF_QUARKUS_CONFIG + "/quarkus-config-javadoc.json"; + public static final String META_INF_QUARKUS_CONFIG_MODEL = META_INF_QUARKUS_CONFIG + "/quarkus-config-model.json"; /** * This directory is specific and written directly into target/ as it's not a file we want to package. + *

+ * It is not written by the annotation processor Filer API so we can use proper Paths. */ private static final Path QUARKUS_CONFIG_DOC = Path.of("quarkus-config-doc"); public static final Path QUARKUS_CONFIG_DOC_JAVADOC = QUARKUS_CONFIG_DOC.resolve("quarkus-config-javadoc.yaml"); @@ -27,7 +29,7 @@ public final class Outputs { * Ideally, we should remove this file at some point. */ @Deprecated(forRemoval = true) - public static final Path META_INF_QUARKUS_JAVADOC = Path.of("META-INF", "quarkus-javadoc.properties"); + public static final String META_INF_QUARKUS_JAVADOC = "META-INF/quarkus-javadoc.properties"; private Outputs() { } diff --git a/core/processor/src/main/java/io/quarkus/annotation/processor/util/FilerUtil.java b/core/processor/src/main/java/io/quarkus/annotation/processor/util/FilerUtil.java index 158f9d1621703..8875b96c7abb1 100644 --- a/core/processor/src/main/java/io/quarkus/annotation/processor/util/FilerUtil.java +++ b/core/processor/src/main/java/io/quarkus/annotation/processor/util/FilerUtil.java @@ -49,7 +49,10 @@ public class FilerUtil { this.processingEnv = processingEnv; } - public void write(Path filePath, Set set) { + /** + * This method uses the annotation processor Filer API and we shouldn't use a Path as paths containing \ are not supported. + */ + public void write(String filePath, Set set) { if (set.isEmpty()) { return; } @@ -71,7 +74,10 @@ public void write(Path filePath, Set set) { } } - public void write(Path filePath, Properties properties) { + /** + * This method uses the annotation processor Filer API and we shouldn't use a Path as paths containing \ are not supported. + */ + public void write(String filePath, Properties properties) { if (properties.isEmpty()) { return; } @@ -90,7 +96,10 @@ public void write(Path filePath, Properties properties) { } } - public void writeJson(Path filePath, Object value) { + /** + * This method uses the annotation processor Filer API and we shouldn't use a Path as paths containing \ are not supported. + */ + public void writeJson(String filePath, Object value) { if (value == null) { return; } @@ -110,6 +119,8 @@ public void writeJson(Path filePath, Object value) { /** * The model files are written outside of target/classes as we don't want to include them in the jar. + *

+ * They are not written by the annotation processor Filer API so we can use proper Paths. */ public Path writeModel(Path filePath, Object value) { Path yamlModelPath = getTargetPath().resolve(filePath); From 1a41c408bc7cc2905272a019ce7f58ea7d86535f Mon Sep 17 00:00:00 2001 From: Guillaume Smet Date: Wed, 7 Aug 2024 23:51:05 +0200 Subject: [PATCH 42/43] Don't make sections searchable I think we need to but it wasn't done before and the website is apparently not ready for it. See how https://quarkus.io/version/main/guides/dev-services misbehaves when all the sections are make searchable. --- .../quarkus/maven/config/doc/GenerateAsciidocMojo.java | 10 +++++----- 1 file changed, 5 insertions(+), 5 deletions(-) diff --git a/devtools/config-doc-maven-plugin/src/main/java/io/quarkus/maven/config/doc/GenerateAsciidocMojo.java b/devtools/config-doc-maven-plugin/src/main/java/io/quarkus/maven/config/doc/GenerateAsciidocMojo.java index 94f3d5d48ce6f..66a3b538878df 100644 --- a/devtools/config-doc-maven-plugin/src/main/java/io/quarkus/maven/config/doc/GenerateAsciidocMojo.java +++ b/devtools/config-doc-maven-plugin/src/main/java/io/quarkus/maven/config/doc/GenerateAsciidocMojo.java @@ -114,7 +114,7 @@ public void execute() throws MojoExecutionException, MojoFailureException { try { Files.writeString(configRootAdocPath, - generateConfigReference(quteEngine, summaryTableId, extension, configRoot)); + generateConfigReference(quteEngine, summaryTableId, extension, configRoot, true)); } catch (Exception e) { throw new MojoExecutionException("Unable to render config roots for top level prefix: " + topLevelPrefix + " in extension: " + extension, e); @@ -150,7 +150,7 @@ public void execute() throws MojoExecutionException, MojoFailureException { try { Files.writeString(configRootAdocPath, - generateConfigReference(quteEngine, summaryTableId, extension, configRoot)); + generateConfigReference(quteEngine, summaryTableId, extension, configRoot, true)); } catch (Exception e) { throw new MojoExecutionException("Unable to render config roots for specific file: " + fileName + " in extension: " + extension, e); @@ -170,7 +170,7 @@ public void execute() throws MojoExecutionException, MojoFailureException { try { Files.writeString(configSectionAdocPath, - generateConfigReference(quteEngine, summaryTableId, extension, generatedConfigSection)); + generateConfigReference(quteEngine, summaryTableId, extension, generatedConfigSection, false)); } catch (Exception e) { throw new MojoExecutionException( "Unable to render config section for section: " + generatedConfigSection.getPath() @@ -193,11 +193,11 @@ public void execute() throws MojoExecutionException, MojoFailureException { } private static String generateConfigReference(Engine quteEngine, String summaryTableId, Extension extension, - ConfigItemCollection configItemCollection) { + ConfigItemCollection configItemCollection, boolean searchable) { return quteEngine.getTemplate("configReference.qute.adoc") .data("extension", extension) .data("configItemCollection", configItemCollection) - .data("searchable", true) + .data("searchable", searchable) .data("summaryTableId", summaryTableId) .data("includeDurationNote", configItemCollection.hasDurationType()) .data("includeMemorySizeNote", configItemCollection.hasMemorySizeType()) From 083795ba7374709b5362709067216cfd946d18ec Mon Sep 17 00:00:00 2001 From: Guillaume Smet Date: Wed, 7 Aug 2024 20:30:36 +0200 Subject: [PATCH 43/43] Clarify a bit the property path and the mapped path We need to make sure people will not confuse them in the future. --- .../config/resolver/ConfigResolver.java | 29 +++++++++++-------- docs/src/main/asciidoc/http-reference.adoc | 4 +-- 2 files changed, 19 insertions(+), 14 deletions(-) diff --git a/core/processor/src/main/java/io/quarkus/annotation/processor/documentation/config/resolver/ConfigResolver.java b/core/processor/src/main/java/io/quarkus/annotation/processor/documentation/config/resolver/ConfigResolver.java index bddeaaacf1259..772c60ddad671 100644 --- a/core/processor/src/main/java/io/quarkus/annotation/processor/documentation/config/resolver/ConfigResolver.java +++ b/core/processor/src/main/java/io/quarkus/annotation/processor/documentation/config/resolver/ConfigResolver.java @@ -88,7 +88,8 @@ public ResolvedModel resolveModel() { private void resolveProperty(ConfigRoot configRoot, Map existingRootConfigSections, ConfigPhase phase, ResolutionContext context, DiscoveryConfigProperty discoveryConfigProperty) { - String fullPath = appendPath(context.getPath(), discoveryConfigProperty.getPath()); + String propertyPath = appendPath(context.getPath(), discoveryConfigProperty.getPath()); + List additionalPaths = context.getAdditionalPaths().stream() .map(p -> appendPath(p, discoveryConfigProperty.getPath())) .collect(Collectors.toCollection(ArrayList::new)); @@ -99,17 +100,19 @@ private void resolveProperty(ConfigRoot configRoot, Map e if (configCollector.isResolvedConfigGroup(typeQualifiedName)) { DiscoveryConfigGroup discoveryConfigGroup = configCollector.getResolvedConfigGroup(typeQualifiedName); + String potentiallyMappedPath = propertyPath; if (discoveryConfigProperty.getType().isMap()) { if (discoveryConfigProperty.isUnnamedMapKey()) { ListIterator additionalPathsIterator = additionalPaths.listIterator(); - additionalPathsIterator.add(fullPath + ConfigNamingUtil.getMapKey(discoveryConfigProperty.getMapKey())); + additionalPathsIterator + .add(propertyPath + ConfigNamingUtil.getMapKey(discoveryConfigProperty.getMapKey())); while (additionalPathsIterator.hasNext()) { additionalPathsIterator.add(additionalPathsIterator.next() + ConfigNamingUtil.getMapKey(discoveryConfigProperty.getMapKey())); } } else { - fullPath += ConfigNamingUtil.getMapKey(discoveryConfigProperty.getMapKey()); + potentiallyMappedPath += ConfigNamingUtil.getMapKey(discoveryConfigProperty.getMapKey()); additionalPaths = additionalPaths.stream() .map(p -> p + ConfigNamingUtil.getMapKey(discoveryConfigProperty.getMapKey())) .collect(Collectors.toCollection(ArrayList::new)); @@ -122,22 +125,22 @@ private void resolveProperty(ConfigRoot configRoot, Map e boolean isWithMapWithUnnamedKey = context.isWithinMapWithUnnamedKey() || discoveryConfigProperty.isUnnamedMapKey(); if (discoveryConfigProperty.isSection()) { - ConfigSection configSection = existingRootConfigSections.get(fullPath); + ConfigSection configSection = existingRootConfigSections.get(propertyPath); if (configSection != null) { configSection.appendState(discoveryConfigProperty.isSectionGenerated(), deprecated); } else { configSection = new ConfigSection(discoveryConfigProperty.getSourceClass(), - discoveryConfigProperty.getSourceName(), fullPath, typeQualifiedName, + discoveryConfigProperty.getSourceName(), propertyPath, typeQualifiedName, discoveryConfigProperty.isSectionGenerated(), deprecated); context.getItemCollection().addItem(configSection); - existingRootConfigSections.put(configSection.getPath(), configSection); + existingRootConfigSections.put(propertyPath, configSection); } - configGroupContext = new ResolutionContext(fullPath, additionalPaths, discoveryConfigGroup, configSection, - isWithinMap, isWithMapWithUnnamedKey, deprecated); + configGroupContext = new ResolutionContext(potentiallyMappedPath, additionalPaths, discoveryConfigGroup, + configSection, isWithinMap, isWithMapWithUnnamedKey, deprecated); } else { - configGroupContext = new ResolutionContext(fullPath, additionalPaths, discoveryConfigGroup, + configGroupContext = new ResolutionContext(potentiallyMappedPath, additionalPaths, discoveryConfigGroup, context.getItemCollection(), isWithinMap, isWithMapWithUnnamedKey, deprecated); } @@ -167,12 +170,14 @@ private void resolveProperty(ConfigRoot configRoot, Map e enumAcceptedValues = new EnumAcceptedValues(enumDefinition.qualifiedName(), localAcceptedValues); } + String potentiallyMappedPath = propertyPath; + if (discoveryConfigProperty.getType().isMap()) { // it is a leaf pass through map typeQualifiedName = discoveryConfigProperty.getType().wrapperType().toString(); typeSimplifiedName = utils.element().simplifyGenericType(discoveryConfigProperty.getType().wrapperType()); - fullPath += ConfigNamingUtil.getMapKey(discoveryConfigProperty.getMapKey()); + potentiallyMappedPath += ConfigNamingUtil.getMapKey(discoveryConfigProperty.getMapKey()); additionalPaths = additionalPaths.stream() .map(p -> p + ConfigNamingUtil.getMapKey(discoveryConfigProperty.getMapKey())) .collect(Collectors.toCollection(ArrayList::new)); @@ -183,8 +188,8 @@ private void resolveProperty(ConfigRoot configRoot, Map e // this is a standard property ConfigProperty configProperty = new ConfigProperty(phase, discoveryConfigProperty.getSourceClass(), - discoveryConfigProperty.getSourceName(), fullPath, additionalPaths, - ConfigNamingUtil.toEnvVarName(fullPath), typeQualifiedName, typeSimplifiedName, + discoveryConfigProperty.getSourceName(), potentiallyMappedPath, additionalPaths, + ConfigNamingUtil.toEnvVarName(potentiallyMappedPath), typeQualifiedName, typeSimplifiedName, discoveryConfigProperty.getType().isMap(), discoveryConfigProperty.getType().isList(), discoveryConfigProperty.getType().isOptional(), discoveryConfigProperty.getMapKey(), discoveryConfigProperty.isUnnamedMapKey(), context.isWithinMap(), diff --git a/docs/src/main/asciidoc/http-reference.adoc b/docs/src/main/asciidoc/http-reference.adoc index 6c81a4767b268..9b71afb03b630 100644 --- a/docs/src/main/asciidoc/http-reference.adoc +++ b/docs/src/main/asciidoc/http-reference.adoc @@ -270,7 +270,7 @@ quarkus.http.header.Pragma.methods=GET,HEAD This will apply the `Pragma` header only when the `/headers/pragma` resource is called with a `GET` or a `HEAD` method -include::{generated-dir}/config/quarkus-vertx-http_quarkus.http.header.-header-.adoc[leveloffset=+1, opts=optional] +include::{generated-dir}/config/quarkus-vertx-http_quarkus.http.header.adoc[leveloffset=+1, opts=optional] === Additional HTTP Headers per path @@ -310,7 +310,7 @@ quarkus.http.filter.any-order.matches=/paths/order.* Will include the `Cache-Control: max-age=1` header when `/paths/order` is requested. -include::{generated-dir}/config/quarkus-vertx-http_quarkus.http.filter.-filter-.adoc[leveloffset=+1, opts=optional] +include::{generated-dir}/config/quarkus-vertx-http_quarkus.http.filter.adoc[leveloffset=+1, opts=optional] == Support 100-Continue in vert.x