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.