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 2023/01/23 07:25:54 UTC

[camel-quarkus] branch main updated (93e8725371 -> 21bcae6387)

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

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


    from 93e8725371 Updated CHANGELOG.md
     new 54144df808 Ref #4426: Support CSimple expressions with all DSLs
     new 21bcae6387 Regenerate the virtual dependencies

The 2 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:
 catalog/pom.xml                                    |  26 ++++
 .../ROOT/pages/reference/extensions/core.adoc      |  10 +-
 .../ROOT/pages/reference/extensions/csimple.adoc   |  25 ++-
 .../org/apache/camel/quarkus/core/CamelConfig.java |  26 ++++
 .../language}/deployment/pom.xml                   |  10 +-
 .../language/deployment/ExpressionBuildItem.java   |  27 +++-
 .../ExpressionExtractionResultBuildItem.java       |  18 ++-
 .../deployment/LanguageSupportProcessor.java       |  92 ++++++++++++
 .../language/deployment/dm/DryModeComponent.java   |  18 ++-
 .../deployment/dm/DryModeComponentResolver.java    |  18 +--
 .../language/deployment/dm/DryModeEndpoint.java    |  76 ++++++++++
 .../language/deployment/dm/DryModeInjector.java    |  65 ++++++++
 .../language/deployment/dm/DryModeLanguage.java    |  98 ++++++++++++
 .../deployment/dm/DryModeLanguageResolver.java     |  25 ++-
 .../language/deployment/dm/DryModeMain.java        |  83 ++++++++++
 extensions-support/{debezium => language}/pom.xml  |   4 +-
 .../{dsl => language}/runtime/pom.xml              |  10 +-
 .../main/resources/META-INF/quarkus-extension.yaml |   4 +-
 extensions-support/pom.xml                         |   1 +
 extensions/csimple/deployment/pom.xml              |   4 +
 .../csimple/deployment/CSimpleProcessor.java       | 167 +++++----------------
 .../csimple/deployment/CSimpleXmlProcessor.java    |  59 --------
 extensions/csimple/runtime/pom.xml                 |   4 +
 .../csimple/runtime/src/main/doc/limitations.adoc  |  25 ++-
 integration-tests-jvm/pom.xml                      |   2 +-
 integration-tests/csimple/pom.xml                  |  17 +++
 .../component/csimple/it/CSimpleResource.java      |   8 +
 .../src/main/resources/application.properties      |   2 +-
 .../src/main/resources/routes/my-routes.yaml       |  13 +-
 .../quarkus/component/csimple/it/CSimpleTest.java  |  14 +-
 poms/bom/pom.xml                                   |  10 ++
 poms/bom/src/main/generated/flattened-full-pom.xml |  10 ++
 .../src/main/generated/flattened-reduced-pom.xml   |  10 ++
 .../generated/flattened-reduced-verbose-pom.xml    |  10 ++
 34 files changed, 727 insertions(+), 264 deletions(-)
 copy {extensions/kamelet => extensions-support/language}/deployment/pom.xml (87%)
 copy extensions-core/core/deployment/src/main/java/org/apache/camel/quarkus/core/deployment/spi/CamelServiceFilterBuildItem.java => extensions-support/language/deployment/src/main/java/org/apache/camel/quarkus/support/language/deployment/ExpressionBuildItem.java (57%)
 copy extensions-core/core/deployment/src/main/java/org/apache/camel/quarkus/core/deployment/spi/BuildTimeCamelCatalogBuildItem.java => extensions-support/language/deployment/src/main/java/org/apache/camel/quarkus/support/language/deployment/ExpressionExtractionResultBuildItem.java (66%)
 create mode 100644 extensions-support/language/deployment/src/main/java/org/apache/camel/quarkus/support/language/deployment/LanguageSupportProcessor.java
 copy extensions-core/core/runtime/src/main/java/org/apache/camel/quarkus/core/events/EndpointRemoveEvent.java => extensions-support/language/deployment/src/main/java/org/apache/camel/quarkus/support/language/deployment/dm/DryModeComponent.java (60%)
 copy extensions/kamelet/deployment/src/main/java/org/apache/camel/quarkus/component/kamelet/deployment/KameletResolver.java => extensions-support/language/deployment/src/main/java/org/apache/camel/quarkus/support/language/deployment/dm/DryModeComponentResolver.java (66%)
 create mode 100644 extensions-support/language/deployment/src/main/java/org/apache/camel/quarkus/support/language/deployment/dm/DryModeEndpoint.java
 create mode 100644 extensions-support/language/deployment/src/main/java/org/apache/camel/quarkus/support/language/deployment/dm/DryModeInjector.java
 create mode 100644 extensions-support/language/deployment/src/main/java/org/apache/camel/quarkus/support/language/deployment/dm/DryModeLanguage.java
 copy integration-tests/microprofile/src/main/java/org/apache/camel/quarkus/component/microprofile/it/faulttolerance/MicroProfileFaultToleranceHelper.java => extensions-support/language/deployment/src/main/java/org/apache/camel/quarkus/support/language/deployment/dm/DryModeLanguageResolver.java (52%)
 create mode 100644 extensions-support/language/deployment/src/main/java/org/apache/camel/quarkus/support/language/deployment/dm/DryModeMain.java
 copy extensions-support/{debezium => language}/pom.xml (92%)
 copy extensions-support/{dsl => language}/runtime/pom.xml (87%)
 copy extensions-support/{ahc => language}/runtime/src/main/resources/META-INF/quarkus-extension.yaml (91%)
 delete mode 100644 extensions/csimple/deployment/src/main/java/org/apache/camel/quarkus/component/csimple/deployment/CSimpleXmlProcessor.java
 copy docs/local-build.sh => integration-tests/csimple/src/main/resources/routes/my-routes.yaml (82%)
 mode change 100755 => 100644


[camel-quarkus] 01/02: Ref #4426: Support CSimple expressions with all DSLs

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

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

commit 54144df808c9cb996e8c042e5903479e289d9668
Author: Nicolas Filotto <nf...@talend.com>
AuthorDate: Thu Jan 19 16:39:42 2023 +0100

    Ref #4426: Support CSimple expressions with all DSLs
---
 catalog/pom.xml                                    |  26 ++++
 .../ROOT/pages/reference/extensions/core.adoc      |  10 +-
 .../ROOT/pages/reference/extensions/csimple.adoc   |  25 ++-
 .../org/apache/camel/quarkus/core/CamelConfig.java |  26 ++++
 .../language}/deployment/pom.xml                   |  12 +-
 .../language/deployment/ExpressionBuildItem.java   |  47 +++---
 .../ExpressionExtractionResultBuildItem.java       |  36 ++---
 .../deployment/LanguageSupportProcessor.java       |  92 ++++++++++++
 .../language/deployment/dm/DryModeComponent.java   |  41 ++---
 .../deployment/dm/DryModeComponentResolver.java    |  39 ++---
 .../language/deployment/dm/DryModeEndpoint.java    |  76 ++++++++++
 .../language/deployment/dm/DryModeInjector.java    |  65 ++++++++
 .../language/deployment/dm/DryModeLanguage.java    |  98 ++++++++++++
 .../deployment/dm/DryModeLanguageResolver.java     |  43 ++++++
 .../language/deployment/dm/DryModeMain.java        |  83 ++++++++++
 .../language}/pom.xml                              |  40 +----
 .../language/runtime}/pom.xml                      |  22 +--
 .../main/resources/META-INF/quarkus-extension.yaml |  27 ++++
 extensions-support/pom.xml                         |   1 +
 extensions/csimple/deployment/pom.xml              |   4 +
 .../csimple/deployment/CSimpleProcessor.java       | 167 +++++----------------
 .../csimple/deployment/CSimpleXmlProcessor.java    |  59 --------
 extensions/csimple/runtime/pom.xml                 |   4 +
 .../csimple/runtime/src/main/doc/limitations.adoc  |  25 ++-
 integration-tests/csimple/pom.xml                  |  17 +++
 .../component/csimple/it/CSimpleResource.java      |   8 +
 .../src/main/resources/application.properties      |   2 +-
 .../src/main/resources/routes/my-routes.yaml       |  23 +++
 .../quarkus/component/csimple/it/CSimpleTest.java  |  14 +-
 poms/bom/pom.xml                                   |  10 ++
 poms/bom/src/main/generated/flattened-full-pom.xml |  10 ++
 .../src/main/generated/flattened-reduced-pom.xml   |  10 ++
 .../generated/flattened-reduced-verbose-pom.xml    |  10 ++
 33 files changed, 816 insertions(+), 356 deletions(-)

diff --git a/catalog/pom.xml b/catalog/pom.xml
index 1a9adf5991..ebb2134a85 100644
--- a/catalog/pom.xml
+++ b/catalog/pom.xml
@@ -3711,6 +3711,19 @@
                 </exclusion>
             </exclusions>
         </dependency>
+        <dependency>
+            <groupId>org.apache.camel.quarkus</groupId>
+            <artifactId>camel-quarkus-support-dsl</artifactId>
+            <version>${project.version}</version>
+            <type>pom</type>
+            <scope>test</scope>
+            <exclusions>
+                <exclusion>
+                    <groupId>*</groupId>
+                    <artifactId>*</artifactId>
+                </exclusion>
+            </exclusions>
+        </dependency>
         <dependency>
             <groupId>org.apache.camel.quarkus</groupId>
             <artifactId>camel-quarkus-support-google-cloud</artifactId>
@@ -3789,6 +3802,19 @@
                 </exclusion>
             </exclusions>
         </dependency>
+        <dependency>
+            <groupId>org.apache.camel.quarkus</groupId>
+            <artifactId>camel-quarkus-support-language</artifactId>
+            <version>${project.version}</version>
+            <type>pom</type>
+            <scope>test</scope>
+            <exclusions>
+                <exclusion>
+                    <groupId>*</groupId>
+                    <artifactId>*</artifactId>
+                </exclusion>
+            </exclusions>
+        </dependency>
         <dependency>
             <groupId>org.apache.camel.quarkus</groupId>
             <artifactId>camel-quarkus-support-mail</artifactId>
