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:01 UTC

[freemarker-generator] 01/03: FREEMARKER-161 [freemarker-generator] Fix broken usage of STDIN

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 b8d991f0082f9102ced7bba37c43ad3e088be75a
Author: Siegfried Goeschl <si...@gmail.com>
AuthorDate: Thu Jan 7 23:31:06 2021 +0100

    FREEMARKER-161 [freemarker-generator] Fix broken usage of STDIN
---
 freemarker-generator-cli/LICENSE                   |  6 ++++++
 .../app/templates/freemarker-generator/info.ftl    |  2 +-
 .../cli/config/OutputGeneratorsSupplier.java       | 24 ++++++++++++++++++++--
 .../src/site/markdown/cli/concepts/data-sources.md | 11 ++++++++++
 .../src/site/markdown/cli/concepts/design-goals.md |  1 +
 .../src/site/markdown/cli/concepts/passing-data.md |  2 +-
 .../site/markdown/cli/concepts/template-loading.md |  2 +-
 licences/LICENCE_javafaker.txt                     | 13 ++++++++++++
 8 files changed, 56 insertions(+), 5 deletions(-)

diff --git a/freemarker-generator-cli/LICENSE b/freemarker-generator-cli/LICENSE
index caca01c..f6a36bd 100644
--- a/freemarker-generator-cli/LICENSE
+++ b/freemarker-generator-cli/LICENSE
@@ -335,6 +335,12 @@ See licencens/LICENSE_ASL-2.0.txt for more information ...
 
 ==============================================================================
 
+Binary distributions of this product bundles java-faker which
+is available under Apache License Version 2.0.
+See licencens/LICENSE_ASL-2.0.txt for more information ...
+
+==============================================================================
+
 Binary distributions of this product bundles poi which
 is available under Apache License Version 2.0.
 See licencens/LICENSE_ASL-2.0.txt for more information ...
diff --git a/freemarker-generator-cli/src/app/templates/freemarker-generator/info.ftl b/freemarker-generator-cli/src/app/templates/freemarker-generator/info.ftl
index 1a34880..ac927ab 100644
--- a/freemarker-generator-cli/src/app/templates/freemarker-generator/info.ftl
+++ b/freemarker-generator-cli/src/app/templates/freemarker-generator/info.ftl
@@ -47,7 +47,7 @@ FreeMarker Generator Tools
 FreeMarker Generator DataSources
 ------------------------------------------------------------------------------
 <#list dataSources?values as ds>
