You are viewing a plain text version of this content. The canonical link for it is here.
Posted to notifications@freemarker.apache.org by sg...@apache.org on 2020/06/18 14:01:44 UTC

[freemarker-generator] 04/04: FREEMARKER-146 Cleanly separate example templates and data from user-supplied content

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

commit e8730783c6bdf824b9b1e6c04957331ff139dc8e
Author: Siegfried Goeschl <si...@gmail.com>
AuthorDate: Thu Jun 18 16:01:26 2020 +0200

    FREEMARKER-146 Cleanly separate example templates and data from user-supplied content
---
 freemarker-generator-cli/README.md                 |  8 +++--
 .../examples/templates/csv/{ => csv}/transform.ftl |  6 +++-
 .../freemarker/generator/cli/ExamplesTest.java     |  2 +-
 .../freemarker/generator/cli/ManualTest.java       |  3 +-
 freemarker-generator-cli/templates/info.ftl        |  4 +--
 .../generator/tools/system/SystemTool.java         | 37 ++++++++++++++++++++++
 .../generator/tools/system/SystemToolTest.java     | 19 +++++++++--
 7 files changed, 69 insertions(+), 10 deletions(-)

diff --git a/freemarker-generator-cli/README.md b/freemarker-generator-cli/README.md
index 7f8ad48..2f42273 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 -PCVS_IN_DELIMITER=COMMA -PCSV_OUT_DELIMITER=PIPE -t examples/templates/csv/transform.ftl ./examples/data/csv/contract.csv 
+> bin/freemarker-cli -PCVS_IN_DELIMITER=COMMA -PCSV_OUT_DELIMITER=PIPE -t examples/templates/csv/csv/transform.ftl ./examples/data/csv/contract.csv 
 
 renders the following template
 
@@ -902,7 +902,11 @@ renders the following template
 <#ftl output_format="plainText" strip_text="true">
 <#assign csvParser = createCsvParser(DataSources.get(0))>
 <#assign csvPrinter = createCsvPrinter()>
-<#-- Print each line without materializing the CSV in memory -->
+<#--
+    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)}
diff --git a/freemarker-generator-cli/examples/templates/csv/transform.ftl b/freemarker-generator-cli/examples/templates/csv/csv/transform.ftl
similarity index 88%
rename from freemarker-generator-cli/examples/templates/csv/transform.ftl
rename to freemarker-generator-cli/examples/templates/csv/csv/transform.ftl
index af091ec..05d60af 100644
--- a/freemarker-generator-cli/examples/templates/csv/transform.ftl
+++ b/freemarker-generator-cli/examples/templates/csv/csv/transform.ftl
@@ -17,7 +17,11 @@
 -->
 <#assign csvParser = createCsvParser(DataSources.get(0))>
 <#assign csvPrinter = createCsvPrinter()>
