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

commit ce2c917339f4c3ffbc7794387bab63e5e7eb365a
Author: Siegfried Goeschl <[email protected]>
AuthorDate: Sat May 23 18:22:04 2020 +0200

    FREEMARKER-142 First draft of supporting multiple templates on the command 
line
---
 .../template/TemplateTransformationsBuilder.java   | 57 +++++++++++++++++++---
 .../template/TemplateTransformationsSupplier.java  |  6 +++
 .../TemplateTransformationsBuilderTest.java        | 55 +++++++++++++++++++--
 .../freemarker/generator/cli/config/Settings.java  |  1 +
 .../freemarker/generator/cli/config/Suppliers.java | 13 +++++
 .../generator/cli/task/FreeMarkerTask.java         | 17 +++++--
 6 files changed, 134 insertions(+), 15 deletions(-)

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 834e3aa..bb74883 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
@@ -18,8 +18,14 @@ import java.util.List;
 import static java.nio.charset.StandardCharsets.UTF_8;
 import static java.util.Collections.singletonList;
 
+/**
+ * Provide the logic to define multiple transformations from the user input.
+ */
 public class TemplateTransformationsBuilder {
 
+    /** Interactive template */
+    private TemplateSource template;
+
     /** List of templates and/or template directories to be rendered */
     private final List<String> sources;
 
@@ -48,17 +54,31 @@ public class TemplateTransformationsBuilder {
     }
 
     public TemplateTransformations build() {
+        validate();
+
         final List<TemplateTransformation> result = new ArrayList<>();
 
-        for (int i = 0; i < sources.size(); i++) {
-            final String source = sources.get(i);
-            final File output = i < outputs.size() ? outputs.get(i) : null;
-            result.addAll(resolve(source, output));
+        if (template != null) {
+            final File outputFile = outputs.isEmpty() ? null : outputs.get(0);
+            result.add(resolveInteractiveTemplate(outputFile));
+        } else {
+            for (int i = 0; i < sources.size(); i++) {
+                final String source = sources.get(i);
+                final File output = i < outputs.size() ? outputs.get(i) : null;
+                result.addAll(resolve(source, output));
+            }
         }
 
         return new TemplateTransformations(result);
     }
 
+    public TemplateTransformationsBuilder setTemplate(String name, String 
code) {
+        if (StringUtils.isNotEmpty(code)) {
+            this.template = TemplateSource.fromCode(name, code);
+        }
+        return this;
+    }
+
     public TemplateTransformationsBuilder addSource(String source) {
         if (StringUtils.isNotEmpty(source)) {
             this.sources.add(source);
@@ -67,9 +87,7 @@ public class TemplateTransformationsBuilder {
     }
 
     public TemplateTransformationsBuilder addSources(Collection<String> 
sources) {
-        if (sources != null) {
-            this.sources.addAll(sources);
-        }
+        sources.forEach(this::addSource);
         return this;
     }
 
@@ -108,6 +126,13 @@ public class TemplateTransformationsBuilder {
         return this;
     }
 
+    public TemplateTransformationsBuilder addOutput(File output) {
+        if (output != null) {
+            this.outputs.add(output);
+        }
+        return this;
+    }
+
     public TemplateTransformationsBuilder addOutputs(Collection<String> 
outputs) {
         if (outputs != null) {
             outputs.forEach(this::addOutput);
@@ -125,6 +150,11 @@ public class TemplateTransformationsBuilder {
         return this;
     }
 
+    private void validate() {
+        Validate.isTrue(template != null || !sources.isEmpty(), "No template 
was provided");
+        Validate.isTrue(template == null || sources.isEmpty(), "Interactive 
template does not support multiple sources");
+    }
+
     /**
      * Resolve a <code>source</code> to a list of 
<code>TemplateTransformation</code>.
      *
@@ -140,7 +170,7 @@ public class TemplateTransformationsBuilder {
         } else if (isTemplatePath(source)) {
             return resolveTemplatePath(source, output);
         } else {
-            throw new RuntimeException("Don't know how to resolve: " + source);
+            return resolveTemplateCode(source, output);
         }
     }
 
@@ -173,6 +203,17 @@ public class TemplateTransformationsBuilder {
         return singletonList(new TemplateTransformation(templateSource, 
templateOutput));
     }
 
+    private TemplateTransformation resolveInteractiveTemplate(File out) {
+        final TemplateOutput templateOutput = templateOutput(out);
+        return new TemplateTransformation(template, templateOutput);
+    }
+
+    private List<TemplateTransformation> resolveTemplateCode(String source, 
File out) {
+        final TemplateSource templateSource = 
TemplateSource.fromCode("interactive", source);
+        final TemplateOutput templateOutput = templateOutput(out);
+        return singletonList(new TemplateTransformation(templateSource, 
templateOutput));
+    }
+
     private TemplateOutput templateOutput(File templateOutputFile) {
         if (templateOutputFile != null) {
             return TemplateOutput.fromFile(templateOutputFile);
diff --git 
a/freemarker-generator-base/src/main/java/org/apache/freemarker/generator/base/template/TemplateTransformationsSupplier.java
 
b/freemarker-generator-base/src/main/java/org/apache/freemarker/generator/base/template/TemplateTransformationsSupplier.java
new file mode 100644
index 0000000..d0472b2
--- /dev/null
+++ 
b/freemarker-generator-base/src/main/java/org/apache/freemarker/generator/base/template/TemplateTransformationsSupplier.java
@@ -0,0 +1,6 @@
+package org.apache.freemarker.generator.base.template;
+
+import java.util.function.Supplier;
+
+public interface TemplateTransformationsSupplier extends 
Supplier<TemplateTransformations> {
+}
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 f1e4067..617ae5b 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
@@ -33,9 +33,44 @@ import static org.junit.Assert.assertNull;
 public class TemplateTransformationsBuilderTest {
 
     private static final String ANY_TEMPLATE_FILE_NAME = 
"src/test/template/application.properties";
+    private static final String OTHER_TEMPLATE_FILE_NAME = 
"src/test/template/nginx/nginx.conf.ftl";
     private static final String ANY_TEMPLATE_PATH = "template/info.ftl";
     private static final String ANY_TEMPLATE_DIRECTORY_NAME = 
"src/test/template";
 
+    // === Interactive Template =============================================
+
+    @Test
+    public void shouldCreateFromInteractiveTemplate() {
+        final TemplateTransformations transformations = builder()
+                .setTemplate("interactive", "Hello World")
+                .setStdOut()
+                .build();
+
+        assertEquals(1, transformations.size());
+
+        final TemplateSource templateSource = 
transformations.get(0).getTemplateSource();
+        final TemplateOutput templateOutput = 
transformations.get(0).getTemplateOutput();
+
+        assertEquals("interactive", templateSource.getName());
+        assertEquals(Origin.CODE, templateSource.getOrigin());
+        assertEquals("Hello World", templateSource.getCode());
+        assertNull(templateSource.getPath());
+        assertEquals(StandardCharsets.UTF_8, templateSource.getEncoding());
+
+        assertNotNull(templateOutput.getWriter());
+        assertNull(templateOutput.getFile());
+    }
+
+    @Test(expected = IllegalArgumentException.class)
+    public void 
shouldThrowIllegalArgumentExceptionWheMixingInteractiveTemplateWithSources() {
+        builder()
+                .setTemplate("interactive", "Hello World")
+                .addSource(ANY_TEMPLATE_FILE_NAME)
+                .setStdOut()
+                .build();
+    }
+
+
     // === Template File ====================================================
 
     @Test
@@ -60,6 +95,20 @@ public class TemplateTransformationsBuilderTest {
         assertNull(templateOutput.getFile());
     }
 
+    @Test
+    public void shouldCreateFromMultipleTemplateFiles() {
+        final TemplateTransformations transformations = builder()
+                .addSource(ANY_TEMPLATE_FILE_NAME)
+                .addOutput("foo/first.out")
+                .addSource(OTHER_TEMPLATE_FILE_NAME)
+                .addOutput("foo/second.out")
+                .build();
+
+        assertEquals(2, transformations.size());
+        assertEquals(new File("foo/first.out"), 
transformations.get(0).getTemplateOutput().getFile());
+        assertEquals(new File("foo/second.out"), 
transformations.get(1).getTemplateOutput().getFile());
+    }
+
     // === Template Path ====================================================
 
     @Test
@@ -102,12 +151,12 @@ public class TemplateTransformationsBuilderTest {
     public void shouldCreateFromTemplateDirectoryWithOutputDirectory() {
         final TemplateTransformations transformations = builder()
                 .addSource(ANY_TEMPLATE_DIRECTORY_NAME)
-                .addOutput("/tmp")
+                .addOutput("/foo")
                 .build();
 
         assertEquals(2, transformations.size());
-        assertEquals(new File("/tmp/nginx/nginx.conf"), 
transformations.get(0).getTemplateOutput().getFile());
-        assertEquals(new File("/tmp/application.properties"), 
transformations.get(1).getTemplateOutput().getFile());
+        assertEquals(new File("/foo/nginx/nginx.conf"), 
transformations.get(0).getTemplateOutput().getFile());
+        assertEquals(new File("/foo/application.properties"), 
transformations.get(1).getTemplateOutput().getFile());
     }
 
     @Test
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 29443f7..2b78758 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
@@ -171,6 +171,7 @@ public class Settings {
         return templates;
     }
 
+    // TODO remove later on
     public String getTemplateName() {
         return templates.isEmpty() ? null : templates.get(0);
     }
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 ac7fb9f..2c220b2 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
@@ -21,6 +21,8 @@ import 
org.apache.freemarker.generator.base.datasource.DataSourcesSupplier;
 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 
org.apache.freemarker.generator.base.template.TemplateTransformationsBuilder;
+import 
org.apache.freemarker.generator.base.template.TemplateTransformationsSupplier;
 
 import java.util.Map;
 import java.util.function.Supplier;
@@ -65,6 +67,17 @@ public class Suppliers {
         return settings::getParameters;
     }
 
+    public static TemplateTransformationsSupplier 
templateTransformationsSupplier(Settings settings) {
+        return (() -> TemplateTransformationsBuilder.builder()
+                .setTemplate("interactive", settings.getInteractiveTemplate())
+                .addSources(settings.getTemplates())
+                .addInclude(settings.getTemplateFileIncludePattern())
+                .addExclude(settings.getTemplateFileExcludePattern())
+                .addOutput(settings.getOutput())
+                .setWriter(settings.getWriter())
+                .build());
+    }
+
     public static PropertiesSupplier propertiesSupplier(String fileName) {
         return new PropertiesSupplier(
                 new PropertiesFileSystemSupplier(fileName),
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 618fef9..f8955b0 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
@@ -23,6 +23,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.datasource.DataSources;
+import org.apache.freemarker.generator.base.template.TemplateTransformations;
 import org.apache.freemarker.generator.base.util.UriUtils;
 import org.apache.freemarker.generator.cli.config.Settings;
 
@@ -47,6 +48,7 @@ import static 
org.apache.freemarker.generator.cli.config.Suppliers.configuration
 import static 
org.apache.freemarker.generator.cli.config.Suppliers.dataModelSupplier;
 import static 
org.apache.freemarker.generator.cli.config.Suppliers.dataSourcesSupplier;
 import static 
org.apache.freemarker.generator.cli.config.Suppliers.parameterSupplier;
+import static 
org.apache.freemarker.generator.cli.config.Suppliers.templateTransformationsSupplier;
 import static 
org.apache.freemarker.generator.cli.config.Suppliers.toolsSupplier;
 
 /**
@@ -62,32 +64,39 @@ public class FreeMarkerTask implements Callable<Integer> {
     private final Supplier<Map<String, Object>> dataModelsSupplier;
     private final Supplier<Map<String, Object>> parameterModelSupplier;
     private final Supplier<Configuration> configurationSupplier;
+    private final Supplier<TemplateTransformations> 
templateTransformationsSupplier;
+
 
     public FreeMarkerTask(Settings settings) {
         this(settings,
-                toolsSupplier(settings),
+                configurationSupplier(settings),
+                templateTransformationsSupplier(settings),
                 dataSourcesSupplier(settings),
                 dataModelSupplier(settings),
                 parameterSupplier(settings),
-                configurationSupplier(settings));
+                toolsSupplier(settings)
+        );
     }
 
     public FreeMarkerTask(Settings settings,
-                          Supplier<Map<String, Object>> toolsSupplier,
+                          Supplier<Configuration> configurationSupplier,
+                          Supplier<TemplateTransformations> 
templateTransformationsSupplier,
                           Supplier<List<DataSource>> dataSourcesSupplier,
                           Supplier<Map<String, Object>> dataModelsSupplier,
                           Supplier<Map<String, Object>> parameterModelSupplier,
-                          Supplier<Configuration> configurationSupplier) {
+                          Supplier<Map<String, Object>> toolsSupplier) {
         this.settings = requireNonNull(settings);
         this.toolsSupplier = requireNonNull(toolsSupplier);
         this.dataSourcesSupplier = requireNonNull(dataSourcesSupplier);
         this.dataModelsSupplier = requireNonNull(dataModelsSupplier);
         this.parameterModelSupplier = requireNonNull(parameterModelSupplier);
         this.configurationSupplier = requireNonNull(configurationSupplier);
+        this.templateTransformationsSupplier = 
requireNonNull(templateTransformationsSupplier);
     }
 
     @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)) {
             final Map<String, Object> dataModel = dataModel(dataSources, 
parameterModelSupplier, dataModelsSupplier, toolsSupplier);

Reply via email to