diff --git a/extensions/rest-openapi/deployment/src/main/java/org/apache/camel/quarkus/component/rest/openapi/deployment/CamelQuarkusSwaggerCodegenProvider.java b/extensions/rest-openapi/deployment/src/main/java/org/apache/camel/quarkus/component/rest/openapi/deployment/CamelQuarkusSwaggerCodegenProvider.java index 8c09b33d056b..48df92c74038 100644 --- a/extensions/rest-openapi/deployment/src/main/java/org/apache/camel/quarkus/component/rest/openapi/deployment/CamelQuarkusSwaggerCodegenProvider.java +++ b/extensions/rest-openapi/deployment/src/main/java/org/apache/camel/quarkus/component/rest/openapi/deployment/CamelQuarkusSwaggerCodegenProvider.java @@ -48,7 +48,7 @@ public String providerId() { @Override public String[] inputExtensions() { - return new String[] { "json" }; + return new String[] { "json", "yaml" }; } @Override @@ -65,16 +65,16 @@ public boolean trigger(CodeGenContext context) throws CodeGenException { } try { - List jsonFiles = new ArrayList<>(); + List specFiles = new ArrayList<>(); if (Files.isDirectory(context.inputDir())) { try (Stream protoFilesPaths = Files.walk(context.inputDir())) { protoFilesPaths .filter(Files::isRegularFile) - .filter(s -> s.toString().endsWith("json")) + .filter(s -> s.toString().endsWith("json") || s.toString().endsWith("yaml")) .map(Path::normalize) .map(Path::toAbsolutePath) .map(Path::toString) - .forEach(jsonFiles::add); + .forEach(specFiles::add); } } @@ -82,12 +82,12 @@ public boolean trigger(CodeGenContext context) throws CodeGenException { String models = config.getOptionalValue("quarkus.camel.openapi.codegen.models", String.class).orElse(""); boolean useBeanValidation = config.getValue("quarkus.camel.openapi.codegen.use-bean-validation", Boolean.class); boolean notNullJackson = config.getValue("quarkus.camel.openapi.codegen.not-null-jackson", Boolean.class); - for (String jsonFile : jsonFiles) { + for (String specFile : specFiles) { CodegenConfigurator configurator = new CodegenConfigurator(); configurator.setLang("quarkus"); configurator.setLibrary("quarkus3"); configurator.setModelPackage(packageName); - configurator.setInputSpecURL(jsonFile); + configurator.setInputSpecURL(specFile); configurator.setOutputDir(context.outDir().toAbsolutePath().toString()); System.setProperty(CodegenConstants.MODELS, models); configurator.getCodegenArguments() diff --git a/integration-tests/rest-openapi/src/main/java/org/apache/camel/quarkus/component/rest/openapi/it/RestOpenApiRoutes.java b/integration-tests/rest-openapi/src/main/java/org/apache/camel/quarkus/component/rest/openapi/it/RestOpenApiRoutes.java index c1493d468c84..ebfe02573dbf 100644 --- a/integration-tests/rest-openapi/src/main/java/org/apache/camel/quarkus/component/rest/openapi/it/RestOpenApiRoutes.java +++ b/integration-tests/rest-openapi/src/main/java/org/apache/camel/quarkus/component/rest/openapi/it/RestOpenApiRoutes.java @@ -25,6 +25,7 @@ public class RestOpenApiRoutes extends RouteBuilder { @Override public void configure() throws Exception { rest().openApi().specification("petstore.json").missingOperation("ignore"); + rest().openApi().specification("example.yaml").missingOperation("ignore"); from("direct:start-web-json") .toD("rest-openapi:#list?specificationUri=RAW(http://localhost:${header.test-port}/q/openapi?format=JSON)"); @@ -59,5 +60,10 @@ public void configure() throws Exception { Pet pet = e.getMessage().getBody(Pet.class); pet.setStatus(StatusEnum.PENDING); }); + + from("direct:findCamels") + .process(e -> { + e.getMessage().setBody("smart camel"); + }); } } diff --git a/integration-tests/rest-openapi/src/main/openapi/example.yaml b/integration-tests/rest-openapi/src/main/openapi/example.yaml new file mode 100644 index 000000000000..63612632069a --- /dev/null +++ b/integration-tests/rest-openapi/src/main/openapi/example.yaml @@ -0,0 +1,102 @@ +# +# Licensed to the Apache Software Foundation (ASF) under one or more +# contributor license agreements. See the NOTICE file distributed with +# this work for additional information regarding copyright ownership. +# The ASF licenses this file to You under the Apache License, Version 2.0 +# (the "License"); you may not use this file except in compliance with +# the License. You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. +# + +openapi: "3.0.3" +info: + title: Camel API Example + version: 1.0.0 + description: > + This is an example API. + +servers: + - url: http://ipsum.com/api + description: Development environment. + - url: http://lorem.com/api + description: Production environment. + +paths: + /v1/camel: + get: + operationId: findCamels + summary: Find camels + description: Search for camels. + parameters: + - in: query + name: name + description: A camel name. + required: true + schema: + type: string + example: "Glenn" + responses: + "200": + description: Matching camels are returned. + content: + application/json: + schema: + type: object + required: + - camelList + properties: + camelList: + description: List containing matching camels. + type: array + items: + $ref: "#/components/schemas/Camel" + "400": + "description": "Invalid input." + +components: + schemas: + Camel: + description: A representation of a camel. + type: object + required: + - id + - gender + - name + properties: + id: + $ref: "#/components/schemas/Id" + gender: + description: > + Gender: + - FEMALE: Female. + - MALE: Male. + type: string + enum: [ FEMALE, MALE ] + example: MALE + birthDate: + description: The date of birth. + type: string + format: date + example: 2024-10-28Z + name: + description: Name. + type: string + example: Glenn + rating: + description: Rating. + type: number + multipleOf: 0.01 + example: 3.14 + + Id: + description: A camel id. + type: string + pattern: "^[A-Z]{3}-[0-9]{2}$" + example: ABC-42 diff --git a/integration-tests/rest-openapi/src/main/resources/application.properties b/integration-tests/rest-openapi/src/main/resources/application.properties index bcda19524260..59425bb75b09 100644 --- a/integration-tests/rest-openapi/src/main/resources/application.properties +++ b/integration-tests/rest-openapi/src/main/resources/application.properties @@ -14,7 +14,7 @@ ## See the License for the specific language governing permissions and ## limitations under the License. ## --------------------------------------------------------------------------- -quarkus.native.resources.includes=openapi.json,petstore.json +quarkus.native.resources.includes=openapi.json,petstore.json,example.yaml quarkus.camel.openapi.codegen.model-package=org.apache.camel.quarkus.component.rest.openapi.it.model quarkus.camel.openapi.codegen.not-null-jackson=true camel.rest.bindingMode=json diff --git a/integration-tests/rest-openapi/src/test/java/org/apache/camel/quarkus/component/rest/openapi/it/RestOpenapiTest.java b/integration-tests/rest-openapi/src/test/java/org/apache/camel/quarkus/component/rest/openapi/it/RestOpenapiTest.java index 02980b9c4b0c..0b61197b02d4 100644 --- a/integration-tests/rest-openapi/src/test/java/org/apache/camel/quarkus/component/rest/openapi/it/RestOpenapiTest.java +++ b/integration-tests/rest-openapi/src/test/java/org/apache/camel/quarkus/component/rest/openapi/it/RestOpenapiTest.java @@ -121,4 +121,14 @@ public void testGetPet() { .body("id", is(123), "name", is("Test"), "status", is("available")); } + @Test + public void testGetCamel() { + RestAssured.enableLoggingOfRequestAndResponseIfValidationFails(); + + RestAssured.given() + .get("/api/v1/camel") + .then() + .statusCode(200) + .body(is("\"smart camel\"")); + } }