This is an automated email from the ASF dual-hosted git repository.

sgoeschl pushed a commit to branch FREEMARKER-146
in repository https://gitbox.apache.org/repos/asf/freemarker-generator.git


The following commit(s) were added to refs/heads/FREEMARKER-146 by this push:
     new 3903694  FREEMARKER-146 Cleanly separate example templates and data 
from user-supplied content
3903694 is described below

commit 39036942982696dc518053ed40053074e3df5ce4
Author: Siegfried Goeschl <[email protected]>
AuthorDate: Tue Jun 23 19:48:05 2020 +0200

    FREEMARKER-146 Cleanly separate example templates and data from 
user-supplied content
---
 CHANGELOG.md                                       |  4 +-
 freemarker-generator-cli/README.md                 |  2 +-
 .../examples/templates/dataframe/example.ftl       | 16 ++++-
 .../examples/templates/excel/csv/custom.ftl        |  4 +-
 freemarker-generator-cli/run-examples.sh           |  2 +-
 .../src/main/scripts/run-examples.sh               |  2 +-
 .../freemarker/generator/cli/ExamplesTest.java     |  2 +-
 .../freemarker/generator/cli/ManualTest.java       |  4 +-
 .../templates/csv/csv/transform.ftl                | 41 +++++++----
 .../templates/csv/html/transform.ftl               | 17 +++--
 .../templates/csv/md/transform.ftl                 | 31 +++++---
 .../templates/excel/csv/transform.ftl              | 17 +++--
 .../tools/commonscsv/CommonsCSVPrinterFacade.java  | 84 ++++++++++++++++++++++
 .../generator/tools/commonscsv/CommonsCSVTool.java | 77 +++-----------------
 .../tools/commonscsv/CommonsCSVToolTest.java       | 10 +--
 15 files changed, 195 insertions(+), 118 deletions(-)

diff --git a/CHANGELOG.md b/CHANGELOG.md
index 045191a..2d33b61 100644
--- a/CHANGELOG.md
+++ b/CHANGELOG.md
@@ -16,6 +16,7 @@ All notable changes to this project will be documented in 
this file. We try to a
 * [FREEMARKER-129] Migrate `freemarker-cli` into `freemarker-generator` 
