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

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


The following commit(s) were added to refs/heads/FREEMARKER-199 by this push:
     new 56b911e  FREEMARKER-199 [freemarker-generator] Add "utah-parser-tool"
56b911e is described below

commit 56b911e13ed1d0ba2e09c562a76f30ffdad32901
Author: Siegfried Goeschl <[email protected]>
AuthorDate: Mon Oct 18 08:31:25 2021 +0200

    FREEMARKER-199 [freemarker-generator] Add "utah-parser-tool"
---
 .../csv/{transform.ftl => transform-streaming.ftl} | 19 ++++++++++--------
 .../templates/utahparser/csv/transform.ftl         | 11 ++++++-----
 .../freemarker/generator/cli/ExamplesTest.java     |  4 +++-
 .../generator/tools/commonscsv/CommonsCSVTool.java |  5 -----
 .../generator/tools/utahparser/UtahParserTool.java | 23 ++++++++++++++++++++++
 5 files changed, 43 insertions(+), 19 deletions(-)

diff --git 
a/freemarker-generator-cli/src/app/examples/templates/utahparser/csv/transform.ftl
 
b/freemarker-generator-cli/src/app/examples/templates/utahparser/csv/transform-streaming.ftl
similarity index 62%
copy from 
freemarker-generator-cli/src/app/examples/templates/utahparser/csv/transform.ftl
copy to 
freemarker-generator-cli/src/app/examples/templates/utahparser/csv/transform-streaming.ftl
index 5063619..ebb2829 100644
--- 
a/freemarker-generator-cli/src/app/examples/templates/utahparser/csv/transform.ftl
+++ 
b/freemarker-generator-cli/src/app/examples/templates/utahparser/csv/transform-streaming.ftl
@@ -17,15 +17,18 @@
 <#-- Setup Utah-Parser -->
 <#assign conf =  tools.utahparser.getConfig(dataSources[0])>
 <#assign parser = tools.utahparser.getParser(conf, dataSources[1])>
-<#assign records = parser.toList()>
-<#assign firstRecord = records[0]!{}>
-<#-- Setup CSVPrinter  -->
-<#assign csvHeaders = tools.csv.extractHeaders(firstRecord)>
-<#assign cvsFormat = 
tools.csv.formats.EXCEL.withHeader(csvHeaders).withDelimiter(';')>
-<#assign csvPrinter = tools.csv.printer(cvsFormat)>
+<#assign csvPrinter = "">
 <#-- Print records as CSV  -->
 <#compress>
-    <#list records as record>
+    <#list parser.iterator() as record>
+        <#if !csvPrinter?has_content>
+            <#-- Lazy creation of a CSVFormat for writing the records -->
+            <#assign defaultCsvformat = 
tools.csv.formats[CSV_TARGET_FORMAT!"DEFAULT"]>
+            <#assign delimiter = 
tools.csv.toDelimiter(CSV_TARGET_DELIMITER!defaultCsvformat.getDelimiter())>
+            <#assign csvHeaders = tools.utahparser.getHeaders(record)>
+            <#assign cvsFormat = 
defaultCsvformat.withHeader(csvHeaders).withDelimiter(delimiter)>
+            <#assign csvPrinter = tools.csv.printer(cvsFormat)>
+        </#if>
         ${csvPrinter.printRecord(record, csvHeaders)}
     </#list>
-</#compress>
\ No newline at end of file
+</#compress>
diff --git 
a/freemarker-generator-cli/src/app/examples/templates/utahparser/csv/transform.ftl
 
b/freemarker-generator-cli/src/app/examples/templates/utahparser/csv/transform.ftl
index 5063619..f67729c 100644
--- 
a/freemarker-generator-cli/src/app/examples/templates/utahparser/csv/transform.ftl
+++ 
b/freemarker-generator-cli/src/app/examples/templates/utahparser/csv/transform.ftl
@@ -14,18 +14,19 @@
   specific language governing permissions and limitations
   under the License.
 -->
-<#-- Setup Utah-Parser -->
+<#-- Setup Utah-Parser and parse all records to determine the headers -->
 <#assign conf =  tools.utahparser.getConfig(dataSources[0])>
 <#assign parser = tools.utahparser.getParser(conf, dataSources[1])>
 <#assign records = parser.toList()>
