This is an automated email from the ASF dual-hosted git repository.

sgoeschl pushed a commit to branch FREEMARKER-161
in repository https://gitbox.apache.org/repos/asf/freemarker-generator.git

commit 044b68536fad8d32054a9e5163c053712507bffa
Author: Siegfried Goeschl <[email protected]>
AuthorDate: Fri Jan 8 21:56:11 2021 +0100

    FREEMARKER-161 [freemarker-generator] Fix broken usage of STDOUT
---
 .../base/output/OutputGeneratorBuilder.java        | 75 ----------------------
 .../template/TemplateTransformationsBuilder.java   | 13 +++-
 .../freemarker/generator/base/util/MapBuilder.java |  1 -
 .../cli/config/OutputGeneratorsSupplier.java       |  4 +-
 .../freemarker/generator/cli/config/Suppliers.java |  3 -
 .../generator/cli/task/FreeMarkerTask.java         |  6 --
 .../markdown/cli/introduction/getting-started.md   |  9 ++-
 .../markdown/cli/usage/transforming-directories.md | 54 +++++++---------
 8 files changed, 42 insertions(+), 123 deletions(-)

diff --git 
a/freemarker-generator-base/src/main/java/org/apache/freemarker/generator/base/output/OutputGeneratorBuilder.java
 
b/freemarker-generator-base/src/main/java/org/apache/freemarker/generator/base/output/OutputGeneratorBuilder.java
deleted file mode 100644
index 5f272c7..0000000
--- 
a/freemarker-generator-base/src/main/java/org/apache/freemarker/generator/base/output/OutputGeneratorBuilder.java
+++ /dev/null
@@ -1,75 +0,0 @@
-/*
- * Licensed to the Apache Software Foundation (ASF) under one or more
- * contributor license agreements.  See the NOTICE file distributed with
- * this work for additional information regarding copyright ownership.
- * The ASF licenses this file to You under the Apache License, Version 2.0
- * (the "License"); you may not use this file except in compliance with
- * the License.  You may obtain a copy of the License at
- *
- *     http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-package org.apache.freemarker.generator.base.output;
-
-import org.apache.freemarker.generator.base.datasource.DataSource;
-import org.apache.freemarker.generator.base.template.TemplateSource;
-
-import java.io.Writer;
-import java.util.ArrayList;
-import java.util.HashMap;
-import java.util.List;
-import java.util.Map;
-
-/**
- * Provide the logic to define multiple transformations from the user input.
- */
-public class OutputGeneratorBuilder {
-
-    /** Interactive template */
-    private TemplateSource interactiveTemplate;
-
-    /** List of templates and/or template directories to be rendered */
-    private String templateName;
-
-    /** Optional include patterns for resolving source templates or template 
directories */
-    private final List<String> includes;
-
-    /** Optional exclude patterns for resolving source templates or template 
directories */
-    private final List<String> excludes;
-
-    /** Optional output file or directory */
-    private String output;
-
-    /** Optional user-supplied writer */
-    private Writer writer;
-
-    /** Data sources used for the transformation */
-    private List<DataSource> dataSources;
-
-    /** Data sources used for the transformation */
-    private Map<String, Object> variables;
-
-    private OutputGeneratorBuilder() {
-        this.templateName = null;
-        this.includes = new ArrayList<>();
-        this.excludes = new ArrayList<>();
-        this.output = null;
-        this.writer = null;
-        this.dataSources = new ArrayList<>();
-        this.variables = new HashMap<>();
-    }
-
-    public static OutputGeneratorBuilder builder() {
-        return new OutputGeneratorBuilder();
-    }
-
-    public List<OutputGenerator> build() {
-        final List<OutputGenerator> result = new ArrayList<>();
-        return result;
-    }
-}
diff --git 
a/freemarker-generator-base/src/main/java/org/apache/freemarker/generator/base/template/TemplateTransformationsBuilder.java
 