project (see 
[https://github.com/sgoeschl/freemarker-cli](https://github.com/sgoeschl/freemarker-cli))
 
 ### Changed
+* [FREEMARKER-146] Cleanly separate example templates and data from 
user-supplied content
 * `DataSource` use `uri` instead of `location`
 * [FREEMARKER-138] freemarker-generator: Rename `Datasource` to `DataSource`
 * [FREEMARKER-136] Fix broken `site:stage` build
@@ -40,4 +41,5 @@ All notable changes to this project will be documented in 
this file. We try to a
 [FREEMARKER-138]: https://issues.apache.org/jira/browse/FREEMARKER-138
 [FREEMARKER-139]: https://issues.apache.org/jira/browse/FREEMARKER-139
 [FREEMARKER-142]: https://issues.apache.org/jira/browse/FREEMARKER-142
-[FREEMARKER-144]: https://issues.apache.org/jira/browse/FREEMARKER-144
\ No newline at end of file
+[FREEMARKER-144]: https://issues.apache.org/jira/browse/FREEMARKER-144
+[FREEMARKER-146]: https://issues.apache.org/jira/browse/FREEMARKER-146
\ No newline at end of file
diff --git a/freemarker-generator-cli/README.md 
b/freemarker-generator-cli/README.md
index b8b7d2a..168b8fc 100644
--- a/freemarker-generator-cli/README.md
+++ b/freemarker-generator-cli/README.md
@@ -894,7 +894,7 @@ While this looks small and tidy there are some nifty 
features
 
 Sometimes you have a CSV file which is not quite right - you need to change 
the format. Lets have a look how `freemarker-cli` can help
 
-> bin/freemarker-cli -DCVS_IN_DELIMITER=COMMA -DCSV_OUT_DELIMITER=PIPE -t 
templates/csv/csv/transform.ftl ./examples/data/csv/contract.csv 
+> bin/freemarker-cli -PCVS_IN_DELIMITER=COMMA -PCSV_OUT_DELIMITER=PIPE -t 
templates/csv/csv/transform.ftl ./examples/data/csv/contract.csv 
 
 renders the following template
 
diff --git a/freemarker-generator-cli/examples/templates/dataframe/example.ftl 
b/freemarker-generator-cli/examples/templates/dataframe/example.ftl
index 54d0ac2..16c6a51 100644
--- a/freemarker-generator-cli/examples/templates/dataframe/example.ftl
+++ b/freemarker-generator-cli/examples/templates/dataframe/example.ftl
@@ -15,7 +15,8 @@
   specific language governing permissions and limitations
   under the License.
 -->
-<#assign csvParser = CSVTool.parse(DataSources.get(0))>
+<#assign dataSource = DataSources.get(0)>
+<#assign csvParser = CSVTool.parse(dataSource, csvInFormat())>
 <#assign users = DataFrameTool.fromCSVParser(csvParser)>
 
 Original Data
@@ -44,5 +45,14 @@ 
${DataFrameTool.print(users.getColumn("country").transform(DataFrameTool.transfo
 Group By Age & Country
 =============================================================================
 ${DataFrameTool.print(users.groupBy("country", "age").sort("country"))}
-
-
+<#--------------------------------------------------------------------------->
+<#function csvInFormat>
+    <#assign format = CSVTool.formats[CSV_IN_FORMAT!"DEFAULT"]>
+    <#assign delimiter = 
CSVTool.toDelimiter(CSV_IN_DELIMITER!format.getDelimiter())>
+    <#assign withHeader = CSV_IN_WITH_HEADER!"false">
+    <#assign format = format.withDelimiter(delimiter)>
+    <#if withHeader?boolean>
+        <#assign format = format.withHeader()>
+    </#if>
+    <#return format>
+</#function>
diff --git a/freemarker-generator-cli/examples/templates/excel/csv/custom.ftl 
b/freemarker-generator-cli/examples/templates/excel/csv/custom.ftl
index a045bd3..d73623b 100644
--- a/freemarker-generator-cli/examples/templates/excel/csv/custom.ftl
+++ b/freemarker-generator-cli/examples/templates/excel/csv/custom.ftl
@@ -15,7 +15,7 @@
   specific language governing permissions and limitations
   under the License.
 -->
-<#assign format = CVS_FORMAT!"DEFAULT">
+<#assign format = CSV_OUT_FORMAT!"DEFAULT">
 <#assign salt = SystemTool.parameters["salt"]!"salt">
 <#-- Parse the first data source & sheet of the Excel document -->
 <#assign workbook = ExcelTool.parse(DataSources.get(0))>
@@ -23,7 +23,7 @@
 <#assign records = ExcelTool.toTable(sheet)>
 <#-- Setup CSVPrinter  -->
 <#assign cvsFormat = CSVTool.formats[format]>
-<#assign csvPrinter = CSVTool.printer(cvsFormat, SystemTool.writer)>
+<#assign csvPrinter = CSVTool.printer(cvsFormat)>
 <#--
     Transform an arbitrary Excel file and add addition columns using Commons 
CSV
     We are using an instance of CSVPrinter directly have proper quoting of the 
output
diff --git a/freemarker-generator-cli/run-examples.sh 
b/freemarker-generator-cli/run-examples.sh
index a8993da..d8d7925 100755
--- a/freemarker-generator-cli/run-examples.sh
+++ b/freemarker-generator-cli/run-examples.sh
@@ -106,7 +106,7 @@ fi
 #############################################################################
 
 echo "examples/templates/dataframe/example.ftl"
-$FREEMARKER_CMD -DCSV_IN_DELIMITER=SEMICOLON -DCSV_IN_WITH_HEADER=true -t 
examples/templates/dataframe/example.ftl examples/data/csv/dataframe.csv > 
target/out/dataframe.txt || { echo >&2 "Test failed.  Aborting."; exit 1; }
+$FREEMARKER_CMD -PCSV_IN_DELIMITER=SEMICOLON -PCSV_IN_WITH_HEADER=true -t 
examples/templates/dataframe/example.ftl examples/data/csv/dataframe.csv > 
target/out/dataframe.txt || { echo >&2 "Test failed.  Aborting."; exit 1; }
 
 #############################################################################
 # Grok
diff --git a/freemarker-generator-cli/src/main/scripts/run-examples.sh 
b/freemarker-generator-cli/src/main/scripts/run-examples.sh
index f467c9d..b95e700 100755
--- a/freemarker-generator-cli/src/main/scripts/run-examples.sh
+++ b/freemarker-generator-cli/src/main/scripts/run-examples.sh
@@ -106,7 +106,7 @@ fi
 #############################################################################
 
 echo "examples/templates/dataframe/example.ftl"
-$FREEMARKER_CMD -DCSV_IN_DELIMITER=SEMICOLON -DCSV_IN_WITH_HEADER=true -t 
examples/templates/dataframe/example.ftl examples/data/csv/dataframe.csv > 
target/out/dataframe.txt || { echo >&2 "Test failed.  Aborting."; exit 1; }
+$FREEMARKER_CMD -PCSV_IN_DELIMITER=SEMICOLON -PCSV_IN_WITH_HEADER=true -t 
examples/templates/dataframe/example.ftl examples/data/csv/dataframe.csv > 
target/out/dataframe.txt || { echo >&2 "Test failed.  Aborting."; exit 1; }
 
 #############################################################################
 # Grok
diff --git 
a/freemarker-generator-cli/src/test/java/org/apache/freemarker/generator/cli/ExamplesTest.java
 
b/freemarker-generator-cli/src/test/java/org/apache/freemarker/generator/cli/ExamplesTest.java
index 1d72527..63c792f 100644
--- 
a/freemarker-generator-cli/src/test/java/org/apache/freemarker/generator/cli/ExamplesTest.java
+++ 
b/freemarker-generator-cli/src/test/java/org/apache/freemarker/generator/cli/ExamplesTest.java
@@ -105,7 +105,7 @@ public class ExamplesTest extends AbstractMainTest {
 
     @Test
     public void shouldRunDataFrameExamples() throws IOException {
-        assertValid(execute("-DCSV_IN_DELIMITER=SEMICOLON 
-DCSV_IN_WITH_HEADER=true -t examples/templates/dataframe/example.ftl 
examples/data/csv/dataframe.csv"));
+        assertValid(execute("-PCSV_IN_DELIMITER=SEMICOLON 
-PCSV_IN_WITH_HEADER=true -t examples/templates/dataframe/example.ftl 
examples/data/csv/dataframe.csv"));
     }
 
     @Test
diff --git 
a/freemarker-generator-cli/src/test/java/org/apache/freemarker/generator/cli/ManualTest.java
 
b/freemarker-generator-cli/src/test/java/org/apache/freemarker/generator/cli/ManualTest.java
index 09c1f79..b12488a 100644
--- 
a/freemarker-generator-cli/src/test/java/org/apache/freemarker/generator/cli/ManualTest.java
+++ 
b/freemarker-generator-cli/src/test/java/org/apache/freemarker/generator/cli/ManualTest.java
@@ -24,8 +24,8 @@ import java.util.Arrays;
 public class ManualTest {
 
     private static final String SPACE = " ";
-    // private static final String CMD = "-DCSV_IN_DELIMITER=SEMICOLON 
-DCSV_IN_WITH_HEADER=true -t examples/templates/dataframe/example.ftl 
https://raw.githubusercontent.com/nRo/DataFrame/master/src/test/resources/users.csv";;
-    private static final String CMD = "-DCSV_IN_FORMAT=DEFAULT 
-DCSV_OUT_FORMAT=INFORMIX_UNLOAD -t templates/csv/csv/transform.ftl 
examples/data/csv/contract.csv";
+    private static final String CMD = "-PCSV_IN_FORMAT=DATAFRAME -t 
examples/templates/dataframe/example.ftl 
https://raw.githubusercontent.com/nRo/DataFrame/master/src/test/resources/users.csv";;
+    // private static final String CMD = "-PCSV_IN_WITH_HEADER=true 
-PCSV_IN_FORMAT=DEFAULT -PCSV_OUT_FORMAT=EXCEL -t 
templates/csv/csv/transform.ftl examples/data/csv/contract.csv";
 
     public static void main(String[] args) {
         Main.execute(toArgs(CMD));
diff --git a/freemarker-generator-cli/templates/csv/csv/transform.ftl 
b/freemarker-generator-cli/templates/csv/csv/transform.ftl
index 587ebfe..0976ef0 100644
--- a/freemarker-generator-cli/templates/csv/csv/transform.ftl
+++ b/freemarker-generator-cli/templates/csv/csv/transform.ftl
@@ -1,4 +1,3 @@
-<#ftl output_format="plainText" strip_text="true">
 <#--
   Licensed to the Apache Software Foundation (ASF) under one
   or more contributor license agreements.  See the NOTICE file
@@ -15,15 +14,31 @@
   specific language governing permissions and limitations
   under the License.
 -->
-<#assign csvParser = CSVTool.parse(DataSources.get(0))>
-<#assign csvPrinter = CSVTool.printer(SystemTool.writer)>
-<#--
-    Print each record directly to the underyling writer without materializing 
the CSV in memory.
-    FreeMarker and CSV output are out of sync but millions of records can 
processed without
-    running out of memory.
--->
-<#compress>
-    <#list csvParser.iterator() as record>
-        ${csvPrinter.printRecord(record)}
-    </#list>
-</#compress>
\ No newline at end of file
+<#assign dataSource = DataSources.get(0)>
+<#assign csvParser = CSVTool.parse(dataSource, csvInFormat())>
+<#assign csvPrinter = CSVTool.printer(csvOutFormat())>
+<#list csvParser.iterator() as record>
+    ${csvPrinter.printRecord(record)}<#t>
+</#list>
+
+<#function csvInFormat>
+    <#assign format = CSVTool.formats[CSV_IN_FORMAT!"DEFAULT"]>
+    <#assign delimiter = 
CSVTool.toDelimiter(CSV_IN_DELIMITER!format.getDelimiter())>
+    <#assign withHeader = CSV_IN_WITH_HEADER!"false">
+    <#assign format = format.withDelimiter(delimiter)>
+    <#if withHeader?boolean>
+        <#assign format = format.withHeader()>
+    </#if>
+    <#return format>
+</#function>
+
+<#function csvOutFormat>
+    <#assign format = CSVTool.formats[CSV_OUT_FORMAT!"DEFAULT"]>
+    <#assign delimiter = 
CSVTool.toDelimiter(CSV_OUT_DELIMITER!format.getDelimiter())>
+    <#assign withHeader = CSV_OUT_WITH_HEADER!"false">
+    <#assign format = format.withDelimiter(delimiter)>
+    <#if withHeader?boolean>
+        <#assign format = format.withHeader>
+    </#if>
+    <#return format>
+</#function>
diff --git a/freemarker-generator-cli/templates/csv/html/transform.ftl 
b/freemarker-generator-cli/templates/csv/html/transform.ftl
index 3e3c2b8..af62744 100644
--- a/freemarker-generator-cli/templates/csv/html/transform.ftl
+++ b/freemarker-generator-cli/templates/csv/html/transform.ftl
@@ -16,15 +16,13 @@
   under the License.
 -->
 <#assign dataSource = DataSources.get(0)>
-<#assign name = dataSource.name>
-<#assign csvParser = CSVTool.parse(dataSource)>
-<#assign csvPrinter = CSVTool.printer(SystemTool.writer)>
+<#assign csvParser = CSVTool.parse(dataSource, csvInFormat())>
 <#assign csvHeaders = csvParser.getHeaderNames()>
 <#--------------------------------------------------------------------------->
 <!DOCTYPE html>
 <html>
 <head>
-    <title>${name}</title>
+    <title>${dataSource.name}</title>
     <meta charset="UTF-8">
     <meta name="viewport" content="width=device-width, initial-scale=1">
     <link rel="stylesheet" 
href="https://maxcdn.bootstrapcdn.com/bootstrap/4.1.3/css/bootstrap.min.css";>
@@ -54,3 +52,14 @@
         </#list>
     </tr>
 </#macro>
+<#--------------------------------------------------------------------------->
+<#function csvInFormat>
+    <#assign format = CSVTool.formats[CSV_IN_FORMAT!"DEFAULT"]>
+    <#assign delimiter = 
CSVTool.toDelimiter(CSV_IN_DELIMITER!format.getDelimiter())>
+    <#assign withHeader = CSV_IN_WITH_HEADER!"false">
+    <#assign format = format.withDelimiter(delimiter)>
+    <#if withHeader?boolean>
+        <#assign format = format.withHeader()>
+    </#if>
+    <#return format>
+</#function>
diff --git a/freemarker-generator-cli/templates/csv/md/transform.ftl 
b/freemarker-generator-cli/templates/csv/md/transform.ftl
index ff2e09a..fbd2c9f 100644
--- a/freemarker-generator-cli/templates/csv/md/transform.ftl
+++ b/freemarker-generator-cli/templates/csv/md/transform.ftl
@@ -1,4 +1,3 @@
-<#ftl output_format="plainText">
 <#--
   Licensed to the Apache Software Foundation (ASF) under one
   or more contributor license agreements.  See the NOTICE file
@@ -15,22 +14,36 @@
   specific language governing permissions and limitations
   under the License.
 -->
-<#assign csvParser = CSVTool.parse(DataSources.get(0))>
-<#assign csvHeaders = csvParser.getHeaderMap()?keys>
-<#assign csvRecords = csvParser.records>
+<#assign dataSource = DataSources.get(0)>
+<#assign csvParser = CSVTool.parse(dataSource, csvInFormat())>
+<#assign headers = (csvParser.getHeaderMap()!{})?keys>
+<#assign records = csvParser.records>
 <#--------------------------------------------------------------------------->
 <#compress>
-<@writeHeaders headers=csvHeaders/>
-<@writeColums columns=csvRecords/>
+    <@writeHeaders headers/>
+    <@writeColums records/>
 </#compress>
 <#--------------------------------------------------------------------------->
 <#macro writeHeaders headers>
-| ${csvHeaders?join(" | ", "")} |
-    <#list csvHeaders as csvHeader>| --------</#list>|
+    <#if headers?has_content>
+        | ${headers?join(" | ", "")} |
+        <#list headers as header>| --------</#list>|
+    </#if>
 </#macro>
 <#--------------------------------------------------------------------------->
 <#macro writeColums columns>
     <#list columns as column>
-    | ${column.iterator()?join(" | ", "")} |
+        | ${column.iterator()?join(" | ", "")} |
     </#list>
 </#macro>
+<#--------------------------------------------------------------------------->
+<#function csvInFormat>
+    <#assign format = CSVTool.formats[CSV_IN_FORMAT!"DEFAULT"]>
+    <#assign delimiter = 
CSVTool.toDelimiter(CSV_IN_DELIMITER!format.getDelimiter())>
+    <#assign withHeader = CSV_IN_WITH_HEADER!"false">
+    <#assign format = format.withDelimiter(delimiter)>
+    <#if withHeader?boolean>
+        <#assign format = format.withHeader()>
+    </#if>
+    <#return format>
+</#function>
diff --git a/freemarker-generator-cli/templates/excel/csv/transform.ftl 
b/freemarker-generator-cli/templates/excel/csv/transform.ftl
index babec81..ec4f35c 100644
--- a/freemarker-generator-cli/templates/excel/csv/transform.ftl
+++ b/freemarker-generator-cli/templates/excel/csv/transform.ftl
@@ -20,7 +20,7 @@
 <#assign sheet = ExcelTool.getSheets(workbook)[0]>
 <#assign records = ExcelTool.toTable(sheet)>
 <#-- Setup CSVPrinter  -->
-<#assign csvPrinter = createCsvPrinter()>
+<#assign csvPrinter = CSVTool.printer(csvOutFormat())>
 <#-- Print each line of the Excel as CSV record -->
 <#compress>
     <#list records as record>
@@ -28,9 +28,14 @@
     </#list>
 </#compress>
 <#--------------------------------------------------------------------------->
-<#function createCsvPrinter>
-    <#assign initialCvsOutFormat = CSVTool.formats[CSV_OUT_FORMAT!"DEFAULT"]>
-    <#assign csvOutDelimiter = 
CSVTool.toDelimiter(CSV_OUT_DELIMITER!initialCvsOutFormat.getDelimiter())>
-    <#assign cvsOutFormat = initialCvsOutFormat.withDelimiter(csvOutDelimiter)>
-    <#return CSVTool.printer(cvsOutFormat, SystemTool.writer)>
+<#function csvOutFormat>
+    <#assign format = CSVTool.formats[CSV_OUT_FORMAT!"DEFAULT"]>
+    <#assign delimiter = 
CSVTool.toDelimiter(CSV_OUT_DELIMITER!format.getDelimiter())>
+    <#assign withHeader = CSV_OUT_WITH_HEADER!"false">
+    <#assign format = format.withDelimiter(delimiter)>
+    <#if withHeader?boolean>
+        <#assign format = format.withHeader>
+    </#if>
+    <#return format>
 </#function>
+
diff --git 
a/freemarker-generator-tools/src/main/java/org/apache/freemarker/generator/tools/commonscsv/CommonsCSVPrinterFacade.java
 
b/freemarker-generator-tools/src/main/java/org/apache/freemarker/generator/tools/commonscsv/CommonsCSVPrinterFacade.java
new file mode 100644
index 0000000..b8c0574
--- /dev/null
+++ 
b/freemarker-generator-tools/src/main/java/org/apache/freemarker/generator/tools/commonscsv/CommonsCSVPrinterFacade.java
@@ -0,0 +1,84 @@
+package org.apache.freemarker.generator.tools.commonscsv;
+
+import org.apache.commons.csv.CSVFormat;
+import org.apache.commons.csv.CSVPrinter;
+
+import java.io.Closeable;
+import java.io.Flushable;
+import java.io.IOException;
+import java.io.StringWriter;
+import java.sql.ResultSet;
+import java.sql.SQLException;
+
+/**
+ * Wrap <code>CSVPrinter</code> so each print method returns
+ * a string to be rendered by FreeMarker instead of writing to an
+ * internal writer.
+ */
+public class CommonsCSVPrinterFacade implements Flushable, Closeable {
+
+    private final StringWriter writer;
+    private final CSVPrinter csvPrinter;
+
+    public CommonsCSVPrinterFacade(CSVFormat format) throws IOException {
+        this.writer = new StringWriter();
+        this.csvPrinter = new CSVPrinter(writer, format);
+    }
+
+    @Override
+    public void close() throws IOException {
+        csvPrinter.close();
+    }
+
+    @Override
+    public void flush() throws IOException {
+        csvPrinter.flush();
+    }
+
+    public String print(Object value) throws IOException {
+        csvPrinter.print(value);
+        return getOutput();
+    }
+
+    public String printComment(String comment) throws IOException {
+        csvPrinter.printComment(comment);
+        return getOutput();
+    }
+
+    public String println() throws IOException {
+        csvPrinter.println();
+        return getOutput();
+    }
+
+    public String printRecord(Iterable<?> values) throws IOException {
+        csvPrinter.printRecord(values);
+        return getOutput();
+    }
+
+    public String printRecord(Object... values) throws IOException {
+        csvPrinter.printRecord(values);
+        return getOutput();
+    }
+
+    public String printRecords(Iterable<?> values) throws IOException {
+        csvPrinter.printRecords(values);
+        return getOutput();
+    }
+
+    public String printRecords(Object... values) throws IOException {
+        csvPrinter.printRecords(values);
+        return getOutput();
+    }
+
+    public String printRecords(ResultSet resultSet) throws SQLException, 
IOException {
+        csvPrinter.printRecords(resultSet);
+        return getOutput();
+    }
+
+    private String getOutput() {
+        writer.flush();
+        final String output = writer.getBuffer().toString();
+        writer.getBuffer().setLength(0);
+        return output;
+    }
+}
diff --git 
a/freemarker-generator-tools/src/main/java/org/apache/freemarker/generator/tools/commonscsv/CommonsCSVTool.java
 
b/freemarker-generator-tools/src/main/java/org/apache/freemarker/generator/tools/commonscsv/CommonsCSVTool.java
index f315669..7d2eab6 100644
--- 
a/freemarker-generator-tools/src/main/java/org/apache/freemarker/generator/tools/commonscsv/CommonsCSVTool.java
+++ 
b/freemarker-generator-tools/src/main/java/org/apache/freemarker/generator/tools/commonscsv/CommonsCSVTool.java
@@ -18,7 +18,6 @@ package org.apache.freemarker.generator.tools.commonscsv;
 
 import org.apache.commons.csv.CSVFormat;
 import org.apache.commons.csv.CSVParser;
-import org.apache.commons.csv.CSVPrinter;
 import org.apache.commons.csv.CSVRecord;
 import org.apache.commons.io.input.BOMInputStream;
 import org.apache.freemarker.generator.base.datasource.DataSource;
@@ -26,7 +25,6 @@ import org.apache.freemarker.generator.base.util.StringUtils;
 
 import java.io.IOException;
 import java.io.InputStream;
-import java.io.Writer;
 import java.nio.charset.Charset;
 import java.util.ArrayList;
 import java.util.Collection;
@@ -37,7 +35,6 @@ import java.util.Map;
 import java.util.function.Function;
 import java.util.stream.Collectors;
 
-import static java.lang.Boolean.parseBoolean;
 import static java.nio.charset.StandardCharsets.UTF_8;
 import static java.util.Objects.requireNonNull;
 import static java.util.stream.Collectors.toList;
@@ -86,29 +83,12 @@ public class CommonsCSVTool {
         return createCSVFormats();
     }
 
-    /**
-     * Get a CSVPrinter using the FreeMarker's writer instance.
-     *
-     * @param writer Writer to receive the CSV output
-     * @return CSVPrinter instance
-     * @throws IOException thrown if the parameters of the format are 
inconsistent or if either out or format are null.
-     */
-    public CSVPrinter printer(Writer writer) throws IOException {
-        // We do not close the CSVPrinter but the underlying writer at the of 
processing
-        return new CSVPrinter(writer, defaultCSVOutputFormat());
+    public CommonsCSVPrinterFacade printer() throws IOException {
+        return printer(defaultCSVOutputFormat());
     }
 
-    /**
-     * Get a CSVPrinter using the FreeMarker's writer instance.
-     *
-     * @param csvFormat CSV format to use for writing records
-     * @param writer    Writer to receive the CSV output
-     * @return CSVPrinter instance
-     * @throws IOException thrown if the parameters of the format are 
inconsistent or if either out or format are null.
-     */
-    public CSVPrinter printer(CSVFormat csvFormat, Writer writer) throws 
IOException {
-        // We do not close the CSVPrinter but the underlying writer at the of 
processing
-        return new CSVPrinter(writer, csvFormat);
+    public CommonsCSVPrinterFacade printer(CSVFormat csvFormat) throws 
IOException {
+        return new CommonsCSVPrinterFacade(csvFormat);
     }
 
     /**
@@ -258,6 +238,7 @@ public class CommonsCSVTool {
     private static Map<String, CSVFormat> createCSVFormats() {
         final Map<String, CSVFormat> result = new HashMap<>();
         result.put("DEFAULT", CSVFormat.DEFAULT);
+        result.put("DATAFRAME", 
CSVFormat.DEFAULT.withDelimiter(';').withFirstRecordAsHeader());
         result.put("EXCEL", CSVFormat.EXCEL);
         result.put("INFORMIX_UNLOAD", CSVFormat.INFORMIX_UNLOAD);
         result.put("INFORMIX_UNLOAD_CSV", CSVFormat.INFORMIX_UNLOAD_CSV);
@@ -273,57 +254,21 @@ public class CommonsCSVTool {
     }
 
     /**
-     * Provides a CSV default input format controlled by the following system 
properties:
-     * <ul>
-     *     <li>CSV_IN_FORMAT</li>
-     *     <li>CSV_IN_DELIMITER</li>
-     *     <li>CSV_IN_WITH_HEADER</li>
-     * </ul>
+     * Provides a CSV default input format.
      *
      * @return CSV format
      */
-    private CSVFormat defaultCSVInputFormat() {
-
-        CSVFormat csvFormat = 
getFormats().getOrDefault(System.getProperty("CSV_IN_FORMAT"), 
CSVFormat.DEFAULT);
-
-        final String delimiter = System.getProperty("CSV_IN_DELIMITER");
-        if (StringUtils.isNotEmpty(delimiter)) {
-            csvFormat = csvFormat.withDelimiter(toDelimiter(delimiter));
-        }
-
-        final boolean withHeader = 
parseBoolean(System.getProperty("CSV_IN_WITH_HEADER", 
Boolean.toString(!csvFormat.getSkipHeaderRecord())));
-        if (withHeader) {
-            csvFormat = csvFormat.withHeader();
-        }
-
-        return csvFormat;
+    private static CSVFormat defaultCSVInputFormat() {
+        return CSVFormat.DEFAULT;
     }
 
     /**
-     * Provides a CSV default output format controlled by the following system 
properties:
-     * <ul>
-     *     <li>CSV_OUT_FORMAT</li>
-     *     <li>CSV_OUT_DELIMITER</li>
-     *     <li>CSV_OUT_WITH_HEADER</li>
-     * </ul>
+     * Provides a CSV default output format.
      *
      * @return CSV format
      */
-    private CSVFormat defaultCSVOutputFormat() {
-
-        CSVFormat csvFormat = 
getFormats().getOrDefault(System.getProperty("CSV_OUT_FORMAT"), 
CSVFormat.DEFAULT);
-
-        final String delimiter = System.getProperty("CSV_OUT_DELIMITER");
-        if (StringUtils.isNotEmpty(delimiter)) {
-            csvFormat = csvFormat.withDelimiter(toDelimiter(delimiter));
-        }
-
-        final boolean withHeader = 
parseBoolean(System.getProperty("CSV_OUT_WITH_HEADER", 
Boolean.toString(!csvFormat.getSkipHeaderRecord())));
-        if (withHeader) {
-            csvFormat = csvFormat.withHeader();
-        }
-
-        return csvFormat;
+    private static CSVFormat defaultCSVOutputFormat() {
+        return CSVFormat.DEFAULT;
     }
 
     private static final class ValueResolver implements Function<CSVRecord, 
String> {
diff --git 
a/freemarker-generator-tools/src/test/java/org/apache/freemarker/generator/tools/commonscsv/CommonsCSVToolTest.java
 
b/freemarker-generator-tools/src/test/java/org/apache/freemarker/generator/tools/commonscsv/CommonsCSVToolTest.java
index d8e4b6a..29f8e0e 100644
--- 
a/freemarker-generator-tools/src/test/java/org/apache/freemarker/generator/tools/commonscsv/CommonsCSVToolTest.java
+++ 
b/freemarker-generator-tools/src/test/java/org/apache/freemarker/generator/tools/commonscsv/CommonsCSVToolTest.java
@@ -18,7 +18,6 @@ package org.apache.freemarker.generator.tools.commonscsv;
 
 import org.apache.commons.csv.CSVFormat;
 import org.apache.commons.csv.CSVParser;
-import org.apache.commons.csv.CSVPrinter;
 import org.apache.commons.csv.CSVRecord;
 import org.apache.freemarker.generator.base.datasource.DataSource;
 import org.apache.freemarker.generator.base.datasource.DataSourceFactory;
@@ -26,8 +25,6 @@ import org.junit.Test;
 
 import java.io.File;
 import java.io.IOException;
-import java.io.StringWriter;
-import java.io.Writer;
 import java.util.List;
 import java.util.Map;
 
@@ -113,15 +110,12 @@ public class CommonsCSVToolTest {
     public void shallPrintCsvRecords() throws IOException {
         final CommonsCSVTool commonsCsvTool = commonsCsvTool();
         final CSVFormat cvsFormat = DEFAULT.withHeader();
-        final Writer writer = new StringWriter();
 
         try (CSVParser parser = commonsCsvTool.parse(dataSource(), cvsFormat)) 
{
-            try (CSVPrinter printer = commonsCsvTool.printer(cvsFormat, 
writer)) {
-                printer.printRecord(parser.getHeaderMap());
+            try (final CommonsCSVPrinterFacade printer = 
commonsCsvTool.printer(cvsFormat)) {
+                
assertTrue(printer.printRecord(parser.getHeaderMap()).contains(CONTRACT_ID));
             }
         }
-
-        assertTrue(writer.toString().contains(CONTRACT_ID));
     }
 
     @Test

Reply via email to