-<#-- Print each line without materializing the CSV in memory -->
+<#--
+    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)}
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 ecf1573..b651a8f 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
@@ -51,7 +51,7 @@ public class ExamplesTest extends AbstractMainTest {
         assertValid(execute("-t examples/templates/csv/fo/transform.ftl examples/data/csv/locker-test-users.csv"));
         assertValid(execute("-t examples/templates/csv/fo/transactions.ftl examples/data/csv/transactions.csv"));
         assertValid(execute("-t examples/templates/csv/html/transactions.ftl examples/data/csv/transactions.csv"));
-        assertValid(execute("-t examples/templates/csv/transform.ftl examples/data/csv/contract.csv"));
+        assertValid(execute("-t examples/templates/csv/csv/transform.ftl examples/data/csv/contract.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 0699a44..91be862 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,7 +24,8 @@ import java.util.Arrays;
 public class ManualTest {
 
     private static final String SPACE = " ";
-    private static final String CMD = "-DCSV_TOOL_DELIMITER=SEMICOLON -DCSV_TOOL_HEADERS=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_TOOL_DELIMITER=SEMICOLON -DCSV_TOOL_HEADERS=true -t examples/templates/dataframe/example.ftl https://raw.githubusercontent.com/nRo/DataFrame/master/src/test/resources/users.csv";
+    private static final String CMD = "-PCSV_OUT_FORMAT=EXCEL -t examples/templates/csv/csv/transform.ftl examples/data/csv/contract.csv";
 
 
     public static void main(String[] args) {
diff --git a/freemarker-generator-cli/templates/info.ftl b/freemarker-generator-cli/templates/info.ftl
index 565e2ec..838ac29 100644
--- a/freemarker-generator-cli/templates/info.ftl
+++ b/freemarker-generator-cli/templates/info.ftl
@@ -49,8 +49,8 @@ FreeMarker CLI Data Model
 FreeMarker CLI DataSources
 ------------------------------------------------------------------------------
 <#list DataSources.list as dataSource>
-    [#${dataSource?counter}], name=${dataSource.name}, group=${dataSource.group}, contentType=${dataSource.contentType}, charset=${dataSource.charset}, length=${dataSource.length} Bytes
-    URI : ${dataSource.uri}
+[#${dataSource?counter}], name=${dataSource.name}, group=${dataSource.group}, contentType=${dataSource.contentType}, charset=${dataSource.charset}, length=${dataSource.length} Bytes
+URI : ${dataSource.uri}
 </#list>
 </#if>
 
diff --git a/freemarker-generator-tools/src/main/java/org/apache/freemarker/generator/tools/system/SystemTool.java b/freemarker-generator-tools/src/main/java/org/apache/freemarker/generator/tools/system/SystemTool.java
index 7f2cc16..dfade40 100644
--- a/freemarker-generator-tools/src/main/java/org/apache/freemarker/generator/tools/system/SystemTool.java
+++ b/freemarker-generator-tools/src/main/java/org/apache/freemarker/generator/tools/system/SystemTool.java
@@ -17,6 +17,8 @@
  */
 package org.apache.freemarker.generator.tools.system;
 
+import org.apache.freemarker.generator.base.util.StringUtils;
+
 import java.io.File;
 import java.io.Writer;
 import java.net.InetAddress;
@@ -122,6 +124,34 @@ public class SystemTool {
         return env != null ? env : def;
     }
 
+    /**
+     * Convinience lookup of a configuration value based on
+     * user-supplied parameters, system properties and
+     * environment variables.
+     *
+     * @param name name of the configuration parameter
+     * @return value of null
+     */
+    public String getString(String name) {
+        return StringUtils.firstNonEmpty(
+                getParameter(name),
+                System.getProperty(name),
+                getEnv(name));
+    }
+
+    /**
+     * Convinience lookup of a configuration value based on
+     * user-supplied parameters, system properties and
+     * environment variables.
+     *
+     * @param name name of the configuration parameter
+     * @param def default value
+     * @return value of null
+     */
+    public String getString(String name, String def) {
+        return StringUtils.firstNonEmpty(getString(name), def);
+    }
+
     public String getHostName() {
         try {
             return InetAddress.getLocalHost().getHostName();
@@ -130,6 +160,13 @@ public class SystemTool {
         }
     }
 
+    /**
+     * The <code>Writer</code> passed to FreeMarker for rendering the output. Please
+     * note that FreeMarker does some magic on top of the writer so output generated
+     * by using the writer and FreeMarker templates are scrambled.
+     *
+     * @return writer
+     */
     public Writer getWriter() {
         return writer;
     }
diff --git a/freemarker-generator-tools/src/test/java/org/apache/freemarker/generator/tools/system/SystemToolTest.java b/freemarker-generator-tools/src/test/java/org/apache/freemarker/generator/tools/system/SystemToolTest.java
index 46323be..23d90ee 100644
--- a/freemarker-generator-tools/src/test/java/org/apache/freemarker/generator/tools/system/SystemToolTest.java
+++ b/freemarker-generator-tools/src/test/java/org/apache/freemarker/generator/tools/system/SystemToolTest.java
@@ -18,22 +18,35 @@ package org.apache.freemarker.generator.tools.system;
 
 import org.junit.Test;
 
+import static org.junit.Assert.assertEquals;
 import static org.junit.Assert.assertFalse;
 
 public class SystemToolTest {
 
+    private static final String USER = System.getenv("USER");
+
     @Test
-    public void shallGetProperties() {
+    public void shouldGetProperties() {
         assertFalse(systemTool().getSystemProperties().isEmpty());
     }
 
     @Test
-    public void shallGetEnvs() {
+    public void shouldGetEnvs() {
         assertFalse(systemTool().getEnvs().isEmpty());
     }
 
     @Test
-    public void shallGetHostName() {
+    public void shouldGetString() {
+        assertEquals(USER, systemTool().getString("USER"));
+    }
+
+    @Test
+    public void shouldGetStringWithDefault() {
+        assertEquals("foo", systemTool().getString("_DOES_NOT_EXIST_", "foo"));
+    }
+
+    @Test
+    public void shouldGetHostName() {
         assertFalse(systemTool().getHostName().isEmpty());
     }