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 72634d22720 fix: allow byte array in body to be processed in Smooks 
component (#16147)
72634d22720 is described below

commit 72634d22720335bf5610b6af8ad8ca4d0658dba6
Author: cjmamo <[email protected]>
AuthorDate: Sat Nov 9 08:40:07 2024 +0100

    fix: allow byte array in body to be processed in Smooks component (#16147)
    
    require body to be source
---
 .../camel/component/smooks/SmooksProcessor.java    | 24 ++++++++------
 .../component/smooks/SmooksProcessorTest.java      | 37 +++++++++++++++++++---
 2 files changed, 47 insertions(+), 14 deletions(-)

diff --git 
a/components/camel-smooks/src/main/java/org/apache/camel/component/smooks/SmooksProcessor.java
 
b/components/camel-smooks/src/main/java/org/apache/camel/component/smooks/SmooksProcessor.java
index 605ac7f78aa..efab7f17602 100644
--- 
a/components/camel-smooks/src/main/java/org/apache/camel/component/smooks/SmooksProcessor.java
+++ 
b/components/camel-smooks/src/main/java/org/apache/camel/component/smooks/SmooksProcessor.java
@@ -39,6 +39,7 @@ import org.xml.sax.SAXException;
 import org.apache.camel.CamelContext;
 import org.apache.camel.CamelContextAware;
 import org.apache.camel.Exchange;
+import org.apache.camel.InvalidPayloadException;
 import org.apache.camel.Message;
 import org.apache.camel.Processor;
 import org.apache.camel.RuntimeCamelException;
@@ -63,6 +64,7 @@ import org.smooks.engine.lookup.ExportsLookup;
 import org.smooks.engine.report.HtmlReportGenerator;
 import org.smooks.io.payload.Exports;
 import org.smooks.io.sink.StreamSink;
+import org.smooks.io.source.ByteSource;
 import org.smooks.io.source.DOMSource;
 import org.smooks.io.source.ReaderSource;
 import org.smooks.io.source.StreamSource;
@@ -147,7 +149,7 @@ public class SmooksProcessor extends ServiceSupport 
implements Processor, CamelC
                         new StreamSink<>(outputStreamBuilder));
                 exchange.getMessage().setBody(outputStreamBuilder.build());
             }
-        } catch (IOException e) {
+        } catch (IOException | InvalidPayloadException e) {
             throw new RuntimeCamelException(e);
         } finally {
             executionContext.remove(EXCHANGE_TYPED_KEY);
@@ -177,17 +179,17 @@ public class SmooksProcessor extends ServiceSupport 
implements Processor, CamelC
         }
     }
 