b/freemarker-generator-base/src/main/java/org/apache/freemarker/generator/base/template/TemplateTransformationsBuilder.java
index 0db84bd..4945d52 100644
--- 
a/freemarker-generator-base/src/main/java/org/apache/freemarker/generator/base/template/TemplateTransformationsBuilder.java
+++ 
b/freemarker-generator-base/src/main/java/org/apache/freemarker/generator/base/template/TemplateTransformationsBuilder.java
@@ -20,6 +20,7 @@ import 
org.apache.freemarker.generator.base.FreeMarkerConstants.Location;
 import org.apache.freemarker.generator.base.datasource.DataSource;
 import org.apache.freemarker.generator.base.datasource.DataSourceFactory;
 import org.apache.freemarker.generator.base.file.RecursiveFileSupplier;
+import org.apache.freemarker.generator.base.util.NonClosableWriterWrapper;
 import org.apache.freemarker.generator.base.util.StringUtils;
 import org.apache.freemarker.generator.base.util.Validate;
 
@@ -233,7 +234,7 @@ public class TemplateTransformationsBuilder {
         } else if (templateOutputFile != null) {
             return TemplateOutput.fromFile(templateOutputFile, outputEncoding);
         } else {
-            return TemplateOutput.fromWriter(new BufferedWriter(new 
OutputStreamWriter(System.out, outputEncoding)));
+            return TemplateOutput.fromWriter(stdoutWriter(outputEncoding));
         }
     }
 
@@ -266,6 +267,11 @@ public class TemplateTransformationsBuilder {
     }
 
     private static File getTemplateOutputFile(File templateDirectory, File 
templateFile, File outputDirectory) {
+        if (outputDirectory == null) {
+            // missing output directory uses STDOUT
+            return null;
+        }
+
         final String relativePath = relativePath(templateDirectory, 
templateFile);
         final String relativeOutputFileName = mapExtension(relativePath);
         return new File(outputDirectory, relativeOutputFileName);
@@ -306,4 +312,9 @@ public class TemplateTransformationsBuilder {
             return fileName;
         }
     }
+
+    private Writer stdoutWriter(Charset outputEncoding) {
+        // avoid closing System.out after rendering the template
+        return new BufferedWriter(new NonClosableWriterWrapper(new 
OutputStreamWriter(System.out, outputEncoding)));
+    }
 }
diff --git 
a/freemarker-generator-base/src/main/java/org/apache/freemarker/generator/base/util/MapBuilder.java
 
b/freemarker-generator-base/src/main/java/org/apache/freemarker/generator/base/util/MapBuilder.java
index 9033fdb..60daa80 100644
--- 
a/freemarker-generator-base/src/main/java/org/apache/freemarker/generator/base/util/MapBuilder.java
+++ 
b/freemarker-generator-base/src/main/java/org/apache/freemarker/generator/base/util/MapBuilder.java
@@ -18,7 +18,6 @@ package org.apache.freemarker.generator.base.util;
 
 import java.util.HashMap;
 import java.util.LinkedHashMap;
