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

commit 64c64bf034361696aa60f77ca83678916de294db
Author: Claus Ibsen <claus.ib...@gmail.com>
AuthorDate: Fri Feb 18 16:04:30 2022 +0100

    CAMEL-17681: camel-stream: Should append new line to output in producer.
---
 .../camel/component/stream/StreamEndpointConfigurer.java    |  6 ++++++
 .../camel/component/stream/StreamEndpointUriFactory.java    |  3 ++-
 .../resources/org/apache/camel/component/stream/stream.json |  1 +
 .../org/apache/camel/component/stream/StreamEndpoint.java   | 13 +++++++++++++
 .../org/apache/camel/component/stream/StreamProducer.java   |  7 ++++++-
 .../org/apache/camel/component/stream/StreamHeaderTest.java |  2 +-
 ...ystemOutTest.java => StreamSystemOutNewLineOffTest.java} |  7 +++----
 .../apache/camel/component/stream/StreamSystemOutTest.java  |  2 +-
 .../modules/ROOT/pages/camel-3x-upgrade-guide-3_16.adoc     |  5 +++++
 9 files changed, 38 insertions(+), 8 deletions(-)

diff --git 
a/components/camel-stream/src/generated/java/org/apache/camel/component/stream/StreamEndpointConfigurer.java
 
