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

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


The following commit(s) were added to refs/heads/main by this push:
     new 0fef2810b61e CAMEL-23006: camel-jbang - Transform route with Kamelet 
EIP should stub
0fef2810b61e is described below

commit 0fef2810b61e68a1e275f7f9251d5a46598f65cb
Author: Claus Ibsen <[email protected]>
AuthorDate: Sun Feb 15 10:44:09 2026 +0100

    CAMEL-23006: camel-jbang - Transform route with Kamelet EIP should stub
---
 .../org/apache/camel/catalog/beans.properties      |  1 +
 .../beans/SpringCacheIdempotentRepository.json     | 16 ++++
 .../SpringCacheIdempotentRepositoryConfigurer.java | 54 +++++++++++++
 .../services/org/apache/camel/bean.properties      |  7 ++
 .../bean/SpringCacheIdempotentRepository.json      | 16 ++++
 ...ssor.idempotent.SpringCacheIdempotentRepository |  2 +
 .../SpringCacheIdempotentRepository.java           | 36 ++++++++-
 .../modules/eips/pages/guaranteed-delivery.adoc    | 12 +++
 .../modules/eips/pages/idempotentConsumer-eip.adoc |  1 +
 .../main/docs/modules/eips/pages/intercept.adoc    | 73 +++++------------
 .../main/docs/modules/eips/pages/kamelet-eip.adoc  | 91 +++++++++++++++++++++-
 .../java/org/apache/camel/main/KameletMain.java    | 10 +--
 .../DependencyDownloaderComponentResolver.java     |  2 +-
 .../main/download/DependencyDownloaderKamelet.java | 10 +--
 .../apache/camel/main/download/SagaDownloader.java |  1 -
 .../apache/camel/main/stub/KameletStubReifier.java | 78 +++++++++++++++++++
 16 files changed, 337 insertions(+), 73 deletions(-)

diff --git 
a/catalog/camel-catalog/src/generated/resources/org/apache/camel/catalog/beans.properties
 
b/catalog/camel-catalog/src/generated/resources/org/apache/camel/catalog/beans.properties
index 263d47e98ba5..83ad5f38ee54 100644
--- 
a/catalog/camel-catalog/src/generated/resources/org/apache/camel/catalog/beans.properties
+++ 
b/catalog/camel-catalog/src/generated/resources/org/apache/camel/catalog/beans.properties
@@ -38,6 +38,7 @@ MemoryIdempotentRepository
 MongoDbIdempotentRepository
 OpensearchBulkRequestAggregationStrategy
 SimpleScheduledRoutePolicy
+SpringCacheIdempotentRepository
 SpringRedisIdempotentRepository
 StringAggregationStrategy
 TarAggregationStrategy
diff --git 
a/catalog/camel-catalog/src/generated/resources/org/apache/camel/catalog/beans/SpringCacheIdempotentRepository.json
 
