This is an automated email from the ASF dual-hosted git repository.
davsclaus pushed a commit to branch camel-4.4.x
in repository https://gitbox.apache.org/repos/asf/camel.git
The following commit(s) were added to refs/heads/camel-4.4.x by this push:
new cc57bf2353f CAMEL-20614: deep-copy enrich and poll-enrich processors
during instantiation of a route template (#13870)
cc57bf2353f is described below
commit cc57bf2353ff541f379124c24da6ec64849d985c
Author: Bartosz Popiela <[email protected]>
AuthorDate: Wed Apr 24 21:19:45 2024 +0200
CAMEL-20614: deep-copy enrich and poll-enrich processors during
instantiation of a route template (#13870)
* 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 be367b589d2..5175d4b8499 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
@@ -449,8 +449,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();
+ }
+ }
}