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

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


The following commit(s) were added to refs/heads/FREEMARKER-142 by this push:
     new 33f0f66  FREEMARKER-142 First draft of supporting multiple templates 
on the command line
33f0f66 is described below

commit 33f0f661659058ec5818a380bb9103adb93f325d
Author: Siegfried Goeschl <[email protected]>
AuthorDate: Tue May 26 19:21:44 2020 +0200

    FREEMARKER-142 First draft of supporting multiple templates on the command 
line
---
 .../generator/base/file/RecursiveFileSupplier.java |   1 +
 .../template/TemplateTransformationsBuilder.java   |   2 +-
 .../generator/file/RecursiveFileSupplierTest.java  |  10 +-
 .../TemplateTransformationsBuilderTest.java        |  12 +--
 .../src/test/template/application.properties       |   5 +-
 .../src/test/template/nginx/nginx.conf.ftl         |   7 +-
 .../org/apache/freemarker/generator/cli/Main.java  |   7 +-
 .../freemarker/generator/cli/config/Settings.java  |   2 +-
 .../generator/cli/task/FreeMarkerTask.java         | 111 ++++++++++++---------
 .../freemarker/generator/cli/ManualTest.java       |   3 +-
 travis.sh                                          |   5 +
 11 files changed, 96 insertions(+), 69 deletions(-)

diff --git 
a/freemarker-generator-base/src/main/java/org/apache/freemarker/generator/base/file/RecursiveFileSupplier.java
 
