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 c5812460c62 CAMEL-20614: deep-copy enrich and poll-enrich processors 
during instantiation of a route template (#13869)
c5812460c62 is described below

commit c5812460c62a0b131becda6426bad72dc3a333e0
Author: Bartosz Popiela <bartosz...@gmail.com>
AuthorDate: Wed Apr 24 21:19:32 2024 +0200

    CAMEL-20614: deep-copy enrich and poll-enrich processors during 
instantiation of a route template (#13869)
    
    * CAMEL-20614: deep-copy enrich and poll-enrich processors during 
instantiation of a route template
    
    * CAMEL-20614: rename CopyableProcessDefinition to Copyable
    
    * CAMEL-20614: fix formatting
    
    * CAMEL-20614: fix failing unit test
---
 ...yableProcessorDefinition.java => Copyable.java} |  2 +-
 .../org/apache/camel/model/EnrichDefinition.java   | 25 ++++++++++-
 .../org/apache/camel/model/ExpressionNode.java     |  5 +++
 .../apache/camel/model/PollEnrichDefinition.java   | 22 ++++++++-
 .../camel/model/RouteTemplateDefinition.java       |  4 +-
 .../java/org/apache/camel/model/ToDefinition.java  |  2 +-
 .../apache/camel/model/ToDynamicDefinition.java    |  2 +-
 .../camel/model/RouteTemplateDefinitionTest.java   | 52 +++++++++++++++++++---
 8 files changed, 99 insertions(+), 15 deletions(-)

diff --git 
a/core/camel-core-model/src/main/java/org/apache/camel/model/CopyableProcessorDefinition.java
 b/core/camel-core-model/src/main/java/org/apache/camel/model/Copyable.java
similarity index 96%
rename from 
core/camel-core-model/src/main/java/org/apache/camel/model/CopyableProcessorDefinition.java
rename to 
core/camel-core-model/src/main/java/org/apache/camel/model/Copyable.java
index cf770d7515c..98ea9d58fc8 100644
--- 
a/core/camel-core-model/src/main/java/org/apache/camel/model/CopyableProcessorDefinition.java
+++ b/core/camel-core-model/src/main/java/org/apache/camel/model/Copyable.java
@@ -20,6 +20,6 @@ package org.apache.camel.model;
  * This interface is used to copy {@link ProcessorDefinition 
ProcessorDefinitions} during instantiation of a route
  * template.
  */
-interface CopyableProcessorDefinition {
+interface Copyable {
     ProcessorDefinition<?> copy();
 }
diff --git 
a/core/camel-core-model/src/main/java/org/apache/camel/model/EnrichDefinition.java
 
b/core/camel-core-model/src/main/java/org/apache/camel/model/EnrichDefinition.java
index 7b94d4e0bf2..ba904e06f27 100644
--- 
a/core/camel-core-model/src/main/java/org/apache/camel/model/EnrichDefinition.java
+++ 
b/core/camel-core-model/src/main/java/org/apache/camel/model/EnrichDefinition.java
@@ -34,7 +34,8 @@ import org.apache.camel.spi.Metadata;
 @Metadata(label = "eip,transformation")
 @XmlRootElement(name = "enrich")
 @XmlAccessorType(XmlAccessType.FIELD)
-public class EnrichDefinition extends ExpressionNode implements 
AggregationStrategyAwareDefinition<EnrichDefinition> {
+public class EnrichDefinition extends ExpressionNode
+        implements AggregationStrategyAwareDefinition<EnrichDefinition>, 
Copyable {
 
     @XmlTransient
     private AggregationStrategy aggregationStrategyBean;
@@ -72,13 +73,28 @@ public class EnrichDefinition extends ExpressionNode 
implements AggregationStrat
     private String autoStartComponents;
 
     public EnrichDefinition() {
-        this(null);
+        this((AggregationStrategy) null);
     }
 
     public EnrichDefinition(AggregationStrategy aggregationStrategy) {
         this.aggregationStrategyBean = aggregationStrategy;
     }
 
+    protected EnrichDefinition(EnrichDefinition source) {
+        this.aggregationStrategyBean = source.aggregationStrategyBean;
+        this.variableSend = source.variableSend;
+        this.variableReceive = source.variableReceive;
+        this.aggregationStrategy = source.aggregationStrategy;
+        this.aggregationStrategyMethodName = 
source.aggregationStrategyMethodName;
+        this.aggregationStrategyMethodAllowNull = 
source.aggregationStrategyMethodAllowNull;
+        this.aggregateOnException = source.aggregateOnException;
+        this.shareUnitOfWork = source.shareUnitOfWork;
+        this.cacheSize = source.cacheSize;
+        this.ignoreInvalidEndpoint = source.ignoreInvalidEndpoint;
+        this.allowOptimisedComponents = source.allowOptimisedComponents;
+        this.autoStartComponents = source.autoStartComponents;
+    }
+
     @Override
     public String toString() {
         return "Enrich[" + getExpression() + "]";
@@ -379,4 +395,9 @@ public class EnrichDefinition extends ExpressionNode 
implements AggregationStrat
     public void setAutoStartComponents(String autoStartComponents) {
         this.autoStartComponents = autoStartComponents;
     }
+
+    @Override
+    public EnrichDefinition copy() {
+        return new EnrichDefinition(this);
+    }
 }
diff --git 
a/core/camel-core-model/src/main/java/org/apache/camel/model/ExpressionNode.java
 
b/core/camel-core-model/src/main/java/org/apache/camel/model/ExpressionNode.java
index d5e98a939ab..5f5273c9425 100644
--- 
a/core/camel-core-model/src/main/java/org/apache/camel/model/ExpressionNode.java
+++ 
b/core/camel-core-model/src/main/java/org/apache/camel/model/ExpressionNode.java
@@ -58,6 +58,11 @@ public abstract class ExpressionNode extends 
ProcessorDefinition<ExpressionNode>
         setPredicate(predicate);
     }
 
+    protected ExpressionNode(ExpressionNode source) {
+        super(source);
+        this.expression = source.expression;
+    }
+
     public ExpressionDefinition getExpression() {
         return expression;
     }
diff --git 
a/core/camel-core-model/src/main/java/org/apache/camel/model/PollEnrichDefinition.java
 
b/core/camel-core-model/src/main/java/org/apache/camel/model/PollEnrichDefinition.java
index c471bdbb73d..87ff9cb4fe8 100644
--- 
a/core/camel-core-model/src/main/java/org/apache/camel/model/PollEnrichDefinition.java
+++ 
b/core/camel-core-model/src/main/java/org/apache/camel/model/PollEnrichDefinition.java
@@ -34,7 +34,8 @@ import org.apache.camel.spi.Metadata;
 @Metadata(label = "eip,transformation")
 @XmlRootElement(name = "pollEnrich")
 @XmlAccessorType(XmlAccessType.FIELD)
-public class PollEnrichDefinition extends ExpressionNode implements 
AggregationStrategyAwareDefinition<PollEnrichDefinition> {
+public class PollEnrichDefinition extends ExpressionNode
+        implements AggregationStrategyAwareDefinition<PollEnrichDefinition>, 
Copyable {
 
     @XmlTransient
     private AggregationStrategy aggregationStrategyBean;
@@ -74,6 +75,20 @@ public class PollEnrichDefinition extends ExpressionNode 
implements AggregationS
         this.timeout = Long.toString(timeout);
     }
 
+    protected PollEnrichDefinition(PollEnrichDefinition source) {
+        super(source);
+        this.aggregationStrategyBean = source.aggregationStrategyBean;
+        this.variableReceive = source.variableReceive;
+        this.aggregationStrategy = source.aggregationStrategy;
+        this.aggregationStrategyMethodName = 
source.aggregationStrategyMethodName;
+        this.aggregationStrategyMethodAllowNull = 
source.aggregationStrategyMethodAllowNull;
+        this.aggregateOnException = source.aggregateOnException;
+        this.timeout = source.timeout;
+        this.cacheSize = source.cacheSize;
+        this.ignoreInvalidEndpoint = source.ignoreInvalidEndpoint;
+        this.autoStartComponents = source.autoStartComponents;
+    }
+
     @Override
     public String toString() {
         return "PollEnrich[" + getExpression() + "]";
@@ -358,4 +373,9 @@ public class PollEnrichDefinition extends ExpressionNode 
implements AggregationS
     public void setAutoStartComponents(String autoStartComponents) {
         this.autoStartComponents = autoStartComponents;
     }
+
+    @Override
+    public PollEnrichDefinition copy() {
+        return new PollEnrichDefinition(this);
+    }
 }
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 d46d30433aa..6d1730fbba7 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
@@ -450,8 +450,8 @@ public class RouteTemplateDefinition extends 
OptionalIdentifiedDefinition<RouteT
     private List<ProcessorDefinition<?>> copy(List<ProcessorDefinition<?>> 
outputs) {
         var copy = new ArrayList<ProcessorDefinition<?>>();
         for (var definition : outputs) {
-            if (definition instanceof CopyableProcessorDefinition copyable) {
-                copy.add(copyable.copy());
+            if (definition instanceof Copyable copyableDefinition) {
+                copy.add(copyableDefinition.copy());
             } else {
                 copy.add(definition);
             }
diff --git 
a/core/camel-core-model/src/main/java/org/apache/camel/model/ToDefinition.java 
b/core/camel-core-model/src/main/java/org/apache/camel/model/ToDefinition.java
index 469ab1ea8b9..d75b68e0753 100644
--- 
a/core/camel-core-model/src/main/java/org/apache/camel/model/ToDefinition.java
+++ 
b/core/camel-core-model/src/main/java/org/apache/camel/model/ToDefinition.java
@@ -33,7 +33,7 @@ import org.apache.camel.spi.Metadata;
 @Metadata(label = "eip,routing")
 @XmlRootElement(name = "to")
 @XmlAccessorType(XmlAccessType.FIELD)
-public class ToDefinition extends SendDefinition<ToDefinition> implements 
CopyableProcessorDefinition {
+public class ToDefinition extends SendDefinition<ToDefinition> implements 
Copyable {
 
     @XmlAttribute
     private String variableSend;
diff --git 
a/core/camel-core-model/src/main/java/org/apache/camel/model/ToDynamicDefinition.java
 
b/core/camel-core-model/src/main/java/org/apache/camel/model/ToDynamicDefinition.java
index b1495e9fa8c..4c4ae7e2c5e 100644
--- 
a/core/camel-core-model/src/main/java/org/apache/camel/model/ToDynamicDefinition.java
+++ 
b/core/camel-core-model/src/main/java/org/apache/camel/model/ToDynamicDefinition.java
@@ -34,7 +34,7 @@ import org.apache.camel.spi.Metadata;
 @Metadata(label = "eip,routing")
 @XmlRootElement(name = "toD")
 @XmlAccessorType(XmlAccessType.FIELD)
-public class ToDynamicDefinition extends 
NoOutputDefinition<ToDynamicDefinition> implements CopyableProcessorDefinition {
+public class ToDynamicDefinition extends 
NoOutputDefinition<ToDynamicDefinition> implements Copyable {
 
     @XmlTransient
     protected EndpointProducerBuilder endpointProducerBuilder;
diff --git 
a/core/camel-core/src/test/java/org/apache/camel/model/RouteTemplateDefinitionTest.java
 
b/core/camel-core/src/test/java/org/apache/camel/model/RouteTemplateDefinitionTest.java
index 0c74b35a181..4f63304cccc 100644
--- 
a/core/camel-core/src/test/java/org/apache/camel/model/RouteTemplateDefinitionTest.java
+++ 
b/core/camel-core/src/test/java/org/apache/camel/model/RouteTemplateDefinitionTest.java
@@ -22,6 +22,8 @@ import java.util.Map;
 import org.apache.camel.support.RoutePolicySupport;
 import org.junit.jupiter.api.Test;
 
+import static java.util.Collections.emptyList;
+import static java.util.UUID.randomUUID;
 import static org.junit.jupiter.api.Assertions.assertEquals;
 import static org.junit.jupiter.api.Assertions.assertInstanceOf;
 import static org.junit.jupiter.api.Assertions.assertNotSame;
@@ -37,12 +39,12 @@ class RouteTemplateDefinitionTest {
         route.setRoutePolicies(List.of(new RoutePolicySupport() {
         }));
         route.setInput(new FromDefinition("direct://fromEndpoint"));
-        route.setOutputs(List.of(new ToDefinition("direct://toEndpoint"), new 
SetHeaderDefinition("header", "headerValue")));
+        route.setOutputs(List.of(
+                new CopyableProcessDefinition(),
+                new NonCopyableProcessDefinition()));
         RouteTemplateDefinition routeTemplate = new RouteTemplateDefinition();
         routeTemplate.setRoute(route);
-
         RouteDefinition routeCopy = routeTemplate.asRouteDefinition();
-
         assertNotSame(route.getTemplateParameters(), 
routeCopy.getTemplateParameters());
         assertEquals(route.getTemplateParameters(), 
routeCopy.getTemplateParameters());
         assertNotSame(route.getRouteProperties(), 
routeCopy.getRouteProperties());
@@ -53,11 +55,47 @@ class RouteTemplateDefinitionTest {
         assertEquals(route.getInput().getUri(), routeCopy.getInput().getUri());
         assertNotSame(route.getOutputs(), routeCopy.getOutputs());
         assertEquals(2, routeCopy.getOutputs().size());
+        assertInstanceOf(CopyableProcessDefinition.class, 
routeCopy.getOutputs().get(0));
         assertNotSame(route.getOutputs().get(0), 
routeCopy.getOutputs().get(0));
-        assertInstanceOf(ToDefinition.class, route.getOutputs().get(0));
-        assertInstanceOf(ToDefinition.class, routeCopy.getOutputs().get(0));
-        assertEquals(((ToDefinition) route.getOutputs().get(0)).getUri(),
-                ((ToDefinition) routeCopy.getOutputs().get(0)).getUri());
+        assertEquals(route.getOutputs().get(0).getId(), 
routeCopy.getOutputs().get(0).getId());
         assertSame(route.getOutputs().get(1), routeCopy.getOutputs().get(1));
     }
+
+    private static final class CopyableProcessDefinition extends 
ProcessorDefinition<CopyableProcessDefinition>
+            implements Copyable {
+
+        public CopyableProcessDefinition() {
+            setId(randomUUID().toString());
+        }
+
+        @Override
+        public ProcessorDefinition<?> copy() {
+            var copy = new CopyableProcessDefinition();
+            copy.setId(getId());
+            return copy;
+        }
+
+        @Override
+        public String getShortName() {
+            return toString();
+        }
+
+        @Override
+        public List<ProcessorDefinition<?>> getOutputs() {
+            return emptyList();
+        }
+    }
+
+    private static final class NonCopyableProcessDefinition extends 
ProcessorDefinition<NonCopyableProcessDefinition> {
+
+        @Override
+        public String getShortName() {
+            return toString();
+        }
+
+        @Override
+        public List<ProcessorDefinition<?>> getOutputs() {
+            return emptyList();
+        }
+    }
 }

Reply via email to