b/catalog/camel-catalog/src/generated/resources/org/apache/camel/catalog/beans/SpringCacheIdempotentRepository.json
new file mode 100644
index 000000000000..de1a4895cbd8
--- /dev/null
+++ 
b/catalog/camel-catalog/src/generated/resources/org/apache/camel/catalog/beans/SpringCacheIdempotentRepository.json
@@ -0,0 +1,16 @@
+{
+  "bean": {
+    "kind": "bean",
+    "name": "SpringCacheIdempotentRepository",
+    "javaType": 
"org.apache.camel.spring.processor.idempotent.SpringCacheIdempotentRepository",
+    "interfaceType": "org.apache.camel.spi.IdempotentRepository",
+    "title": "Spring Cache Idempotent Repository",
+    "description": "SpringCache based message id repository.",
+    "deprecated": false,
+    "groupId": "org.apache.camel",
+    "artifactId": "camel-spring",
+    "version": "4.18.0-SNAPSHOT",
+    "properties": { "manager": { "index": 0, "kind": "property", 
"displayName": "Manager", "required": true, "type": "object", "javaType": 
"org.springframework.cache.CacheManager", "deprecated": false, "autowired": 
false, "secret": false, "description": "The Spring Cache Manager" }, 
"cacheName": { "index": 1, "kind": "property", "displayName": "Cache Name", 
"required": true, "type": "string", "javaType": "java.lang.String", 
"deprecated": false, "autowired": false, "secret": false, "descr [...]
+  }
+}
+
diff --git 
a/components/camel-spring-parent/camel-spring/src/generated/java/org/apache/camel/spring/processor/idempotent/SpringCacheIdempotentRepositoryConfigurer.java
 
b/components/camel-spring-parent/camel-spring/src/generated/java/org/apache/camel/spring/processor/idempotent/SpringCacheIdempotentRepositoryConfigurer.java
new file mode 100644
index 000000000000..0b88c60265a6
--- /dev/null
+++ 
b/components/camel-spring-parent/camel-spring/src/generated/java/org/apache/camel/spring/processor/idempotent/SpringCacheIdempotentRepositoryConfigurer.java
@@ -0,0 +1,54 @@
+/* Generated by camel build tools - do NOT edit this file! */
+package org.apache.camel.spring.processor.idempotent;
+
+import javax.annotation.processing.Generated;
+import java.util.Map;
+
+import org.apache.camel.CamelContext;
+import org.apache.camel.spi.ExtendedPropertyConfigurerGetter;
+import org.apache.camel.spi.PropertyConfigurerGetter;
+import org.apache.camel.spi.ConfigurerStrategy;
+import org.apache.camel.spi.GeneratedPropertyConfigurer;
+import org.apache.camel.util.CaseInsensitiveMap;
+import 
org.apache.camel.spring.processor.idempotent.SpringCacheIdempotentRepository;
+
+/**
+ * Generated by camel build tools - do NOT edit this file!
+ */
+@Generated("org.apache.camel.maven.packaging.GenerateConfigurerMojo")
+@SuppressWarnings("unchecked")
+public class SpringCacheIdempotentRepositoryConfigurer extends 
org.apache.camel.support.component.PropertyConfigurerSupport implements 
GeneratedPropertyConfigurer, PropertyConfigurerGetter {
+
+    @Override
+    public boolean configure(CamelContext camelContext, Object obj, String 
name, Object value, boolean ignoreCase) {
+        
org.apache.camel.spring.processor.idempotent.SpringCacheIdempotentRepository 
target = 
(org.apache.camel.spring.processor.idempotent.SpringCacheIdempotentRepository) 
obj;
+        switch (ignoreCase ? name.toLowerCase() : name) {
+        case "cachename":
+        case "cacheName": target.setCacheName(property(camelContext, 
java.lang.String.class, value)); return true;
+        case "manager": target.setManager(property(camelContext, 
org.springframework.cache.CacheManager.class, value)); return true;
+        default: return false;
+        }
+    }
+
+    @Override
+    public Class<?> getOptionType(String name, boolean ignoreCase) {
+        switch (ignoreCase ? name.toLowerCase() : name) {
+        case "cachename":
+        case "cacheName": return java.lang.String.class;
+        case "manager": return org.springframework.cache.CacheManager.class;
+        default: return null;
+        }
+    }
+
+    @Override
+    public Object getOptionValue(Object obj, String name, boolean ignoreCase) {
+        
org.apache.camel.spring.processor.idempotent.SpringCacheIdempotentRepository 
target = 
(org.apache.camel.spring.processor.idempotent.SpringCacheIdempotentRepository) 
obj;
+        switch (ignoreCase ? name.toLowerCase() : name) {
+        case "cachename":
+        case "cacheName": return target.getCacheName();
+        case "manager": return target.getManager();
+        default: return null;
+        }
+    }
+}
+
diff --git 
a/components/camel-spring-parent/camel-spring/src/generated/resources/META-INF/services/org/apache/camel/bean.properties
 
b/components/camel-spring-parent/camel-spring/src/generated/resources/META-INF/services/org/apache/camel/bean.properties
new file mode 100644
index 000000000000..b55b592cefe6
--- /dev/null
+++ 
b/components/camel-spring-parent/camel-spring/src/generated/resources/META-INF/services/org/apache/camel/bean.properties
@@ -0,0 +1,7 @@
+# Generated by camel build tools - do NOT edit this file!
+bean=SpringCacheIdempotentRepository
+groupId=org.apache.camel
+artifactId=camel-spring
+version=4.18.0-SNAPSHOT
+projectName=Camel :: Spring
+projectDescription=Camel Spring
diff --git 
a/components/camel-spring-parent/camel-spring/src/generated/resources/META-INF/services/org/apache/camel/bean/SpringCacheIdempotentRepository.json
 
b/components/camel-spring-parent/camel-spring/src/generated/resources/META-INF/services/org/apache/camel/bean/SpringCacheIdempotentRepository.json
new file mode 100644
index 000000000000..de1a4895cbd8
--- /dev/null
+++ 
b/components/camel-spring-parent/camel-spring/src/generated/resources/META-INF/services/org/apache/camel/bean/SpringCacheIdempotentRepository.json
@@ -0,0 +1,16 @@
+{
+  "bean": {
+    "kind": "bean",
+    "name": "SpringCacheIdempotentRepository",
+    "javaType": 
"org.apache.camel.spring.processor.idempotent.SpringCacheIdempotentRepository",
+    "interfaceType": "org.apache.camel.spi.IdempotentRepository",
+    "title": "Spring Cache Idempotent Repository",
+    "description": "SpringCache based message id repository.",
+    "deprecated": false,
+    "groupId": "org.apache.camel",
+    "artifactId": "camel-spring",
+    "version": "4.18.0-SNAPSHOT",
+    "properties": { "manager": { "index": 0, "kind": "property", 
"displayName": "Manager", "required": true, "type": "object", "javaType": 
"org.springframework.cache.CacheManager", "deprecated": false, "autowired": 
false, "secret": false, "description": "The Spring Cache Manager" }, 
"cacheName": { "index": 1, "kind": "property", "displayName": "Cache Name", 
"required": true, "type": "string", "javaType": "java.lang.String", 
"deprecated": false, "autowired": false, "secret": false, "descr [...]
+  }
+}
+
diff --git 
a/components/camel-spring-parent/camel-spring/src/generated/resources/META-INF/services/org/apache/camel/configurer/org.apache.camel.spring.processor.idempotent.SpringCacheIdempotentRepository
 
b/components/camel-spring-parent/camel-spring/src/generated/resources/META-INF/services/org/apache/camel/configurer/org.apache.camel.spring.processor.idempotent.SpringCacheIdempotentRepository
new file mode 100644
index 000000000000..09a55590c3a3
--- /dev/null
+++ 
b/components/camel-spring-parent/camel-spring/src/generated/resources/META-INF/services/org/apache/camel/configurer/org.apache.camel.spring.processor.idempotent.SpringCacheIdempotentRepository
@@ -0,0 +1,2 @@
+# Generated by camel build tools - do NOT edit this file!
+class=org.apache.camel.spring.processor.idempotent.SpringCacheIdempotentRepositoryConfigurer
diff --git 
a/components/camel-spring-parent/camel-spring/src/main/java/org/apache/camel/spring/processor/idempotent/SpringCacheIdempotentRepository.java
 
b/components/camel-spring-parent/camel-spring/src/main/java/org/apache/camel/spring/processor/idempotent/SpringCacheIdempotentRepository.java
index 779ed786e3d6..a4868f4a1975 100644
--- 
a/components/camel-spring-parent/camel-spring/src/main/java/org/apache/camel/spring/processor/idempotent/SpringCacheIdempotentRepository.java
+++ 
b/components/camel-spring-parent/camel-spring/src/main/java/org/apache/camel/spring/processor/idempotent/SpringCacheIdempotentRepository.java
@@ -19,15 +19,24 @@ package org.apache.camel.spring.processor.idempotent;
 import org.apache.camel.api.management.ManagedAttribute;
 import org.apache.camel.api.management.ManagedOperation;
 import org.apache.camel.api.management.ManagedResource;
+import org.apache.camel.spi.Configurer;
 import org.apache.camel.spi.IdempotentRepository;
+import org.apache.camel.spi.Metadata;
 import org.apache.camel.support.service.ServiceSupport;
 import org.springframework.cache.Cache;
 import org.springframework.cache.CacheManager;
 
+@Metadata(label = "bean",
+        description = "SpringCache based message id repository.",
+        annotations = { 
"interfaceName=org.apache.camel.spi.IdempotentRepository" })
+@Configurer(metadataOnly = true)
 @ManagedResource(description = "SpringCache based message id repository")
 public class SpringCacheIdempotentRepository extends ServiceSupport implements 
IdempotentRepository {
-    private final CacheManager manager;
-    private final String cacheName;
+
+    @Metadata(required = true, description = "The Spring Cache Manager")
+    private CacheManager manager;
+    @Metadata(required = true, description = "The name of the cache to use")
+    private String cacheName;
     private Cache cache;
 
     public SpringCacheIdempotentRepository(CacheManager manager, String 
cacheName) {
@@ -36,6 +45,29 @@ public class SpringCacheIdempotentRepository extends 
ServiceSupport implements I
         this.cache = null;
     }
 
+    public SpringCacheIdempotentRepository() {
+    }
+
+    public CacheManager getManager() {
+        return manager;
+    }
+
+    public void setManager(CacheManager manager) {
+        this.manager = manager;
+    }
+
+    public void setCacheName(String cacheName) {
+        this.cacheName = cacheName;
+    }
+
+    public Cache getCache() {
+        return cache;
+    }
+
+    public void setCache(Cache cache) {
+        this.cache = cache;
+    }
+
     @Override
     @ManagedOperation(description = "Adds the key to the store")
     public boolean add(String key) {
diff --git 
a/core/camel-core-engine/src/main/docs/modules/eips/pages/guaranteed-delivery.adoc
 
b/core/camel-core-engine/src/main/docs/modules/eips/pages/guaranteed-delivery.adoc
index 1e64dd41fbd4..fbd0647d98b0 100644
--- 
a/core/camel-core-engine/src/main/docs/modules/eips/pages/guaranteed-delivery.adoc
+++ 
b/core/camel-core-engine/src/main/docs/modules/eips/pages/guaranteed-delivery.adoc
@@ -48,4 +48,16 @@ XML::
     <to uri="jms:queue:foo"/>
 </route>
 ----
+
+YAML::
++
+[source,yaml]
+----
+- route:
+    from:
+      uri: direct:start
+      steps:
+        - to:
+            uri: jms:queue:foo
+----
 ====
diff --git 
a/core/camel-core-engine/src/main/docs/modules/eips/pages/idempotentConsumer-eip.adoc
 
b/core/camel-core-engine/src/main/docs/modules/eips/pages/idempotentConsumer-eip.adoc
index 45c532990a83..74fe10fdfeba 100644
--- 
a/core/camel-core-engine/src/main/docs/modules/eips/pages/idempotentConsumer-eip.adoc
+++ 
b/core/camel-core-engine/src/main/docs/modules/eips/pages/idempotentConsumer-eip.adoc
@@ -37,6 +37,7 @@ your own `org.apache.camel.spi.IdempotentRepository`.
 
 Camel provides the following Idempotent Consumer implementations:
 
+* FileIdempotentRepository from `camel-support` JAR
 * MemoryIdempotentRepository from `camel-support` JAR
 * xref:ROOT:caffeine-cache-component.adoc[CaffeineIdempotentRepository]
 * xref:ROOT:cql-component.adoc[CassandraIdempotentRepository]
diff --git 
a/core/camel-core-engine/src/main/docs/modules/eips/pages/intercept.adoc 
b/core/camel-core-engine/src/main/docs/modules/eips/pages/intercept.adoc
index d7e9f7cbbeb0..e255c23d9787 100644
--- a/core/camel-core-engine/src/main/docs/modules/eips/pages/intercept.adoc
+++ b/core/camel-core-engine/src/main/docs/modules/eips/pages/intercept.adoc
@@ -40,7 +40,7 @@ URI pattern matching by exact uri, wildcard and regular 
expression. See further
 * The intercepted endpoint uri is stored as exchange property with the key
 `Exchange.INTERCEPTED_ENDPOINT`.
 
-=== Interceptors headers
+=== Interceptors metadata
 
 When using Apache Camel interceptors, the framework automatically populates 
exchange properties with contextual information about where the interception 
occurred:
 
@@ -63,16 +63,16 @@ Java::
 +
 
 [source,java]
--------------------------------------------------------------------------
+----
 // global interceptor for all routes
 intercept().to("log:hello");
 
 from("jms:queue:order")
   .to("bean:validateOrder")
   .to("bean:processOrder");
--------------------------------------------------------------------------
+----
 
-XML::
+Spring XML::
 +
 [source,xml]
 ----
@@ -124,7 +124,7 @@ from("jms:queue:order")
   .to("bean:processOrder");
 ----
 
-XML::
+Spring XML::
 +
 
 [source,xml]
@@ -149,7 +149,7 @@ XML::
 
 ====
 
-=== Controlling when to intercept using contextual informations
+=== Controlling when to intercept using contextual information
 
 [tabs]
 ====
@@ -166,14 +166,12 @@ intercept().choice()
         .to("direct:standardHandling");
 ----
 
-XML::
+Spring XML::
 +
 
 [source,xml]
 ----
-<?xml version="1.0" encoding="UTF-8"?>
-<routes xmlns="http://camel.apache.org/schema/spring";>
-  <intercept>
+<intercept>
     <choice>
       <when>
         <simple>${header.CamelInterceptedRouteId} == 'criticalRoute'</simple>
@@ -183,27 +181,8 @@ XML::
         <to uri="direct:standardHandling"/>
       </otherwise>
     </choice>
-  </intercept>
-</routes>
+</intercept>
 ----
-
-YAML::
-+
-
-[source,xml]
-----
-- intercept:
-    steps:
-      - choice:
-          when:
-            - simple: "${header.CamelInterceptedRouteId} == 'criticalRoute'"
-              steps:
-                - to: "direct:specialHandling"
-          otherwise:
-            steps:
-              - to: "direct:standardHandling"
-----
-
 ====
 
 === Stop routing after being intercepted
@@ -228,7 +207,7 @@ from("jms:queue:order")
   .to("bean:processOrder");
 ----
 
-XML::
+Spring XML::
 +
 
 [source,xml]
@@ -273,7 +252,6 @@ xref:ROOT:log-component.adoc[Log] component.
 
 Java::
 +
-
 [source,java]
 ----
 interceptFrom()
@@ -284,16 +262,15 @@ from("jms:queue:order")
   .to("bean:processOrder");
 ----
 
-XML::
+Spring XML::
 +
-
 [source,xml]
 ----
 <camelContext>
 
-  <intercept>
+  <interceptFrom>
     <to uri="log:incoming"/>
-  </intercept>
+  </interceptFrom>
 
   <route>
     <from uri="jms:queue:order"/>
@@ -314,7 +291,6 @@ you can do:
 
 Java::
 +
-
 [source,java]
 ----
 interceptFrom("jms*")
@@ -328,9 +304,8 @@ from("file:inbox")
   .to("ftp:someserver/backup")
 ----
 
-XML::
+Spring XML::
 +
-
 [source,xml]
 ----
 <camelContext>
@@ -351,7 +326,6 @@ XML::
 
 </camelContext>
 ----
-
 ====
 
 In this example then only messages from the JMS route are intercepted, because
@@ -385,7 +359,6 @@ message is being sent to 
xref:ROOT:kafka-component.adoc[kafka]:
 
 Java::
 +
-
 [source,java]
 ----
 interceptSendToEndpoint("kafka*")
@@ -397,9 +370,8 @@ from("jms:queue:order")
   .to("kafka:order");
 ----
 
-XML::
+Spring XML::
 +
-
 [source,xml]
 ----
 <camelContext>
@@ -417,7 +389,6 @@ XML::
 
 </camelContext>
 ----
-
 ====
 
 When you also want to process the message after it has been sent to the 
intended destination,
@@ -428,7 +399,6 @@ then the example is slightly _odd_ because you have to use 
the `afterUri` as sho
 
 Java::
 +
-
 [source,java]
 ----
 interceptSendToEndpoint("kafka*")
@@ -441,9 +411,8 @@ from("jms:queue:order")
   .to("kafka:order");
 ----
 
-XML::
+Spring XML::
 +
-
 [source,xml]
 ----
 <camelContext>
@@ -476,7 +445,6 @@ xref:ROOT:mock-component.adoc[mock] endpoint, it can be 
done as follows:
 
 Java::
 +
-
 [source,java]
 ----
 interceptSendToEndpoint("kafka*").skipSendToOriginalEndpoint()
@@ -488,9 +456,8 @@ from("jms:queue:order")
   .to("kafka:order");
 ----
 
-XML::
+Spring XML::
 +
-
 [source,xml]
 ----
 <camelContext>
@@ -508,7 +475,6 @@ XML::
 
 </camelContext>
 ----
-
 ====
 
 === Conditional skipping sending to endpoint
@@ -522,7 +488,6 @@ want to avoid sending these messages to a downstream kafka 
system, then this can
 
 Java::
 +
-
 [source,java]
 ----
 interceptSendToEndpoint("kafka*").skipSendToOriginalEndpoint()
@@ -535,9 +500,8 @@ from("jms:queue:order")
   .to("kafka:order");
 ----
 
-XML::
+Spring XML::
 +
-
 [source,xml]
 ----
 <camelContext>
@@ -556,7 +520,6 @@ XML::
 
 </camelContext>
 ----
-
 ====
 
 == Intercepting endpoints using pattern matching
diff --git 
a/core/camel-core-engine/src/main/docs/modules/eips/pages/kamelet-eip.adoc 
b/core/camel-core-engine/src/main/docs/modules/eips/pages/kamelet-eip.adoc
index 8ef0813ce17f..73c4c327b9ba 100644
--- a/core/camel-core-engine/src/main/docs/modules/eips/pages/kamelet-eip.adoc
+++ b/core/camel-core-engine/src/main/docs/modules/eips/pages/kamelet-eip.adoc
@@ -19,8 +19,8 @@ The Kamelet EIP allows calling Kamelets (i.e., 
xref:manual::route-template.adoc[
 When a Kamelet is designed for a special use-case such as aggregating 
messages, and returning
 a response message only when a group of aggregated messages is completed.
 In other words, kamelet does not return a response message for every incoming 
message.
-In special situations like these,
-then you **must** use this Kamelet EIP instead of using the 
xref:components::kamelet-component.adoc[kamelet] component.
+
+In special situations like these, then you **must** use this Kamelet EIP 
instead of using the xref:components::kamelet-component.adoc[kamelet] component.
 
 Given the following Kamelet (as a route template):
 
@@ -43,6 +43,11 @@ has completed a group of messages.
 
 And the following route using the kamelet:
 
+[tabs]
+====
+
+Java::
++
 [source,java]
 ----
 from("direct:start")
@@ -52,8 +57,43 @@ from("direct:start")
     .to("mock:result");
 ----
 
+XML::
++
+[source,xml]
+----
+<route>
+    <from uri="direct:start"/>
+    <to uri="kamelet:my-aggregate?count=5"/>
+    <to uri="log:info"/>
+    <to uri="mock:result"/>
+</route>
+----
+
+YAML::
++
+[source,yaml]
+----
+- route:
+    from:
+      uri: direct:start
+      steps:
+        - to:
+            uri: kamelet:my-aggregate?count=5
+        - to:
+            uri: log:info
+        - to:
+            uri: mock:result
+----
+====
+
+
 Then this does not work, instead you **must** use Kamelet EIP instead:
 
+[tabs]
+====
+
+Java::
++
 [source,java]
 ----
 from("direct:start")
@@ -62,6 +102,37 @@ from("direct:start")
     .to("mock:result");
 ----
 
+XML::
++
+[source,xml]
+----
+<route>
+    <from uri="direct:start"/>
+    <kamelet name="my-aggregate?count=5">
+        <to uri="log:info"/>
+        <to uri="mock:result"/>
+    </kamelet>
+</route>
+----
+
+YAML::
++
+[source,yaml]
+----
+- route:
+    from:
+      uri: direct:start
+      steps:
+        - kamelet:
+            name: my-aggregate?count=5
+            steps:
+              - to:
+                  uri: log:info
+              - to:
+                  uri: mock:result
+----
+====
+
 When calling a Kamelet, you may refer to the name (template id) of the Kamelet 
in the EIP as shown below:
 
 == Options
@@ -82,7 +153,6 @@ include::partial$eip-exchangeProperties.adoc[]
 
 Java::
 +
-
 [source,java]
 ----
 from("direct:start")
@@ -101,6 +171,21 @@ XML::
 </route>
 ----
 
+YAML::
++
+[source,yaml]
+----
+- route:
+    from:
+      uri: direct:start
+      steps:
+        - kamelet:
+            name: foo
+            steps:
+              - to:
+                  uri: mock:result
+----
+
 ====
 
 Camel will then, when starting:
diff --git 
a/dsl/camel-kamelet-main/src/main/java/org/apache/camel/main/KameletMain.java 
b/dsl/camel-kamelet-main/src/main/java/org/apache/camel/main/KameletMain.java
index 2bc2320fb646..361c4eb1a4ae 100644
--- 
a/dsl/camel-kamelet-main/src/main/java/org/apache/camel/main/KameletMain.java
+++ 
b/dsl/camel-kamelet-main/src/main/java/org/apache/camel/main/KameletMain.java
@@ -80,6 +80,7 @@ import 
org.apache.camel.main.download.TypeConverterLoaderDownloadListener;
 import org.apache.camel.main.injection.AnnotationDependencyInjection;
 import org.apache.camel.main.reload.OpenApiGeneratorReloadStrategy;
 import org.apache.camel.main.stub.BeanStubReifier;
+import org.apache.camel.main.stub.KameletStubReifier;
 import org.apache.camel.main.util.ClipboardReloadStrategy;
 import org.apache.camel.main.util.ExtraClassesClassLoader;
 import org.apache.camel.main.util.ExtraFilesClassLoader;
@@ -493,6 +494,8 @@ public class KameletMain extends MainCommandLineSupport {
             blueprintXmlBeansHandler.setTransform(true);
             // stub beans
             BeanStubReifier.registerStubBeanReifiers();
+            // stub kamelet EIP
+            KameletStubReifier.registerStubKameletReifiers(answer);
         }
         if (silent) {
             // silent should not include http server
@@ -682,11 +685,8 @@ public class KameletMain extends MainCommandLineSupport {
             }
             answer.setInjector(new KameletMainInjector(answer.getInjector(), 
stubPattern, silent));
             Object kameletsVersion = 
getInitialProperties().get(getInstanceType() + ".kameletsVersion");
-            if (kameletsVersion != null) {
-                answer.addService(new DependencyDownloaderKamelet(answer, 
kameletsVersion.toString()));
-            } else {
-                answer.addService(new DependencyDownloaderKamelet(answer));
-            }
+            answer.addService(new DependencyDownloaderKamelet(
+                    answer, kameletsVersion != null ? 
kameletsVersion.toString() : null));
             answer.addService(new 
DependencyDownloaderPropertiesComponent(answer, knownDeps, silent));
 
             // reloader
diff --git 
a/dsl/camel-kamelet-main/src/main/java/org/apache/camel/main/download/DependencyDownloaderComponentResolver.java
 
b/dsl/camel-kamelet-main/src/main/java/org/apache/camel/main/download/DependencyDownloaderComponentResolver.java
index 8c28fe18a07c..e9ae59772898 100644
--- 
a/dsl/camel-kamelet-main/src/main/java/org/apache/camel/main/download/DependencyDownloaderComponentResolver.java
+++ 
b/dsl/camel-kamelet-main/src/main/java/org/apache/camel/main/download/DependencyDownloaderComponentResolver.java
@@ -41,7 +41,7 @@ public final class DependencyDownloaderComponentResolver 
extends DefaultComponen
     };
 
     private static final String[] ACCEPTED_TRANSFORM_NAMES = {
-            "stub", "direct", "kamelet", "log", "seda"
+            "stub", "direct", "log", "seda"
     };
 
     private final CamelCatalog catalog = new DefaultCamelCatalog();
diff --git 
a/dsl/camel-kamelet-main/src/main/java/org/apache/camel/main/download/DependencyDownloaderKamelet.java
 
b/dsl/camel-kamelet-main/src/main/java/org/apache/camel/main/download/DependencyDownloaderKamelet.java
index b7ef150526d4..4f189c6ec2da 100644
--- 
a/dsl/camel-kamelet-main/src/main/java/org/apache/camel/main/download/DependencyDownloaderKamelet.java
+++ 
b/dsl/camel-kamelet-main/src/main/java/org/apache/camel/main/download/DependencyDownloaderKamelet.java
@@ -54,10 +54,6 @@ public final class DependencyDownloaderKamelet extends 
ServiceSupport
     private KameletDependencyDownloader downloader;
     private CamelContext camelContext;
 
-    public DependencyDownloaderKamelet(CamelContext camelContext) {
-        this(camelContext, null);
-    }
-
     public DependencyDownloaderKamelet(CamelContext camelContext, String 
kameletsVersion) {
         this.camelContext = camelContext;
         this.kameletsVersion = kameletsVersion;
@@ -75,8 +71,10 @@ public final class DependencyDownloaderKamelet extends 
ServiceSupport
 
     @Override
     protected void doBuild() throws Exception {
-        KameletComponent kc = camelContext.getComponent("kamelet", 
KameletComponent.class);
-        kc.setRouteTemplateLoaderListener(this);
+        var comp = camelContext.getComponent("kamelet");
+        if (comp instanceof KameletComponent kc) {
+            kc.setRouteTemplateLoaderListener(this);
+        }
     }
 
     @Override
diff --git 
a/dsl/camel-kamelet-main/src/main/java/org/apache/camel/main/download/SagaDownloader.java
 
b/dsl/camel-kamelet-main/src/main/java/org/apache/camel/main/download/SagaDownloader.java
index 9473adf0d395..3fea84822389 100644
--- 
a/dsl/camel-kamelet-main/src/main/java/org/apache/camel/main/download/SagaDownloader.java
+++ 
b/dsl/camel-kamelet-main/src/main/java/org/apache/camel/main/download/SagaDownloader.java
@@ -31,7 +31,6 @@ public class SagaDownloader {
     }
 
     public static void registerDownloadReifiers(KameletMain main) {
-
         ProcessorReifier.registerReifier(SagaDefinition.class,
                 (route, processorDefinition) -> {
                     if (processorDefinition instanceof SagaDefinition) {
diff --git 
a/dsl/camel-kamelet-main/src/main/java/org/apache/camel/main/stub/KameletStubReifier.java
 
b/dsl/camel-kamelet-main/src/main/java/org/apache/camel/main/stub/KameletStubReifier.java
new file mode 100644
index 000000000000..a918c36dc53b
--- /dev/null
+++ 
b/dsl/camel-kamelet-main/src/main/java/org/apache/camel/main/stub/KameletStubReifier.java
@@ -0,0 +1,78 @@
+/*
+ * 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.main.stub;
+
+import org.apache.camel.CamelContext;
+import org.apache.camel.NamedNode;
+import org.apache.camel.Processor;
+import org.apache.camel.Route;
+import org.apache.camel.model.KameletDefinition;
+import org.apache.camel.processor.DisabledProcessor;
+import org.apache.camel.reifier.ProcessorReifier;
+import org.apache.camel.spi.ProcessorFactory;
+import org.apache.camel.support.PluginHelper;
+
+public class KameletStubReifier {
+
+    private KameletStubReifier() {
+    }
+
+    public static void registerStubKameletReifiers(CamelContext context) {
+        ProcessorReifier.registerReifier(KameletDefinition.class,
+                (route, processorDefinition) -> {
+                    if (processorDefinition instanceof KameletDefinition kd) {
+                        return new ProcessorReifier<>(route, kd) {
+                            @Override
+                            public Processor createProcessor() throws 
Exception {
+                                return new DisabledProcessor();
+                            }
+                        };
+                    }
+                    return null;
+                });
+
+        // stub kamelet process factory also
+        final ProcessorFactory fac = PluginHelper.getProcessorFactory(context);
+        
context.getCamelContextExtension().addContextPlugin(ProcessorFactory.class, new 
ProcessorFactory() {
+            @Override
+            public Processor createChildProcessor(Route route, NamedNode 
definition, boolean mandatory) throws Exception {
+                if (definition instanceof KameletDefinition) {
+                    return new DisabledProcessor();
+                }
+                return fac.createChildProcessor(route, definition, mandatory);
+            }
+
+            @Override
+            public Processor createProcessor(Route route, NamedNode 
definition) throws Exception {
+                if (definition instanceof KameletDefinition) {
+                    return new DisabledProcessor();
+                }
+                return fac.createProcessor(route, definition);
+            }
+
+            @Override
+            public Processor createProcessor(CamelContext camelContext, String 
definitionName, Object[] args) throws Exception {
+                if ("kamelet".equals(definitionName)) {
+                    return new DisabledProcessor();
+                }
+                return fac.createProcessor(camelContext, definitionName, args);
+            }
+        });
+
+    }
+
+}

Reply via email to