You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@camel.apache.org by ja...@apache.org on 2020/02/24 07:36:58 UTC

[camel-quarkus] branch camel-master updated (8eebc84 -> f57a78a)

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

jamesnetherton pushed a change to branch camel-master
in repository https://gitbox.apache.org/repos/asf/camel-quarkus.git.


 discard 8eebc84  Upgrade to Camel 3.1.0 - WIP
 discard 3e4a3fd  Fix #74 Telegram extension
 discard c412d34  Fix incompatibilities between Quarkus and Camel MongoDB dependencies
     add 76dfa29  Update kotlin to v1.3.61
     add 3969f56  it-cleanup(core): rename
     add f47d0ae  it-cleanup(core): remove unknown property
     add b7ad563  it-cleanup(core-main): move assertj conditions to camel-quarkus-integration-test-support
     add 2f5567d  it-cleanup(core-main): rename
     add 5d22cc4  it-cleanup(core-main-collector): rename
     add f50532c  it-cleanup(core-main-xml): rename
     add 7ac531e  it-cleanup(core-main-xml): enable native tests
     add c0cea07  it-cleanup(infinispan): rename
     add 32d9a5c  it-cleanup(salesforce): rename
     add 8a03fa3  Regen
     add 6328ec8  Removed useless Jenkinsfile(s)
     add 38fe5c0  Merge pull request #732 from apache/jenkinsfiles
     add 6225dce  chore: Remove redundant quarkus-maven-plugin exection from native profile
     add d0e437f  Fix olingo4 tests for native mode
     add 5de6a12  CAMEL-QUARKUS-729: Centralized JSON dataformats related itests in dataformats-json
     add 2bbdea2  build: Do resource hungry native builds in parallel
     add 7f3b951  Fix XSLT extension NoSuchMethodError: TransformerFactory.newInstance(String,ClassLoader)
     add 0abaf5a  Merge pull request #736 from jamesnetherton/fix-xslt
     add 3ba3c24  Created a camel gson extension #681
     add bfd8feb  chore(test): add test for bean(class, method)
     add 5add94d  Add LoginToken to Salesforce reflective class list
     new c1e3b56  Fix incompatibilities between Quarkus and Camel MongoDB dependencies
     new 0150328  Fix #74 Telegram extension
     new f57a78a  Upgrade to Camel 3.1.0 - WIP

This update added new revisions after undoing existing revisions.
That is to say, some revisions that were in the old version of the
branch are not in the new version.  This situation occurs
when a user --force pushes a change and generates a repository
containing something like this:

 * -- * -- B -- O -- O -- O   (8eebc84)
            \
             N -- N -- N   refs/heads/camel-master (f57a78a)

You should already have received notification emails for all of the O
revisions, and so the following emails describe only the N revisions
from the common base, B.

Any revisions marked "omit" are not gone; other references still
refer to them.  Any revisions marked "discard" are gone forever.

The 3 revisions listed above as "new" are entirely new to this
repository and will be described in separate emails.  The revisions
listed as "add" were already present in the repository and have only
been added to this reference.


Summary of changes:
 .github/workflows/pr-build.yaml                    |  38 +++++++-
 Jenkinsfile                                        |  90 -----------------
 Jenkinsfile.quarkus                                |  79 ---------------
 .../pages/list-of-camel-quarkus-extensions.adoc    |   4 +-
 extensions/{bindy => gson}/deployment/pom.xml      |   8 +-
 .../component/gson/deployment/GsonProcessor.java}  |   6 +-
 extensions/{box => gson}/pom.xml                   |   4 +-
 extensions/{box => gson}/runtime/pom.xml           |  10 +-
 .../main/resources/META-INF/quarkus-extension.yaml |   5 +-
 .../olingo4/deployment/Olingo4Processor.java       |  22 +----
 extensions/pom.xml                                 |   1 +
 extensions/readme.adoc                             |   4 +-
 .../salesforce/deployment/SalesforceProcessor.java |   2 +
 .../quarkus/component/bean/CamelResource.java      |   8 ++
 .../camel/quarkus/component/bean/CamelRoute.java   |  13 +++
 .../camel/quarkus/component/bean/BeanTest.java     |  10 ++
 ...Servlet.java => CoreMainCollectorResource.java} |   2 +-
 .../{CamelTest.java => CoreMainCollectorTest.java} |   2 +-
 ...{CamelServlet.java => CoreMainXmlResource.java} |   2 +-
 .../apache/camel/quarkus/core/CoreMainXmlIT.java}  |   2 +-
 .../core/{CamelTest.java => CoreMainXmlTest.java}  |   2 +-
 integration-tests/core-main/pom.xml                |   5 +
 .../{CamelServlet.java => CoreMainResource.java}   |   2 +-
 .../org/apache/camel/quarkus/core/CoreMainIT.java} |   2 +-
 .../core/{CamelTest.java => CoreMainTest.java}     |   8 +-
 .../core/{CamelServlet.java => CoreResource.java}  |   2 +-
 .../core/{CamelRoute.java => CoreRoutes.java}      |   2 +-
 .../core/src/main/resources/application.properties |   1 -
 .../org/apache/camel/quarkus/core/CoreIT.java}     |   2 +-
 .../quarkus/core/{CamelTest.java => CoreTest.java} |   2 +-
 .../{jackson => dataformats-json}/pom.xml          |  12 ++-
 .../jackson/JsonDataformatsResource.java}          |  46 +++++----
 .../component/jackson/JsonDataformatsRoute.java    | 108 +++++++++++++++++++++
 .../component/jackson/model/DummyObject.java}      |  34 +++++--
 .../component/jackson/model/ExcludeField.java}     |  23 ++---
 .../quarkus/component/jackson/model/PojoA.java     |   0
 .../quarkus/component/jackson/model/PojoB.java     |   0
 .../src/main/resources/application.properties      |   6 +-
 .../src/main/resources/routes/gson-routes.xml}     |  10 +-
 .../src/main/resources/routes/jackson-routes.xml}  |   4 +-
 .../component/jackson/JsonComponentsIT.java}       |   2 +-
 .../component/jackson/JsonComponentsTest.java      | 102 +++++++++++++++++++
 ...{CamelServlet.java => InfinispanResources.java} |   2 +-
 .../{CamelRoute.java => InfinispanRoutes.java}     |   2 +-
 .../{CamelTCase.java => InfinispanIT.java}         |   2 +-
 .../infinispan/InfinispanServerTestResource.java   |   6 +-
 .../{CamelTest.java => InfinispanTest.java}        |   2 +-
 .../quarkus/component/jackson/CamelRoute.java      |  62 ------------
 .../quarkus/component/jackson/JacksonTest.java     |  81 ----------------
 integration-tests/jira/pom.xml                     |   2 +-
 integration-tests/pom.xml                          |   2 +-
 integration-tests/salesforce/pom.xml               |   8 --
 .../{CamelServlet.java => SalesforceResource.java} |  25 ++---
 .../component/salesforce/SalesforceIT.java}        |  12 +--
 .../component/salesforce/SalesforceTest.java}      |  27 +++---
 .../org/apache/camel/quarkus/test/Conditions.java} |   6 +-
 integration-tests/validator/pom.xml                |  23 -----
 pom.xml                                            |   2 +-
 poms/bom-deployment/pom.xml                        |   5 +
 poms/bom/pom.xml                                   |  16 +++
 60 files changed, 470 insertions(+), 502 deletions(-)
 delete mode 100644 Jenkinsfile
 delete mode 100644 Jenkinsfile.quarkus
 copy extensions/{bindy => gson}/deployment/pom.xml (92%)
 copy extensions/{ahc/deployment/src/main/java/org/apache/camel/quarkus/component/ahc/deployment/AhcProcessor.java => gson/deployment/src/main/java/org/apache/camel/quarkus/component/gson/deployment/GsonProcessor.java} (88%)
 copy extensions/{box => gson}/pom.xml (94%)
 copy extensions/{box => gson}/runtime/pom.xml (91%)
 copy extensions/{core => gson}/runtime/src/main/resources/META-INF/quarkus-extension.yaml (92%)
 rename integration-tests/core-main-collector/src/main/java/org/apache/camel/quarkus/core/{CamelServlet.java => CoreMainCollectorResource.java} (97%)
 rename integration-tests/core-main-collector/src/test/java/org/apache/camel/quarkus/core/{CamelTest.java => CoreMainCollectorTest.java} (97%)
 rename integration-tests/core-main-xml/src/main/java/org/apache/camel/quarkus/core/{CamelServlet.java => CoreMainXmlResource.java} (98%)
 copy integration-tests/{core-main/src/test/java/org/apache/camel/quarkus/core/CamelITCase.java => core-main-xml/src/test/java/org/apache/camel/quarkus/core/CoreMainXmlIT.java} (94%)
 rename integration-tests/core-main-xml/src/test/java/org/apache/camel/quarkus/core/{CamelTest.java => CoreMainXmlTest.java} (98%)
 rename integration-tests/core-main/src/main/java/org/apache/camel/quarkus/core/{CamelServlet.java => CoreMainResource.java} (99%)
 rename integration-tests/{core/src/test/java/org/apache/camel/quarkus/core/CamelITCase.java => core-main/src/test/java/org/apache/camel/quarkus/core/CoreMainIT.java} (95%)
 rename integration-tests/core-main/src/test/java/org/apache/camel/quarkus/core/{CamelTest.java => CoreMainTest.java} (96%)
 rename integration-tests/core/src/main/java/org/apache/camel/quarkus/core/{CamelServlet.java => CoreResource.java} (99%)
 rename integration-tests/core/src/main/java/org/apache/camel/quarkus/core/{CamelRoute.java => CoreRoutes.java} (95%)
 rename integration-tests/{core-main/src/test/java/org/apache/camel/quarkus/core/CamelITCase.java => core/src/test/java/org/apache/camel/quarkus/core/CoreIT.java} (95%)
 rename integration-tests/core/src/test/java/org/apache/camel/quarkus/core/{CamelTest.java => CoreTest.java} (99%)
 rename integration-tests/{jackson => dataformats-json}/pom.xml (89%)
 rename integration-tests/{jackson/src/main/java/org/apache/camel/quarkus/component/jackson/CamelResource.java => dataformats-json/src/main/java/org/apache/camel/quarkus/component/jackson/JsonDataformatsResource.java} (51%)
 create mode 100644 integration-tests/dataformats-json/src/main/java/org/apache/camel/quarkus/component/jackson/JsonDataformatsRoute.java
 rename integration-tests/{salesforce/src/main/java/org/apache/camel/quarkus/component/salesforce/CamelRoute.java => dataformats-json/src/main/java/org/apache/camel/quarkus/component/jackson/model/DummyObject.java} (61%)
 rename integration-tests/{jackson/src/main/java/org/apache/camel/quarkus/component/jackson/model/DummyObject.java => dataformats-json/src/main/java/org/apache/camel/quarkus/component/jackson/model/ExcludeField.java} (73%)
 rename integration-tests/{jackson => dataformats-json}/src/main/java/org/apache/camel/quarkus/component/jackson/model/PojoA.java (100%)
 rename integration-tests/{jackson => dataformats-json}/src/main/java/org/apache/camel/quarkus/component/jackson/model/PojoB.java (100%)
 rename integration-tests/{jackson => dataformats-json}/src/main/resources/application.properties (86%)
 copy integration-tests/{jackson/src/main/resources/routes/my-routes.xml => dataformats-json/src/main/resources/routes/gson-routes.xml} (80%)
 rename integration-tests/{jackson/src/main/resources/routes/my-routes.xml => dataformats-json/src/main/resources/routes/jackson-routes.xml} (93%)
 rename integration-tests/{jackson/src/test/java/org/apache/camel/quarkus/component/jackson/JacksonITCase.java => dataformats-json/src/test/java/org/apache/camel/quarkus/component/jackson/JsonComponentsIT.java} (93%)
 create mode 100644 integration-tests/dataformats-json/src/test/java/org/apache/camel/quarkus/component/jackson/JsonComponentsTest.java
 rename integration-tests/infinispan/src/main/java/org/apache/camel/quarkus/component/infinispan/{CamelServlet.java => InfinispanResources.java} (97%)
 rename integration-tests/infinispan/src/main/java/org/apache/camel/quarkus/component/infinispan/{CamelRoute.java => InfinispanRoutes.java} (97%)
 rename integration-tests/infinispan/src/test/java/org/apache/camel/quarkus/component/infinispan/{CamelTCase.java => InfinispanIT.java} (94%)
 rename integration-tests/infinispan/src/test/java/org/apache/camel/quarkus/component/infinispan/{CamelTest.java => InfinispanTest.java} (98%)
 delete mode 100644 integration-tests/jackson/src/main/java/org/apache/camel/quarkus/component/jackson/CamelRoute.java
 delete mode 100644 integration-tests/jackson/src/test/java/org/apache/camel/quarkus/component/jackson/JacksonTest.java
 rename integration-tests/salesforce/src/main/java/org/apache/camel/quarkus/component/salesforce/{CamelServlet.java => SalesforceResource.java} (65%)
 copy integration-tests/{box/src/test/java/org/apache/camel/quarkus/component/box/it/BoxIT.java => salesforce/src/test/java/org/apache/camel/quarkus/component/salesforce/SalesforceIT.java} (69%)
 copy integration-tests/{xslt/src/test/java/org/apache/camel/quarkus/component/xslt/it/XsltTest.java => salesforce/src/test/java/org/apache/camel/quarkus/component/salesforce/SalesforceTest.java} (61%)
 rename integration-tests/{core-main/src/test/java/org/apache/camel/quarkus/core/CamelTestConditions.java => support/test-support/src/main/java/org/apache/camel/quarkus/test/Conditions.java} (94%)


[camel-quarkus] 03/03: Upgrade to Camel 3.1.0 - WIP

Posted by ja...@apache.org.
This is an automated email from the ASF dual-hosted git repository.

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

commit f57a78a2fc26857a9396609c9f5dfd5754bfe076
Author: James Netherton <ja...@gmail.com>
AuthorDate: Tue Feb 18 08:14:03 2020 +0000

    Upgrade to Camel 3.1.0 - WIP
---
 catalog/camel-quarkus-catalog/pom.xml              |  27 +-
 .../catalog/quarkus/QuarkusRuntimeProvider.java    |   5 +-
 .../quarkus/QuarkusRuntimeProviderTest.java        |  14 +-
 .../pages/list-of-camel-quarkus-extensions.adoc    |   8 +-
 .../component/bindy/deployment/BindyProcessor.java |  12 +
 .../consul/deployment/ConsulProcessor.java         |  12 -
 .../component/xml/deployment/XmlProcessor.java     |   9 +-
 extensions/core-xml/runtime/pom.xml                |   4 +
 .../camel/quarkus/component/xml/XmlRecorder.java   |  27 +-
 .../quarkus/core/deployment/BuildProcessor.java    |  13 +-
 .../CamelModelToXMLDumperBuildItem.java}           |  22 +-
 .../deployment/CamelRoutesLoaderBuildItems.java    |  10 +-
 extensions/core/runtime/pom.xml                    |  10 +-
 .../quarkus/core/CamelMainEventDispatcher.java     |   5 +
 .../apache/camel/quarkus/core/CamelMainEvents.java |   6 +
 .../camel/quarkus/core/CamelMainRecorder.java      |   6 +-
 .../apache/camel/quarkus/core/CamelRecorder.java   |  27 +-
 .../camel/quarkus/core/CamelRoutesCollector.java   |  17 +-
 .../camel/quarkus/core/CamelRuntimeCatalog.java    |   7 +-
 ...esLoader.java => DisabledModelToXMLDumper.java} |  15 +-
 .../core/DisabledPredicateValidatorReifier.java    |   6 +-
 .../quarkus/core/DisabledValidateReifier.java      |   6 +-
 .../core/DisabledXMLRoutesDefinitionLoader.java}   |  23 +-
 .../camel/quarkus/core/FastCamelContext.java       |  67 +--
 .../org/apache/camel/quarkus/core/FastModel.java   |   8 +-
 .../camel/quarkus/core/FastTypeConverter.java      |  11 +-
 .../component/pdf/deployment/PdfProcessor.java     |  19 +-
 extensions/readme.adoc                             |   8 +-
 .../support/policy/deployment/PolicyProcessor.java |   8 +-
 extensions/support/xml/runtime/pom.xml             |   2 +-
 .../quarkus/component/bindy/it/BindyTestRoute.java |   4 +-
 .../camel/quarkus/core/CoreMainXmlResource.java    |   5 +
 .../apache/camel/quarkus/core/CoreMainXmlTest.java |   5 +
 .../camel/quarkus/core/CoreMainResource.java       |   4 +-
 .../apache/camel/quarkus/core/CoreMainTest.java    |   5 +-
 .../apache/camel/quarkus/core/CoreResource.java    |   4 +-
 .../quarkus/component/pdf/it/PdfResource.java      |   2 +-
 .../core/runtime/support/SupportListener.java      |   4 +
 pom.xml                                            |  23 +-
 poms/bom/pom.xml                                   |  21 +-
 tooling/package-maven-plugin/pom.xml               |  32 ++
 .../apache/camel/quarkus/maven/ExtMvelHelper.java  |  12 +-
 .../camel/quarkus/maven/JSonSchemaHelper.java      | 567 +++++++++++++++++++++
 .../quarkus/maven/PrepareCatalogQuarkusMojo.java   |   2 +-
 .../quarkus/maven/UpdateDocExtensionsListMojo.java | 132 ++---
 45 files changed, 976 insertions(+), 260 deletions(-)

diff --git a/catalog/camel-quarkus-catalog/pom.xml b/catalog/camel-quarkus-catalog/pom.xml
index a234169..eb6e3d0 100644
--- a/catalog/camel-quarkus-catalog/pom.xml
+++ b/catalog/camel-quarkus-catalog/pom.xml
@@ -22,8 +22,9 @@
 
     <parent>
         <groupId>org.apache.camel.quarkus</groupId>
-        <artifactId>catalog</artifactId>
+        <artifactId>camel-quarkus-build-parent</artifactId>
         <version>1.1.0-SNAPSHOT</version>
+        <relativePath>../../poms/build-parent/pom.xml</relativePath>
     </parent>
 
     <artifactId>camel-catalog-quarkus</artifactId>
@@ -35,33 +36,27 @@
         <dependency>
             <groupId>org.apache.camel</groupId>
             <artifactId>camel-catalog</artifactId>
-            <version>${camel.version}</version>
         </dependency>
 
         <dependency>
-            <groupId>junit</groupId>
-            <artifactId>junit</artifactId>
-            <version>4.12</version>
+            <groupId>org.jboss.logging</groupId>
+            <artifactId>jboss-logging</artifactId>
             <scope>test</scope>
         </dependency>
-
-        <!-- logging -->
         <dependency>
-            <groupId>org.apache.logging.log4j</groupId>
-            <artifactId>log4j-api</artifactId>
-            <version>2.12.1</version>
+            <groupId>org.jboss.slf4j</groupId>
+            <artifactId>slf4j-jboss-logging</artifactId>
             <scope>test</scope>
         </dependency>
+
         <dependency>
-            <groupId>org.apache.logging.log4j</groupId>
-            <artifactId>log4j-core</artifactId>
-            <version>2.12.1</version>
+            <groupId>org.junit.jupiter</groupId>
+            <artifactId>junit-jupiter-api</artifactId>
             <scope>test</scope>
         </dependency>
         <dependency>
-            <groupId>org.apache.logging.log4j</groupId>
-            <artifactId>log4j-slf4j-impl</artifactId>
-            <version>2.12.1</version>
+            <groupId>org.junit.jupiter</groupId>
+            <artifactId>junit-jupiter-engine</artifactId>
             <scope>test</scope>
         </dependency>
 
diff --git a/catalog/camel-quarkus-catalog/src/main/java/org/apache/camel/catalog/quarkus/QuarkusRuntimeProvider.java b/catalog/camel-quarkus-catalog/src/main/java/org/apache/camel/catalog/quarkus/QuarkusRuntimeProvider.java
index b1c37c6..d8a72bf 100644
--- a/catalog/camel-quarkus-catalog/src/main/java/org/apache/camel/catalog/quarkus/QuarkusRuntimeProvider.java
+++ b/catalog/camel-quarkus-catalog/src/main/java/org/apache/camel/catalog/quarkus/QuarkusRuntimeProvider.java
@@ -22,11 +22,12 @@ import java.util.ArrayList;
 import java.util.List;
 
 import org.apache.camel.catalog.CamelCatalog;
-import org.apache.camel.catalog.CatalogHelper;
 import org.apache.camel.catalog.RuntimeProvider;
