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