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

zhfeng pushed a commit to branch camel-quarkus-main
in repository https://gitbox.apache.org/repos/asf/camel-quarkus-examples.git

commit 3a926e7e7deb7208aa78b47c559527a94f1da517
Author: Zheng Feng <[email protected]>
AuthorDate: Thu May 23 16:58:47 2024 +0800

    Add openapi-contract-first example
---
 docs/modules/ROOT/attachments/examples.json        |    5 +
 openapi-contract-first/README.adoc                 |   87 ++
 .../eclipse-formatter-config.xml                   |  276 +++++
 openapi-contract-first/pom.xml                     |  288 +++++
 .../openapi/contract/first/PetStoreRoute.java      |   59 +
 .../src/main/openapi/petstore.json                 | 1240 ++++++++++++++++++++
 .../src/main/resources/application.properties      |   23 +
 .../first/ExamplesOpenapiContractFirstIT.java      |   24 +
 .../first/ExamplesOpenapiContractFirstTest.java    |   38 +
 9 files changed, 2040 insertions(+)

diff --git a/docs/modules/ROOT/attachments/examples.json 
b/docs/modules/ROOT/attachments/examples.json
index 436a87d..1db0eb9 100644
--- a/docs/modules/ROOT/attachments/examples.json
+++ b/docs/modules/ROOT/attachments/examples.json
@@ -79,6 +79,11 @@
     "description": "Demonstrates how to add support for metrics, health checks 
and distributed tracing",
     "link": 
"https://github.com/apache/camel-quarkus-examples/tree/main/observability";
   },
+  {
+    "title": "OpenAPI Contract First",
+    "description": "Shows how to run with Contract First OpenAPI.",
+    "link": 
"https://github.com/apache/camel-quarkus-examples/tree/main/openapi-contract-first";
+  },
   {
     "title": "Platform HTTP security with Keycloak",
     "description": "Shows how to secure platform HTTP with Keycloak",
diff --git a/openapi-contract-first/README.adoc 
b/openapi-contract-first/README.adoc
new file mode 100644
index 0000000..fb3b950
--- /dev/null
+++ b/openapi-contract-first/README.adoc
@@ -0,0 +1,87 @@
+= OpenAPI Contract First: A Camel Quarkus example
+:cq-example-description: An example that shows how to run with Contract First 
OpenAPI.
+
+{cq-description}
+
+This example uses Camel to expose REST APIs from an existing OpenAPI 
specification (contract first).
+
+From the contract we generate Java POJO classes (using quarkus-maven-plugin, 
see `pom.xml`).
+
+In the Camel route `PetStoreRoute.java` we use Rest DSL using OpenAPI in 
contract-first mode.
+This makes it possible to expose all the APIs very easily, and map this to 
corresponding Camel
+routes via `direct:operationId` naming convention.
+
+The example uses the Petstore OpenAPI example which comes with 18 APIs. This 
example has only
+implemented 2 of these APIs, and to ignore the remaining APIs. This is handy 
during development,
+so you can implement the APIs one by one.
+
+TIP: Check the 
https://camel.apache.org/camel-quarkus/latest/first-steps.html[Camel Quarkus 
User guide] for prerequisites
+and other general information.
+
+== Start in the Development mode
+
+[source,shell]
+----
+$ mvn clean compile quarkus:dev
+----
+
+The above command compiles the project, starts the application and lets the 
Quarkus tooling watch for changes in your
+workspace. Any modifications in your project will automatically take effect in 
the running application.
+
+TIP: Please refer to the Development mode section of
+https://camel.apache.org/camel-quarkus/latest/first-steps.html#_development_mode[Camel
 Quarkus User guide] for more details.
+
+// TODO: Describe how the user should interact with the example here
+
+=== Package and run the application
+
+Once you are done with developing you may want to package and run the 
application.
+
+TIP: Find more details about the JVM mode and Native mode in the Package and 
run section of
+https://camel.apache.org/camel-quarkus/latest/first-steps.html#_package_and_run_the_application[Camel
 Quarkus User guide]
+
+==== JVM mode
+
+[source,shell]
+----
+$ mvn clean package
+$ java -jar target/quarkus-app/quarkus-run.jar
+...
+[io.quarkus] (main) camel-quarkus-examples-... started in 1.163s.
+----
+
+==== Native mode
+
+IMPORTANT: Native mode requires having GraalVM and other tools installed. 
Please check the Prerequisites section
+of 
https://camel.apache.org/camel-quarkus/latest/first-steps.html#_prerequisites[Camel
 Quarkus User guide].