-    private Source getSource(final Exchange exchange) {
-        Object payload = exchange.getIn().getBody();
-
-        if (payload instanceof SAXSource) {
-            return new ReaderSource<>((Reader) ((SAXSource) 
payload).getXMLReader());
-        }
+    private Source getSource(final Exchange exchange) throws 
InvalidPayloadException {
+        final Object payload = exchange.getIn().getBody();
 
         if (payload instanceof Source) {
             return (Source) payload;
         }
 
+        if (payload instanceof byte[]) {
+            return new ByteSource((byte[]) payload);
+        }
+
         if (payload instanceof Node) {
             return new DOMSource((Node) payload);
         }
@@ -201,7 +203,7 @@ public class SmooksProcessor extends ServiceSupport 
implements Processor, CamelC
         }
 
         if (payload instanceof WrappedFile) {
-            String systemId
+            final String systemId
                     = new javax.xml.transform.stream.StreamSource((File) 
exchange.getIn().getBody(WrappedFile.class).getFile())
                             .getSystemId();
             try {
@@ -211,7 +213,11 @@ public class SmooksProcessor extends ServiceSupport 
implements Processor, CamelC
             }
         }
 
-        return exchange.getIn().getBody(Source.class);
+        if (payload instanceof SAXSource) {
+            return new ReaderSource<>((Reader) ((SAXSource) 
payload).getXMLReader());
+        }
+
+        return exchange.getIn().getMandatoryBody(Source.class);
     }
 
     public String getSmooksConfig() {
diff --git 
a/components/camel-smooks/src/test/java/org/apache/camel/component/smooks/SmooksProcessorTest.java
 
b/components/camel-smooks/src/test/java/org/apache/camel/component/smooks/SmooksProcessorTest.java
index 79cd2633780..562560d3982 100644
--- 
a/components/camel-smooks/src/test/java/org/apache/camel/component/smooks/SmooksProcessorTest.java
+++ 
b/components/camel-smooks/src/test/java/org/apache/camel/component/smooks/SmooksProcessorTest.java
@@ -29,6 +29,7 @@ import jakarta.activation.DataSource;
 
 import org.apache.camel.EndpointInject;
 import org.apache.camel.Exchange;
+import org.apache.camel.InvalidPayloadException;
 import org.apache.camel.Processor;
 import org.apache.camel.attachment.AttachmentMessage;
 import org.apache.camel.builder.RouteBuilder;
@@ -62,6 +63,7 @@ import static org.junit.jupiter.api.Assertions.assertEquals;
 import static org.junit.jupiter.api.Assertions.assertFalse;
 import static org.junit.jupiter.api.Assertions.assertNotEquals;
 import static org.junit.jupiter.api.Assertions.assertNotNull;
+import static org.junit.jupiter.api.Assertions.assertThrows;
 import static org.junit.jupiter.api.Assertions.assertTrue;
 
 public class SmooksProcessorTest extends CamelTestSupport {
@@ -79,6 +81,10 @@ public class SmooksProcessorTest extends CamelTestSupport {
         result.expectedMessageCount(1);
         template.sendBody("direct://input", getOrderEdi());
 
+        assertPostCondition();
+    }
+
+    private void assertPostCondition() throws InterruptedException, 
IOException {
         assertIsSatisfied();
 
         Exchange exchange = result.assertExchangeReceived(0);
@@ -242,7 +248,28 @@ public class SmooksProcessorTest extends CamelTestSupport {
     }
 
     @Test
-    public void testProcessGivenFileWhenSmooksExportIsStringResult() throws 
Exception {
+    public void testProcessWhenBodyIsByteArray() throws Exception {
+        context.addRoutes(createEdiToXmlRouteBuilder());
+        context.start();
+
+        result.expectedMessageCount(1);
+        template.sendBody("direct://input", getOrderEdi().getBytes());
+
+        assertPostCondition();
+    }
+
+    @Test
+    public void testProcessWhenBodyIsNotSource() throws Exception {
+        context.addRoutes(createEdiToXmlRouteBuilder());
+        context.start();
+
+        RuntimeException runtimeException
+                = assertThrows(RuntimeException.class, () -> 
template.sendBody("direct://input", new Object()));
+        assertEquals(InvalidPayloadException.class, 
runtimeException.getCause().getCause().getClass());
+    }
+
+    @Test
+    public void testProcessWhenBodyIsFileAndSmooksExportIsStringSink() throws 
Exception {
         deleteDirectory("target/smooks");
         context.addRoutes(new RouteBuilder() {
             public void configure() {
@@ -263,7 +290,7 @@ public class SmooksProcessorTest extends CamelTestSupport {
     }
 
     @Test
-    public void 
testProcessWhenSmooksExportIsJavaResultAndBodyIsVisitedByJavaBeanValue() throws 
Exception {
+    public void 
testProcessWhenSmooksExportIsJavaSinkAndBodyIsVisitedByJavaBeanValue() throws 
Exception {
         Smooks smooks = new Smooks().setExports(new Exports(JavaSink.class));
         context.addRoutes(new RouteBuilder() {
             @Override
@@ -282,7 +309,7 @@ public class SmooksProcessorTest extends CamelTestSupport {
     }
 
     @Test
-    public void 
testProcessWhenSmooksExportIsJavaResultAndBodyIsVisitedByMultipleJavaBeanValues()
 throws Exception {
+    public void 
testProcessWhenSmooksExportIsJavaSinkAndBodyIsVisitedByMultipleJavaBeanValues() 
throws Exception {
         Smooks smooks = new Smooks().setExports(new Exports(JavaSink.class));
         context.addRoutes(new RouteBuilder() {
             @Override
@@ -303,7 +330,7 @@ public class SmooksProcessorTest extends CamelTestSupport {
     }
 
     @Test
-    public void 
testProcessWhenSmooksExportIsJavaResultAndBodyIsVisitedByBean() throws 
Exception {
+    public void testProcessWhenSmooksExportIsJavaSinkAndBodyIsVisitedByBean() 
throws Exception {
         Smooks smooks = new Smooks().setExports(new Exports(JavaSink.class));
         context.addRoutes(new RouteBuilder() {
             @Override
@@ -324,7 +351,7 @@ public class SmooksProcessorTest extends CamelTestSupport {
     }
 
     @Test
-    public void testProcessWhenSmooksExportIsStringResult() throws Exception {
+    public void testProcessWhenSmooksExportIsStringSink() throws Exception {
         context.addRoutes(new RouteBuilder() {
             public void configure() {
                 from("direct:a")

Reply via email to