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)