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());
     }
 }