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 <[email protected]> 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)
