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 2021/01/08 21:27:02 UTC
[freemarker-generator] 02/03: FREEMARKER-161 [freemarker-generator]
Fix broken usage of STDOUT
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 <si...@gmail.com>
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