Skip to content

Commit

Permalink
Fix #6701 to support OpenAPI spec with yaml format (#6707)
Browse files Browse the repository at this point in the history
  • Loading branch information
zhfeng authored Oct 28, 2024
1 parent bad31c1 commit ee4a102
Show file tree
Hide file tree
Showing 5 changed files with 125 additions and 7 deletions.
Original file line number Diff line number Diff line change
Expand Up @@ -48,7 +48,7 @@ public String providerId() {

@Override
public String[] inputExtensions() {
return new String[] { "json" };
return new String[] { "json", "yaml" };
}

@Override
Expand All @@ -65,29 +65,29 @@ public boolean trigger(CodeGenContext context) throws CodeGenException {
}

try {
List<String> jsonFiles = new ArrayList<>();
List<String> specFiles = new ArrayList<>();
if (Files.isDirectory(context.inputDir())) {
try (Stream<Path> 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);
}
}

String packageName = config.getValue("quarkus.camel.openapi.codegen.model-package", String.class);
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()
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -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)");
Expand Down Expand Up @@ -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");
});
}
}
102 changes: 102 additions & 0 deletions integration-tests/rest-openapi/src/main/openapi/example.yaml
Original file line number Diff line number Diff line change
@@ -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
Original file line number Diff line number Diff line change
Expand Up @@ -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
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -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\""));
}
}

0 comments on commit ee4a102

Please sign in to comment.