-import java.util.List;
 import java.util.Map;
 
 public class MapBuilder {
diff --git 
a/freemarker-generator-cli/src/main/java/org/apache/freemarker/generator/cli/config/OutputGeneratorsSupplier.java
 
b/freemarker-generator-cli/src/main/java/org/apache/freemarker/generator/cli/config/OutputGeneratorsSupplier.java
index b0a6dbb..acbe370 100644
--- 
a/freemarker-generator-cli/src/main/java/org/apache/freemarker/generator/cli/config/OutputGeneratorsSupplier.java
+++ 
b/freemarker-generator-cli/src/main/java/org/apache/freemarker/generator/cli/config/OutputGeneratorsSupplier.java
@@ -43,8 +43,8 @@ public class OutputGeneratorsSupplier implements 
Supplier<List<OutputGenerator>>
 
     private List<OutputGenerator> outputGenerator(OutputGeneratorDefinition 
definition) {
         final List<OutputGenerator> result = new ArrayList<>();
-        final TemplateSourceDefinition templateSourceDefinition = 
definition.templateSourceDefinition;
-        final TemplateOutputDefinition templateOutputDefinition = 
definition.templateOutputDefinition;
+        final TemplateSourceDefinition templateSourceDefinition = 
definition.getTemplateSourceDefinition();
+        final TemplateOutputDefinition templateOutputDefinition = 
definition.getTemplateOutputDefinition();
         final TemplateTransformationsBuilder builder = 
TemplateTransformationsBuilder.builder();
 
         // set the template
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 c38e980..4cdce43 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
@@ -16,13 +16,10 @@
  */
 package org.apache.freemarker.generator.cli.config;
 
-import freemarker.cache.TemplateLoader;
 import org.apache.freemarker.generator.base.file.PropertiesClassPathSupplier;
 import org.apache.freemarker.generator.base.file.PropertiesFileSystemSupplier;
 import org.apache.freemarker.generator.base.file.PropertiesSupplier;
 
-import java.util.function.Supplier;
-
 /**
  * Convenience methods to create suppliers.
  */
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 f5f0046..d513b42 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
@@ -47,12 +47,6 @@ import static 
org.apache.freemarker.generator.base.FreeMarkerConstants.Model.DAT
 
 /**
  * Renders a FreeMarker template.
- * <p>
- * Implementation notes
- * <ul>
- *     <li>configurationSupplier provides the tools</li>
- *     <li>outputGeneratorsSupplier handles STDIN already</li>
- * </ul>
  */
 public class FreeMarkerTask implements Callable<Integer> {
 
diff --git 
a/freemarker-generator-cli/src/site/markdown/cli/introduction/getting-started.md
 
b/freemarker-generator-cli/src/site/markdown/cli/introduction/getting-started.md
index f1bc312..cf264ec 100644
--- 
a/freemarker-generator-cli/src/site/markdown/cli/introduction/getting-started.md
+++ 
b/freemarker-generator-cli/src/site/markdown/cli/introduction/getting-started.md
@@ -87,26 +87,25 @@ The distribution ships with a couple of FreeMarker 
templates and the `templates/
 to better understand `Apache FreeMarker Generator`
 
 ```
-> freemarker-generator -t freemarker-generator/info.ftl
+> freemarker-generator -t freemarker-generator/info.ftl 
 FreeMarker Generator Information
 ------------------------------------------------------------------------------
 FreeMarker version     : 2.3.30
-Template name          : info.ftl
+Template name          : freemarker-generator/info.ftl
 Language               : en
 Locale                 : en_US
-Timestamp              : Nov 9, 2020 1:13:21 PM
+Timestamp              : Jan 7, 2021 11:36:26 PM
 Output encoding        : UTF-8
 Output format          : plainText
 
 FreeMarker Generator Template Loader Directories
 ------------------------------------------------------------------------------
 [#1] /Users/sgoeschl/.freemarker-generator/templates
-[#2] 
/Users/sgoeschl/work/github/apache/freemarker-generator/freemarker-generator-cli/target/appassembler/templates
+[#2] /Applications/Java/freemarker-generator/templates
 
 FreeMarker Generator Data Model
 ---------------------------------------------------------------------------
 - dataSources
-- tools
 
 FreeMarker Generator Tools
 ------------------------------------------------------------------------------
diff --git 
a/freemarker-generator-cli/src/site/markdown/cli/usage/transforming-directories.md
 
b/freemarker-generator-cli/src/site/markdown/cli/usage/transforming-directories.md
index 2aa4e7f..247d9a8 100644
--- 
a/freemarker-generator-cli/src/site/markdown/cli/usage/transforming-directories.md
+++ 
b/freemarker-generator-cli/src/site/markdown/cli/usage/transforming-directories.md
@@ -34,12 +34,20 @@ server {
   index index.htm;
 ```
 
-### Transform Template Directory To STDOUT
+### Transform Template Directory To Output Directory
+
+The transformed templates are written to an `out` directory
 
-If no output directory is provided all output is written to `stdout`
+* `nginx.conf.ftl` was changed to `nginx.conf" during the transformation
 
 ```
-freemarker-generator -t examples/data/template/
+freemarker-generator -t examples/data/template/ -o out; tree out; cat 
out/application.properties out/nginx/nginx.conf
+out
+|-- application.properties
+`-- nginx
+    `-- nginx.conf
+
+1 directory, 2 files    
 # == application.properties ==================================================
 server.name=127.0.0.1
 server.logs=/var/log/nginx
@@ -53,35 +61,21 @@ server {
 }
 ```
 
-### Transform Template Directory To Output Directory
-
-The transformed templates are written to an `out` directory
-
-* `nginx.conf.ftl` was changed to `nginx.conf" during the transformation
-
-```
-freemarker-generator -t examples/data/template/ -o out; tree out
-out
-|-- application.properties
-`-- nginx
-    `-- nginx.conf
-
-1 directory, 2 files
-```
-
 ### Use Command Line Parameters
 
 A user-supplied parameter `NGINX_HOSTNAME` is used to render the templates
 
 ```
-freemarker-generator -t examples/data/template/ -P NGINX_HOSTNAME=localhost
+freemarker-generator -t examples/data/template/ -P 
NGINX_HOSTNAME=some.host.invalid -o out; \
+cat out/application.properties out/nginx/nginx.conf
+
 # == application.properties ==================================================
-server.name=localhost
+server.name=some.host.invalid
 server.logs=/var/log/nginx
 # == nginx-conf ==============================================================
 server {
   listen 80;
-  server_name localhost;
+  server_name some.host.invalid;
 
   root /usr/share/nginx/www;
   index index.htm;
@@ -136,15 +130,15 @@ server {
 Another option is passing the information as JSON file
 
 ```
-echo '{"NGINX_PORT":"8443","NGINX_HOSTNAME":"localhost"}' > nginx.json
+echo '{"NGINX_PORT":"8443","NGINX_HOSTNAME":"some.host.invalid"}' > nginx.json
 freemarker-generator -t examples/data/template/ -m nginx.json 
 # == application.properties ==================================================
-server.name=localhost
+server.name=some.host.invalid
 server.logs=/var/log/nginx
 # == nginx-conf ==============================================================
 server {
   listen 8443;
-  server_name localhost;
+  server_name some.host.invalid;
 
   root /usr/share/nginx/www;
   index index.htm;
@@ -156,7 +150,7 @@ server {
 Yet another option is using a YAML file
 
 ```
-echo -e "- NGINX_PORT": "\"8443\"\n- NGINX_HOSTNAME": "localhost" > nginx.yaml
+echo -e "- NGINX_PORT": "\"8443\"\n- NGINX_HOSTNAME": "some.host.invalid" > 
nginx.yaml
 freemarker-generator -t examples/data/template/ -m nginx.yaml 
 # == application.properties ==================================================
 server.name=localhost
@@ -179,15 +173,15 @@ In the cloud it is common to pass JSON configuration as 
environment variable
 * `#mimeType=application/json` defines that JSON content is parsed
 
 ```
-export NGINX_CONF='{"NGINX_PORT":"8443","NGINX_HOSTNAME":"localhost"}'
+export NGINX_CONF='{"NGINX_PORT":"8443","NGINX_HOSTNAME":"some.host.invalid"}'
 freemarker-generator -t examples/data/template/ -m 
env:///NGINX_CONF#mimeType=application/json
 # == application.properties ==================================================
-server.name=localhost
+server.name=some.host.invalid
 server.logs=/var/log/nginx
 # == nginx-conf ==============================================================
 server {
   listen 8443;
-  server_name localhost;
+  server_name some.host.invalid;
 
   root /usr/share/nginx/www;
   index index.htm;
@@ -199,7 +193,7 @@ server {
 For testing purpose it is useful to override certain settings
 
 ```
-export NGINX_CONF='{"NGINX_PORT":"8443","NGINX_HOSTNAME":"localhost"}'
+export NGINX_CONF='{"NGINX_PORT":"8443","NGINX_HOSTNAME":"some.host.invalid"}'
 freemarker-generator -t examples/data/template/ 
-PNGINX_HOSTNAME=www.mydomain.com -m env:///NGINX_CONF#mimeType=application/json
 # == application.properties ==================================================
 server.name=www.mydomain.com

Reply via email to