You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@camel.apache.org by da...@apache.org on 2022/08/08 05:28:19 UTC
[camel] 01/02: CAMEL-18358: resource based endpoints should not lose attachments after processing such as freemarker and others.
This is an automated email from the ASF dual-hosted git repository.
davsclaus pushed a commit to branch camel-3.18.x
in repository https://gitbox.apache.org/repos/asf/camel.git
commit aaa687ea08c977def2a6e1970537d2dd3566ddc7
Author: Claus Ibsen <cl...@gmail.com>
AuthorDate: Mon Aug 8 07:25:13 2022 +0200
CAMEL-18358: resource based endpoints should not lose attachments after processing such as freemarker and others.
---
.../camel/component/chunk/ChunkEndpoint.java | 5 +-
components/camel-freemarker/pom.xml | 5 ++
.../component/freemarker/FreemarkerEndpoint.java | 7 +--
.../freemarker/FreemarkerAttachmentsTest.java | 71 ++++++++++++++++++++++
.../apache/camel/component/jolt/JoltEndpoint.java | 10 ++-
.../apache/camel/component/jslt/JsltEndpoint.java | 6 +-
.../component/jsonpatch/JsonPatchProducer.java | 4 +-
.../camel/component/jsonata/JsonataEndpoint.java | 12 ++--
.../camel/component/mustache/MustacheEndpoint.java | 5 +-
.../apache/camel/component/mvel/MvelEndpoint.java | 5 +-
.../stringtemplate/StringTemplateEndpoint.java | 7 +--
.../camel/component/velocity/VelocityEndpoint.java | 5 +-
12 files changed, 98 insertions(+), 44 deletions(-)
diff --git a/components/camel-chunk/src/main/java/org/apache/camel/component/chunk/ChunkEndpoint.java b/components/camel-chunk/src/main/java/org/apache/camel/component/chunk/ChunkEndpoint.java
index f8ad1e0b2b1..ddb8063dece 100644
--- a/components/camel-chunk/src/main/java/org/apache/camel/component/chunk/ChunkEndpoint.java
+++ b/components/camel-chunk/src/main/java/org/apache/camel/component/chunk/ChunkEndpoint.java
@@ -29,7 +29,6 @@ import org.apache.camel.Category;
import org.apache.camel.Component;
import org.apache.camel.Exchange;
import org.apache.camel.ExchangePattern;
-import org.apache.camel.Message;
import org.apache.camel.component.ResourceEndpoint;
import org.apache.camel.spi.UriEndpoint;
import org.apache.camel.spi.UriParam;
@@ -123,9 +122,7 @@ public class ChunkEndpoint extends ResourceEndpoint {
writer.flush();
// Fill out message
- Message out = exchange.getOut();
- out.setBody(newChunk.toString());
- out.setHeaders(exchange.getIn().getHeaders());
+ ExchangeHelper.setInOutBodyPatternAware(exchange, newChunk.toString());
} else {
exchange.getIn().removeHeader(ChunkConstants.CHUNK_RESOURCE_URI);
ChunkEndpoint newEndpoint
diff --git a/components/camel-freemarker/pom.xml b/components/camel-freemarker/pom.xml
index 1e777ded2d6..3438fef34f5 100644
--- a/components/camel-freemarker/pom.xml
+++ b/components/camel-freemarker/pom.xml
@@ -55,6 +55,11 @@
<artifactId>camel-test-spring-junit5</artifactId>
<scope>test</scope>
</dependency>
+ <dependency>
+ <groupId>org.apache.camel</groupId>
+ <artifactId>camel-attachments</artifactId>
+ <scope>test</scope>
+ </dependency>
<dependency>
<groupId>org.apache.camel</groupId>
<artifactId>camel-management</artifactId>
diff --git a/components/camel-freemarker/src/main/java/org/apache/camel/component/freemarker/FreemarkerEndpoint.java b/components/camel-freemarker/src/main/java/org/apache/camel/component/freemarker/FreemarkerEndpoint.java
index 9ab930b1110..9cb32e3250d 100644
--- a/components/camel-freemarker/src/main/java/org/apache/camel/component/freemarker/FreemarkerEndpoint.java
+++ b/components/camel-freemarker/src/main/java/org/apache/camel/component/freemarker/FreemarkerEndpoint.java
@@ -26,7 +26,6 @@ import org.apache.camel.Category;
import org.apache.camel.Component;
import org.apache.camel.Exchange;
import org.apache.camel.ExchangePattern;
-import org.apache.camel.Message;
import org.apache.camel.component.ResourceEndpoint;
import org.apache.camel.spi.UriEndpoint;
import org.apache.camel.spi.UriParam;
@@ -180,9 +179,7 @@ public class FreemarkerEndpoint extends ResourceEndpoint {
template.process(dataModel, buffer);
buffer.flush();
- // now lets output the results to the exchange
- Message out = exchange.getOut();
- out.setBody(buffer.toString());
- out.setHeaders(exchange.getIn().getHeaders());
+ // now lets store the result
+ ExchangeHelper.setInOutBodyPatternAware(exchange, buffer.toString());
}
}
diff --git a/components/camel-freemarker/src/test/java/org/apache/camel/component/freemarker/FreemarkerAttachmentsTest.java b/components/camel-freemarker/src/test/java/org/apache/camel/component/freemarker/FreemarkerAttachmentsTest.java
new file mode 100644
index 00000000000..4f57c47c027
--- /dev/null
+++ b/components/camel-freemarker/src/test/java/org/apache/camel/component/freemarker/FreemarkerAttachmentsTest.java
@@ -0,0 +1,71 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one or more
+ * contributor license agreements. See the NOTICE file distributed with
+ * this work for additional information regarding copyright ownership.
+ * The ASF licenses this file to You under the Apache License, Version 2.0
+ * (the "License"); you may not use this file except in compliance with
+ * the License. You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+package org.apache.camel.component.freemarker;
+
+import org.apache.camel.Exchange;
+import org.apache.camel.Processor;
+import org.apache.camel.attachment.AttachmentMessage;
+import org.apache.camel.builder.RouteBuilder;
+import org.apache.camel.test.junit5.CamelTestSupport;
+import org.junit.jupiter.api.Test;
+
+import javax.activation.DataHandler;
+import javax.activation.FileDataSource;
+
+import static org.junit.jupiter.api.Assertions.assertEquals;
+import static org.junit.jupiter.api.Assertions.assertNotNull;
+
+/**
+ * Freemarker unit test
+ */
+public class FreemarkerAttachmentsTest extends CamelTestSupport {
+
+ @Test
+ public void testFreemarkerAttachments() {
+ Exchange exchange = template.request("direct:a", new Processor() {
+ @Override
+ public void process(Exchange exchange) {
+ exchange.setProperty("item", "7");
+
+ AttachmentMessage am = exchange.getIn(AttachmentMessage.class);
+ am.setBody("Monday");
+ am.setHeader("name", "Christian");
+ am.addAttachment("123", new DataHandler(new FileDataSource("pom.xml")));
+ }
+ });
+
+ assertEquals("Dear Christian. You ordered item 7 on Monday.", exchange.getMessage().getBody());
+ assertEquals("Christian", exchange.getMessage().getHeader("name"));
+
+
+ AttachmentMessage am = exchange.getMessage(AttachmentMessage.class);
+ assertNotNull(am);
+ assertEquals("123", am.getAttachmentNames().iterator().next());
+ }
+
+ @Override
+ protected RouteBuilder createRouteBuilder() {
+ return new RouteBuilder() {
+ public void configure() {
+ // START SNIPPET: example
+ from("direct:a").to(
+ "freemarker:org/apache/camel/component/freemarker/example.ftl?allowTemplateFromHeader=true&allowContextMapAll=true");
+ // END SNIPPET: example
+ }
+ };
+ }
+}
diff --git a/components/camel-jolt/src/main/java/org/apache/camel/component/jolt/JoltEndpoint.java b/components/camel-jolt/src/main/java/org/apache/camel/component/jolt/JoltEndpoint.java
index 7d6d73c8397..40114f5c918 100644
--- a/components/camel-jolt/src/main/java/org/apache/camel/component/jolt/JoltEndpoint.java
+++ b/components/camel-jolt/src/main/java/org/apache/camel/component/jolt/JoltEndpoint.java
@@ -31,10 +31,10 @@ import com.bazaarvoice.jolt.Transform;
import org.apache.camel.Category;
import org.apache.camel.Exchange;
import org.apache.camel.ExchangePattern;
-import org.apache.camel.Message;
import org.apache.camel.component.ResourceEndpoint;
import org.apache.camel.spi.UriEndpoint;
import org.apache.camel.spi.UriParam;
+import org.apache.camel.support.ExchangeHelper;
import org.apache.camel.util.ObjectHelper;
/**
@@ -206,13 +206,11 @@ public class JoltEndpoint extends ResourceEndpoint {
}
// now lets output the results to the exchange
- Message message = exchange.getMessage();
+ Object body = output;
if (getOutputType() == JoltInputOutputType.JsonString) {
- message.setBody(JsonUtils.toJsonString(output));
- } else {
- message.setBody(output);
+ body = JsonUtils.toJsonString(output);
}
- message.setHeaders(exchange.getIn().getHeaders());
+ ExchangeHelper.setInOutBodyPatternAware(exchange, body);
}
}
diff --git a/components/camel-jslt/src/main/java/org/apache/camel/component/jslt/JsltEndpoint.java b/components/camel-jslt/src/main/java/org/apache/camel/component/jslt/JsltEndpoint.java
index 2031fcbc10c..6f5f88ea15a 100644
--- a/components/camel-jslt/src/main/java/org/apache/camel/component/jslt/JsltEndpoint.java
+++ b/components/camel-jslt/src/main/java/org/apache/camel/component/jslt/JsltEndpoint.java
@@ -169,12 +169,10 @@ public class JsltEndpoint extends ResourceEndpoint {
}
Map<String, JsonNode> variables = extractVariables(exchange);
-
JsonNode output = getTransform(exchange.getMessage()).apply(variables, input);
- Message out = exchange.getMessage();
- out.setBody(isPrettyPrint() ? output.toPrettyString() : output.toString());
- out.setHeaders(exchange.getIn().getHeaders());
+ Object body = isPrettyPrint() ? output.toPrettyString() : output.toString();
+ ExchangeHelper.setInOutBodyPatternAware(exchange, body);
}
/**
diff --git a/components/camel-json-patch/src/main/java/org/apache/camel/component/jsonpatch/JsonPatchProducer.java b/components/camel-json-patch/src/main/java/org/apache/camel/component/jsonpatch/JsonPatchProducer.java
index 15f591cc3e1..9d32e188ca8 100644
--- a/components/camel-json-patch/src/main/java/org/apache/camel/component/jsonpatch/JsonPatchProducer.java
+++ b/components/camel-json-patch/src/main/java/org/apache/camel/component/jsonpatch/JsonPatchProducer.java
@@ -21,6 +21,7 @@ import com.fasterxml.jackson.databind.ObjectMapper;
import com.github.fge.jsonpatch.JsonPatch;
import org.apache.camel.Exchange;
import org.apache.camel.support.DefaultProducer;
+import org.apache.camel.support.ExchangeHelper;
import org.apache.camel.support.ResourceHelper;
public class JsonPatchProducer extends DefaultProducer {
@@ -48,7 +49,8 @@ public class JsonPatchProducer extends DefaultProducer {
JsonPatch.class);
JsonNode input = objectMapper.readTree(exchange.getIn().getBody(String.class));
JsonNode result = patch.apply(input);
- exchange.getMessage().setBody(result.toString());
+
+ ExchangeHelper.setInOutBodyPatternAware(exchange, result.toString());
}
}
diff --git a/components/camel-jsonata/src/main/java/org/apache/camel/component/jsonata/JsonataEndpoint.java b/components/camel-jsonata/src/main/java/org/apache/camel/component/jsonata/JsonataEndpoint.java
index b4593c1cffa..affc1173fda 100644
--- a/components/camel-jsonata/src/main/java/org/apache/camel/component/jsonata/JsonataEndpoint.java
+++ b/components/camel-jsonata/src/main/java/org/apache/camel/component/jsonata/JsonataEndpoint.java
@@ -28,10 +28,10 @@ import com.fasterxml.jackson.databind.ObjectMapper;
import org.apache.camel.Category;
import org.apache.camel.Exchange;
import org.apache.camel.ExchangePattern;
-import org.apache.camel.Message;
import org.apache.camel.component.ResourceEndpoint;
import org.apache.camel.spi.UriEndpoint;
import org.apache.camel.spi.UriParam;
+import org.apache.camel.support.ExchangeHelper;
import org.apache.camel.util.ObjectHelper;
/**
@@ -114,13 +114,11 @@ public class JsonataEndpoint extends ResourceEndpoint {
}
output = expressions.evaluate(input);
- // now lets output the results to the exchange
- Message out = exchange.getMessage();
+ // now lets output the results to the exchange
+ Object body = output;
if (getOutputType() == JsonataInputOutputType.JsonString) {
- out.setBody(output.toString());
- } else {
- out.setBody(output);
+ body = output.toString();
}
- out.setHeaders(exchange.getIn().getHeaders());
+ ExchangeHelper.setInOutBodyPatternAware(exchange, body);
}
}
diff --git a/components/camel-mustache/src/main/java/org/apache/camel/component/mustache/MustacheEndpoint.java b/components/camel-mustache/src/main/java/org/apache/camel/component/mustache/MustacheEndpoint.java
index 402375773f4..345aaa9847f 100644
--- a/components/camel-mustache/src/main/java/org/apache/camel/component/mustache/MustacheEndpoint.java
+++ b/components/camel-mustache/src/main/java/org/apache/camel/component/mustache/MustacheEndpoint.java
@@ -30,7 +30,6 @@ import org.apache.camel.Category;
import org.apache.camel.Component;
import org.apache.camel.Exchange;
import org.apache.camel.ExchangePattern;
-import org.apache.camel.Message;
import org.apache.camel.component.ResourceEndpoint;
import org.apache.camel.spi.UriEndpoint;
import org.apache.camel.spi.UriParam;
@@ -116,9 +115,7 @@ public class MustacheEndpoint extends ResourceEndpoint {
writer.flush();
// Fill out message
- Message out = exchange.getMessage();
- out.setBody(writer.toString());
- out.setHeaders(exchange.getIn().getHeaders());
+ ExchangeHelper.setInOutBodyPatternAware(exchange, writer.toString());
}
/**
diff --git a/components/camel-mvel/src/main/java/org/apache/camel/component/mvel/MvelEndpoint.java b/components/camel-mvel/src/main/java/org/apache/camel/component/mvel/MvelEndpoint.java
index 3316c006270..713c2a407e9 100644
--- a/components/camel-mvel/src/main/java/org/apache/camel/component/mvel/MvelEndpoint.java
+++ b/components/camel-mvel/src/main/java/org/apache/camel/component/mvel/MvelEndpoint.java
@@ -23,7 +23,6 @@ import java.util.Map;
import org.apache.camel.Category;
import org.apache.camel.Exchange;
import org.apache.camel.ExchangePattern;
-import org.apache.camel.Message;
import org.apache.camel.component.ResourceEndpoint;
import org.apache.camel.spi.UriEndpoint;
import org.apache.camel.spi.UriParam;
@@ -145,9 +144,7 @@ public class MvelEndpoint extends ResourceEndpoint {
Object result = TemplateRuntime.execute(compiled, mvelContext, variableMap);
// now lets output the results to the exchange
- Message out = exchange.getMessage();
- out.setBody(result.toString());
- out.setHeaders(exchange.getIn().getHeaders());
+ ExchangeHelper.setInOutBodyPatternAware(exchange, result.toString());
}
public MvelEndpoint findOrCreateEndpoint(String uri, String newResourceUri) {
diff --git a/components/camel-stringtemplate/src/main/java/org/apache/camel/component/stringtemplate/StringTemplateEndpoint.java b/components/camel-stringtemplate/src/main/java/org/apache/camel/component/stringtemplate/StringTemplateEndpoint.java
index c7005d4d266..29da186f221 100644
--- a/components/camel-stringtemplate/src/main/java/org/apache/camel/component/stringtemplate/StringTemplateEndpoint.java
+++ b/components/camel-stringtemplate/src/main/java/org/apache/camel/component/stringtemplate/StringTemplateEndpoint.java
@@ -23,7 +23,6 @@ import org.apache.camel.Category;
import org.apache.camel.Component;
import org.apache.camel.Exchange;
import org.apache.camel.ExchangePattern;
-import org.apache.camel.Message;
import org.apache.camel.component.ResourceEndpoint;
import org.apache.camel.spi.UriEndpoint;
import org.apache.camel.spi.UriParam;
@@ -154,9 +153,7 @@ public class StringTemplateEndpoint extends ResourceEndpoint {
stTemplate.write(new NoIndentWriter(buffer));
// now lets output the results to the exchange
- Message out = exchange.getOut();
- out.setBody(buffer.toString());
- out.setHeaders(exchange.getIn().getHeaders());
- out.setHeader(StringTemplateConstants.STRINGTEMPLATE_RESOURCE_URI, getResourceUri());
+ ExchangeHelper.setInOutBodyPatternAware(exchange, buffer.toString());
+ exchange.getMessage().setHeader(StringTemplateConstants.STRINGTEMPLATE_RESOURCE_URI, getResourceUri());
}
}
diff --git a/components/camel-velocity/src/main/java/org/apache/camel/component/velocity/VelocityEndpoint.java b/components/camel-velocity/src/main/java/org/apache/camel/component/velocity/VelocityEndpoint.java
index 46aa55c4ad2..64e09c102f5 100644
--- a/components/camel-velocity/src/main/java/org/apache/camel/component/velocity/VelocityEndpoint.java
+++ b/components/camel-velocity/src/main/java/org/apache/camel/component/velocity/VelocityEndpoint.java
@@ -27,7 +27,6 @@ import java.util.Properties;
import org.apache.camel.Category;
import org.apache.camel.Exchange;
import org.apache.camel.ExchangePattern;
-import org.apache.camel.Message;
import org.apache.camel.component.ResourceEndpoint;
import org.apache.camel.spi.UriEndpoint;
import org.apache.camel.spi.UriParam;
@@ -244,8 +243,6 @@ public class VelocityEndpoint extends ResourceEndpoint {
engine.evaluate(velocityContext, buffer, logTag, reader);
// now lets output the results to the exchange
- Message out = exchange.getMessage();
- out.setBody(buffer.toString());
- out.setHeaders(exchange.getIn().getHeaders());
+ ExchangeHelper.setInOutBodyPatternAware(exchange, buffer.toString());
}
}