diff --git a/docs/modules/ROOT/pages/reference/extensions/core.adoc b/docs/modules/ROOT/pages/reference/extensions/core.adoc
index f1c2fa5ef3..1126dad561 100644
--- a/docs/modules/ROOT/pages/reference/extensions/core.adoc
+++ b/docs/modules/ROOT/pages/reference/extensions/core.adoc
@@ -252,12 +252,18 @@ If `true`, basic classes are registered for serialization; otherwise basic class
 | `boolean`
 | `false`
 
-|icon:lock[title=Fixed at build time] [[quarkus.camel.csimple.on-build-time-analysis-failure]]`link:#quarkus.camel.csimple.on-build-time-analysis-failure[quarkus.camel.csimple.on-build-time-analysis-failure]`
+|icon:lock[title=Fixed at build time] [[quarkus.camel.expression.on-build-time-analysis-failure]]`link:#quarkus.camel.expression.on-build-time-analysis-failure[quarkus.camel.expression.on-build-time-analysis-failure]`
 
-What to do if it is not possible to extract CSimple expressions from a route definition at build time.
+What to do if it is not possible to extract expressions from a route definition at build time.
 | `org.apache.camel.quarkus.core.CamelConfig.FailureRemedy`
 | `warn`
 
+|icon:lock[title=Fixed at build time] [[quarkus.camel.expression.extraction-enabled]]`link:#quarkus.camel.expression.extraction-enabled[quarkus.camel.expression.extraction-enabled]`
+
+Indicates whether the expression extraction from the route definitions at build time must be done. If disabled, the expressions are compiled at runtime.
+| `boolean`
+| `true`
+
 |icon:lock[title=Fixed at build time] [[quarkus.camel.event-bridge.enabled]]`link:#quarkus.camel.event-bridge.enabled[quarkus.camel.event-bridge.enabled]`
 
 Whether to enable the bridging of Camel events to CDI events. 
diff --git a/docs/modules/ROOT/pages/reference/extensions/csimple.adoc b/docs/modules/ROOT/pages/reference/extensions/csimple.adoc
index 4e8010dd40..47b368fc0f 100644
--- a/docs/modules/ROOT/pages/reference/extensions/csimple.adoc
+++ b/docs/modules/ROOT/pages/reference/extensions/csimple.adoc
@@ -47,23 +47,36 @@ endif::[]
 [id="extensions-csimple-camel-quarkus-limitations"]
 == Camel Quarkus limitations
 
-CSimple language is supported only in
+CSimple language is supported in all existing DSLs, but be aware that to extract the expressions from the existing route definitions, a dry run is done during the startup in JVM mode or during the build in Native mode which adds some log entries of the following type that you can simply ignore.
 
-* XML DSL
-* Java DSL when implemented in a class extending `org.apache.camel.builder.RouteBuilder`
+[source,text]
+----
+2023-01-19 16:36:31,779 INFO  [org.apa.cam.mai.MainSupport] (build-10) Expression Extractor 3.20.1 is starting
+2023-01-19 16:36:32,214 INFO  [org.apa.cam.imp.eng.AbstractCamelContext] (build-10) Apache Camel 3.20.1 (Expression Extractor) is starting
+2023-01-19 16:36:32,216 INFO  [org.apa.cam.imp.eng.AbstractCamelContext] (build-10) Routes startup (started:0)
+2023-01-19 16:36:32,217 INFO  [org.apa.cam.imp.eng.AbstractCamelContext] (build-10) Apache Camel 3.20.1 (Expression Extractor) started in 128ms (build:22ms init:104ms start:2ms)
+2023-01-19 16:36:32,218 INFO  [org.apa.cam.mai.MainSupport] (build-10) Waiting until complete: Duration max 1 seconds
+2023-01-19 16:36:33,223 INFO  [org.apa.cam.mai.MainSupport] (build-10) Duration max seconds triggering shutdown of the JVM
+2023-01-19 16:36:33,223 INFO  [org.apa.cam.mai.MainSupport] (build-10) Expression Extractor 3.20.1 shutdown
+----
 
-The compilation of CSimple scripts happens at build time. To be able to discover the scripts in the route definitions,
+The compilation of CSimple scripts happens at build time by default. To be able to discover the scripts in the route definitions,
 those definitions need to get assembled at build time. When extending
 `org.apache.camel.builder.RouteBuilder`, this basically means instantiating your `RouteBuilder`, setting
 a fake `CamelContext` instance on it and calling its `configure()` method. It may fail if your `configure()`
 method attempts to access some resource that is only available at runtime.
 
-You can use the `quarkus.camel.csimple.on-build-time-analysis-failure` configuration parameter to decide
+You can use the `quarkus.camel.expression.on-build-time-analysis-failure` configuration parameter to decide
 what should happen in such cases. Possible values are `warn` (default), `fail` or `ignore`.
 
+You can also simply disable the expression extraction process by setting the configuration parameter `quarkus.camel.expression.extraction-enabled` to `false`.
+
+If the expression extraction process is disabled or fails, the expressions are then compiled at runtime which also means that it
+can only work in JVM mode moreover the artifact `org.apache.camel:camel-csimple-joor` has to be added to the classpath.
+
 [WARNING]
 ====
-CSimple language will not work on Camel Quarkus if used in a `org.apache.camel.builder.LambdaRouteBuilder`
+CSimple language will not work on Camel Quarkus if used in a `org.apache.camel.builder.LambdaRouteBuilder` or if a `RouteBuilder` depends on dependency injection.
 ====
 
 
