This is an automated email from the ASF dual-hosted git repository.

davsclaus pushed a commit to branch openapi2
in repository https://gitbox.apache.org/repos/asf/camel.git

commit dbb28a1754dfe3658abd86d12b7345864c1b981b
Author: Claus Ibsen <claus.ib...@gmail.com>
AuthorDate: Sun Mar 24 14:35:37 2024 +0100

    CAMEL-20557: Rest DSL to use openapi spec directly
---
 components/camel-platform-http-vertx/pom.xml       |    5 +
 .../vertx/PlatformHttpRestOpenApiConsumerTest.java |   57 +
 .../src/test/resources/openapi-v3.json             | 1240 ++++++++++++++++++++
 .../camel/component/rest/openapi/rest-openapi.json |    2 +-
 .../rest/openapi/RestOpenApiComponent.java         |    2 +
 .../rest/openapi/RestOpenApiEndpoint.java          |   42 +-
 .../rest/openapi/RestOpenApiProcessor.java         |    9 +
 7 files changed, 1341 insertions(+), 16 deletions(-)

diff --git a/components/camel-platform-http-vertx/pom.xml 
b/components/camel-platform-http-vertx/pom.xml
index 6652b203894..665eebb4242 100644
--- a/components/camel-platform-http-vertx/pom.xml
+++ b/components/camel-platform-http-vertx/pom.xml
@@ -89,6 +89,11 @@
             <artifactId>camel-log</artifactId>
             <scope>test</scope>
         </dependency>
+        <dependency>
+            <groupId>org.apache.camel</groupId>
+            <artifactId>camel-rest-openapi</artifactId>
+            <scope>test</scope>
+        </dependency>
         <dependency>
             <groupId>org.assertj</groupId>
             <artifactId>assertj-core</artifactId>
diff --git 
a/components/camel-platform-http-vertx/src/test/java/org/apache/camel/component/platform/http/vertx/PlatformHttpRestOpenApiConsumerTest.java
 
