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/04/15 22:26:26 UTC
[freemarker-generator] 05/08: FREEMARKER-141 freemarker-cli: Expose
user-supplied parameters in the data model
This is an automated email from the ASF dual-hosted git repository.
sgoeschl pushed a commit to branch FREEMARKER-141
in repository https://gitbox.apache.org/repos/asf/freemarker-generator.git
commit f879cf17edd96defaca00a0bed3afc3b10b1eecc
Author: Siegfried Goeschl <si...@gmail.com>
AuthorDate: Tue Apr 14 23:42:29 2020 +0200
FREEMARKER-141 freemarker-cli: Expose user-supplied parameters in the data model
---
.../base/parameter/ParameterModelSupplier.java | 10 +++++
.../generator/uri/NamedUriStringParserTest.java | 26 ++++++++++-
freemarker-generator-cli/README.md | 52 +++++++++++-----------
.../org/apache/freemarker/generator/cli/Main.java | 5 ---
.../freemarker/generator/cli/config/Settings.java | 23 ----------
.../freemarker/generator/cli/config/Suppliers.java | 8 +---
.../generator/cli/task/FreeMarkerTask.java | 7 ---
.../freemarker/generator/cli/ExamplesTest.java | 2 +-
.../generator/cli/config/SettingsTest.java | 2 -
9 files changed, 63 insertions(+), 72 deletions(-)
diff --git a/freemarker-generator-base/src/main/java/org/apache/freemarker/generator/base/parameter/ParameterModelSupplier.java b/freemarker-generator-base/src/main/java/org/apache/freemarker/generator/base/parameter/ParameterModelSupplier.java
index 997e1b9..29503a6 100644
--- a/freemarker-generator-base/src/main/java/org/apache/freemarker/generator/base/parameter/ParameterModelSupplier.java
+++ b/freemarker-generator-base/src/main/java/org/apache/freemarker/generator/base/parameter/ParameterModelSupplier.java
@@ -25,6 +25,7 @@ import java.util.HashMap;
import java.util.List;
import java.util.Map;
import java.util.function.Supplier;
+import java.util.stream.Collectors;
import static java.util.Objects.requireNonNull;
import static java.util.stream.Collectors.toList;
@@ -38,6 +39,10 @@ public class ParameterModelSupplier implements Supplier<Map<String, Object>> {
private final Collection<String> parameters;
+ public ParameterModelSupplier(Map<String, String> parameters) {
+ this(toStrings(parameters));
+ }
+
public ParameterModelSupplier(Collection<String> parameters) {
this.parameters = requireNonNull(parameters);
}
@@ -86,4 +91,9 @@ public class ParameterModelSupplier implements Supplier<Map<String, Object>> {
}
}
+ private static Collection<String> toStrings(Map<String, String> parameters) {
+ return parameters.entrySet().stream()
+ .map(e -> e.getKey() + "=" + e.getValue())
+ .collect(Collectors.toList());
+ }
}
diff --git a/freemarker-generator-base/src/test/java/org/apache/freemarker/generator/uri/NamedUriStringParserTest.java b/freemarker-generator-base/src/test/java/org/apache/freemarker/generator/uri/NamedUriStringParserTest.java
index 897ef82..a4da79e 100644
--- a/freemarker-generator-base/src/test/java/org/apache/freemarker/generator/uri/NamedUriStringParserTest.java
+++ b/freemarker-generator-base/src/test/java/org/apache/freemarker/generator/uri/NamedUriStringParserTest.java
@@ -28,7 +28,7 @@ import static org.junit.Assert.assertTrue;
public class NamedUriStringParserTest {
@Test
- public void shouldParseRelativeFileName() {
+ public void shouldParseFileName() {
final NamedUri namedURI = parse("users.csv");
assertNull(namedURI.getName());
@@ -39,6 +39,30 @@ public class NamedUriStringParserTest {
}
@Test
+ public void shouldParseFileNameWithFragment() {
+ final NamedUri namedURI = parse("users.csv#foo=bar");
+
+ assertNull(namedURI.getName());
+ assertNull(namedURI.getGroup());
+ assertEquals("users.csv#foo=bar", namedURI.getUri().toString());
+ assertEquals("users.csv", namedURI.getFile().getName());
+ assertEquals("foo=bar", namedURI.getUri().getFragment());
+ assertEquals(1, namedURI.getParameters().size());
+ assertEquals("bar", namedURI.getParameters().get("foo"));
+ }
+
+ @Test
+ public void shouldParseRelativeFileName() {
+ final NamedUri namedURI = parse("./users.csv");
+
+ assertNull(namedURI.getName());
+ assertNull(namedURI.getGroup());
+ assertEquals("./users.csv", namedURI.getUri().toString());
+ assertEquals("users.csv", namedURI.getFile().getName());
+ assertEquals(0, namedURI.getParameters().size());
+ }
+
+ @Test
public void shouldParseAbsoluteFileName() {
final NamedUri namedURI = parse("/data/users.csv");
diff --git a/freemarker-generator-cli/README.md b/freemarker-generator-cli/README.md
index 3fde98b..bd9ec0e 100644
--- a/freemarker-generator-cli/README.md
+++ b/freemarker-generator-cli/README.md
@@ -78,11 +78,11 @@ You can test the installation by executing
> ./bin/freemarker-cli -t templates/info.ftl
FreeMarker CLI Information
------------------------------------------------------------------------------
-FreeMarker version : 2.3.29
+FreeMarker version : 2.3.30
Template name : templates/info.ftl
Language : en
Locale : en_US
-Timestamp : Apr 4, 2020 12:39:28 PM
+Timestamp : Apr 14, 2020 11:34:13 PM
Output encoding : UTF-8
Output format : plainText
@@ -122,7 +122,7 @@ Command line : -t, templates/info.ftl
Host Name : W0GL5179.local
Java Home : /Library/Java/JavaVirtualMachines/jdk1.8.0_192.jdk/Contents/Home
User Name : sgoeschl
-Timestamp : 1,585,996,768,896
+Timestamp : 1,586,900,053,355
Writer : org.apache.freemarker.generator.base.util.NonClosableWriterWrapper
```
@@ -195,13 +195,14 @@ Please note that generated PDF files are very likely not found since they requir
```text
> ./bin/freemarker-cli -h
-Usage: freemarker-cli (-t=<template> | -i=<interactiveTemplate>) [-EhV]
+Usage: freemarker-cli (-t=<template> | -i=<interactiveTemplate>) [-hV]
[--stdin] [-b=<baseDir>] [--config=<configFile>]
[-e=<inputEncoding>] [--exclude=<exclude>]
- [--include=<include>] [-l=<locale>] [-o=<outputFile>]
- [--output-encoding=<outputEncoding>] [--times=<times>]
- [-D=<String=String>]... [-P=<String=String>]...
- [<sources>...]
+ [--include=<include>] [-l=<locale>] [--mode=<mode>]
+ [-o=<outputFile>] [--output-encoding=<outputEncoding>]
+ [--times=<times>] [-D=<String=String>]...
+ [-m=<dataModels>]... [-P=<String=String>]...
+ [-s=<dataSources>]... [<sources>...]
Apache FreeMarker CLI
[<sources>...] List of input files and/or input directories
-b, --basedir=<baseDir> Optional template base directory
@@ -210,24 +211,26 @@ Apache FreeMarker CLI
Set system property
-e, --input-encoding=<inputEncoding>
Encoding of data source
- -E, --expose-env Expose environment variables and user-supplied
- properties globally
--exclude=<exclude> File pattern for data source input directory
-h, --help Show this help message and exit.
-i, --interactive=<interactiveTemplate>
Interactive FreeMarker template
--include=<include> File pattern for data source input directory
-l, --locale=<locale> Locale being used for the output, e.g. 'en_US'
+ -m, --data-model=<dataModels>
+ Data model used for rendering
+ --mode=<mode> [template|datasource]
-o, --output=<outputFile> Output file
--output-encoding=<outputEncoding>
Encoding of output, e.g. UTF-8
-P, --param=<String=String>
Set parameter
- --stdin Read data source from stdin
+ -s, --data-source=<dataSources>
+ Data source used for rendering
+ --stdin Read data source from stdin
-t, --template=<template> FreeMarker template to render
--times=<times> Re-run X times for profiling
-V, --version Print version information and exit.
-
```
# 6. Examples
@@ -876,7 +879,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 -Pcsv.in.delimiter=COMMA -Pcsv.out.delimiter=PIPE -t templates/csv/transform.ftl ./site/sample/csv/contract.csv
+> bin/freemarker-cli -PCVS_IN_DELIMITER=COMMA -PCSV_OUT_DELIMITER=PIPE -t templates/csv/transform.ftl ./site/sample/csv/contract.csv
renders the following template
@@ -892,15 +895,15 @@ renders the following template
</#compress>
<#function createCsvParser dataSource>
- <#assign initialCvsInFormat = CSVTool.formats[SystemTool.getParameter("csv.in.format", "DEFAULT")]>
- <#assign csvInDelimiter = CSVTool.toDelimiter(SystemTool.getParameter("csv.in.delimiter", initialCvsInFormat.getDelimiter()))>
+ <#assign initialCvsInFormat = CSVTool.formats[CSV_IN_FORMAT!"DEFAULT"]>
+ <#assign csvInDelimiter = CSVTool.toDelimiter(CSV_IN_DELIMITER!initialCvsInFormat.getDelimiter())>
<#assign cvsInFormat = initialCvsInFormat.withDelimiter(csvInDelimiter)>
<#return CSVTool.parse(dataSource, cvsInFormat)>
</#function>
<#function createCsvPrinter>
- <#assign initialCvsOutFormat = CSVTool.formats[SystemTool.getParameter("csv.out.format", "DEFAULT")]>
- <#assign csvOutDelimiter = CSVTool.toDelimiter(SystemTool.getParameter("csv.out.delimiter", initialCvsOutFormat.getDelimiter()))>
+ <#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>
@@ -1118,8 +1121,6 @@ Sometimes we simply need to transform a JSON into an equivalent YAML or the othe
> ./bin/freemarker-cli -i '${YamlTool.toYaml(GsonTool.parse(DataSources.get(0)))}' site/sample/json/swagger-spec.json
```
-
-
## 6.16 Using Advanced FreeMarker Features
There is a `demo.ftl` which shows some advanced FreeMarker functionality
@@ -1139,13 +1140,12 @@ gives you
```text
1) FreeMarker Special Variables
---------------------------------------------------------------------------
-FreeMarker version : 2.3.29
+FreeMarker version : 2.3.30
Template name : templates/demo.ftl
Language : en
Locale : en_US
-Timestamp : Feb 22, 2020 4:54:19 PM
+Timestamp : Apr 14, 2020 11:40:26 PM
Output encoding : UTF-8
-Output format : plainText
2) Invoke a constructor of a Java class
---------------------------------------------------------------------------
@@ -1264,13 +1264,13 @@ German Special Characters: äöüßÄÖÜ
---------------------------------------------------------------------------
Small Number : 1.23
Large Number : 12,345,678.90
-Date : Feb 22, 2020
-Time : 4:54:20 PM
+Date : Apr 14, 2020
+Time : 11:40:26 PM
17) Execute a program
---------------------------------------------------------------------------
> date
-Sat Feb 22 16:54:20 CET 2020
+Tue Apr 14 23:40:26 CEST 2020
```
# 7. Design Considerations
@@ -1298,9 +1298,9 @@ Within the script a FreeMarker data model is set up and passed to the template -
| JsoupTool | Processing HTML files using [Jsoup](https://jsoup.org) |
| PropertiesTool | Process JDK properties files |
| SystemTool | System-related utility methods |
+| UUIDTool | Create UUIDs |
| XmlTool | Process XML files using [Apache FreeMarker](https://freemarker.apache.org/docs/xgui.html) |
| YamlTool | Process YAML files using [SnakeYAML](https://bitbucket.org/asomov/snakeyaml/wiki/Home) |
-| UUIDTool | Create UUIDs |
# 8. Tips & Tricks
diff --git a/freemarker-generator-cli/src/main/java/org/apache/freemarker/generator/cli/Main.java b/freemarker-generator-cli/src/main/java/org/apache/freemarker/generator/cli/Main.java
index 51928a0..99d1876 100644
--- a/freemarker-generator-cli/src/main/java/org/apache/freemarker/generator/cli/Main.java
+++ b/freemarker-generator-cli/src/main/java/org/apache/freemarker/generator/cli/Main.java
@@ -38,7 +38,6 @@ import java.io.IOException;
import java.io.OutputStreamWriter;
import java.io.Writer;
import java.util.Collection;
-import java.util.Collections;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
@@ -78,9 +77,6 @@ public class Main implements Callable<Integer> {
@Option(names = { "-e", "--input-encoding" }, description = "Encoding of data source", defaultValue = "UTF-8")
String inputEncoding;
- @Option(names = { "-E", "--expose-env" }, description = "Expose environment variables and user-supplied properties globally")
- boolean isEnvironmentExposed;
-
@Option(names = { "-l", "--locale" }, description = "Locale being used for the output, e.g. 'en_US'")
String locale;
@@ -210,7 +206,6 @@ public class Main implements Callable<Integer> {
private Settings settings(Properties configuration, List<File> templateDirectories) {
return Settings.builder()
- .isEnvironmentExposed(isEnvironmentExposed)
.isReadFromStdin(readFromStdin)
.setArgs(args)
.setConfiguration(configuration)
diff --git a/freemarker-generator-cli/src/main/java/org/apache/freemarker/generator/cli/config/Settings.java b/freemarker-generator-cli/src/main/java/org/apache/freemarker/generator/cli/config/Settings.java
index 51bbae8..e3151bf 100644
--- a/freemarker-generator-cli/src/main/java/org/apache/freemarker/generator/cli/config/Settings.java
+++ b/freemarker-generator-cli/src/main/java/org/apache/freemarker/generator/cli/config/Settings.java
@@ -82,9 +82,6 @@ public class Settings {
/** Read from stdin? */
private final boolean isReadFromStdin;
- /** Expose environment variables globally in the data model? */
- private final boolean isEnvironmentExposed;
-
/** User-supplied list of data sources or directories */
private final List<String> dataSources;
@@ -114,7 +111,6 @@ public class Settings {
String exclude,
Locale locale,
boolean isReadFromStdin,
- boolean isEnvironmentExposed,
List<String> dataSources,
List<String> dataModels,
Map<String, String> parameters,
@@ -136,7 +132,6 @@ public class Settings {
this.exclude = exclude;
this.locale = requireNonNull(locale);
this.isReadFromStdin = isReadFromStdin;
- this.isEnvironmentExposed = isEnvironmentExposed;
this.dataSources = requireNonNull(dataSources);
this.dataModels = requireNonNull(dataModels);
this.parameters = requireNonNull(parameters);
@@ -205,10 +200,6 @@ public class Settings {
return isReadFromStdin;
}
- public boolean isEnvironmentExposed() {
- return isEnvironmentExposed;
- }
-
public List<String> getDataSources() {
return dataSources;
}
@@ -270,16 +261,9 @@ public class Settings {
", exclude='" + include + '\'' +
", locale=" + locale +
", isReadFromStdin=" + isReadFromStdin +
- ", isEnvironmentExposed=" + isEnvironmentExposed +
", dataSources=" + dataSources +
", properties=" + parameters +
", sytemProperties=" + sytemProperties +
- ", writer=" + writer +
- ", templateEncoding=" + getTemplateEncoding() +
- ", readFromStdin=" + isReadFromStdin() +
- ", environmentExposed=" + isEnvironmentExposed() +
- ", hasOutputFile=" + hasOutputFile() +
- ", toMap=" + toMap() +
'}';
}
@@ -296,7 +280,6 @@ public class Settings {
private String exclude;
private String locale;
private boolean isReadFromStdin;
- private boolean isEnvironmentExposed;
private List<String> dataSources;
private List<String> dataModels;
private Map<String, String> parameters;
@@ -386,11 +369,6 @@ public class Settings {
return this;
}
- public SettingsBuilder isEnvironmentExposed(boolean isEnvironmentExposed) {
- this.isEnvironmentExposed = isEnvironmentExposed;
- return this;
- }
-
public SettingsBuilder setDataSources(List<String> dataSources) {
if (dataSources != null) {
this.dataSources = dataSources;
@@ -451,7 +429,6 @@ public class Settings {
exclude,
LocaleUtils.parseLocale(currLocale),
isReadFromStdin,
- isEnvironmentExposed,
dataSources,
dataModels,
parameters,
diff --git a/freemarker-generator-cli/src/main/java/org/apache/freemarker/generator/cli/config/Suppliers.java b/freemarker-generator-cli/src/main/java/org/apache/freemarker/generator/cli/config/Suppliers.java
index 93dff34..9937610 100644
--- a/freemarker-generator-cli/src/main/java/org/apache/freemarker/generator/cli/config/Suppliers.java
+++ b/freemarker-generator-cli/src/main/java/org/apache/freemarker/generator/cli/config/Suppliers.java
@@ -23,9 +23,7 @@ import org.apache.freemarker.generator.base.file.PropertiesFileSystemSupplier;
import org.apache.freemarker.generator.base.file.PropertiesSupplier;
import org.apache.freemarker.generator.base.parameter.ParameterModelSupplier;
-import java.util.List;
import java.util.function.Supplier;
-import java.util.stream.Collectors;
/**
* Convenience methods to create suppliers.
@@ -64,11 +62,7 @@ public class Suppliers {
}
public static ParameterModelSupplier parameterSupplier(Settings settings) {
- final List<String> parameters = settings.getParameters().entrySet().stream()
- .map(e -> e.getKey() + "=" + e.getValue())
- .collect(Collectors.toList());
-
- return new ParameterModelSupplier(parameters);
+ return new ParameterModelSupplier(settings.getParameters());
}
public static PropertiesSupplier propertiesSupplier(String fileName) {
diff --git a/freemarker-generator-cli/src/main/java/org/apache/freemarker/generator/cli/task/FreeMarkerTask.java b/freemarker-generator-cli/src/main/java/org/apache/freemarker/generator/cli/task/FreeMarkerTask.java
index da83bb9..549078c 100644
--- a/freemarker-generator-cli/src/main/java/org/apache/freemarker/generator/cli/task/FreeMarkerTask.java
+++ b/freemarker-generator-cli/src/main/java/org/apache/freemarker/generator/cli/task/FreeMarkerTask.java
@@ -149,13 +149,6 @@ public class FreeMarkerTask implements Callable<Integer> {
result.putAll(dataModelsSupplier.get());
result.put(DATASOURCES, dataSources);
-
- // TODO rework based on FREEMARKER-140
- if (settings.isEnvironmentExposed()) {
- // add all system & user-supplied properties as top-level entries
- result.putAll(System.getenv());
- }
-
result.putAll(parameterModelSupplier.get());
result.putAll(tools.get());
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 295b2e7..147a2d7 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
@@ -99,7 +99,7 @@ public class ExamplesTest extends AbstractMainTest {
@Test
public void shouldRunWithExposedEnvironmentVariableExamples() throws IOException {
- assertValid(execute("-b ./src/test -E -t templates/environment.ftl"));
+ assertValid(execute("-b ./src/test -m env:/// -t templates/environment.ftl"));
}
@Test
diff --git a/freemarker-generator-cli/src/test/java/org/apache/freemarker/generator/cli/config/SettingsTest.java b/freemarker-generator-cli/src/test/java/org/apache/freemarker/generator/cli/config/SettingsTest.java
index 3c71276..0ccd737 100644
--- a/freemarker-generator-cli/src/test/java/org/apache/freemarker/generator/cli/config/SettingsTest.java
+++ b/freemarker-generator-cli/src/test/java/org/apache/freemarker/generator/cli/config/SettingsTest.java
@@ -60,14 +60,12 @@ public class SettingsTest {
assertNotNull(settings.getParameters());
assertNotNull(settings.getSytemProperties());
assertTrue(settings.isReadFromStdin());
- assertTrue(settings.isEnvironmentExposed());
assertTrue(settings.isInteractiveTemplate());
assertTrue(settings.isVerbose());
}
private SettingsBuilder allSettingsBuilder() {
return Settings.builder()
- .isEnvironmentExposed(true)
.isReadFromStdin(true)
.setArgs(ANY_ARGS)
.setConfiguration(ANY_CONFIGURATION)