From 88fbb63df595da6837385145e1dc894bc047e7c5 Mon Sep 17 00:00:00 2001 From: Michael Sonnleitner Date: Wed, 22 Oct 2025 20:38:04 +0200 Subject: [PATCH 1/9] Support GAV coordinates for client generation #1340 --- .../generator/deployment/CodegenConfig.java | 2 + ...GAVCoordinateOpenApiSpecInputProvider.java | 58 ++++++++++ .../codegen/OpenApiSpecInputProvider.java | 5 +- ...eployment.codegen.OpenApiSpecInputProvider | 1 + client/integration-tests/gav-source/pom.xml | 53 +++++++++ .../gav-source/src/main/openapi/echo1.yaml | 34 ++++++ .../gav-source/src/main/openapi/echo2.yaml | 34 ++++++ client/integration-tests/gav/pom.xml | 105 ++++++++++++++++++ .../src/main/resources/application.properties | 3 + .../generator/it/QuarkusGAVOpenApiTest.java | 21 ++++ client/integration-tests/pom.xml | 2 + 11 files changed, 317 insertions(+), 1 deletion(-) create mode 100644 client/deployment/src/main/java/io/quarkiverse/openapi/generator/deployment/codegen/GAVCoordinateOpenApiSpecInputProvider.java create mode 100644 client/deployment/src/main/resources/META-INF/services/io.quarkiverse.openapi.generator.deployment.codegen.OpenApiSpecInputProvider create mode 100644 client/integration-tests/gav-source/pom.xml create mode 100644 client/integration-tests/gav-source/src/main/openapi/echo1.yaml create mode 100644 client/integration-tests/gav-source/src/main/openapi/echo2.yaml create mode 100644 client/integration-tests/gav/pom.xml create mode 100644 client/integration-tests/gav/src/main/resources/application.properties create mode 100644 client/integration-tests/gav/src/test/java/io/quarkiverse/openapi/generator/it/QuarkusGAVOpenApiTest.java diff --git a/client/deployment/src/main/java/io/quarkiverse/openapi/generator/deployment/CodegenConfig.java b/client/deployment/src/main/java/io/quarkiverse/openapi/generator/deployment/CodegenConfig.java index 6927b2275..33e1797ff 100644 --- a/client/deployment/src/main/java/io/quarkiverse/openapi/generator/deployment/CodegenConfig.java +++ b/client/deployment/src/main/java/io/quarkiverse/openapi/generator/deployment/CodegenConfig.java @@ -36,9 +36,11 @@ enum ConfigName { //global configs VERBOSE("verbose"), INPUT_BASE_DIR("input-base-dir"), + GAV_SCANNING("gav-scanning"), TEMPLATE_BASE_DIR("template-base-dir"), INCLUDE("include"), EXCLUDE("exclude"), + EXCLUDE_GAV("exclude-gav"), VALIDATE_SPEC("validateSpec"), DEFAULT_SECURITY_SCHEME("default-security-scheme"), diff --git a/client/deployment/src/main/java/io/quarkiverse/openapi/generator/deployment/codegen/GAVCoordinateOpenApiSpecInputProvider.java b/client/deployment/src/main/java/io/quarkiverse/openapi/generator/deployment/codegen/GAVCoordinateOpenApiSpecInputProvider.java new file mode 100644 index 000000000..3ceee9b87 --- /dev/null +++ b/client/deployment/src/main/java/io/quarkiverse/openapi/generator/deployment/codegen/GAVCoordinateOpenApiSpecInputProvider.java @@ -0,0 +1,58 @@ +package io.quarkiverse.openapi.generator.deployment.codegen; + +import static io.quarkiverse.openapi.generator.deployment.CodegenConfig.*; +import static io.quarkiverse.openapi.generator.deployment.CodegenConfig.ConfigName.*; + +import java.io.IOException; +import java.nio.file.Files; +import java.util.ArrayList; +import java.util.List; +import java.util.Set; + +import org.jboss.logging.Logger; + +import io.quarkus.bootstrap.prebuild.CodeGenException; +import io.quarkus.deployment.CodeGenContext; +import io.quarkus.maven.dependency.ResolvedDependency; + +public class GAVCoordinateOpenApiSpecInputProvider implements OpenApiSpecInputProvider { + private static final Logger LOG = Logger.getLogger(GAVCoordinateOpenApiSpecInputProvider.class); + + private static final Set SUPPORTED_EXTENSIONS = Set.of("yaml", "yml", "json"); + + @Override + public List read(CodeGenContext context) throws CodeGenException { + if (!context.config().getOptionalValue(getGlobalConfigName(GAV_SCANNING), Boolean.class) + .orElse(true)) { + LOG.debug("GAV scanning is disabled."); + return List.of(); + } + + // Q: maybe a configuration property to enable GAV scanning (default: true) + List gavsToExclude = context.config().getOptionalValues(getGlobalConfigName(EXCLUDE_GAV), String.class) + .orElse(List.of()); + + List yamlDependencies = context.applicationModel().getDependencies().stream() + .filter(rd -> SUPPORTED_EXTENSIONS.contains(rd.getType())) + .filter(rd -> !gavsToExclude.contains(rd.getKey().toGacString())) + .toList(); + + if (yamlDependencies.isEmpty()) { + LOG.debug("No suitable GAV dependencies found."); + return List.of(); + } + var inputModels = new ArrayList(); + for (ResolvedDependency yamlDependency : yamlDependencies) { + var gacString = yamlDependency.getKey().toGacString(); + var path = yamlDependency.getResolvedPaths().stream().findFirst() + .orElseThrow(() -> new CodeGenException("Could not find maven path of %s.".formatted(gacString))); + try { + inputModels.add(new SpecInputModel(gacString, Files.newInputStream(path))); + } catch (IOException e) { + throw new CodeGenException("Could not open input stream of %s from %s.".formatted(gacString, path.toString()), + e); + } + } + return inputModels; + } +} diff --git a/client/deployment/src/main/java/io/quarkiverse/openapi/generator/deployment/codegen/OpenApiSpecInputProvider.java b/client/deployment/src/main/java/io/quarkiverse/openapi/generator/deployment/codegen/OpenApiSpecInputProvider.java index 83e9a778f..2d10a7de4 100644 --- a/client/deployment/src/main/java/io/quarkiverse/openapi/generator/deployment/codegen/OpenApiSpecInputProvider.java +++ b/client/deployment/src/main/java/io/quarkiverse/openapi/generator/deployment/codegen/OpenApiSpecInputProvider.java @@ -3,6 +3,7 @@ import java.io.InputStream; import java.util.List; +import io.quarkus.bootstrap.prebuild.CodeGenException; import io.quarkus.deployment.CodeGenContext; /** @@ -13,8 +14,10 @@ public interface OpenApiSpecInputProvider { /** * Fetch OpenAPI specification files from a given source. * + * @param context the current codegen context. + * @throws CodeGenException if an error occurs while reading the spec files. * @return a list of spec files in {@link InputStream} format. */ - List read(CodeGenContext context); + List read(CodeGenContext context) throws CodeGenException; } diff --git a/client/deployment/src/main/resources/META-INF/services/io.quarkiverse.openapi.generator.deployment.codegen.OpenApiSpecInputProvider b/client/deployment/src/main/resources/META-INF/services/io.quarkiverse.openapi.generator.deployment.codegen.OpenApiSpecInputProvider new file mode 100644 index 000000000..2438db0f2 --- /dev/null +++ b/client/deployment/src/main/resources/META-INF/services/io.quarkiverse.openapi.generator.deployment.codegen.OpenApiSpecInputProvider @@ -0,0 +1 @@ +io.quarkiverse.openapi.generator.deployment.codegen.GAVCoordinateOpenApiSpecInputProvider \ No newline at end of file diff --git a/client/integration-tests/gav-source/pom.xml b/client/integration-tests/gav-source/pom.xml new file mode 100644 index 000000000..b70e02742 --- /dev/null +++ b/client/integration-tests/gav-source/pom.xml @@ -0,0 +1,53 @@ + + + + quarkus-openapi-generator-integration-tests + io.quarkiverse.openapi.generator + 3.0.0-SNAPSHOT + + 4.0.0 + + quarkus-openapi-generator-gav-source + Quarkus - OpenAPI Generator - Integration Tests - Client - GAV source + Example project for OpenAPI with GAV source + + + + + org.apache.maven.plugins + maven-install-plugin + + + install-echo1 + + install-file + + install + + quarkus-openapi-generator-gav-source-echo1 + io.quarkiverse.openapi.generator + 3.0.0-SNAPSHOT + src/main/openapi/echo1.yaml + yaml + + + + install-echo2 + + install-file + + install + + quarkus-openapi-generator-gav-source-echo2 + io.quarkiverse.openapi.generator + 3.0.0-SNAPSHOT + src/main/openapi/echo2.yaml + yaml + + + + + + + + \ No newline at end of file diff --git a/client/integration-tests/gav-source/src/main/openapi/echo1.yaml b/client/integration-tests/gav-source/src/main/openapi/echo1.yaml new file mode 100644 index 000000000..f93ea2182 --- /dev/null +++ b/client/integration-tests/gav-source/src/main/openapi/echo1.yaml @@ -0,0 +1,34 @@ +openapi: 3.0.3 +info: + title: echo + version: '1.0.0' + description: "" +paths: + /echo: + post: + summary: Echo + operationId: echo + requestBody: + content: + application/json: + schema: + $ref: "#/components/schemas/Message" + responses: + "200": + description: OK + content: + application/json: + schema: + $ref: '#/components/schemas/Echo' +components: + schemas: + Echo: + type: object + properties: + echo: + type: string + Message: + type: object + properties: + message: + type: string \ No newline at end of file diff --git a/client/integration-tests/gav-source/src/main/openapi/echo2.yaml b/client/integration-tests/gav-source/src/main/openapi/echo2.yaml new file mode 100644 index 000000000..f93ea2182 --- /dev/null +++ b/client/integration-tests/gav-source/src/main/openapi/echo2.yaml @@ -0,0 +1,34 @@ +openapi: 3.0.3 +info: + title: echo + version: '1.0.0' + description: "" +paths: + /echo: + post: + summary: Echo + operationId: echo + requestBody: + content: + application/json: + schema: + $ref: "#/components/schemas/Message" + responses: + "200": + description: OK + content: + application/json: + schema: + $ref: '#/components/schemas/Echo' +components: + schemas: + Echo: + type: object + properties: + echo: + type: string + Message: + type: object + properties: + message: + type: string \ No newline at end of file diff --git a/client/integration-tests/gav/pom.xml b/client/integration-tests/gav/pom.xml new file mode 100644 index 000000000..1152588c4 --- /dev/null +++ b/client/integration-tests/gav/pom.xml @@ -0,0 +1,105 @@ + + + + quarkus-openapi-generator-integration-tests + io.quarkiverse.openapi.generator + 3.0.0-SNAPSHOT + + 4.0.0 + + quarkus-openapi-generator-it-gav + Quarkus - OpenAPI Generator - Integration Tests - Client - GAV + Example project for OpenAPI via GAV coordinates + + + + io.quarkiverse.openapi.generator + quarkus-openapi-generator + + + + + io.quarkiverse.openapi.generator + quarkus-openapi-generator-gav-source-echo1 + 3.0.0-SNAPSHOT + yaml + + + + io.quarkiverse.openapi.generator + quarkus-openapi-generator-gav-source-echo2 + 3.0.0-SNAPSHOT + yaml + + + org.assertj + assertj-core + test + + + io.quarkus + quarkus-junit5 + test + + + + + + io.quarkus + quarkus-maven-plugin + true + + + + build + generate-code + generate-code-tests + + + + + + + + + native-image + + + native + + + + + + maven-surefire-plugin + + ${native.surefire.skip} + + + + maven-failsafe-plugin + + + + integration-test + verify + + + + ${project.build.directory}/${project.build.finalName}-runner + org.jboss.logmanager.LogManager + ${maven.home} + + + + + + + + + native + + + + + \ No newline at end of file diff --git a/client/integration-tests/gav/src/main/resources/application.properties b/client/integration-tests/gav/src/main/resources/application.properties new file mode 100644 index 000000000..ce244737c --- /dev/null +++ b/client/integration-tests/gav/src/main/resources/application.properties @@ -0,0 +1,3 @@ +quarkus.keycloak.devservices.enabled=false + +quarkus.openapi-generator.codegen.exclude-gav=io.quarkiverse.openapi.generator:quarkus-openapi-generator-gav-source-echo2 \ No newline at end of file diff --git a/client/integration-tests/gav/src/test/java/io/quarkiverse/openapi/generator/it/QuarkusGAVOpenApiTest.java b/client/integration-tests/gav/src/test/java/io/quarkiverse/openapi/generator/it/QuarkusGAVOpenApiTest.java new file mode 100644 index 000000000..3ab4e0996 --- /dev/null +++ b/client/integration-tests/gav/src/test/java/io/quarkiverse/openapi/generator/it/QuarkusGAVOpenApiTest.java @@ -0,0 +1,21 @@ +package io.quarkiverse.openapi.generator.it; + +import org.junit.jupiter.api.Test; + +import static org.assertj.core.api.Assertions.*; + +class QuarkusGAVOpenApiTest { + @Test + void apiIsBeingGenerated() { + assertThatCode( + () -> Class.forName("org.openapi.quarkus.io_quarkiverse_openapi_generator_quarkus_openapi_generator_gav_source_echo1.api.DefaultApi")) + .doesNotThrowAnyException(); + } + + @Test + void apiIsBeingNotGenerated() { + assertThatCode( + () -> Class.forName("org.openapi.quarkus.io_quarkiverse_openapi_generator_quarkus_openapi_generator_gav_source_echo2.api.DefaultApi")) + .isInstanceOf(ClassNotFoundException.class); + } +} diff --git a/client/integration-tests/pom.xml b/client/integration-tests/pom.xml index 2a5f0cd0e..b1bafba4d 100644 --- a/client/integration-tests/pom.xml +++ b/client/integration-tests/pom.xml @@ -22,6 +22,8 @@ cookie-authentication custom-templates enum-property + gav-source + gav enum-unexpected exclude generate-flags From e5488955d638ecb2e9914ea5f18f5a1abd9b8a83 Mon Sep 17 00:00:00 2001 From: Michael Sonnleitner Date: Thu, 23 Oct 2025 19:35:09 +0200 Subject: [PATCH 2/9] Support GAV coordinates for client generation #1340 --- .../generator/it/QuarkusGAVOpenApiTest.java | 14 ++++++++------ 1 file changed, 8 insertions(+), 6 deletions(-) diff --git a/client/integration-tests/gav/src/test/java/io/quarkiverse/openapi/generator/it/QuarkusGAVOpenApiTest.java b/client/integration-tests/gav/src/test/java/io/quarkiverse/openapi/generator/it/QuarkusGAVOpenApiTest.java index 3ab4e0996..7cf3a8822 100644 --- a/client/integration-tests/gav/src/test/java/io/quarkiverse/openapi/generator/it/QuarkusGAVOpenApiTest.java +++ b/client/integration-tests/gav/src/test/java/io/quarkiverse/openapi/generator/it/QuarkusGAVOpenApiTest.java @@ -1,21 +1,23 @@ package io.quarkiverse.openapi.generator.it; -import org.junit.jupiter.api.Test; - import static org.assertj.core.api.Assertions.*; +import org.junit.jupiter.api.Test; + class QuarkusGAVOpenApiTest { @Test void apiIsBeingGenerated() { assertThatCode( - () -> Class.forName("org.openapi.quarkus.io_quarkiverse_openapi_generator_quarkus_openapi_generator_gav_source_echo1.api.DefaultApi")) - .doesNotThrowAnyException(); + () -> Class.forName( + "org.openapi.quarkus.io_quarkiverse_openapi_generator_quarkus_openapi_generator_gav_source_echo1.api.DefaultApi")) + .doesNotThrowAnyException(); } @Test void apiIsBeingNotGenerated() { assertThatCode( - () -> Class.forName("org.openapi.quarkus.io_quarkiverse_openapi_generator_quarkus_openapi_generator_gav_source_echo2.api.DefaultApi")) - .isInstanceOf(ClassNotFoundException.class); + () -> Class.forName( + "org.openapi.quarkus.io_quarkiverse_openapi_generator_quarkus_openapi_generator_gav_source_echo2.api.DefaultApi")) + .isInstanceOf(ClassNotFoundException.class); } } From a517c47657e7be06c1a81a61a8d077b622986786 Mon Sep 17 00:00:00 2001 From: Michael Sonnleitner Date: Fri, 24 Oct 2025 10:40:02 +0200 Subject: [PATCH 3/9] avoid star imports --- .../codegen/GAVCoordinateOpenApiSpecInputProvider.java | 5 +++-- 1 file changed, 3 insertions(+), 2 deletions(-) diff --git a/client/deployment/src/main/java/io/quarkiverse/openapi/generator/deployment/codegen/GAVCoordinateOpenApiSpecInputProvider.java b/client/deployment/src/main/java/io/quarkiverse/openapi/generator/deployment/codegen/GAVCoordinateOpenApiSpecInputProvider.java index 3ceee9b87..fb9db94a5 100644 --- a/client/deployment/src/main/java/io/quarkiverse/openapi/generator/deployment/codegen/GAVCoordinateOpenApiSpecInputProvider.java +++ b/client/deployment/src/main/java/io/quarkiverse/openapi/generator/deployment/codegen/GAVCoordinateOpenApiSpecInputProvider.java @@ -1,7 +1,8 @@ package io.quarkiverse.openapi.generator.deployment.codegen; -import static io.quarkiverse.openapi.generator.deployment.CodegenConfig.*; -import static io.quarkiverse.openapi.generator.deployment.CodegenConfig.ConfigName.*; +import static io.quarkiverse.openapi.generator.deployment.CodegenConfig.getGlobalConfigName; +import static io.quarkiverse.openapi.generator.deployment.CodegenConfig.ConfigName.EXCLUDE_GAV; +import static io.quarkiverse.openapi.generator.deployment.CodegenConfig.ConfigName.GAV_SCANNING; import java.io.IOException; import java.nio.file.Files; From 10eb296f8d7e4ba8be9d9273e10d66c6fbfe333e Mon Sep 17 00:00:00 2001 From: Michael Sonnleitner Date: Fri, 24 Oct 2025 10:53:56 +0200 Subject: [PATCH 4/9] SUPPORTED_EXTENSIONS refactored for better use --- .../codegen/GAVCoordinateOpenApiSpecInputProvider.java | 5 +---- .../deployment/codegen/OpenApiGeneratorCodeGen.java | 2 +- .../codegen/OpenApiGeneratorCodeGenBase.java | 10 +++++++--- 3 files changed, 9 insertions(+), 8 deletions(-) diff --git a/client/deployment/src/main/java/io/quarkiverse/openapi/generator/deployment/codegen/GAVCoordinateOpenApiSpecInputProvider.java b/client/deployment/src/main/java/io/quarkiverse/openapi/generator/deployment/codegen/GAVCoordinateOpenApiSpecInputProvider.java index fb9db94a5..588579b96 100644 --- a/client/deployment/src/main/java/io/quarkiverse/openapi/generator/deployment/codegen/GAVCoordinateOpenApiSpecInputProvider.java +++ b/client/deployment/src/main/java/io/quarkiverse/openapi/generator/deployment/codegen/GAVCoordinateOpenApiSpecInputProvider.java @@ -8,7 +8,6 @@ import java.nio.file.Files; import java.util.ArrayList; import java.util.List; -import java.util.Set; import org.jboss.logging.Logger; @@ -19,8 +18,6 @@ public class GAVCoordinateOpenApiSpecInputProvider implements OpenApiSpecInputProvider { private static final Logger LOG = Logger.getLogger(GAVCoordinateOpenApiSpecInputProvider.class); - private static final Set SUPPORTED_EXTENSIONS = Set.of("yaml", "yml", "json"); - @Override public List read(CodeGenContext context) throws CodeGenException { if (!context.config().getOptionalValue(getGlobalConfigName(GAV_SCANNING), Boolean.class) @@ -34,7 +31,7 @@ public List read(CodeGenContext context) throws CodeGenException .orElse(List.of()); List yamlDependencies = context.applicationModel().getDependencies().stream() - .filter(rd -> SUPPORTED_EXTENSIONS.contains(rd.getType())) + .filter(rd -> OpenApiGeneratorCodeGenBase.SUPPORTED_EXTENSIONS.contains(rd.getType())) .filter(rd -> !gavsToExclude.contains(rd.getKey().toGacString())) .toList(); diff --git a/client/deployment/src/main/java/io/quarkiverse/openapi/generator/deployment/codegen/OpenApiGeneratorCodeGen.java b/client/deployment/src/main/java/io/quarkiverse/openapi/generator/deployment/codegen/OpenApiGeneratorCodeGen.java index 499304bc9..fb1c2b317 100644 --- a/client/deployment/src/main/java/io/quarkiverse/openapi/generator/deployment/codegen/OpenApiGeneratorCodeGen.java +++ b/client/deployment/src/main/java/io/quarkiverse/openapi/generator/deployment/codegen/OpenApiGeneratorCodeGen.java @@ -8,6 +8,6 @@ public String providerId() { @Override public String[] inputExtensions() { - return new String[] { JSON, YAML, YML }; + return SUPPORTED_EXTENSIONS_WITH_LEADING_DOT.toArray(new String[0]); } } diff --git a/client/deployment/src/main/java/io/quarkiverse/openapi/generator/deployment/codegen/OpenApiGeneratorCodeGenBase.java b/client/deployment/src/main/java/io/quarkiverse/openapi/generator/deployment/codegen/OpenApiGeneratorCodeGenBase.java index 809e0101e..c1bd7376e 100644 --- a/client/deployment/src/main/java/io/quarkiverse/openapi/generator/deployment/codegen/OpenApiGeneratorCodeGenBase.java +++ b/client/deployment/src/main/java/io/quarkiverse/openapi/generator/deployment/codegen/OpenApiGeneratorCodeGenBase.java @@ -26,6 +26,7 @@ import java.util.List; import java.util.Map; import java.util.Optional; +import java.util.Set; import java.util.function.Predicate; import java.util.stream.Collectors; import java.util.stream.Stream; @@ -56,9 +57,12 @@ */ public abstract class OpenApiGeneratorCodeGenBase implements CodeGenProvider { - static final String YAML = ".yaml"; - static final String YML = ".yml"; - static final String JSON = ".json"; + static final String YAML = "yaml"; + static final String YML = "yml"; + static final String JSON = "json"; + + static final Set SUPPORTED_EXTENSIONS = Set.of(YAML, YML, JSON); + static final Set SUPPORTED_EXTENSIONS_WITH_LEADING_DOT = Set.of("." + YAML, "." + YML, "." + JSON); private static final String DEFAULT_PACKAGE = "org.openapi.quarkus"; private static final String CONFIG_KEY_PROPERTY = "config-key"; From d8e7d8f686aaa6f74a0dc64da3132a70bfaecda6 Mon Sep 17 00:00:00 2001 From: Michael Sonnleitner Date: Fri, 24 Oct 2025 13:33:53 +0200 Subject: [PATCH 5/9] add filter for artifactIds & improved config naming(singular/plural) & tests simplicity & add config options to GlobalCodegenConfig --- .../generator/deployment/CodegenConfig.java | 6 +- .../deployment/GlobalCodegenConfig.java | 21 +++++++ ...GAVCoordinateOpenApiSpecInputProvider.java | 17 +++-- client/integration-tests/gav-source/pom.xml | 18 +++++- .../main/openapi/{echo1.yaml => echo.yaml} | 0 .../gav-source/src/main/openapi/echo2.yaml | 34 ---------- .../src/main/resources/application.properties | 3 +- .../generator/it/QuarkusGAVOpenApiTest.java | 12 +++- .../includes/quarkus-openapi-generator.adoc | 63 +++++++++++++++++++ ...i-generator_quarkus.openapi-generator.adoc | 63 +++++++++++++++++++ 10 files changed, 190 insertions(+), 47 deletions(-) rename client/integration-tests/gav-source/src/main/openapi/{echo1.yaml => echo.yaml} (100%) delete mode 100644 client/integration-tests/gav-source/src/main/openapi/echo2.yaml diff --git a/client/deployment/src/main/java/io/quarkiverse/openapi/generator/deployment/CodegenConfig.java b/client/deployment/src/main/java/io/quarkiverse/openapi/generator/deployment/CodegenConfig.java index 33e1797ff..1f88e602d 100644 --- a/client/deployment/src/main/java/io/quarkiverse/openapi/generator/deployment/CodegenConfig.java +++ b/client/deployment/src/main/java/io/quarkiverse/openapi/generator/deployment/CodegenConfig.java @@ -4,7 +4,6 @@ import java.util.Arrays; import java.util.List; import java.util.Map; -import java.util.stream.Collectors; import io.quarkiverse.openapi.generator.deployment.codegen.OpenApiGeneratorOutputPaths; import io.quarkus.runtime.annotations.ConfigPhase; @@ -30,7 +29,7 @@ public interface CodegenConfig extends GlobalCodegenConfig { String BUILD_TIME_SPEC_PREFIX_FORMAT = "quarkus." + CODEGEN_TIME_CONFIG_PREFIX + ".spec.%s"; List SUPPORTED_CONFIGURATIONS = Arrays.stream(ConfigName.values()).map(cn -> cn.name) - .collect(Collectors.toList()); + .toList(); enum ConfigName { //global configs @@ -40,7 +39,8 @@ enum ConfigName { TEMPLATE_BASE_DIR("template-base-dir"), INCLUDE("include"), EXCLUDE("exclude"), - EXCLUDE_GAV("exclude-gav"), + ARTIFACT_ID_FILTER("artifact-id-filter"), + EXCLUDE_GAVS("exclude-gavs"), VALIDATE_SPEC("validateSpec"), DEFAULT_SECURITY_SCHEME("default-security-scheme"), diff --git a/client/deployment/src/main/java/io/quarkiverse/openapi/generator/deployment/GlobalCodegenConfig.java b/client/deployment/src/main/java/io/quarkiverse/openapi/generator/deployment/GlobalCodegenConfig.java index 0c9f5888c..4dc562c6d 100644 --- a/client/deployment/src/main/java/io/quarkiverse/openapi/generator/deployment/GlobalCodegenConfig.java +++ b/client/deployment/src/main/java/io/quarkiverse/openapi/generator/deployment/GlobalCodegenConfig.java @@ -1,5 +1,6 @@ package io.quarkiverse.openapi.generator.deployment; +import java.util.List; import java.util.Optional; import io.smallrye.config.WithDefault; @@ -27,6 +28,13 @@ public interface GlobalCodegenConfig extends CommonItemConfig { @WithName("input-base-dir") Optional inputBaseDir(); + /** + * Whether or not to skip gav scanning. + */ + @WithName("gav-scanning") + @WithDefault("true") + boolean gavScanning(); + /** * Option to change the directory where template files must be found. */ @@ -53,6 +61,19 @@ public interface GlobalCodegenConfig extends CommonItemConfig { @WithName("exclude") Optional exclude(); + /** + * Option to filter artifactId from generation + */ + @WithName("artifact-id-filter") + @WithDefault(".*openapi.*") + Optional artifactIdFilter(); + + /** + * Option to exclude GAVs from generation + */ + @WithName("exclude-gavs") + Optional> excludeGavs(); + /** * Create security for the referenced security scheme */ diff --git a/client/deployment/src/main/java/io/quarkiverse/openapi/generator/deployment/codegen/GAVCoordinateOpenApiSpecInputProvider.java b/client/deployment/src/main/java/io/quarkiverse/openapi/generator/deployment/codegen/GAVCoordinateOpenApiSpecInputProvider.java index 588579b96..c2cc57ae6 100644 --- a/client/deployment/src/main/java/io/quarkiverse/openapi/generator/deployment/codegen/GAVCoordinateOpenApiSpecInputProvider.java +++ b/client/deployment/src/main/java/io/quarkiverse/openapi/generator/deployment/codegen/GAVCoordinateOpenApiSpecInputProvider.java @@ -1,13 +1,16 @@ package io.quarkiverse.openapi.generator.deployment.codegen; import static io.quarkiverse.openapi.generator.deployment.CodegenConfig.getGlobalConfigName; -import static io.quarkiverse.openapi.generator.deployment.CodegenConfig.ConfigName.EXCLUDE_GAV; +import static io.quarkiverse.openapi.generator.deployment.CodegenConfig.ConfigName.ARTIFACT_ID_FILTER; +import static io.quarkiverse.openapi.generator.deployment.CodegenConfig.ConfigName.EXCLUDE_GAVS; import static io.quarkiverse.openapi.generator.deployment.CodegenConfig.ConfigName.GAV_SCANNING; +import static io.quarkiverse.openapi.generator.deployment.codegen.OpenApiGeneratorCodeGenBase.SUPPORTED_EXTENSIONS; import java.io.IOException; import java.nio.file.Files; import java.util.ArrayList; import java.util.List; +import java.util.function.Predicate; import org.jboss.logging.Logger; @@ -26,17 +29,21 @@ public List read(CodeGenContext context) throws CodeGenException return List.of(); } - // Q: maybe a configuration property to enable GAV scanning (default: true) - List gavsToExclude = context.config().getOptionalValues(getGlobalConfigName(EXCLUDE_GAV), String.class) + List gavsToExclude = context.config().getOptionalValues(getGlobalConfigName(EXCLUDE_GAVS), String.class) .orElse(List.of()); + String artifactIdFilter = context.config().getOptionalValue(getGlobalConfigName(ARTIFACT_ID_FILTER), String.class) + .filter(Predicate.not(String::isBlank)) + .orElse(".*openapi.*"); List yamlDependencies = context.applicationModel().getDependencies().stream() - .filter(rd -> OpenApiGeneratorCodeGenBase.SUPPORTED_EXTENSIONS.contains(rd.getType())) + .filter(rd -> SUPPORTED_EXTENSIONS.contains(rd.getType())) + .filter(rd -> rd.getArtifactId().matches(artifactIdFilter)) .filter(rd -> !gavsToExclude.contains(rd.getKey().toGacString())) .toList(); if (yamlDependencies.isEmpty()) { - LOG.debug("No suitable GAV dependencies found."); + LOG.debug("No suitable GAV dependencies found. ArtifactIdFilter was %s and gavsToExclude were %s." + .formatted(artifactIdFilter, gavsToExclude)); return List.of(); } var inputModels = new ArrayList(); diff --git a/client/integration-tests/gav-source/pom.xml b/client/integration-tests/gav-source/pom.xml index b70e02742..7d3fda5f0 100644 --- a/client/integration-tests/gav-source/pom.xml +++ b/client/integration-tests/gav-source/pom.xml @@ -27,7 +27,7 @@ quarkus-openapi-generator-gav-source-echo1 io.quarkiverse.openapi.generator 3.0.0-SNAPSHOT - src/main/openapi/echo1.yaml + src/main/openapi/echo.yaml yaml @@ -41,7 +41,21 @@ quarkus-openapi-generator-gav-source-echo2 io.quarkiverse.openapi.generator 3.0.0-SNAPSHOT - src/main/openapi/echo2.yaml + src/main/openapi/echo.yaml + yaml + + + + install-other + + install-file + + install + + quarkus-openapi-generator-gav-source-other + io.quarkiverse.openapi.generator + 3.0.0-SNAPSHOT + src/main/openapi/echo.yaml yaml diff --git a/client/integration-tests/gav-source/src/main/openapi/echo1.yaml b/client/integration-tests/gav-source/src/main/openapi/echo.yaml similarity index 100% rename from client/integration-tests/gav-source/src/main/openapi/echo1.yaml rename to client/integration-tests/gav-source/src/main/openapi/echo.yaml diff --git a/client/integration-tests/gav-source/src/main/openapi/echo2.yaml b/client/integration-tests/gav-source/src/main/openapi/echo2.yaml deleted file mode 100644 index f93ea2182..000000000 --- a/client/integration-tests/gav-source/src/main/openapi/echo2.yaml +++ /dev/null @@ -1,34 +0,0 @@ -openapi: 3.0.3 -info: - title: echo - version: '1.0.0' - description: "" -paths: - /echo: - post: - summary: Echo - operationId: echo - requestBody: - content: - application/json: - schema: - $ref: "#/components/schemas/Message" - responses: - "200": - description: OK - content: - application/json: - schema: - $ref: '#/components/schemas/Echo' -components: - schemas: - Echo: - type: object - properties: - echo: - type: string - Message: - type: object - properties: - message: - type: string \ No newline at end of file diff --git a/client/integration-tests/gav/src/main/resources/application.properties b/client/integration-tests/gav/src/main/resources/application.properties index ce244737c..fe3b5db7b 100644 --- a/client/integration-tests/gav/src/main/resources/application.properties +++ b/client/integration-tests/gav/src/main/resources/application.properties @@ -1,3 +1,4 @@ quarkus.keycloak.devservices.enabled=false -quarkus.openapi-generator.codegen.exclude-gav=io.quarkiverse.openapi.generator:quarkus-openapi-generator-gav-source-echo2 \ No newline at end of file +quarkus.openapi-generator.codegen.artifact-id-filter=.*echo.* +quarkus.openapi-generator.codegen.exclude-gavs=io.quarkiverse.openapi.generator:quarkus-openapi-generator-gav-source-echo2 \ No newline at end of file diff --git a/client/integration-tests/gav/src/test/java/io/quarkiverse/openapi/generator/it/QuarkusGAVOpenApiTest.java b/client/integration-tests/gav/src/test/java/io/quarkiverse/openapi/generator/it/QuarkusGAVOpenApiTest.java index 7cf3a8822..27ceda487 100644 --- a/client/integration-tests/gav/src/test/java/io/quarkiverse/openapi/generator/it/QuarkusGAVOpenApiTest.java +++ b/client/integration-tests/gav/src/test/java/io/quarkiverse/openapi/generator/it/QuarkusGAVOpenApiTest.java @@ -6,7 +6,7 @@ class QuarkusGAVOpenApiTest { @Test - void apiIsBeingGenerated() { + void echo1IsBeingGenerated() { assertThatCode( () -> Class.forName( "org.openapi.quarkus.io_quarkiverse_openapi_generator_quarkus_openapi_generator_gav_source_echo1.api.DefaultApi")) @@ -14,10 +14,18 @@ void apiIsBeingGenerated() { } @Test - void apiIsBeingNotGenerated() { + void echo2IsBeingNotGenerated() { assertThatCode( () -> Class.forName( "org.openapi.quarkus.io_quarkiverse_openapi_generator_quarkus_openapi_generator_gav_source_echo2.api.DefaultApi")) .isInstanceOf(ClassNotFoundException.class); } + + @Test + void otherIsBeingNotGenerated() { + assertThatCode( + () -> Class.forName( + "org.openapi.quarkus.io_quarkiverse_openapi_generator_quarkus_openapi_generator_gav_source_other.api.DefaultApi")) + .isInstanceOf(ClassNotFoundException.class); + } } diff --git a/docs/modules/ROOT/pages/includes/quarkus-openapi-generator.adoc b/docs/modules/ROOT/pages/includes/quarkus-openapi-generator.adoc index 89b47b958..d80f81573 100644 --- a/docs/modules/ROOT/pages/includes/quarkus-openapi-generator.adoc +++ b/docs/modules/ROOT/pages/includes/quarkus-openapi-generator.adoc @@ -538,6 +538,27 @@ endif::add-copy-button-to-env-var[] |string | +a|icon:lock[title=Fixed at build time] [[quarkus-openapi-generator_quarkus-openapi-generator-codegen-gav-scanning]] [.property-path]##link:#quarkus-openapi-generator_quarkus-openapi-generator-codegen-gav-scanning[`quarkus.openapi-generator.codegen.gav-scanning`]## +ifdef::add-copy-button-to-config-props[] +config_property_copy_button:+++quarkus.openapi-generator.codegen.gav-scanning+++[] +endif::add-copy-button-to-config-props[] + + +[.description] +-- +Whether or not to skip gav scanning. + + +ifdef::add-copy-button-to-env-var[] +Environment variable: env_var_with_copy_button:+++QUARKUS_OPENAPI_GENERATOR_CODEGEN_GAV_SCANNING+++[] +endif::add-copy-button-to-env-var[] +ifndef::add-copy-button-to-env-var[] +Environment variable: `+++QUARKUS_OPENAPI_GENERATOR_CODEGEN_GAV_SCANNING+++` +endif::add-copy-button-to-env-var[] +-- +|boolean +|`+++true+++` + a|icon:lock[title=Fixed at build time] [[quarkus-openapi-generator_quarkus-openapi-generator-codegen-template-base-dir]] [.property-path]##link:#quarkus-openapi-generator_quarkus-openapi-generator-codegen-template-base-dir[`quarkus.openapi-generator.codegen.template-base-dir`]## ifdef::add-copy-button-to-config-props[] config_property_copy_button:+++quarkus.openapi-generator.codegen.template-base-dir+++[] @@ -622,6 +643,48 @@ endif::add-copy-button-to-env-var[] |string | +a|icon:lock[title=Fixed at build time] [[quarkus-openapi-generator_quarkus-openapi-generator-codegen-artifact-id-filter]] [.property-path]##link:#quarkus-openapi-generator_quarkus-openapi-generator-codegen-artifact-id-filter[`quarkus.openapi-generator.codegen.artifact-id-filter`]## +ifdef::add-copy-button-to-config-props[] +config_property_copy_button:+++quarkus.openapi-generator.codegen.artifact-id-filter+++[] +endif::add-copy-button-to-config-props[] + + +[.description] +-- +Option to filter artifactId from generation + + +ifdef::add-copy-button-to-env-var[] +Environment variable: env_var_with_copy_button:+++QUARKUS_OPENAPI_GENERATOR_CODEGEN_ARTIFACT_ID_FILTER+++[] +endif::add-copy-button-to-env-var[] +ifndef::add-copy-button-to-env-var[] +Environment variable: `+++QUARKUS_OPENAPI_GENERATOR_CODEGEN_ARTIFACT_ID_FILTER+++` +endif::add-copy-button-to-env-var[] +-- +|string +|`+++.*openapi.*+++` + +a|icon:lock[title=Fixed at build time] [[quarkus-openapi-generator_quarkus-openapi-generator-codegen-exclude-gavs]] [.property-path]##link:#quarkus-openapi-generator_quarkus-openapi-generator-codegen-exclude-gavs[`quarkus.openapi-generator.codegen.exclude-gavs`]## +ifdef::add-copy-button-to-config-props[] +config_property_copy_button:+++quarkus.openapi-generator.codegen.exclude-gavs+++[] +endif::add-copy-button-to-config-props[] + + +[.description] +-- +Option to exclude GAVs from generation + + +ifdef::add-copy-button-to-env-var[] +Environment variable: env_var_with_copy_button:+++QUARKUS_OPENAPI_GENERATOR_CODEGEN_EXCLUDE_GAVS+++[] +endif::add-copy-button-to-env-var[] +ifndef::add-copy-button-to-env-var[] +Environment variable: `+++QUARKUS_OPENAPI_GENERATOR_CODEGEN_EXCLUDE_GAVS+++` +endif::add-copy-button-to-env-var[] +-- +|list of string +| + a|icon:lock[title=Fixed at build time] [[quarkus-openapi-generator_quarkus-openapi-generator-codegen-default-security-scheme]] [.property-path]##link:#quarkus-openapi-generator_quarkus-openapi-generator-codegen-default-security-scheme[`quarkus.openapi-generator.codegen.default-security-scheme`]## ifdef::add-copy-button-to-config-props[] config_property_copy_button:+++quarkus.openapi-generator.codegen.default-security-scheme+++[] diff --git a/docs/modules/ROOT/pages/includes/quarkus-openapi-generator_quarkus.openapi-generator.adoc b/docs/modules/ROOT/pages/includes/quarkus-openapi-generator_quarkus.openapi-generator.adoc index 89b47b958..d80f81573 100644 --- a/docs/modules/ROOT/pages/includes/quarkus-openapi-generator_quarkus.openapi-generator.adoc +++ b/docs/modules/ROOT/pages/includes/quarkus-openapi-generator_quarkus.openapi-generator.adoc @@ -538,6 +538,27 @@ endif::add-copy-button-to-env-var[] |string | +a|icon:lock[title=Fixed at build time] [[quarkus-openapi-generator_quarkus-openapi-generator-codegen-gav-scanning]] [.property-path]##link:#quarkus-openapi-generator_quarkus-openapi-generator-codegen-gav-scanning[`quarkus.openapi-generator.codegen.gav-scanning`]## +ifdef::add-copy-button-to-config-props[] +config_property_copy_button:+++quarkus.openapi-generator.codegen.gav-scanning+++[] +endif::add-copy-button-to-config-props[] + + +[.description] +-- +Whether or not to skip gav scanning. + + +ifdef::add-copy-button-to-env-var[] +Environment variable: env_var_with_copy_button:+++QUARKUS_OPENAPI_GENERATOR_CODEGEN_GAV_SCANNING+++[] +endif::add-copy-button-to-env-var[] +ifndef::add-copy-button-to-env-var[] +Environment variable: `+++QUARKUS_OPENAPI_GENERATOR_CODEGEN_GAV_SCANNING+++` +endif::add-copy-button-to-env-var[] +-- +|boolean +|`+++true+++` + a|icon:lock[title=Fixed at build time] [[quarkus-openapi-generator_quarkus-openapi-generator-codegen-template-base-dir]] [.property-path]##link:#quarkus-openapi-generator_quarkus-openapi-generator-codegen-template-base-dir[`quarkus.openapi-generator.codegen.template-base-dir`]## ifdef::add-copy-button-to-config-props[] config_property_copy_button:+++quarkus.openapi-generator.codegen.template-base-dir+++[] @@ -622,6 +643,48 @@ endif::add-copy-button-to-env-var[] |string | +a|icon:lock[title=Fixed at build time] [[quarkus-openapi-generator_quarkus-openapi-generator-codegen-artifact-id-filter]] [.property-path]##link:#quarkus-openapi-generator_quarkus-openapi-generator-codegen-artifact-id-filter[`quarkus.openapi-generator.codegen.artifact-id-filter`]## +ifdef::add-copy-button-to-config-props[] +config_property_copy_button:+++quarkus.openapi-generator.codegen.artifact-id-filter+++[] +endif::add-copy-button-to-config-props[] + + +[.description] +-- +Option to filter artifactId from generation + + +ifdef::add-copy-button-to-env-var[] +Environment variable: env_var_with_copy_button:+++QUARKUS_OPENAPI_GENERATOR_CODEGEN_ARTIFACT_ID_FILTER+++[] +endif::add-copy-button-to-env-var[] +ifndef::add-copy-button-to-env-var[] +Environment variable: `+++QUARKUS_OPENAPI_GENERATOR_CODEGEN_ARTIFACT_ID_FILTER+++` +endif::add-copy-button-to-env-var[] +-- +|string +|`+++.*openapi.*+++` + +a|icon:lock[title=Fixed at build time] [[quarkus-openapi-generator_quarkus-openapi-generator-codegen-exclude-gavs]] [.property-path]##link:#quarkus-openapi-generator_quarkus-openapi-generator-codegen-exclude-gavs[`quarkus.openapi-generator.codegen.exclude-gavs`]## +ifdef::add-copy-button-to-config-props[] +config_property_copy_button:+++quarkus.openapi-generator.codegen.exclude-gavs+++[] +endif::add-copy-button-to-config-props[] + + +[.description] +-- +Option to exclude GAVs from generation + + +ifdef::add-copy-button-to-env-var[] +Environment variable: env_var_with_copy_button:+++QUARKUS_OPENAPI_GENERATOR_CODEGEN_EXCLUDE_GAVS+++[] +endif::add-copy-button-to-env-var[] +ifndef::add-copy-button-to-env-var[] +Environment variable: `+++QUARKUS_OPENAPI_GENERATOR_CODEGEN_EXCLUDE_GAVS+++` +endif::add-copy-button-to-env-var[] +-- +|list of string +| + a|icon:lock[title=Fixed at build time] [[quarkus-openapi-generator_quarkus-openapi-generator-codegen-default-security-scheme]] [.property-path]##link:#quarkus-openapi-generator_quarkus-openapi-generator-codegen-default-security-scheme[`quarkus.openapi-generator.codegen.default-security-scheme`]## ifdef::add-copy-button-to-config-props[] config_property_copy_button:+++quarkus.openapi-generator.codegen.default-security-scheme+++[] From c69287e8be91a7308d4c2d13dfc9841b689d825f Mon Sep 17 00:00:00 2001 From: Michael Sonnleitner Date: Fri, 24 Oct 2025 16:06:46 +0200 Subject: [PATCH 6/9] windows problem with colon in filename & extended test with specific spec mapping to ensure that config key is right --- .../GAVCoordinateOpenApiSpecInputProvider.java | 3 ++- .../gav/src/main/resources/application.properties | 3 ++- .../openapi/generator/it/QuarkusGAVOpenApiTest.java | 11 +++++++++++ 3 files changed, 15 insertions(+), 2 deletions(-) diff --git a/client/deployment/src/main/java/io/quarkiverse/openapi/generator/deployment/codegen/GAVCoordinateOpenApiSpecInputProvider.java b/client/deployment/src/main/java/io/quarkiverse/openapi/generator/deployment/codegen/GAVCoordinateOpenApiSpecInputProvider.java index c2cc57ae6..cc396409b 100644 --- a/client/deployment/src/main/java/io/quarkiverse/openapi/generator/deployment/codegen/GAVCoordinateOpenApiSpecInputProvider.java +++ b/client/deployment/src/main/java/io/quarkiverse/openapi/generator/deployment/codegen/GAVCoordinateOpenApiSpecInputProvider.java @@ -17,6 +17,7 @@ import io.quarkus.bootstrap.prebuild.CodeGenException; import io.quarkus.deployment.CodeGenContext; import io.quarkus.maven.dependency.ResolvedDependency; +import io.smallrye.config.common.utils.StringUtil; public class GAVCoordinateOpenApiSpecInputProvider implements OpenApiSpecInputProvider { private static final Logger LOG = Logger.getLogger(GAVCoordinateOpenApiSpecInputProvider.class); @@ -48,7 +49,7 @@ public List read(CodeGenContext context) throws CodeGenException } var inputModels = new ArrayList(); for (ResolvedDependency yamlDependency : yamlDependencies) { - var gacString = yamlDependency.getKey().toGacString(); + var gacString = StringUtil.replaceNonAlphanumericByUnderscores(yamlDependency.getKey().toGacString()); var path = yamlDependency.getResolvedPaths().stream().findFirst() .orElseThrow(() -> new CodeGenException("Could not find maven path of %s.".formatted(gacString))); try { diff --git a/client/integration-tests/gav/src/main/resources/application.properties b/client/integration-tests/gav/src/main/resources/application.properties index fe3b5db7b..c04013366 100644 --- a/client/integration-tests/gav/src/main/resources/application.properties +++ b/client/integration-tests/gav/src/main/resources/application.properties @@ -1,4 +1,5 @@ quarkus.keycloak.devservices.enabled=false quarkus.openapi-generator.codegen.artifact-id-filter=.*echo.* -quarkus.openapi-generator.codegen.exclude-gavs=io.quarkiverse.openapi.generator:quarkus-openapi-generator-gav-source-echo2 \ No newline at end of file +quarkus.openapi-generator.codegen.exclude-gavs=io.quarkiverse.openapi.generator:quarkus-openapi-generator-gav-source-echo2 +quarkus.openapi-generator.codegen.spec.io_quarkiverse_openapi_generator_quarkus_openapi_generator_gav_source_echo1.serializable-model=true \ No newline at end of file diff --git a/client/integration-tests/gav/src/test/java/io/quarkiverse/openapi/generator/it/QuarkusGAVOpenApiTest.java b/client/integration-tests/gav/src/test/java/io/quarkiverse/openapi/generator/it/QuarkusGAVOpenApiTest.java index 27ceda487..1e427c185 100644 --- a/client/integration-tests/gav/src/test/java/io/quarkiverse/openapi/generator/it/QuarkusGAVOpenApiTest.java +++ b/client/integration-tests/gav/src/test/java/io/quarkiverse/openapi/generator/it/QuarkusGAVOpenApiTest.java @@ -2,6 +2,8 @@ import static org.assertj.core.api.Assertions.*; +import java.io.Serializable; + import org.junit.jupiter.api.Test; class QuarkusGAVOpenApiTest { @@ -13,6 +15,15 @@ void echo1IsBeingGenerated() { .doesNotThrowAnyException(); } + @Test + void echoModelIsBeingGeneratedWithSerializableInterface() { + assertThatCode(() -> { + Class apiClass = Class.forName( + "org.openapi.quarkus.io_quarkiverse_openapi_generator_quarkus_openapi_generator_gav_source_echo1.model.Echo"); + assertThat(apiClass.getInterfaces()).contains(Serializable.class); + }).doesNotThrowAnyException(); + } + @Test void echo2IsBeingNotGenerated() { assertThatCode( From 3c960302b6f3182f59d4ca53997fee840646c450 Mon Sep 17 00:00:00 2001 From: Michael Sonnleitner Date: Fri, 24 Oct 2025 16:40:31 +0200 Subject: [PATCH 7/9] use verify phase to store artifacts to local mvn repo to get website / codeql action green --- client/integration-tests/gav-source/pom.xml | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/client/integration-tests/gav-source/pom.xml b/client/integration-tests/gav-source/pom.xml index 7d3fda5f0..0adbba458 100644 --- a/client/integration-tests/gav-source/pom.xml +++ b/client/integration-tests/gav-source/pom.xml @@ -22,7 +22,7 @@ install-file - install + verify quarkus-openapi-generator-gav-source-echo1 io.quarkiverse.openapi.generator @@ -36,7 +36,7 @@ install-file - install + verify quarkus-openapi-generator-gav-source-echo2 io.quarkiverse.openapi.generator @@ -50,7 +50,7 @@ install-file - install + verify quarkus-openapi-generator-gav-source-other io.quarkiverse.openapi.generator From 596b261fa7d0d6b59602be4b77fb9ff3a524eefd Mon Sep 17 00:00:00 2001 From: Michael Sonnleitner Date: Fri, 24 Oct 2025 17:49:25 +0200 Subject: [PATCH 8/9] renaming and javadoc --- ...AVCoordinateOpenApiSpecInputProvider.java} | 51 +++++++++++++++++-- ...eployment.codegen.OpenApiSpecInputProvider | 2 +- 2 files changed, 49 insertions(+), 4 deletions(-) rename client/deployment/src/main/java/io/quarkiverse/openapi/generator/deployment/codegen/{GAVCoordinateOpenApiSpecInputProvider.java => YamlOrJsonGAVCoordinateOpenApiSpecInputProvider.java} (61%) diff --git a/client/deployment/src/main/java/io/quarkiverse/openapi/generator/deployment/codegen/GAVCoordinateOpenApiSpecInputProvider.java b/client/deployment/src/main/java/io/quarkiverse/openapi/generator/deployment/codegen/YamlOrJsonGAVCoordinateOpenApiSpecInputProvider.java similarity index 61% rename from client/deployment/src/main/java/io/quarkiverse/openapi/generator/deployment/codegen/GAVCoordinateOpenApiSpecInputProvider.java rename to client/deployment/src/main/java/io/quarkiverse/openapi/generator/deployment/codegen/YamlOrJsonGAVCoordinateOpenApiSpecInputProvider.java index cc396409b..108605d33 100644 --- a/client/deployment/src/main/java/io/quarkiverse/openapi/generator/deployment/codegen/GAVCoordinateOpenApiSpecInputProvider.java +++ b/client/deployment/src/main/java/io/quarkiverse/openapi/generator/deployment/codegen/YamlOrJsonGAVCoordinateOpenApiSpecInputProvider.java @@ -19,8 +19,53 @@ import io.quarkus.maven.dependency.ResolvedDependency; import io.smallrye.config.common.utils.StringUtil; -public class GAVCoordinateOpenApiSpecInputProvider implements OpenApiSpecInputProvider { - private static final Logger LOG = Logger.getLogger(GAVCoordinateOpenApiSpecInputProvider.class); +/** + * Provides OpenAPI specification input from Maven GAV (GroupId:ArtifactId:Version) coordinates. + *