+
+To prepare a native executable using GraalVM, run the following command:
+
+[source,shell]
+----
+$ mvn clean package -Pnative
+$ ./target/*-runner
+...
+[io.quarkus] (main) camel-quarkus-examples-... started in 0.013s.
+...
+----
+
+==== How to run
+
+Test the service endpoint from another terminal:
+
+[source,shell]
+----
+curl http://localhost:8080/api/v3/pet/123
+----
+
+You should get some results like:
+[source]
+----
+{"id":123,"name":"Tony the tiger","photoUrls":[],"status":"available"}
+----
+
+
+== Feedback
+
+Please report bugs and propose improvements via 
https://github.com/apache/camel-quarkus/issues[GitHub issues of Camel Quarkus] 
project.
diff --git a/openapi-contract-first/eclipse-formatter-config.xml 
b/openapi-contract-first/eclipse-formatter-config.xml
new file mode 100644
index 0000000..2248b2b
--- /dev/null
+++ b/openapi-contract-first/eclipse-formatter-config.xml
@@ -0,0 +1,276 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!--
+
+    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.
+
+-->
+<profiles version="8">
+    <profile name="Camel Java Conventions" version="8" 
kind="CodeFormatterProfile">
+        <setting 
id="org.eclipse.jdt.core.formatter.align_type_members_on_columns" 
value="false"/>
+        <setting 
id="org.eclipse.jdt.core.formatter.alignment_for_arguments_in_allocation_expression"
 value="16"/>
+        <setting 
id="org.eclipse.jdt.core.formatter.alignment_for_arguments_in_enum_constant" 
value="16"/>
+        <setting 
id="org.eclipse.jdt.core.formatter.alignment_for_arguments_in_explicit_constructor_call"
 value="16"/>
+        <setting 
id="org.eclipse.jdt.core.formatter.alignment_for_arguments_in_method_invocation"
 value="16"/>
+        <setting 
id="org.eclipse.jdt.core.formatter.alignment_for_arguments_in_qualified_allocation_expression"
 value="16"/>
+        <setting 
id="org.eclipse.jdt.core.formatter.alignment_for_binary_expression" value="16"/>
+        <setting id="org.eclipse.jdt.core.formatter.alignment_for_compact_if" 
value="16"/>
+        <setting 
id="org.eclipse.jdt.core.formatter.alignment_for_conditional_expression" 
value="16"/>
+        <setting 
id="org.eclipse.jdt.core.formatter.alignment_for_enum_constants" value="16"/>
+        <setting 
id="org.eclipse.jdt.core.formatter.alignment_for_expressions_in_array_initializer"
 value="16"/>
+        <setting 
id="org.eclipse.jdt.core.formatter.alignment_for_multiple_fields" value="16"/>
+        <setting 
id="org.eclipse.jdt.core.formatter.alignment_for_parameters_in_constructor_declaration"
 value="16"/>
+        <setting 
id="org.eclipse.jdt.core.formatter.alignment_for_parameters_in_method_declaration"
 value="16"/>
+        <setting 
id="org.eclipse.jdt.core.formatter.alignment_for_selector_in_method_invocation" 
value="16"/>
+        <setting 
id="org.eclipse.jdt.core.formatter.alignment_for_superclass_in_type_declaration"
 value="16"/>
+        <setting 
id="org.eclipse.jdt.core.formatter.alignment_for_superinterfaces_in_enum_declaration"
 value="16"/>
+        <setting 
id="org.eclipse.jdt.core.formatter.alignment_for_superinterfaces_in_type_declaration"
 value="16"/>
+        <setting 
id="org.eclipse.jdt.core.formatter.alignment_for_throws_clause_in_constructor_declaration"
 value="16"/>
+        <setting 
id="org.eclipse.jdt.core.formatter.alignment_for_throws_clause_in_method_declaration"
 value="16"/>
+        <setting id="org.eclipse.jdt.core.formatter.blank_lines_after_imports" 
value="1"/>
+        <setting id="org.eclipse.jdt.core.formatter.blank_lines_after_package" 
value="1"/>
+        <setting id="org.eclipse.jdt.core.formatter.blank_lines_before_field" 
value="0"/>
+        <setting 
id="org.eclipse.jdt.core.formatter.blank_lines_before_first_class_body_declaration"
 value="0"/>
+        <setting 
id="org.eclipse.jdt.core.formatter.blank_lines_before_imports" value="1"/>
+        <setting 
id="org.eclipse.jdt.core.formatter.blank_lines_before_member_type" value="1"/>
+        <setting id="org.eclipse.jdt.core.formatter.blank_lines_before_method" 
value="1"/>
+        <setting 
id="org.eclipse.jdt.core.formatter.blank_lines_before_new_chunk" value="1"/>
+        <setting 
id="org.eclipse.jdt.core.formatter.blank_lines_before_package" value="0"/>
+        <setting 
id="org.eclipse.jdt.core.formatter.blank_lines_between_type_declarations" 
value="1"/>
+        <setting 
id="org.eclipse.jdt.core.formatter.brace_position_for_annotation_type_declaration"
 value="end_of_line"/>
+        <setting 
id="org.eclipse.jdt.core.formatter.brace_position_for_anonymous_type_declaration"
 value="end_of_line"/>
+        <setting 
id="org.eclipse.jdt.core.formatter.brace_position_for_array_initializer" 
value="end_of_line"/>
+        <setting id="org.eclipse.jdt.core.formatter.brace_position_for_block" 
value="end_of_line"/>
+        <setting 
id="org.eclipse.jdt.core.formatter.brace_position_for_block_in_case" 
value="end_of_line"/>
+        <setting 
id="org.eclipse.jdt.core.formatter.brace_position_for_constructor_declaration" 
value="end_of_line"/>
+        <setting 
id="org.eclipse.jdt.core.formatter.brace_position_for_enum_constant" 
value="end_of_line"/>
+        <setting 
id="org.eclipse.jdt.core.formatter.brace_position_for_enum_declaration" 
value="end_of_line"/>
+        <setting 
id="org.eclipse.jdt.core.formatter.brace_position_for_method_declaration" 
value="end_of_line"/>
+        <setting id="org.eclipse.jdt.core.formatter.brace_position_for_switch" 
value="end_of_line"/>
+        <setting 
id="org.eclipse.jdt.core.formatter.brace_position_for_type_declaration" 
value="end_of_line"/>
+        <setting 
id="org.eclipse.jdt.core.formatter.comment.align_tags_names_descriptions" 
value="true"/>
+        <setting 
id="org.eclipse.jdt.core.formatter.comment.align_tags_descriptions_grouped" 
value="false"/>
+        <setting id="org.eclipse.jdt.core.formatter.comment.clear_blank_lines" 
value="false"/>
+        <setting 
id="org.eclipse.jdt.core.formatter.comment.format_block_comments" 
value="false"/>
+        <setting id="org.eclipse.jdt.core.formatter.comment.format_comments" 
value="true"/>
+        <setting id="org.eclipse.jdt.core.formatter.comment.format_header" 
value="false"/>
+        <setting id="org.eclipse.jdt.core.formatter.comment.format_html" 
value="true"/>
+        <setting 
id="org.eclipse.jdt.core.formatter.comment.format_javadoc_comments" 
value="true"/>
+        <setting 
id="org.eclipse.jdt.core.formatter.comment.format_line_comments" value="false"/>
+        <setting 
id="org.eclipse.jdt.core.formatter.comment.format_source_code" value="true"/>
+        <setting 
id="org.eclipse.jdt.core.formatter.comment.indent_parameter_description" 
value="false"/>
+        <setting 
id="org.eclipse.jdt.core.formatter.comment.indent_return_description" 
value="false"/>
+        <setting id="org.eclipse.jdt.core.formatter.comment.indent_root_tags" 
value="false"/>
+        <setting 
id="org.eclipse.jdt.core.formatter.comment.insert_new_line_before_root_tags" 
value="insert"/>
+        <setting 
id="org.eclipse.jdt.core.formatter.comment.insert_new_line_for_parameter" 
value="do not insert"/>
+        <setting id="org.eclipse.jdt.core.formatter.comment.line_length" 
value="120"/>
+        <setting id="org.eclipse.jdt.core.formatter.compact_else_if" 
value="true"/>
+        <setting id="org.eclipse.jdt.core.formatter.continuation_indentation" 
value="2"/>
+        <setting 
id="org.eclipse.jdt.core.formatter.continuation_indentation_for_array_initializer"
 value="2"/>
+        <setting 
id="org.eclipse.jdt.core.formatter.format_guardian_clause_on_one_line" 
value="false"/>
+        <setting 
id="org.eclipse.jdt.core.formatter.indent_body_declarations_compare_to_enum_constant_header"
 value="true"/>
+        <setting 
id="org.eclipse.jdt.core.formatter.indent_body_declarations_compare_to_enum_declaration_header"
 value="true"/>
+        <setting 
id="org.eclipse.jdt.core.formatter.indent_body_declarations_compare_to_type_header"
 value="true"/>
+        <setting 
id="org.eclipse.jdt.core.formatter.indent_breaks_compare_to_cases" 
value="true"/>
+        <setting 
id="org.eclipse.jdt.core.formatter.indent_statements_compare_to_block" 
value="true"/>
+        <setting 
id="org.eclipse.jdt.core.formatter.indent_statements_compare_to_body" 
value="true"/>
+        <setting 
id="org.eclipse.jdt.core.formatter.indent_switchstatements_compare_to_cases" 
value="true"/>
+        <setting 
id="org.eclipse.jdt.core.formatter.indent_switchstatements_compare_to_switch" 
value="false"/>
+        <setting id="org.eclipse.jdt.core.formatter.indentation.size" 
value="8"/>
+        <setting 
id="org.eclipse.jdt.core.formatter.insert_new_line_after_annotation" 
value="insert"/>
+        <setting 
id="org.eclipse.jdt.core.formatter.insert_new_line_after_annotation_on_parameter"
 value="do not insert"/>
+        <setting 
id="org.eclipse.jdt.core.formatter.insert_new_line_after_opening_brace_in_array_initializer"
 value="do not insert"/>
+        <setting 
id="org.eclipse.jdt.core.formatter.insert_new_line_at_end_of_file_if_missing" 
value="insert"/>
+        <setting 
id="org.eclipse.jdt.core.formatter.insert_new_line_before_catch_in_try_statement"
 value="do not insert"/>
+        <setting 
id="org.eclipse.jdt.core.formatter.insert_new_line_before_closing_brace_in_array_initializer"
 value="do not insert"/>
+        <setting 
id="org.eclipse.jdt.core.formatter.insert_new_line_before_else_in_if_statement" 
value="do not insert"/>
+        <setting 
id="org.eclipse.jdt.core.formatter.insert_new_line_before_finally_in_try_statement"
 value="do not insert"/>
+        <setting 
id="org.eclipse.jdt.core.formatter.insert_new_line_before_while_in_do_statement"
 value="do not insert"/>
+        <setting 
id="org.eclipse.jdt.core.formatter.insert_new_line_in_empty_anonymous_type_declaration"
 value="insert"/>
+        <setting 
id="org.eclipse.jdt.core.formatter.insert_new_line_in_empty_block" 
value="insert"/>
+        <setting 
id="org.eclipse.jdt.core.formatter.insert_new_line_in_empty_enum_constant" 
value="insert"/>
+        <setting 
id="org.eclipse.jdt.core.formatter.insert_new_line_in_empty_enum_declaration" 
value="insert"/>
+        <setting 
id="org.eclipse.jdt.core.formatter.insert_new_line_in_empty_method_body" 
value="insert"/>
+        <setting 
id="org.eclipse.jdt.core.formatter.insert_new_line_in_empty_type_declaration" 
value="insert"/>
+        <setting 
id="org.eclipse.jdt.core.formatter.insert_space_after_and_in_type_parameter" 
value="insert"/>
+        <setting 
id="org.eclipse.jdt.core.formatter.insert_space_after_assignment_operator" 
value="insert"/>
+        <setting 
id="org.eclipse.jdt.core.formatter.insert_space_after_at_in_annotation" 
value="do not insert"/>
+        <setting 
id="org.eclipse.jdt.core.formatter.insert_space_after_at_in_annotation_type_declaration"
 value="do not insert"/>
+        <setting 
id="org.eclipse.jdt.core.formatter.insert_space_after_binary_operator" 
value="insert"/>
+        <setting 
id="org.eclipse.jdt.core.formatter.insert_space_after_closing_angle_bracket_in_type_arguments"
 value="insert"/>
+        <setting 
id="org.eclipse.jdt.core.formatter.insert_space_after_closing_angle_bracket_in_type_parameters"
 value="insert"/>
+        <setting 
id="org.eclipse.jdt.core.formatter.insert_space_after_closing_brace_in_block" 
value="insert"/>
+        <setting 
id="org.eclipse.jdt.core.formatter.insert_space_after_closing_paren_in_cast" 
value="insert"/>
+        <setting 
id="org.eclipse.jdt.core.formatter.insert_space_after_colon_in_assert" 
value="insert"/>
+        <setting 
id="org.eclipse.jdt.core.formatter.insert_space_after_colon_in_case" 
value="insert"/>
+        <setting 
id="org.eclipse.jdt.core.formatter.insert_space_after_colon_in_conditional" 
value="insert"/>
+        <setting 
id="org.eclipse.jdt.core.formatter.insert_space_after_colon_in_for" 
value="insert"/>
+        <setting 
id="org.eclipse.jdt.core.formatter.insert_space_after_colon_in_labeled_statement"
 value="insert"/>
+        <setting 
id="org.eclipse.jdt.core.formatter.insert_space_after_comma_in_allocation_expression"
 value="insert"/>
+        <setting 
id="org.eclipse.jdt.core.formatter.insert_space_after_comma_in_annotation" 
value="insert"/>
+        <setting 
id="org.eclipse.jdt.core.formatter.insert_space_after_comma_in_array_initializer"
 value="insert"/>
+        <setting 
id="org.eclipse.jdt.core.formatter.insert_space_after_comma_in_constructor_declaration_parameters"
 value="insert"/>
+        <setting 
id="org.eclipse.jdt.core.formatter.insert_space_after_comma_in_constructor_declaration_throws"
 value="insert"/>
+        <setting 
id="org.eclipse.jdt.core.formatter.insert_space_after_comma_in_enum_constant_arguments"
 value="insert"/>
+        <setting 
id="org.eclipse.jdt.core.formatter.insert_space_after_comma_in_enum_declarations"
 value="insert"/>
+        <setting 
id="org.eclipse.jdt.core.formatter.insert_space_after_comma_in_explicitconstructorcall_arguments"
 value="insert"/>
+        <setting 
id="org.eclipse.jdt.core.formatter.insert_space_after_comma_in_for_increments" 
value="insert"/>
+        <setting 
id="org.eclipse.jdt.core.formatter.insert_space_after_comma_in_for_inits" 
value="insert"/>
+        <setting 
id="org.eclipse.jdt.core.formatter.insert_space_after_comma_in_method_declaration_parameters"
 value="insert"/>
+        <setting 
id="org.eclipse.jdt.core.formatter.insert_space_after_comma_in_method_declaration_throws"
 value="insert"/>
+        <setting 
id="org.eclipse.jdt.core.formatter.insert_space_after_comma_in_method_invocation_arguments"
 value="insert"/>
+        <setting 
id="org.eclipse.jdt.core.formatter.insert_space_after_comma_in_multiple_field_declarations"
 value="insert"/>
+        <setting 
id="org.eclipse.jdt.core.formatter.insert_space_after_comma_in_multiple_local_declarations"
 value="insert"/>
+        <setting 
id="org.eclipse.jdt.core.formatter.insert_space_after_comma_in_parameterized_type_reference"
 value="insert"/>
+        <setting 
id="org.eclipse.jdt.core.formatter.insert_space_after_comma_in_superinterfaces" 
value="insert"/>
+        <setting 
id="org.eclipse.jdt.core.formatter.insert_space_after_comma_in_type_arguments" 
value="insert"/>
+        <setting 
id="org.eclipse.jdt.core.formatter.insert_space_after_comma_in_type_parameters" 
value="insert"/>
+        <setting 
id="org.eclipse.jdt.core.formatter.insert_space_after_ellipsis" value="insert"/>
+        <setting 
id="org.eclipse.jdt.core.formatter.insert_space_after_opening_angle_bracket_in_parameterized_type_reference"
 value="do not insert"/>
+        <setting 
id="org.eclipse.jdt.core.formatter.insert_space_after_opening_angle_bracket_in_type_arguments"
 value="do not insert"/>
+        <setting 
id="org.eclipse.jdt.core.formatter.insert_space_after_opening_angle_bracket_in_type_parameters"
 value="do not insert"/>
+        <setting 
id="org.eclipse.jdt.core.formatter.insert_space_after_opening_brace_in_array_initializer"
 value="insert"/>
+        <setting 
id="org.eclipse.jdt.core.formatter.insert_space_after_opening_bracket_in_array_allocation_expression"
 value="do not insert"/>
+        <setting 
id="org.eclipse.jdt.core.formatter.insert_space_after_opening_bracket_in_array_reference"
 value="do not insert"/>
+        <setting 
id="org.eclipse.jdt.core.formatter.insert_space_after_opening_paren_in_annotation"
 value="do not insert"/>
+        <setting 
id="org.eclipse.jdt.core.formatter.insert_space_after_opening_paren_in_cast" 
value="do not insert"/>
+        <setting 
id="org.eclipse.jdt.core.formatter.insert_space_after_opening_paren_in_catch" 
value="do not insert"/>
+        <setting 
id="org.eclipse.jdt.core.formatter.insert_space_after_opening_paren_in_constructor_declaration"
 value="do not insert"/>
+        <setting 
id="org.eclipse.jdt.core.formatter.insert_space_after_opening_paren_in_enum_constant"
 value="do not insert"/>
+        <setting 
id="org.eclipse.jdt.core.formatter.insert_space_after_opening_paren_in_for" 
value="do not insert"/>
+        <setting 
id="org.eclipse.jdt.core.formatter.insert_space_after_opening_paren_in_if" 
value="do not insert"/>
+        <setting 
id="org.eclipse.jdt.core.formatter.insert_space_after_opening_paren_in_method_declaration"
 value="do not insert"/>
+        <setting 
id="org.eclipse.jdt.core.formatter.insert_space_after_opening_paren_in_method_invocation"
 value="do not insert"/>
+        <setting 
id="org.eclipse.jdt.core.formatter.insert_space_after_opening_paren_in_parenthesized_expression"
 value="do not insert"/>
+        <setting 
id="org.eclipse.jdt.core.formatter.insert_space_after_opening_paren_in_switch" 
value="do not insert"/>
+        <setting 
id="org.eclipse.jdt.core.formatter.insert_space_after_opening_paren_in_synchronized"
 value="do not insert"/>
+        <setting 
id="org.eclipse.jdt.core.formatter.insert_space_after_opening_paren_in_while" 
value="do not insert"/>
+        <setting 
id="org.eclipse.jdt.core.formatter.insert_space_after_postfix_operator" 
value="do not insert"/>
+        <setting 
id="org.eclipse.jdt.core.formatter.insert_space_after_prefix_operator" 
value="do not insert"/>
+        <setting 
id="org.eclipse.jdt.core.formatter.insert_space_after_question_in_conditional" 
value="insert"/>
+        <setting 
id="org.eclipse.jdt.core.formatter.insert_space_after_question_in_wildcard" 
value="do not insert"/>
+        <setting 
id="org.eclipse.jdt.core.formatter.insert_space_after_semicolon_in_for" 
value="insert"/>
+        <setting 
id="org.eclipse.jdt.core.formatter.insert_space_after_unary_operator" value="do 
not insert"/>
+        <setting 
id="org.eclipse.jdt.core.formatter.insert_space_before_and_in_type_parameter" 
value="insert"/>
+        <setting 
id="org.eclipse.jdt.core.formatter.insert_space_before_assignment_operator" 
value="insert"/>
+        <setting 
id="org.eclipse.jdt.core.formatter.insert_space_before_at_in_annotation_type_declaration"
 value="insert"/>
+        <setting 
id="org.eclipse.jdt.core.formatter.insert_space_before_binary_operator" 
value="insert"/>
+        <setting 
id="org.eclipse.jdt.core.formatter.insert_space_before_closing_angle_bracket_in_parameterized_type_reference"
 value="do not insert"/>
+        <setting 
id="org.eclipse.jdt.core.formatter.insert_space_before_closing_angle_bracket_in_type_arguments"
 value="do not insert"/>
+        <setting 
id="org.eclipse.jdt.core.formatter.insert_space_before_closing_angle_bracket_in_type_parameters"
 value="do not insert"/>
+        <setting 
id="org.eclipse.jdt.core.formatter.insert_space_before_closing_brace_in_array_initializer"
 value="insert"/>
+        <setting 
id="org.eclipse.jdt.core.formatter.insert_space_before_closing_bracket_in_array_allocation_expression"
 value="do not insert"/>
+        <setting 
id="org.eclipse.jdt.core.formatter.insert_space_before_closing_bracket_in_array_reference"
 value="do not insert"/>
+        <setting 
id="org.eclipse.jdt.core.formatter.insert_space_before_closing_paren_in_annotation"
 value="do not insert"/>
+        <setting 
id="org.eclipse.jdt.core.formatter.insert_space_before_closing_paren_in_cast" 
value="do not insert"/>
+        <setting 
id="org.eclipse.jdt.core.formatter.insert_space_before_closing_paren_in_catch" 
value="do not insert"/>
+        <setting 
id="org.eclipse.jdt.core.formatter.insert_space_before_closing_paren_in_constructor_declaration"
 value="do not insert"/>
+        <setting 
id="org.eclipse.jdt.core.formatter.insert_space_before_closing_paren_in_enum_constant"
 value="do not insert"/>
+        <setting 
id="org.eclipse.jdt.core.formatter.insert_space_before_closing_paren_in_for" 
value="do not insert"/>
+        <setting 
id="org.eclipse.jdt.core.formatter.insert_space_before_closing_paren_in_if" 
value="do not insert"/>
+        <setting 
id="org.eclipse.jdt.core.formatter.insert_space_before_closing_paren_in_method_declaration"
 value="do not insert"/>
+        <setting 
id="org.eclipse.jdt.core.formatter.insert_space_before_closing_paren_in_method_invocation"
 value="do not insert"/>
+        <setting 
id="org.eclipse.jdt.core.formatter.insert_space_before_closing_paren_in_parenthesized_expression"
 value="do not insert"/>
+        <setting 
id="org.eclipse.jdt.core.formatter.insert_space_before_closing_paren_in_switch" 
value="do not insert"/>
+        <setting 
id="org.eclipse.jdt.core.formatter.insert_space_before_closing_paren_in_synchronized"
 value="do not insert"/>
+        <setting 
id="org.eclipse.jdt.core.formatter.insert_space_before_closing_paren_in_while" 
value="do not insert"/>
+        <setting 
id="org.eclipse.jdt.core.formatter.insert_space_before_colon_in_assert" 
value="insert"/>
+        <setting 
id="org.eclipse.jdt.core.formatter.insert_space_before_colon_in_case" value="do 
not insert"/>
+        <setting 
id="org.eclipse.jdt.core.formatter.insert_space_before_colon_in_conditional" 
value="insert"/>
+        <setting 
id="org.eclipse.jdt.core.formatter.insert_space_before_colon_in_default" 
value="do not insert"/>
+        <setting 
id="org.eclipse.jdt.core.formatter.insert_space_before_colon_in_for" 
value="insert"/>
+        <setting 
id="org.eclipse.jdt.core.formatter.insert_space_before_colon_in_labeled_statement"
 value="do not insert"/>
+        <setting 
id="org.eclipse.jdt.core.formatter.insert_space_before_comma_in_allocation_expression"
 value="do not insert"/>
+        <setting 
id="org.eclipse.jdt.core.formatter.insert_space_before_comma_in_annotation" 
value="do not insert"/>
+        <setting 
id="org.eclipse.jdt.core.formatter.insert_space_before_comma_in_array_initializer"
 value="do not insert"/>
+        <setting 
id="org.eclipse.jdt.core.formatter.insert_space_before_comma_in_constructor_declaration_parameters"
 value="do not insert"/>
+        <setting 
id="org.eclipse.jdt.core.formatter.insert_space_before_comma_in_constructor_declaration_throws"
 value="do not insert"/>
+        <setting 
id="org.eclipse.jdt.core.formatter.insert_space_before_comma_in_enum_constant_arguments"
 value="do not insert"/>
+        <setting 
id="org.eclipse.jdt.core.formatter.insert_space_before_comma_in_enum_declarations"
 value="do not insert"/>
+        <setting 
id="org.eclipse.jdt.core.formatter.insert_space_before_comma_in_explicitconstructorcall_arguments"
 value="do not insert"/>
+        <setting 
id="org.eclipse.jdt.core.formatter.insert_space_before_comma_in_for_increments" 
value="do not insert"/>
+        <setting 
id="org.eclipse.jdt.core.formatter.insert_space_before_comma_in_for_inits" 
value="do not insert"/>
+        <setting 
id="org.eclipse.jdt.core.formatter.insert_space_before_comma_in_method_declaration_parameters"
 value="do not insert"/>
+        <setting 
id="org.eclipse.jdt.core.formatter.insert_space_before_comma_in_method_declaration_throws"
 value="do not insert"/>
+        <setting 
id="org.eclipse.jdt.core.formatter.insert_space_before_comma_in_method_invocation_arguments"
 value="do not insert"/>
+        <setting 
id="org.eclipse.jdt.core.formatter.insert_space_before_comma_in_multiple_field_declarations"
 value="do not insert"/>
+        <setting 
id="org.eclipse.jdt.core.formatter.insert_space_before_comma_in_multiple_local_declarations"
 value="do not insert"/>
+        <setting 
id="org.eclipse.jdt.core.formatter.insert_space_before_comma_in_parameterized_type_reference"
 value="do not insert"/>
+        <setting 
id="org.eclipse.jdt.core.formatter.insert_space_before_comma_in_superinterfaces"
 value="do not insert"/>
+        <setting 
id="org.eclipse.jdt.core.formatter.insert_space_before_comma_in_type_arguments" 
value="do not insert"/>
+        <setting 
id="org.eclipse.jdt.core.formatter.insert_space_before_comma_in_type_parameters"
 value="do not insert"/>
+        <setting 
id="org.eclipse.jdt.core.formatter.insert_space_before_ellipsis" value="do not 
insert"/>
+        <setting 
id="org.eclipse.jdt.core.formatter.insert_space_before_opening_angle_bracket_in_parameterized_type_reference"
 value="do not insert"/>
+        <setting 
id="org.eclipse.jdt.core.formatter.insert_space_before_opening_angle_bracket_in_type_arguments"
 value="do not insert"/>
+        <setting 
id="org.eclipse.jdt.core.formatter.insert_space_before_opening_angle_bracket_in_type_parameters"
 value="do not insert"/>
+        <setting 
id="org.eclipse.jdt.core.formatter.insert_space_before_opening_brace_in_annotation_type_declaration"
 value="insert"/>
+        <setting 
id="org.eclipse.jdt.core.formatter.insert_space_before_opening_brace_in_anonymous_type_declaration"
 value="insert"/>
+        <setting 
id="org.eclipse.jdt.core.formatter.insert_space_before_opening_brace_in_array_initializer"
 value="insert"/>
+        <setting 
id="org.eclipse.jdt.core.formatter.insert_space_before_opening_brace_in_block" 
value="insert"/>
+        <setting 
id="org.eclipse.jdt.core.formatter.insert_space_before_opening_brace_in_constructor_declaration"
 value="insert"/>
+        <setting 
id="org.eclipse.jdt.core.formatter.insert_space_before_opening_brace_in_enum_constant"
 value="insert"/>
+        <setting 
id="org.eclipse.jdt.core.formatter.insert_space_before_opening_brace_in_enum_declaration"
 value="insert"/>
+        <setting 
id="org.eclipse.jdt.core.formatter.insert_space_before_opening_brace_in_method_declaration"
 value="insert"/>
+        <setting 
id="org.eclipse.jdt.core.formatter.insert_space_before_opening_brace_in_switch" 
value="insert"/>
+        <setting 
id="org.eclipse.jdt.core.formatter.insert_space_before_opening_brace_in_type_declaration"
 value="insert"/>
+        <setting 
id="org.eclipse.jdt.core.formatter.insert_space_before_opening_bracket_in_array_allocation_expression"
 value="do not insert"/>
+        <setting 
id="org.eclipse.jdt.core.formatter.insert_space_before_opening_bracket_in_array_reference"
 value="do not insert"/>
+        <setting 
id="org.eclipse.jdt.core.formatter.insert_space_before_opening_bracket_in_array_type_reference"
 value="do not insert"/>
+        <setting 
id="org.eclipse.jdt.core.formatter.insert_space_before_opening_paren_in_annotation"
 value="do not insert"/>
+        <setting 
id="org.eclipse.jdt.core.formatter.insert_space_before_opening_paren_in_annotation_type_member_declaration"
 value="do not insert"/>
+        <setting 
id="org.eclipse.jdt.core.formatter.insert_space_before_opening_paren_in_catch" 
value="insert"/>
+        <setting 
id="org.eclipse.jdt.core.formatter.insert_space_before_opening_paren_in_constructor_declaration"
 value="do not insert"/>
+        <setting 
id="org.eclipse.jdt.core.formatter.insert_space_before_opening_paren_in_enum_constant"
 value="do not insert"/>
+        <setting 
id="org.eclipse.jdt.core.formatter.insert_space_before_opening_paren_in_for" 
value="insert"/>
+        <setting 
id="org.eclipse.jdt.core.formatter.insert_space_before_opening_paren_in_if" 
value="insert"/>
+        <setting 
id="org.eclipse.jdt.core.formatter.insert_space_before_opening_paren_in_method_declaration"
 value="do not insert"/>
+        <setting 
id="org.eclipse.jdt.core.formatter.insert_space_before_opening_paren_in_method_invocation"
 value="do not insert"/>
+        <setting 
id="org.eclipse.jdt.core.formatter.insert_space_before_opening_paren_in_parenthesized_expression"
 value="do not insert"/>
+        <setting 
id="org.eclipse.jdt.core.formatter.insert_space_before_opening_paren_in_switch" 
value="insert"/>
+        <setting 
id="org.eclipse.jdt.core.formatter.insert_space_before_opening_paren_in_synchronized"
 value="insert"/>
+        <setting 
id="org.eclipse.jdt.core.formatter.insert_space_before_opening_paren_in_while" 
value="insert"/>
+        <setting 
id="org.eclipse.jdt.core.formatter.insert_space_before_postfix_operator" 
value="do not insert"/>
+        <setting 
id="org.eclipse.jdt.core.formatter.insert_space_before_prefix_operator" 
value="do not insert"/>
+        <setting 
id="org.eclipse.jdt.core.formatter.insert_space_before_question_in_conditional" 
value="insert"/>
+        <setting 
id="org.eclipse.jdt.core.formatter.insert_space_before_question_in_wildcard" 
value="do not insert"/>
+        <setting 
id="org.eclipse.jdt.core.formatter.insert_space_before_semicolon" value="do not 
insert"/>
+        <setting 
id="org.eclipse.jdt.core.formatter.insert_space_before_semicolon_in_for" 
value="do not insert"/>
+        <setting 
id="org.eclipse.jdt.core.formatter.insert_space_before_unary_operator" 
value="do not insert"/>
+        <setting 
id="org.eclipse.jdt.core.formatter.insert_space_between_brackets_in_array_type_reference"
 value="do not insert"/>
+        <setting 
id="org.eclipse.jdt.core.formatter.insert_space_between_empty_braces_in_array_initializer"
 value="do not insert"/>
+        <setting 
id="org.eclipse.jdt.core.formatter.insert_space_between_empty_brackets_in_array_allocation_expression"
 value="do not insert"/>
+        <setting 
id="org.eclipse.jdt.core.formatter.insert_space_between_empty_parens_in_annotation_type_member_declaration"
 value="do not insert"/>
+        <setting 
id="org.eclipse.jdt.core.formatter.insert_space_between_empty_parens_in_constructor_declaration"
 value="do not insert"/>
+        <setting 
id="org.eclipse.jdt.core.formatter.insert_space_between_empty_parens_in_enum_constant"
 value="do not insert"/>
+        <setting 
id="org.eclipse.jdt.core.formatter.insert_space_between_empty_parens_in_method_declaration"
 value="do not insert"/>
+        <setting 
id="org.eclipse.jdt.core.formatter.insert_space_between_empty_parens_in_method_invocation"
 value="do not insert"/>
+        <setting id="org.eclipse.jdt.core.formatter.join_lines_in_comments" 
value="false"/>
+        <setting id="org.eclipse.jdt.core.formatter.join_wrapped_lines" 
value="false"/>
+        <setting 
id="org.eclipse.jdt.core.formatter.keep_else_statement_on_same_line" 
value="false"/>
+        <setting 
id="org.eclipse.jdt.core.formatter.keep_empty_array_initializer_on_one_line" 
value="false"/>
+        <setting id="org.eclipse.jdt.core.formatter.keep_imple_if_on_one_line" 
value="false"/>
+        <setting 
id="org.eclipse.jdt.core.formatter.keep_then_statement_on_same_line" 
value="false"/>
+        <setting id="org.eclipse.jdt.core.formatter.lineSplit" value="128"/>
+        <setting 
id="org.eclipse.jdt.core.formatter.number_of_blank_lines_at_beginning_of_method_body"
 value="0"/>
+        <setting 
id="org.eclipse.jdt.core.formatter.number_of_empty_lines_to_preserve" 
value="1"/>
+        <setting 
id="org.eclipse.jdt.core.formatter.put_empty_statement_on_new_line" 
value="true"/>
+        <setting id="org.eclipse.jdt.core.formatter.tabulation.char" 
value="space"/>
+        <setting id="org.eclipse.jdt.core.formatter.tabulation.size" 
value="4"/>
+        <setting 
id="org.eclipse.jdt.core.formatter.use_tabs_only_for_leading_indentations" 
value="false"/>
+        <setting id="org.eclipse.jdt.core.formatter.use_on_off_tags" 
value="true"/>
+        <setting id="org.eclipse.jdt.core.formatter.disabling_tag" 
value="CHECKSTYLE:OFF"/>
+        <setting id="org.eclipse.jdt.core.formatter.enabling_tag" 
value="CHECKSTYLE:ON"/>
+    </profile>
+</profiles>
diff --git a/openapi-contract-first/pom.xml b/openapi-contract-first/pom.xml
new file mode 100644
index 0000000..f8b5949
--- /dev/null
+++ b/openapi-contract-first/pom.xml
@@ -0,0 +1,288 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!--
+
+    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.
+
+-->
+<project xmlns="http://maven.apache.org/POM/4.0.0"; 
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"; 
xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 
http://maven.apache.org/xsd/maven-4.0.0.xsd";>
+    <modelVersion>4.0.0</modelVersion>
+
+    
<artifactId>camel-quarkus-examples-examples-openapi-contract-first</artifactId>
+    <groupId>org.apache.camel.quarkus.examples</groupId>
+    <version>3.11.0-SNAPSHOT</version>
+
+    <name>Camel Quarkus :: Examples :: openapi-contract-first</name>
+    <description>Camel Quarkus Example :: openapi-contract-first</description>
+
+    <properties>
+        <quarkus.platform.version>3.10.0</quarkus.platform.version>
+        
<camel-quarkus.platform.version>3.11.0-SNAPSHOT</camel-quarkus.platform.version>
+
+        <quarkus.platform.group-id>io.quarkus</quarkus.platform.group-id>
+        
<quarkus.platform.artifact-id>quarkus-bom</quarkus.platform.artifact-id>
+        
<camel-quarkus.platform.group-id>org.apache.camel.quarkus</camel-quarkus.platform.group-id>
+        
<camel-quarkus.platform.artifact-id>camel-quarkus-bom</camel-quarkus.platform.artifact-id>
+
+        <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
+        
<project.reporting.outputEncoding>UTF-8</project.reporting.outputEncoding>
+        <maven.compiler.target>17</maven.compiler.target>
+        <maven.compiler.source>17</maven.compiler.source>
+        
<maven.compiler.testTarget>${maven.compiler.target}</maven.compiler.testTarget>
+        
<maven.compiler.testSource>${maven.compiler.source}</maven.compiler.testSource>
+
+        <formatter-maven-plugin.version>2.23.0</formatter-maven-plugin.version>
+        <impsort-maven-plugin.version>1.9.0</impsort-maven-plugin.version>
+        <license-maven-plugin.version>4.5</license-maven-plugin.version>
+        <maven-compiler-plugin.version>3.13.0</maven-compiler-plugin.version>
+        <maven-jar-plugin.version>3.4.1</maven-jar-plugin.version>
+        <maven-resources-plugin.version>3.3.1</maven-resources-plugin.version>
+        <maven-surefire-plugin.version>3.2.5</maven-surefire-plugin.version>
+    </properties>
+
+    <dependencyManagement>
+        <dependencies>
+            <!-- Import BOM -->
+            <dependency>
+                <groupId>${quarkus.platform.group-id}</groupId>
+                <artifactId>${quarkus.platform.artifact-id}</artifactId>
+                <version>${quarkus.platform.version}</version>
+                <type>pom</type>
+                <scope>import</scope>
+            </dependency>
+            <dependency>
+                <groupId>${camel-quarkus.platform.group-id}</groupId>
+                <artifactId>${camel-quarkus.platform.artifact-id}</artifactId>
+                <version>${camel-quarkus.platform.version}</version>
+                <type>pom</type>
+                <scope>import</scope>
+            </dependency>
+        </dependencies>
+    </dependencyManagement>
+
+    <dependencies>
+        <dependency>
+            <groupId>org.apache.camel.quarkus</groupId>
+            <artifactId>camel-quarkus-direct</artifactId>
+        </dependency>
+        <dependency>
+            <groupId>org.apache.camel.quarkus</groupId>
+            <artifactId>camel-quarkus-jackson</artifactId>
+        </dependency>
+        <dependency>
+            <groupId>org.apache.camel.quarkus</groupId>
+            <artifactId>camel-quarkus-rest-openapi</artifactId>
+        </dependency>
+
+        <!-- Test -->
+        <dependency>
+            <groupId>io.quarkus</groupId>
+            <artifactId>quarkus-junit5</artifactId>
+            <scope>test</scope>
+        </dependency>
+        <dependency>
+            <groupId>io.rest-assured</groupId>
+            <artifactId>rest-assured</artifactId>
+            <scope>test</scope>
+        </dependency>
+    </dependencies>
+
+    <build>
+        <resources>
+            <resource>
+                <directory>src/main/openapi</directory>
+            </resource>
+            <resource>
+                <directory>src/main/resources</directory>
+            </resource>
+        </resources>
+        <pluginManagement>
+            <plugins>
+                <plugin>
+                    <groupId>net.revelc.code.formatter</groupId>
+                    <artifactId>formatter-maven-plugin</artifactId>
+                    <version>${formatter-maven-plugin.version}</version>
+                    <configuration>
+                        
<configFile>${maven.multiModuleProjectDirectory}/eclipse-formatter-config.xml</configFile>
+                        <lineEnding>LF</lineEnding>
+                    </configuration>
+                </plugin>
+
+                <plugin>
+                    <groupId>net.revelc.code</groupId>
+                    <artifactId>impsort-maven-plugin</artifactId>
+                    <version>${impsort-maven-plugin.version}</version>
+                    <configuration>
+                        <groups>java.,javax.,org.w3c.,org.xml.,junit.</groups>
+                        <removeUnused>true</removeUnused>
+                        <staticAfter>true</staticAfter>
+                        
<staticGroups>java.,javax.,org.w3c.,org.xml.,junit.</staticGroups>
+                    </configuration>
+                </plugin>
+
+                <plugin>
+                    <groupId>org.apache.maven.plugins</groupId>
+                    <artifactId>maven-compiler-plugin</artifactId>
+                    <version>${maven-compiler-plugin.version}</version>
+                    <configuration>
+                        <showDeprecation>true</showDeprecation>
+                        <showWarnings>true</showWarnings>
+                        <compilerArgs>
+                            <arg>-Xlint:unchecked</arg>
+                        </compilerArgs>
+                    </configuration>
+                </plugin>
+
+                <plugin>
+                    <groupId>org.apache.maven.plugins</groupId>
+                    <artifactId>maven-surefire-plugin</artifactId>
+                    <version>${maven-surefire-plugin.version}</version>
+                    <configuration>
+                        <failIfNoTests>false</failIfNoTests>
+                        <systemPropertyVariables>
+                            
<java.util.logging.manager>org.jboss.logmanager.LogManager</java.util.logging.manager>
+                        </systemPropertyVariables>
+                    </configuration>
+                </plugin>
+
+                <plugin>
+                    <groupId>${quarkus.platform.group-id}</groupId>
+                    <artifactId>quarkus-maven-plugin</artifactId>
+                    <version>${quarkus.platform.version}</version>
+                </plugin>
+
+                <plugin>
+                    <groupId>org.apache.maven.plugins</groupId>
+                    <artifactId>maven-failsafe-plugin</artifactId>
+                    <version>${maven-surefire-plugin.version}</version>
+                </plugin>
+
+                <plugin>
+                    <groupId>org.apache.maven.plugins</groupId>
+                    <artifactId>maven-jar-plugin</artifactId>
+                    <version>${maven-jar-plugin.version}</version>
+                </plugin>
+
+                <plugin>
+                    <groupId>com.mycila</groupId>
+                    <artifactId>license-maven-plugin</artifactId>
+                    <version>${license-maven-plugin.version}</version>
+                    <configuration>
+                        <failIfUnknown>true</failIfUnknown>
+                        
<header>${maven.multiModuleProjectDirectory}/header.txt</header>
+                        <excludes>
+                            <exclude>**/*.adoc</exclude>
+                            <exclude>**/*.txt</exclude>
+                            <exclude>**/LICENSE.txt</exclude>
+                            <exclude>**/LICENSE</exclude>
+                            <exclude>**/NOTICE.txt</exclude>
+                            <exclude>**/NOTICE</exclude>
+                            <exclude>**/README</exclude>
+                            <exclude>**/pom.xml.versionsBackup</exclude>
+                        </excludes>
+                        <mapping>
+                            <java>SLASHSTAR_STYLE</java>
+                            <properties>CAMEL_PROPERTIES_STYLE</properties>
+                            <kt>SLASHSTAR_STYLE</kt>
+                        </mapping>
+                        <headerDefinitions>
+                            
<headerDefinition>${maven.multiModuleProjectDirectory}/license-properties-headerdefinition.xml</headerDefinition>
+                        </headerDefinitions>
+                    </configuration>
+                </plugin>
+            </plugins>
+        </pluginManagement>
+
+        <plugins>
+            <plugin>
+                <groupId>${quarkus.platform.group-id}</groupId>
+                <artifactId>quarkus-maven-plugin</artifactId>
+                <executions>
+                    <execution>
+                        <id>build</id>
+                        <goals>
+                            <goal>generate-code</goal>
+                            <goal>build</goal>
+                        </goals>
+                    </execution>
+                </executions>
+            </plugin>
+
+            <plugin>
+                <groupId>net.revelc.code.formatter</groupId>
+                <artifactId>formatter-maven-plugin</artifactId>
+                <executions>
+                    <execution>
+                        <id>format</id>
+                        <goals>
+                            <goal>format</goal>
+                        </goals>
+                        <phase>process-sources</phase>
+                    </execution>
+                </executions>
+            </plugin>
+
+            <plugin>
+                <groupId>net.revelc.code</groupId>
+                <artifactId>impsort-maven-plugin</artifactId>
+                <executions>
+                    <execution>
+                        <id>sort-imports</id>
+                        <goals>
+                            <goal>sort</goal>
+                        </goals>
+                        <phase>process-sources</phase>
+                    </execution>
+                </executions>
+            </plugin>
+        </plugins>
+    </build>
+
+    <profiles>
+        <profile>
+            <id>native</id>
+            <activation>
+                <property>
+                    <name>native</name>
+                </property>
+            </activation>
+            <properties>
+                <quarkus.package.type>native</quarkus.package.type>
+            </properties>
+            <build>
+                <plugins>
+                    <plugin>
+                        <groupId>org.apache.maven.plugins</groupId>
+                        <artifactId>maven-failsafe-plugin</artifactId>
+                        <executions>
+                            <execution>
+                                <goals>
+                                    <goal>integration-test</goal>
+                                    <goal>verify</goal>
+                                </goals>
+                                <configuration>
+                                    <systemPropertyVariables>
+                                        
<quarkus.package.type>${quarkus.package.type}</quarkus.package.type>
+                                    </systemPropertyVariables>
+                                </configuration>
+                            </execution>
+                        </executions>
+                    </plugin>
+                </plugins>
+            </build>
+        </profile>
+    </profiles>
+
+</project>
diff --git 
a/openapi-contract-first/src/main/java/org/acme/examples/openapi/contract/first/PetStoreRoute.java
 