-<#assign firstRecord = records[0]!{}>
+<#assign headers = tools.utahparser.getHeaders(records)>
 <#-- Setup CSVPrinter  -->
-<#assign csvHeaders = tools.csv.extractHeaders(firstRecord)>
-<#assign cvsFormat = 
tools.csv.formats.EXCEL.withHeader(csvHeaders).withDelimiter(';')>
+<#assign defaultCsvformat = tools.csv.formats[CSV_TARGET_FORMAT!"DEFAULT"]>
+<#assign csvDelimiter = 
tools.csv.toDelimiter(CSV_TARGET_DELIMITER!defaultCsvformat.getDelimiter())>
+<#assign cvsFormat = 
defaultCsvformat.withHeader(headers).withDelimiter(csvDelimiter)>
 <#assign csvPrinter = tools.csv.printer(cvsFormat)>
 <#-- Print records as CSV  -->
 <#compress>
     <#list records as record>
-        ${csvPrinter.printRecord(record, csvHeaders)}
+        ${csvPrinter.printRecord(record, headers)}
     </#list>
 </#compress>
\ No newline at end of file
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 687925f..19eb427 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
@@ -127,7 +127,9 @@ public class ExamplesTest extends AbstractMainTest {
 
     @Test
     public void shouldRunUtahParserExamples() throws IOException {
-        assertValid(execute("-t 
src/app/examples/templates/utahparser/csv/transform.ftl " +
+        assertValid(execute("-PCSV_TARGET_FORMAT=EXCEL " +
+                "-PCSV_TARGET_DELIMITER=SEMICOLON " +
+                "-t src/app/examples/templates/utahparser/csv/transform.ftl " +
                 
"src/app/examples/data/text/utahparser/juniper_bgp_summary_template.xml " +
                 
"src/app/examples/data/text/utahparser/juniper_bgp_summary_example.txt"));
 
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 519c171..18c8817 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
@@ -99,11 +99,6 @@ public class CommonsCSVTool {
         return new CommonsCSVPrinterFacade(csvFormat);
     }
 
-    public String[] extractHeaders(Map<String, Object> map) {
-        final Set<String> keySet = map.keySet();
-        return keySet.toArray(new String[0]);
-    }
-
     /**
      * Extract the list of unique values (keys) of the column "name".
      *
diff --git 
a/freemarker-generator-tools/src/main/java/org/apache/freemarker/generator/tools/utahparser/UtahParserTool.java
 
b/freemarker-generator-tools/src/main/java/org/apache/freemarker/generator/tools/utahparser/UtahParserTool.java
index 87ceb0d..0da3491 100644
--- 
a/freemarker-generator-tools/src/main/java/org/apache/freemarker/generator/tools/utahparser/UtahParserTool.java
+++ 
b/freemarker-generator-tools/src/main/java/org/apache/freemarker/generator/tools/utahparser/UtahParserTool.java
@@ -26,6 +26,12 @@ import 
org.apache.freemarker.generator.tools.utahparser.impl.ParserWrapper;
 import java.io.IOException;
 import java.io.InputStream;
 import java.io.InputStreamReader;
+import java.util.Collection;
+import java.util.Collections;
+import java.util.Map;
+import java.util.Set;
+import java.util.TreeSet;
+import java.util.stream.Collectors;
 
 public class UtahParserTool {
 
@@ -46,6 +52,23 @@ public class UtahParserTool {
         return new ParserWrapper(Parser.parse(config, is));
     }
 
+    public String[] getHeaders(Map<String, Object> map) {
+        final Set<String> keySet = map.keySet();
+        return keySet.toArray(new String[0]);
+    }
+
+    public Set<String> getHeaders(Collection<Map<String, String>> records) {
+        if (records == null || records.isEmpty()) {
+            return Collections.emptySet();
+        }
+
+        return records.stream()
+                .map(record -> record.keySet())
+                .flatMap(Collection::stream)
+                .collect(Collectors.toCollection(() -> new TreeSet<>())
+                );
+    }
+
     public String toString() {
         return "Parse semi-structured text using regular expressions (see 
https://github.com/sonalake/utah-parser)";
     }

Reply via email to