b/components/camel-platform-http-vertx/src/test/java/org/apache/camel/component/platform/http/vertx/PlatformHttpRestOpenApiConsumerTest.java
new file mode 100644
index 00000000000..7fb2ec61db9
--- /dev/null
+++ 
b/components/camel-platform-http-vertx/src/test/java/org/apache/camel/component/platform/http/vertx/PlatformHttpRestOpenApiConsumerTest.java
@@ -0,0 +1,57 @@
+/*
+ * 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.
+ */
+package org.apache.camel.component.platform.http.vertx;
+
+import org.apache.camel.CamelContext;
+import org.apache.camel.builder.RouteBuilder;
+import org.junit.jupiter.api.Test;
+
+import static io.restassured.RestAssured.given;
+import static org.hamcrest.Matchers.equalTo;
+
+public class PlatformHttpRestOpenApiConsumerTest {
+
+    @Test
+    public void testRestOpenApi() throws Exception {
+        final CamelContext context = 
VertxPlatformHttpEngineTest.createCamelContext();
+
+        try {
+            context.addRoutes(new RouteBuilder() {
+                @Override
+                public void configure() {
+                    from("rest-openapi:classpath:openapi-v3.json")
+                            .log("dummy");
+
+                    from("direct:getPetById")
+                            .setBody().constant("{\"pet\": \"tony the 
tiger\"}");
+                }
+            });
+
+            context.start();
+
+            given()
+                    .when()
+                    .get("/api/v3/getPetById")
+                    .then()
+                    .statusCode(200)
+                    .body(equalTo("{\"pet\": \"tony the tiger\"}"));
+        } finally {
+            context.stop();
+        }
+    }
+
+}
diff --git 
a/components/camel-platform-http-vertx/src/test/resources/openapi-v3.json 
b/components/camel-platform-http-vertx/src/test/resources/openapi-v3.json
new file mode 100644
index 00000000000..b03f018744a
--- /dev/null
+++ b/components/camel-platform-http-vertx/src/test/resources/openapi-v3.json
@@ -0,0 +1,1240 @@
+{
+       "openapi": "3.0.2",
+       "info": {
+               "title": "Swagger Petstore - OpenAPI 3.0",
+               "description": "This is a sample Pet Store Server based on the 
OpenAPI 3.0 specification.  You can find out more about\nSwagger at 
[http://swagger.io](http://swagger.io). In the third iteration of the pet 
store, we've switched to the design first approach!\nYou can now help us 
improve the API whether it's by making changes to the definition itself or to 
the code.\nThat way, with time, we can improve the API in general, and expose 
some of the new features in OAS3.\n\nSome useful links:\ [...]
+               "termsOfService": "http://swagger.io/terms/";,
+               "contact": {
+                       "email": "apit...@swagger.io"
+               },
+               "license": {
+                       "name": "Apache 2.0",
+                       "url": "http://www.apache.org/licenses/LICENSE-2.0.html";
+               },
+               "version": "1.0.4"
+       },
+       "externalDocs": {
+               "description": "Find out more about Swagger",
+               "url": "http://swagger.io";
+       },
+       "servers": [
+               {
+                       "url": "{scheme}://{host}/{basePath}",
+                       "variables": {
+                               "scheme": {
+                                       "enum": [
+                                               "https",
+                                               "http"
+                                       ],
+                                       "default": "https"
+                               },
+                               "host": {
+                                       "default": "petstore3.swagger.io"
+                               },
+                               "basePath": {
+                                       "default": "/api/v3"
+                               }
+                       }
+               }
+       ],
+       "tags": [
+               {
+                       "name": "pet",
+                       "description": "Everything about your Pets",
+                       "externalDocs": {
+                               "description": "Find out more",
+                               "url": "http://swagger.io";
+                       }
+               },
+               {
+                       "name": "store",
+                       "description": "Operations about user"
+               },
+               {
+                       "name": "user",
+                       "description": "Access to Petstore orders",
+                       "externalDocs": {
+                               "description": "Find out more about our store",
+                               "url": "http://swagger.io";
+                       }
+               }
+       ],
+       "paths": {
+               "/pet": {
+                       "put": {
+                               "tags": [
+                                       "pet"
+                               ],
+                               "summary": "Update an existing pet",
+                               "description": "Update an existing pet by Id",
+                               "operationId": "updatePet",
+                               "requestBody": {
+                                       "description": "Update an existent pet 
in the store",
+                                       "content": {
+                                               "application/json": {
+                                                       "schema": {
+                                                               "$ref": 
"#/components/schemas/Pet"
+                                                       }
+                                               },
+                                               "application/xml": {
+                                                       "schema": {
+                                                               "$ref": 
"#/components/schemas/Pet"
+                                                       }
+                                               },
+                                               
"application/x-www-form-urlencoded": {
+                                                       "schema": {
+                                                               "$ref": 
"#/components/schemas/Pet"
+                                                       }
+                                               }
+                                       },
+                                       "required": true
+                               },
+                               "responses": {
+                                       "200": {
+                                               "description": "Successful 
operation",
+                                               "content": {
+                                                       "application/xml": {
+                                                               "schema": {
+                                                                       "$ref": 
"#/components/schemas/Pet"
+                                                               }
+                                                       },
+                                                       "application/json": {
+                                                               "schema": {
+                                                                       "$ref": 
"#/components/schemas/Pet"
+                                                               }
+                                                       }
+                                               }
+                                       },
+                                       "400": {
+                                               "description": "Invalid ID 
supplied"
+                                       },
+                                       "404": {
+                                               "description": "Pet not found"
+                                       },
+                                       "405": {
+                                               "description": "Validation 
exception"
+                                       }
+                               },
+                               "security": [
+                                       {
+                                               "petstore_auth": [
+                                                       "write:pets",
+                                                       "read:pets"
+                                               ]
+                                       }
+                               ]
+                       },
+                       "post": {
+                               "tags": [
+                                       "pet"
+                               ],
+                               "summary": "Add a new pet to the store",
+                               "description": "Add a new pet to the store",
+                               "operationId": "addPet",
+                               "requestBody": {
+                                       "description": "Create a new pet in the 
store",
+                                       "content": {
+                                               "application/json": {
+                                                       "schema": {
+                                                               "$ref": 
"#/components/schemas/Pet"
+                                                       }
+                                               },
+                                               "application/xml": {
+                                                       "schema": {
+                                                               "$ref": 
"#/components/schemas/Pet"
+                                                       }
+                                               },
+                                               
"application/x-www-form-urlencoded": {
+                                                       "schema": {
+                                                               "$ref": 
"#/components/schemas/Pet"
+                                                       }
+                                               }
+                                       },
+                                       "required": true
+                               },
+                               "responses": {
+                                       "200": {
+                                               "description": "Successful 
operation",
+                                               "content": {
+                                                       "application/xml": {
+                                                               "schema": {
+                                                                       "$ref": 
"#/components/schemas/Pet"
+                                                               }
+                                                       },
+                                                       "application/json": {
+                                                               "schema": {
+                                                                       "$ref": 
"#/components/schemas/Pet"
+                                                               }
+                                                       }
+                                               }
+                                       },
+                                       "405": {
+                                               "description": "Invalid input"
+                                       }
+                               },
+                               "security": [
+                                       {
+                                               "petstore_auth": [
+                                                       "write:pets",
+                                                       "read:pets"
+                                               ]
+                                       }
+                               ]
+                       }
+               },
+               "/pet/findByStatus": {
+                       "get": {
+                               "tags": [
+                                       "pet"
+                               ],
+                               "summary": "Finds Pets by status",
+                               "description": "Multiple status values can be 
provided with comma separated strings",
+                               "operationId": "findPetsByStatus",
+                               "parameters": [
+                                       {
+                                               "name": "status",
+                                               "in": "query",
+                                               "description": "Status values 
that need to be considered for filter",
+                                               "required": false,
+                                               "explode": true,
+                                               "schema": {
+                                                       "type": "string",
+                                                       "default": "available",
+                                                       "enum": [
+                                                               "available",
+                                                               "pending",
+                                                               "sold"
+                                                       ]
+                                               }
+                                       }
+                               ],
+                               "responses": {
+                                       "200": {
+                                               "description": "successful 
operation",
+                                               "content": {
+                                                       "application/xml": {
+                                                               "schema": {
+                                                                       "type": 
"array",
+                                                                       
"items": {
+                                                                               
"$ref": "#/components/schemas/Pet"
+                                                                       }
+                                                               }
+                                                       },
+                                                       "application/json": {
+                                                               "schema": {
+                                                                       "type": 
"array",
+                                                                       
"items": {
+                                                                               
"$ref": "#/components/schemas/Pet"
+                                                                       }
+                                                               }
+                                                       }
+                                               }
+                                       },
+                                       "400": {
+                                               "description": "Invalid status 
value"
+                                       }
+                               },
+                               "security": [
+                                       {
+                                               "petstore_auth": [
+                                                       "write:pets",
+                                                       "read:pets"
+                                               ]
+                                       }
+                               ]
+                       }
+               },
+               "/pet/findByTags": {
+                       "get": {
+                               "tags": [
+                                       "pet"
+                               ],
+                               "summary": "Finds Pets by tags",
+                               "description": "Multiple tags can be provided 
with comma separated strings. Use tag1, tag2, tag3 for testing.",
+                               "operationId": "findPetsByTags",
+                               "parameters": [
+                                       {
+                                               "name": "tags",
+                                               "in": "query",
+                                               "description": "Tags to filter 
by",
+                                               "required": false,
+                                               "explode": true,
+                                               "schema": {
+                                                       "type": "array",
+                                                       "items": {
+                                                               "type": "string"
+                                                       }
+                                               }
+                                       }
+                               ],
+                               "responses": {
+                                       "200": {
+                                               "description": "successful 
operation",
+                                               "content": {
+                                                       "application/xml": {
+                                                               "schema": {
+                                                                       "type": 
"array",
+                                                                       
"items": {
+                                                                               
"$ref": "#/components/schemas/Pet"
+                                                                       }
+                                                               }
+                                                       },
+                                                       "application/json": {
+                                                               "schema": {
+                                                                       "type": 
"array",
+                                                                       
"items": {
+                                                                               
"$ref": "#/components/schemas/Pet"
+                                                                       }
+                                                               }
+                                                       }
+                                               }
+                                       },
+                                       "400": {
+                                               "description": "Invalid tag 
value"
+                                       }
+                               },
+                               "security": [
+                                       {
+                                               "petstore_auth": [
+                                                       "write:pets",
+                                                       "read:pets"
+                                               ]
+                                       }
+                               ]
+                       }
+               },
+               "/pet/{petId}": {
+                       "get": {
+                               "tags": [
+                                       "pet"
+                               ],
+                               "summary": "Find pet by ID",
+                               "description": "Returns a single pet",
+                               "operationId": "getPetById",
+                               "parameters": [
+                                       {
+                                               "name": "petId",
+                                               "in": "path",
+                                               "description": "ID of pet to 
return",
+                                               "required": true,
+                                               "schema": {
+                                                       "type": "integer",
+                                                       "format": "int64"
+                                               }
+                                       }
+                               ],
+                               "responses": {
+                                       "200": {
+                                               "description": "successful 
operation",
+                                               "content": {
+                                                       "application/xml": {
+                                                               "schema": {
+                                                                       "$ref": 
"#/components/schemas/Pet"
+                                                               }
+                                                       },
+                                                       "application/json": {
+                                                               "schema": {
+                                                                       "$ref": 
"#/components/schemas/Pet"
+                                                               }
+                                                       }
+                                               }
+                                       },
+                                       "400": {
+                                               "description": "Invalid ID 
supplied"
+                                       },
+                                       "404": {
+                                               "description": "Pet not found"
+                                       }
+                               },
+                               "security": [
+                                       {
+                                               "api_key": []
+                                       },
+                                       {
+                                               "petstore_auth": [
+                                                       "write:pets",
+                                                       "read:pets"
+                                               ]
+                                       }
+                               ]
+                       },
+                       "post": {
+                               "tags": [
+                                       "pet"
+                               ],
+                               "summary": "Updates a pet in the store with 
form data",
+                               "description": "",
+                               "operationId": "updatePetWithForm",
+                               "parameters": [
+                                       {
+                                               "name": "petId",
+                                               "in": "path",
+                                               "description": "ID of pet that 
needs to be updated",
+                                               "required": true,
+                                               "schema": {
+                                                       "type": "integer",
+                                                       "format": "int64"
+                                               }
+                                       },
+                                       {
+                                               "name": "name",
+                                               "in": "query",
+                                               "description": "Name of pet 
that needs to be updated",
+                                               "schema": {
+                                                       "type": "string"
+                                               }
+                                       },
+                                       {
+                                               "name": "status",
+                                               "in": "query",
+                                               "description": "Status of pet 
that needs to be updated",
+                                               "schema": {
+                                                       "type": "string"
+                                               }
+                                       }
+                               ],
+                               "responses": {
+                                       "405": {
+                                               "description": "Invalid input"
+                                       }
+                               },
+                               "security": [
+                                       {
+                                               "petstore_auth": [
+                                                       "write:pets",
+                                                       "read:pets"
+                                               ]
+                                       }
+                               ]
+                       },
+                       "delete": {
+                               "tags": [
+                                       "pet"
+                               ],
+                               "summary": "Deletes a pet",
+                               "description": "",
+                               "operationId": "deletePet",
+                               "parameters": [
+                                       {
+                                               "name": "api_key",
+                                               "in": "header",
+                                               "description": "",
+                                               "required": false,
+                                               "schema": {
+                                                       "type": "string"
+                                               }
+                                       },
+                                       {
+                                               "name": "petId",
+                                               "in": "path",
+                                               "description": "Pet id to 
delete",
+                                               "required": true,
+                                               "schema": {
+                                                       "type": "integer",
+                                                       "format": "int64"
+                                               }
+                                       }
+                               ],
+                               "responses": {
+                                       "400": {
+                                               "description": "Invalid pet 
value"
+                                       }
+                               },
+                               "security": [
+                                       {
+                                               "petstore_auth": [
+                                                       "write:pets",
+                                                       "read:pets"
+                                               ]
+                                       }
+                               ]
+                       }
+               },
+               "/pet/{petId}/uploadImage": {
+                       "post": {
+                               "tags": [
+                                       "pet"
+                               ],
+                               "summary": "uploads an image",
+                               "description": "",
+                               "operationId": "uploadFile",
+                               "parameters": [
+                                       {
+                                               "name": "petId",
+                                               "in": "path",
+                                               "description": "ID of pet to 
update",
+                                               "required": true,
+                                               "schema": {
+                                                       "type": "integer",
+                                                       "format": "int64"
+                                               }
+                                       },
+                                       {
+                                               "name": "additionalMetadata",
+                                               "in": "query",
+                                               "description": "Additional 
Metadata",
+                                               "required": false,
+                                               "schema": {
+                                                       "type": "string"
+                                               }
+                                       }
+                               ],
+                               "requestBody": {
+                                       "content": {
+                                               "application/octet-stream": {
+                                                       "schema": {
+                                                               "type": 
"string",
+                                                               "format": 
"binary"
+                                                       }
+                                               }
+                                       }
+                               },
+                               "responses": {
+                                       "200": {
+                                               "description": "successful 
operation",
+                                               "content": {
+                                                       "application/json": {
+                                                               "schema": {
+                                                                       "$ref": 
"#/components/schemas/ApiResponse"
+                                                               }
+                                                       }
+                                               }
+                                       }
+                               },
+                               "security": [
+                                       {
+                                               "petstore_auth": [
+                                                       "write:pets",
+                                                       "read:pets"
+                                               ]
+                                       }
+                               ]
+                       }
+               },
+               "/store/inventory": {
+                       "get": {
+                               "tags": [
+                                       "store"
+                               ],
+                               "summary": "Returns pet inventories by status",
+                               "description": "Returns a map of status codes 
to quantities",
+                               "operationId": "getInventory",
+                               "responses": {
+                                       "200": {
+                                               "description": "successful 
operation",
+                                               "content": {
+                                                       "application/json": {
+                                                               "schema": {
+                                                                       "type": 
"object",
+                                                                       
"additionalProperties": {
+                                                                               
"type": "integer",
+                                                                               
"format": "int32"
+                                                                       }
+                                                               }
+                                                       }
+                                               }
+                                       }
+                               },
+                               "security": [
+                                       {
+                                               "api_key": []
+                                       }
+                               ]
+                       }
+               },
+               "/store/order": {
+                       "post": {
+                               "tags": [
+                                       "store"
+                               ],
+                               "summary": "Place an order for a pet",
+                               "description": "Place a new order in the store",
+                               "operationId": "placeOrder",
+                               "requestBody": {
+                                       "content": {
+                                               "application/json": {
+                                                       "schema": {
+                                                               "$ref": 
"#/components/schemas/Order"
+                                                       }
+                                               },
+                                               "application/xml": {
+                                                       "schema": {
+                                                               "$ref": 
"#/components/schemas/Order"
+                                                       }
+                                               },
+                                               
"application/x-www-form-urlencoded": {
+                                                       "schema": {
+                                                               "$ref": 
"#/components/schemas/Order"
+                                                       }
+                                               }
+                                       }
+                               },
+                               "responses": {
+                                       "200": {
+                                               "description": "successful 
operation",
+                                               "content": {
+                                                       "application/json": {
+                                                               "schema": {
+                                                                       "$ref": 
"#/components/schemas/Order"
+                                                               }
+                                                       }
+                                               }
+                                       },
+                                       "405": {
+                                               "description": "Invalid input"
+                                       }
+                               }
+                       }
+               },
+               "/store/order/{orderId}": {
+                       "get": {
+                               "tags": [
+                                       "store"
+                               ],
+                               "summary": "Find purchase order by ID",
+                               "description": "For valid response try integer 
IDs with value <= 5 or > 10. Other values will generated exceptions",
+                               "operationId": "getOrderById",
+                               "parameters": [
+                                       {
+                                               "name": "orderId",
+                                               "in": "path",
+                                               "description": "ID of order 
that needs to be fetched",
+                                               "required": true,
+                                               "schema": {
+                                                       "type": "integer",
+                                                       "format": "int64"
+                                               }
+                                       }
+                               ],
+                               "responses": {
+                                       "200": {
+                                               "description": "successful 
operation",
+                                               "content": {
+                                                       "application/xml": {
+                                                               "schema": {
+                                                                       "$ref": 
"#/components/schemas/Order"
+                                                               }
+                                                       },
+                                                       "application/json": {
+                                                               "schema": {
+                                                                       "$ref": 
"#/components/schemas/Order"
+                                                               }
+                                                       }
+                                               }
+                                       },
+                                       "400": {
+                                               "description": "Invalid ID 
supplied"
+                                       },
+                                       "404": {
+                                               "description": "Order not found"
+                                       }
+                               }
+                       },
+                       "delete": {
+                               "tags": [
+                                       "store"
+                               ],
+                               "summary": "Delete purchase order by ID",
+                               "description": "For valid response try integer 
IDs with value < 1000. Anything above 1000 or nonintegers will generate API 
errors",
+                               "operationId": "deleteOrder",
+                               "parameters": [
+                                       {
+                                               "name": "orderId",
+                                               "in": "path",
+                                               "description": "ID of the order 
that needs to be deleted",
+                                               "required": true,
+                                               "schema": {
+                                                       "type": "integer",
+                                                       "format": "int64"
+                                               }
+                                       }
+                               ],
+                               "responses": {
+                                       "400": {
+                                               "description": "Invalid ID 
supplied"
+                                       },
+                                       "404": {
+                                               "description": "Order not found"
+                                       }
+                               }
+                       }
+               },
+               "/user": {
+                       "post": {
+                               "tags": [
+                                       "user"
+                               ],
+                               "summary": "Create user",
+                               "description": "This can only be done by the 
logged in user.",
+                               "operationId": "createUser",
+                               "requestBody": {
+                                       "description": "Created user object",
+                                       "content": {
+                                               "application/json": {
+                                                       "schema": {
+                                                               "$ref": 
"#/components/schemas/User"
+                                                       }
+                                               },
+                                               "application/xml": {
+                                                       "schema": {
+                                                               "$ref": 
"#/components/schemas/User"
+                                                       }
+                                               },
+                                               
"application/x-www-form-urlencoded": {
+                                                       "schema": {
+                                                               "$ref": 
"#/components/schemas/User"
+                                                       }
+                                               }
+                                       }
+                               },
+                               "responses": {
+                                       "default": {
+                                               "description": "successful 
operation",
+                                               "content": {
+                                                       "application/json": {
+                                                               "schema": {
+                                                                       "$ref": 
"#/components/schemas/User"
+                                                               }
+                                                       },
+                                                       "application/xml": {
+                                                               "schema": {
+                                                                       "$ref": 
"#/components/schemas/User"
+                                                               }
+                                                       }
+                                               }
+                                       }
+                               }
+                       }
+               },
+               "/user/createWithList": {
+                       "post": {
+                               "tags": [
+                                       "user"
+                               ],
+                               "summary": "Creates list of users with given 
input array",
+                               "description": "Creates list of users with 
given input array",
+                               "operationId": "createUsersWithListInput",
+                               "requestBody": {
+                                       "content": {
+                                               "application/json": {
+                                                       "schema": {
+                                                               "type": "array",
+                                                               "items": {
+                                                                       "$ref": 
"#/components/schemas/User"
+                                                               }
+                                                       }
+                                               }
+                                       }
+                               },
+                               "responses": {
+                                       "200": {
+                                               "description": "Successful 
operation",
+                                               "content": {
+                                                       "application/xml": {
+                                                               "schema": {
+                                                                       "$ref": 
"#/components/schemas/User"
+                                                               }
+                                                       },
+                                                       "application/json": {
+                                                               "schema": {
+                                                                       "$ref": 
"#/components/schemas/User"
+                                                               }
+                                                       }
+                                               }
+                                       },
+                                       "default": {
+                                               "description": "successful 
operation"
+                                       }
+                               }
+                       }
+               },
+               "/user/login": {
+                       "get": {
+                               "tags": [
+                                       "user"
+                               ],
+                               "summary": "Logs user into the system",
+                               "description": "",
+                               "operationId": "loginUser",
+                               "parameters": [
+                                       {
+                                               "name": "username",
+                                               "in": "query",
+                                               "description": "The user name 
for login",
+                                               "required": false,
+                                               "schema": {
+                                                       "type": "string"
+                                               }
+                                       },
+                                       {
+                                               "name": "password",
+                                               "in": "query",
+                                               "description": "The password 
for login in clear text",
+                                               "required": false,
+                                               "schema": {
+                                                       "type": "string"
+                                               }
+                                       }
+                               ],
+                               "responses": {
+                                       "200": {
+                                               "description": "successful 
operation",
+                                               "headers": {
+                                                       "X-Rate-Limit": {
+                                                               "description": 
"calls per hour allowed by the user",
+                                                               "schema": {
+                                                                       "type": 
"integer",
+                                                                       
"format": "int32"
+                                                               }
+                                                       },
+                                                       "X-Expires-After": {
+                                                               "description": 
"date in UTC when toekn expires",
+                                                               "schema": {
+                                                                       "type": 
"string",
+                                                                       
"format": "date-time"
+                                                               }
+                                                       }
+                                               },
+                                               "content": {
+                                                       "application/xml": {
+                                                               "schema": {
+                                                                       "type": 
"string"
+                                                               }
+                                                       },
+                                                       "application/json": {
+                                                               "schema": {
+                                                                       "type": 
"string"
+                                                               }
+                                                       }
+                                               }
+                                       },
+                                       "400": {
+                                               "description": "Invalid 
username/password supplied"
+                                       }
+                               }
+                       }
+               },
+               "/user/logout": {
+                       "get": {
+                               "tags": [
+                                       "user"
+                               ],
+                               "summary": "Logs out current logged in user 
session",
+                               "description": "",
+                               "operationId": "logoutUser",
+                               "parameters": [],
+                               "responses": {
+                                       "default": {
+                                               "description": "successful 
operation"
+                                       }
+                               }
+                       }
+               },
+               "/user/{username}": {
+                       "get": {
+                               "tags": [
+                                       "user"
+                               ],
+                               "summary": "Get user by user name",
+                               "description": "",
+                               "operationId": "getUserByName",
+                               "parameters": [
+                                       {
+                                               "name": "username",
+                                               "in": "path",
+                                               "description": "The name that 
needs to be fetched. Use user1 for testing. ",
+                                               "required": true,
+                                               "schema": {
+                                                       "type": "string"
+                                               }
+                                       }
+                               ],
+                               "responses": {
+                                       "200": {
+                                               "description": "successful 
operation",
+                                               "content": {
+                                                       "application/xml": {
+                                                               "schema": {
+                                                                       "$ref": 
"#/components/schemas/User"
+                                                               }
+                                                       },
+                                                       "application/json": {
+                                                               "schema": {
+                                                                       "$ref": 
"#/components/schemas/User"
+                                                               }
+                                                       }
+                                               }
+                                       },
+                                       "400": {
+                                               "description": "Invalid 
username supplied"
+                                       },
+                                       "404": {
+                                               "description": "User not found"
+                                       }
+                               }
+                       },
+                       "put": {
+                               "tags": [
+                                       "user"
+                               ],
+                               "summary": "Update user",
+                               "description": "This can only be done by the 
logged in user.",
+                               "operationId": "updateUser",
+                               "parameters": [
+                                       {
+                                               "name": "username",
+                                               "in": "path",
+                                               "description": "name that need 
to be deleted",
+                                               "required": true,
+                                               "schema": {
+                                                       "type": "string"
+                                               }
+                                       }
+                               ],
+                               "requestBody": {
+                                       "description": "Update an existent user 
in the store",
+                                       "content": {
+                                               "application/json": {
+                                                       "schema": {
+                                                               "$ref": 
"#/components/schemas/User"
+                                                       }
+                                               },
+                                               "application/xml": {
+                                                       "schema": {
+                                                               "$ref": 
"#/components/schemas/User"
+                                                       }
+                                               },
+                                               
"application/x-www-form-urlencoded": {
+                                                       "schema": {
+                                                               "$ref": 
"#/components/schemas/User"
+                                                       }
+                                               }
+                                       }
+                               },
+                               "responses": {
+                                       "default": {
+                                               "description": "successful 
operation"
+                                       }
+                               }
+                       },
+                       "delete": {
+                               "tags": [
+                                       "user"
+                               ],
+                               "summary": "Delete user",
+                               "description": "This can only be done by the 
logged in user.",
+                               "operationId": "deleteUser",
+                               "parameters": [
+                                       {
+                                               "name": "username",
+                                               "in": "path",
+                                               "description": "The name that 
needs to be deleted",
+                                               "required": true,
+                                               "schema": {
+                                                       "type": "string"
+                                               }
+                                       }
+                               ],
+                               "responses": {
+                                       "400": {
+                                               "description": "Invalid 
username supplied"
+                                       },
+                                       "404": {
+                                               "description": "User not found"
+                                       }
+                               }
+                       }
+               }
+       },
+       "components": {
+               "schemas": {
+                       "Order": {
+                               "type": "object",
+                               "properties": {
+                                       "id": {
+                                               "type": "integer",
+                                               "format": "int64",
+                                               "example": 10
+                                       },
+                                       "petId": {
+                                               "type": "integer",
+                                               "format": "int64",
+                                               "example": 198772
+                                       },
+                                       "quantity": {
+                                               "type": "integer",
+                                               "format": "int32",
+                                               "example": 7
+                                       },
+                                       "shipDate": {
+                                               "type": "string",
+                                               "format": "date-time"
+                                       },
+                                       "status": {
+                                               "type": "string",
+                                               "description": "Order Status",
+                                               "example": "approved",
+                                               "enum": [
+                                                       "placed",
+                                                       "approved",
+                                                       "delivered"
+                                               ]
+                                       },
+                                       "complete": {
+                                               "type": "boolean"
+                                       }
+                               },
+                               "xml": {
+                                       "name": "order"
+                               }
+                       },
+                       "Customer": {
+                               "type": "object",
+                               "properties": {
+                                       "id": {
+                                               "type": "integer",
+                                               "format": "int64",
+                                               "example": 100000
+                                       },
+                                       "username": {
+                                               "type": "string",
+                                               "example": "fehguy"
+                                       },
+                                       "address": {
+                                               "type": "array",
+                                               "xml": {
+                                                       "name": "addresses",
+                                                       "wrapped": true
+                                               },
+                                               "items": {
+                                                       "$ref": 
"#/components/schemas/Address"
+                                               }
+                                       }
+                               },
+                               "xml": {
+                                       "name": "customer"
+                               }
+                       },
+                       "Address": {
+                               "type": "object",
+                               "properties": {
+                                       "street": {
+                                               "type": "string",
+                                               "example": "437 Lytton"
+                                       },
+                                       "city": {
+                                               "type": "string",
+                                               "example": "Palo Alto"
+                                       },
+                                       "state": {
+                                               "type": "string",
+                                               "example": "CA"
+                                       },
+                                       "zip": {
+                                               "type": "string",
+                                               "example": "94301"
+                                       }
+                               },
+                               "xml": {
+                                       "name": "address"
+                               }
+                       },
+                       "Category": {
+                               "type": "object",
+                               "properties": {
+                                       "id": {
+                                               "type": "integer",
+                                               "format": "int64",
+                                               "example": 1
+                                       },
+                                       "name": {
+                                               "type": "string",
+                                               "example": "Dogs"
+                                       }
+                               },
+                               "xml": {
+                                       "name": "category"
+                               }
+                       },
+                       "User": {
+                               "type": "object",
+                               "properties": {
+                                       "id": {
+                                               "type": "integer",
+                                               "format": "int64",
+                                               "example": 10
+                                       },
+                                       "username": {
+                                               "type": "string",
+                                               "example": "theUser"
+                                       },
+                                       "firstName": {
+                                               "type": "string",
+                                               "example": "John"
+                                       },
+                                       "lastName": {
+                                               "type": "string",
+                                               "example": "James"
+                                       },
+                                       "email": {
+                                               "type": "string",
+                                               "example": "j...@email.com"
+                                       },
+                                       "password": {
+                                               "type": "string",
+                                               "example": "12345"
+                                       },
+                                       "phone": {
+                                               "type": "string",
+                                               "example": "12345"
+                                       },
+                                       "userStatus": {
+                                               "type": "integer",
+                                               "description": "User Status",
+                                               "format": "int32",
+                                               "example": 1
+                                       }
+                               },
+                               "xml": {
+                                       "name": "user"
+                               }
+                       },
+                       "Tag": {
+                               "type": "object",
+                               "properties": {
+                                       "id": {
+                                               "type": "integer",
+                                               "format": "int64"
+                                       },
+                                       "name": {
+                                               "type": "string"
+                                       }
+                               },
+                               "xml": {
+                                       "name": "tag"
+                               }
+                       },
+                       "Pet": {
+                               "required": [
+                                       "name",
+                                       "photoUrls"
+                               ],
+                               "type": "object",
+                               "properties": {
+                                       "id": {
+                                               "type": "integer",
+                                               "format": "int64",
+                                               "example": 10
+                                       },
+                                       "name": {
+                                               "type": "string",
+                                               "example": "doggie"
+                                       },
+                                       "category": {
+                                               "$ref": 
"#/components/schemas/Category"
+                                       },
+                                       "photoUrls": {
+                                               "type": "array",
+                                               "xml": {
+                                                       "wrapped": true
+                                               },
+                                               "items": {
+                                                       "type": "string",
+                                                       "xml": {
+                                                               "name": 
"photoUrl"
+                                                       }
+                                               }
+                                       },
+                                       "tags": {
+                                               "type": "array",
+                                               "xml": {
+                                                       "wrapped": true
+                                               },
+                                               "items": {
+                                                       "$ref": 
"#/components/schemas/Tag"
+                                               }
+                                       },
+                                       "status": {
+                                               "type": "string",
+                                               "description": "pet status in 
the store",
+                                               "enum": [
+                                                       "available",
+                                                       "pending",
+                                                       "sold"
+                                               ]
+                                       }
+                               },
+                               "xml": {
+                                       "name": "pet"
+                               }
+                       },
+                       "ApiResponse": {
+                               "type": "object",
+                               "properties": {
+                                       "code": {
+                                               "type": "integer",
+                                               "format": "int32"
+                                       },
+                                       "type": {
+                                               "type": "string"
+                                       },
+                                       "message": {
+                                               "type": "string"
+                                       }
+                               },
+                               "xml": {
+                                       "name": "##default"
+                               }
+                       }
+               },
+               "requestBodies": {
+                       "Pet": {
+                               "description": "Pet object that needs to be 
added to the store",
+                               "content": {
+                                       "application/json": {
+                                               "schema": {
+                                                       "$ref": 
"#/components/schemas/Pet"
+                                               }
+                                       },
+                                       "application/xml": {
+                                               "schema": {
+                                                       "$ref": 
"#/components/schemas/Pet"
+                                               }
+                                       }
+                               }
+                       },
+                       "UserArray": {
+                               "description": "List of user object",
+                               "content": {
+                                       "application/json": {
+                                               "schema": {
+                                                       "type": "array",
+                                                       "items": {
+                                                               "$ref": 
"#/components/schemas/User"
+                                                       }
+                                               }
+                                       }
+                               }
+                       }
+               },
+               "securitySchemes": {
+                       "petstore_auth": {
+                               "type": "oauth2",
+                               "flows": {
+                                       "implicit": {
+                                               "authorizationUrl": 
"https://petstore3.swagger.io/oauth/authorize";,
+                                               "scopes": {
+                                                       "write:pets": "modify 
pets in your account",
+                                                       "read:pets": "read your 
pets"
+                                               }
+                                       }
+                               }
+                       },
+                       "api_key": {
+                               "type": "apiKey",
+                               "name": "api_key",
+                               "in": "header"
+                       }
+               }
+       }
+}
diff --git 
a/components/camel-rest-openapi/src/generated/resources/META-INF/org/apache/camel/component/rest/openapi/rest-openapi.json
 
b/components/camel-rest-openapi/src/generated/resources/META-INF/org/apache/camel/component/rest/openapi/rest-openapi.json
index b817e5a6551..0c3036935d0 100644
--- 
a/components/camel-rest-openapi/src/generated/resources/META-INF/org/apache/camel/component/rest/openapi/rest-openapi.json
+++ 
b/components/camel-rest-openapi/src/generated/resources/META-INF/org/apache/camel/component/rest/openapi/rest-openapi.json
@@ -39,7 +39,7 @@
     "useGlobalSslContextParameters": { "index": 13, "kind": "property", 
"displayName": "Use Global Ssl Context Parameters", "group": "security", 
"label": "security", "required": false, "type": "boolean", "javaType": 
"boolean", "deprecated": false, "autowired": false, "secret": false, 
"defaultValue": false, "description": "Enable usage of global SSL context 
parameters." }
   },
   "properties": {
-    "specificationUri": { "index": 0, "kind": "path", "displayName": 
"Specification Uri", "group": "producer", "label": "producer", "required": 
false, "type": "string", "javaType": "java.net.URI", "deprecated": false, 
"autowired": false, "secret": false, "defaultValue": "openapi.json", 
"description": "Path to the OpenApi specification file. The scheme, host base 
path are taken from this specification, but these can be overridden with 
properties on the component or endpoint level. If not  [...]
+    "specificationUri": { "index": 0, "kind": "path", "displayName": 
"Specification Uri", "group": "common", "label": "common", "required": false, 
"type": "string", "javaType": "java.net.URI", "deprecated": false, "autowired": 
false, "secret": false, "defaultValue": "openapi.json", "description": "Path to 
the OpenApi specification file. The scheme, host base path are taken from this 
specification, but these can be overridden with properties on the component or 
endpoint level. If not give [...]
     "operationId": { "index": 1, "kind": "path", "displayName": "Operation 
Id", "group": "producer", "label": "producer", "required": false, "type": 
"string", "javaType": "java.lang.String", "deprecated": false, "autowired": 
false, "secret": false, "description": "ID of the operation from the OpenApi 
specification. This is required when using producer" },
     "requestValidationEnabled": { "index": 2, "kind": "parameter", 
"displayName": "Request Validation Enabled", "group": "common", "label": "", 
"required": false, "type": "boolean", "javaType": "boolean", "deprecated": 
false, "autowired": false, "secret": false, "defaultValue": false, 
"description": "Enable validation of requests against the configured OpenAPI 
specification" },
     "bridgeErrorHandler": { "index": 3, "kind": "parameter", "displayName": 
"Bridge Error Handler", "group": "consumer (advanced)", "label": 
"consumer,advanced", "required": false, "type": "boolean", "javaType": 
"boolean", "deprecated": false, "autowired": false, "secret": false, 
"defaultValue": false, "description": "Allows for bridging the consumer to the 
Camel routing Error Handler, which mean any exceptions (if possible) occurred 
while the Camel consumer is trying to pickup incoming  [...]
diff --git 
a/components/camel-rest-openapi/src/main/java/org/apache/camel/component/rest/openapi/RestOpenApiComponent.java
 
b/components/camel-rest-openapi/src/main/java/org/apache/camel/component/rest/openapi/RestOpenApiComponent.java
index 497431226a8..019a40cae78 100644
--- 
a/components/camel-rest-openapi/src/main/java/org/apache/camel/component/rest/openapi/RestOpenApiComponent.java
+++ 
b/components/camel-rest-openapi/src/main/java/org/apache/camel/component/rest/openapi/RestOpenApiComponent.java
@@ -151,6 +151,8 @@ public final class RestOpenApiComponent extends 
DefaultComponent implements SSLC
     protected Endpoint createEndpoint(final String uri, final String 
remaining, final Map<String, Object> parameters)
             throws Exception {
         RestOpenApiEndpoint endpoint = new RestOpenApiEndpoint(uri, remaining, 
this, parameters);
+        
endpoint.setRequestValidationCustomizer(getRequestValidationCustomizer());
+        endpoint.setRequestValidationEnabled(isRequestValidationEnabled());
         
endpoint.setRequestValidationLevels(PropertiesHelper.extractProperties(parameters,
 "validation."));
         setProperties(endpoint, parameters);
         return endpoint;
diff --git 
a/components/camel-rest-openapi/src/main/java/org/apache/camel/component/rest/openapi/RestOpenApiEndpoint.java
 
b/components/camel-rest-openapi/src/main/java/org/apache/camel/component/rest/openapi/RestOpenApiEndpoint.java
index 4e54d21cd7f..c65a309d923 100644
--- 
a/components/camel-rest-openapi/src/main/java/org/apache/camel/component/rest/openapi/RestOpenApiEndpoint.java
+++ 
b/components/camel-rest-openapi/src/main/java/org/apache/camel/component/rest/openapi/RestOpenApiEndpoint.java
@@ -76,7 +76,6 @@ import org.apache.camel.support.DefaultEndpoint;
 import org.apache.camel.support.ResourceHelper;
 import org.apache.camel.util.FileUtil;
 import org.apache.camel.util.ObjectHelper;
-import org.apache.camel.util.StringHelper;
 import org.apache.camel.util.UnsafeUriCharactersEncoder;
 import org.apache.commons.io.FileUtils;
 import org.slf4j.Logger;
@@ -84,7 +83,6 @@ import org.slf4j.LoggerFactory;
 
 import static java.util.Optional.ofNullable;
 import static 
org.apache.camel.component.rest.openapi.RestOpenApiHelper.isHostParam;
-import static 
org.apache.camel.component.rest.openapi.RestOpenApiHelper.isMediaRange;
 import static org.apache.camel.util.ObjectHelper.isNotEmpty;
 import static org.apache.camel.util.ObjectHelper.notNull;
 import static org.apache.camel.util.StringHelper.after;
@@ -156,8 +154,8 @@ public final class RestOpenApiEndpoint extends 
DefaultEndpoint {
                            + " TLS/SSL certificates for https (such as setting 
a number of javax.net.ssl JVM system properties)."
                            + " How to do that consult the JDK documentation 
for UrlHandler.",
              defaultValue = RestOpenApiComponent.DEFAULT_SPECIFICATION_URI_STR,
-             defaultValueNote = "By default loads `openapi.json` file", label 
= "producer")
-    private URI specificationUri = 
RestOpenApiComponent.DEFAULT_SPECIFICATION_URI;
+             defaultValueNote = "By default loads `openapi.json` file", label 
= "common")
+    private URI specificationUri;
     @UriParam(description = "Enable validation of requests against the 
configured OpenAPI specification")
     private boolean requestValidationEnabled;
     @UriParam(description = "If request validation is enabled, this option 
provides the capability to customize"
@@ -179,12 +177,25 @@ public final class RestOpenApiEndpoint extends 
DefaultEndpoint {
         super(notEmpty(uri, "uri"), notNull(component, "component"));
         this.parameters = parameters;
 
-        specificationUri = before(remaining, "#", StringHelper::trimToNull)
-                .map(URI::create)
-                
.orElse(ofNullable(component.getSpecificationUri()).orElse(RestOpenApiComponent.DEFAULT_SPECIFICATION_URI));
-
-        operationId = ofNullable(after(remaining, "#")).orElse(remaining);
-
+        if (remaining.contains("#")) {
+            operationId = after(remaining, "#");
+            String spec = before(remaining, "#");
+            if (spec != null && !spec.isEmpty()) {
+                specificationUri = URI.create(spec);
+            }
+        } else {
+            if (remaining.endsWith(".json") || remaining.endsWith(".yaml") || 
remaining.endsWith(".yml")) {
+                specificationUri = URI.create(remaining);
+            } else {
+                operationId = remaining;
+            }
+        }
+        if (specificationUri == null) {
+            specificationUri = component.getSpecificationUri();
+        }
+        if (specificationUri == null) {
+            specificationUri = RestOpenApiComponent.DEFAULT_SPECIFICATION_URI;
+        }
         setExchangePattern(ExchangePattern.InOut);
     }
 
@@ -291,6 +302,7 @@ public final class RestOpenApiEndpoint extends 
DefaultEndpoint {
 
     @Override
     public Producer createProducer() throws Exception {
+
         final CamelContext camelContext = getCamelContext();
         final OpenAPI openapiDoc = loadSpecificationFrom(camelContext, 
specificationUri);
         final Paths paths = openapiDoc.getPaths();
@@ -371,7 +383,7 @@ public final class RestOpenApiEndpoint extends 
DefaultEndpoint {
     }
 
     public void setBasePath(final String basePath) {
-        this.basePath = notEmpty(basePath, "basePath");
+        this.basePath = basePath;
     }
 
     public void setComponentName(final String componentName) {
@@ -383,7 +395,7 @@ public final class RestOpenApiEndpoint extends 
DefaultEndpoint {
     }
 
     public void setConsumes(final String consumes) {
-        this.consumes = isMediaRange(consumes, "consumes");
+        this.consumes = consumes;
     }
 
     public void setHost(final String host) {
@@ -391,15 +403,15 @@ public final class RestOpenApiEndpoint extends 
DefaultEndpoint {
     }
 
     public void setOperationId(final String operationId) {
-        this.operationId = notEmpty(operationId, "operationId");
+        this.operationId = operationId;
     }
 
     public void setProduces(final String produces) {
-        this.produces = isMediaRange(produces, "produces");
+        this.produces = produces;
     }
 
     public void setSpecificationUri(final URI specificationUri) {
-        this.specificationUri = notNull(specificationUri, "specificationUri");
+        this.specificationUri = specificationUri;
     }
 
     public void setRequestValidationCustomizer(
diff --git 
a/components/camel-rest-openapi/src/main/java/org/apache/camel/component/rest/openapi/RestOpenApiProcessor.java
 
b/components/camel-rest-openapi/src/main/java/org/apache/camel/component/rest/openapi/RestOpenApiProcessor.java
index 737f14c2643..98409220064 100644
--- 
a/components/camel-rest-openapi/src/main/java/org/apache/camel/component/rest/openapi/RestOpenApiProcessor.java
+++ 
b/components/camel-rest-openapi/src/main/java/org/apache/camel/component/rest/openapi/RestOpenApiProcessor.java
@@ -17,6 +17,8 @@
 package org.apache.camel.component.rest.openapi;
 
 import io.swagger.v3.oas.models.OpenAPI;
+import org.apache.camel.AsyncCallback;
+import org.apache.camel.Exchange;
 import org.apache.camel.Processor;
 import org.apache.camel.support.processor.DelegateAsyncProcessor;
 
@@ -30,4 +32,11 @@ public class RestOpenApiProcessor extends 
DelegateAsyncProcessor {
         this.basePath = basePath;
         this.openAPI = openAPI;
     }
+
+    @Override
+    public boolean process(Exchange exchange, AsyncCallback callback) {
+        // what operation to invoke
+        exchange.getMessage().setBody("I was here");
+        return super.process(exchange, callback);
+    }
 }


Reply via email to