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);
+ }
+ });
+
+ }
+
+}