diff --git a/extensions-core/core/runtime/src/main/java/org/apache/camel/quarkus/core/CamelConfig.java b/extensions-core/core/runtime/src/main/java/org/apache/camel/quarkus/core/CamelConfig.java
index 9c62934b18..6b91193c3b 100644
--- a/extensions-core/core/runtime/src/main/java/org/apache/camel/quarkus/core/CamelConfig.java
+++ b/extensions-core/core/runtime/src/main/java/org/apache/camel/quarkus/core/CamelConfig.java
@@ -63,9 +63,16 @@ public class CamelConfig {
     /**
      * Build time configuration options for the Camel CSimple language.
      */
+    @Deprecated(forRemoval = true)
     @ConfigItem
     public CSimpleConfig csimple;
 
+    /**
+     * Build time configuration options for the extraction of Camel expressions.
+     */
+    @ConfigItem
+    public ExpressionConfig expression;
+
     /**
      * Build time configuration options for the Camel CDI event bridge.
      */
@@ -358,6 +365,10 @@ public class CamelConfig {
         public boolean models;
     }
 
+    /**
+     * @deprecated use {@link ExpressionConfig} instead
+     */
+    @Deprecated(forRemoval = true)
     @ConfigGroup
     public static class CSimpleConfig {
 
@@ -366,6 +377,21 @@ public class CamelConfig {
         public FailureRemedy onBuildTimeAnalysisFailure;
     }
 
+    @ConfigGroup
+    public static class ExpressionConfig {
+
+        /** What to do if it is not possible to extract expressions from a route definition at build time. */
+        @ConfigItem(defaultValue = "warn")
+        public FailureRemedy onBuildTimeAnalysisFailure;
+
+        /**
+         * Indicates whether the expression extraction from the route definitions at build time must be done. If
+         * disabled, the expressions are compiled at runtime.
+         */
+        @ConfigItem(defaultValue = "true")
+        public boolean extractionEnabled;
+    }
+
     @ConfigGroup
     public static class EventBridgeConfig {
 
diff --git a/extensions/csimple/deployment/pom.xml b/extensions-support/language/deployment/pom.xml
similarity index 84%
copy from extensions/csimple/deployment/pom.xml
copy to extensions-support/language/deployment/pom.xml
index e783701376..3b2a9ff4ad 100644
--- a/extensions/csimple/deployment/pom.xml
+++ b/extensions-support/language/deployment/pom.xml
@@ -21,13 +21,13 @@
     <modelVersion>4.0.0</modelVersion>
     <parent>
         <groupId>org.apache.camel.quarkus</groupId>
-        <artifactId>camel-quarkus-csimple-parent</artifactId>
+        <artifactId>camel-quarkus-support-language-parent</artifactId>
         <version>2.17.0-SNAPSHOT</version>
         <relativePath>../pom.xml</relativePath>
     </parent>
 
-    <artifactId>camel-quarkus-csimple-deployment</artifactId>
-    <name>Camel Quarkus :: CSimple :: Deployment</name>
+    <artifactId>camel-quarkus-support-language-deployment</artifactId>
+    <name>Camel Quarkus :: Support :: Language :: Deployment</name>
 
     <dependencies>
         <dependency>
@@ -36,7 +36,11 @@
         </dependency>
         <dependency>
             <groupId>org.apache.camel.quarkus</groupId>
-            <artifactId>camel-quarkus-csimple</artifactId>
+            <artifactId>camel-quarkus-support-language</artifactId>
+        </dependency>
+        <dependency>
+            <groupId>org.apache.camel</groupId>
+            <artifactId>camel-main</artifactId>
         </dependency>
     </dependencies>
 
diff --git a/integration-tests/csimple/src/test/java/org/apache/camel/quarkus/component/csimple/it/CSimpleTest.java b/extensions-support/language/deployment/src/main/java/org/apache/camel/quarkus/support/language/deployment/ExpressionBuildItem.java
similarity index 50%
copy from integration-tests/csimple/src/test/java/org/apache/camel/quarkus/component/csimple/it/CSimpleTest.java
copy to extensions-support/language/deployment/src/main/java/org/apache/camel/quarkus/support/language/deployment/ExpressionBuildItem.java
index 4e3d3bb18d..b3e7d52dae 100644
--- a/integration-tests/csimple/src/test/java/org/apache/camel/quarkus/component/csimple/it/CSimpleTest.java
+++ b/extensions-support/language/deployment/src/main/java/org/apache/camel/quarkus/support/language/deployment/ExpressionBuildItem.java
@@ -14,36 +14,35 @@
  * See the License for the specific language governing permissions and
  * limitations under the License.
  */
-package org.apache.camel.quarkus.component.csimple.it;
+package org.apache.camel.quarkus.support.language.deployment;
 
-import io.quarkus.test.junit.QuarkusTest;
-import io.restassured.RestAssured;
-import io.restassured.http.ContentType;
-import org.junit.jupiter.api.Test;
+import io.quarkus.builder.item.MultiBuildItem;
 
-import static org.hamcrest.Matchers.is;
+/**
+ * {@code ExpressionBuildItem} represents an expression in a given language that has been extracted from the route
+ * definitions.
+ */
+public final class ExpressionBuildItem extends MultiBuildItem {
+
+    final String language;
+    final String expression;
+    final boolean predicate;
 
-@QuarkusTest
-class CSimpleTest {
+    public ExpressionBuildItem(String language, String expression, boolean predicate) {
+        this.language = language;
+        this.expression = expression;
+        this.predicate = predicate;
+    }
 
-    @Test
-    public void csimpleHello() {
-        RestAssured.given()
-                .body("Joe")
-                .contentType(ContentType.TEXT)
-                .post("/csimple/csimple-hello")
-                .then()
-                .body(is("Hello Joe"));
+    public String getLanguage() {
+        return language;
     }
 
-    @Test
-    public void csimpleXml() {
-        RestAssured.given()
-                .body("Joe")
-                .contentType(ContentType.TEXT)
-                .post("/csimple/csimple-xml-dsl")
-                .then()
-                .body(is("Hi Joe"));
+    public String getExpression() {
+        return expression;
     }
 
+    public boolean isPredicate() {
+        return predicate;
+    }
 }
diff --git a/integration-tests/csimple/src/test/java/org/apache/camel/quarkus/component/csimple/it/CSimpleTest.java b/extensions-support/language/deployment/src/main/java/org/apache/camel/quarkus/support/language/deployment/ExpressionExtractionResultBuildItem.java
similarity index 50%
copy from integration-tests/csimple/src/test/java/org/apache/camel/quarkus/component/csimple/it/CSimpleTest.java
copy to extensions-support/language/deployment/src/main/java/org/apache/camel/quarkus/support/language/deployment/ExpressionExtractionResultBuildItem.java
index 4e3d3bb18d..2ec15084d4 100644
--- a/integration-tests/csimple/src/test/java/org/apache/camel/quarkus/component/csimple/it/CSimpleTest.java
+++ b/extensions-support/language/deployment/src/main/java/org/apache/camel/quarkus/support/language/deployment/ExpressionExtractionResultBuildItem.java
@@ -14,36 +14,22 @@
  * See the License for the specific language governing permissions and
  * limitations under the License.
  */
-package org.apache.camel.quarkus.component.csimple.it;
+package org.apache.camel.quarkus.support.language.deployment;
 
-import io.quarkus.test.junit.QuarkusTest;
-import io.restassured.RestAssured;
-import io.restassured.http.ContentType;
-import org.junit.jupiter.api.Test;
+import io.quarkus.builder.item.SimpleBuildItem;
 
-import static org.hamcrest.Matchers.is;
+/**
+ * {@code ExpressionBuildItem} represents the result of the expression extraction process.
+ */
+public final class ExpressionExtractionResultBuildItem extends SimpleBuildItem {
 
-@QuarkusTest
-class CSimpleTest {
+    final boolean success;
 
-    @Test
-    public void csimpleHello() {
-        RestAssured.given()
-                .body("Joe")
-                .contentType(ContentType.TEXT)
-                .post("/csimple/csimple-hello")
-                .then()
-                .body(is("Hello Joe"));
+    public ExpressionExtractionResultBuildItem(boolean success) {
+        this.success = success;
     }
 
-    @Test
-    public void csimpleXml() {
-        RestAssured.given()
-                .body("Joe")
-                .contentType(ContentType.TEXT)
-                .post("/csimple/csimple-xml-dsl")
-                .then()
-                .body(is("Hi Joe"));
+    public boolean isSuccess() {
+        return success;
     }
-
 }
diff --git a/extensions-support/language/deployment/src/main/java/org/apache/camel/quarkus/support/language/deployment/LanguageSupportProcessor.java b/extensions-support/language/deployment/src/main/java/org/apache/camel/quarkus/support/language/deployment/LanguageSupportProcessor.java
new file mode 100644
index 0000000000..f30fa129f2
--- /dev/null
+++ b/extensions-support/language/deployment/src/main/java/org/apache/camel/quarkus/support/language/deployment/LanguageSupportProcessor.java
@@ -0,0 +1,92 @@
+/*
+ * 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.support.language.deployment;
+
+import java.util.ArrayList;
+import java.util.List;
+
+import io.quarkus.bootstrap.classloading.QuarkusClassLoader;
+import io.quarkus.deployment.annotations.BuildProducer;
+import io.quarkus.deployment.annotations.BuildStep;
+import org.apache.camel.builder.RouteBuilder;
+import org.apache.camel.quarkus.core.CamelConfig;
+import org.apache.camel.quarkus.core.deployment.spi.CamelRoutesBuilderClassBuildItem;
+import org.apache.camel.quarkus.support.language.deployment.dm.DryModeLanguage;
+import org.apache.camel.quarkus.support.language.deployment.dm.DryModeMain;
+import org.jboss.logging.Logger;
+
+class LanguageSupportProcessor {
+
+    private static final Logger LOG = Logger.getLogger(LanguageSupportProcessor.class);
+
+    @BuildStep
+    ExpressionExtractionResultBuildItem extractExpressions(CamelConfig config,
+            List<CamelRoutesBuilderClassBuildItem> routesBuilderClasses,
+            BuildProducer<ExpressionBuildItem> producer) throws Exception {
+        if (config.expression.extractionEnabled) {
+            final ClassLoader loader = Thread.currentThread().getContextClassLoader();
+            if (!(loader instanceof QuarkusClassLoader)) {
+                throw new IllegalStateException(
+                        QuarkusClassLoader.class.getSimpleName() + " expected as the context class loader");
+            }
+            final List<Class<?>> routeBuilderClasses = new ArrayList<>(routesBuilderClasses.size());
+            for (CamelRoutesBuilderClassBuildItem routesBuilderClass : routesBuilderClasses) {
+                final String className = routesBuilderClass.getDotName().toString();
+                final Class<?> cl = loader.loadClass(className);
+
+                if (RouteBuilder.class.isAssignableFrom(cl)) {
+                    routeBuilderClasses.add(cl);
+                } else {
+                    LOG.warnf("Language expressions occurring in %s won't be compiled at build time", cl);
+                }
+            }
+            try {
+                DryModeMain main = new DryModeMain("Expression Extractor", routeBuilderClasses.toArray(new Class<?>[0]));
+                main.start();
+                main.run();
+                for (DryModeLanguage language : main.getLanguages()) {
+                    final String name = language.getName();
+                    for (String exp : language.getPredicates()) {
+                        producer.produce(new ExpressionBuildItem(name, exp, true));
+                    }
+                    for (String exp : language.getExpressions()) {
+                        producer.produce(new ExpressionBuildItem(name, exp, false));
+                    }
+                }
+                return new ExpressionExtractionResultBuildItem(true);
+            } catch (Exception e) {
+                switch (config.expression.onBuildTimeAnalysisFailure) {
+                case fail:
+                    throw new RuntimeException(
+                            "Could not extract language expressions."
+                                    + "You may want to set quarkus.camel.expression.on-build-time-analysis-failure to warn or ignore if you do not use languages in your routes",
+                            e);
+                case warn:
+                    LOG.warn("Could not extract language expressions.", e);
+                    break;
+                case ignore:
+                    LOG.debug("Could not extract language expressions", e);
+                    break;
+                default:
+                    throw new IllegalStateException("Unexpected " + CamelConfig.FailureRemedy.class.getSimpleName() + ": "
+                            + config.expression.onBuildTimeAnalysisFailure);
+                }
+            }
+        }
+        return new ExpressionExtractionResultBuildItem(false);
+    }
+}
diff --git a/integration-tests/csimple/src/test/java/org/apache/camel/quarkus/component/csimple/it/CSimpleTest.java b/extensions-support/language/deployment/src/main/java/org/apache/camel/quarkus/support/language/deployment/dm/DryModeComponent.java
similarity index 50%
copy from integration-tests/csimple/src/test/java/org/apache/camel/quarkus/component/csimple/it/CSimpleTest.java
copy to extensions-support/language/deployment/src/main/java/org/apache/camel/quarkus/support/language/deployment/dm/DryModeComponent.java
index 4e3d3bb18d..3586ec36f8 100644
--- a/integration-tests/csimple/src/test/java/org/apache/camel/quarkus/component/csimple/it/CSimpleTest.java
+++ b/extensions-support/language/deployment/src/main/java/org/apache/camel/quarkus/support/language/deployment/dm/DryModeComponent.java
@@ -14,36 +14,23 @@
  * See the License for the specific language governing permissions and
  * limitations under the License.
  */
-package org.apache.camel.quarkus.component.csimple.it;
+package org.apache.camel.quarkus.support.language.deployment.dm;
 
-import io.quarkus.test.junit.QuarkusTest;
-import io.restassured.RestAssured;
-import io.restassured.http.ContentType;
-import org.junit.jupiter.api.Test;
+import java.util.Map;
 
-import static org.hamcrest.Matchers.is;
+import org.apache.camel.Endpoint;
+import org.apache.camel.spi.annotations.Component;
+import org.apache.camel.support.DefaultComponent;
 
-@QuarkusTest
-class CSimpleTest {
-
-    @Test
-    public void csimpleHello() {
-        RestAssured.given()
-                .body("Joe")
-                .contentType(ContentType.TEXT)
-                .post("/csimple/csimple-hello")
-                .then()
-                .body(is("Hello Joe"));
-    }
+/**
+ * {@code DryModeComponent} is a mock component that is used as replacement of all components in the routes for a dry
+ * run.
+ */
+@Component("dm")
+public class DryModeComponent extends DefaultComponent {
 
-    @Test
-    public void csimpleXml() {
-        RestAssured.given()
-                .body("Joe")
-                .contentType(ContentType.TEXT)
-                .post("/csimple/csimple-xml-dsl")
-                .then()
-                .body(is("Hi Joe"));
+    @Override
+    protected Endpoint createEndpoint(String uri, String remaining, Map<String, Object> parameters) {
+        return new DryModeEndpoint(uri);
     }
-
 }
diff --git a/integration-tests/csimple/src/test/java/org/apache/camel/quarkus/component/csimple/it/CSimpleTest.java b/extensions-support/language/deployment/src/main/java/org/apache/camel/quarkus/support/language/deployment/dm/DryModeComponentResolver.java
similarity index 50%
copy from integration-tests/csimple/src/test/java/org/apache/camel/quarkus/component/csimple/it/CSimpleTest.java
copy to extensions-support/language/deployment/src/main/java/org/apache/camel/quarkus/support/language/deployment/dm/DryModeComponentResolver.java
index 4e3d3bb18d..98dbce3311 100644
--- a/integration-tests/csimple/src/test/java/org/apache/camel/quarkus/component/csimple/it/CSimpleTest.java
+++ b/extensions-support/language/deployment/src/main/java/org/apache/camel/quarkus/support/language/deployment/dm/DryModeComponentResolver.java
@@ -14,36 +14,19 @@
  * See the License for the specific language governing permissions and
  * limitations under the License.
  */
-package org.apache.camel.quarkus.component.csimple.it;
+package org.apache.camel.quarkus.support.language.deployment.dm;
 
-import io.quarkus.test.junit.QuarkusTest;
-import io.restassured.RestAssured;
-import io.restassured.http.ContentType;
-import org.junit.jupiter.api.Test;
+import org.apache.camel.CamelContext;
+import org.apache.camel.Component;
+import org.apache.camel.spi.ComponentResolver;
 
-import static org.hamcrest.Matchers.is;
-
-@QuarkusTest
-class CSimpleTest {
-
-    @Test
-    public void csimpleHello() {
-        RestAssured.given()
-                .body("Joe")
-                .contentType(ContentType.TEXT)
-                .post("/csimple/csimple-hello")
-                .then()
-                .body(is("Hello Joe"));
-    }
+/**
+ * {@code DryModeComponentResolver} is used to resolve all components with {@link DryModeComponent} for a dry run.
+ */
+class DryModeComponentResolver implements ComponentResolver {
 
-    @Test
-    public void csimpleXml() {
-        RestAssured.given()
-                .body("Joe")
-                .contentType(ContentType.TEXT)
-                .post("/csimple/csimple-xml-dsl")
-                .then()
-                .body(is("Hi Joe"));
+    @Override
+    public Component resolveComponent(String name, CamelContext context) {
+        return new DryModeComponent();
     }
-
 }
diff --git a/extensions-support/language/deployment/src/main/java/org/apache/camel/quarkus/support/language/deployment/dm/DryModeEndpoint.java b/extensions-support/language/deployment/src/main/java/org/apache/camel/quarkus/support/language/deployment/dm/DryModeEndpoint.java
new file mode 100644
index 0000000000..87b79765c0
--- /dev/null
+++ b/extensions-support/language/deployment/src/main/java/org/apache/camel/quarkus/support/language/deployment/dm/DryModeEndpoint.java
@@ -0,0 +1,76 @@
+/*
+ * 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.support.language.deployment.dm;
+
+import org.apache.camel.Category;
+import org.apache.camel.Consumer;
+import org.apache.camel.Endpoint;
+import org.apache.camel.Exchange;
+import org.apache.camel.Processor;
+import org.apache.camel.Producer;
+import org.apache.camel.spi.UriEndpoint;
+import org.apache.camel.support.DefaultConsumer;
+import org.apache.camel.support.DefaultEndpoint;
+import org.apache.camel.support.DefaultProducer;
+
+/**
+ * {@code DryModeEndpoint} is a mock endpoint that is used as replacement of all endpoints in the routes for a dry run.
+ */
+@UriEndpoint(firstVersion = "3.20.0", scheme = "dm", title = "Dry Mode", syntax = "dm:name", category = { Category.CORE,
+        Category.TESTING }, lenientProperties = true)
+public class DryModeEndpoint extends DefaultEndpoint {
+
+    private final String uri;
+
+    public DryModeEndpoint(String uri) {
+        this.uri = uri;
+    }
+
+    @Override
+    public Producer createProducer() {
+        return new DryModeProducer(this);
+    }
+
+    @Override
+    public Consumer createConsumer(Processor processor) {
+        return new DryModeConsumer(this, processor);
+    }
+
+    @Override
+    protected String createEndpointUri() {
+        return String.format("dm:%s", uri);
+    }
+
+    private static class DryModeConsumer extends DefaultConsumer {
+
+        DryModeConsumer(Endpoint endpoint, Processor processor) {
+            super(endpoint, processor);
+        }
+    }
+
+    private static class DryModeProducer extends DefaultProducer {
+
+        DryModeProducer(Endpoint endpoint) {
+            super(endpoint);
+        }
+
+        @Override
+        public void process(Exchange exchange) {
+            // Nothing to do
+        }
+    }
+}
diff --git a/extensions-support/language/deployment/src/main/java/org/apache/camel/quarkus/support/language/deployment/dm/DryModeInjector.java b/extensions-support/language/deployment/src/main/java/org/apache/camel/quarkus/support/language/deployment/dm/DryModeInjector.java
new file mode 100644
index 0000000000..46d53c058f
--- /dev/null
+++ b/extensions-support/language/deployment/src/main/java/org/apache/camel/quarkus/support/language/deployment/dm/DryModeInjector.java
@@ -0,0 +1,65 @@
+/*
+ * 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.support.language.deployment.dm;
+
+import org.apache.camel.Component;
+import org.apache.camel.spi.Injector;
+
+/**
+ * {@code DryModeInjector} is used to replace instantiations of any component with an instantiation of
+ * {@link DryModeComponent} for a dry run.
+ */
+class DryModeInjector implements Injector {
+
+    private final Injector delegate;
+
+    DryModeInjector(Injector delegate) {
+        this.delegate = delegate;
+    }
+
+    @SuppressWarnings("unchecked")
+    @Override
+    public <T> T newInstance(Class<T> type) {
+        if (Component.class.isAssignableFrom(type)) {
+            return (T) delegate.newInstance(DryModeComponent.class);
+        }
+        return delegate.newInstance(type);
+    }
+
+    @SuppressWarnings("unchecked")
+    @Override
+    public <T> T newInstance(Class<T> type, String factoryMethod) {
+        if (Component.class.isAssignableFrom(type)) {
+            return (T) delegate.newInstance(DryModeComponent.class);
+        }
+        return delegate.newInstance(type, factoryMethod);
+    }
+
+    @SuppressWarnings("unchecked")
+    @Override
+    public <T> T newInstance(Class<T> type, boolean postProcessBean) {
+        if (Component.class.isAssignableFrom(type)) {
+            return (T) delegate.newInstance(DryModeComponent.class);
+        }
+        return delegate.newInstance(type, postProcessBean);
+    }
+
+    @Override
+    public boolean supportsAutoWiring() {
+        return delegate.supportsAutoWiring();
+    }
+}
diff --git a/extensions-support/language/deployment/src/main/java/org/apache/camel/quarkus/support/language/deployment/dm/DryModeLanguage.java b/extensions-support/language/deployment/src/main/java/org/apache/camel/quarkus/support/language/deployment/dm/DryModeLanguage.java
new file mode 100644
index 0000000000..cee5ca0b84
--- /dev/null
+++ b/extensions-support/language/deployment/src/main/java/org/apache/camel/quarkus/support/language/deployment/dm/DryModeLanguage.java
@@ -0,0 +1,98 @@
+/*
+ * 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.support.language.deployment.dm;
+
+import java.util.Map;
+import java.util.Set;
+import java.util.concurrent.ConcurrentHashMap;
+
+import org.apache.camel.CamelContext;
+import org.apache.camel.Exchange;
+import org.apache.camel.Expression;
+import org.apache.camel.Predicate;
+import org.apache.camel.spi.Language;
+
+/**
+ * {@code DryModeLanguage} is a mock language meant to collect all the expressions and predicates that are registered
+ * for a specific language.
+ */
+public class DryModeLanguage implements Language {
+
+    private final String name;
+    private final Predicate defaultPredicate = new DryModePredicate();
+    private final Expression defaultExpression = new DryModeExpression();
+    private final Map<Boolean, Set<String>> expressions = new ConcurrentHashMap<>();
+
+    public DryModeLanguage(String name) {
+        this.name = name;
+    }
+
+    public String getName() {
+        return name;
+    }
+
+    public Set<String> getPredicates() {
+        return expressions.getOrDefault(Boolean.TRUE, Set.of());
+    }
+
+    public Set<String> getExpressions() {
+        return expressions.getOrDefault(Boolean.FALSE, Set.of());
+    }
+
+    @Override
+    public Predicate createPredicate(String expression) {
+        expressions.computeIfAbsent(Boolean.TRUE, mode -> ConcurrentHashMap.newKeySet()).add(expression);
+        return defaultPredicate;
+    }
+
+    @Override
+    public Expression createExpression(String expression) {
+        expressions.computeIfAbsent(Boolean.FALSE, mode -> ConcurrentHashMap.newKeySet()).add(expression);
+        return defaultExpression;
+    }
+
+    private static class DryModePredicate implements Predicate {
+
+        @Override
+        public boolean matches(Exchange exchange) {
+            return false;
+        }
+
+        @Override
+        public void init(CamelContext context) {
+            // nothing to do
+        }
+
+        @Override
+        public void initPredicate(CamelContext context) {
+            // nothing to do
+        }
+    }
+
+    private static class DryModeExpression implements Expression {
+
+        @Override
+        public <T> T evaluate(Exchange exchange, Class<T> type) {
+            return null;
+        }
+
+        @Override
+        public void init(CamelContext context) {
+            // nothing to do
+        }
+    }
+}
diff --git a/extensions-support/language/deployment/src/main/java/org/apache/camel/quarkus/support/language/deployment/dm/DryModeLanguageResolver.java b/extensions-support/language/deployment/src/main/java/org/apache/camel/quarkus/support/language/deployment/dm/DryModeLanguageResolver.java
new file mode 100644
index 0000000000..ae1a91a237
--- /dev/null
+++ b/extensions-support/language/deployment/src/main/java/org/apache/camel/quarkus/support/language/deployment/dm/DryModeLanguageResolver.java
@@ -0,0 +1,43 @@
+/*
+ * 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.support.language.deployment.dm;
+
+import java.util.Collection;
+import java.util.Map;
+import java.util.concurrent.ConcurrentHashMap;
+
+import org.apache.camel.CamelContext;
+import org.apache.camel.NoSuchLanguageException;
+import org.apache.camel.spi.Language;
+import org.apache.camel.spi.LanguageResolver;
+
+/**
+ * {@code DryModeLanguageResolver} is used to resolve all languages with {@link DryModeLanguage} for a dry run.
+ */
+class DryModeLanguageResolver implements LanguageResolver {
+
+    private final Map<String, DryModeLanguage> languages = new ConcurrentHashMap<>();
+
+    @Override
+    public Language resolveLanguage(String name, CamelContext context) throws NoSuchLanguageException {
+        return languages.computeIfAbsent(name, DryModeLanguage::new);
+    }
+
+    Collection<DryModeLanguage> getLanguages() {
+        return languages.values();
+    }
+}
diff --git a/extensions-support/language/deployment/src/main/java/org/apache/camel/quarkus/support/language/deployment/dm/DryModeMain.java b/extensions-support/language/deployment/src/main/java/org/apache/camel/quarkus/support/language/deployment/dm/DryModeMain.java
new file mode 100644
index 0000000000..2eb553eed3
--- /dev/null
+++ b/extensions-support/language/deployment/src/main/java/org/apache/camel/quarkus/support/language/deployment/dm/DryModeMain.java
@@ -0,0 +1,83 @@
+/*
+ * 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.support.language.deployment.dm;
+
+import java.util.Collection;
+
+import org.apache.camel.CamelContext;
+import org.apache.camel.ProducerTemplate;
+import org.apache.camel.impl.DefaultCamelContext;
+import org.apache.camel.main.MainSupport;
+
+/**
+ * {@code DryModeMain} a specific main implementation allowing to do a dry run of the application in order to collect
+ * the expressions defined in all the routes of the project.
+ */
+public class DryModeMain extends MainSupport {
+
+    private final DryModeLanguageResolver languageResolver = new DryModeLanguageResolver();
+
+    public DryModeMain(String appName, Class<?>[] routeBuilderClasses) {
+        setAppName(appName);
+        mainConfigurationProperties.addRoutesBuilder(routeBuilderClasses);
+    }
+
+    @Override
+    protected ProducerTemplate findOrCreateCamelTemplate() {
+        final CamelContext context = getCamelContext();
+        if (context == null) {
+            return null;
+        }
+        return context.createProducerTemplate();
+    }
+
+    @Override
+    protected CamelContext createCamelContext() {
+        DefaultCamelContext ctx = new DefaultCamelContext(false);
+        ctx.setName(getAppName());
+        ctx.setLanguageResolver(languageResolver);
+        ctx.setComponentResolver(new DryModeComponentResolver());
+        ctx.setInjector(new DryModeInjector(ctx.getInjector()));
+        return ctx;
+    }
+
+    @Override
+    protected void doInit() throws Exception {
+        // turn off auto-wiring when running in dry mode
+        mainConfigurationProperties.setAutowiredEnabled(false);
+        // and turn off fail fast as we stub components
+        mainConfigurationProperties.setAutoConfigurationFailFast(false);
+        mainConfigurationProperties.setAutoStartup(false);
+        mainConfigurationProperties.setDurationMaxSeconds(1);
+        mainConfigurationProperties.setAutoConfigurationLogSummary(false);
+        super.doInit();
+        initCamelContext();
+    }
+
+    @Override
+    protected void doStart() throws Exception {
+        super.doStart();
+        CamelContext context = getCamelContext();
+        if (context != null) {
+            context.start();
+        }
+    }
+
+    public Collection<DryModeLanguage> getLanguages() {
+        return languageResolver.getLanguages();
+    }
+}
diff --git a/extensions/csimple/deployment/pom.xml b/extensions-support/language/pom.xml
similarity index 51%
copy from extensions/csimple/deployment/pom.xml
copy to extensions-support/language/pom.xml
index e783701376..089c79a65a 100644
--- a/extensions/csimple/deployment/pom.xml
+++ b/extensions-support/language/pom.xml
@@ -21,41 +21,17 @@
     <modelVersion>4.0.0</modelVersion>
     <parent>
         <groupId>org.apache.camel.quarkus</groupId>
-        <artifactId>camel-quarkus-csimple-parent</artifactId>
+        <artifactId>camel-quarkus-extensions-support</artifactId>
         <version>2.17.0-SNAPSHOT</version>
         <relativePath>../pom.xml</relativePath>
     </parent>
 
-    <artifactId>camel-quarkus-csimple-deployment</artifactId>
-    <name>Camel Quarkus :: CSimple :: Deployment</name>
-
-    <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-csimple</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>
+    <artifactId>camel-quarkus-support-language-parent</artifactId>
+    <name>Camel Quarkus :: Support :: Language</name>
+    <packaging>pom</packaging>
 
+    <modules>
+        <module>deployment</module>
+        <module>runtime</module>
+    </modules>
 </project>
diff --git a/extensions/csimple/deployment/pom.xml b/extensions-support/language/runtime/pom.xml
similarity index 78%
copy from extensions/csimple/deployment/pom.xml
copy to extensions-support/language/runtime/pom.xml
index e783701376..d6a01c2bff 100644
--- a/extensions/csimple/deployment/pom.xml
+++ b/extensions-support/language/runtime/pom.xml
@@ -21,27 +21,32 @@
     <modelVersion>4.0.0</modelVersion>
     <parent>
         <groupId>org.apache.camel.quarkus</groupId>
-        <artifactId>camel-quarkus-csimple-parent</artifactId>
+        <artifactId>camel-quarkus-support-language-parent</artifactId>
         <version>2.17.0-SNAPSHOT</version>
         <relativePath>../pom.xml</relativePath>
     </parent>
 
-    <artifactId>camel-quarkus-csimple-deployment</artifactId>
-    <name>Camel Quarkus :: CSimple :: Deployment</name>
+    <artifactId>camel-quarkus-support-language</artifactId>
+    <name>Camel Quarkus :: Support :: Language :: Runtime</name>
+
+    <properties>
+        <camel.quarkus.jvmSince>2.17.0</camel.quarkus.jvmSince>
+        <camel.quarkus.nativeSince>2.17.0</camel.quarkus.nativeSince>
+    </properties>
 
     <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-csimple</artifactId>
+            <artifactId>camel-quarkus-core</artifactId>
         </dependency>
     </dependencies>
 
     <build>
         <plugins>
+            <plugin>
+                <groupId>io.quarkus</groupId>
+                <artifactId>quarkus-extension-maven-plugin</artifactId>
+            </plugin>
             <plugin>
                 <groupId>org.apache.maven.plugins</groupId>
                 <artifactId>maven-compiler-plugin</artifactId>
@@ -57,5 +62,4 @@
             </plugin>
         </plugins>
     </build>
-
 </project>
diff --git a/extensions-support/language/runtime/src/main/resources/META-INF/quarkus-extension.yaml b/extensions-support/language/runtime/src/main/resources/META-INF/quarkus-extension.yaml
new file mode 100644
index 0000000000..d26424ad1f
--- /dev/null
+++ b/extensions-support/language/runtime/src/main/resources/META-INF/quarkus-extension.yaml
@@ -0,0 +1,27 @@
+#
+# 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 Support Language"
+description: "Camel Quarkus Support Language"
+metadata:
+  unlisted: true
+  keywords:
+  - "camel"
+  guide: "https://quarkus.io/guides/camel"
+  categories:
+  - "integration"
diff --git a/extensions-support/pom.xml b/extensions-support/pom.xml
index a5a9eab37f..1afd3ab54a 100644
--- a/extensions-support/pom.xml
+++ b/extensions-support/pom.xml
@@ -50,6 +50,7 @@
         <module>jackson-dataformat-xml</module>
         <module>jdbc</module>
         <module>jetty</module>
+        <module>language</module>
         <module>mail</module>
         <module>mongodb</module>
         <module>reactor-netty</module>
diff --git a/extensions/csimple/deployment/pom.xml b/extensions/csimple/deployment/pom.xml
index e783701376..a82e26fb56 100644
--- a/extensions/csimple/deployment/pom.xml
+++ b/extensions/csimple/deployment/pom.xml
@@ -34,6 +34,10 @@
             <groupId>org.apache.camel.quarkus</groupId>
             <artifactId>camel-quarkus-core-deployment</artifactId>
         </dependency>
+        <dependency>
+            <groupId>org.apache.camel.quarkus</groupId>
+            <artifactId>camel-quarkus-support-language-deployment</artifactId>
+        </dependency>
         <dependency>
             <groupId>org.apache.camel.quarkus</groupId>
             <artifactId>camel-quarkus-csimple</artifactId>
diff --git a/extensions/csimple/deployment/src/main/java/org/apache/camel/quarkus/component/csimple/deployment/CSimpleProcessor.java b/extensions/csimple/deployment/src/main/java/org/apache/camel/quarkus/component/csimple/deployment/CSimpleProcessor.java
index 500d73b995..16e1946651 100644
--- a/extensions/csimple/deployment/src/main/java/org/apache/camel/quarkus/component/csimple/deployment/CSimpleProcessor.java
+++ b/extensions/csimple/deployment/src/main/java/org/apache/camel/quarkus/component/csimple/deployment/CSimpleProcessor.java
@@ -20,7 +20,6 @@ import java.io.BufferedReader;
 import java.io.File;
 import java.io.IOException;
 import java.io.InputStreamReader;
-import java.lang.reflect.InvocationTargetException;
 import java.net.URL;
 import java.nio.charset.StandardCharsets;
 import java.nio.file.Files;
@@ -34,17 +33,12 @@ import java.util.LinkedHashMap;
 import java.util.LinkedHashSet;
 import java.util.List;
 import java.util.Map;
+import java.util.Objects;
 import java.util.Set;
 import java.util.TreeSet;
-import java.util.function.BiConsumer;
 import java.util.stream.Collectors;
 import java.util.stream.Stream;
 
-import javax.xml.bind.JAXBContext;
-import javax.xml.bind.JAXBException;
-import javax.xml.bind.Marshaller;
-import javax.xml.bind.Marshaller.Listener;
-
 import io.quarkus.bootstrap.classloading.ClassPathElement;
 import io.quarkus.bootstrap.classloading.QuarkusClassLoader;
 import io.quarkus.deployment.annotations.BuildProducer;
@@ -58,35 +52,30 @@ import io.quarkus.deployment.dev.CompilationProvider;
 import io.quarkus.deployment.dev.CompilationProvider.Context;
 import io.quarkus.deployment.dev.JavaCompilationProvider;
 import io.quarkus.deployment.pkg.builditem.BuildSystemTargetBuildItem;
+import io.quarkus.deployment.pkg.builditem.CurateOutcomeBuildItem;
 import io.quarkus.deployment.recording.RecorderContext;
 import io.quarkus.runtime.RuntimeValue;
-import org.apache.camel.CamelContext;
 import org.apache.camel.Exchange;
-import org.apache.camel.NamedNode;
-import org.apache.camel.builder.RouteBuilder;
-import org.apache.camel.impl.DefaultCamelContext;
 import org.apache.camel.language.csimple.CSimpleCodeGenerator;
 import org.apache.camel.language.csimple.CSimpleGeneratedCode;
 import org.apache.camel.language.csimple.CSimpleHelper;
 import org.apache.camel.language.csimple.CSimpleLanguage;
 import org.apache.camel.language.csimple.CSimpleLanguage.Builder;
-import org.apache.camel.model.Constants;
-import org.apache.camel.model.ExpressionNode;
 import org.apache.camel.quarkus.component.csimple.CSimpleLanguageRecorder;
-import org.apache.camel.quarkus.core.CamelConfig;
-import org.apache.camel.quarkus.core.CamelConfig.FailureRemedy;
-import org.apache.camel.quarkus.core.deployment.LanguageExpressionContentHandler;
 import org.apache.camel.quarkus.core.deployment.spi.CamelBeanBuildItem;
 import org.apache.camel.quarkus.core.deployment.spi.CamelContextBuildItem;
-import org.apache.camel.quarkus.core.deployment.spi.CamelRoutesBuilderClassBuildItem;
 import org.apache.camel.quarkus.core.deployment.spi.CompiledCSimpleExpressionBuildItem;
 import org.apache.camel.quarkus.core.util.FileUtils;
+import org.apache.camel.quarkus.support.language.deployment.ExpressionBuildItem;
+import org.apache.camel.quarkus.support.language.deployment.ExpressionExtractionResultBuildItem;
 import org.apache.camel.util.PropertiesHelper;
 import org.jboss.logging.Logger;
 
 class CSimpleProcessor {
 
     private static final Logger LOG = Logger.getLogger(CSimpleProcessor.class);
+    private static final String CLASS_NAME = "CompiledExpression";
+    private static final String PACKAGE_NAME = "org.apache.camel.quarkus.component.csimple.generated";
     static final String CLASS_EXT = ".class";
     private static final String FEATURE = "camel-csimple";
 
@@ -97,70 +86,19 @@ class CSimpleProcessor {
 
     @BuildStep
     void collectCSimpleExpressions(
-            CamelConfig config,
-            List<CamelRoutesBuilderClassBuildItem> routesBuilderClasses,
-            BuildProducer<CSimpleExpressionSourceBuildItem> csimpleExpressions)
-            throws ClassNotFoundException {
-
-        if (!routesBuilderClasses.isEmpty()) {
-            final ClassLoader loader = Thread.currentThread().getContextClassLoader();
-            if (!(loader instanceof QuarkusClassLoader)) {
-                throw new IllegalStateException(
-                        QuarkusClassLoader.class.getSimpleName() + " expected as the context class loader");
-            }
-
-            final ExpressionCollector collector = new ExpressionCollector(loader);
-
-            final CamelContext ctx = new DefaultCamelContext();
-            for (CamelRoutesBuilderClassBuildItem routesBuilderClass : routesBuilderClasses) {
-                final String className = routesBuilderClass.getDotName().toString();
-                final Class<?> cl = loader.loadClass(className);
-
-                if (!RouteBuilder.class.isAssignableFrom(cl)) {
-                    LOG.warnf("CSimple language expressions occurring in %s won't be compiled at build time", cl);
-                } else {
-                    try {
-                        final RouteBuilder rb = (RouteBuilder) cl.getDeclaredConstructor().newInstance();
-                        rb.setCamelContext(ctx);
-                        try {
-                            rb.configure();
-                            collector.collect(
-                                    "csimple",
-                                    (script, isPredicate) -> csimpleExpressions.produce(
-                                            new CSimpleExpressionSourceBuildItem(
-                                                    script,
-                                                    isPredicate,
-                                                    className)),
-                                    rb.getRouteCollection(),
-                                    rb.getRestCollection());
-
-                        } catch (Exception e) {
-                            switch (config.csimple.onBuildTimeAnalysisFailure) {
-                            case fail:
-                                throw new RuntimeException(
-                                        "Could not extract CSimple expressions from " + className
-                                                + ". You may want to set quarkus.camel.csimple.on-build-time-analysis-failure to warn or ignore if you do not use CSimple language in your routes",
-                                        e);
-                            case warn:
-                                LOG.warnf(e,
-                                        "Could not extract CSimple language expressions from the route definition %s in class %s.",
-                                        rb, cl);
-                                break;
-                            case ignore:
-                                LOG.debugf(e,
-                                        "Could not extract CSimple language expressions from the route definition %s in class %s",
-                                        rb, cl);
-                                break;
-                            default:
-                                throw new IllegalStateException("Unexpected " + FailureRemedy.class.getSimpleName() + ": "
-                                        + config.csimple.onBuildTimeAnalysisFailure);
-                            }
-                        }
-
-                    } catch (InstantiationException | IllegalAccessException | NoSuchMethodException
-                            | InvocationTargetException e) {
-                        throw new RuntimeException("Could not instantiate " + className, e);
-                    }
+            ExpressionExtractionResultBuildItem result,
+            List<ExpressionBuildItem> expressions,
+            BuildProducer<CSimpleExpressionSourceBuildItem> csimpleExpressions) {
+
+        if (result.isSuccess()) {
+            int counter = 0;
+            for (ExpressionBuildItem expression : expressions) {
+                if ("csimple".equals(expression.getLanguage())) {
+                    csimpleExpressions.produce(
+                            new CSimpleExpressionSourceBuildItem(
+                                    expression.getExpression(),
+                                    expression.isPredicate(),
+                                    String.format("%s.%s_%d", PACKAGE_NAME, CLASS_NAME, ++counter)));
                 }
             }
         }
@@ -257,15 +195,24 @@ class CSimpleProcessor {
     CamelBeanBuildItem configureCSimpleLanguage(
             RecorderContext recorderContext,
             CSimpleLanguageRecorder recorder,
+            ExpressionExtractionResultBuildItem result,
+            CurateOutcomeBuildItem curateOutcomeBuildItem,
             List<CompiledCSimpleExpressionBuildItem> compiledCSimpleExpressions) {
 
-        final RuntimeValue<Builder> builder = recorder.csimpleLanguageBuilder();
-        for (CompiledCSimpleExpressionBuildItem expr : compiledCSimpleExpressions) {
-            recorder.addExpression(builder, recorderContext.newInstance(expr.getClassName()));
-        }
+        if (result.isSuccess()) {
+            final RuntimeValue<Builder> builder = recorder.csimpleLanguageBuilder();
+            for (CompiledCSimpleExpressionBuildItem expr : compiledCSimpleExpressions) {
+                recorder.addExpression(builder, recorderContext.newInstance(expr.getClassName()));
+            }
 
-        final RuntimeValue<?> csimpleLanguage = recorder.buildCSimpleLanguage(builder);
-        return new CamelBeanBuildItem("csimple", CSimpleLanguage.class.getName(), csimpleLanguage);
+            final RuntimeValue<?> csimpleLanguage = recorder.buildCSimpleLanguage(builder);
+            return new CamelBeanBuildItem("csimple", CSimpleLanguage.class.getName(), csimpleLanguage);
+        } else if (curateOutcomeBuildItem.getApplicationModel().getDependencies().stream().noneMatch(
+                x -> x.getGroupId().equals("org.apache.camel") && x.getArtifactId().equals("camel-csimple-joor"))) {
+            LOG.warn(
+                    "The expression extraction process has been disabled or failed, please add camel-csimple-joor to your classpath to compile the expressions at runtime");
+        }
+        return null;
     }
 
     static void readConfig(Set<String> imports, Map<String, String> aliases, ClassLoader cl) throws IOException {
@@ -303,8 +250,8 @@ class CSimpleProcessor {
         Set<File> classPathElements = Stream.of(CSimpleHelper.class, Exchange.class, PropertiesHelper.class)
                 .map(clazz -> clazz.getName().replace('.', '/') + CLASS_EXT)
                 .flatMap(className -> (Stream<ClassPathElement>) quarkusClassLoader.getElementsWithResource(className).stream())
-                .map(cpe -> cpe.getRoot())
-                .filter(p -> p != null)
+                .map(ClassPathElement::getRoot)
+                .filter(Objects::nonNull)
                 .map(Path::toFile)
                 .collect(Collectors.toSet());
 
@@ -324,46 +271,4 @@ class CSimpleProcessor {
                 Collections.emptyList());
     }
 
-    /**
-     * Collects expressions of a given language.
-     */
-    static class ExpressionCollector {
-        private final JAXBContext jaxbContext;
-        private final Marshaller marshaller;
-
-        ExpressionCollector(ClassLoader loader) {
-            try {
-                jaxbContext = JAXBContext.newInstance(Constants.JAXB_CONTEXT_PACKAGES, loader);
-                Marshaller m = jaxbContext.createMarshaller();
-                m.setListener(new RouteDefinitionNormalizer());
-                marshaller = m;
-            } catch (JAXBException e) {
-                throw new RuntimeException("Could not creat a JAXB marshaler", e);
-            }
-        }
-
-        public void collect(String languageName, BiConsumer<String, Boolean> expressionConsumer, NamedNode... nodes) {
-            final LanguageExpressionContentHandler handler = new LanguageExpressionContentHandler(languageName,
-                    expressionConsumer);
-            for (NamedNode node : nodes) {
-                try {
-                    marshaller.marshal(node, handler);
-                } catch (JAXBException e) {
-                    throw new RuntimeException("Could not collect '" + languageName + "' expressions from node " + node, e);
-                }
-            }
-        }
-
-        /**
-         * Inlines all fancy expression builders so that JAXB can serialize the model properly.
-         */
-        private static class RouteDefinitionNormalizer extends Listener {
-            public void beforeMarshal(Object source) {
-                if (source instanceof ExpressionNode) {
-                    ((ExpressionNode) source).preCreateProcessor();
-                }
-            }
-        }
-    }
-
 }
diff --git a/extensions/csimple/deployment/src/main/java/org/apache/camel/quarkus/component/csimple/deployment/CSimpleXmlProcessor.java b/extensions/csimple/deployment/src/main/java/org/apache/camel/quarkus/component/csimple/deployment/CSimpleXmlProcessor.java
deleted file mode 100644
index 17010f45fe..0000000000
--- a/extensions/csimple/deployment/src/main/java/org/apache/camel/quarkus/component/csimple/deployment/CSimpleXmlProcessor.java
+++ /dev/null
@@ -1,59 +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.csimple.deployment;
-
-import java.io.FileNotFoundException;
-import java.io.InputStream;
-
-import javax.xml.parsers.SAXParser;
-import javax.xml.parsers.SAXParserFactory;
-
-import io.quarkus.deployment.annotations.BuildProducer;
-import io.quarkus.deployment.annotations.BuildStep;
-import org.apache.camel.quarkus.core.deployment.LanguageExpressionContentHandler;
-import org.apache.camel.quarkus.core.deployment.main.CamelMainHelper;
-import org.jboss.logging.Logger;
-
-public class CSimpleXmlProcessor {
-    private static final Logger LOG = Logger.getLogger(CSimpleXmlProcessor.class);
-
-    @BuildStep
-    void collectCSimpleExpresions(BuildProducer<CSimpleExpressionSourceBuildItem> csimpleExpressions) throws Exception {
-        final SAXParserFactory saxParserFactory = SAXParserFactory.newInstance();
-        saxParserFactory.setNamespaceAware(true);
-        final SAXParser saxParser = saxParserFactory.newSAXParser();
-
-        CamelMainHelper.forEachMatchingResource(
-                resource -> {
-                    try (InputStream is = resource.getInputStream()) {
-                        saxParser.parse(
-                                is,
-                                new LanguageExpressionContentHandler(
-                                        "csimple",
-                                        (script, isPredicate) -> csimpleExpressions.produce(
-                                                new CSimpleExpressionSourceBuildItem(
-                                                        script,
-                                                        isPredicate,
-                                                        "org.apache.camel.language.csimple.XmlRouteBuilder"))));
-                    } catch (FileNotFoundException e) {
-                        LOG.debugf("No XML routes found in %s. Skipping XML routes detection.", resource.getLocation());
-                    } catch (Exception e) {
-                        throw new RuntimeException("Could not analyze CSimple expressions in " + resource.getLocation(), e);
-                    }
-                });
-    }
-}
diff --git a/extensions/csimple/runtime/pom.xml b/extensions/csimple/runtime/pom.xml
index 220d8f4307..d88f708af2 100644
--- a/extensions/csimple/runtime/pom.xml
+++ b/extensions/csimple/runtime/pom.xml
@@ -41,6 +41,10 @@
             <groupId>org.apache.camel.quarkus</groupId>
             <artifactId>camel-quarkus-core</artifactId>
         </dependency>
+        <dependency>
+            <groupId>org.apache.camel.quarkus</groupId>
+            <artifactId>camel-quarkus-support-language</artifactId>
+        </dependency>
     </dependencies>
 
     <build>
diff --git a/extensions/csimple/runtime/src/main/doc/limitations.adoc b/extensions/csimple/runtime/src/main/doc/limitations.adoc
index 115ae917e9..60c399f6d3 100644
--- a/extensions/csimple/runtime/src/main/doc/limitations.adoc
+++ b/extensions/csimple/runtime/src/main/doc/limitations.adoc
@@ -1,19 +1,32 @@
-CSimple language is supported only in
+CSimple language is supported in all existing DSLs, but be aware that to extract the expressions from the existing route definitions, a dry run is done during the startup in JVM mode or during the build in Native mode which adds some log entries of the following type that you can simply ignore.
 
-* XML DSL
-* Java DSL when implemented in a class extending `org.apache.camel.builder.RouteBuilder`
+[source,text]
+----
+2023-01-19 16:36:31,779 INFO  [org.apa.cam.mai.MainSupport] (build-10) Expression Extractor 3.20.1 is starting
+2023-01-19 16:36:32,214 INFO  [org.apa.cam.imp.eng.AbstractCamelContext] (build-10) Apache Camel 3.20.1 (Expression Extractor) is starting
+2023-01-19 16:36:32,216 INFO  [org.apa.cam.imp.eng.AbstractCamelContext] (build-10) Routes startup (started:0)
+2023-01-19 16:36:32,217 INFO  [org.apa.cam.imp.eng.AbstractCamelContext] (build-10) Apache Camel 3.20.1 (Expression Extractor) started in 128ms (build:22ms init:104ms start:2ms)
+2023-01-19 16:36:32,218 INFO  [org.apa.cam.mai.MainSupport] (build-10) Waiting until complete: Duration max 1 seconds
+2023-01-19 16:36:33,223 INFO  [org.apa.cam.mai.MainSupport] (build-10) Duration max seconds triggering shutdown of the JVM
+2023-01-19 16:36:33,223 INFO  [org.apa.cam.mai.MainSupport] (build-10) Expression Extractor 3.20.1 shutdown
+----
 
-The compilation of CSimple scripts happens at build time. To be able to discover the scripts in the route definitions,
+The compilation of CSimple scripts happens at build time by default. To be able to discover the scripts in the route definitions,
 those definitions need to get assembled at build time. When extending
 `org.apache.camel.builder.RouteBuilder`, this basically means instantiating your `RouteBuilder`, setting
 a fake `CamelContext` instance on it and calling its `configure()` method. It may fail if your `configure()`
 method attempts to access some resource that is only available at runtime.
 
-You can use the `quarkus.camel.csimple.on-build-time-analysis-failure` configuration parameter to decide
+You can use the `quarkus.camel.expression.on-build-time-analysis-failure` configuration parameter to decide
 what should happen in such cases. Possible values are `warn` (default), `fail` or `ignore`.
 
+You can also simply disable the expression extraction process by setting the configuration parameter `quarkus.camel.expression.extraction-enabled` to `false`.
+
+If the expression extraction process is disabled or fails, the expressions are then compiled at runtime which also means that it
+can only work in JVM mode moreover the artifact `org.apache.camel:camel-csimple-joor` has to be added to the classpath.
+
 [WARNING]
 ====
-CSimple language will not work on Camel Quarkus if used in a `org.apache.camel.builder.LambdaRouteBuilder`
+CSimple language will not work on Camel Quarkus if used in a `org.apache.camel.builder.LambdaRouteBuilder` or if a `RouteBuilder` depends on dependency injection.
 ====
 
diff --git a/integration-tests/csimple/pom.xml b/integration-tests/csimple/pom.xml
index 0327787ee8..e519b1676b 100644
--- a/integration-tests/csimple/pom.xml
+++ b/integration-tests/csimple/pom.xml
@@ -47,6 +47,10 @@
             <groupId>org.apache.camel.quarkus</groupId>
             <artifactId>camel-quarkus-xml-io-dsl</artifactId>
         </dependency>
+        <dependency>
+            <groupId>org.apache.camel.quarkus</groupId>
+            <artifactId>camel-quarkus-yaml-dsl</artifactId>
+        </dependency>
 
         <!-- test dependencies -->
         <dependency>
@@ -137,6 +141,19 @@
                         </exclusion>
                     </exclusions>
                 </dependency>
+                <dependency>
+                    <groupId>org.apache.camel.quarkus</groupId>
+                    <artifactId>camel-quarkus-yaml-dsl-deployment</artifactId>
+                    <version>${project.version}</version>
+                    <type>pom</type>
+                    <scope>test</scope>
+                    <exclusions>
+                        <exclusion>
+                            <groupId>*</groupId>
+                            <artifactId>*</artifactId>
+                        </exclusion>
+                    </exclusions>
+                </dependency>
             </dependencies>
         </profile>
     </profiles>
diff --git a/integration-tests/csimple/src/main/java/org/apache/camel/quarkus/component/csimple/it/CSimpleResource.java b/integration-tests/csimple/src/main/java/org/apache/camel/quarkus/component/csimple/it/CSimpleResource.java
index 7cae63469e..f836df6792 100644
--- a/integration-tests/csimple/src/main/java/org/apache/camel/quarkus/component/csimple/it/CSimpleResource.java
+++ b/integration-tests/csimple/src/main/java/org/apache/camel/quarkus/component/csimple/it/CSimpleResource.java
@@ -48,4 +48,12 @@ public class CSimpleResource {
     public String csimpleXmlDsl(String body) {
         return producerTemplate.requestBody("direct:csimple-xml-dsl", body, String.class);
     }
+
+    @Path("/csimple-yaml-dsl")
+    @POST
+    @Consumes(MediaType.TEXT_PLAIN)
+    @Produces(MediaType.TEXT_PLAIN)
+    public String csimpleYamlDsl(String body) {
+        return producerTemplate.requestBody("direct:csimple-yaml-dsl", body, String.class);
+    }
 }
diff --git a/integration-tests/csimple/src/main/resources/application.properties b/integration-tests/csimple/src/main/resources/application.properties
index 5a35e452dd..940bc7645b 100644
--- a/integration-tests/csimple/src/main/resources/application.properties
+++ b/integration-tests/csimple/src/main/resources/application.properties
@@ -15,4 +15,4 @@
 ## limitations under the License.
 ## ---------------------------------------------------------------------------
 
-camel.main.routes-include-pattern = classpath:routes/my-routes.xml
+camel.main.routes-include-pattern = classpath:routes/my-routes.xml,classpath:routes/my-routes.yaml
diff --git a/integration-tests/csimple/src/main/resources/routes/my-routes.yaml b/integration-tests/csimple/src/main/resources/routes/my-routes.yaml
new file mode 100644
index 0000000000..4b2a770861
--- /dev/null
+++ b/integration-tests/csimple/src/main/resources/routes/my-routes.yaml
@@ -0,0 +1,23 @@
+#
+# Licensed to the Apache Software Foundation (ASF) under one or more
+# contributor license agreements.  See the NOTICE file distributed with
+# this work for additional information regarding copyright ownership.
+# The ASF licenses this file to You under the Apache License, Version 2.0
+# (the "License"); you may not use this file except in compliance with
+# the License.  You may obtain a copy of the License at
+#
+#      http://www.apache.org/licenses/LICENSE-2.0
+#
+# Unless required by applicable law or agreed to in writing, software
+# distributed under the License is distributed on an "AS IS" BASIS,
+# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+# See the License for the specific language governing permissions and
+# limitations under the License.
+#
+
+---
+- from:
+    uri: "direct:csimple-yaml-dsl"
+    steps:
+      - set-body:
+          csimple: "Bonjour ${body}"
diff --git a/integration-tests/csimple/src/test/java/org/apache/camel/quarkus/component/csimple/it/CSimpleTest.java b/integration-tests/csimple/src/test/java/org/apache/camel/quarkus/component/csimple/it/CSimpleTest.java
index 4e3d3bb18d..1a4fd2e94d 100644
--- a/integration-tests/csimple/src/test/java/org/apache/camel/quarkus/component/csimple/it/CSimpleTest.java
+++ b/integration-tests/csimple/src/test/java/org/apache/camel/quarkus/component/csimple/it/CSimpleTest.java
@@ -27,7 +27,7 @@ import static org.hamcrest.Matchers.is;
 class CSimpleTest {
 
     @Test
-    public void csimpleHello() {
+    void csimpleHello() {
         RestAssured.given()
                 .body("Joe")
                 .contentType(ContentType.TEXT)
@@ -37,7 +37,7 @@ class CSimpleTest {
     }
 
     @Test
-    public void csimpleXml() {
+    void csimpleXml() {
         RestAssured.given()
                 .body("Joe")
                 .contentType(ContentType.TEXT)
@@ -46,4 +46,14 @@ class CSimpleTest {
                 .body(is("Hi Joe"));
     }
 
+    @Test
+    void csimpleYaml() {
+        RestAssured.given()
+                .body("John")
+                .contentType(ContentType.TEXT)
+                .post("/csimple/csimple-yaml-dsl")
+                .then()
+                .body(is("Bonjour John"));
+    }
+
 }
diff --git a/poms/bom/pom.xml b/poms/bom/pom.xml
index a1520a7d15..83b6965510 100644
--- a/poms/bom/pom.xml
+++ b/poms/bom/pom.xml
@@ -9049,6 +9049,16 @@
                 <artifactId>camel-quarkus-support-jetty-deployment</artifactId>
                 <version>${camel-quarkus.version}</version>
             </dependency>
+            <dependency>
+                <groupId>org.apache.camel.quarkus</groupId>
+                <artifactId>camel-quarkus-support-language</artifactId>
+                <version>${camel-quarkus.version}</version>
+            </dependency>
+            <dependency>
+                <groupId>org.apache.camel.quarkus</groupId>
+                <artifactId>camel-quarkus-support-language-deployment</artifactId>
+                <version>${camel-quarkus.version}</version>
+            </dependency>
             <dependency>
                 <groupId>org.apache.camel.quarkus</groupId>
                 <artifactId>camel-quarkus-support-mail</artifactId>
diff --git a/poms/bom/src/main/generated/flattened-full-pom.xml b/poms/bom/src/main/generated/flattened-full-pom.xml
index af397fa20a..2c2e496999 100644
--- a/poms/bom/src/main/generated/flattened-full-pom.xml
+++ b/poms/bom/src/main/generated/flattened-full-pom.xml
@@ -8986,6 +8986,16 @@
         <artifactId>camel-quarkus-support-jetty-deployment</artifactId><!-- org.apache.camel.quarkus:camel-quarkus-bom:${project.version} -->
         <version>2.17.0-SNAPSHOT</version><!-- org.apache.camel.quarkus:camel-quarkus-bom:${project.version} -->
       </dependency>
+      <dependency>
+        <groupId>org.apache.camel.quarkus</groupId><!-- org.apache.camel.quarkus:camel-quarkus-bom:${project.version} -->
+        <artifactId>camel-quarkus-support-language</artifactId><!-- org.apache.camel.quarkus:camel-quarkus-bom:${project.version} -->
+        <version>2.17.0-SNAPSHOT</version><!-- org.apache.camel.quarkus:camel-quarkus-bom:${project.version} -->
+      </dependency>
+      <dependency>
+        <groupId>org.apache.camel.quarkus</groupId><!-- org.apache.camel.quarkus:camel-quarkus-bom:${project.version} -->
+        <artifactId>camel-quarkus-support-language-deployment</artifactId><!-- org.apache.camel.quarkus:camel-quarkus-bom:${project.version} -->
+        <version>2.17.0-SNAPSHOT</version><!-- org.apache.camel.quarkus:camel-quarkus-bom:${project.version} -->
+      </dependency>
       <dependency>
         <groupId>org.apache.camel.quarkus</groupId><!-- org.apache.camel.quarkus:camel-quarkus-bom:${project.version} -->
         <artifactId>camel-quarkus-support-mail</artifactId><!-- org.apache.camel.quarkus:camel-quarkus-bom:${project.version} -->
diff --git a/poms/bom/src/main/generated/flattened-reduced-pom.xml b/poms/bom/src/main/generated/flattened-reduced-pom.xml
index 76fe5e5a12..cbeb4d8fae 100644
--- a/poms/bom/src/main/generated/flattened-reduced-pom.xml
+++ b/poms/bom/src/main/generated/flattened-reduced-pom.xml
@@ -8986,6 +8986,16 @@
         <artifactId>camel-quarkus-support-jetty-deployment</artifactId>
         <version>2.17.0-SNAPSHOT</version>
       </dependency>
+      <dependency>
+        <groupId>org.apache.camel.quarkus</groupId>
+        <artifactId>camel-quarkus-support-language</artifactId>
+        <version>2.17.0-SNAPSHOT</version>
+      </dependency>
+      <dependency>
+        <groupId>org.apache.camel.quarkus</groupId>
+        <artifactId>camel-quarkus-support-language-deployment</artifactId>
+        <version>2.17.0-SNAPSHOT</version>
+      </dependency>
       <dependency>
         <groupId>org.apache.camel.quarkus</groupId>
         <artifactId>camel-quarkus-support-mail</artifactId>
diff --git a/poms/bom/src/main/generated/flattened-reduced-verbose-pom.xml b/poms/bom/src/main/generated/flattened-reduced-verbose-pom.xml
index a42921d675..e08c2683cd 100644
--- a/poms/bom/src/main/generated/flattened-reduced-verbose-pom.xml
+++ b/poms/bom/src/main/generated/flattened-reduced-verbose-pom.xml
@@ -8986,6 +8986,16 @@
         <artifactId>camel-quarkus-support-jetty-deployment</artifactId><!-- org.apache.camel.quarkus:camel-quarkus-bom:${project.version} -->
         <version>2.17.0-SNAPSHOT</version><!-- org.apache.camel.quarkus:camel-quarkus-bom:${project.version} -->
       </dependency>
+      <dependency>
+        <groupId>org.apache.camel.quarkus</groupId><!-- org.apache.camel.quarkus:camel-quarkus-bom:${project.version} -->
+        <artifactId>camel-quarkus-support-language</artifactId><!-- org.apache.camel.quarkus:camel-quarkus-bom:${project.version} -->
+        <version>2.17.0-SNAPSHOT</version><!-- org.apache.camel.quarkus:camel-quarkus-bom:${project.version} -->
+      </dependency>
+      <dependency>
+        <groupId>org.apache.camel.quarkus</groupId><!-- org.apache.camel.quarkus:camel-quarkus-bom:${project.version} -->
+        <artifactId>camel-quarkus-support-language-deployment</artifactId><!-- org.apache.camel.quarkus:camel-quarkus-bom:${project.version} -->
+        <version>2.17.0-SNAPSHOT</version><!-- org.apache.camel.quarkus:camel-quarkus-bom:${project.version} -->
+      </dependency>
       <dependency>
         <groupId>org.apache.camel.quarkus</groupId><!-- org.apache.camel.quarkus:camel-quarkus-bom:${project.version} -->
         <artifactId>camel-quarkus-support-mail</artifactId><!-- org.apache.camel.quarkus:camel-quarkus-bom:${project.version} -->


[camel-quarkus] 02/02: Regenerate the virtual dependencies

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

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

commit 21bcae6387bc947d345411df58063c86d994a801
Author: Nicolas Filotto <nf...@talend.com>
AuthorDate: Fri Jan 20 15:17:24 2023 +0100

    Regenerate the virtual dependencies
---
 integration-tests-jvm/pom.xml | 2 +-
 1 file changed, 1 insertion(+), 1 deletion(-)

diff --git a/integration-tests-jvm/pom.xml b/integration-tests-jvm/pom.xml
index a35aaca940..600ed65140 100644
--- a/integration-tests-jvm/pom.xml
+++ b/integration-tests-jvm/pom.xml
@@ -50,8 +50,8 @@
         <module>cmis</module>
         <module>coap</module>
         <module>cometd</module>
-        <module>controlbus-statistics</module>
         <module>console</module>
+        <module>controlbus-statistics</module>
         <module>corda</module>
         <module>couchbase</module>
         <module>debug</module>