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 9e2815f303e6c40b42bd5ab9bfae5e6041cf4417 Author: Claus Ibsen <[email protected]> AuthorDate: Mon Sep 20 13:17:40 2021 +0200 CAMEL-16987: camel-csv - Allow to configurer header in endpoint uri via dataformat component --- .../dataformat/csv/CsvDataFormatConfigurer.java | 2 +- .../apache/camel/dataformat/csv/CsvDataFormat.java | 33 ++++++++++++----- .../apache/camel/dataformat/csv/CsvMarshaller.java | 7 ++-- .../camel/dataformat/csv/CsvDataFormatTest.java | 6 ++-- .../camel/dataformat/csv/CsvMarshalHeaderTest.java | 6 ++-- .../dataformat/csv/CsvMarshalHeaderUriTest.java | 41 ++++++++++++++++++++++ .../reifier/dataformat/CsvDataFormatReifier.java | 13 ++++++- 7 files changed, 88 insertions(+), 20 deletions(-) diff --git a/components/camel-csv/src/generated/java/org/apache/camel/dataformat/csv/CsvDataFormatConfigurer.java b/components/camel-csv/src/generated/java/org/apache/camel/dataformat/csv/CsvDataFormatConfigurer.java index afa6beb..a4be878 100644 --- a/components/camel-csv/src/generated/java/org/apache/camel/dataformat/csv/CsvDataFormatConfigurer.java +++ b/components/camel-csv/src/generated/java/org/apache/camel/dataformat/csv/CsvDataFormatConfigurer.java @@ -28,7 +28,7 @@ public class CsvDataFormatConfigurer extends PropertyConfigurerSupport implement case "escape": dataformat.setEscape(property(camelContext, java.lang.Character.class, value)); return true; case "headerdisabled": case "headerDisabled": dataformat.setHeaderDisabled(property(camelContext, boolean.class, value)); return true; - case "header": dataformat.setHeader(property(camelContext, java.lang.String[].class, value)); return true; + case "header": dataformat.setHeader(property(camelContext, java.lang.String.class, value)); return true; case "allowmissingcolumnnames": case "allowMissingColumnNames": dataformat.setAllowMissingColumnNames(property(camelContext, java.lang.Boolean.class, value)); return true; case "ignoreemptylines": diff --git a/components/camel-csv/src/main/java/org/apache/camel/dataformat/csv/CsvDataFormat.java b/components/camel-csv/src/main/java/org/apache/camel/dataformat/csv/CsvDataFormat.java index 7ac65ba..2391626 100644 --- a/components/camel-csv/src/main/java/org/apache/camel/dataformat/csv/CsvDataFormat.java +++ b/components/camel-csv/src/main/java/org/apache/camel/dataformat/csv/CsvDataFormat.java @@ -18,7 +18,7 @@ package org.apache.camel.dataformat.csv; import java.io.InputStream; import java.io.OutputStream; -import java.util.Arrays; +import java.util.StringJoiner; import org.apache.camel.Exchange; import org.apache.camel.spi.DataFormat; @@ -45,7 +45,7 @@ public class CsvDataFormat extends ServiceSupport implements DataFormat, DataFor private boolean escapeDisabled; private Character escape; private boolean headerDisabled; - private String[] header; + private String header; private Boolean allowMissingColumnNames; private Boolean ignoreEmptyLines; private Boolean ignoreSurroundingSpaces; @@ -129,7 +129,11 @@ public class CsvDataFormat extends ServiceSupport implements DataFormat, DataFor if (headerDisabled) { answer = answer.withHeader((String[]) null); // null disables the header } else if (header != null) { - answer = answer.withHeader(header); + if (header.indexOf(',') != -1) { + answer = answer.withHeader(header.split(",")); + } else { + answer = answer.withHeader(header); + } } if (allowMissingColumnNames != null) { @@ -386,25 +390,36 @@ public class CsvDataFormat extends ServiceSupport implements DataFormat, DataFor } /** - * Gets the header. If {@code null} then the default one of the format used. If empty then it will be automatically - * handled. + * Gets the header. Multiple values can be separated by comma. + * + * If {@code null} then the default one of the format used. If empty then it will be automatically handled. * * @return Header */ - public String[] getHeader() { + public String getHeader() { return header; } /** - * Gets the header. If {@code null} then the default one of the format used. If empty then it will be automatically - * handled. + * Gets the header. Multiple values can be separated by comma. + * + * If {@code null} then the default one of the format used. If empty then it will be automatically handled. * * @param header Header * @return Current {@code CsvDataFormat}, fluent API * @see org.apache.commons.csv.CSVFormat#withHeader(String...) */ + public CsvDataFormat setHeader(String header) { + this.header = header; + return this; + } + public CsvDataFormat setHeader(String[] header) { - this.header = Arrays.copyOf(header, header.length); + StringJoiner sj = new StringJoiner(","); + for (String s : header) { + sj.add(s); + } + this.header = sj.toString(); return this; } diff --git a/components/camel-csv/src/main/java/org/apache/camel/dataformat/csv/CsvMarshaller.java b/components/camel-csv/src/main/java/org/apache/camel/dataformat/csv/CsvMarshaller.java index 1810ec1..4a974ad 100644 --- a/components/camel-csv/src/main/java/org/apache/camel/dataformat/csv/CsvMarshaller.java +++ b/components/camel-csv/src/main/java/org/apache/camel/dataformat/csv/CsvMarshaller.java @@ -58,9 +58,10 @@ public abstract class CsvMarshaller { format = format.withHeader((String[]) null); } - String[] fixedColumns = dataFormat.getHeader(); - if (fixedColumns != null && fixedColumns.length > 0) { - return new FixedColumnsMarshaller(format, fixedColumns); + String header = dataFormat.getHeader(); + if (header != null) { + String[] columns = header.split(","); + return new FixedColumnsMarshaller(format, columns); } return new DynamicColumnsMarshaller(format); } diff --git a/components/camel-csv/src/test/java/org/apache/camel/dataformat/csv/CsvDataFormatTest.java b/components/camel-csv/src/test/java/org/apache/camel/dataformat/csv/CsvDataFormatTest.java index 35fa6c6..eadf60f 100644 --- a/components/camel-csv/src/test/java/org/apache/camel/dataformat/csv/CsvDataFormatTest.java +++ b/components/camel-csv/src/test/java/org/apache/camel/dataformat/csv/CsvDataFormatTest.java @@ -170,7 +170,7 @@ public class CsvDataFormatTest { // Properly saved assertSame(CSVFormat.DEFAULT, dataFormat.getFormat()); assertTrue(dataFormat.isHeaderDisabled()); - assertArrayEquals(new String[] { "a", "b", "c" }, dataFormat.getHeader()); + assertEquals("a,b,c", dataFormat.getHeader()); // Properly used assertNull(dataFormat.getActiveFormat().getHeader()); @@ -179,11 +179,11 @@ public class CsvDataFormatTest { @Test void shouldOverrideHeader() { CsvDataFormat dataFormat = new CsvDataFormat() - .setHeader(new String[] { "a", "b", "c" }); + .setHeader("a,b,c"); // Properly saved assertSame(CSVFormat.DEFAULT, dataFormat.getFormat()); - assertArrayEquals(new String[] { "a", "b", "c" }, dataFormat.getHeader()); + assertEquals("a,b,c", dataFormat.getHeader()); // Properly used assertArrayEquals(new String[] { "a", "b", "c" }, dataFormat.getActiveFormat().getHeader()); diff --git a/components/camel-csv/src/test/java/org/apache/camel/dataformat/csv/CsvMarshalHeaderTest.java b/components/camel-csv/src/test/java/org/apache/camel/dataformat/csv/CsvMarshalHeaderTest.java index 71897c7..ad26715 100644 --- a/components/camel-csv/src/test/java/org/apache/camel/dataformat/csv/CsvMarshalHeaderTest.java +++ b/components/camel-csv/src/test/java/org/apache/camel/dataformat/csv/CsvMarshalHeaderTest.java @@ -44,12 +44,12 @@ import static org.junit.jupiter.api.Assertions.assertEquals; public class CsvMarshalHeaderTest extends CamelTestSupport { @TempDir - public File folder; + File folder; @Produce("direct:start") - private ProducerTemplate producerTemplate; + ProducerTemplate producerTemplate; - private File outputFile; + File outputFile; @Override protected void doPreSetup() throws Exception { diff --git a/components/camel-csv/src/test/java/org/apache/camel/dataformat/csv/CsvMarshalHeaderUriTest.java b/components/camel-csv/src/test/java/org/apache/camel/dataformat/csv/CsvMarshalHeaderUriTest.java new file mode 100644 index 0000000..9296968 --- /dev/null +++ b/components/camel-csv/src/test/java/org/apache/camel/dataformat/csv/CsvMarshalHeaderUriTest.java @@ -0,0 +1,41 @@ +/* + * 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.dataformat.csv; + +import org.apache.camel.RoutesBuilder; +import org.apache.camel.builder.RouteBuilder; + +/** + * <b>Camel</b> based test cases for {@link CsvDataFormat}. + */ +public class CsvMarshalHeaderUriTest extends CsvMarshalHeaderTest { + + @Override + protected RoutesBuilder createRouteBuilder() { + return new RouteBuilder() { + @Override + public void configure() { + String uri + = String.format("file:%s?charset=utf-8&fileExist=Append", outputFile.getParentFile().getAbsolutePath()); + from("direct:start") + .to("dataformat:csv:marshal?header=first_name,last_name&trim=true&ignoreSurroundingSpaces=true") + .to(uri); + } + }; + } + +} diff --git a/core/camel-core-reifier/src/main/java/org/apache/camel/reifier/dataformat/CsvDataFormatReifier.java b/core/camel-core-reifier/src/main/java/org/apache/camel/reifier/dataformat/CsvDataFormatReifier.java index 1554efb..bb79546 100644 --- a/core/camel-core-reifier/src/main/java/org/apache/camel/reifier/dataformat/CsvDataFormatReifier.java +++ b/core/camel-core-reifier/src/main/java/org/apache/camel/reifier/dataformat/CsvDataFormatReifier.java @@ -17,6 +17,7 @@ package org.apache.camel.reifier.dataformat; import java.util.Map; +import java.util.StringJoiner; import org.apache.camel.CamelContext; import org.apache.camel.model.DataFormatDefinition; @@ -38,7 +39,17 @@ public class CsvDataFormatReifier extends DataFormatReifier<CsvDataFormat> { properties.put("escapeDisabled", definition.getEscapeDisabled()); properties.put("escape", definition.getEscape()); properties.put("headerDisabled", definition.getHeaderDisabled()); - properties.put("header", definition.getHeader()); + // in the model header is a List<String> however it should ideally have + // just been a comma separated String so its configurable in uris + // so we join the List into a String in the reifier so the configurer can + // use the value as-is + if (definition.getHeader() != null && !definition.getHeader().isEmpty()) { + StringJoiner sj = new StringJoiner(","); + for (String s : definition.getHeader()) { + sj.add(s); + } + properties.put("header", sj.toString()); + } properties.put("allowMissingColumnNames", definition.getAllowMissingColumnNames()); properties.put("ignoreEmptyLines", definition.getIgnoreEmptyLines()); properties.put("ignoreSurroundingSpaces", definition.getIgnoreSurroundingSpaces());
