Skip to content

Commit

Permalink
CAMEL-20614: deep-copy enrich and poll-enrich processors during insta…
Browse files Browse the repository at this point in the history
…ntiation 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
  • Loading branch information
bartoszpop authored Apr 24, 2024
1 parent b90a5db commit cc57bf2
Show file tree
Hide file tree
Showing 8 changed files with 99 additions and 15 deletions.
Original file line number Diff line number Diff line change
Expand Up @@ -20,6 +20,6 @@
* This interface is used to copy {@link ProcessorDefinition ProcessorDefinitions} during instantiation of a route
* template.
*/
interface CopyableProcessorDefinition {
interface Copyable {
ProcessorDefinition<?> copy();
}
Original file line number Diff line number Diff line change
Expand Up @@ -34,7 +34,8 @@
@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;
Expand Down Expand Up @@ -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() + "]";
Expand Down Expand Up @@ -379,4 +395,9 @@ public String getAutoStartComponents() {
public void setAutoStartComponents(String autoStartComponents) {
this.autoStartComponents = autoStartComponents;
}

@Override
public EnrichDefinition copy() {
return new EnrichDefinition(this);
}
}
Original file line number Diff line number Diff line change
Expand Up @@ -58,6 +58,11 @@ public ExpressionNode(Predicate predicate) {
setPredicate(predicate);
}

protected ExpressionNode(ExpressionNode source) {
super(source);
this.expression = source.expression;
}

public ExpressionDefinition getExpression() {
return expression;
}
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -34,7 +34,8 @@
@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;
Expand Down Expand Up @@ -74,6 +75,20 @@ public PollEnrichDefinition(AggregationStrategy aggregationStrategy, long timeou
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() + "]";
Expand Down Expand Up @@ -358,4 +373,9 @@ public String getAutoStartComponents() {
public void setAutoStartComponents(String autoStartComponents) {
this.autoStartComponents = autoStartComponents;
}

@Override
public PollEnrichDefinition copy() {
return new PollEnrichDefinition(this);
}
}
Original file line number Diff line number Diff line change
Expand Up @@ -449,8 +449,8 @@ private <K, V> Map<K, V> shallowCopy(Map<K, V> map) {
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);
}
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -33,7 +33,7 @@
@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;
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -34,7 +34,7 @@
@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;
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -22,6 +22,8 @@
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;
Expand All @@ -37,12 +39,12 @@ void testDeepCopyMutableProperties() {
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());
Expand All @@ -53,11 +55,47 @@ void testDeepCopyMutableProperties() {
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();
}
}
}

0 comments on commit cc57bf2

Please sign in to comment.