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 60618fe478a CAMEL-21475: camel-yaml-dsl - Using route templates with
hardcoded ids problem (#16391)
60618fe478a is described below
commit 60618fe478a4848f649e4d1a71c9dc4b2d7bd323
Author: Claus Ibsen <[email protected]>
AuthorDate: Wed Nov 27 10:09:42 2024 +0100
CAMEL-21475: camel-yaml-dsl - Using route templates with hardcoded ids
problem (#16391)
* CAMEL-21475: camel-yaml-dsl - Using route templates with hardcoded ids
problem
---
.../main/java/org/apache/camel/impl/DefaultModel.java | 3 +++
.../apache/camel/model/RouteTemplateDefinition.java | 18 ++++++++++++++++++
.../builder/RouteTemplateDuplicateIdIssueTest.java | 2 +-
.../apache/camel/builder/RouteTemplateStepIdTest.java | 10 ++++++----
.../modules/ROOT/pages/camel-4x-upgrade-guide-4_8.adoc | 8 ++++++++
.../modules/ROOT/pages/camel-4x-upgrade-guide-4_9.adoc | 6 ++++++
6 files changed, 42 insertions(+), 5 deletions(-)
diff --git
a/core/camel-core-engine/src/main/java/org/apache/camel/impl/DefaultModel.java
b/core/camel-core-engine/src/main/java/org/apache/camel/impl/DefaultModel.java
index f167ce5b73a..fdb09b8e1cf 100644
---
a/core/camel-core-engine/src/main/java/org/apache/camel/impl/DefaultModel.java
+++
b/core/camel-core-engine/src/main/java/org/apache/camel/impl/DefaultModel.java
@@ -534,6 +534,9 @@ public class DefaultModel implements Model {
}
// assign ids to the routes and validate that the id's are all unique
+ if (prefixId == null) {
+ prefixId = def.getNodePrefixId();
+ }
String duplicate = RouteDefinitionHelper.validateUniqueIds(def,
routeDefinitions, prefixId);
if (duplicate != null) {
throw new FailedToCreateRouteFromTemplateException(
diff --git
a/core/camel-core-model/src/main/java/org/apache/camel/model/RouteTemplateDefinition.java
b/core/camel-core-model/src/main/java/org/apache/camel/model/RouteTemplateDefinition.java
index 74695fdc82e..0a02ccd2303 100644
---
a/core/camel-core-model/src/main/java/org/apache/camel/model/RouteTemplateDefinition.java
+++
b/core/camel-core-model/src/main/java/org/apache/camel/model/RouteTemplateDefinition.java
@@ -20,6 +20,7 @@ import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
+import java.util.concurrent.atomic.AtomicInteger;
import java.util.function.Consumer;
import java.util.function.Supplier;
@@ -47,6 +48,9 @@ import org.apache.camel.spi.ResourceAware;
@XmlAccessorType(XmlAccessType.FIELD)
public class RouteTemplateDefinition extends
OptionalIdentifiedDefinition<RouteTemplateDefinition> implements ResourceAware {
+ @XmlTransient
+ private static final AtomicInteger COUNTER = new AtomicInteger();
+
@XmlTransient
private Consumer<RouteTemplateContext> configurer;
@@ -406,6 +410,16 @@ public class RouteTemplateDefinition extends
OptionalIdentifiedDefinition<RouteT
}
copy.setErrorHandler(route.getErrorHandler());
+ // ensure the copy has unique node prefix to avoid duplicate id clash
+ // when creating multiple routes from the same template
+ copy.setNodePrefixId(route.getNodePrefixId());
+ String npi = copy.getNodePrefixId();
+ if (npi == null) {
+ npi = "route";
+ }
+ npi = npi + "-" + incNodePrefixId();
+ copy.setNodePrefixId(npi);
+
// and then copy over the rest
// (do not copy id as it is used for route template id)
copy.setAutoStartup(route.getAutoStartup());
@@ -447,6 +461,10 @@ public class RouteTemplateDefinition extends
OptionalIdentifiedDefinition<RouteT
return (map != null) ? new HashMap<>(map) : null;
}
+ private int incNodePrefixId() {
+ return COUNTER.incrementAndGet();
+ }
+
@FunctionalInterface
public interface Converter {
diff --git
a/core/camel-core/src/test/java/org/apache/camel/builder/RouteTemplateDuplicateIdIssueTest.java
b/core/camel-core/src/test/java/org/apache/camel/builder/RouteTemplateDuplicateIdIssueTest.java
index 4625c6aa514..14895193003 100644
---
a/core/camel-core/src/test/java/org/apache/camel/builder/RouteTemplateDuplicateIdIssueTest.java
+++
b/core/camel-core/src/test/java/org/apache/camel/builder/RouteTemplateDuplicateIdIssueTest.java
@@ -58,7 +58,7 @@ public class RouteTemplateDuplicateIdIssueTest extends
ContextTestSupport {
assertDoesNotThrow(() -> context.start(), "Route creation should not
fail");
// should generate unique id per template for the runtime processors
- List<Processor> processors = getProcessors("recipientList*");
+ List<Processor> processors = getProcessors(".*recipientList.*");
assertEquals(2, processors.size());
Processor p1 = processors.get(0);
Processor p2 = processors.get(1);
diff --git
a/core/camel-core/src/test/java/org/apache/camel/builder/RouteTemplateStepIdTest.java
b/core/camel-core/src/test/java/org/apache/camel/builder/RouteTemplateStepIdTest.java
index dac1be5cc62..6a2b71b62c7 100644
---
a/core/camel-core/src/test/java/org/apache/camel/builder/RouteTemplateStepIdTest.java
+++
b/core/camel-core/src/test/java/org/apache/camel/builder/RouteTemplateStepIdTest.java
@@ -34,14 +34,16 @@ public class RouteTemplateStepIdTest extends
ContextTestSupport {
assertEquals(2, context.getRoutes().size());
- StepProcessor step1 = context.getProcessor("one", StepProcessor.class);
+ String nodePrefix = context.getRoute("one").getNodePrefixId();
+ StepProcessor step1 = context.getProcessor(nodePrefix + "one",
StepProcessor.class);
Assertions.assertNotNull(step1);
- Assertions.assertEquals("one", step1.getId());
+ Assertions.assertEquals(nodePrefix + "one", step1.getId());
Assertions.assertEquals("one", step1.getRouteId());
- StepProcessor step2 = context.getProcessor("deux",
StepProcessor.class);
+ nodePrefix = context.getRoute("deux").getNodePrefixId();
+ StepProcessor step2 = context.getProcessor(nodePrefix + "deux",
StepProcessor.class);
Assertions.assertNotNull(step2);
- Assertions.assertEquals("deux", step2.getId());
+ Assertions.assertEquals(nodePrefix + "deux", step2.getId());
Assertions.assertEquals("deux", step2.getRouteId());
}
diff --git
a/docs/user-manual/modules/ROOT/pages/camel-4x-upgrade-guide-4_8.adoc
b/docs/user-manual/modules/ROOT/pages/camel-4x-upgrade-guide-4_8.adoc
index 51deb3016ee..4951161f31d 100644
--- a/docs/user-manual/modules/ROOT/pages/camel-4x-upgrade-guide-4_8.adoc
+++ b/docs/user-manual/modules/ROOT/pages/camel-4x-upgrade-guide-4_8.adoc
@@ -6,6 +6,14 @@ from both 4.0 to 4.1 and 4.1 to 4.2.
== Upgrading from 4.8.1 to 4.8.2
+=== camel-management
+
+==== Using Route Templates
+
+Camel will now ensure the created routes via route templates
+always use unique _nodePrefixId_ to ensure there are no duplicate id clashes,
when the template
+is used for creating multiple routes.
+
=== camel-debezium
To avoid split package that can be a problem in environments like OSGI, each
camel-debezium module has its own
diff --git
a/docs/user-manual/modules/ROOT/pages/camel-4x-upgrade-guide-4_9.adoc
b/docs/user-manual/modules/ROOT/pages/camel-4x-upgrade-guide-4_9.adoc
index ac2b9f43f98..e1b7d4ed880 100644
--- a/docs/user-manual/modules/ROOT/pages/camel-4x-upgrade-guide-4_9.adoc
+++ b/docs/user-manual/modules/ROOT/pages/camel-4x-upgrade-guide-4_9.adoc
@@ -18,6 +18,12 @@ Renamed `ExchangePropertyKey.ACTIVE_SPAN` to
`ExchangePropertyKey.OTEL_ACTIVE_SP
The `queueSize` attribute on endpoints which are `ManagedBrowseableEndpoint`
is changed from returning a `Long` value
to an `Integer` value.
+==== Using Route Templates
+
+Camel will now ensure the created routes via route templates
+always use unique _nodePrefixId_ to ensure there are no duplicate id clashes,
when the template
+is used for creating multiple routes.
+
=== camel-xml-io
The XML dumper no longer includes attributes which are using default values.