b/openapi-contract-first/src/main/java/org/acme/examples/openapi/contract/first/PetStoreRoute.java
new file mode 100644
index 0000000..bc8270f
--- /dev/null
+++ 
b/openapi-contract-first/src/main/java/org/acme/examples/openapi/contract/first/PetStoreRoute.java
@@ -0,0 +1,59 @@
+/*
+ * 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.acme.examples.openapi.contract.first;
+
+import jakarta.enterprise.context.ApplicationScoped;
+import org.apache.camel.builder.RouteBuilder;
+import org.apache.camel.model.rest.RestBindingMode;
+import org.eclipse.microprofile.config.inject.ConfigProperty;
+import sample.petstore.model.Pet;
+import sample.petstore.model.Pet.StatusEnum;
+
+/**
+ * Camel routes for the PetStore example
+ */
+@ApplicationScoped
+public class PetStoreRoute extends RouteBuilder {
+
+    @ConfigProperty(name = "pet.name")
+    private String petName;
+
+    @Override
+    public void configure() throws Exception {
+        // turn on json binding and scan for POJO classes in the model package
+        restConfiguration().bindingMode(RestBindingMode.json)
+                .bindingPackageScan("sample.petstore.model");
+
+        
rest().openApi().specification("petstore.json").missingOperation("ignore");
+
+        from("direct:getPetById")
+                .process(e -> {
+                    // build response body as POJO
+                    Pet pet = new Pet();
+                    pet.setId(e.getMessage().getHeader("petId", long.class));
+                    pet.setName(petName);
+                    pet.setStatus(StatusEnum.AVAILABLE);
+                    e.getMessage().setBody(pet);
+                });
+
+        from("direct:updatePet")
+                .process(e -> {
+                    Pet pet = e.getMessage().getBody(Pet.class);
+                    pet.setStatus(StatusEnum.PENDING);
+                });
+    }
+}
diff --git a/openapi-contract-first/src/main/openapi/petstore.json 
b/openapi-contract-first/src/main/openapi/petstore.json
new file mode 100644
index 0000000..b03f018
--- /dev/null
+++ b/openapi-contract-first/src/main/openapi/petstore.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": "[email protected]"
+               },
+               "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": "[email protected]"
+                                       },
+                                       "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/openapi-contract-first/src/main/resources/application.properties 
b/openapi-contract-first/src/main/resources/application.properties
new file mode 100644
index 0000000..55bcfd5
--- /dev/null
+++ b/openapi-contract-first/src/main/resources/application.properties
@@ -0,0 +1,23 @@
+## ---------------------------------------------------------------------------
+## 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.
+## ---------------------------------------------------------------------------
+quarkus.native.resources.includes=petstore.json
+quarkus.camel.openapi.codegen.model-package=sample.petstore.model
+quarkus.camel.openapi.codegen.not-null-jackson=true
+camel.rest.bindingMode=json
+camel.rest.bindingPackageScan=${quarkus.camel.openapi.codegen.model-package}
+
+pet.name=Tony the tiger
diff --git 
a/openapi-contract-first/src/test/java/org/acme/examples/openapi/contract/first/ExamplesOpenapiContractFirstIT.java
 