+ * This provider scans the application's dependencies for YAML or JSON files that match + * specific criteria and provides them as input for OpenAPI code generation. It implements + * the {@link OpenApiSpecInputProvider} interface to integrate with the OpenAPI Generator's + * code generation pipeline. + *

+ * + *

Scanning Behavior

+ *

+ * The provider performs the following steps: + *

+ *
    + *
  1. Checks if GAV scanning is enabled via configuration (enabled by default)
  2. + *
  3. Filters dependencies by artifact type (yaml/yml/json)
  4. + *
  5. Applies artifact ID filtering using a regex pattern
  6. + *
  7. Excludes specific GAVs based on configuration
  8. + *
  9. Creates {@link SpecInputModel} instances for each matching dependency
  10. + *
+ * + *

Configuration

+ *

+ * The provider respects the following configuration properties: + *

+ *
    + *
  • {@code quarkus.openapi-generator.codegen.gav-scanning} - Enable/disable GAV scanning
  • + *
  • {@code quarkus.openapi-generator.codegen.artifact-id-filter} - Regex pattern for artifact ID filtering
  • + *
  • {@code quarkus.openapi-generator.codegen.exclude-gavs} - List of GAV coordinates to exclude + * (format: groupId:artifactId:classifier)
  • + *
+ * + *