b/components/camel-stream/src/generated/java/org/apache/camel/component/stream/StreamEndpointConfigurer.java
index fce8b44..1ba726b 100644
--- 
a/components/camel-stream/src/generated/java/org/apache/camel/component/stream/StreamEndpointConfigurer.java
+++ 
b/components/camel-stream/src/generated/java/org/apache/camel/component/stream/StreamEndpointConfigurer.java
@@ -21,6 +21,8 @@ public class StreamEndpointConfigurer extends 
PropertyConfigurerSupport implemen
     public boolean configure(CamelContext camelContext, Object obj, String 
name, Object value, boolean ignoreCase) {
         StreamEndpoint target = (StreamEndpoint) obj;
         switch (ignoreCase ? name.toLowerCase() : name) {
+        case "appendnewline":
+        case "appendNewLine": target.setAppendNewLine(property(camelContext, 
boolean.class, value)); return true;
         case "autoclosecount":
         case "autoCloseCount": target.setAutoCloseCount(property(camelContext, 
int.class, value)); return true;
         case "bridgeerrorhandler":
@@ -63,6 +65,8 @@ public class StreamEndpointConfigurer extends 
PropertyConfigurerSupport implemen
     @Override
     public Class<?> getOptionType(String name, boolean ignoreCase) {
         switch (ignoreCase ? name.toLowerCase() : name) {
+        case "appendnewline":
+        case "appendNewLine": return boolean.class;
         case "autoclosecount":
         case "autoCloseCount": return int.class;
         case "bridgeerrorhandler":
@@ -106,6 +110,8 @@ public class StreamEndpointConfigurer extends 
PropertyConfigurerSupport implemen
     public Object getOptionValue(Object obj, String name, boolean ignoreCase) {
         StreamEndpoint target = (StreamEndpoint) obj;
         switch (ignoreCase ? name.toLowerCase() : name) {
+        case "appendnewline":
+        case "appendNewLine": return target.isAppendNewLine();
         case "autoclosecount":
         case "autoCloseCount": return target.getAutoCloseCount();
         case "bridgeerrorhandler":
diff --git 
a/components/camel-stream/src/generated/java/org/apache/camel/component/stream/StreamEndpointUriFactory.java
 
b/components/camel-stream/src/generated/java/org/apache/camel/component/stream/StreamEndpointUriFactory.java
index a6b0b68..4336edf 100644
--- 
a/components/camel-stream/src/generated/java/org/apache/camel/component/stream/StreamEndpointUriFactory.java
+++ 
b/components/camel-stream/src/generated/java/org/apache/camel/component/stream/StreamEndpointUriFactory.java
@@ -21,12 +21,13 @@ public class StreamEndpointUriFactory extends 
org.apache.camel.support.component
     private static final Set<String> SECRET_PROPERTY_NAMES;
     private static final Set<String> MULTI_VALUE_PREFIXES;
     static {
-        Set<String> props = new HashSet<>(20);
+        Set<String> props = new HashSet<>(21);
         props.add("groupLines");
         props.add("fileName");
         props.add("kind");
         props.add("exchangePattern");
         props.add("fileWatcher");
+        props.add("appendNewLine");
         props.add("closeOnDone");
         props.add("encoding");
         props.add("initialPromptDelay");
diff --git 
a/components/camel-stream/src/generated/resources/org/apache/camel/component/stream/stream.json
 
b/components/camel-stream/src/generated/resources/org/apache/camel/component/stream/stream.json
index 217f6eb..537301b 100644
--- 
a/components/camel-stream/src/generated/resources/org/apache/camel/component/stream/stream.json
+++ 
b/components/camel-stream/src/generated/resources/org/apache/camel/component/stream/stream.json
@@ -42,6 +42,7 @@
     "scanStreamDelay": { "kind": "parameter", "displayName": "Scan Stream 
Delay", "group": "consumer", "label": "consumer", "required": false, "type": 
"integer", "javaType": "long", "deprecated": false, "autowired": false, 
"secret": false, "description": "Delay in milliseconds between read attempts 
when using scanStream." },
     "exceptionHandler": { "kind": "parameter", "displayName": "Exception 
Handler", "group": "consumer (advanced)", "label": "consumer,advanced", 
"required": false, "type": "object", "javaType": 
"org.apache.camel.spi.ExceptionHandler", "optionalPrefix": "consumer.", 
"deprecated": false, "autowired": false, "secret": false, "description": "To 
let the consumer use a custom ExceptionHandler. Notice if the option 
bridgeErrorHandler is enabled then this option is not in use. By default the 
con [...]
     "exchangePattern": { "kind": "parameter", "displayName": "Exchange 
Pattern", "group": "consumer (advanced)", "label": "consumer,advanced", 
"required": false, "type": "object", "javaType": 
"org.apache.camel.ExchangePattern", "enum": [ "InOnly", "InOut", 
"InOptionalOut" ], "deprecated": false, "autowired": false, "secret": false, 
"description": "Sets the exchange pattern when the consumer creates an 
exchange." },
+    "appendNewLine": { "kind": "parameter", "displayName": "Append New Line", 
"group": "producer", "label": "producer", "required": false, "type": "boolean", 
"javaType": "boolean", "deprecated": false, "autowired": false, "secret": 
false, "defaultValue": true, "description": "Whether to append a new line 
character at end of output." },
     "autoCloseCount": { "kind": "parameter", "displayName": "Auto Close 
Count", "group": "producer", "label": "producer", "required": false, "type": 
"integer", "javaType": "int", "deprecated": false, "autowired": false, 
"secret": false, "description": "Number of messages to process before closing 
stream on Producer side. Never close stream by default (only when Producer is 
stopped). If more messages are sent, the stream is reopened for another 
autoCloseCount batch." },
     "closeOnDone": { "kind": "parameter", "displayName": "Close On Done", 
"group": "producer", "label": "producer", "required": false, "type": "boolean", 
"javaType": "boolean", "deprecated": false, "autowired": false, "secret": 
false, "defaultValue": false, "description": "This option is used in 
combination with Splitter and streaming to the same file. The idea is to keep 
the stream open and only close when the Splitter is done, to improve 
performance. Mind this requires that you only st [...]
     "delay": { "kind": "parameter", "displayName": "Delay", "group": 
"producer", "label": "producer", "required": false, "type": "integer", 
"javaType": "long", "deprecated": false, "autowired": false, "secret": false, 
"description": "Initial delay in milliseconds before producing the stream." },
diff --git 
a/components/camel-stream/src/main/java/org/apache/camel/component/stream/StreamEndpoint.java
 
b/components/camel-stream/src/main/java/org/apache/camel/component/stream/StreamEndpoint.java
index 8a3a675..3129cf5 100644
--- 
a/components/camel-stream/src/main/java/org/apache/camel/component/stream/StreamEndpoint.java
+++ 
b/components/camel-stream/src/main/java/org/apache/camel/component/stream/StreamEndpoint.java
@@ -69,6 +69,8 @@ public class StreamEndpoint extends DefaultEndpoint {
     private long initialPromptDelay = 2000;
     @UriParam(label = "consumer")
     private int groupLines;
+    @UriParam(label = "producer", defaultValue = "true")
+    private boolean appendNewLine = true;
     @UriParam(label = "producer")
     private int autoCloseCount;
     @UriParam(label = "consumer")
@@ -272,6 +274,17 @@ public class StreamEndpoint extends DefaultEndpoint {
         this.autoCloseCount = autoCloseCount;
     }
 
+    public boolean isAppendNewLine() {
+        return appendNewLine;
+    }
+
+    /**
+     * Whether to append a new line character at end of output.
+     */
+    public void setAppendNewLine(boolean appendNewLine) {
+        this.appendNewLine = appendNewLine;
+    }
+
     public Charset getCharset() {
         return charset;
     }
diff --git 
a/components/camel-stream/src/main/java/org/apache/camel/component/stream/StreamProducer.java
 
b/components/camel-stream/src/main/java/org/apache/camel/component/stream/StreamProducer.java
index 3f1f18a..c52dc82 100644
--- 
a/components/camel-stream/src/main/java/org/apache/camel/component/stream/StreamProducer.java
+++ 
b/components/camel-stream/src/main/java/org/apache/camel/component/stream/StreamProducer.java
@@ -120,6 +120,9 @@ public class StreamProducer extends DefaultProducer {
             if (bytes != null) {
                 LOG.debug("Writing as byte[]: {} to {}", bytes, outputStream);
                 outputStream.write(bytes);
+                if (endpoint.isAppendNewLine()) {
+                    outputStream.write(System.lineSeparator().getBytes());
+                }
                 return;
             }
         }
@@ -133,7 +136,9 @@ public class StreamProducer extends DefaultProducer {
             LOG.debug("Writing as text: {} to {} using encoding: {}", body, 
outputStream, charset);
         }
         bw.write(s);
-        bw.write(System.lineSeparator());
+        if (endpoint.isAppendNewLine()) {
+            bw.write(System.lineSeparator());
+        }
         bw.flush();
     }
 
diff --git 
a/components/camel-stream/src/test/java/org/apache/camel/component/stream/StreamHeaderTest.java
 
b/components/camel-stream/src/test/java/org/apache/camel/component/stream/StreamHeaderTest.java
index 1e06fae..88891f8 100644
--- 
a/components/camel-stream/src/test/java/org/apache/camel/component/stream/StreamHeaderTest.java
+++ 
b/components/camel-stream/src/test/java/org/apache/camel/component/stream/StreamHeaderTest.java
@@ -46,7 +46,7 @@ public class StreamHeaderTest extends CamelTestSupport {
     public void testBinaryContent() {
         template.sendBody("direct:in", "Hello".getBytes());
         // StreamProducer is in binary mode so no \n is appended
-        assertEquals("Hello", sb.toString());
+        assertEquals("Hello" + LS, sb.toString());
     }
 
     @Override
diff --git 
a/components/camel-stream/src/test/java/org/apache/camel/component/stream/StreamSystemOutTest.java
 
b/components/camel-stream/src/test/java/org/apache/camel/component/stream/StreamSystemOutNewLineOffTest.java
similarity index 90%
copy from 
components/camel-stream/src/test/java/org/apache/camel/component/stream/StreamSystemOutTest.java
copy to 
components/camel-stream/src/test/java/org/apache/camel/component/stream/StreamSystemOutNewLineOffTest.java
index d502a91..24b376a4 100644
--- 
a/components/camel-stream/src/test/java/org/apache/camel/component/stream/StreamSystemOutTest.java
+++ 
b/components/camel-stream/src/test/java/org/apache/camel/component/stream/StreamSystemOutNewLineOffTest.java
@@ -23,13 +23,12 @@ import org.apache.camel.builder.RouteBuilder;
 import org.apache.camel.test.junit5.CamelTestSupport;
 import org.junit.jupiter.api.Test;
 
-import static org.apache.camel.component.stream.StreamGroupLinesTest.LS;
 import static org.junit.jupiter.api.Assertions.assertEquals;
 
 /**
  * Unit test for System.out
  */
-public class StreamSystemOutTest extends CamelTestSupport {
+public class StreamSystemOutNewLineOffTest extends CamelTestSupport {
 
     String message = "Hello World";
 
@@ -48,7 +47,7 @@ public class StreamSystemOutTest extends CamelTestSupport {
             template.sendBody("direct:in", message);
 
             // Then
-            assertEquals(message + LS, new String(mockOut.toByteArray()));
+            assertEquals(message, new String(mockOut.toByteArray()));
         } finally {
             System.setOut(stdOut);
         }
@@ -90,7 +89,7 @@ public class StreamSystemOutTest extends CamelTestSupport {
     protected RouteBuilder createRouteBuilder() {
         return new RouteBuilder() {
             public void configure() {
-                from("direct:in").to("stream:out");
+                from("direct:in").to("stream:out?appendNewLine=false");
             }
         };
     }
diff --git 
a/components/camel-stream/src/test/java/org/apache/camel/component/stream/StreamSystemOutTest.java
 
b/components/camel-stream/src/test/java/org/apache/camel/component/stream/StreamSystemOutTest.java
index d502a91..99aac3e 100644
--- 
a/components/camel-stream/src/test/java/org/apache/camel/component/stream/StreamSystemOutTest.java
+++ 
b/components/camel-stream/src/test/java/org/apache/camel/component/stream/StreamSystemOutTest.java
@@ -64,7 +64,7 @@ public class StreamSystemOutTest extends CamelTestSupport {
             template.sendBody("direct:in", message.getBytes());
 
             // Then
-            assertEquals(message, new String(mockOut.toByteArray()));
+            assertEquals(message + LS, new String(mockOut.toByteArray()));
         } finally {
             System.setOut(stdOut);
         }
diff --git 
a/docs/user-manual/modules/ROOT/pages/camel-3x-upgrade-guide-3_16.adoc 
b/docs/user-manual/modules/ROOT/pages/camel-3x-upgrade-guide-3_16.adoc
index 5b6676f..5c32eda 100644
--- a/docs/user-manual/modules/ROOT/pages/camel-3x-upgrade-guide-3_16.adoc
+++ b/docs/user-manual/modules/ROOT/pages/camel-3x-upgrade-guide-3_16.adoc
@@ -166,6 +166,11 @@ and the `configure` method now takes a `CamelContext` as 
argument.
 
 The option `baseURI` is renamed to `baseUri`.
 
+=== camel-stream
+
+The producer will now by default append new line character to end of output.
+The option `appendNewLine` can be used to turn this off.
+
 === camel-testcontainers
 
 This component was deprecated and is removed on this version. Users should 
migrate to xref:test-infra.adoc[camel-test-infra].

Reply via email to