b/openapi-contract-first/src/test/java/org/acme/examples/openapi/contract/first/ExamplesOpenapiContractFirstIT.java
new file mode 100644
index 0000000..de03d8c
--- /dev/null
+++ 
b/openapi-contract-first/src/test/java/org/acme/examples/openapi/contract/first/ExamplesOpenapiContractFirstIT.java
@@ -0,0 +1,24 @@
+/*
+ * 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.acme.examples.openapi.contract.first;
+
+import io.quarkus.test.junit.QuarkusIntegrationTest;
+
+@QuarkusIntegrationTest
+class ExamplesOpenapiContractFirstIT extends ExamplesOpenapiContractFirstTest {
+
+}
diff --git 
a/openapi-contract-first/src/test/java/org/acme/examples/openapi/contract/first/ExamplesOpenapiContractFirstTest.java
 
b/openapi-contract-first/src/test/java/org/acme/examples/openapi/contract/first/ExamplesOpenapiContractFirstTest.java
new file mode 100644
index 0000000..2cdd12b
--- /dev/null
+++ 
b/openapi-contract-first/src/test/java/org/acme/examples/openapi/contract/first/ExamplesOpenapiContractFirstTest.java
@@ -0,0 +1,38 @@
+/*
+ * 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.acme.examples.openapi.contract.first;
+
+import io.quarkus.test.junit.QuarkusTest;
+import io.restassured.RestAssured;
+import io.restassured.http.ContentType;
+import org.junit.jupiter.api.Test;
+
+import static org.hamcrest.Matchers.is;
+
+@QuarkusTest
+class ExamplesOpenapiContractFirstTest {
+
+    @Test
+    public void test() {
+        RestAssured.given()
+                .contentType(ContentType.JSON)
+                .get("/api/v3/pet/123")
+                .then()
+                .statusCode(200)
+                .body("id", is(123), "name", is("Tony the tiger"), "status", 
is("available"));
+    }
+}

Reply via email to