Example Usage

+ * + *
+ * # application.properties
+ * quarkus.openapi-generator.codegen.gav-scanning=true
+ * quarkus.openapi-generator.codegen.artifact-id-filter=.*api.*
+ * quarkus.openapi-generator.codegen.exclude-gavs=com.example:old-api
+ * 
+ * + * @see OpenApiSpecInputProvider + * @see SpecInputModel + * @see CodeGenContext + */ +public class YamlOrJsonGAVCoordinateOpenApiSpecInputProvider implements OpenApiSpecInputProvider { + private static final Logger LOG = Logger.getLogger(YamlOrJsonGAVCoordinateOpenApiSpecInputProvider.class); @Override public List read(CodeGenContext context) throws CodeGenException { @@ -37,7 +82,7 @@ public List read(CodeGenContext context) throws CodeGenException .orElse(".*openapi.*"); List yamlDependencies = context.applicationModel().getDependencies().stream() - .filter(rd -> SUPPORTED_EXTENSIONS.contains(rd.getType())) + .filter(rd -> SUPPORTED_EXTENSIONS.contains(rd.getType().toLowerCase())) .filter(rd -> rd.getArtifactId().matches(artifactIdFilter)) .filter(rd -> !gavsToExclude.contains(rd.getKey().toGacString())) .toList(); diff --git a/client/deployment/src/main/resources/META-INF/services/io.quarkiverse.openapi.generator.deployment.codegen.OpenApiSpecInputProvider b/client/deployment/src/main/resources/META-INF/services/io.quarkiverse.openapi.generator.deployment.codegen.OpenApiSpecInputProvider index 2438db0f2..3eb47dd6d 100644 --- a/client/deployment/src/main/resources/META-INF/services/io.quarkiverse.openapi.generator.deployment.codegen.OpenApiSpecInputProvider +++ b/client/deployment/src/main/resources/META-INF/services/io.quarkiverse.openapi.generator.deployment.codegen.OpenApiSpecInputProvider @@ -1 +1 @@ -io.quarkiverse.openapi.generator.deployment.codegen.GAVCoordinateOpenApiSpecInputProvider \ No newline at end of file +io.quarkiverse.openapi.generator.deployment.codegen.YamlOrJsonGAVCoordinateOpenApiSpecInputProvider \ No newline at end of file From 20bd8c4b5e2aa526950793002a7f4667bd99ca73 Mon Sep 17 00:00:00 2001 From: Michael Sonnleitner Date: Fri, 24 Oct 2025 17:54:19 +0200 Subject: [PATCH 9/9] use package phase for artifact installation to get codeql action running --- client/integration-tests/gav-source/pom.xml | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/client/integration-tests/gav-source/pom.xml b/client/integration-tests/gav-source/pom.xml index 0adbba458..349809c06 100644 --- a/client/integration-tests/gav-source/pom.xml +++ b/client/integration-tests/gav-source/pom.xml @@ -22,7 +22,7 @@ install-file - verify + package quarkus-openapi-generator-gav-source-echo1 io.quarkiverse.openapi.generator @@ -36,7 +36,7 @@ install-file - verify + package quarkus-openapi-generator-gav-source-echo2 io.quarkiverse.openapi.generator @@ -50,7 +50,7 @@ install-file - verify + package quarkus-openapi-generator-gav-source-other io.quarkiverse.openapi.generator