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

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

commit 09f6ce0bad6723c8e76147e542614ab90a40435b
Author: Claus Ibsen <claus.ib...@gmail.com>
AuthorDate: Wed Nov 27 09:15:12 2024 +0100

    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_9.adoc |  6 ++++++
 5 files changed, 34 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_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.

Reply via email to