+import org.apache.camel.catalog.impl.CatalogHelper;
 
 /**
- * A Quarkus based {@link RuntimeProvider} which only includes the supported Camel components, data formats, and languages
+ * A Quarkus based {@link RuntimeProvider} which only includes the supported Camel components, data formats, and
+ * languages
  * which can be installed in Quarkus using the Camel extensions.
  */
 public class QuarkusRuntimeProvider implements RuntimeProvider {
diff --git a/catalog/camel-quarkus-catalog/src/test/java/org/apache/camel/catalog/quarkus/QuarkusRuntimeProviderTest.java b/catalog/camel-quarkus-catalog/src/test/java/org/apache/camel/catalog/quarkus/QuarkusRuntimeProviderTest.java
index 2c6b1d1..eb0f52d 100644
--- a/catalog/camel-quarkus-catalog/src/test/java/org/apache/camel/catalog/quarkus/QuarkusRuntimeProviderTest.java
+++ b/catalog/camel-quarkus-catalog/src/test/java/org/apache/camel/catalog/quarkus/QuarkusRuntimeProviderTest.java
@@ -20,19 +20,19 @@ import java.util.List;
 
 import org.apache.camel.catalog.CamelCatalog;
 import org.apache.camel.catalog.DefaultCamelCatalog;
-import org.junit.BeforeClass;
-import org.junit.Test;
+import org.junit.jupiter.api.BeforeAll;
+import org.junit.jupiter.api.Test;
 
-import static org.junit.Assert.assertEquals;
-import static org.junit.Assert.assertFalse;
-import static org.junit.Assert.assertNotNull;
-import static org.junit.Assert.assertTrue;
+import static org.junit.jupiter.api.Assertions.assertEquals;
+import static org.junit.jupiter.api.Assertions.assertFalse;
+import static org.junit.jupiter.api.Assertions.assertNotNull;
+import static org.junit.jupiter.api.Assertions.assertTrue;
 
 public class QuarkusRuntimeProviderTest {
 
     static CamelCatalog catalog;
 
-    @BeforeClass
+    @BeforeAll
     public static void createCamelCatalog() {
         catalog = new DefaultCamelCatalog();
         catalog.setRuntimeProvider(new QuarkusRuntimeProvider());
diff --git a/docs/modules/ROOT/pages/list-of-camel-quarkus-extensions.adoc b/docs/modules/ROOT/pages/list-of-camel-quarkus-extensions.adoc
index 430867a..f5c8b95 100644
--- a/docs/modules/ROOT/pages/list-of-camel-quarkus-extensions.adoc
+++ b/docs/modules/ROOT/pages/list-of-camel-quarkus-extensions.adoc
@@ -18,7 +18,7 @@ In case you are missing some Camel feature in the list:
 == Camel Components
 
 // components: START
-Number of Camel components: 65 in 56 JAR artifacts (0 deprecated)
+Number of Camel components: 66 in 57 JAR artifacts (0 deprecated)
 
 [width="100%",cols="4,1,5",options="header"]
 |===
@@ -64,7 +64,7 @@ Number of Camel components: 65 in 56 JAR artifacts (0 deprecated)
 `aws-sqs:queueNameOrArn` | 0.2.0 | The aws-sqs component is used for sending and receiving messages to Amazon's SQS service.
 
 | link:https://camel.apache.org/components/latest/aws-translate-component.html[AWS Translate] (camel-quarkus-aws-translate) +
-`aws-translate:label` | 1.0.0-M3 | The aws-kms is used for managing Amazon Translate
+`aws-translate:label` | 1.0.0-M3 | The aws-translate component is used for managing Amazon Translate
 
 | link:https://camel.apache.org/components/latest/bean-component.html[Bean] (camel-quarkus-bean) +
 `bean:beanName` | 0.2.0 | The bean component is for invoking Java beans from Camel.
@@ -76,7 +76,7 @@ Number of Camel components: 65 in 56 JAR artifacts (0 deprecated)
 `box:apiName/methodName` | 1.2.0 | For uploading downloading and managing files folders groups collaborations etc on box DOT com.
 
 | link:https://camel.apache.org/components/latest/class-component.html[Class] (camel-quarkus-bean) +
-`class:beanName` | 0.2.0 | The class component is for invoking Java classes (Java beans) from Camel.
+`class:beanName` | 0.2.0 | The Class component is for invoking Java classes (Java beans) from Camel.
 
 | link:https://camel.apache.org/components/latest/consul-component.html[Consul] (camel-quarkus-consul) +
 `consul:apiEndpoint` | 1.0.0-M3 | The camel consul component allows you to work with Consul, a distributed, highly available, datacenter-aware, service discovery and configuration system.
@@ -275,7 +275,7 @@ Number of Camel languages: 9 in 3 JAR artifacts (0 deprecated)
 
 | link:https://camel.apache.org/components/latest/bean-language.html[Bean method] (camel-quarkus-bean) | 0.2.0 | To use a Java bean (aka method call) in Camel expressions or predicates.
 
-| link:https://camel.apache.org/components/latest/constant-language.html[Constant] (camel-quarkus-core) | 0.2.0 | To use a constant value in Camel expressions or predicates.
+| link:https://camel.apache.org/components/latest/constant-language.html[Constant] (camel-quarkus-core) | 0.2.0 | To use a constant value in Camel expressions or predicates. Important: this is a fixed constant value that is only set once during starting up the route, do not use this if you want dynamic values during routing.
 
 | link:https://camel.apache.org/components/latest/exchangeProperty-language.html[ExchangeProperty] (camel-quarkus-core) | 0.2.0 | To use a Camel Exchange property in expressions or predicates.
 
diff --git a/extensions/bindy/deployment/src/main/java/org/apache/camel/quarkus/component/bindy/deployment/BindyProcessor.java b/extensions/bindy/deployment/src/main/java/org/apache/camel/quarkus/component/bindy/deployment/BindyProcessor.java
index 74bd071..65f9d97 100644
--- a/extensions/bindy/deployment/src/main/java/org/apache/camel/quarkus/component/bindy/deployment/BindyProcessor.java
+++ b/extensions/bindy/deployment/src/main/java/org/apache/camel/quarkus/component/bindy/deployment/BindyProcessor.java
@@ -18,6 +18,8 @@ package org.apache.camel.quarkus.component.bindy.deployment;
 
 import io.quarkus.deployment.annotations.BuildStep;
 import io.quarkus.deployment.builditem.FeatureBuildItem;
+import io.quarkus.deployment.builditem.nativeimage.NativeImageResourceDirectoryBuildItem;
+import io.quarkus.deployment.builditem.nativeimage.ReflectiveClassBuildItem;
 
 class BindyProcessor {
 
@@ -28,4 +30,14 @@ class BindyProcessor {
         return new FeatureBuildItem(FEATURE);
     }
 
+    @BuildStep
+    ReflectiveClassBuildItem reflectiveClasses() {
+        return new ReflectiveClassBuildItem(false, false, "com.ibm.icu.text.BreakIteratorFactory");
+    }
+
+    @BuildStep
+    NativeImageResourceDirectoryBuildItem resourceBundles() {
+        return new NativeImageResourceDirectoryBuildItem("com/ibm/icu/impl/data");
+    }
+
 }
diff --git a/extensions/consul/deployment/src/main/java/org/apache/camel/quarkus/component/consul/deployment/ConsulProcessor.java b/extensions/consul/deployment/src/main/java/org/apache/camel/quarkus/component/consul/deployment/ConsulProcessor.java
index 131adba..ac2cf5b 100644
--- a/extensions/consul/deployment/src/main/java/org/apache/camel/quarkus/component/consul/deployment/ConsulProcessor.java
+++ b/extensions/consul/deployment/src/main/java/org/apache/camel/quarkus/component/consul/deployment/ConsulProcessor.java
@@ -16,11 +16,9 @@
  */
 package org.apache.camel.quarkus.component.consul.deployment;
 
-import io.quarkus.deployment.annotations.BuildProducer;
 import io.quarkus.deployment.annotations.BuildStep;
 import io.quarkus.deployment.builditem.ExtensionSslNativeSupportBuildItem;
 import io.quarkus.deployment.builditem.FeatureBuildItem;
-import io.quarkus.deployment.builditem.nativeimage.ReflectiveClassBuildItem;
 
 class ConsulProcessor {
     private static final String FEATURE = "camel-consul";
@@ -35,14 +33,4 @@ class ConsulProcessor {
         return new ExtensionSslNativeSupportBuildItem(FEATURE);
     }
 
-    @BuildStep
-    void reflectiveClasses(BuildProducer<ReflectiveClassBuildItem> reflectiveClasses) {
-        reflectiveClasses.produce(new ReflectiveClassBuildItem(
-                true,
-                false,
-                "org.apache.camel.component.consul.ConsulConfiguration",
-                "org.apache.camel.component.consul.ConsulClientConfiguration",
-                "org.apache.camel.component.consul.health.ConsulHealthCheckRepositoryConfiguration",
-                "org.apache.camel.component.consul.cloud.ConsulServiceRegistryConfiguration"));
-    }
 }
diff --git a/extensions/core-xml/deployment/src/main/java/org/apache/camel/quarkus/component/xml/deployment/XmlProcessor.java b/extensions/core-xml/deployment/src/main/java/org/apache/camel/quarkus/component/xml/deployment/XmlProcessor.java
index 07329c8..19b096b 100644
--- a/extensions/core-xml/deployment/src/main/java/org/apache/camel/quarkus/component/xml/deployment/XmlProcessor.java
+++ b/extensions/core-xml/deployment/src/main/java/org/apache/camel/quarkus/component/xml/deployment/XmlProcessor.java
@@ -24,6 +24,7 @@ import io.quarkus.deployment.builditem.FeatureBuildItem;
 import io.quarkus.jaxb.deployment.JaxbFileRootBuildItem;
 import org.apache.camel.quarkus.component.xml.XmlRecorder;
 import org.apache.camel.quarkus.core.deployment.CamelModelJAXBContextFactoryBuildItem;
+import org.apache.camel.quarkus.core.deployment.CamelModelToXMLDumperBuildItem;
 import org.apache.camel.quarkus.core.deployment.CamelRoutesLoaderBuildItems;
 import org.apache.camel.quarkus.core.deployment.CamelSupport;
 import org.apache.camel.quarkus.support.common.CamelCapabilities;
@@ -56,7 +57,13 @@ class XmlProcessor {
     @BuildStep
     @Record(value = ExecutionTime.STATIC_INIT, optional = true)
     CamelRoutesLoaderBuildItems.Xml xmlLoader(XmlRecorder recorder) {
-        return new CamelRoutesLoaderBuildItems.Xml(recorder.newDefaultXmlLoader());
+        return new CamelRoutesLoaderBuildItems.Xml(recorder.newJaxbXMLRoutesDefinitionLoader());
+    }
+
+    @BuildStep
+    @Record(value = ExecutionTime.STATIC_INIT, optional = true)
+    CamelModelToXMLDumperBuildItem xmlModelDumper(XmlRecorder recorder) {
+        return new CamelModelToXMLDumperBuildItem(recorder.newJaxbModelToXMLDumper());
     }
 
     @BuildStep
diff --git a/extensions/core-xml/runtime/pom.xml b/extensions/core-xml/runtime/pom.xml
index aac5cda..f61467d 100644
--- a/extensions/core-xml/runtime/pom.xml
+++ b/extensions/core-xml/runtime/pom.xml
@@ -48,6 +48,10 @@
 
     <dependencies>
         <dependency>
+            <groupId>org.apache.camel</groupId>
+            <artifactId>camel-xml-jaxb</artifactId>
+        </dependency>
+        <dependency>
             <groupId>org.apache.camel.quarkus</groupId>
             <artifactId>camel-quarkus-core</artifactId>
         </dependency>
diff --git a/extensions/core-xml/runtime/src/main/java/org/apache/camel/quarkus/component/xml/XmlRecorder.java b/extensions/core-xml/runtime/src/main/java/org/apache/camel/quarkus/component/xml/XmlRecorder.java
index 0170587..1469086 100644
--- a/extensions/core-xml/runtime/src/main/java/org/apache/camel/quarkus/component/xml/XmlRecorder.java
+++ b/extensions/core-xml/runtime/src/main/java/org/apache/camel/quarkus/component/xml/XmlRecorder.java
@@ -24,12 +24,15 @@ import org.apache.camel.RuntimeCamelException;
 import org.apache.camel.impl.DefaultModelJAXBContextFactory;
 import org.apache.camel.model.ValidateDefinition;
 import org.apache.camel.model.validator.PredicateValidatorDefinition;
-import org.apache.camel.quarkus.core.XmlRoutesLoader;
 import org.apache.camel.reifier.ProcessorReifier;
 import org.apache.camel.reifier.ValidateReifier;
 import org.apache.camel.reifier.validator.PredicateValidatorReifier;
 import org.apache.camel.reifier.validator.ValidatorReifier;
 import org.apache.camel.spi.ModelJAXBContextFactory;
+import org.apache.camel.spi.ModelToXMLDumper;
+import org.apache.camel.spi.XMLRoutesDefinitionLoader;
+import org.apache.camel.xml.jaxb.JaxbModelToXMLDumper;
+import org.apache.camel.xml.jaxb.JaxbXMLRoutesDefinitionLoader;
 import org.graalvm.nativeimage.ImageInfo;
 
 @Recorder
@@ -47,12 +50,30 @@ public class XmlRecorder {
         return new RuntimeValue<>(factory);
     }
 
-    public RuntimeValue<XmlRoutesLoader> newDefaultXmlLoader() {
-        return new RuntimeValue<>(new DefaultXmlRoutesLoader());
+    public RuntimeValue<XMLRoutesDefinitionLoader> newJaxbXMLRoutesDefinitionLoader() {
+        return new RuntimeValue<>(new JaxbXMLRoutesDefinitionLoader());
+    }
+
+    public RuntimeValue<ModelToXMLDumper> newJaxbModelToXMLDumper() {
+        return new RuntimeValue<>(new JaxbModelToXMLDumper());
     }
 
     public void initXmlReifiers() {
         ProcessorReifier.registerReifier(ValidateDefinition.class, ValidateReifier::new);
         ValidatorReifier.registerReifier(PredicateValidatorDefinition.class, PredicateValidatorReifier::new);
     }
+
+    /*
+    
+    
+    @Override
+    protected XMLRoutesDefinitionLoader createXMLRoutesDefinitionLoader() {
+        return xmlLoader;
+    }
+    
+    @Override
+    protected ModelToXMLDumper createModelToXMLDumper() {
+        return modelDumper;
+    }
+     */
 }
diff --git a/extensions/core/deployment/src/main/java/org/apache/camel/quarkus/core/deployment/BuildProcessor.java b/extensions/core/deployment/src/main/java/org/apache/camel/quarkus/core/deployment/BuildProcessor.java
index 2672806..1783ab3 100644
--- a/extensions/core/deployment/src/main/java/org/apache/camel/quarkus/core/deployment/BuildProcessor.java
+++ b/extensions/core/deployment/src/main/java/org/apache/camel/quarkus/core/deployment/BuildProcessor.java
@@ -334,8 +334,15 @@ class BuildProcessor {
         @Overridable
         @BuildStep
         @Record(value = ExecutionTime.STATIC_INIT, optional = true)
-        public CamelRoutesLoaderBuildItems.Xml createXmlLoader(CamelRecorder recorder) {
-            return new CamelRoutesLoaderBuildItems.Xml(recorder.newDisabledXmlRoutesLoader());
+        public CamelRoutesLoaderBuildItems.Xml createXMLRoutesLoader(CamelRecorder recorder) {
+            return new CamelRoutesLoaderBuildItems.Xml(recorder.newDisabledXMLRoutesDefinitionLoader());
+        }
+
+        @Overridable
+        @BuildStep
+        @Record(value = ExecutionTime.STATIC_INIT, optional = true)
+        public CamelModelToXMLDumperBuildItem createModelToXMLDumper(CamelRecorder recorder) {
+            return new CamelModelToXMLDumperBuildItem(recorder.newDisabledModelToXMLDumper());
         }
 
         @BuildStep
@@ -355,6 +362,7 @@ class BuildProcessor {
                 CamelTypeConverterRegistryBuildItem typeConverterRegistry,
                 CamelModelJAXBContextFactoryBuildItem contextFactory,
                 CamelRoutesLoaderBuildItems.Xml xmlLoader,
+                CamelModelToXMLDumperBuildItem modelDumper,
                 CamelFactoryFinderResolverBuildItem factoryFinderResolverBuildItem,
                 BeanContainerBuildItem beanContainer,
                 CamelConfig config) {
@@ -364,6 +372,7 @@ class BuildProcessor {
                     typeConverterRegistry.getRegistry(),
                     contextFactory.getContextFactory(),
                     xmlLoader.getLoader(),
+                    modelDumper.getValue(),
                     factoryFinderResolverBuildItem.getFactoryFinderResolver(),
                     beanContainer.getValue(),
                     CamelSupport.getCamelVersion(),
diff --git a/extensions/core/runtime/src/main/java/org/apache/camel/quarkus/core/XmlRoutesLoader.java b/extensions/core/deployment/src/main/java/org/apache/camel/quarkus/core/deployment/CamelModelToXMLDumperBuildItem.java
similarity index 61%
rename from extensions/core/runtime/src/main/java/org/apache/camel/quarkus/core/XmlRoutesLoader.java
rename to extensions/core/deployment/src/main/java/org/apache/camel/quarkus/core/deployment/CamelModelToXMLDumperBuildItem.java
index 36a2c1d..0bab4db 100644
--- a/extensions/core/runtime/src/main/java/org/apache/camel/quarkus/core/XmlRoutesLoader.java
+++ b/extensions/core/deployment/src/main/java/org/apache/camel/quarkus/core/deployment/CamelModelToXMLDumperBuildItem.java
@@ -14,18 +14,20 @@
  * See the License for the specific language governing permissions and
  * limitations under the License.
  */
-package org.apache.camel.quarkus.core;
+package org.apache.camel.quarkus.core.deployment;
 
-import java.io.InputStream;
+import io.quarkus.builder.item.SimpleBuildItem;
+import io.quarkus.runtime.RuntimeValue;
+import org.apache.camel.spi.ModelToXMLDumper;
 
-import org.apache.camel.CamelContext;
-import org.apache.camel.model.RoutesDefinition;
-import org.apache.camel.model.rest.RestsDefinition;
+public final class CamelModelToXMLDumperBuildItem extends SimpleBuildItem {
+    private final RuntimeValue<ModelToXMLDumper> value;
 
-public interface XmlRoutesLoader {
-
-    RoutesDefinition loadRoutesDefinition(CamelContext context, InputStream inputStream) throws Exception;
-
-    RestsDefinition loadRestsDefinition(CamelContext context, InputStream is) throws Exception;
+    public CamelModelToXMLDumperBuildItem(RuntimeValue<ModelToXMLDumper> value) {
+        this.value = value;
+    }
 
+    public RuntimeValue<ModelToXMLDumper> getValue() {
+        return value;
+    }
 }
diff --git a/extensions/core/deployment/src/main/java/org/apache/camel/quarkus/core/deployment/CamelRoutesLoaderBuildItems.java b/extensions/core/deployment/src/main/java/org/apache/camel/quarkus/core/deployment/CamelRoutesLoaderBuildItems.java
index 815cff7..5638bbc 100644
--- a/extensions/core/deployment/src/main/java/org/apache/camel/quarkus/core/deployment/CamelRoutesLoaderBuildItems.java
+++ b/extensions/core/deployment/src/main/java/org/apache/camel/quarkus/core/deployment/CamelRoutesLoaderBuildItems.java
@@ -19,7 +19,7 @@ package org.apache.camel.quarkus.core.deployment;
 import io.quarkus.builder.item.SimpleBuildItem;
 import io.quarkus.runtime.RuntimeValue;
 import org.apache.camel.quarkus.core.RegistryRoutesLoader;
-import org.apache.camel.quarkus.core.XmlRoutesLoader;
+import org.apache.camel.spi.XMLRoutesDefinitionLoader;
 
 public final class CamelRoutesLoaderBuildItems {
     private CamelRoutesLoaderBuildItems() {
@@ -41,16 +41,16 @@ public final class CamelRoutesLoaderBuildItems {
     }
 
     /**
-     * Holds the {@link XmlRoutesLoader} instance.
+     * Holds the {@link XMLRoutesDefinitionLoader} instance.
      */
     public static final class Xml extends SimpleBuildItem {
-        private final RuntimeValue<XmlRoutesLoader> value;
+        private final RuntimeValue<XMLRoutesDefinitionLoader> value;
 
-        public Xml(RuntimeValue<XmlRoutesLoader> value) {
+        public Xml(RuntimeValue<XMLRoutesDefinitionLoader> value) {
             this.value = value;
         }
 
-        public RuntimeValue<XmlRoutesLoader> getLoader() {
+        public RuntimeValue<XMLRoutesDefinitionLoader> getLoader() {
             return value;
         }
     }
diff --git a/extensions/core/runtime/pom.xml b/extensions/core/runtime/pom.xml
index 906fd04..c91b25f 100644
--- a/extensions/core/runtime/pom.xml
+++ b/extensions/core/runtime/pom.xml
@@ -77,12 +77,6 @@
         <dependency>
             <groupId>org.apache.camel</groupId>
             <artifactId>camel-core-engine</artifactId>
-            <exclusions>
-                <exclusion>
-                    <groupId>org.apache.camel</groupId>
-                    <artifactId>camel-jaxp</artifactId>
-                </exclusion>
-            </exclusions>
         </dependency>
         <dependency>
             <groupId>org.apache.camel</groupId>
@@ -90,6 +84,10 @@
         </dependency>
         <dependency>
             <groupId>org.apache.camel</groupId>
+            <artifactId>camel-core-catalog</artifactId>
+        </dependency>
+        <dependency>
+            <groupId>org.apache.camel</groupId>
             <artifactId>camel-caffeine-lrucache</artifactId>
         </dependency>
         <dependency>
diff --git a/extensions/core/runtime/src/main/java/org/apache/camel/quarkus/core/CamelMainEventDispatcher.java b/extensions/core/runtime/src/main/java/org/apache/camel/quarkus/core/CamelMainEventDispatcher.java
index 1df54ab..2b6f368 100644
--- a/extensions/core/runtime/src/main/java/org/apache/camel/quarkus/core/CamelMainEventDispatcher.java
+++ b/extensions/core/runtime/src/main/java/org/apache/camel/quarkus/core/CamelMainEventDispatcher.java
@@ -26,6 +26,11 @@ import org.apache.camel.main.MainSupport;
  */
 public class CamelMainEventDispatcher implements org.apache.camel.main.MainListener {
     @Override
+    public void beforeConfigure(BaseMainSupport main) {
+        fireEvent(CamelMainEvents.BeforeConfigure.class, new CamelMainEvents.BeforeConfigure());
+    }
+
+    @Override
     public void configure(CamelContext context) {
         fireEvent(CamelMainEvents.Configure.class, new CamelMainEvents.Configure());
     }
diff --git a/extensions/core/runtime/src/main/java/org/apache/camel/quarkus/core/CamelMainEvents.java b/extensions/core/runtime/src/main/java/org/apache/camel/quarkus/core/CamelMainEvents.java
index 122803a..75b1d0e 100644
--- a/extensions/core/runtime/src/main/java/org/apache/camel/quarkus/core/CamelMainEvents.java
+++ b/extensions/core/runtime/src/main/java/org/apache/camel/quarkus/core/CamelMainEvents.java
@@ -21,6 +21,12 @@ public final class CamelMainEvents {
     }
 
     /**
+     * Event fired by {@link CamelMain} before the CamelContext is configured.
+     */
+    public static class BeforeConfigure {
+    }
+
+    /**
      * Event fired by {@link CamelMain} before the CamelContext is being created and started.
      */
     public static class BeforeStart {
diff --git a/extensions/core/runtime/src/main/java/org/apache/camel/quarkus/core/CamelMainRecorder.java b/extensions/core/runtime/src/main/java/org/apache/camel/quarkus/core/CamelMainRecorder.java
index f023163..ec0d238 100644
--- a/extensions/core/runtime/src/main/java/org/apache/camel/quarkus/core/CamelMainRecorder.java
+++ b/extensions/core/runtime/src/main/java/org/apache/camel/quarkus/core/CamelMainRecorder.java
@@ -21,11 +21,13 @@ import io.quarkus.runtime.RuntimeValue;
 import io.quarkus.runtime.ShutdownContext;
 import io.quarkus.runtime.annotations.Recorder;
 import org.apache.camel.CamelContext;
+import org.apache.camel.ExtendedCamelContext;
 import org.apache.camel.RoutesBuilder;
 import org.apache.camel.impl.engine.DefaultReactiveExecutor;
 import org.apache.camel.main.MainListener;
 import org.apache.camel.main.RoutesCollector;
 import org.apache.camel.spi.ReactiveExecutor;
+import org.apache.camel.spi.XMLRoutesDefinitionLoader;
 
 @Recorder
 public class CamelMainRecorder {
@@ -75,7 +77,7 @@ public class CamelMainRecorder {
     }
 
     public void setReactiveExecutor(RuntimeValue<CamelMain> main, RuntimeValue<ReactiveExecutor> executor) {
-        main.getValue().getCamelContext().setReactiveExecutor(executor.getValue());
+        main.getValue().getCamelContext().adapt(ExtendedCamelContext.class).setReactiveExecutor(executor.getValue());
     }
 
     public void start(ShutdownContext shutdown, RuntimeValue<CamelMain> main) {
@@ -100,7 +102,7 @@ public class CamelMainRecorder {
 
     public RuntimeValue<RoutesCollector> newRoutesCollector(
             RuntimeValue<RegistryRoutesLoader> registryRoutesLoader,
-            RuntimeValue<XmlRoutesLoader> xmlRoutesLoader) {
+            RuntimeValue<XMLRoutesDefinitionLoader> xmlRoutesLoader) {
 
         return new RuntimeValue<>(new CamelRoutesCollector(registryRoutesLoader.getValue(), xmlRoutesLoader.getValue()));
     }
diff --git a/extensions/core/runtime/src/main/java/org/apache/camel/quarkus/core/CamelRecorder.java b/extensions/core/runtime/src/main/java/org/apache/camel/quarkus/core/CamelRecorder.java
index db05027..35e5688 100644
--- a/extensions/core/runtime/src/main/java/org/apache/camel/quarkus/core/CamelRecorder.java
+++ b/extensions/core/runtime/src/main/java/org/apache/camel/quarkus/core/CamelRecorder.java
@@ -20,17 +20,19 @@ import io.quarkus.arc.runtime.BeanContainer;
 import io.quarkus.runtime.RuntimeValue;
 import io.quarkus.runtime.annotations.Recorder;
 import org.apache.camel.CamelContext;
+import org.apache.camel.catalog.RuntimeCamelCatalog;
 import org.apache.camel.model.ValidateDefinition;
 import org.apache.camel.model.validator.PredicateValidatorDefinition;
 import org.apache.camel.quarkus.core.FastFactoryFinderResolver.Builder;
 import org.apache.camel.reifier.ProcessorReifier;
 import org.apache.camel.reifier.validator.ValidatorReifier;
-import org.apache.camel.runtimecatalog.RuntimeCamelCatalog;
 import org.apache.camel.spi.FactoryFinderResolver;
 import org.apache.camel.spi.ModelJAXBContextFactory;
+import org.apache.camel.spi.ModelToXMLDumper;
 import org.apache.camel.spi.Registry;
 import org.apache.camel.spi.TypeConverterLoader;
 import org.apache.camel.spi.TypeConverterRegistry;
+import org.apache.camel.spi.XMLRoutesDefinitionLoader;
 
 @Recorder
 public class CamelRecorder {
@@ -60,21 +62,24 @@ public class CamelRecorder {
             RuntimeValue<Registry> registry,
             RuntimeValue<TypeConverterRegistry> typeConverterRegistry,
             RuntimeValue<ModelJAXBContextFactory> contextFactory,
-            RuntimeValue<XmlRoutesLoader> xmlLoader,
+            RuntimeValue<XMLRoutesDefinitionLoader> xmlLoader,
+            RuntimeValue<ModelToXMLDumper> xmlModelDumper,
             RuntimeValue<FactoryFinderResolver> factoryFinderResolver,
             BeanContainer beanContainer,
             String version,
             CamelConfig config) {
 
-        FastCamelContext context = new FastCamelContext(factoryFinderResolver.getValue(), version);
-        context.setDefaultExtension(RuntimeCamelCatalog.class, () -> new CamelRuntimeCatalog(context, config.runtimeCatalog));
+        FastCamelContext context = new FastCamelContext(
+                factoryFinderResolver.getValue(),
+                version,
+                xmlLoader.getValue(),
+                xmlModelDumper.getValue());
+
+        context.setDefaultExtension(RuntimeCamelCatalog.class, () -> new CamelRuntimeCatalog(config.runtimeCatalog));
         context.setRegistry(registry.getValue());
         context.setTypeConverterRegistry(typeConverterRegistry.getValue());
         context.setLoadTypeConverters(false);
         context.setModelJAXBContextFactory(contextFactory.getValue());
-
-        FastModel model = new FastModel(context, xmlLoader.getValue());
-        context.setModel(model);
         context.init();
 
         // register to the container
@@ -122,8 +127,12 @@ public class CamelRecorder {
         return new RuntimeValue<>(new DisabledModelJAXBContextFactory());
     }
 
-    public RuntimeValue<XmlRoutesLoader> newDisabledXmlRoutesLoader() {
-        return new RuntimeValue<>(new DisabledXmlRoutesLoader());
+    public RuntimeValue<XMLRoutesDefinitionLoader> newDisabledXMLRoutesDefinitionLoader() {
+        return new RuntimeValue<>(new DisabledXMLRoutesDefinitionLoader());
+    }
+
+    public RuntimeValue<ModelToXMLDumper> newDisabledModelToXMLDumper() {
+        return new RuntimeValue<>(new DisabledModelToXMLDumper());
     }
 
     public RuntimeValue<RegistryRoutesLoader> newDefaultRegistryRoutesLoader() {
diff --git a/extensions/core/runtime/src/main/java/org/apache/camel/quarkus/core/CamelRoutesCollector.java b/extensions/core/runtime/src/main/java/org/apache/camel/quarkus/core/CamelRoutesCollector.java
index 8f63cea..0c63b2a 100644
--- a/extensions/core/runtime/src/main/java/org/apache/camel/quarkus/core/CamelRoutesCollector.java
+++ b/extensions/core/runtime/src/main/java/org/apache/camel/quarkus/core/CamelRoutesCollector.java
@@ -29,6 +29,7 @@ import org.apache.camel.main.RoutesCollector;
 import org.apache.camel.model.RoutesDefinition;
 import org.apache.camel.model.rest.RestsDefinition;
 import org.apache.camel.spi.PackageScanResourceResolver;
+import org.apache.camel.spi.XMLRoutesDefinitionLoader;
 import org.slf4j.Logger;
 import org.slf4j.LoggerFactory;
 
@@ -36,9 +37,9 @@ public class CamelRoutesCollector implements RoutesCollector {
     private static final Logger LOGGER = LoggerFactory.getLogger(CamelRoutesCollector.class);
 
     private final RegistryRoutesLoader registryRoutesLoader;
-    private final XmlRoutesLoader xmlRoutesLoader;
+    private final XMLRoutesDefinitionLoader xmlRoutesLoader;
 
-    public CamelRoutesCollector(RegistryRoutesLoader registryRoutesLoader, XmlRoutesLoader xmlRoutesLoader) {
+    public CamelRoutesCollector(RegistryRoutesLoader registryRoutesLoader, XMLRoutesDefinitionLoader xmlRoutesLoader) {
         this.registryRoutesLoader = registryRoutesLoader;
         this.xmlRoutesLoader = xmlRoutesLoader;
     }
@@ -47,7 +48,7 @@ public class CamelRoutesCollector implements RoutesCollector {
         return registryRoutesLoader;
     }
 
-    public XmlRoutesLoader getXmlRoutesLoader() {
+    public XMLRoutesDefinitionLoader getXmlRoutesLoader() {
         return xmlRoutesLoader;
     }
 
@@ -69,7 +70,10 @@ public class CamelRoutesCollector implements RoutesCollector {
             LOGGER.info("Loading additional Camel XML routes from: {}", part);
             try {
                 for (InputStream is : resolver.findResources(part)) {
-                    answer.add(xmlRoutesLoader.loadRoutesDefinition(camelContext, is));
+                    Object definition = xmlRoutesLoader.loadRoutesDefinition(camelContext, is);
+                    if (definition instanceof RoutesDefinition) {
+                        answer.add((RoutesDefinition) definition);
+                    }
                 }
             } catch (FileNotFoundException e) {
                 LOGGER.debug("No XML routes found in {}. Skipping XML routes detection.", part);
@@ -90,7 +94,10 @@ public class CamelRoutesCollector implements RoutesCollector {
             LOGGER.info("Loading additional Camel XML rests from: {}", part);
             try {
                 for (InputStream is : resolver.findResources(part)) {
-                    answer.add(xmlRoutesLoader.loadRestsDefinition(camelContext, is));
+                    Object definition = xmlRoutesLoader.loadRestsDefinition(camelContext, is);
+                    if (definition instanceof RestsDefinition) {
+                        answer.add((RestsDefinition) definition);
+                    }
                 }
             } catch (FileNotFoundException e) {
                 LOGGER.debug("No XML rests found in {}. Skipping XML rests detection.", part);
diff --git a/extensions/core/runtime/src/main/java/org/apache/camel/quarkus/core/CamelRuntimeCatalog.java b/extensions/core/runtime/src/main/java/org/apache/camel/quarkus/core/CamelRuntimeCatalog.java
index 5b56b9c..98474b3 100644
--- a/extensions/core/runtime/src/main/java/org/apache/camel/quarkus/core/CamelRuntimeCatalog.java
+++ b/extensions/core/runtime/src/main/java/org/apache/camel/quarkus/core/CamelRuntimeCatalog.java
@@ -16,15 +16,12 @@
  */
 package org.apache.camel.quarkus.core;
 
-import org.apache.camel.CamelContext;
-import org.apache.camel.runtimecatalog.impl.DefaultRuntimeCamelCatalog;
+import org.apache.camel.catalog.impl.DefaultRuntimeCamelCatalog;
 
 public class CamelRuntimeCatalog extends DefaultRuntimeCamelCatalog {
     private final CamelConfig.RuntimeCatalogConfig config;
 
-    public CamelRuntimeCatalog(CamelContext camelContext, CamelConfig.RuntimeCatalogConfig config) {
-        super(camelContext, true);
-
+    public CamelRuntimeCatalog(CamelConfig.RuntimeCatalogConfig config) {
         this.config = config;
     }
 
diff --git a/extensions/core/runtime/src/main/java/org/apache/camel/quarkus/core/DisabledXmlRoutesLoader.java b/extensions/core/runtime/src/main/java/org/apache/camel/quarkus/core/DisabledModelToXMLDumper.java
similarity index 73%
rename from extensions/core/runtime/src/main/java/org/apache/camel/quarkus/core/DisabledXmlRoutesLoader.java
rename to extensions/core/runtime/src/main/java/org/apache/camel/quarkus/core/DisabledModelToXMLDumper.java
index b470294..94f2f03 100644
--- a/extensions/core/runtime/src/main/java/org/apache/camel/quarkus/core/DisabledXmlRoutesLoader.java
+++ b/extensions/core/runtime/src/main/java/org/apache/camel/quarkus/core/DisabledModelToXMLDumper.java
@@ -16,22 +16,19 @@
  */
 package org.apache.camel.quarkus.core;
 
-import java.io.InputStream;
-
 import org.apache.camel.CamelContext;
-import org.apache.camel.model.RoutesDefinition;
-import org.apache.camel.model.rest.RestsDefinition;
-
-public class DisabledXmlRoutesLoader implements XmlRoutesLoader {
+import org.apache.camel.NamedNode;
+import org.apache.camel.spi.ModelToXMLDumper;
 
+public class DisabledModelToXMLDumper implements ModelToXMLDumper {
     @Override
-    public RoutesDefinition loadRoutesDefinition(CamelContext context, InputStream inputStream) throws Exception {
+    public String dumpModelAsXml(CamelContext context, NamedNode definition) throws Exception {
         throw new UnsupportedOperationException("Please add a dependency to camel-quarkus-core-xml");
     }
 
     @Override
-    public RestsDefinition loadRestsDefinition(CamelContext context, InputStream is) throws Exception {
+    public String dumpModelAsXml(CamelContext context, NamedNode definition, boolean resolvePlaceholders,
+            boolean resolveDelegateEndpoints) throws Exception {
         throw new UnsupportedOperationException("Please add a dependency to camel-quarkus-core-xml");
     }
-
 }
diff --git a/extensions/core/runtime/src/main/java/org/apache/camel/quarkus/core/DisabledPredicateValidatorReifier.java b/extensions/core/runtime/src/main/java/org/apache/camel/quarkus/core/DisabledPredicateValidatorReifier.java
index ee6347f..ef4c206 100644
--- a/extensions/core/runtime/src/main/java/org/apache/camel/quarkus/core/DisabledPredicateValidatorReifier.java
+++ b/extensions/core/runtime/src/main/java/org/apache/camel/quarkus/core/DisabledPredicateValidatorReifier.java
@@ -24,12 +24,12 @@ import org.apache.camel.spi.Validator;
 
 public class DisabledPredicateValidatorReifier extends ValidatorReifier<PredicateValidatorDefinition> {
 
-    public DisabledPredicateValidatorReifier(ValidatorDefinition definition) {
-        super((PredicateValidatorDefinition) definition);
+    public DisabledPredicateValidatorReifier(CamelContext camelContext, ValidatorDefinition definition) {
+        super(camelContext, (PredicateValidatorDefinition) definition);
     }
 
     @Override
-    protected Validator doCreateValidator(CamelContext context) throws Exception {
+    protected Validator doCreateValidator() {
         throw new UnsupportedOperationException("Please add a dependency to camel-quarkus-core-xml");
     }
 
diff --git a/extensions/core/runtime/src/main/java/org/apache/camel/quarkus/core/DisabledValidateReifier.java b/extensions/core/runtime/src/main/java/org/apache/camel/quarkus/core/DisabledValidateReifier.java
index 6eb8f75..4d796f8 100644
--- a/extensions/core/runtime/src/main/java/org/apache/camel/quarkus/core/DisabledValidateReifier.java
+++ b/extensions/core/runtime/src/main/java/org/apache/camel/quarkus/core/DisabledValidateReifier.java
@@ -24,12 +24,12 @@ import org.apache.camel.spi.RouteContext;
 
 public class DisabledValidateReifier extends ProcessorReifier<ValidateDefinition> {
 
-    public DisabledValidateReifier(ProcessorDefinition<?> definition) {
-        super((ValidateDefinition) definition);
+    public DisabledValidateReifier(RouteContext routeContext, ProcessorDefinition<?> definition) {
+        super(routeContext, (ValidateDefinition) definition);
     }
 
     @Override
-    public Processor createProcessor(RouteContext routeContext) throws Exception {
+    public Processor createProcessor() throws Exception {
         throw new UnsupportedOperationException("Please add a dependency to camel-quarkus-core-xml");
     }
 }
diff --git a/extensions/core-xml/runtime/src/main/java/org/apache/camel/quarkus/component/xml/DefaultXmlRoutesLoader.java b/extensions/core/runtime/src/main/java/org/apache/camel/quarkus/core/DisabledXMLRoutesDefinitionLoader.java
similarity index 51%
rename from extensions/core-xml/runtime/src/main/java/org/apache/camel/quarkus/component/xml/DefaultXmlRoutesLoader.java
rename to extensions/core/runtime/src/main/java/org/apache/camel/quarkus/core/DisabledXMLRoutesDefinitionLoader.java
index c9e1455..c38edc8 100644
--- a/extensions/core-xml/runtime/src/main/java/org/apache/camel/quarkus/component/xml/DefaultXmlRoutesLoader.java
+++ b/extensions/core/runtime/src/main/java/org/apache/camel/quarkus/core/DisabledXMLRoutesDefinitionLoader.java
@@ -14,26 +14,27 @@
  * See the License for the specific language governing permissions and
  * limitations under the License.
  */
-package org.apache.camel.quarkus.component.xml;
+package org.apache.camel.quarkus.core;
 
 import java.io.InputStream;
 
 import org.apache.camel.CamelContext;
-import org.apache.camel.model.ModelHelper;
-import org.apache.camel.model.RoutesDefinition;
-import org.apache.camel.model.rest.RestsDefinition;
-import org.apache.camel.quarkus.core.XmlRoutesLoader;
-
-public class DefaultXmlRoutesLoader implements XmlRoutesLoader {
+import org.apache.camel.NamedNode;
+import org.apache.camel.spi.XMLRoutesDefinitionLoader;
 
+public class DisabledXMLRoutesDefinitionLoader implements XMLRoutesDefinitionLoader {
     @Override
-    public RoutesDefinition loadRoutesDefinition(CamelContext context, InputStream is) throws Exception {
-        return ModelHelper.loadRoutesDefinition(context, is);
+    public Object loadRoutesDefinition(CamelContext context, InputStream inputStream) throws Exception {
+        throw new UnsupportedOperationException("Please add a dependency to camel-quarkus-core-xml");
     }
 
     @Override
-    public RestsDefinition loadRestsDefinition(CamelContext context, InputStream is) throws Exception {
-        return ModelHelper.loadRestsDefinition(context, is);
+    public Object loadRestsDefinition(CamelContext context, InputStream inputStream) throws Exception {
+        throw new UnsupportedOperationException("Please add a dependency to camel-quarkus-core-xml");
     }
 
+    @Override
+    public <T extends NamedNode> T createModelFromXml(CamelContext context, String xml, Class<T> type) throws Exception {
+        throw new UnsupportedOperationException("Please add a dependency to camel-quarkus-core-xml");
+    }
 }
diff --git a/extensions/core/runtime/src/main/java/org/apache/camel/quarkus/core/FastCamelContext.java b/extensions/core/runtime/src/main/java/org/apache/camel/quarkus/core/FastCamelContext.java
index 1a2640b..da27c25 100644
--- a/extensions/core/runtime/src/main/java/org/apache/camel/quarkus/core/FastCamelContext.java
+++ b/extensions/core/runtime/src/main/java/org/apache/camel/quarkus/core/FastCamelContext.java
@@ -26,15 +26,14 @@ import org.apache.camel.AsyncProcessor;
 import org.apache.camel.CatalogCamelContext;
 import org.apache.camel.Component;
 import org.apache.camel.Endpoint;
-import org.apache.camel.PollingConsumer;
 import org.apache.camel.Processor;
-import org.apache.camel.Producer;
 import org.apache.camel.TypeConverter;
+import org.apache.camel.catalog.RuntimeCamelCatalog;
+import org.apache.camel.catalog.impl.DefaultRuntimeCamelCatalog;
 import org.apache.camel.component.microprofile.config.CamelMicroProfilePropertiesSource;
 import org.apache.camel.health.HealthCheckRegistry;
 import org.apache.camel.impl.DefaultExecutorServiceManager;
 import org.apache.camel.impl.engine.AbstractCamelContext;
-import org.apache.camel.impl.engine.BaseRouteService;
 import org.apache.camel.impl.engine.BeanProcessorFactoryResolver;
 import org.apache.camel.impl.engine.BeanProxyFactoryResolver;
 import org.apache.camel.impl.engine.DefaultAsyncProcessorAwaitManager;
@@ -43,6 +42,7 @@ import org.apache.camel.impl.engine.DefaultCamelBeanPostProcessor;
 import org.apache.camel.impl.engine.DefaultCamelContextNameStrategy;
 import org.apache.camel.impl.engine.DefaultClassResolver;
 import org.apache.camel.impl.engine.DefaultComponentResolver;
+import org.apache.camel.impl.engine.DefaultConfigurerResolver;
 import org.apache.camel.impl.engine.DefaultDataFormatResolver;
 import org.apache.camel.impl.engine.DefaultEndpointRegistry;
 import org.apache.camel.impl.engine.DefaultInflightRepository;
@@ -63,13 +63,11 @@ import org.apache.camel.impl.engine.DefaultValidatorRegistry;
 import org.apache.camel.impl.engine.EndpointKey;
 import org.apache.camel.impl.engine.HeadersMapFactoryResolver;
 import org.apache.camel.impl.engine.RestRegistryFactoryResolver;
-import org.apache.camel.impl.engine.ServicePool;
 import org.apache.camel.impl.health.DefaultHealthCheckRegistry;
 import org.apache.camel.impl.transformer.TransformerKey;
 import org.apache.camel.impl.validator.ValidatorKey;
 import org.apache.camel.model.Model;
 import org.apache.camel.processor.MulticastProcessor;
-import org.apache.camel.quarkus.core.FastModel.FastRouteContext;
 import org.apache.camel.spi.AsyncProcessorAwaitManager;
 import org.apache.camel.spi.BeanIntrospection;
 import org.apache.camel.spi.BeanProcessorFactory;
@@ -78,6 +76,7 @@ import org.apache.camel.spi.CamelBeanPostProcessor;
 import org.apache.camel.spi.CamelContextNameStrategy;
 import org.apache.camel.spi.ClassResolver;
 import org.apache.camel.spi.ComponentResolver;
+import org.apache.camel.spi.ConfigurerResolver;
 import org.apache.camel.spi.DataFormat;
 import org.apache.camel.spi.DataFormatResolver;
 import org.apache.camel.spi.EndpointRegistry;
@@ -91,6 +90,7 @@ import org.apache.camel.spi.LanguageResolver;
 import org.apache.camel.spi.ManagementNameStrategy;
 import org.apache.camel.spi.MessageHistoryFactory;
 import org.apache.camel.spi.ModelJAXBContextFactory;
+import org.apache.camel.spi.ModelToXMLDumper;
 import org.apache.camel.spi.NodeIdFactory;
 import org.apache.camel.spi.PackageScanClassResolver;
 import org.apache.camel.spi.PackageScanResourceResolver;
@@ -108,35 +108,31 @@ import org.apache.camel.spi.TypeConverterRegistry;
 import org.apache.camel.spi.UnitOfWorkFactory;
 import org.apache.camel.spi.UuidGenerator;
 import org.apache.camel.spi.ValidatorRegistry;
+import org.apache.camel.spi.XMLRoutesDefinitionLoader;
 import org.apache.camel.support.CamelContextHelper;
 import org.apache.camel.util.IOHelper;
 
 public class FastCamelContext extends AbstractCamelContext implements CatalogCamelContext {
-    private Model model;
+    private final Model model;
     private final String version;
+    private final XMLRoutesDefinitionLoader xmlLoader;
+    private final ModelToXMLDumper modelDumper;
 
-    public FastCamelContext(FactoryFinderResolver factoryFinderResolver, String version) {
+    public FastCamelContext(FactoryFinderResolver factoryFinderResolver, String version, XMLRoutesDefinitionLoader xmlLoader,
+            ModelToXMLDumper modelDumper) {
         super(false);
 
         this.version = version;
+        this.xmlLoader = xmlLoader;
+        this.modelDumper = modelDumper;
+        this.model = new FastModel(this);
 
         setFactoryFinderResolver(factoryFinderResolver);
         setTracing(Boolean.FALSE);
         setDebugging(Boolean.FALSE);
         setMessageHistory(Boolean.FALSE);
-
         setDefaultExtension(HealthCheckRegistry.class, DefaultHealthCheckRegistry::new);
-    }
-
-    public void setModel(Model model) {
-        this.model = model;
-    }
 
-    public void clearModel() {
-        this.model = null;
-        for (BaseRouteService rs : getRouteServices().values()) {
-            ((FastRouteContext) rs.getRouteContext()).clearModel();
-        }
     }
 
     @Override
@@ -274,16 +270,6 @@ public class FastCamelContext extends AbstractCamelContext implements CatalogCam
     }
 
     @Override
-    protected ServicePool<Producer> createProducerServicePool() {
-        return new ServicePool<>(Endpoint::createProducer, Producer::getEndpoint, 100);
-    }
-
-    @Override
-    protected ServicePool<PollingConsumer> createPollingConsumerServicePool() {
-        return new ServicePool<>(Endpoint::createPollingConsumer, PollingConsumer::getEndpoint, 100);
-    }
-
-    @Override
     protected UnitOfWorkFactory createUnitOfWorkFactory() {
         return new DefaultUnitOfWorkFactory();
     }
@@ -328,6 +314,21 @@ public class FastCamelContext extends AbstractCamelContext implements CatalogCam
     }
 
     @Override
+    protected XMLRoutesDefinitionLoader createXMLRoutesDefinitionLoader() {
+        return xmlLoader;
+    }
+
+    @Override
+    protected ModelToXMLDumper createModelToXMLDumper() {
+        return modelDumper;
+    }
+
+    @Override
+    protected RuntimeCamelCatalog createRuntimeCamelCatalog() {
+        return new DefaultRuntimeCamelCatalog();
+    }
+
+    @Override
     protected Tracer createTracer() {
         Tracer tracer = null;
         if (getRegistry() != null) {
@@ -365,12 +366,12 @@ public class FastCamelContext extends AbstractCamelContext implements CatalogCam
     }
 
     @Override
-    protected TransformerRegistry<TransformerKey> createTransformerRegistry() throws Exception {
+    protected TransformerRegistry<TransformerKey> createTransformerRegistry() {
         return new DefaultTransformerRegistry(this);
     }
 
     @Override
-    protected ValidatorRegistry<ValidatorKey> createValidatorRegistry() throws Exception {
+    protected ValidatorRegistry<ValidatorKey> createValidatorRegistry() {
         return new DefaultValidatorRegistry(this);
     }
 
@@ -387,6 +388,11 @@ public class FastCamelContext extends AbstractCamelContext implements CatalogCam
     }
 
     @Override
+    protected ConfigurerResolver createConfigurerResolver() {
+        return new DefaultConfigurerResolver();
+    }
+
+    @Override
     public void setTypeConverterRegistry(TypeConverterRegistry typeConverterRegistry) {
         super.setTypeConverterRegistry(typeConverterRegistry);
 
@@ -486,7 +492,6 @@ public class FastCamelContext extends AbstractCamelContext implements CatalogCam
 
         if (inputStream != null) {
             try {
-                log.debug("loading scheme {} ", path);
                 return IOHelper.loadText(inputStream);
             } finally {
                 IOHelper.close(inputStream);
diff --git a/extensions/core/runtime/src/main/java/org/apache/camel/quarkus/core/FastModel.java b/extensions/core/runtime/src/main/java/org/apache/camel/quarkus/core/FastModel.java
index 182f252..9be64bd 100644
--- a/extensions/core/runtime/src/main/java/org/apache/camel/quarkus/core/FastModel.java
+++ b/extensions/core/runtime/src/main/java/org/apache/camel/quarkus/core/FastModel.java
@@ -40,12 +40,8 @@ import org.apache.camel.reifier.RouteReifier;
 import org.apache.camel.support.CamelContextHelper;
 
 public class FastModel extends BaseModel {
-
-    private final XmlRoutesLoader xmlLoader;
-
-    public FastModel(CamelContext camelContext, XmlRoutesLoader xmlLoader) {
+    public FastModel(CamelContext camelContext) {
         super(camelContext);
-        this.xmlLoader = xmlLoader;
     }
 
     @Override
@@ -58,7 +54,7 @@ public class FastModel extends BaseModel {
         try {
             String id = routeDefinition.idOrCreate(camelContext.adapt(ExtendedCamelContext.class).getNodeIdFactory());
             FastRouteContext routeContext = new FastRouteContext(camelContext, routeDefinition, id);
-            Route route = new RouteReifier(routeDefinition).createRoute(camelContext, routeContext);
+            Route route = new RouteReifier(routeContext, routeDefinition).createRoute();
             FastRouteService routeService = createRouteService(route);
             mcc.startRouteService(routeService, true);
         } finally {
diff --git a/extensions/core/runtime/src/main/java/org/apache/camel/quarkus/core/FastTypeConverter.java b/extensions/core/runtime/src/main/java/org/apache/camel/quarkus/core/FastTypeConverter.java
index 3a829ff..178250f 100644
--- a/extensions/core/runtime/src/main/java/org/apache/camel/quarkus/core/FastTypeConverter.java
+++ b/extensions/core/runtime/src/main/java/org/apache/camel/quarkus/core/FastTypeConverter.java
@@ -18,8 +18,12 @@ package org.apache.camel.quarkus.core;
 
 import org.apache.camel.impl.converter.DefaultTypeConverter;
 import org.apache.camel.spi.TypeConverterLoader;
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
 
 public class FastTypeConverter extends DefaultTypeConverter {
+    private static final Logger LOG = LoggerFactory.getLogger(FastTypeConverter.class);
+
     public FastTypeConverter() {
         super(null, null, null, null, false);
     }
@@ -27,7 +31,7 @@ public class FastTypeConverter extends DefaultTypeConverter {
     @Override
     protected void doStart() throws Exception {
         for (TypeConverterLoader loader : getCamelContext().getRegistry().findByType(TypeConverterLoader.class)) {
-            log.debug("TypeConverterLoader: {} loading converters", loader);
+            LOG.debug("TypeConverterLoader: {} loading converters", loader);
             loader.load(this);
         }
     }
@@ -36,9 +40,4 @@ public class FastTypeConverter extends DefaultTypeConverter {
     public void loadCoreAndFastTypeConverters() throws Exception {
         throw new UnsupportedOperationException();
     }
-
-    @Override
-    protected void initTypeConverterLoaders() {
-        // no-op
-    }
 }
diff --git a/extensions/pdf/deployment/src/main/java/org/apache/camel/quarkus/component/pdf/deployment/PdfProcessor.java b/extensions/pdf/deployment/src/main/java/org/apache/camel/quarkus/component/pdf/deployment/PdfProcessor.java
index e7bbf14..612e673 100644
--- a/extensions/pdf/deployment/src/main/java/org/apache/camel/quarkus/component/pdf/deployment/PdfProcessor.java
+++ b/extensions/pdf/deployment/src/main/java/org/apache/camel/quarkus/component/pdf/deployment/PdfProcessor.java
@@ -19,9 +19,8 @@ package org.apache.camel.quarkus.component.pdf.deployment;
 import io.quarkus.deployment.annotations.BuildProducer;
 import io.quarkus.deployment.annotations.BuildStep;
 import io.quarkus.deployment.builditem.FeatureBuildItem;
-import io.quarkus.deployment.builditem.nativeimage.NativeImageConfigBuildItem;
 import io.quarkus.deployment.builditem.nativeimage.NativeImageResourceBuildItem;
-import io.quarkus.deployment.builditem.nativeimage.ReflectiveClassBuildItem;
+import io.quarkus.deployment.builditem.nativeimage.RuntimeInitializedClassBuildItem;
 
 class PdfProcessor {
 
@@ -32,6 +31,12 @@ class PdfProcessor {
             "org/apache/pdfbox/resources/glyphlist/additional.txt",
             "org/apache/pdfbox/resources/ttf/LiberationSans-Regular.ttf" };
 
+    private static final String[] RUNTIME_INITIALIZED_CLASSES = new String[] {
+            "org.apache.pdfbox.pdmodel.font.PDType1Font",
+            "org.apache.camel.component.pdf.PdfConfiguration",
+            "org.apache.camel.component.pdf.Standard14Fonts",
+    };
+
     @BuildStep
     FeatureBuildItem feature() {
         return new FeatureBuildItem(FEATURE);
@@ -43,11 +48,9 @@ class PdfProcessor {
     }
 
     @BuildStep
-    NativeImageConfigBuildItem build(BuildProducer<ReflectiveClassBuildItem> reflectiveClass) {
-        return NativeImageConfigBuildItem.builder()
-                .addRuntimeInitializedClass("org.apache.pdfbox.pdmodel.font.PDType1Font")
-                .addRuntimeInitializedClass("org.apache.camel.component.pdf.PdfConfiguration")
-                .build();
+    void configureRuntimeInitializedClasses(BuildProducer<RuntimeInitializedClassBuildItem> runtimeInitializedClass) {
+        for (String className : RUNTIME_INITIALIZED_CLASSES) {
+            runtimeInitializedClass.produce(new RuntimeInitializedClassBuildItem(className));
+        }
     }
-
 }
diff --git a/extensions/readme.adoc b/extensions/readme.adoc
index 5e35761..463ca6b 100644
--- a/extensions/readme.adoc
+++ b/extensions/readme.adoc
@@ -5,7 +5,7 @@ Apache Camel Quarkus supports the following Camel artifacts as Quarkus Extension
 == Camel Components
 
 // components: START
-Number of Camel components: 65 in 56 JAR artifacts (0 deprecated)
+Number of Camel components: 66 in 57 JAR artifacts (0 deprecated)
 
 [width="100%",cols="4,1,5",options="header"]
 |===
@@ -51,7 +51,7 @@ Number of Camel components: 65 in 56 JAR artifacts (0 deprecated)
 `aws-sqs:queueNameOrArn` | 0.2.0 | The aws-sqs component is used for sending and receiving messages to Amazon's SQS service.
 
 | link:https://camel.apache.org/components/latest/aws-translate-component.html[AWS Translate] (camel-quarkus-aws-translate) +
-`aws-translate:label` | 1.0.0-M3 | The aws-kms is used for managing Amazon Translate
+`aws-translate:label` | 1.0.0-M3 | The aws-translate component is used for managing Amazon Translate
 
 | link:https://camel.apache.org/components/latest/bean-component.html[Bean] (camel-quarkus-bean) +
 `bean:beanName` | 0.2.0 | The bean component is for invoking Java beans from Camel.
@@ -63,7 +63,7 @@ Number of Camel components: 65 in 56 JAR artifacts (0 deprecated)
 `box:apiName/methodName` | 1.2.0 | For uploading downloading and managing files folders groups collaborations etc on box DOT com.
 
 | link:https://camel.apache.org/components/latest/class-component.html[Class] (camel-quarkus-bean) +
-`class:beanName` | 0.2.0 | The class component is for invoking Java classes (Java beans) from Camel.
+`class:beanName` | 0.2.0 | The Class component is for invoking Java classes (Java beans) from Camel.
 
 | link:https://camel.apache.org/components/latest/consul-component.html[Consul] (camel-quarkus-consul) +
 `consul:apiEndpoint` | 1.0.0-M3 | The camel consul component allows you to work with Consul, a distributed, highly available, datacenter-aware, service discovery and configuration system.
@@ -264,7 +264,7 @@ Number of Camel languages: 9 in 3 JAR artifacts (0 deprecated)
 
 | link:https://camel.apache.org/components/latest/bean-language.html[Bean method] (camel-quarkus-bean) | 0.2.0 | To use a Java bean (aka method call) in Camel expressions or predicates.
 
-| link:https://camel.apache.org/components/latest/constant-language.html[Constant] (camel-quarkus-core) | 0.2.0 | To use a constant value in Camel expressions or predicates.
+| link:https://camel.apache.org/components/latest/constant-language.html[Constant] (camel-quarkus-core) | 0.2.0 | To use a constant value in Camel expressions or predicates. Important: this is a fixed constant value that is only set once during starting up the route, do not use this if you want dynamic values during routing.
 
 | link:https://camel.apache.org/components/latest/exchangeProperty-language.html[ExchangeProperty] (camel-quarkus-core) | 0.2.0 | To use a Camel Exchange property in expressions or predicates.
 
diff --git a/extensions/support/policy/deployment/src/main/java/org/apache/camel/quarkus/component/support/policy/deployment/PolicyProcessor.java b/extensions/support/policy/deployment/src/main/java/org/apache/camel/quarkus/component/support/policy/deployment/PolicyProcessor.java
index 8993afa..9a2ce53 100644
--- a/extensions/support/policy/deployment/src/main/java/org/apache/camel/quarkus/component/support/policy/deployment/PolicyProcessor.java
+++ b/extensions/support/policy/deployment/src/main/java/org/apache/camel/quarkus/component/support/policy/deployment/PolicyProcessor.java
@@ -65,13 +65,7 @@ class PolicyProcessor {
                 "org.apache.camel.component.fhir.FhirHistoryEndpointConfiguration",
                 "org.apache.camel.component.fhir.FhirMetaEndpointConfiguration",
                 "org.apache.camel.component.fhir.FhirPatchEndpointConfiguration",
-                "org.apache.camel.component.fhir.FhirDeleteEndpointConfiguration",
-
-                /* org.apache.camel.component.consul.* can be removed after the upgrade to Camel 3.1 */
-                "org.apache.camel.component.consul.ConsulConfiguration",
-                "org.apache.camel.component.consul.ConsulClientConfiguration",
-                "org.apache.camel.component.consul.health.ConsulHealthCheckRepositoryConfiguration",
-                "org.apache.camel.component.consul.cloud.ConsulServiceRegistryConfiguration");
+                "org.apache.camel.component.fhir.FhirDeleteEndpointConfiguration");
     }
 
     /* Make the build fail as long as there are banned classes registered for reflection */
diff --git a/extensions/support/xml/runtime/pom.xml b/extensions/support/xml/runtime/pom.xml
index e72f1ab..5f99efa 100644
--- a/extensions/support/xml/runtime/pom.xml
+++ b/extensions/support/xml/runtime/pom.xml
@@ -52,7 +52,7 @@
 
         <dependency>
             <groupId>org.apache.camel</groupId>
-            <artifactId>camel-jaxp</artifactId>
+            <artifactId>camel-xml-jaxp</artifactId>
         </dependency>
     </dependencies>
 
diff --git a/integration-tests/bindy/src/main/java/org/apache/camel/quarkus/component/bindy/it/BindyTestRoute.java b/integration-tests/bindy/src/main/java/org/apache/camel/quarkus/component/bindy/it/BindyTestRoute.java
index f98c016..2d26c32 100644
--- a/integration-tests/bindy/src/main/java/org/apache/camel/quarkus/component/bindy/it/BindyTestRoute.java
+++ b/integration-tests/bindy/src/main/java/org/apache/camel/quarkus/component/bindy/it/BindyTestRoute.java
@@ -30,13 +30,13 @@ public class BindyTestRoute extends RouteBuilder {
     public void configure() {
         BindyDataFormat bindyCsvDataFormat = new BindyDataFormat();
         bindyCsvDataFormat.setClassType(CsvOrder.class);
-        bindyCsvDataFormat.setType(BindyType.Csv);
+        bindyCsvDataFormat.setType(BindyType.Csv.name());
         from("direct:jsonToCsv").marshal(bindyCsvDataFormat);
         from("direct:csvToJson").unmarshal(bindyCsvDataFormat);
 
         BindyDataFormat bindyFixedLengthDataFormat = new BindyDataFormat();
         bindyFixedLengthDataFormat.setClassType(FixedLengthOrder.class);
-        bindyFixedLengthDataFormat.setType(BindyType.Fixed);
+        bindyFixedLengthDataFormat.setType(BindyType.Fixed.name());
         from("direct:jsonToFixedLength").marshal(bindyFixedLengthDataFormat);
         from("direct:fixedLengthToJson").unmarshal(bindyFixedLengthDataFormat);
 
diff --git a/integration-tests/core-main-xml/src/main/java/org/apache/camel/quarkus/core/CoreMainXmlResource.java b/integration-tests/core-main-xml/src/main/java/org/apache/camel/quarkus/core/CoreMainXmlResource.java
index 23c6886..1ee7726 100644
--- a/integration-tests/core-main-xml/src/main/java/org/apache/camel/quarkus/core/CoreMainXmlResource.java
+++ b/integration-tests/core-main-xml/src/main/java/org/apache/camel/quarkus/core/CoreMainXmlResource.java
@@ -28,6 +28,7 @@ import javax.ws.rs.Produces;
 import javax.ws.rs.core.MediaType;
 
 import org.apache.camel.CamelContext;
+import org.apache.camel.ExtendedCamelContext;
 import org.apache.camel.spi.Registry;
 
 @Path("/test")
@@ -44,6 +45,8 @@ public class CoreMainXmlResource {
     @GET
     @Produces(MediaType.APPLICATION_JSON)
     public JsonObject describeMain() {
+        final ExtendedCamelContext camelContext = main.getCamelContext().adapt(ExtendedCamelContext.class);
+
         JsonArrayBuilder listeners = Json.createArrayBuilder();
         main.getMainListeners().forEach(listener -> listeners.add(listener.getClass().getName()));
 
@@ -62,6 +65,8 @@ public class CoreMainXmlResource {
         }
 
         return Json.createObjectBuilder()
+                .add("xml-loader", camelContext.getXMLRoutesDefinitionLoader().getClass().getName())
+                .add("xml-model-dumper", camelContext.getModelToXMLDumper().getClass().getName())
                 .add("routes-collector", collector)
                 .add("listeners", listeners)
                 .add("routeBuilders", routeBuilders)
diff --git a/integration-tests/core-main-xml/src/test/java/org/apache/camel/quarkus/core/CoreMainXmlTest.java b/integration-tests/core-main-xml/src/test/java/org/apache/camel/quarkus/core/CoreMainXmlTest.java
index fd5c39e..37075d8 100644
--- a/integration-tests/core-main-xml/src/test/java/org/apache/camel/quarkus/core/CoreMainXmlTest.java
+++ b/integration-tests/core-main-xml/src/test/java/org/apache/camel/quarkus/core/CoreMainXmlTest.java
@@ -21,6 +21,8 @@ import javax.ws.rs.core.MediaType;
 import io.quarkus.test.junit.QuarkusTest;
 import io.restassured.RestAssured;
 import io.restassured.path.json.JsonPath;
+import org.apache.camel.xml.jaxb.JaxbModelToXMLDumper;
+import org.apache.camel.xml.jaxb.JaxbXMLRoutesDefinitionLoader;
 import org.junit.jupiter.api.Test;
 
 import static org.assertj.core.api.Assertions.assertThat;
@@ -38,6 +40,9 @@ public class CoreMainXmlTest {
                 .body()
                 .jsonPath();
 
+        assertThat(p.getString("xml-loader")).isEqualTo(JaxbXMLRoutesDefinitionLoader.class.getName());
+        assertThat(p.getString("xml-model-dumper")).isEqualTo(JaxbModelToXMLDumper.class.getName());
+
         assertThat(p.getList("routeBuilders", String.class))
                 .isEmpty();
         assertThat(p.getList("routes", String.class))
diff --git a/integration-tests/core-main/src/main/java/org/apache/camel/quarkus/core/CoreMainResource.java b/integration-tests/core-main/src/main/java/org/apache/camel/quarkus/core/CoreMainResource.java
index fd03f49..d17f118 100644
--- a/integration-tests/core-main/src/main/java/org/apache/camel/quarkus/core/CoreMainResource.java
+++ b/integration-tests/core-main/src/main/java/org/apache/camel/quarkus/core/CoreMainResource.java
@@ -147,6 +147,8 @@ public class CoreMainResource {
         }
 
         return Json.createObjectBuilder()
+                .add("xml-loader", camelContext.getXMLRoutesDefinitionLoader().getClass().getName())
+                .add("xml-model-dumper", camelContext.getModelToXMLDumper().getClass().getName())
                 .add("routes-collector", collector)
                 .add("listeners", listeners)
                 .add("routeBuilders", routeBuilders)
@@ -165,7 +167,7 @@ public class CoreMainResource {
     @GET
     @Produces(MediaType.TEXT_PLAIN)
     public JsonObject reactiveExecutor() {
-        ReactiveExecutor executor = context.getReactiveExecutor();
+        ReactiveExecutor executor = context.adapt(ExtendedCamelContext.class).getReactiveExecutor();
 
         JsonObjectBuilder builder = Json.createObjectBuilder();
         builder.add("class", executor.getClass().getName());
diff --git a/integration-tests/core-main/src/test/java/org/apache/camel/quarkus/core/CoreMainTest.java b/integration-tests/core-main/src/test/java/org/apache/camel/quarkus/core/CoreMainTest.java
index ba90794..c0e4ed0 100644
--- a/integration-tests/core-main/src/test/java/org/apache/camel/quarkus/core/CoreMainTest.java
+++ b/integration-tests/core-main/src/test/java/org/apache/camel/quarkus/core/CoreMainTest.java
@@ -77,9 +77,12 @@ public class CoreMainTest {
                 .body()
                 .jsonPath();
 
+        assertThat(p.getString("xml-loader")).isEqualTo(DisabledXMLRoutesDefinitionLoader.class.getName());
+        assertThat(p.getString("xml-model-dumper")).isEqualTo(DisabledModelToXMLDumper.class.getName());
+
         assertThat(p.getString("routes-collector.type")).isEqualTo(CamelRoutesCollector.class.getName());
         assertThat(p.getString("routes-collector.type-registry")).isEqualTo(RegistryRoutesLoaders.Default.class.getName());
-        assertThat(p.getString("routes-collector.type-xml")).isEqualTo(DisabledXmlRoutesLoader.class.getName());
+        assertThat(p.getString("routes-collector.type-xml")).isEqualTo(DisabledXMLRoutesDefinitionLoader.class.getName());
 
         assertThat(p.getList("listeners", String.class))
                 .containsOnly(CamelMainEventDispatcher.class.getName(), SupportListener.class.getName());
diff --git a/integration-tests/core/src/main/java/org/apache/camel/quarkus/core/CoreResource.java b/integration-tests/core/src/main/java/org/apache/camel/quarkus/core/CoreResource.java
index 3f82aef..1397b91 100644
--- a/integration-tests/core/src/main/java/org/apache/camel/quarkus/core/CoreResource.java
+++ b/integration-tests/core/src/main/java/org/apache/camel/quarkus/core/CoreResource.java
@@ -30,8 +30,8 @@ import javax.ws.rs.core.MediaType;
 
 import org.apache.camel.CamelContext;
 import org.apache.camel.NoSuchLanguageException;
+import org.apache.camel.catalog.RuntimeCamelCatalog;
 import org.apache.camel.component.log.LogComponent;
-import org.apache.camel.runtimecatalog.RuntimeCamelCatalog;
 import org.apache.camel.spi.Registry;
 import org.apache.camel.support.processor.DefaultExchangeFormatter;
 
@@ -103,7 +103,7 @@ public class CoreResource {
     @GET
     @Produces(MediaType.APPLICATION_JSON)
     public String catalog(@PathParam("type") String type, @PathParam("name") String name) throws IOException {
-        final RuntimeCamelCatalog catalog = context.getExtension(RuntimeCamelCatalog.class);
+        final CamelRuntimeCatalog catalog = (CamelRuntimeCatalog) context.getExtension(RuntimeCamelCatalog.class);
 
         switch (type) {
         case "component":
diff --git a/integration-tests/pdf/src/main/java/org/apache/camel/quarkus/component/pdf/it/PdfResource.java b/integration-tests/pdf/src/main/java/org/apache/camel/quarkus/component/pdf/it/PdfResource.java
index c8d7bda..ffd6fa8 100644
--- a/integration-tests/pdf/src/main/java/org/apache/camel/quarkus/component/pdf/it/PdfResource.java
+++ b/integration-tests/pdf/src/main/java/org/apache/camel/quarkus/component/pdf/it/PdfResource.java
@@ -51,7 +51,7 @@ public class PdfResource {
     @Produces(MediaType.APPLICATION_OCTET_STREAM)
     public Response createFromText(String message) throws Exception {
         document = producerTemplate.requestBody(
-                "pdf:create?fontSize=6&pageSize=PAGE_SIZE_A5", message, byte[].class);
+                "pdf:create?fontSize=6&pageSize=PAGE_SIZE_A5&font=Courier", message, byte[].class);
 
         LOG.infof("The PDDocument has been created and contains %d bytes", document.length);
 
diff --git a/integration-tests/support/core-main/runtime/src/main/java/org/apache/camel/quarkus/core/runtime/support/SupportListener.java b/integration-tests/support/core-main/runtime/src/main/java/org/apache/camel/quarkus/core/runtime/support/SupportListener.java
index 962d471..decef0a 100644
--- a/integration-tests/support/core-main/runtime/src/main/java/org/apache/camel/quarkus/core/runtime/support/SupportListener.java
+++ b/integration-tests/support/core-main/runtime/src/main/java/org/apache/camel/quarkus/core/runtime/support/SupportListener.java
@@ -39,6 +39,10 @@ public class SupportListener implements MainListener {
     }
 
     @Override
+    public void beforeConfigure(BaseMainSupport main) {
+    }
+
+    @Override
     public void beforeStart(BaseMainSupport main) {
         main.addRoutesBuilder(new MyBuilder());
     }
diff --git a/pom.xml b/pom.xml
index b6cfa5f..edde8ab 100644
--- a/pom.xml
+++ b/pom.xml
@@ -41,7 +41,7 @@
         <project.reporting.outputEncoding>UTF-8</project.reporting.outputEncoding>
 
         <ahc.version>2.10.4</ahc.version>
-        <camel.version>3.0.1</camel.version>
+        <camel.version>3.1.0</camel.version>
         <guava.version>26.0-jre</guava.version>
         <hapi.version>4.1.0</hapi.version>
         <quarkus.version>1.3.0.Alpha2</quarkus.version>
@@ -173,6 +173,17 @@
 
     <repositories>
         <repository>
+            <id>apache.camel.staging</id>
+            <url>https://repository.apache.org/content/repositories/orgapachecamel-1176/</url>
+            <name>Apache Camel 3.1.0 Staging Repo</name>
+            <snapshots>
+                <enabled>false</enabled>
+            </snapshots>
+            <releases>
+                <enabled>true</enabled>
+            </releases>
+        </repository>
+        <repository>
             <id>apache.snapshots</id>
             <url>https://repository.apache.org/snapshots/</url>
             <name>Apache Snapshot Repo</name>
@@ -186,6 +197,16 @@
     </repositories>
     <pluginRepositories>
         <pluginRepository>
+            <id>apache.camel.staging</id>
+            <url>https://repository.apache.org/content/repositories/orgapachecamel-1176/</url>
+            <snapshots>
+                <enabled>false</enabled>
+            </snapshots>
+            <releases>
+                <enabled>true</enabled>
+            </releases>
+        </pluginRepository>
+        <pluginRepository>
             <id>apache.snapshots</id>
             <url>https://repository.apache.org/snapshots/</url>
             <snapshots>
diff --git a/poms/bom/pom.xml b/poms/bom/pom.xml
index 2e41e03..0f358d0 100644
--- a/poms/bom/pom.xml
+++ b/poms/bom/pom.xml
@@ -178,6 +178,11 @@
             </dependency>
             <dependency>
                 <groupId>org.apache.camel</groupId>
+                <artifactId>camel-catalog</artifactId>
+                <version>${camel.version}</version>
+            </dependency>
+            <dependency>
+                <groupId>org.apache.camel</groupId>
                 <artifactId>camel-cloud</artifactId>
                 <version>${camel.version}</version>
             </dependency>
@@ -198,6 +203,11 @@
             </dependency>
             <dependency>
                 <groupId>org.apache.camel</groupId>
+                <artifactId>camel-core-catalog</artifactId>
+                <version>${camel.version}</version>
+            </dependency>
+            <dependency>
+                <groupId>org.apache.camel</groupId>
                 <artifactId>camel-core-engine</artifactId>
                 <version>${camel.version}</version>
             </dependency>
@@ -305,11 +315,6 @@
             </dependency>
             <dependency>
                 <groupId>org.apache.camel</groupId>
-                <artifactId>camel-jaxp</artifactId>
-                <version>${camel.version}</version>
-            </dependency>
-            <dependency>
-                <groupId>org.apache.camel</groupId>
                 <artifactId>camel-jdbc</artifactId>
                 <version>${camel.version}</version>
             </dependency>
@@ -360,6 +365,12 @@
                 <groupId>org.apache.camel</groupId>
                 <artifactId>camel-main</artifactId>
                 <version>${camel.version}</version>
+                <exclusions>
+                    <exclusion>
+                        <groupId>org.apache.camel</groupId>
+                        <artifactId>camel-headersmap</artifactId>
+                    </exclusion>
+                </exclusions>
             </dependency>
             <dependency>
                 <groupId>org.apache.camel</groupId>
diff --git a/tooling/package-maven-plugin/pom.xml b/tooling/package-maven-plugin/pom.xml
index ad49f19..d8d07f2 100644
--- a/tooling/package-maven-plugin/pom.xml
+++ b/tooling/package-maven-plugin/pom.xml
@@ -53,6 +53,28 @@
             </exclusions>
         </dependency>
         <dependency>
+            <groupId>org.apache.camel</groupId>
+            <artifactId>camel-support</artifactId>
+            <version>${camel.version}</version>
+            <exclusions>
+                <exclusion>
+                    <groupId>org.slf4j</groupId>
+                    <artifactId>slf4j-api</artifactId>
+                </exclusion>
+            </exclusions>
+        </dependency>
+        <dependency>
+            <groupId>org.apache.camel</groupId>
+            <artifactId>camel-util</artifactId>
+            <version>${camel.version}</version>
+            <exclusions>
+                <exclusion>
+                    <groupId>org.slf4j</groupId>
+                    <artifactId>slf4j-api</artifactId>
+                </exclusion>
+            </exclusions>
+        </dependency>
+        <dependency>
             <groupId>org.apache.maven</groupId>
             <artifactId>maven-core</artifactId>
             <exclusions>
@@ -69,6 +91,10 @@
                     <artifactId>commons-io</artifactId>
                 </exclusion>
                 <exclusion>
+                    <groupId>org.apache.commons</groupId>
+                    <artifactId>commons-lang3</artifactId>
+                </exclusion>
+                <exclusion>
                     <groupId>com.google.guava</groupId>
                     <artifactId>guava</artifactId>
                 </exclusion>
@@ -77,6 +103,12 @@
         <dependency>
             <groupId>org.apache.maven</groupId>
             <artifactId>maven-artifact</artifactId>
+            <exclusions>
+                <exclusion>
+                    <groupId>org.apache.commons</groupId>
+                    <artifactId>commons-lang3</artifactId>
+                </exclusion>
+            </exclusions>
         </dependency>
         <dependency>
             <groupId>org.apache.maven</groupId>
diff --git a/tooling/package-maven-plugin/src/main/java/org/apache/camel/quarkus/maven/ExtMvelHelper.java b/tooling/package-maven-plugin/src/main/java/org/apache/camel/quarkus/maven/ExtMvelHelper.java
index 5066e5d..0b0f86e 100644
--- a/tooling/package-maven-plugin/src/main/java/org/apache/camel/quarkus/maven/ExtMvelHelper.java
+++ b/tooling/package-maven-plugin/src/main/java/org/apache/camel/quarkus/maven/ExtMvelHelper.java
@@ -19,10 +19,10 @@ package org.apache.camel.quarkus.maven;
 import java.nio.file.Path;
 
 import org.apache.camel.maven.packaging.MvelHelper;
-import org.apache.camel.maven.packaging.StringHelper;
-import org.apache.camel.maven.packaging.model.ComponentModel;
-import org.apache.camel.maven.packaging.model.DataFormatModel;
-import org.apache.camel.maven.packaging.model.LanguageModel;
+import org.apache.camel.tooling.util.Strings;
+import org.apache.camel.tooling.model.ComponentModel;
+import org.apache.camel.tooling.model.DataFormatModel;
+import org.apache.camel.tooling.model.LanguageModel;
 
 public class ExtMvelHelper {
 
@@ -37,7 +37,7 @@ public class ExtMvelHelper {
     }
 
     public String getFirstVersionShort(Object model) {
-        return StringHelper.cutLastZeroDigit((String) invokeGetter(model, "getFirstVersion"));
+        return org.apache.camel.tooling.model.Strings.cutLastZeroDigit((String) invokeGetter(model, "getFirstVersion"));
     }
 
     public String getDocLink(Object model) {
@@ -76,6 +76,6 @@ public class ExtMvelHelper {
     }
 
     private String getExtensionDocName(Object model) {
-        return StringHelper.after((String) invokeGetter(model, "getArtifactId"), "camel-quarkus-") + ".adoc";
+        return Strings.after((String) invokeGetter(model, "getArtifactId"), "camel-quarkus-") + ".adoc";
     }
 }
diff --git a/tooling/package-maven-plugin/src/main/java/org/apache/camel/quarkus/maven/JSonSchemaHelper.java b/tooling/package-maven-plugin/src/main/java/org/apache/camel/quarkus/maven/JSonSchemaHelper.java
new file mode 100644
index 0000000..1b560d0
--- /dev/null
+++ b/tooling/package-maven-plugin/src/main/java/org/apache/camel/quarkus/maven/JSonSchemaHelper.java
@@ -0,0 +1,567 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one or more
+ * contributor license agreements.  See the NOTICE file distributed with
+ * this work for additional information regarding copyright ownership.
+ * The ASF licenses this file to You under the Apache License, Version 2.0
+ * (the "License"); you may not use this file except in compliance with
+ * the License.  You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+package org.apache.camel.quarkus.maven;
+
+import java.util.ArrayList;
+import java.util.LinkedHashMap;
+import java.util.LinkedHashSet;
+import java.util.List;
+import java.util.Map;
+import java.util.Set;
+import java.util.stream.Collectors;
+
+import org.apache.camel.util.json.JsonArray;
+import org.apache.camel.util.json.JsonObject;
+import org.apache.camel.util.json.Jsoner;
+
+/**
+ * Used for parsing Camel components json meta-data descriptors.
+ */
+public final class JSonSchemaHelper {
+
+    private static final String[] LOGGING_LEVELS = new String[]{"ERROR", "WARN", "INFO", "DEBUG", "TRACE", "OFF"};
+
+    private JSonSchemaHelper() {
+    }
+
+    /**
+     * Parses the camel-main json schema to split it into a list or rows, where each row contains key value pairs with the metadata
+     *
+     * @param json the main configuration json
+     * @return a list of all the rows, where each row is a set of key value pairs with metadata
+     * @throws RuntimeException is thrown if error parsing the json data
+     */
+    @SuppressWarnings("unchecked")
+    public static List<Map<String, String>> parseMainJsonSchema(String json) {
+        List<Map<String, String>> answer = new ArrayList<>();
+        if (json == null) {
+            return answer;
+        }
+
+        // convert into a List<Map<String, String>> structure which is expected as output from this parser
+        try {
+            JsonObject output = (JsonObject) Jsoner.deserialize(json);
+            for (String key : output.keySet()) {
+                JsonArray array = (JsonArray) output.get(key);
+                if (key.equals("properties")) {
+                    // flattern each entry in the row with name as they key, and its value as the content (its a map also)
+                    for (Object obj : array) {
+                        Map entry = (Map) obj;
+                        Map<String, String> newRow = new LinkedHashMap();
+                        newRow.putAll(entry);
+                        answer.add(newRow);
+                        String name = ((Map) obj).get("name").toString();
+                        // use naming style with camel case
+                        String lookupKey = dashToCamelCase(name);
+                        newRow.put("name", lookupKey);
+                        // its the java type
+                        String type = newRow.get("type");
+                        newRow.put("javaType", type);
+                        newRow.put("type", fromMainToType(type));
+                        // add known enums
+                        if ("org.apache.camel.LoggingLevel".equals(type)) {
+                            newRow.put("enum", "ERROR,WARN,INFO,DEBUG,TRACE,OFF");
+                        } else if ("org.apache.camel.ManagementStatisticsLevel".equals(type)) {
+                            newRow.put("enum", "Extended,Default,RoutesOnly,Off");
+                        } else if ("org.apache.camel.spi.RestBindingMode".equals(type)) {
+                            newRow.put("enum", "auto,off,json,xml,json_xml");
+                        } else if ("org.apache.camel.spi.RestHostNameResolver".equals(type)) {
+                            newRow.put("enum", "allLocalIp,localIp,localHostName");
+                        }
+                    }
+                }
+            }
+        } catch (Exception e) {
+            // wrap parsing exceptions as runtime
+            throw new RuntimeException("Cannot parse json", e);
+        }
+
+        return answer;
+    }
+
+    private static String fromMainToType(String type) {
+        if ("boolean".equals(type) || "java.lang.Boolean".equals(type)) {
+            return "boolean";
+        } else if ("int".equals(type) || "java.lang.Integer".equals(type)) {
+            return "integer";
+        } else if ("long".equals(type) || "java.lang.Long".equals(type)) {
+            return "integer";
+        } else if ("float".equals(type) || "java.lang.Float".equals(type)) {
+            return "number";
+        } else if ("double".equals(type) || "java.lang.Double".equals(type)) {
+            return "number";
+        } else if ("string".equals(type) || "java.lang.String".equals(type)) {
+            return "string";
+        } else {
+            return "object";
+        }
+    }
+
+    /**
+     * Parses the json schema to split it into a list or rows, where each row contains key value pairs with the metadata
+     *
+     * @param group the group to parse from such as <tt>component</tt>, <tt>componentProperties</tt>, or <tt>properties</tt>.
+     * @param json the json
+     * @return a list of all the rows, where each row is a set of key value pairs with metadata
+     * @throws RuntimeException is thrown if error parsing the json data
+     */
+    @SuppressWarnings("unchecked")
+    public static List<Map<String, String>> parseJsonSchema(String group, String json, boolean parseProperties) {
+        List<Map<String, String>> answer = new ArrayList<>();
+        if (json == null) {
+            return answer;
+        }
+
+        // convert into a List<Map<String, String>> structure which is expected as output from this parser
+        try {
+            JsonObject output = (JsonObject) Jsoner.deserialize(json);
+            for (String key : output.keySet()) {
+                Map row = output.getMap(key);
+                if (key.equals(group)) {
+                    if (parseProperties) {
+                        // flattern each entry in the row with name as they key, and its value as the content (its a map also)
+                        for (Object obj : row.entrySet()) {
+                            Map.Entry entry = (Map.Entry) obj;
+                            Map<String, String> newRow = new LinkedHashMap();
+                            newRow.put("name", entry.getKey().toString());
+
+                            Map newData = transformMap((Map) entry.getValue());
+                            newRow.putAll(newData);
+                            answer.add(newRow);
+                        }
+                    } else {
+                        // flattern each entry in the row as a list of single Map<key, value> elements
+                        Map newData = transformMap(row);
+                        for (Object obj : newData.entrySet()) {
+                            Map.Entry entry = (Map.Entry) obj;
+                            Map<String, String> newRow = new LinkedHashMap<>();
+                            newRow.put(entry.getKey().toString(), entry.getValue().toString());
+                            answer.add(newRow);
+                        }
+                    }
+                }
+            }
+        } catch (Exception e) {
+            // wrap parsing exceptions as runtime
+            throw new RuntimeException("Cannot parse json", e);
+        }
+
+        return answer;
+    }
+
+    private static Map<String, String> transformMap(Map jsonMap) {
+        Map<String, String> answer = new LinkedHashMap<>();
+
+        for (Object rowObj : jsonMap.entrySet()) {
+            Map.Entry rowEntry = (Map.Entry) rowObj;
+            // if its a list type then its an enum, and we need to parse it as a single line separated with comma
+            // to be backwards compatible
+            Object newValue = rowEntry.getValue();
+            if (newValue instanceof List) {
+                List<?> list = (List) newValue;
+                newValue = list.stream().map(Object::toString)
+                        .collect(Collectors.joining(","));
+            }
+            // ensure value is escaped
+            String value = escapeJson(newValue.toString());
+            answer.put(rowEntry.getKey().toString(), value);
+        }
+
+        return answer;
+    }
+
+    private static String escapeJson(String value) {
+        // need to safe encode \r as \\r so its escaped
+        // need to safe encode \n as \\n so its escaped
+        // need to safe encode \t as \\t so its escaped
+        return value
+                .replace("\\r", "\\\\r")
+                .replace("\\n", "\\\\n")
+                .replace("\\t", "\\\\t");
+    }
+
+    public static boolean isComponentLenientProperties(List<Map<String, String>> rows) {
+        for (Map<String, String> row : rows) {
+            if (row.containsKey("lenientProperties")) {
+                return "true".equals(row.get("lenientProperties"));
+            }
+        }
+        return false;
+    }
+
+    public static boolean isComponentConsumerOnly(List<Map<String, String>> rows) {
+        for (Map<String, String> row : rows) {
+            if (row.containsKey("consumerOnly")) {
+                return "true".equals(row.get("consumerOnly"));
+            }
+        }
+        return false;
+    }
+
+    public static boolean isComponentProducerOnly(List<Map<String, String>> rows) {
+        for (Map<String, String> row : rows) {
+            if (row.containsKey("producerOnly")) {
+                return "true".equals(row.get("producerOnly"));
+            }
+        }
+        return false;
+    }
+
+    public static boolean isPropertyConsumerOnly(List<Map<String, String>> rows, String name) {
+        for (Map<String, String> row : rows) {
+            String labels = null;
+            boolean found = false;
+            if (row.containsKey("name")) {
+                found = name.equalsIgnoreCase(row.get("name"));
+            }
+            if (row.containsKey("label")) {
+                labels = row.get("label");
+            }
+            if (found) {
+                return labels != null && labels.contains("consumer");
+            }
+        }
+        return false;
+    }
+
+    public static boolean isPropertyProducerOnly(List<Map<String, String>> rows, String name) {
+        for (Map<String, String> row : rows) {
+            String labels = null;
+            boolean found = false;
+            if (row.containsKey("name")) {
+                found = name.equalsIgnoreCase(row.get("name"));
+            }
+            if (row.containsKey("label")) {
+                labels = row.get("label");
+            }
+            if (found) {
+                return labels != null && labels.contains("producer");
+            }
+        }
+        return false;
+    }
+
+    public static boolean isPropertyRequired(List<Map<String, String>> rows, String name) {
+        for (Map<String, String> row : rows) {
+            boolean required = false;
+            boolean found = false;
+            if (row.containsKey("name")) {
+                found = name.equalsIgnoreCase(row.get("name"));
+            }
+            if (row.containsKey("required")) {
+                required = "true".equals(row.get("required"));
+            }
+            if (found) {
+                return required;
+            }
+        }
+        return false;
+    }
+
+    public static boolean isPropertyDeprecated(List<Map<String, String>> rows, String name) {
+        for (Map<String, String> row : rows) {
+            boolean deprecated = false;
+            boolean found = false;
+            if (row.containsKey("name")) {
+                found = name.equalsIgnoreCase(row.get("name"));
+            }
+            if (row.containsKey("deprecated")) {
+                deprecated = "true".equals(row.get("deprecated"));
+            }
+            if (found) {
+                return deprecated;
+            }
+        }
+        return false;
+    }
+
+    public static String getPropertyKind(List<Map<String, String>> rows, String name) {
+        for (Map<String, String> row : rows) {
+            String kind = null;
+            boolean found = false;
+            if (row.containsKey("name")) {
+                found = name.equalsIgnoreCase(row.get("name"));
+            }
+            if (row.containsKey("kind")) {
+                kind = row.get("kind");
+            }
+            if (found) {
+                return kind;
+            }
+        }
+        return null;
+    }
+
+    public static String getPropertyJavaType(List<Map<String, String>> rows, String name) {
+        for (Map<String, String> row : rows) {
+            String javaType = null;
+            boolean found = false;
+            if (row.containsKey("name")) {
+                found = name.equalsIgnoreCase(row.get("name"));
+            }
+            if (row.containsKey("javaType")) {
+                javaType = row.get("javaType");
+            }
+            if (found) {
+                return javaType;
+            }
+        }
+        return null;
+    }
+
+    public static boolean isPropertyBoolean(List<Map<String, String>> rows, String name) {
+        for (Map<String, String> row : rows) {
+            String type = null;
+            boolean found = false;
+            if (row.containsKey("name")) {
+                found = name.equalsIgnoreCase(row.get("name"));
+            }
+            if (row.containsKey("type")) {
+                type = row.get("type");
+            }
+            if (found) {
+                return "boolean".equals(type);
+            }
+        }
+        return false;
+    }
+
+    public static boolean isPropertyInteger(List<Map<String, String>> rows, String name) {
+        for (Map<String, String> row : rows) {
+            String type = null;
+            boolean found = false;
+            if (row.containsKey("name")) {
+                found = name.equalsIgnoreCase(row.get("name"));
+            }
+            if (row.containsKey("type")) {
+                type = row.get("type");
+            }
+            if (found) {
+                return "integer".equals(type);
+            }
+        }
+        return false;
+    }
+
+    public static boolean isPropertyArray(List<Map<String, String>> rows, String name) {
+        for (Map<String, String> row : rows) {
+            String type = null;
+            boolean found = false;
+            if (row.containsKey("name")) {
+                found = name.equalsIgnoreCase(row.get("name"));
+            }
+            if (row.containsKey("type")) {
+                type = row.get("type");
+            }
+            if (found) {
+                return "array".equals(type);
+            }
+        }
+        return false;
+    }
+
+    public static boolean isPropertyNumber(List<Map<String, String>> rows, String name) {
+        for (Map<String, String> row : rows) {
+            String type = null;
+            boolean found = false;
+            if (row.containsKey("name")) {
+                found = name.equalsIgnoreCase(row.get("name"));
+            }
+            if (row.containsKey("type")) {
+                type = row.get("type");
+            }
+            if (found) {
+                return "number".equals(type);
+            }
+        }
+        return false;
+    }
+
+    public static boolean isPropertyObject(List<Map<String, String>> rows, String name) {
+        for (Map<String, String> row : rows) {
+            String type = null;
+            boolean found = false;
+            if (row.containsKey("name")) {
+                found = name.equalsIgnoreCase(row.get("name"));
+            }
+            if (row.containsKey("type")) {
+                type = row.get("type");
+            }
+            if (found) {
+                return "object".equals(type);
+            }
+        }
+        return false;
+    }
+
+    public static String getPropertyDefaultValue(List<Map<String, String>> rows, String name) {
+        for (Map<String, String> row : rows) {
+            String defaultValue = null;
+            boolean found = false;
+            if (row.containsKey("name")) {
+                found = name.equalsIgnoreCase(row.get("name"));
+            }
+            if (row.containsKey("defaultValue")) {
+                defaultValue = row.get("defaultValue");
+            }
+            if (found) {
+                return defaultValue;
+            }
+        }
+        return null;
+    }
+
+    public static String stripOptionalPrefixFromName(List<Map<String, String>> rows, String name) {
+        for (Map<String, String> row : rows) {
+            boolean found = false;
+            if (row.containsKey("name")) {
+                String optionalPrefix = row.get("optionalPrefix");
+                if (optionalPrefix != null && !optionalPrefix.isEmpty() && name.startsWith(optionalPrefix)) {
+                    name = name.substring(optionalPrefix.length());
+                    // try again
+                    return stripOptionalPrefixFromName(rows, name);
+                } else {
+                    found = name.equalsIgnoreCase(row.get("name"));
+                }
+            }
+            if (found) {
+                return name;
+            }
+        }
+        return name;
+    }
+
+    public static String getPropertyEnum(List<Map<String, String>> rows, String name) {
+        for (Map<String, String> row : rows) {
+            String enums = null;
+            boolean found = false;
+            if (row.containsKey("name")) {
+                found = name.equalsIgnoreCase(row.get("name"));
+            }
+            if (row.containsKey("enum")) {
+                enums = row.get("enum");
+            }
+            if (found) {
+                return enums;
+            }
+        }
+        return null;
+    }
+
+    public static String getPropertyPrefix(List<Map<String, String>> rows, String name) {
+        for (Map<String, String> row : rows) {
+            String prefix = null;
+            boolean found = false;
+            if (row.containsKey("name")) {
+                found = name.equalsIgnoreCase(row.get("name"));
+            }
+            if (row.containsKey("prefix")) {
+                prefix = row.get("prefix");
+            }
+            if (found) {
+                return prefix;
+            }
+        }
+        return null;
+    }
+
+    public static boolean isPropertyMultiValue(List<Map<String, String>> rows, String name) {
+        for (Map<String, String> row : rows) {
+            boolean multiValue = false;
+            boolean found = false;
+            if (row.containsKey("name")) {
+                found = name.equalsIgnoreCase(row.get("name"));
+            }
+            if (row.containsKey("multiValue")) {
+                multiValue = "true".equals(row.get("multiValue"));
+            }
+            if (found) {
+                return multiValue;
+            }
+        }
+        return false;
+    }
+
+    public static String getPropertyNameFromNameWithPrefix(List<Map<String, String>> rows, String name) {
+        for (Map<String, String> row : rows) {
+            String propertyName = null;
+            boolean found = false;
+            if (row.containsKey("name")) {
+                propertyName = row.get("name");
+            }
+            if (row.containsKey("prefix")) {
+                String preifx = row.get("prefix");
+                found = name.startsWith(preifx);
+            }
+            if (found) {
+                return propertyName;
+            }
+        }
+        return null;
+    }
+
+    public static Map<String, String> getRow(List<Map<String, String>> rows, String key) {
+        for (Map<String, String> row : rows) {
+            if (key.equals(row.get("name"))) {
+                return row;
+            }
+        }
+        return null;
+    }
+
+    public static Set<String> getNames(List<Map<String, String>> rows) {
+        Set<String> answer = new LinkedHashSet<>();
+        for (Map<String, String> row : rows) {
+            if (row.containsKey("name")) {
+                answer.add(row.get("name"));
+            }
+        }
+        return answer;
+    }
+
+    /**
+     * Converts the string from dash format into camel case (hello-great-world -> helloGreatWorld)
+     *
+     * @param text  the string
+     * @return the string camel cased
+     */
+    private static String dashToCamelCase(String text) {
+        if (text == null) {
+            return null;
+        }
+        int length = text.length();
+        if (length == 0) {
+            return text;
+        }
+        if (text.indexOf('-') == -1) {
+            return text;
+        }
+
+        StringBuilder sb = new StringBuilder();
+
+        for (int i = 0; i < text.length(); i++) {
+            char c = text.charAt(i);
+            if (c == '-') {
+                i++;
+                sb.append(Character.toUpperCase(text.charAt(i)));
+            } else {
+                sb.append(c);
+            }
+        }
+        return sb.toString();
+    }
+}
\ No newline at end of file
diff --git a/tooling/package-maven-plugin/src/main/java/org/apache/camel/quarkus/maven/PrepareCatalogQuarkusMojo.java b/tooling/package-maven-plugin/src/main/java/org/apache/camel/quarkus/maven/PrepareCatalogQuarkusMojo.java
index 0ca8459..0a07936 100644
--- a/tooling/package-maven-plugin/src/main/java/org/apache/camel/quarkus/maven/PrepareCatalogQuarkusMojo.java
+++ b/tooling/package-maven-plugin/src/main/java/org/apache/camel/quarkus/maven/PrepareCatalogQuarkusMojo.java
@@ -64,7 +64,7 @@ import com.google.gson.GsonBuilder;
 import com.google.gson.JsonObject;
 import com.google.gson.JsonParser;
 
-import static org.apache.camel.maven.packaging.PackageHelper.loadText;
+import static org.apache.camel.tooling.util.PackageHelper.loadText;
 
 /**
  * Prepares the Quarkus provider camel catalog to include component it supports
diff --git a/tooling/package-maven-plugin/src/main/java/org/apache/camel/quarkus/maven/UpdateDocExtensionsListMojo.java b/tooling/package-maven-plugin/src/main/java/org/apache/camel/quarkus/maven/UpdateDocExtensionsListMojo.java
index bb392f4..b5fac67 100644
--- a/tooling/package-maven-plugin/src/main/java/org/apache/camel/quarkus/maven/UpdateDocExtensionsListMojo.java
+++ b/tooling/package-maven-plugin/src/main/java/org/apache/camel/quarkus/maven/UpdateDocExtensionsListMojo.java
@@ -33,12 +33,11 @@ import java.util.TreeSet;
 
 import static java.util.stream.Collectors.toSet;
 
-import org.apache.camel.maven.packaging.JSonSchemaHelper;
-import org.apache.camel.maven.packaging.StringHelper;
-import org.apache.camel.maven.packaging.model.ComponentModel;
-import org.apache.camel.maven.packaging.model.DataFormatModel;
-import org.apache.camel.maven.packaging.model.LanguageModel;
-import org.apache.camel.maven.packaging.model.OtherModel;
+import org.apache.camel.util.StringHelper;
+import org.apache.camel.tooling.model.ComponentModel;
+import org.apache.camel.tooling.model.DataFormatModel;
+import org.apache.camel.tooling.model.LanguageModel;
+import org.apache.camel.tooling.model.OtherModel;
 import org.apache.maven.plugin.AbstractMojo;
 import org.apache.maven.plugin.MojoExecutionException;
 import org.apache.maven.plugin.MojoFailureException;
@@ -49,8 +48,8 @@ import org.apache.maven.project.MavenProject;
 import org.apache.maven.project.MavenProjectHelper;
 import org.mvel2.templates.TemplateRuntime;
 
-import static org.apache.camel.maven.packaging.PackageHelper.loadText;
-import static org.apache.camel.maven.packaging.PackageHelper.writeText;
+import static org.apache.camel.tooling.util.PackageHelper.loadText;
+import static org.apache.camel.tooling.util.PackageHelper.writeText;
 
 /**
  * Updates the documentation in:
@@ -183,7 +182,7 @@ public class UpdateDocExtensionsListMojo extends AbstractMojo {
 
             // how many deprecated
             long deprecated = components.stream()
-                    .filter(c -> "true".equals(c.getDeprecated()))
+                    .filter(ComponentModel::isDeprecated)
                     .count();
 
             // update the big readme file in the extensions dir
@@ -251,7 +250,7 @@ public class UpdateDocExtensionsListMojo extends AbstractMojo {
 
             // how many deprecated
             long deprecated = models.stream()
-                    .filter(m -> "true".equals(m.getDeprecated()))
+                    .filter(DataFormatModel::isDeprecated)
                     .count();
 
             // filter out camel-core
@@ -325,7 +324,7 @@ public class UpdateDocExtensionsListMojo extends AbstractMojo {
 
             // how many deprecated
             long deprecated = languages.stream()
-                    .filter(l -> "true".equals(l.getDeprecated()))
+                    .filter(LanguageModel::isDeprecated)
                     .count();
 
             // update the big readme file in the extensions dir
@@ -387,7 +386,7 @@ public class UpdateDocExtensionsListMojo extends AbstractMojo {
 
             // how many deprecated
             long deprecated = others.stream()
-                    .filter(o -> "true".equals(o.getDeprecated()))
+                    .filter(OtherModel::isDeprecated)
                     .count();
 
             // update the big readme file in the extensions dir
@@ -665,22 +664,22 @@ public class UpdateDocExtensionsListMojo extends AbstractMojo {
         List<Map<String, String>> rows = JSonSchemaHelper.parseJsonSchema("component", json, false);
 
         ComponentModel component = new ComponentModel();
-        component.setScheme(JSonSchemaHelper.getSafeValue("scheme", rows));
-        component.setSyntax(JSonSchemaHelper.getSafeValue("syntax", rows));
-        component.setAlternativeSyntax(JSonSchemaHelper.getSafeValue("alternativeSyntax", rows));
-        component.setAlternativeSchemes(JSonSchemaHelper.getSafeValue("alternativeSchemes", rows));
-        component.setTitle(JSonSchemaHelper.getSafeValue("title", rows));
-        component.setDescription(JSonSchemaHelper.getSafeValue("description", rows));
-        component.setFirstVersion(JSonSchemaHelper.getSafeValue("firstVersion", rows));
-        component.setLabel(JSonSchemaHelper.getSafeValue("label", rows));
-        component.setDeprecated(JSonSchemaHelper.getSafeValue("deprecated", rows));
-        component.setDeprecationNote(JSonSchemaHelper.getSafeValue("deprecationNote", rows));
-        component.setConsumerOnly(JSonSchemaHelper.getSafeValue("consumerOnly", rows));
-        component.setProducerOnly(JSonSchemaHelper.getSafeValue("producerOnly", rows));
-        component.setJavaType(JSonSchemaHelper.getSafeValue("javaType", rows));
-        component.setGroupId(JSonSchemaHelper.getSafeValue("groupId", rows));
-        component.setArtifactId(JSonSchemaHelper.getSafeValue("artifactId", rows));
-        component.setVersion(JSonSchemaHelper.getSafeValue("version", rows));
+        component.setScheme(getJSonValue("scheme", rows));
+        component.setSyntax(getJSonValue("syntax", rows));
+        component.setAlternativeSyntax(getJSonValue("alternativeSyntax", rows));
+        component.setAlternativeSchemes(getJSonValue("alternativeSchemes", rows));
+        component.setTitle(getJSonValue("title", rows));
+        component.setDescription(getJSonValue("description", rows));
+        component.setFirstVersion(getJSonValue("firstVersion", rows));
+        component.setLabel(getJSonValue("label", rows));
+        component.setDeprecated(Boolean.valueOf(getJSonValue("deprecated", rows)));
+        component.setDeprecationNote(getJSonValue("deprecationNote", rows));
+        component.setConsumerOnly(Boolean.valueOf(getJSonValue("consumerOnly", rows)));
+        component.setProducerOnly(Boolean.valueOf(getJSonValue("producerOnly", rows)));
+        component.setJavaType(getJSonValue("javaType", rows));
+        component.setGroupId(getJSonValue("groupId", rows));
+        component.setArtifactId(getJSonValue("artifactId", rows));
+        component.setVersion(getJSonValue("version", rows));
 
         return component;
     }
@@ -689,18 +688,18 @@ public class UpdateDocExtensionsListMojo extends AbstractMojo {
         List<Map<String, String>> rows = JSonSchemaHelper.parseJsonSchema("dataformat", json, false);
 
         DataFormatModel dataFormat = new DataFormatModel();
-        dataFormat.setName(JSonSchemaHelper.getSafeValue("name", rows));
-        dataFormat.setTitle(JSonSchemaHelper.getSafeValue("title", rows));
-        dataFormat.setModelName(JSonSchemaHelper.getSafeValue("modelName", rows));
-        dataFormat.setDescription(JSonSchemaHelper.getSafeValue("description", rows));
-        dataFormat.setFirstVersion(JSonSchemaHelper.getSafeValue("firstVersion", rows));
-        dataFormat.setLabel(JSonSchemaHelper.getSafeValue("label", rows));
-        dataFormat.setDeprecated(JSonSchemaHelper.getSafeValue("deprecated", rows));
-        dataFormat.setDeprecationNote(JSonSchemaHelper.getSafeValue("deprecationNote", rows));
-        dataFormat.setJavaType(JSonSchemaHelper.getSafeValue("javaType", rows));
-        dataFormat.setGroupId(JSonSchemaHelper.getSafeValue("groupId", rows));
-        dataFormat.setArtifactId(JSonSchemaHelper.getSafeValue("artifactId", rows));
-        dataFormat.setVersion(JSonSchemaHelper.getSafeValue("version", rows));
+        dataFormat.setName(getJSonValue("name", rows));
+        dataFormat.setTitle(getJSonValue("title", rows));
+        dataFormat.setModelName(getJSonValue("modelName", rows));
+        dataFormat.setDescription(getJSonValue("description", rows));
+        dataFormat.setFirstVersion(getJSonValue("firstVersion", rows));
+        dataFormat.setLabel(getJSonValue("label", rows));
+        dataFormat.setDeprecated(Boolean.valueOf(getJSonValue("deprecated", rows)));
+        dataFormat.setDeprecationNote(getJSonValue("deprecationNote", rows));
+        dataFormat.setJavaType(getJSonValue("javaType", rows));
+        dataFormat.setGroupId(getJSonValue("groupId", rows));
+        dataFormat.setArtifactId(getJSonValue("artifactId", rows));
+        dataFormat.setVersion(getJSonValue("version", rows));
 
         return dataFormat;
     }
@@ -709,18 +708,18 @@ public class UpdateDocExtensionsListMojo extends AbstractMojo {
         List<Map<String, String>> rows = JSonSchemaHelper.parseJsonSchema("language", json, false);
 
         LanguageModel language = new LanguageModel();
-        language.setTitle(JSonSchemaHelper.getSafeValue("title", rows));
-        language.setName(JSonSchemaHelper.getSafeValue("name", rows));
-        language.setModelName(JSonSchemaHelper.getSafeValue("modelName", rows));
-        language.setDescription(JSonSchemaHelper.getSafeValue("description", rows));
-        language.setFirstVersion(JSonSchemaHelper.getSafeValue("firstVersion", rows));
-        language.setLabel(JSonSchemaHelper.getSafeValue("label", rows));
-        language.setDeprecated(JSonSchemaHelper.getSafeValue("deprecated", rows));
-        language.setDeprecationNote(JSonSchemaHelper.getSafeValue("deprecationNote", rows));
-        language.setJavaType(JSonSchemaHelper.getSafeValue("javaType", rows));
-        language.setGroupId(JSonSchemaHelper.getSafeValue("groupId", rows));
-        language.setArtifactId(JSonSchemaHelper.getSafeValue("artifactId", rows));
-        language.setVersion(JSonSchemaHelper.getSafeValue("version", rows));
+        language.setTitle(getJSonValue("title", rows));
+        language.setName(getJSonValue("name", rows));
+        language.setModelName(getJSonValue("modelName", rows));
+        language.setDescription(getJSonValue("description", rows));
+        language.setFirstVersion(getJSonValue("firstVersion", rows));
+        language.setLabel(getJSonValue("label", rows));
+        language.setDeprecated(Boolean.valueOf(getJSonValue("deprecated", rows)));
+        language.setDeprecationNote(getJSonValue("deprecationNote", rows));
+        language.setJavaType(getJSonValue("javaType", rows));
+        language.setGroupId(getJSonValue("groupId", rows));
+        language.setArtifactId(getJSonValue("artifactId", rows));
+        language.setVersion(getJSonValue("version", rows));
 
         return language;
     }
@@ -729,20 +728,29 @@ public class UpdateDocExtensionsListMojo extends AbstractMojo {
         List<Map<String, String>> rows = JSonSchemaHelper.parseJsonSchema("other", json, false);
 
         OtherModel other = new OtherModel();
-        other.setName(JSonSchemaHelper.getSafeValue("name", rows));
-        other.setTitle(JSonSchemaHelper.getSafeValue("title", rows));
-        other.setDescription(JSonSchemaHelper.getSafeValue("description", rows));
-        other.setFirstVersion(JSonSchemaHelper.getSafeValue("firstVersion", rows));
-        other.setLabel(JSonSchemaHelper.getSafeValue("label", rows));
-        other.setDeprecated(JSonSchemaHelper.getSafeValue("deprecated", rows));
-        other.setDeprecationNote(JSonSchemaHelper.getSafeValue("deprecationNote", rows));
-        other.setGroupId(JSonSchemaHelper.getSafeValue("groupId", rows));
-        other.setArtifactId(JSonSchemaHelper.getSafeValue("artifactId", rows));
-        other.setVersion(JSonSchemaHelper.getSafeValue("version", rows));
+        other.setName(getJSonValue("name", rows));
+        other.setTitle(getJSonValue("title", rows));
+        other.setDescription(getJSonValue("description", rows));
+        other.setFirstVersion(getJSonValue("firstVersion", rows));
+        other.setLabel(getJSonValue("label", rows));
+        other.setDeprecated(Boolean.valueOf(getJSonValue("deprecated", rows)));
+        other.setDeprecationNote(getJSonValue("deprecationNote", rows));
+        other.setGroupId(getJSonValue("groupId", rows));
+        other.setArtifactId(getJSonValue("artifactId", rows));
+        other.setVersion(getJSonValue("version", rows));
 
         return other;
     }
 
+    private String getJSonValue(String key, List<Map<String, String>> rows) {
+        for (Map<String, String> row : rows) {
+            if (row.containsKey(key)) {
+                return row.get(key);
+            }
+        }
+        return "";
+    }
+
     private Path getExtensionsDocPath() {
         return Paths.get(websiteDocBaseDir.toString(), "extensions");
     }


[camel-quarkus] 01/03: Fix incompatibilities between Quarkus and Camel MongoDB dependencies

Posted by ja...@apache.org.
This is an automated email from the ASF dual-hosted git repository.

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

commit c1e3b56160a58c2a93df3d02bce1a9c3ece4f8c9
Author: James Netherton <ja...@gmail.com>
AuthorDate: Thu Jan 23 15:11:07 2020 +0000

    Fix incompatibilities between Quarkus and Camel MongoDB dependencies
    
    fixes #544, #649
---
 .../mongodb/deployment/MongoDbProcessor.java       |  12 +-
 extensions/mongodb/runtime/pom.xml                 |   4 +-
 .../component/mongodb/CamelMongoClient.java        | 124 ---------------------
 .../mongodb/CamelMongoClientRecorder.java          |  29 -----
 .../graal/SubstituteMongoClientOptions.java        |  43 -------
 .../component/mongodb/it/MongoDbResource.java      |  20 ++--
 .../component/mongodb/it/MongoDbTestResource.java  |   4 +-
 pom.xml                                            |   8 ++
 poms/bom/pom.xml                                   |  25 +++++
 9 files changed, 51 insertions(+), 218 deletions(-)

diff --git a/extensions/mongodb/deployment/src/main/java/org/apache/camel/quarkus/component/mongodb/deployment/MongoDbProcessor.java b/extensions/mongodb/deployment/src/main/java/org/apache/camel/quarkus/component/mongodb/deployment/MongoDbProcessor.java
index 00abff7..55051fb 100644
--- a/extensions/mongodb/deployment/src/main/java/org/apache/camel/quarkus/component/mongodb/deployment/MongoDbProcessor.java
+++ b/extensions/mongodb/deployment/src/main/java/org/apache/camel/quarkus/component/mongodb/deployment/MongoDbProcessor.java
@@ -1,3 +1,4 @@
+
 /*
  * Licensed to the Apache Software Foundation (ASF) under one or more
  * contributor license agreements.  See the NOTICE file distributed with
@@ -20,12 +21,9 @@ import java.util.List;
 
 import io.quarkus.deployment.annotations.BuildProducer;
 import io.quarkus.deployment.annotations.BuildStep;
-import io.quarkus.deployment.annotations.ExecutionTime;
-import io.quarkus.deployment.annotations.Record;
 import io.quarkus.deployment.builditem.FeatureBuildItem;
 import io.quarkus.mongodb.deployment.MongoClientBuildItem;
 import io.quarkus.mongodb.runtime.MongoClientRecorder;
-import org.apache.camel.quarkus.component.mongodb.CamelMongoClientRecorder;
 import org.apache.camel.quarkus.core.deployment.CamelRuntimeBeanBuildItem;
 
 class MongoDbProcessor {
@@ -38,11 +36,9 @@ class MongoDbProcessor {
     }
 
     @BuildStep
-    @Record(ExecutionTime.RUNTIME_INIT)
     void registerCamelMongoClientProducer(
             List<MongoClientBuildItem> mongoClients,
-            BuildProducer<CamelRuntimeBeanBuildItem> runtimeBeans,
-            CamelMongoClientRecorder recorder) {
+            BuildProducer<CamelRuntimeBeanBuildItem> runtimeBeans) {
 
         for (MongoClientBuildItem mongoClient : mongoClients) {
             // If there is a default mongo client instance, then bind it to the camel registry
@@ -51,8 +47,8 @@ class MongoDbProcessor {
                 runtimeBeans.produce(
                         new CamelRuntimeBeanBuildItem(
                                 "camelMongoClient",
-                                "com.mongodb.MongoClient",
-                                recorder.createCamelMongoClient(mongoClients.get(0).getClient())));
+                                "com.mongodb.client.MongoClient",
+                                mongoClients.get(0).getClient()));
             }
         }
     }
diff --git a/extensions/mongodb/runtime/pom.xml b/extensions/mongodb/runtime/pom.xml
index 8cf892f..2517e80 100644
--- a/extensions/mongodb/runtime/pom.xml
+++ b/extensions/mongodb/runtime/pom.xml
@@ -63,8 +63,8 @@
             <artifactId>mongodb-driver-legacy</artifactId>
         </dependency>
         <dependency>
-            <groupId>org.graalvm.nativeimage</groupId>
-            <artifactId>svm</artifactId>
+            <groupId>org.mongodb</groupId>
+            <artifactId>mongodb-crypt</artifactId>
         </dependency>
     </dependencies>
 
diff --git a/extensions/mongodb/runtime/src/main/java/org/apache/camel/quarkus/component/mongodb/CamelMongoClient.java b/extensions/mongodb/runtime/src/main/java/org/apache/camel/quarkus/component/mongodb/CamelMongoClient.java
deleted file mode 100644
index a2f515f..0000000
--- a/extensions/mongodb/runtime/src/main/java/org/apache/camel/quarkus/component/mongodb/CamelMongoClient.java
+++ /dev/null
@@ -1,124 +0,0 @@
-/*
- * Licensed to the Apache Software Foundation (ASF) under one or more
- * contributor license agreements.  See the NOTICE file distributed with
- * this work for additional information regarding copyright ownership.
- * The ASF licenses this file to You under the Apache License, Version 2.0
- * (the "License"); you may not use this file except in compliance with
- * the License.  You may obtain a copy of the License at
- *
- *      http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-package org.apache.camel.quarkus.component.mongodb;
-
-import java.util.List;
-
-import com.mongodb.ClientSessionOptions;
-import com.mongodb.client.ChangeStreamIterable;
-import com.mongodb.client.ClientSession;
-import com.mongodb.client.ListDatabasesIterable;
-import com.mongodb.client.MongoClient;
-import com.mongodb.client.MongoDatabase;
-import com.mongodb.client.MongoIterable;
-import org.bson.Document;
-import org.bson.conversions.Bson;
-
-/**
- * Bridges Mongo client types {@link com.mongodb.MongoClient} and {@link com.mongodb.client.MongoClient} used by the
- * Quarkus Mongo extension and the Camel MongoDB component, so that it can be looked up and used via the
- * connectionBean URI endpoint path parameter
- */
-public final class CamelMongoClient extends com.mongodb.MongoClient {
-
-    private final MongoClient delegate;
-
-    public CamelMongoClient(MongoClient delegate) {
-        this.delegate = delegate;
-    }
-
-    @Override
-    public MongoDatabase getDatabase(String databaseName) {
-        return delegate.getDatabase(databaseName);
-    }
-
-    @Override
-    public ClientSession startSession() {
-        return delegate.startSession();
-    }
-
-    @Override
-    public ClientSession startSession(ClientSessionOptions options) {
-        return delegate.startSession(options);
-    }
-
-    @Override
-    public void close() {
-        delegate.close();
-    }
-
-    @Override
-    public MongoIterable<String> listDatabaseNames() {
-        return delegate.listDatabaseNames();
-    }
-
-    @Override
-    public ListDatabasesIterable<Document> listDatabases(ClientSession clientSession) {
-        return delegate.listDatabases(clientSession);
-    }
-
-    @Override
-    public <T> ListDatabasesIterable<T> listDatabases(ClientSession clientSession, Class<T> clazz) {
-        return delegate.listDatabases(clientSession, clazz);
-    }
-
-    @Override
-    public <T> ListDatabasesIterable<T> listDatabases(Class<T> clazz) {
-        return delegate.listDatabases(clazz);
-    }
-
-    @Override
-    public ChangeStreamIterable<Document> watch() {
-        return delegate.watch();
-    }
-
-    @Override
-    public ChangeStreamIterable<Document> watch(List<? extends Bson> pipeline) {
-        return delegate.watch(pipeline);
-    }
-
-    @Override
-    public ChangeStreamIterable<Document> watch(ClientSession clientSession) {
-        return delegate.watch(clientSession);
-    }
-
-    @Override
-    public ChangeStreamIterable<Document> watch(ClientSession clientSession, List<? extends Bson> pipeline) {
-        return delegate.watch(clientSession, pipeline);
-    }
-
-    @Override
-    public <TResult> ChangeStreamIterable<TResult> watch(Class<TResult> resultClass) {
-        return delegate.watch(resultClass);
-    }
-
-    @Override
-    public <TResult> ChangeStreamIterable<TResult> watch(List<? extends Bson> pipeline, Class<TResult> resultClass) {
-        return delegate.watch(pipeline, resultClass);
-    }
-
-    @Override
-    public <TResult> ChangeStreamIterable<TResult> watch(ClientSession clientSession, Class<TResult> resultClass) {
-        return delegate.watch(clientSession, resultClass);
-    }
-
-    @Override
-    public <TResult> ChangeStreamIterable<TResult> watch(ClientSession clientSession, List<? extends Bson> pipeline,
-            Class<TResult> resultClass) {
-        return delegate.watch(clientSession, pipeline, resultClass);
-    }
-}
diff --git a/extensions/mongodb/runtime/src/main/java/org/apache/camel/quarkus/component/mongodb/CamelMongoClientRecorder.java b/extensions/mongodb/runtime/src/main/java/org/apache/camel/quarkus/component/mongodb/CamelMongoClientRecorder.java
deleted file mode 100644
index 371f72a..0000000
--- a/extensions/mongodb/runtime/src/main/java/org/apache/camel/quarkus/component/mongodb/CamelMongoClientRecorder.java
+++ /dev/null
@@ -1,29 +0,0 @@
-/*
- * Licensed to the Apache Software Foundation (ASF) under one or more
- * contributor license agreements.  See the NOTICE file distributed with
- * this work for additional information regarding copyright ownership.
- * The ASF licenses this file to You under the Apache License, Version 2.0
- * (the "License"); you may not use this file except in compliance with
- * the License.  You may obtain a copy of the License at
- *
- *      http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-package org.apache.camel.quarkus.component.mongodb;
-
-import com.mongodb.client.MongoClient;
-import io.quarkus.runtime.RuntimeValue;
-import io.quarkus.runtime.annotations.Recorder;
-
-@Recorder
-public class CamelMongoClientRecorder {
-
-    public RuntimeValue<CamelMongoClient> createCamelMongoClient(RuntimeValue<MongoClient> client) {
-        return new RuntimeValue<>(new CamelMongoClient(client.getValue()));
-    }
-}
diff --git a/extensions/mongodb/runtime/src/main/java/org/apache/camel/quarkus/component/mongodb/graal/SubstituteMongoClientOptions.java b/extensions/mongodb/runtime/src/main/java/org/apache/camel/quarkus/component/mongodb/graal/SubstituteMongoClientOptions.java
deleted file mode 100644
index fbbc855..0000000
--- a/extensions/mongodb/runtime/src/main/java/org/apache/camel/quarkus/component/mongodb/graal/SubstituteMongoClientOptions.java
+++ /dev/null
@@ -1,43 +0,0 @@
-/*
- * Licensed to the Apache Software Foundation (ASF) under one or more
- * contributor license agreements.  See the NOTICE file distributed with
- * this work for additional information regarding copyright ownership.
- * The ASF licenses this file to You under the Apache License, Version 2.0
- * (the "License"); you may not use this file except in compliance with
- * the License.  You may obtain a copy of the License at
- *
- *      http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-package org.apache.camel.quarkus.component.mongodb.graal;
-
-import javax.net.SocketFactory;
-
-import com.mongodb.MongoClientOptions;
-import com.oracle.svm.core.annotate.Alias;
-import com.oracle.svm.core.annotate.Substitute;
-import com.oracle.svm.core.annotate.TargetClass;
-
-@TargetClass(MongoClientOptions.class)
-final class SubstituteMongoClientOptions {
-
-    @Alias
-    private SocketFactory socketFactory;
-
-    @Alias
-    private static SocketFactory DEFAULT_SOCKET_FACTORY;
-
-    @Substitute
-    public SocketFactory getSocketFactory() {
-        if (this.socketFactory != null) {
-            return this.socketFactory;
-        } else {
-            return DEFAULT_SOCKET_FACTORY;
-        }
-    }
-}
diff --git a/integration-tests/mongodb/src/main/java/org/apache/camel/quarkus/component/mongodb/it/MongoDbResource.java b/integration-tests/mongodb/src/main/java/org/apache/camel/quarkus/component/mongodb/it/MongoDbResource.java
index dbde877..4e11a93 100644
--- a/integration-tests/mongodb/src/main/java/org/apache/camel/quarkus/component/mongodb/it/MongoDbResource.java
+++ b/integration-tests/mongodb/src/main/java/org/apache/camel/quarkus/component/mongodb/it/MongoDbResource.java
@@ -19,9 +19,9 @@ package org.apache.camel.quarkus.component.mongodb.it;
 import java.net.URI;
 import java.net.URISyntaxException;
 
+import javax.annotation.PostConstruct;
 import javax.enterprise.context.ApplicationScoped;
 import javax.inject.Inject;
-import javax.inject.Named;
 import javax.json.Json;
 import javax.json.JsonArray;
 import javax.json.JsonArrayBuilder;
@@ -35,7 +35,7 @@ import javax.ws.rs.Produces;
 import javax.ws.rs.core.MediaType;
 import javax.ws.rs.core.Response;
 
-import com.mongodb.MongoClient;
+import com.mongodb.client.MongoClient;
 import com.mongodb.client.MongoCursor;
 import com.mongodb.client.MongoIterable;
 import org.apache.camel.ProducerTemplate;
@@ -47,6 +47,14 @@ public class MongoDbResource {
     @Inject
     ProducerTemplate producerTemplate;
 
+    @Inject
+    MongoClient client;
+
+    @PostConstruct
+    public void init() {
+        producerTemplate.getCamelContext().getRegistry().bind("camelMongoClient", client);
+    }
+
     @POST
     @Path("/collection/{collectionName}")
     @Consumes(MediaType.APPLICATION_JSON)
@@ -84,12 +92,4 @@ public class MongoDbResource {
 
         return arrayBuilder.build();
     }
-
-    @javax.enterprise.inject.Produces
-    @Named("camelMongoClient")
-    public MongoClient camelMongoClient() {
-        return new MongoClient(
-                System.getProperty("camel.mongodb.test-host"),
-                Integer.getInteger("camel.mongodb.test-port"));
-    }
 }
diff --git a/integration-tests/mongodb/src/test/java/org/apache/camel/quarkus/component/mongodb/it/MongoDbTestResource.java b/integration-tests/mongodb/src/test/java/org/apache/camel/quarkus/component/mongodb/it/MongoDbTestResource.java
index b7a915f..cbbf45d 100644
--- a/integration-tests/mongodb/src/test/java/org/apache/camel/quarkus/component/mongodb/it/MongoDbTestResource.java
+++ b/integration-tests/mongodb/src/test/java/org/apache/camel/quarkus/component/mongodb/it/MongoDbTestResource.java
@@ -46,8 +46,8 @@ public class MongoDbTestResource implements ContainerResourceLifecycleManager {
             container.start();
 
             return CollectionHelper.mapOf(
-                    "camel.mongodb.test-port", container.getMappedPort(MONGODB_PORT).toString(),
-                    "camel.mongodb.test-host", container.getContainerIpAddress());
+                    "quarkus.mongodb.hosts",
+                    container.getContainerIpAddress() + ":" + container.getMappedPort(MONGODB_PORT).toString());
         } catch (Exception e) {
             throw new RuntimeException(e);
         }
diff --git a/pom.xml b/pom.xml
index 4cd07eb..b6cfa5f 100644
--- a/pom.xml
+++ b/pom.xml
@@ -58,6 +58,14 @@
         <consul-client.version>1.3.3</consul-client.version>
         <stax2.version>4.2</stax2.version>
 
+        <!-- These mongodb version properties should align with the Mongo client version used in Camel
+            TODO: Remove when Quarkus has upgraded its MongoDB client dependencies
+                - https://github.com/quarkusio/quarkus/issues/6418
+                - https://github.com/quarkusio/quarkus/pull/6347
+        -->
+        <mongodb.version>3.12.1</mongodb.version>
+        <mongodb-crypt.version>1.0.1</mongodb-crypt.version>
+
         <maven-compiler-plugin.version>3.8.0</maven-compiler-plugin.version>
         <maven.compiler.target>1.8</maven.compiler.target>
         <maven.compiler.source>1.8</maven.compiler.source>
diff --git a/poms/bom/pom.xml b/poms/bom/pom.xml
index e3d60d2..1e57d12 100644
--- a/poms/bom/pom.xml
+++ b/poms/bom/pom.xml
@@ -1097,6 +1097,31 @@
                 <version>${kotlin.version}</version>
             </dependency>
             <dependency>
+                <groupId>org.mongodb</groupId>
+                <artifactId>mongodb-crypt</artifactId>
+                <version>${mongodb-crypt.version}</version>
+            </dependency>
+            <dependency>
+                <groupId>org.mongodb</groupId>
+                <artifactId>mongodb-driver-async</artifactId>
+                <version>${mongodb.version}</version>
+            </dependency>
+            <dependency>
+                <groupId>org.mongodb</groupId>
+                <artifactId>mongodb-driver-core</artifactId>
+                <version>${mongodb.version}</version>
+            </dependency>
+            <dependency>
+                <groupId>org.mongodb</groupId>
+                <artifactId>mongodb-driver-legacy</artifactId>
+                <version>${mongodb.version}</version>
+            </dependency>
+            <dependency>
+                <groupId>org.mongodb</groupId>
+                <artifactId>mongodb-driver-sync</artifactId>
+                <version>${mongodb.version}</version>
+            </dependency>
+            <dependency>
                 <groupId>org.springframework</groupId>
                 <artifactId>spring-core</artifactId>
                 <version>${spring.version}</version>


[camel-quarkus] 02/03: Fix #74 Telegram extension

Posted by ja...@apache.org.
This is an automated email from the ASF dual-hosted git repository.

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

commit 01503287bb5608f6c1d151169c20654bdcc46508
Author: Peter Palaga <pp...@redhat.com>
AuthorDate: Mon Dec 23 16:46:52 2019 +0100

    Fix #74 Telegram extension
---
 .../pages/list-of-camel-quarkus-extensions.adoc    |   3 +
 extensions/pom.xml                                 |   1 +
 extensions/readme.adoc                             |   3 +
 extensions/telegram/deployment/pom.xml             |  83 +++++++++
 .../telegram/deployment/TelegramProcessor.java     |  82 +++++++++
 extensions/telegram/pom.xml                        |  39 +++++
 extensions/telegram/runtime/pom.xml                | 106 ++++++++++++
 .../component/telegram/TelegramRecorder.java       |  31 ++++
 .../main/resources/META-INF/quarkus-extension.yaml |  28 +++
 integration-tests/pom.xml                          |   1 +
 integration-tests/telegram/README.adoc             |  13 ++
 integration-tests/telegram/pom.xml                 | 165 ++++++++++++++++++
 .../component/telegram/it/TelegramResource.java    | 157 +++++++++++++++++
 .../component/telegram/it/TelegramRoutes.java      |  77 +++++++++
 .../src/main/resources/application.properties      |  34 ++++
 .../mock-messages/editMessageLiveLocation.json     |  24 +++
 .../main/resources/mock-messages/getUpdates.json   |  41 +++++
 .../main/resources/mock-messages/sendAudio.json    |  25 +++
 .../main/resources/mock-messages/sendDocument.json |  24 +++
 .../main/resources/mock-messages/sendLocation.json |  23 +++
 .../main/resources/mock-messages/sendMessage.json  |  20 +++
 .../main/resources/mock-messages/sendPhoto.json    |  27 +++
 .../main/resources/mock-messages/sendVenue.json    |  31 ++++
 .../main/resources/mock-messages/sendVideo.json    |  33 ++++
 .../mock-messages/stopMessageLiveLocation.json     |  24 +++
 .../quarkus/component/telegram/it/TelegramIT.java  |  24 +++
 .../component/telegram/it/TelegramTest.java        | 187 +++++++++++++++++++++
 .../src/test/resources/camel-quarkus-rocks.mp3     | Bin 0 -> 9657 bytes
 .../src/test/resources/camel-quarkus-rocks.mp4     | Bin 0 -> 27845 bytes
 .../src/test/resources/camel-quarkus-rocks.pdf     | Bin 0 -> 7638 bytes
 .../src/test/resources/camel-quarkus-rocks.png     | Bin 0 -> 264 bytes
 poms/bom/pom.xml                                   |  25 +++
 32 files changed, 1331 insertions(+)

diff --git a/docs/modules/ROOT/pages/list-of-camel-quarkus-extensions.adoc b/docs/modules/ROOT/pages/list-of-camel-quarkus-extensions.adoc
index 4725d46..430867a 100644
--- a/docs/modules/ROOT/pages/list-of-camel-quarkus-extensions.adoc
+++ b/docs/modules/ROOT/pages/list-of-camel-quarkus-extensions.adoc
@@ -198,6 +198,9 @@ Number of Camel components: 65 in 56 JAR artifacts (0 deprecated)
 | xref:extensions/stream.adoc[Stream] (camel-quarkus-stream) +
 `stream:kind` | 1.2.0 | The stream: component provides access to the system-in, system-out and system-err streams as well as allowing streaming of file.
 
+| link:https://camel.apache.org/components/latest/telegram-component.html[Telegram] (camel-quarkus-telegram) +
+`telegram:type` | 1.0.0 | The telegram component provides access to the Telegram Bot API.
+
 | link:https://camel.apache.org/components/latest/timer-component.html[Timer] (camel-quarkus-timer) +
 `timer:timerName` | 0.2.0 | The timer component is used for generating message exchanges when a timer fires.
 
diff --git a/extensions/pom.xml b/extensions/pom.xml
index 4a6ea79..6743e56 100644
--- a/extensions/pom.xml
+++ b/extensions/pom.xml
@@ -109,6 +109,7 @@
         <module>stream</module>
         <module>tagsoup</module>
         <module>tarfile</module>
+        <module>telegram</module>
         <module>timer</module>
         <module>twitter</module>
         <module>validator</module>
diff --git a/extensions/readme.adoc b/extensions/readme.adoc
index 776305b..5e35761 100644
--- a/extensions/readme.adoc
+++ b/extensions/readme.adoc
@@ -185,6 +185,9 @@ Number of Camel components: 65 in 56 JAR artifacts (0 deprecated)
 | xref:extensions/stream.adoc[Stream] (camel-quarkus-stream) +
 `stream:kind` | 1.2.0 | The stream: component provides access to the system-in, system-out and system-err streams as well as allowing streaming of file.
 
+| link:https://camel.apache.org/components/latest/telegram-component.html[Telegram] (camel-quarkus-telegram) +
+`telegram:type` | 1.0.0 | The telegram component provides access to the Telegram Bot API.
+
 | link:https://camel.apache.org/components/latest/timer-component.html[Timer] (camel-quarkus-timer) +
 `timer:timerName` | 0.2.0 | The timer component is used for generating message exchanges when a timer fires.
 
diff --git a/extensions/telegram/deployment/pom.xml b/extensions/telegram/deployment/pom.xml
new file mode 100644
index 0000000..231703c
--- /dev/null
+++ b/extensions/telegram/deployment/pom.xml
@@ -0,0 +1,83 @@
+<?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>
+    <parent>
+        <groupId>org.apache.camel.quarkus</groupId>
+        <artifactId>camel-quarkus-telegram-parent</artifactId>
+        <version>1.1.0-SNAPSHOT</version>
+        <relativePath>../pom.xml</relativePath>
+    </parent>
+
+    <artifactId>camel-quarkus-telegram-deployment</artifactId>
+    <name>Camel Quarkus :: Telegram :: Deployment</name>
+
+    <dependencyManagement>
+        <dependencies>
+            <dependency>
+                <groupId>org.apache.camel.quarkus</groupId>
+                <artifactId>camel-quarkus-bom-deployment</artifactId>
+                <version>${project.version}</version>
+                <type>pom</type>
+                <scope>import</scope>
+            </dependency>
+        </dependencies>
+    </dependencyManagement>
+
+    <dependencies>
+        <dependency>
+            <groupId>org.apache.camel.quarkus</groupId>
+            <artifactId>camel-quarkus-core-deployment</artifactId>
+        </dependency>
+        <dependency>
+            <groupId>org.apache.camel.quarkus</groupId>
+            <artifactId>camel-quarkus-support-ahc-deployment</artifactId>
+        </dependency>
+        <dependency>
+            <groupId>io.quarkus</groupId>
+            <artifactId>quarkus-jackson-deployment</artifactId>
+        </dependency>
+        <dependency>
+            <groupId>org.apache.camel.quarkus</groupId>
+            <artifactId>camel-quarkus-telegram</artifactId>
+        </dependency>
+    </dependencies>
+
+    <build>
+        <plugins>
+            <plugin>
+                <groupId>org.apache.maven.plugins</groupId>
+                <artifactId>maven-compiler-plugin</artifactId>
+                <configuration>
+                    <annotationProcessorPaths>
+                        <path>
+                            <groupId>io.quarkus</groupId>
+                            <artifactId>quarkus-extension-processor</artifactId>
+                            <version>${quarkus.version}</version>
+                        </path>
+                    </annotationProcessorPaths>
+                </configuration>
+            </plugin>
+        </plugins>
+    </build>
+
+</project>
diff --git a/extensions/telegram/deployment/src/main/java/org/apache/camel/quarkus/component/telegram/deployment/TelegramProcessor.java b/extensions/telegram/deployment/src/main/java/org/apache/camel/quarkus/component/telegram/deployment/TelegramProcessor.java
new file mode 100644
index 0000000..2535a74
--- /dev/null
+++ b/extensions/telegram/deployment/src/main/java/org/apache/camel/quarkus/component/telegram/deployment/TelegramProcessor.java
@@ -0,0 +1,82 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one or more
+ * contributor license agreements.  See the NOTICE file distributed with
+ * this work for additional information regarding copyright ownership.
+ * The ASF licenses this file to You under the Apache License, Version 2.0
+ * (the "License"); you may not use this file except in compliance with
+ * the License.  You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+package org.apache.camel.quarkus.component.telegram.deployment;
+
+import io.quarkus.deployment.annotations.BuildStep;
+import io.quarkus.deployment.annotations.ExecutionTime;
+import io.quarkus.deployment.annotations.Record;
+import io.quarkus.deployment.builditem.ExtensionSslNativeSupportBuildItem;
+import io.quarkus.deployment.builditem.FeatureBuildItem;
+import io.quarkus.deployment.builditem.nativeimage.ReflectiveClassBuildItem;
+import org.apache.camel.quarkus.component.telegram.TelegramRecorder;
+import org.apache.camel.quarkus.core.deployment.CamelBeanBuildItem;
+
+class TelegramProcessor {
+
+    private static final String FEATURE = "camel-telegram";
+
+    @BuildStep
+    FeatureBuildItem feature() {
+        return new FeatureBuildItem(FEATURE);
+    }
+
+    @Record(ExecutionTime.STATIC_INIT)
+    @BuildStep
+    CamelBeanBuildItem telegramComponent(TelegramRecorder recorder) {
+        return new CamelBeanBuildItem(
+                "telegram",
+                "org.apache.camel.component.telegram.TelegramComponent",
+                recorder.createTelegramComponent());
+    }
+
+    @BuildStep
+    ExtensionSslNativeSupportBuildItem activateSslNativeSupport() {
+        return new ExtensionSslNativeSupportBuildItem(FEATURE);
+    }
+
+    @BuildStep
+    ReflectiveClassBuildItem reflectiveMethodsAndFields() {
+        return new ReflectiveClassBuildItem(true, true,
+                "org.apache.camel.component.telegram.model.Chat",
+                "org.apache.camel.component.telegram.model.EditMessageLiveLocationMessage",
+                "org.apache.camel.component.telegram.model.IncomingAudio",
+                "org.apache.camel.component.telegram.model.IncomingDocument",
+                "org.apache.camel.component.telegram.model.IncomingMessage",
+                "org.apache.camel.component.telegram.model.IncomingPhotoSize",
+                "org.apache.camel.component.telegram.model.IncomingVideo",
+                "org.apache.camel.component.telegram.model.InlineKeyboardButton",
+                "org.apache.camel.component.telegram.model.Location",
+                "org.apache.camel.component.telegram.model.MessageResult",
+                "org.apache.camel.component.telegram.model.OutgoingAudioMessage",
+                "org.apache.camel.component.telegram.model.OutgoingDocumentMessage",
+                "org.apache.camel.component.telegram.model.OutgoingMessage",
+                "org.apache.camel.component.telegram.model.OutgoingPhotoMessage",
+                "org.apache.camel.component.telegram.model.OutgoingTextMessage",
+                "org.apache.camel.component.telegram.model.OutgoingVideoMessage",
+                "org.apache.camel.component.telegram.model.ReplyKeyboardMarkup",
+                "org.apache.camel.component.telegram.model.SendLocationMessage",
+                "org.apache.camel.component.telegram.model.SendVenueMessage",
+                "org.apache.camel.component.telegram.model.StopMessageLiveLocationMessage",
+                "org.apache.camel.component.telegram.model.UnixTimestampDeserializer",
+                "org.apache.camel.component.telegram.model.Update",
+                "org.apache.camel.component.telegram.model.UpdateResult",
+                "org.apache.camel.component.telegram.model.User",
+                "org.apache.camel.component.telegram.model.WebhookInfo",
+                "org.apache.camel.component.telegram.model.WebhookResult");
+    }
+
+}
diff --git a/extensions/telegram/pom.xml b/extensions/telegram/pom.xml
new file mode 100644
index 0000000..70603ba
--- /dev/null
+++ b/extensions/telegram/pom.xml
@@ -0,0 +1,39 @@
+<?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>
+    <parent>
+        <groupId>org.apache.camel.quarkus</groupId>
+        <artifactId>camel-quarkus-build-parent</artifactId>
+        <version>1.1.0-SNAPSHOT</version>
+        <relativePath>../../poms/build-parent/pom.xml</relativePath>
+    </parent>
+
+    <artifactId>camel-quarkus-telegram-parent</artifactId>
+    <name>Camel Quarkus :: Telegram</name>
+    <packaging>pom</packaging>
+
+    <modules>
+        <module>deployment</module>
+        <module>runtime</module>
+    </modules>
+</project>
diff --git a/extensions/telegram/runtime/pom.xml b/extensions/telegram/runtime/pom.xml
new file mode 100644
index 0000000..0679852
--- /dev/null
+++ b/extensions/telegram/runtime/pom.xml
@@ -0,0 +1,106 @@
+<?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>
+    <parent>
+        <groupId>org.apache.camel.quarkus</groupId>
+        <artifactId>camel-quarkus-telegram-parent</artifactId>
+        <version>1.1.0-SNAPSHOT</version>
+        <relativePath>../pom.xml</relativePath>
+    </parent>
+
+    <artifactId>camel-quarkus-telegram</artifactId>
+    <name>Camel Quarkus :: Telegram :: Runtime</name>
+    <description>Telegram Chat Support</description>
+
+    <properties>
+        <firstVersion>1.0.0</firstVersion>
+    </properties>
+
+    <dependencyManagement>
+        <dependencies>
+            <dependency>
+                <groupId>org.apache.camel.quarkus</groupId>
+                <artifactId>camel-quarkus-bom</artifactId>
+                <version>${project.version}</version>
+                <type>pom</type>
+                <scope>import</scope>
+            </dependency>
+        </dependencies>
+    </dependencyManagement>
+
+    <dependencies>
+        <dependency>
+            <groupId>org.apache.camel.quarkus</groupId>
+            <artifactId>camel-quarkus-core</artifactId>
+        </dependency>
+        <dependency>
+            <groupId>org.apache.camel.quarkus</groupId>
+            <artifactId>camel-quarkus-support-ahc</artifactId>
+        </dependency>
+        <dependency>
+            <groupId>io.quarkus</groupId>
+            <artifactId>quarkus-jackson</artifactId>
+        </dependency>
+        <dependency>
+            <groupId>org.apache.camel</groupId>
+            <artifactId>camel-telegram</artifactId>
+        </dependency>
+
+        <dependency>
+            <groupId>org.apache.httpcomponents</groupId>
+            <artifactId>httpasyncclient</artifactId>
+            <exclusions>
+                <exclusion>
+                    <groupId>commons-logging</groupId>
+                    <artifactId>commons-logging</artifactId>
+                </exclusion>
+            </exclusions>
+        </dependency>
+        <dependency>
+            <groupId>org.jboss.logging</groupId>
+            <artifactId>commons-logging-jboss-logging</artifactId>
+        </dependency>
+    </dependencies>
+
+    <build>
+        <plugins>
+            <plugin>
+                <groupId>io.quarkus</groupId>
+                <artifactId>quarkus-bootstrap-maven-plugin</artifactId>
+            </plugin>
+            <plugin>
+                <groupId>org.apache.maven.plugins</groupId>
+                <artifactId>maven-compiler-plugin</artifactId>
+                <configuration>
+                    <annotationProcessorPaths>
+                        <path>
+                            <groupId>io.quarkus</groupId>
+                            <artifactId>quarkus-extension-processor</artifactId>
+                            <version>${quarkus.version}</version>
+                        </path>
+                    </annotationProcessorPaths>
+                </configuration>
+            </plugin>
+        </plugins>
+    </build>
+</project>
diff --git a/extensions/telegram/runtime/src/main/java/org/apache/camel/quarkus/component/telegram/TelegramRecorder.java b/extensions/telegram/runtime/src/main/java/org/apache/camel/quarkus/component/telegram/TelegramRecorder.java
new file mode 100644
index 0000000..5a5e55a
--- /dev/null
+++ b/extensions/telegram/runtime/src/main/java/org/apache/camel/quarkus/component/telegram/TelegramRecorder.java
@@ -0,0 +1,31 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one or more
+ * contributor license agreements.  See the NOTICE file distributed with
+ * this work for additional information regarding copyright ownership.
+ * The ASF licenses this file to You under the Apache License, Version 2.0
+ * (the "License"); you may not use this file except in compliance with
+ * the License.  You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+package org.apache.camel.quarkus.component.telegram;
+
+import io.quarkus.runtime.RuntimeValue;
+import io.quarkus.runtime.annotations.Recorder;
+import org.apache.camel.component.telegram.TelegramComponent;
+
+@Recorder
+public class TelegramRecorder {
+
+    public RuntimeValue<TelegramComponent> createTelegramComponent() {
+        final TelegramComponent telegramComponent = new TelegramComponent();
+        return new RuntimeValue<>(telegramComponent);
+    }
+
+}
diff --git a/extensions/telegram/runtime/src/main/resources/META-INF/quarkus-extension.yaml b/extensions/telegram/runtime/src/main/resources/META-INF/quarkus-extension.yaml
new file mode 100644
index 0000000..a799cd2
--- /dev/null
+++ b/extensions/telegram/runtime/src/main/resources/META-INF/quarkus-extension.yaml
@@ -0,0 +1,28 @@
+#
+# 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.
+#
+
+---
+name: "Camel Quarkus Telegram"
+description: "Camel Telegram support"
+metadata:
+  keywords:
+  - "camel"
+  - "chat"
+  - "telegram"
+  guide: "https://quarkus.io/guides/camel"
+  categories:
+  - "integration"
\ No newline at end of file
diff --git a/integration-tests/pom.xml b/integration-tests/pom.xml
index c52fdf6..6a32fbf 100644
--- a/integration-tests/pom.xml
+++ b/integration-tests/pom.xml
@@ -214,6 +214,7 @@
         <module>stream</module>
         <module>tagsoup</module>
         <module>tarfile</module>
+        <module>telegram</module>
         <module>twitter</module>
         <module>validator</module>
         <module>xslt</module>
diff --git a/integration-tests/telegram/README.adoc b/integration-tests/telegram/README.adoc
new file mode 100644
index 0000000..259e493
--- /dev/null
+++ b/integration-tests/telegram/README.adoc
@@ -0,0 +1,13 @@
+== Camel Quarkus Telegram Integration Tests
+
+A work in progress, see https://github.com/apache/camel-quarkus/issues/74
+
+To run `camel-quarkus-telegram` integration tests, you must first create a Telegram bot following this guide: https://www.nicolaferraro.me/2016/05/27/creating-a-telegram-bot-in-5-minutes-with-apache-camel/ .
+
+Then set the following environment variables:
+
+[source,shell]
+----
+$ export TELEGRAM_AUTHORIZATION_TOKEN=my-autorization-token
+$ export TELEGRAM_CHAT_ID=my-chatId
+----
diff --git a/integration-tests/telegram/pom.xml b/integration-tests/telegram/pom.xml
new file mode 100644
index 0000000..393524b
--- /dev/null
+++ b/integration-tests/telegram/pom.xml
@@ -0,0 +1,165 @@
+<?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>
+    <parent>
+        <groupId>org.apache.camel.quarkus</groupId>
+        <artifactId>camel-quarkus-integration-tests</artifactId>
+        <version>1.1.0-SNAPSHOT</version>
+    </parent>
+
+    <artifactId>camel-quarkus-integration-test-telegram</artifactId>
+    <name>Camel Quarkus :: Integration Tests :: Telegram</name>
+    <description>Integration tests for Camel Quarkus Telegram extension</description>
+
+    <properties>
+        <!-- mvnd, a.k.a. Maven Daemon: https://github.com/gnodet/mvnd -->
+        <!-- The following rule tells mvnd to build the listed deployment modules before this module. -->
+        <!-- This is important because mvnd builds modules in parallel by default. The deployment modules are not -->
+        <!-- explicit dependencies of this module in the Maven sense, although they are required by the Quarkus Maven plugin. -->
+        <!-- Please update rule whenever you change the dependencies of this module by running -->
+        <!--     mvn process-resources -Pformat    from the root directory -->
+        <mvnd.builder.rule>camel-quarkus-attachments-deployment,camel-quarkus-platform-http-deployment,camel-quarkus-support-policy-deployment,camel-quarkus-telegram-deployment</mvnd.builder.rule>
+    </properties>
+
+    <dependencies>
+        <dependency>
+            <groupId>org.apache.camel.quarkus</groupId>
+            <artifactId>camel-quarkus-telegram</artifactId>
+        </dependency>
+        <dependency>
+            <groupId>io.quarkus</groupId>
+            <artifactId>quarkus-resteasy</artifactId>
+        </dependency>
+        <dependency>
+            <groupId>io.quarkus</groupId>
+            <artifactId>quarkus-resteasy-jackson</artifactId>
+        </dependency>
+
+        <!-- To serve the mock Telegram API -->
+        <dependency>
+            <groupId>org.apache.camel.quarkus</groupId>
+            <artifactId>camel-quarkus-platform-http</artifactId>
+        </dependency>
+        <dependency>
+            <groupId>org.apache.camel.quarkus</groupId>
+            <artifactId>camel-quarkus-attachments</artifactId>
+        </dependency>
+
+        <!-- test dependencies -->
+        <dependency>
+            <groupId>org.apache.camel.quarkus</groupId>
+            <artifactId>camel-quarkus-integration-test-support</artifactId>
+            <scope>test</scope>
+        </dependency>
+        <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>
+        <dependency>
+            <groupId>org.awaitility</groupId>
+            <artifactId>awaitility</artifactId>
+            <scope>test</scope>
+            <exclusions>
+                <exclusion>
+                    <groupId>org.hamcrest</groupId>
+                    <artifactId>hamcrest-core</artifactId>
+                </exclusion>
+            </exclusions>
+        </dependency>
+    </dependencies>
+
+    <build>
+        <plugins>
+            <plugin>
+                <groupId>io.quarkus</groupId>
+                <artifactId>quarkus-maven-plugin</artifactId>
+                <executions>
+                    <execution>
+                        <goals>
+                            <goal>build</goal>
+                        </goals>
+                    </execution>
+                </executions>
+            </plugin>
+        </plugins>
+    </build>
+
+    <profiles>
+        <profile>
+            <id>native</id>
+            <activation>
+                <property>
+                    <name>native</name>
+                </property>
+            </activation>
+            <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>
+                                    <systemProperties>
+                                        <native.image.path>${project.build.directory}/${project.build.finalName}-runner</native.image.path>
+                                    </systemProperties>
+                                </configuration>
+                            </execution>
+                        </executions>
+                    </plugin>
+                    <plugin>
+                        <groupId>io.quarkus</groupId>
+                        <artifactId>quarkus-maven-plugin</artifactId>
+                        <executions>
+                            <execution>
+                                <id>native-image</id>
+                                <goals>
+                                    <goal>native-image</goal>
+                                </goals>
+                                <configuration>
+                                    <reportErrorsAtRuntime>false</reportErrorsAtRuntime>
+                                    <cleanupServer>true</cleanupServer>
+                                    <enableServer>false</enableServer>
+                                    <dumpProxies>false</dumpProxies>
+                                    <graalvmHome>${graalvmHome}</graalvmHome>
+                                    <disableReports>true</disableReports>
+                                </configuration>
+                            </execution>
+                        </executions>
+                    </plugin>
+                </plugins>
+            </build>
+        </profile>
+    </profiles>
+
+</project>
diff --git a/integration-tests/telegram/src/main/java/org/apache/camel/quarkus/component/telegram/it/TelegramResource.java b/integration-tests/telegram/src/main/java/org/apache/camel/quarkus/component/telegram/it/TelegramResource.java
new file mode 100644
index 0000000..52b929c
--- /dev/null
+++ b/integration-tests/telegram/src/main/java/org/apache/camel/quarkus/component/telegram/it/TelegramResource.java
@@ -0,0 +1,157 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one or more
+ * contributor license agreements.  See the NOTICE file distributed with
+ * this work for additional information regarding copyright ownership.
+ * The ASF licenses this file to You under the Apache License, Version 2.0
+ * (the "License"); you may not use this file except in compliance with
+ * the License.  You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+package org.apache.camel.quarkus.component.telegram.it;
+
+import java.net.URI;
+
+import javax.enterprise.context.ApplicationScoped;
+import javax.inject.Inject;
+import javax.ws.rs.Consumes;
+import javax.ws.rs.GET;
+import javax.ws.rs.HeaderParam;
+import javax.ws.rs.POST;
+import javax.ws.rs.Path;
+import javax.ws.rs.Produces;
+import javax.ws.rs.core.MediaType;
+import javax.ws.rs.core.Response;
+
+import org.apache.camel.ConsumerTemplate;
+import org.apache.camel.ProducerTemplate;
+import org.apache.camel.component.telegram.TelegramConstants;
+import org.apache.camel.component.telegram.TelegramMediaType;
+import org.apache.camel.component.telegram.model.EditMessageLiveLocationMessage;
+import org.apache.camel.component.telegram.model.SendLocationMessage;
+import org.apache.camel.component.telegram.model.SendVenueMessage;
+import org.apache.camel.component.telegram.model.StopMessageLiveLocationMessage;
+import org.eclipse.microprofile.config.inject.ConfigProperty;
+import org.jboss.logging.Logger;
+
+@Path("/telegram")
+@ApplicationScoped
+public class TelegramResource {
+
+    private static final Logger log = Logger.getLogger(TelegramResource.class);
+
+    @Inject
+    ProducerTemplate producerTemplate;
+
+    @Inject
+    ConsumerTemplate consumerTemplate;
+
+    @ConfigProperty(name = "telegram.chatId")
+    String chatId;
+
+    @Path("/messages")
+    @GET
+    @Produces(MediaType.TEXT_PLAIN)
+    public String getMessages() {
+        final String messages = consumerTemplate.receiveBodyNoWait("telegram://bots", String.class);
+        log.infof("Received telegram messages: %s", messages);
+        return messages;
+    }
+
+    @Path("/messages")
+    @POST
+    @Consumes(MediaType.TEXT_PLAIN)
+    @Produces(MediaType.TEXT_PLAIN)
+    public Response postMessage(String message) throws Exception {
+        producerTemplate.requestBody(String.format("telegram://bots?chatId=%s", chatId), message);
+        log.infof("Sent a message to telegram %s", message);
+        return Response
+                .created(new URI(String.format("https://telegram.org/")))
+                .build();
+    }
+
+    @Path("/media")
+    @POST
+    @Produces(MediaType.TEXT_PLAIN)
+    public Response postMedia(@HeaderParam("Content-type") String type, byte[] message) throws Exception {
+        final TelegramMediaType telegramMediaType;
+        if (type != null && type.startsWith("image/")) {
+            telegramMediaType = TelegramMediaType.PHOTO_PNG;
+        } else if (type != null && type.startsWith("audio/")) {
+            telegramMediaType = TelegramMediaType.AUDIO;
+        } else if (type != null && type.startsWith("video/")) {
+            telegramMediaType = TelegramMediaType.VIDEO;
+        } else if (type != null && type.startsWith("application/pdf")) {
+            telegramMediaType = TelegramMediaType.DOCUMENT;
+        } else {
+            return Response.status(415, "Unsupported content type " + type).build();
+        }
+
+        producerTemplate.requestBodyAndHeader(
+                String.format("telegram://bots?chatId=%s", chatId),
+                message,
+                TelegramConstants.TELEGRAM_MEDIA_TYPE,
+                telegramMediaType);
+        log.infof("Sent a message to telegram %s", message);
+        return Response
+                .created(new URI(String.format("https://telegram.org/")))
+                .build();
+    }
+
+    @Path("/send-location")
+    @POST
+    @Consumes(MediaType.APPLICATION_JSON)
+    @Produces(MediaType.APPLICATION_JSON)
+    public Response sendLocation(SendLocationMessage message) throws Exception {
+        final Object result = producerTemplate.requestBody(String.format("telegram://bots?chatId=%s", chatId), message);
+        log.infof("Sent a message to telegram %s", message);
+        return Response
+                .created(new URI(String.format("https://telegram.org/")))
+                .entity(result)
+                .build();
+    }
+
+    @Path("/edit-location")
+    @POST
+    @Consumes(MediaType.APPLICATION_JSON)
+    @Produces(MediaType.APPLICATION_JSON)
+    public Response editLocation(EditMessageLiveLocationMessage message) throws Exception {
+        producerTemplate.requestBody(String.format("telegram://bots?chatId=%s", chatId), message);
+        log.infof("Sent a message to telegram %s", message);
+        return Response
+                .created(new URI(String.format("https://telegram.org/")))
+                .build();
+    }
+
+    @Path("/stop-location")
+    @POST
+    @Consumes(MediaType.APPLICATION_JSON)
+    @Produces(MediaType.APPLICATION_JSON)
+    public Response stopLocation(StopMessageLiveLocationMessage message) throws Exception {
+        producerTemplate.requestBody(String.format("telegram://bots?chatId=%s", chatId), message);
+        log.infof("Sent a message to telegram %s", message);
+        return Response
+                .created(new URI(String.format("https://telegram.org/")))
+                .build();
+    }
+
+    @Path("/venue")
+    @POST
+    @Consumes(MediaType.APPLICATION_JSON)
+    @Produces(MediaType.APPLICATION_JSON)
+    public Response venue(SendVenueMessage message) throws Exception {
+        final Object result = producerTemplate.requestBody(String.format("telegram://bots?chatId=%s", chatId), message);
+        log.infof("Sent a message to telegram %s", message);
+        return Response
+                .created(new URI(String.format("https://telegram.org/")))
+                .entity(result)
+                .build();
+    }
+
+}
diff --git a/integration-tests/telegram/src/main/java/org/apache/camel/quarkus/component/telegram/it/TelegramRoutes.java b/integration-tests/telegram/src/main/java/org/apache/camel/quarkus/component/telegram/it/TelegramRoutes.java
new file mode 100644
index 0000000..f11b2cf
--- /dev/null
+++ b/integration-tests/telegram/src/main/java/org/apache/camel/quarkus/component/telegram/it/TelegramRoutes.java
@@ -0,0 +1,77 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one or more
+ * contributor license agreements.  See the NOTICE file distributed with
+ * this work for additional information regarding copyright ownership.
+ * The ASF licenses this file to You under the Apache License, Version 2.0
+ * (the "License"); you may not use this file except in compliance with
+ * the License.  You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+package org.apache.camel.quarkus.component.telegram.it;
+
+import java.io.ByteArrayOutputStream;
+import java.io.IOException;
+import java.io.InputStream;
+import java.util.Arrays;
+
+import org.apache.camel.Exchange;
+import org.apache.camel.Message;
+import org.apache.camel.Processor;
+import org.apache.camel.builder.RouteBuilder;
+import org.apache.camel.util.IOHelper;
+
+public class TelegramRoutes extends RouteBuilder {
+
+    @Override
+    public void configure() throws Exception {
+
+        /* Mock Telegram API */
+        from("platform-http:/bot{authToken}/getUpdates?httpMethodRestrict=GET")
+                .process(new ResourceSupplier("mock-messages/getUpdates.json"));
+        Arrays.asList(
+                "sendMessage",
+                "sendAudio",
+                "sendVideo",
+                "sendDocument",
+                "sendPhoto",
+                "sendVenue",
+                "sendLocation",
+                "stopMessageLiveLocation").stream()
+                .forEach(endpoint -> {
+                    from("platform-http:/{authToken}/" + endpoint + "?httpMethodRestrict=POST")
+                            .process(new ResourceSupplier("mock-messages/" + endpoint + ".json"));
+                });
+
+    }
+
+    static class ResourceSupplier implements Processor {
+        private final byte[] bytes;
+
+        public ResourceSupplier(String path) {
+            try (ByteArrayOutputStream out = new ByteArrayOutputStream(IOHelper.DEFAULT_BUFFER_SIZE);
+                    InputStream in = getClass().getClassLoader().getResourceAsStream(path)) {
+                IOHelper.copy(in, out, IOHelper.DEFAULT_BUFFER_SIZE);
+                this.bytes = out.toByteArray();
+            } catch (IOException e) {
+                throw new RuntimeException(e);
+            }
+        }
+
+        @Override
+        public void process(Exchange exchange) throws Exception {
+            final Message m = exchange.getMessage();
+            m.setBody(bytes);
+            m.setHeader("Content-Length", bytes.length);
+            m.setHeader("Content-Type", "application/json; charset=UTF-8");
+        }
+
+    }
+
+}
diff --git a/integration-tests/telegram/src/main/resources/application.properties b/integration-tests/telegram/src/main/resources/application.properties
new file mode 100644
index 0000000..08f9610
--- /dev/null
+++ b/integration-tests/telegram/src/main/resources/application.properties
@@ -0,0 +1,34 @@
+## ---------------------------------------------------------------------------
+## 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
+#
+quarkus.log.file.enable = false
+
+quarkus.log.category."org.apache.camel.support.DefaultComponent".level = TRACE
+#quarkus.log.category."org.asynchttpclient".level = TRACE
+#quarkus.log.category."org.apache.camel.component.telegram.TelegramComponent".level = TRACE
+# You can check in this directory what requests the client is sending when you run against the mock Telegram API
+quarkus.http.body.uploads-directory=target/uploads
+
+quarkus.native.additional-build-args = -H:IncludeResources=.*mock-messages/.*
+#
+# Camel :: Telegram
+#
+camel.component.telegram.authorizationToken={{env:TELEGRAM_AUTHORIZATION_TOKEN:default-dummy-token}}
+camel.component.telegram.baseUri={{env:TELEGRAM_BASE_URI:https://api.telegram.org}}
+telegram.chatId={{env:TELEGRAM_CHAT_ID:-1}}
diff --git a/integration-tests/telegram/src/main/resources/mock-messages/editMessageLiveLocation.json b/integration-tests/telegram/src/main/resources/mock-messages/editMessageLiveLocation.json
new file mode 100644
index 0000000..a6a060d
--- /dev/null
+++ b/integration-tests/telegram/src/main/resources/mock-messages/editMessageLiveLocation.json
@@ -0,0 +1,24 @@
+{
+    "ok": true,
+    "result": {
+        "message_id": 938,
+        "from": {
+            "id": 770882310,
+            "is_bot": true,
+            "first_name": "camelDemoBot",
+            "username": "camelDemoBot"
+        },
+        "chat": {
+            "id": 434822960,
+            "first_name": "Peter",
+            "last_name": "Palaga",
+            "type": "private"
+        },
+        "date": 1576249600,
+        "edit_date": 1576249601,
+        "location": {
+            "latitude": 29.974934,
+            "longitude": 31.131109
+        }
+    }
+}
\ No newline at end of file
diff --git a/integration-tests/telegram/src/main/resources/mock-messages/getUpdates.json b/integration-tests/telegram/src/main/resources/mock-messages/getUpdates.json
new file mode 100644
index 0000000..85fbd55
--- /dev/null
+++ b/integration-tests/telegram/src/main/resources/mock-messages/getUpdates.json
@@ -0,0 +1,41 @@
+{
+  "ok": true,
+  "result": [
+    {
+      "update_id": 525704898,
+      "message": {
+        "message_id": 179,
+        "from": {
+          "id": 1585844777,
+          "first_name": "John",
+          "last_name": "Doe"
+        },
+        "chat": {
+          "id": -45658,
+          "title": "A chat group",
+          "type": "group"
+        },
+        "date": 1463436626,
+        "text": "a message"
+      }
+    },
+    {
+      "update_id": 525704899,
+      "message": {
+        "message_id": 180,
+        "from": {
+          "id": 1585844777,
+          "first_name": "John",
+          "last_name": "Doe"
+        },
+        "chat": {
+          "id": -45658,
+          "title": "A chat group",
+          "type": "group"
+        },
+        "date": 1463466626,
+        "text": "another message"
+      }
+    }
+  ]
+}
\ No newline at end of file
diff --git a/integration-tests/telegram/src/main/resources/mock-messages/sendAudio.json b/integration-tests/telegram/src/main/resources/mock-messages/sendAudio.json
new file mode 100644
index 0000000..ed4ac2d
--- /dev/null
+++ b/integration-tests/telegram/src/main/resources/mock-messages/sendAudio.json
@@ -0,0 +1,25 @@
+{
+    "ok": true,
+    "result": {
+        "message_id": 932,
+        "from": {
+            "id": 770882310,
+            "is_bot": true,
+            "first_name": "camelDemoBot",
+            "username": "camelDemoBot"
+        },
+        "chat": {
+            "id": 434822960,
+            "first_name": "Peter",
+            "last_name": "Palaga",
+            "type": "private"
+        },
+        "date": 1576249599,
+        "audio": {
+            "duration": 1,
+            "mime_type": "audio/mpeg",
+            "file_id": "CQADBAAD5QUAAmcaoVMYrfWhEfLFTBYE",
+            "file_size": 9657
+        }
+    }
+}
\ No newline at end of file
diff --git a/integration-tests/telegram/src/main/resources/mock-messages/sendDocument.json b/integration-tests/telegram/src/main/resources/mock-messages/sendDocument.json
new file mode 100644
index 0000000..f352d13
--- /dev/null
+++ b/integration-tests/telegram/src/main/resources/mock-messages/sendDocument.json
@@ -0,0 +1,24 @@
+{
+    "ok": true,
+    "result": {
+        "message_id": 934,
+        "from": {
+            "id": 770882310,
+            "is_bot": true,
+            "first_name": "camelDemoBot",
+            "username": "camelDemoBot"
+        },
+        "chat": {
+            "id": 434822960,
+            "first_name": "Peter",
+            "last_name": "Palaga",
+            "type": "private"
+        },
+        "date": 1576249600,
+        "document": {
+            "file_name": "file",
+            "file_id": "BQADBAAD5wUAAmcaoVNbRjnV8IcCmhYE",
+            "file_size": 7638
+        }
+    }
+}
\ No newline at end of file
diff --git a/integration-tests/telegram/src/main/resources/mock-messages/sendLocation.json b/integration-tests/telegram/src/main/resources/mock-messages/sendLocation.json
new file mode 100644
index 0000000..5b645a1
--- /dev/null
+++ b/integration-tests/telegram/src/main/resources/mock-messages/sendLocation.json
@@ -0,0 +1,23 @@
+{
+    "ok": true,
+    "result": {
+        "message_id": 938,
+        "from": {
+            "id": 770882310,
+            "is_bot": true,
+            "first_name": "camelDemoBot",
+            "username": "camelDemoBot"
+        },
+        "chat": {
+            "id": 434822960,
+            "first_name": "Peter",
+            "last_name": "Palaga",
+            "type": "private"
+        },
+        "date": 1576249600,
+        "location": {
+            "latitude": 29.974830,
+            "longitude": 31.138579
+        }
+    }
+}
\ No newline at end of file
diff --git a/integration-tests/telegram/src/main/resources/mock-messages/sendMessage.json b/integration-tests/telegram/src/main/resources/mock-messages/sendMessage.json
new file mode 100644
index 0000000..8f37da2
--- /dev/null
+++ b/integration-tests/telegram/src/main/resources/mock-messages/sendMessage.json
@@ -0,0 +1,20 @@
+{
+    "ok": true,
+    "result": {
+        "message_id": 937,
+        "from": {
+            "id": 770882310,
+            "is_bot": true,
+            "first_name": "camelDemoBot",
+            "username": "camelDemoBot"
+        },
+        "chat": {
+            "id": 434822960,
+            "first_name": "Peter",
+            "last_name": "Palaga",
+            "type": "private"
+        },
+        "date": 1576249600,
+        "text": "A message from camel-quarkus-telegram ffdcc8ef72a34053a3e75daec74676a9"
+    }
+}
\ No newline at end of file
diff --git a/integration-tests/telegram/src/main/resources/mock-messages/sendPhoto.json b/integration-tests/telegram/src/main/resources/mock-messages/sendPhoto.json
new file mode 100644
index 0000000..8523d11
--- /dev/null
+++ b/integration-tests/telegram/src/main/resources/mock-messages/sendPhoto.json
@@ -0,0 +1,27 @@
+{
+    "ok": true,
+    "result": {
+        "message_id": 935,
+        "from": {
+            "id": 770882310,
+            "is_bot": true,
+            "first_name": "camelDemoBot",
+            "username": "camelDemoBot"
+        },
+        "chat": {
+            "id": 434822960,
+            "first_name": "Peter",
+            "last_name": "Palaga",
+            "type": "private"
+        },
+        "date": 1576249600,
+        "photo": [
+            {
+                "file_id": "AgADBAADYbExG2caoVPPY5I2XKLPM3lKqBsABAEAAwIAA20AA80nBQABFgQ",
+                "file_size": 1005,
+                "width": 108,
+                "height": 10
+            }
+        ]
+    }
+}
\ No newline at end of file
diff --git a/integration-tests/telegram/src/main/resources/mock-messages/sendVenue.json b/integration-tests/telegram/src/main/resources/mock-messages/sendVenue.json
new file mode 100644
index 0000000..f098ac2
--- /dev/null
+++ b/integration-tests/telegram/src/main/resources/mock-messages/sendVenue.json
@@ -0,0 +1,31 @@
+{
+    "ok": true,
+    "result": {
+        "message_id": 936,
+        "from": {
+            "id": 770882310,
+            "is_bot": true,
+            "first_name": "camelDemoBot",
+            "username": "camelDemoBot"
+        },
+        "chat": {
+            "id": 434822960,
+            "first_name": "Peter",
+            "last_name": "Palaga",
+            "type": "private"
+        },
+        "date": 1576249600,
+        "location": {
+            "latitude": 29.977826,
+            "longitude": 31.136330
+        },
+        "venue": {
+            "location": {
+                "latitude": 29.977826,
+                "longitude": 31.136330
+            },
+            "title": "Pyramid of Queen Henutsen",
+            "address": "El-Hussein Ibn Ali Ln, Nazlet El-Semman, Al Haram, Giza Governorate, Egypt"
+        }
+    }
+}
\ No newline at end of file
diff --git a/integration-tests/telegram/src/main/resources/mock-messages/sendVideo.json b/integration-tests/telegram/src/main/resources/mock-messages/sendVideo.json
new file mode 100644
index 0000000..4f8d0ef
--- /dev/null
+++ b/integration-tests/telegram/src/main/resources/mock-messages/sendVideo.json
@@ -0,0 +1,33 @@
+{
+    "ok": true,
+    "result": {
+        "message_id": 933,
+        "from": {
+            "id": 770882310,
+            "is_bot": true,
+            "first_name": "camelDemoBot",
+            "username": "camelDemoBot"
+        },
+        "chat": {
+            "id": 434822960,
+            "first_name": "Peter",
+            "last_name": "Palaga",
+            "type": "private"
+        },
+        "date": 1576249600,
+        "video": {
+            "duration": 4,
+            "width": 108,
+            "height": 10,
+            "mime_type": "video/mp4",
+            "thumb": {
+                "file_id": "AAQEAAPmBQACZxqhU8LAVawXPI5dMWO3GwAEAQAHbQADcxQAAhYE",
+                "file_size": 991,
+                "width": 108,
+                "height": 10
+            },
+            "file_id": "BAADBAAD5gUAAmcaoVPCwFWsFzyOXRYE",
+            "file_size": 27845
+        }
+    }
+}
\ No newline at end of file
diff --git a/integration-tests/telegram/src/main/resources/mock-messages/stopMessageLiveLocation.json b/integration-tests/telegram/src/main/resources/mock-messages/stopMessageLiveLocation.json
new file mode 100644
index 0000000..a6a060d
--- /dev/null
+++ b/integration-tests/telegram/src/main/resources/mock-messages/stopMessageLiveLocation.json
@@ -0,0 +1,24 @@
+{
+    "ok": true,
+    "result": {
+        "message_id": 938,
+        "from": {
+            "id": 770882310,
+            "is_bot": true,
+            "first_name": "camelDemoBot",
+            "username": "camelDemoBot"
+        },
+        "chat": {
+            "id": 434822960,
+            "first_name": "Peter",
+            "last_name": "Palaga",
+            "type": "private"
+        },
+        "date": 1576249600,
+        "edit_date": 1576249601,
+        "location": {
+            "latitude": 29.974934,
+            "longitude": 31.131109
+        }
+    }
+}
\ No newline at end of file
diff --git a/integration-tests/telegram/src/test/java/org/apache/camel/quarkus/component/telegram/it/TelegramIT.java b/integration-tests/telegram/src/test/java/org/apache/camel/quarkus/component/telegram/it/TelegramIT.java
new file mode 100644
index 0000000..23a735e
--- /dev/null
+++ b/integration-tests/telegram/src/test/java/org/apache/camel/quarkus/component/telegram/it/TelegramIT.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.apache.camel.quarkus.component.telegram.it;
+
+import io.quarkus.test.junit.NativeImageTest;
+
+@NativeImageTest
+class TelegramIT extends TelegramTest {
+
+}
diff --git a/integration-tests/telegram/src/test/java/org/apache/camel/quarkus/component/telegram/it/TelegramTest.java b/integration-tests/telegram/src/test/java/org/apache/camel/quarkus/component/telegram/it/TelegramTest.java
new file mode 100644
index 0000000..bf3e88e
--- /dev/null
+++ b/integration-tests/telegram/src/test/java/org/apache/camel/quarkus/component/telegram/it/TelegramTest.java
@@ -0,0 +1,187 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one or more
+ * contributor license agreements.  See the NOTICE file distributed with
+ * this work for additional information regarding copyright ownership.
+ * The ASF licenses this file to You under the Apache License, Version 2.0
+ * (the "License"); you may not use this file except in compliance with
+ * the License.  You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+package org.apache.camel.quarkus.component.telegram.it;
+
+import java.io.IOException;
+import java.io.InputStream;
+import java.util.UUID;
+import java.util.concurrent.TimeUnit;
+
+import io.quarkus.test.common.QuarkusTestResource;
+import io.quarkus.test.junit.QuarkusTest;
+import io.restassured.RestAssured;
+import io.restassured.http.ContentType;
+import org.apache.camel.component.telegram.model.EditMessageLiveLocationMessage;
+import org.apache.camel.component.telegram.model.MessageResult;
+import org.apache.camel.component.telegram.model.SendLocationMessage;
+import org.apache.camel.component.telegram.model.SendVenueMessage;
+import org.apache.camel.component.telegram.model.StopMessageLiveLocationMessage;
+import org.apache.camel.quarkus.test.TrustStoreResource;
+import org.awaitility.Awaitility;
+import org.jboss.logging.Logger;
+import org.junit.jupiter.api.Test;
+import org.junit.jupiter.api.condition.EnabledIfEnvironmentVariable;
+
+import static org.hamcrest.Matchers.both;
+import static org.hamcrest.Matchers.greaterThanOrEqualTo;
+import static org.hamcrest.Matchers.is;
+import static org.hamcrest.Matchers.lessThan;
+
+@QuarkusTest
+@QuarkusTestResource(TrustStoreResource.class)
+@EnabledIfEnvironmentVariable(named = "TELEGRAM_AUTHORIZATION_TOKEN", matches = "[^ ]+")
+public class TelegramTest {
+
+    private static final Logger LOG = Logger.getLogger(TelegramTest.class);
+
+    @Test
+    public void postText() {
+        final String uuid = UUID.randomUUID().toString().replace("-", "");
+        final String msg = String.format("A message from camel-quarkus-telegram %s", uuid);
+
+        /* Send a message */
+        RestAssured.given()
+                .contentType(ContentType.TEXT)
+                .body(msg)
+                .post("/telegram/messages")
+                .then()
+                .statusCode(201);
+
+    }
+
+    @Test
+    public void getText() {
+        /* Telegram bots by design see neither their own messages nor other bots' messages.
+         * So receiving messages is currently possible only if you ping the bot manually.
+         * If you do so, you should see your messages in the test log. */
+        for (int i = 0; i < 5; i++) { // For some reason several iterations are needed to pick the messages
+            final String body = RestAssured.get("/telegram/messages")
+                    .then()
+                    .statusCode(is(both(greaterThanOrEqualTo(200)).and(lessThan(300))))
+                    .extract().body().asString();
+            LOG.info("Telegram Bot received messages: " + body);
+        }
+    }
+
+    @Test
+    public void png() throws IOException {
+        try (InputStream in = getClass().getClassLoader().getResourceAsStream("camel-quarkus-rocks.png")) {
+            /* Send a message */
+            RestAssured.given()
+                    .contentType("image/png")
+                    .body(in)
+                    .post("/telegram/media")
+                    .then()
+                    .statusCode(201);
+        }
+    }
+
+    @Test
+    public void mp3() throws IOException {
+        try (InputStream in = getClass().getClassLoader().getResourceAsStream("camel-quarkus-rocks.mp3")) {
+            /* Send a message */
+            RestAssured.given()
+                    .contentType("audio/mpeg")
+                    .body(in)
+                    .post("/telegram/media")
+                    .then()
+                    .statusCode(201);
+        }
+    }
+
+    @Test
+    public void mp4() throws IOException {
+        try (InputStream in = getClass().getClassLoader().getResourceAsStream("camel-quarkus-rocks.mp4")) {
+            /* Send a message */
+            RestAssured.given()
+                    .contentType("video/mp4")
+                    .body(in)
+                    .post("/telegram/media")
+                    .then()
+                    .statusCode(201);
+        }
+    }
+
+    @Test
+    public void pdf() throws IOException {
+        try (InputStream in = getClass().getClassLoader().getResourceAsStream("camel-quarkus-rocks.pdf")) {
+            /* Send a message */
+            RestAssured.given()
+                    .contentType("application/pdf")
+                    .body(in)
+                    .post("/telegram/media")
+                    .then()
+                    .statusCode(201);
+        }
+    }
+
+    @Test
+    public void location() throws IOException {
+
+        final SendLocationMessage sendLoc = new SendLocationMessage(29.974834, 31.138577);
+        sendLoc.setLivePeriod(120);
+        final MessageResult result = RestAssured.given()
+                .contentType(ContentType.JSON)
+                .body(sendLoc)
+                .post("/telegram/send-location")
+                .then()
+                .statusCode(201)
+                .extract().body().as(MessageResult.class);
+
+        /* Update the location */
+        final EditMessageLiveLocationMessage edit = new EditMessageLiveLocationMessage(29.974928, 31.131115);
+        edit.setChatId(result.getMessage().getChat().getId());
+        edit.setMessageId(result.getMessage().getMessageId());
+        /* The edit fails with various 400 errors unless we wait a bit */
+        Awaitility.await()
+                .pollDelay(500, TimeUnit.MILLISECONDS)
+                .pollInterval(100, TimeUnit.MILLISECONDS)
+                .atMost(10, TimeUnit.SECONDS).until(() -> {
+                    final int code = RestAssured.given()
+                            .contentType(ContentType.JSON)
+                            .body(edit)
+                            .post("/telegram/edit-location")
+                            .then()
+                            .extract().statusCode();
+                    return code != 201;
+                });
+
+        /* Stop updating */
+        final StopMessageLiveLocationMessage stop = new StopMessageLiveLocationMessage();
+        stop.setChatId(result.getMessage().getChat().getId());
+        stop.setMessageId(result.getMessage().getMessageId());
+        RestAssured.given()
+                .contentType(ContentType.JSON)
+                .body(stop)
+                .post("/telegram/stop-location")
+                .then()
+                .statusCode(201);
+    }
+
+    @Test
+    public void venue() throws IOException {
+        final SendVenueMessage venue = new SendVenueMessage(29.977818, 31.136329, "Pyramid of Queen Henutsen",
+                "El-Hussein Ibn Ali Ln, Nazlet El-Semman, Al Haram, Giza Governorate, Egypt");
+        RestAssured.given()
+                .contentType(ContentType.JSON)
+                .body(venue)
+                .post("/telegram/venue")
+                .then()
+                .statusCode(201);
+    }
+
+}
diff --git a/integration-tests/telegram/src/test/resources/camel-quarkus-rocks.mp3 b/integration-tests/telegram/src/test/resources/camel-quarkus-rocks.mp3
new file mode 100644
index 0000000..d615407
Binary files /dev/null and b/integration-tests/telegram/src/test/resources/camel-quarkus-rocks.mp3 differ
diff --git a/integration-tests/telegram/src/test/resources/camel-quarkus-rocks.mp4 b/integration-tests/telegram/src/test/resources/camel-quarkus-rocks.mp4
new file mode 100644
index 0000000..608d4b7
Binary files /dev/null and b/integration-tests/telegram/src/test/resources/camel-quarkus-rocks.mp4 differ
diff --git a/integration-tests/telegram/src/test/resources/camel-quarkus-rocks.pdf b/integration-tests/telegram/src/test/resources/camel-quarkus-rocks.pdf
new file mode 100644
index 0000000..edb723c
Binary files /dev/null and b/integration-tests/telegram/src/test/resources/camel-quarkus-rocks.pdf differ
diff --git a/integration-tests/telegram/src/test/resources/camel-quarkus-rocks.png b/integration-tests/telegram/src/test/resources/camel-quarkus-rocks.png
new file mode 100644
index 0000000..55b18a7
Binary files /dev/null and b/integration-tests/telegram/src/test/resources/camel-quarkus-rocks.png differ
diff --git a/poms/bom/pom.xml b/poms/bom/pom.xml
index 1e57d12..2e41e03 100644
--- a/poms/bom/pom.xml
+++ b/poms/bom/pom.xml
@@ -528,6 +528,11 @@
             </dependency>
             <dependency>
                 <groupId>org.apache.camel</groupId>
+                <artifactId>camel-telegram</artifactId>
+                <version>${camel.version}</version>
+            </dependency>
+            <dependency>
+                <groupId>org.apache.camel</groupId>
                 <artifactId>camel-timer</artifactId>
                 <version>${camel.version}</version>
             </dependency>
@@ -548,6 +553,21 @@
             </dependency>
             <dependency>
                 <groupId>org.apache.camel</groupId>
+                <artifactId>camel-webhook</artifactId>
+                <version>${camel.version}</version>
+            </dependency>
+            <dependency>
+                <groupId>org.apache.camel</groupId>
+                <artifactId>camel-xml-jaxb</artifactId>
+                <version>${camel.version}</version>
+            </dependency>
+            <dependency>
+                <groupId>org.apache.camel</groupId>
+                <artifactId>camel-xml-jaxp</artifactId>
+                <version>${camel.version}</version>
+            </dependency>
+            <dependency>
+                <groupId>org.apache.camel</groupId>
                 <artifactId>camel-xslt</artifactId>
                 <version>${camel.version}</version>
             </dependency>
@@ -990,6 +1010,11 @@
             </dependency>
             <dependency>
                 <groupId>org.apache.camel.quarkus</groupId>
+                <artifactId>camel-quarkus-telegram</artifactId>
+                <version>${camel-quarkus.version}</version>
+            </dependency>
+            <dependency>
+                <groupId>org.apache.camel.quarkus</groupId>
                 <artifactId>camel-quarkus-timer</artifactId>
                 <version>${camel-quarkus.version}</version>
             </dependency>