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].