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
