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

Reply via email to