b/freemarker-generator-base/src/main/java/org/apache/freemarker/generator/base/file/RecursiveFileSupplier.java
index 097e17d..ef60fe7 100644
--- 
a/freemarker-generator-base/src/main/java/org/apache/freemarker/generator/base/file/RecursiveFileSupplier.java
+++ 
b/freemarker-generator-base/src/main/java/org/apache/freemarker/generator/base/file/RecursiveFileSupplier.java
@@ -71,6 +71,7 @@ public class RecursiveFileSupplier implements 
Supplier<List<File>> {
         return sources.stream()
                 .map(this::resolve)
                 .flatMap(Collection::stream)
+                .sorted()
                 .collect(toList());
     }
 
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 bb74883..08c2ae7 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
@@ -215,7 +215,7 @@ public class TemplateTransformationsBuilder {
     }
 
     private TemplateOutput templateOutput(File templateOutputFile) {
-        if (templateOutputFile != null) {
+        if (writer == null && templateOutputFile != null) {
             return TemplateOutput.fromFile(templateOutputFile);
         } else {
             return TemplateOutput.fromWriter(writer);
diff --git 
a/freemarker-generator-base/src/test/java/org/apache/freemarker/generator/file/RecursiveFileSupplierTest.java
 
b/freemarker-generator-base/src/test/java/org/apache/freemarker/generator/file/RecursiveFileSupplierTest.java
index f7ce94f..5e678c5 100644
--- 
a/freemarker-generator-base/src/test/java/org/apache/freemarker/generator/file/RecursiveFileSupplierTest.java
+++ 
b/freemarker-generator-base/src/test/java/org/apache/freemarker/generator/file/RecursiveFileSupplierTest.java
@@ -53,8 +53,8 @@ public class RecursiveFileSupplierTest {
         final List<File> files = fileSupplier(sources, "*", null).get();
 
         assertEquals(2, files.size());
-        assertEquals("pom.xml", files.get(0).getName());
-        assertEquals("README.md", files.get(1).getName());
+        assertEquals("README.md", files.get(0).getName());
+        assertEquals("pom.xml", files.get(1).getName());
     }
 
     @Test
@@ -78,9 +78,9 @@ public class RecursiveFileSupplierTest {
         final List<File> files = fileSupplier(ANY_DIRECTORY, null, 
"*.csv").get();
 
         assertEquals(3, files.size());
-        assertEquals("file_01.txt", files.get(0).getName());
-        assertEquals("nginx.env", files.get(1).getName());
-        assertEquals("test.properties", files.get(2).getName());
+        assertEquals("nginx.env", files.get(0).getName());
+        assertEquals("test.properties", files.get(1).getName());
+        assertEquals("file_01.txt", files.get(2).getName());
     }
 
     @Test
diff --git 
a/freemarker-generator-base/src/test/java/org/apache/freemarker/generator/template/TemplateTransformationsBuilderTest.java
 
b/freemarker-generator-base/src/test/java/org/apache/freemarker/generator/template/TemplateTransformationsBuilderTest.java
index 617ae5b..3cc0545 100644
--- 
a/freemarker-generator-base/src/test/java/org/apache/freemarker/generator/template/TemplateTransformationsBuilderTest.java
+++ 
b/freemarker-generator-base/src/test/java/org/apache/freemarker/generator/template/TemplateTransformationsBuilderTest.java
@@ -143,8 +143,8 @@ public class TemplateTransformationsBuilderTest {
                 .build();
 
         assertEquals(2, transformations.size());
-        assertEquals(new File("nginx/nginx.conf"), 
transformations.get(0).getTemplateOutput().getFile());
-        assertEquals(new File("application.properties"), 
transformations.get(1).getTemplateOutput().getFile());
+        assertEquals("application.properties", 
transformations.get(0).getTemplateSource().getName());
+        assertEquals("nginx.conf.ftl", 
transformations.get(1).getTemplateSource().getName());
     }
 
     @Test
@@ -155,8 +155,8 @@ public class TemplateTransformationsBuilderTest {
                 .build();
 
         assertEquals(2, transformations.size());
-        assertEquals(new File("/foo/nginx/nginx.conf"), 
transformations.get(0).getTemplateOutput().getFile());
-        assertEquals(new File("/foo/application.properties"), 
transformations.get(1).getTemplateOutput().getFile());
+        assertEquals("application.properties", 
transformations.get(0).getTemplateSource().getName());
+        assertEquals("nginx.conf.ftl", 
transformations.get(1).getTemplateSource().getName());
     }
 
     @Test
@@ -168,7 +168,7 @@ public class TemplateTransformationsBuilderTest {
                 .build();
 
         assertEquals(1, transformations.size());
-        assertEquals(new File("application.properties"), 
transformations.get(0).getTemplateOutput().getFile());
+        assertEquals("application.properties", 
transformations.get(0).getTemplateSource().getName());
     }
 
     @Test
@@ -180,7 +180,7 @@ public class TemplateTransformationsBuilderTest {
                 .build();
 
         assertEquals(1, transformations.size());
-        assertEquals(new File("application.properties"), 
transformations.get(0).getTemplateOutput().getFile());
+        assertEquals("application.properties", 
transformations.get(0).getTemplateSource().getName());
     }
 
     private TemplateTransformationsBuilder builder() {
diff --git a/freemarker-generator-base/src/test/template/application.properties 
b/freemarker-generator-base/src/test/template/application.properties
index 685cd4b..bd73f9b 100644
--- a/freemarker-generator-base/src/test/template/application.properties
+++ b/freemarker-generator-base/src/test/template/application.properties
@@ -1,2 +1,3 @@
-server.name=${NGINX_HOSTNAME}
-server.logs=${NGINX_LOGS}
\ No newline at end of file
+# == application.properties ==================================================
+server.name=${NGINX_HOSTNAME!"localhost"}
+server.logs=${NGINX_LOGS!"/var/log/nginx"}
\ No newline at end of file
diff --git a/freemarker-generator-base/src/test/template/nginx/nginx.conf.ftl 
b/freemarker-generator-base/src/test/template/nginx/nginx.conf.ftl
index 4d048e8..dbc6e52 100644
--- a/freemarker-generator-base/src/test/template/nginx/nginx.conf.ftl
+++ b/freemarker-generator-base/src/test/template/nginx/nginx.conf.ftl
@@ -1,7 +1,8 @@
+# == nginx-conf =============================================================
 server {
-  listen 80;
-  server_name ${NGINX_HOSTNAME};
+  listen ${NGINX_PORT!"80"};
+  server_name ${NGINX_HOSTNAME!"localhost"};
 
-  root ${NGINX_WEBROOT};
+  root ${NGINX_WEBROOT!"/usr/share/nginx/www"};
   index index.htm;
 }
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 43f92c7..4634386 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
@@ -33,7 +33,6 @@ import picocli.CommandLine.Spec;
 
 import java.io.BufferedWriter;
 import java.io.File;
-import java.io.FileWriter;
 import java.io.IOException;
 import java.io.OutputStreamWriter;
 import java.io.Writer;
@@ -220,10 +219,10 @@ public class Main implements Callable<Integer> {
         try {
             if (userSuppliedWriter != null) {
                 return userSuppliedWriter;
-            } else if (!StringUtils.isEmpty(outputFile)) {
-                return new BufferedWriter(new FileWriter(outputFile));
-            } else {
+            } else if (StringUtils.isEmpty(outputFile)) {
                 return new BufferedWriter(new OutputStreamWriter(System.out, 
outputEncoding));
+            } else {
+                return null;
             }
         } catch (IOException e) {
             throw new RuntimeException("Unable to create writer", e);
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 2b78758..c9f2476 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
@@ -148,7 +148,7 @@ public class Settings {
         this.parameters = requireNonNull(parameters);
         this.systemProperties = requireNonNull(systemProperties);
         this.configuration = requireNonNull(configuration);
-        this.writer = new NonClosableWriterWrapper(requireNonNull(writer));
+        this.writer = writer != null ? new NonClosableWriterWrapper(writer) : 
null;
     }
 
     public static SettingsBuilder builder() {
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 f8955b0..7813a4e 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
@@ -18,16 +18,22 @@ package org.apache.freemarker.generator.cli.task;
 
 import freemarker.template.Configuration;
 import freemarker.template.Template;
+import freemarker.template.TemplateException;
 import org.apache.commons.io.FileUtils;
 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.DataSources;
+import org.apache.freemarker.generator.base.template.TemplateOutput;
+import org.apache.freemarker.generator.base.template.TemplateSource;
+import org.apache.freemarker.generator.base.template.TemplateTransformation;
 import org.apache.freemarker.generator.base.template.TemplateTransformations;
 import org.apache.freemarker.generator.base.util.UriUtils;
 import org.apache.freemarker.generator.cli.config.Settings;
 
+import java.io.BufferedWriter;
 import java.io.File;
+import java.io.FileWriter;
 import java.io.IOException;
 import java.io.Writer;
 import java.net.URI;
@@ -96,16 +102,28 @@ public class FreeMarkerTask implements Callable<Integer> {
 
     @Override
     public Integer call() {
-        final TemplateTransformations templateTransformations = 
templateTransformationsSupplier.get();
-        final Template template = template(settings, configurationSupplier);
-        try (Writer writer = settings.getWriter(); DataSources dataSources = 
dataSources(settings, dataSourcesSupplier)) {
+        try {
+            final Configuration configuration = configurationSupplier.get();
+            final TemplateTransformations templateTransformations = 
templateTransformationsSupplier.get();
+            final DataSources dataSources = dataSources(settings, 
dataSourcesSupplier);
             final Map<String, Object> dataModel = dataModel(dataSources, 
parameterModelSupplier, dataModelsSupplier, toolsSupplier);
-            template.process(dataModel, writer);
+            templateTransformations.getList().forEach(t -> 
process(configuration, t, dataModel));
             return SUCCESS;
         } catch (RuntimeException e) {
-            throw e;
-        } catch (Exception e) {
-            throw new RuntimeException("Failed to render FreeMarker template: 
" + template.getName(), e);
+            throw new RuntimeException("Failed to process templates", e);
+        }
+    }
+
+    private void process(Configuration configuration,
+                         TemplateTransformation templateTransformation,
+                         Map<String, Object> dataModel) {
+        final TemplateSource templateSource = 
templateTransformation.getTemplateSource();
+        final TemplateOutput templateOutput = 
templateTransformation.getTemplateOutput();
+        try (Writer writer = writer(templateOutput)) {
+            final Template template = template(configuration, templateSource);
+            template.process(dataModel, writer);
+        } catch (TemplateException | IOException e) {
+            throw new RuntimeException("Failed to process template: " + 
templateSource.getName(), e);
         }
     }
 
@@ -122,33 +140,6 @@ public class FreeMarkerTask implements Callable<Integer> {
         return new DataSources(dataSources);
     }
 
-    /**
-     * Loading FreeMarker templates from absolute paths is not encouraged due 
to security
-     * concern (see 
https://freemarker.apache.org/docs/pgui_config_templateloading.html#autoid_42)
-     * which are mostly irrelevant when running on the command line. So we 
resolve the absolute file
-     * instead of relying on existing template loaders.
-     *
-     * @param settings              Settings
-     * @param configurationSupplier Supplies FreeMarker configuration
-     * @return FreeMarker template
-     */
-    private static Template template(Settings settings, 
Supplier<Configuration> configurationSupplier) {
-        final String templateName = settings.getTemplateName();
-        final Configuration configuration = configurationSupplier.get();
-
-        try {
-            if (settings.isInteractiveTemplate()) {
-                return interactiveTemplate(settings, configuration);
-            } else if (isAbsoluteTemplateFile(settings)) {
-                return fileTemplate(settings, configuration);
-            } else {
-                return configuration.getTemplate(templateName);
-            }
-        } catch (IOException e) {
-            throw new RuntimeException("Failed to load template: " + 
templateName, e);
-        }
-    }
-
     private static Map<String, Object> dataModel(
             DataSources dataSources,
             Supplier<Map<String, Object>> parameterModelSupplier,
@@ -162,27 +153,55 @@ public class FreeMarkerTask implements Callable<Integer> {
         return result;
     }
 
-    private static boolean isAbsoluteTemplateFile(Settings settings) {
-        final File file = new File(settings.getTemplateName());
-        return file.isAbsolute() && file.exists() & !file.isDirectory();
+    // ==============================================================
+
+    private static Writer writer(TemplateOutput templateOutput) throws 
IOException {
+        if (templateOutput.getWriter() != null) {
+            return templateOutput.getWriter();
+        }
+
+        final File file = templateOutput.getFile();
+        FileUtils.forceMkdirParent(file);
+        return new BufferedWriter(new FileWriter(file));
     }
 
-    private static Template fileTemplate(Settings settings, Configuration 
configuration) {
-        final String templateName = settings.getTemplateName();
-        final File templateFile = new File(templateName);
+    /**
+     * Loading FreeMarker templates from absolute paths is not encouraged due 
to security
+     * concern (see 
https://freemarker.apache.org/docs/pgui_config_templateloading.html#autoid_42)
+     * which are mostly irrelevant when running on the command line. So we 
resolve the absolute file
+     * instead of relying on existing template loaders.
+     *
+     * @param configuration  FreeMarker configuration
+     * @param templateSource source template to load
+     * @return FreeMarker template
+     */
+    private static Template template(Configuration configuration, 
TemplateSource templateSource) {
+        switch (templateSource.getOrigin()) {
+            case PATH:
+                return fromTemplatePath(configuration, templateSource);
+            case CODE:
+                return fromTemplateCode(configuration, templateSource);
+            default:
+                throw new IllegalArgumentException("Don't know how to handle: 
" + templateSource.getOrigin());
+        }
+    }
+
+    private static Template fromTemplatePath(Configuration configuration, 
TemplateSource templateSource) {
+        final String path = templateSource.getPath();
         try {
-            final String content = FileUtils.readFileToString(templateFile, 
settings.getTemplateEncoding());
-            return new Template(templateName, content, configuration);
+            return configuration.getTemplate(path);
         } catch (IOException e) {
-            throw new RuntimeException("Failed to load template: " + 
templateName, e);
+            throw new RuntimeException("Failed to load template from path: " + 
path, e);
         }
     }
 
-    private static Template interactiveTemplate(Settings settings, 
Configuration configuration) {
+    private static Template fromTemplateCode(Configuration configuration, 
TemplateSource templateSource) {
+        final String name = templateSource.getName();
+
         try {
-            return new Template(Location.INTERACTIVE, 
settings.getInteractiveTemplate(), configuration);
+            return new Template(name, templateSource.getCode(), configuration);
         } catch (IOException e) {
-            throw new RuntimeException("Failed to load interactive template", 
e);
+            throw new RuntimeException("Failed to load template code: " + 
name, e);
         }
     }
 }
diff --git 
a/freemarker-generator-cli/src/test/java/org/apache/freemarker/generator/cli/ManualTest.java
 
b/freemarker-generator-cli/src/test/java/org/apache/freemarker/generator/cli/ManualTest.java
index 210f32f..2dbaf2c 100644
--- 
a/freemarker-generator-cli/src/test/java/org/apache/freemarker/generator/cli/ManualTest.java
+++ 
b/freemarker-generator-cli/src/test/java/org/apache/freemarker/generator/cli/ManualTest.java
@@ -48,7 +48,8 @@ public class ManualTest {
     // private static final String CMD = "-b ./src/test -t templates/demo.ftl 
-m env=./site/sample/properties/user_0001/user.properties";
     // private static final String CMD = "-b ./src/test -t templates/demo.ftl 
-m ./site/sample/properties/user_0001/user.properties";
     // private static final String CMD = "-b ./src/test --data-model 
post=https://jsonplaceholder.typicode.com/posts/2 -t templates/info.ftl";
-    private static final String CMD = "-b ./src/test -t templates/info.ftl -P 
name=value";
+    // private static final String CMD = "-b ./src/test -t templates/info.ftl 
-P name=value";
+    private static final String CMD = "-P NGINX_PORT=8080 -t 
../freemarker-generator-base/src/test/template -t templates/info.ftl";
 
 
     public static void main(String[] args) {
diff --git a/travis.sh b/travis.sh
new file mode 100755
index 0000000..e9c3f62
--- /dev/null
+++ b/travis.sh
@@ -0,0 +1,5 @@
+mvn clean install
+cd ./freemarker-generator-cli
+sh ./run-samples.sh
+cd ../freemarker-generator-maven-plugin-sample
+mvn clean package
\ No newline at end of file

Reply via email to