-[#${ds?counter}]: name=${ds.name}, group=${ds.group}, fileName=${ds.fileName} mimeType=${ds.mimeType}, charset=${ds.charset}, length=${ds.length} Bytes
+[#${ds?counter}]: name=${ds.name}, group=${ds.group}, fileName=${ds.fileName}, mimeType=${ds.mimeType}, charset=${ds.charset}, length=${ds.length} Bytes
 URI : ${ds.uri}
 </#list>
 </#if>
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 e7fad76..b0a6dbb 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
@@ -1,14 +1,18 @@
 package org.apache.freemarker.generator.cli.config;
 
+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.datasource.DataSourcesSupplier;
 import org.apache.freemarker.generator.base.output.OutputGenerator;
 import org.apache.freemarker.generator.base.template.TemplateTransformation;
 import org.apache.freemarker.generator.base.template.TemplateTransformationsBuilder;
+import org.apache.freemarker.generator.base.util.UriUtils;
 import org.apache.freemarker.generator.cli.picocli.OutputGeneratorDefinition;
 import org.apache.freemarker.generator.cli.picocli.TemplateOutputDefinition;
 import org.apache.freemarker.generator.cli.picocli.TemplateSourceDefinition;
 
+import java.net.URI;
 import java.util.ArrayList;
 import java.util.Collection;
 import java.util.List;
@@ -16,6 +20,11 @@ import java.util.Map;
 import java.util.function.Supplier;
 import java.util.stream.Collectors;
 
+import static java.nio.charset.StandardCharsets.UTF_8;
+import static org.apache.freemarker.generator.base.FreeMarkerConstants.DEFAULT_GROUP;
+import static org.apache.freemarker.generator.base.FreeMarkerConstants.Location.STDIN;
+import static org.apache.freemarker.generator.base.mime.Mimetypes.MIME_TEXT_PLAIN;
+
 public class OutputGeneratorsSupplier implements Supplier<List<OutputGenerator>> {
 
     private final Settings settings;
@@ -71,7 +80,7 @@ public class OutputGeneratorsSupplier implements Supplier<List<OutputGenerator>>
             final OutputGenerator outputGenerator = new OutputGenerator(
                     templateTransformation.getTemplateSource(),
                     templateTransformation.getTemplateOutput(),
-                    dataSources(definition),
+                    dataSources(settings, definition),
                     dataModels(definition)
             );
             result.add(outputGenerator);
@@ -80,9 +89,15 @@ public class OutputGeneratorsSupplier implements Supplier<List<OutputGenerator>>
         return result;
     }
 
-    private List<DataSource> dataSources(OutputGeneratorDefinition outputGeneratorDefinition) {
+    private List<DataSource> dataSources(Settings settings, OutputGeneratorDefinition outputGeneratorDefinition) {
         final ArrayList<DataSource> result = new ArrayList<>();
 
+        // Add optional data source from STDIN at the start of the list since
+        // this allows easy sequence slicing in FreeMarker.
+        if (settings.isReadFromStdin()) {
+            result.add(0, stdinDataSource());
+        }
+
         final DataSourcesSupplier sharedDataSourcesSupplier = new DataSourcesSupplier(
                 settings.getSources(),
                 settings.getSourceIncludePattern(),
@@ -107,4 +122,9 @@ public class OutputGeneratorsSupplier implements Supplier<List<OutputGenerator>>
     private Map<String, Object> dataModels(OutputGeneratorDefinition outputGeneratorDefinition) {
         return new DataModelSupplier(outputGeneratorDefinition.getDataModels()).get();
     }
+
+    private static DataSource stdinDataSource() {
+        final URI uri = UriUtils.toUri(Location.SYSTEM, STDIN);
+        return DataSourceFactory.fromInputStream(STDIN, DEFAULT_GROUP, uri, System.in, MIME_TEXT_PLAIN, UTF_8);
+    }
 }
diff --git a/freemarker-generator-cli/src/site/markdown/cli/concepts/data-sources.md b/freemarker-generator-cli/src/site/markdown/cli/concepts/data-sources.md
index 53dd6bf..e6e4b3e 100644
--- a/freemarker-generator-cli/src/site/markdown/cli/concepts/data-sources.md
+++ b/freemarker-generator-cli/src/site/markdown/cli/concepts/data-sources.md
@@ -83,6 +83,17 @@ URI : file:/Users/sgoeschl/work/github/apache/freemarker-generator/freemarker-ge
 URI : file:/Users/sgoeschl/work/github/apache/freemarker-generator/freemarker-generator-cli/target/appassembler/examples/data/json/swagger-spec.json```
 ```
 
+Access to `stdin` is implemented as `DataSource` - please not that `stdin` is read lazy to cater for arbitrary large input data
+
+```
+cat examples/data/csv/contract.csv | bin/freemarker-generator -t freemarker-generator/info.ftl --stdin
+
+FreeMarker Generator DataSources
+------------------------------------------------------------------------------
+[#1]: name=stdin, group=default, fileName=stdin mimeType=text/plain, charset=UTF-8, length=-1 Bytes
+URI : system:///stdin
+```
+
 ### Selecting A DataSource
 
 After loading one or more `DataSource` they are accessible as `dataSource` map in the FreeMarker model
diff --git a/freemarker-generator-cli/src/site/markdown/cli/concepts/design-goals.md b/freemarker-generator-cli/src/site/markdown/cli/concepts/design-goals.md
index 0d2e07c..1cf4634 100644
--- a/freemarker-generator-cli/src/site/markdown/cli/concepts/design-goals.md
+++ b/freemarker-generator-cli/src/site/markdown/cli/concepts/design-goals.md
@@ -13,5 +13,6 @@
 * XML & XPath is supported by FreeMarker [out-of-the-box](http://freemarker.org/docs/xgui.html)
 * Support for reading a data source content from STDIN to integrate with command line tools
 * Support execution of arbitrary commands using [Apache Commons Exec](https://commons.apache.org/proper/commons-exec/)
+* Support creation of test data using [JavaFaker](https://github.com/DiUS/java-faker/)
 * Add some commonly useful information such as `System Properties`, `Enviroment Variables`
 * Support embedding the code in existing applications
\ No newline at end of file
diff --git a/freemarker-generator-cli/src/site/markdown/cli/concepts/passing-data.md b/freemarker-generator-cli/src/site/markdown/cli/concepts/passing-data.md
index d181c01..3ff42cc 100644
--- a/freemarker-generator-cli/src/site/markdown/cli/concepts/passing-data.md
+++ b/freemarker-generator-cli/src/site/markdown/cli/concepts/passing-data.md
@@ -5,7 +5,7 @@
 * System properties
 * Parameters 
 
-### User-Supplied System Poperties
+### User-Supplied System Properties
 
 User-supplied system properties are added to the JVM's system properties
 
diff --git a/freemarker-generator-cli/src/site/markdown/cli/concepts/template-loading.md b/freemarker-generator-cli/src/site/markdown/cli/concepts/template-loading.md
index 9de70b6..14f945a 100644
--- a/freemarker-generator-cli/src/site/markdown/cli/concepts/template-loading.md
+++ b/freemarker-generator-cli/src/site/markdown/cli/concepts/template-loading.md
@@ -47,7 +47,7 @@ irrelevant therefore any template file outside of the template loader directorie
 This example loads the `info.ftl` directly from a GitHub URL
 
 ```
-freemarker-generator -t https://raw.githubusercontent.com/apache/freemarker-generator/master/freemarker-generator-cli/templates/info.ftl
+freemarker-generator -t https://raw.githubusercontent.com/apache/freemarker-generator/master/freemarker-generator-cli/src/app/templates/freemarker-generator/info.ftl
 ```
 
 ### Interactive Template Loading
diff --git a/licences/LICENCE_javafaker.txt b/licences/LICENCE_javafaker.txt
new file mode 100644
index 0000000..896c78c
--- /dev/null
+++ b/licences/LICENCE_javafaker.txt
@@ -0,0 +1,13 @@
+Copyright 2014 DiUS Computing
+
+Licensed 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.
\ No newline at end of file