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 6df4cd950aa4ebf18bdf43214bd9cee719b30781
Author: Siegfried Goeschl <[email protected]>
AuthorDate: Sat May 16 00:27:07 2020 +0200

    FREEMARKER-142 First draft of supporting multiple templates on the command 
line
---
 .../base/datasource/DataSourceFactory.java         |   2 +-
 .../generator/base/template/TemplateOutput.java    |  76 +++++++++++
 .../base/template/TemplateProcessingInfo.java      |  25 ++++
 .../template/TemplateProcessingInfoSupplier.java   | 145 +++++++++++++++++++++
 .../generator/base/template/TemplateSource.java    |  92 +++++++++++++
 .../base/template/TemplateSourceFactory.java       |  24 ++++
 .../generator/base/util/ClosableUtils.java         |   4 +-
 .../freemarker/generator/base/util/Validate.java   |  15 +++
 .../src/test/data/env/nginx.env                    |   3 +
 .../datasource/DataSourcesSupplierTest.java        |  24 ++--
 .../generator/file/RecursiveFileResolverTest.java  |   7 +-
 .../TemplateProcessingInfoSupplierTest.java        |  85 ++++++++++++
 .../template/TemplateSourceFactoryTest.java        |  88 +++++++++++++
 .../src/test/template/application.properties       |   2 +
 .../src/test/template/nginx/nginx.conf.ftl         |   7 +
 15 files changed, 582 insertions(+), 17 deletions(-)

diff --git 
a/freemarker-generator-base/src/main/java/org/apache/freemarker/generator/base/datasource/DataSourceFactory.java
 
b/freemarker-generator-base/src/main/java/org/apache/freemarker/generator/base/datasource/DataSourceFactory.java
index 016a394..df33351 100644
--- 
a/freemarker-generator-base/src/main/java/org/apache/freemarker/generator/base/datasource/DataSourceFactory.java
+++ 
b/freemarker-generator-base/src/main/java/org/apache/freemarker/generator/base/datasource/DataSourceFactory.java
@@ -49,7 +49,7 @@ import static 
org.apache.freemarker.generator.base.util.StringUtils.firstNonEmpt
 /**
  * Creates a FreeMarker data source from various sources.
  */
-public class DataSourceFactory {
+public abstract class DataSourceFactory {
 
     private static final String NO_MIME_TYPE = null;
     private static final Charset NO_CHARSET = null;
diff --git 
a/freemarker-generator-base/src/main/java/org/apache/freemarker/generator/base/template/TemplateOutput.java
 
b/freemarker-generator-base/src/main/java/org/apache/freemarker/generator/base/template/TemplateOutput.java
new file mode 100644
index 0000000..b5d50a1
--- /dev/null
+++ 
b/freemarker-generator-base/src/main/java/org/apache/freemarker/generator/base/template/TemplateOutput.java
@@ -0,0 +1,76 @@
+package org.apache.freemarker.generator.base.template;
+
+import org.apache.freemarker.generator.base.util.CloseableReaper;
+
+import java.io.Closeable;
+import java.io.File;
+import java.io.FileWriter;
+import java.io.IOException;
+import java.io.Writer;
+
+/**
+ * Information about where to write the ouput of a template. Initially we
+ * wanted to use a <code>FileWriter</code> but it requires actually an
+ * existing output file (otherwise a FileNotFound exception is thrown).
+ */
+public class TemplateOutput implements Closeable {
+
+    private final Writer writer;
+    private final File file;
+
+    /** Collect all closables handed out to the caller to be closed when the 
instance is closed */
+    private final CloseableReaper closables;
+
+    private TemplateOutput(File file) {
+        this.writer = null;
+        this.file = file;
+        this.closables = new CloseableReaper();
+    }
+
+    private TemplateOutput(Writer writer) {
+        this.writer = writer;
+        this.file = null;
+        this.closables = new CloseableReaper();
+    }
+
+    public static TemplateOutput fromWriter(Writer writer) {
+        return new TemplateOutput(writer);
+    }
+
+    public static TemplateOutput fromFile(File file) {
+        return new TemplateOutput(file);
+    }
+
+    public Writer getWriter() {
+        return writer;
+    }
+
+    public File getFile() {
+        return file;
+    }
+
+    public boolean isWrittenToFile() {
+        return file != null;
+    }
+
+    public boolean isWrittenToSuppliedWriter() {
+        return writer != null;
+    }
+
+    public Writer writer() {
+        return writer != null ? writer : fileWriter();
+    }
+
+    @Override
+    public void close() throws IOException {
+        closables.close();
+    }
+
+    private FileWriter fileWriter() {
+        try {
+            return closables.add(new FileWriter(file));
+        } catch (IOException e) {
+            throw new RuntimeException("Failed to create FileWriter: " + 
file.getAbsolutePath(), e);
+        }
+    }
+}
diff --git 
a/freemarker-generator-base/src/main/java/org/apache/freemarker/generator/base/template/TemplateProcessingInfo.java
 
b/freemarker-generator-base/src/main/java/org/apache/freemarker/generator/base/template/TemplateProcessingInfo.java
new file mode 100644
index 0000000..fb94e96
--- /dev/null
+++ 
b/freemarker-generator-base/src/main/java/org/apache/freemarker/generator/base/template/TemplateProcessingInfo.java
@@ -0,0 +1,25 @@
+package org.apache.freemarker.generator.base.template;
+
+import static java.util.Objects.requireNonNull;
+
+public class TemplateProcessingInfo {
+
+    /** Source of template */
+    private final TemplateSource templateSource;
+
+    /** Output of template */
+    private final TemplateOutput templateOutput;
+
+    public TemplateProcessingInfo(TemplateSource templateSource, 
TemplateOutput templateOutput) {
+        this.templateSource = requireNonNull(templateSource);
+        this.templateOutput = requireNonNull(templateOutput);
+    }
+
+    public TemplateSource getTemplateSource() {
+        return templateSource;
+    }
+
+    public TemplateOutput getTemplateOutput() {
+        return templateOutput;
+    }
+}
diff --git 
a/freemarker-generator-base/src/main/java/org/apache/freemarker/generator/base/template/TemplateProcessingInfoSupplier.java
 
b/freemarker-generator-base/src/main/java/org/apache/freemarker/generator/base/template/TemplateProcessingInfoSupplier.java
new file mode 100644
index 0000000..8ed7e32
--- /dev/null
+++ 
b/freemarker-generator-base/src/main/java/org/apache/freemarker/generator/base/template/TemplateProcessingInfoSupplier.java
@@ -0,0 +1,145 @@
+package org.apache.freemarker.generator.base.template;
+
+import org.apache.freemarker.generator.base.file.RecursiveFileSupplier;
+import org.apache.freemarker.generator.base.util.Validate;
+
+import java.io.File;
+import java.io.Writer;
+import java.util.ArrayList;
+import java.util.Collection;
+import java.util.List;
+import java.util.function.Supplier;
+
+import static java.util.Collections.singletonList;
+import static java.util.stream.Collectors.toList;
+
+public class TemplateProcessingInfoSupplier implements 
Supplier<List<TemplateProcessingInfo>> {
+
+    /** List of templates and/or template directories to be rendered */
+    private final Collection<String> sources;
+
+    /** Optional include pattern for resolving source templates or directory */
+    private final String include;
+
+    /** Optional exclude pattern for resolving source templates or directory */
+    private final String exclude;
+
+    /** Optional output file or directory */
+    private final File out;
+
+    /** Optional user-supplied writer */
+    private final Writer writer;
+
+    public TemplateProcessingInfoSupplier(Collection<String> sources, String 
include, String exclude, File out, Writer writer) {
+        this.sources = new ArrayList<>(sources);
+        this.include = include;
+        this.exclude = exclude;
+        this.out = out;
+        this.writer = writer;
+    }
+
+    @Override
+    public List<TemplateProcessingInfo> get() {
+        return sources.stream()
+                .map(this::get)
+                .flatMap(Collection::stream)
+                .collect(toList());
+    }
+
+    /**
+     * Resolve a <code>source</code> to a list of 
<code>TemplateProcessingInfo</code>.
+     *
+     * @param source the source being a file name, an URI or 
<code>NamedUri</code>
+     * @return list of <code>TemplateProcessingInfo</code>
+     */
+    private List<TemplateProcessingInfo> get(String source) {
+        if (isTemplateFile(source)) {
+            return resolveTemplateFile(source);
+        } else if (isTemplateDirectory(source)) {
+            return resolveTemplateDirectory(source);
+        } else if (isTemplatePath(source)) {
+            return resolveTemplatePath(source);
+        } else {
+            throw new RuntimeException("Don't know how to resolve: " + source);
+        }
+    }
+
+    private List<TemplateProcessingInfo> resolveTemplateFile(String source) {
+        final TemplateSource templateSource = templateSource(source);
+        final TemplateOutput templateOutput = templateOutput(out);
+        return singletonList(new TemplateProcessingInfo(templateSource, 
templateOutput));
+    }
+
+    private List<TemplateProcessingInfo> resolveTemplateDirectory(String 
source) {
+        Validate.fileExists(new File(source), "Template directory does not 
exist: " + source);
+
+        final File templateDirectory = new File(source);
+        final List<File> templateFiles = templateFilesSupplier(source, 
include, exclude).get();
+        final List<TemplateProcessingInfo> templateProcessingInfos = new 
ArrayList<>();
+
+        for (File templateFile : templateFiles) {
+            final TemplateSource templateSource = 
templateSource(templateFile.getAbsolutePath());
+            final File outputFile = getTemplateOutputFile(templateDirectory, 
templateFile, out);
+            final TemplateOutput templateOutput = templateOutput(outputFile);
+            templateProcessingInfos.add(new 
TemplateProcessingInfo(templateSource, templateOutput));
+        }
+
+        return templateProcessingInfos;
+    }
+
+    private List<TemplateProcessingInfo> resolveTemplatePath(String source) {
+        final TemplateSource templateSource = templateSource(source);
+        final TemplateOutput templateOutput = templateOutput(out);
+        return singletonList(new TemplateProcessingInfo(templateSource, 
templateOutput));
+    }
+
+    private TemplateOutput templateOutput(File templateOutputFile) {
+        if (writer != null) {
+            return TemplateOutput.fromWriter(writer);
+        } else {
+            return TemplateOutput.fromFile(templateOutputFile);
+        }
+    }
+
+    private TemplateSource templateSource(String source) {
+        return TemplateSourceFactory.create(source);
+    }
+
+    private static File getTemplateOutputFile(File templateDirectory, File 
templateFile, File outputDirectory) {
+        final String relativePath = relativePath(templateDirectory, 
templateFile);
+        final String relativeOutputFileName = mapExtension(relativePath);
+        return new File(outputDirectory, relativeOutputFileName);
+    }
+
+    private static boolean isTemplateFile(String source) {
+        final File file = new File(source);
+        return file.exists() && file.isFile();
+    }
+
+    private static boolean isTemplateDirectory(String source) {
+        final File file = new File(source);
+        return file.exists() && file.isDirectory();
+    }
+
+    private static boolean isTemplatePath(String source) {
+        return !isTemplateFile(source) && !isTemplateDirectory(source);
+    }
+
+    private static RecursiveFileSupplier templateFilesSupplier(String source, 
String include, String exclude) {
+        return new RecursiveFileSupplier(singletonList(source), 
singletonList(include), singletonList(exclude));
+    }
+
+    private static String relativePath(File directory, File file) {
+        return file.getAbsolutePath()
+                .substring(directory.getAbsolutePath().length())
+                .substring(1);
+    }
+
+    private static String mapExtension(String fileName) {
+        if (fileName.toLowerCase().endsWith(".ftl")) {
+            return fileName.substring(0, fileName.length() - 4);
+        } else {
+            return fileName;
+        }
+    }
+}
diff --git 
a/freemarker-generator-base/src/main/java/org/apache/freemarker/generator/base/template/TemplateSource.java
 
b/freemarker-generator-base/src/main/java/org/apache/freemarker/generator/base/template/TemplateSource.java
new file mode 100644
index 0000000..f9f7f10
--- /dev/null
+++ 
b/freemarker-generator-base/src/main/java/org/apache/freemarker/generator/base/template/TemplateSource.java
@@ -0,0 +1,92 @@
+package org.apache.freemarker.generator.base.template;
+
+import org.apache.freemarker.generator.base.util.Validate;
+
+import java.nio.charset.Charset;
+import java.nio.charset.StandardCharsets;
+
+/**
+ * Information how to load a template. The template is either
+ * provided as source code or as template path resolved
+ * by FreeMarker's template loader.
+ */
+public class TemplateSource {
+
+    public enum Origin {
+        PATH,
+        CODE
+    }
+
+    /** Name of template for diagnostics */
+    private final String name;
+
+    /** Origin of template, e.g. loaded via FreeMarker's template loader */
+    private final Origin origin;
+
+    /** Code of the template */
+    private final String code;
+
+    /** Template path */
+    private final String path;
+
+    /** Template encoding */
+    private final Charset encoding;
+
+    private TemplateSource(String name, String code) {
+        this.name = name;
+        this.origin = Origin.CODE;
+        this.code = code;
+        this.path = null;
+        this.encoding = null;
+    }
+
+    private TemplateSource(String name, String path, Charset encoding) {
+        this.name = name;
+        this.origin = Origin.PATH;
+        this.code = null;
+        this.path = path;
+        this.encoding = encoding;
+    }
+
+    public static TemplateSource fromPath(String path) {
+        Validate.notEmpty(path, "Template path is empty");
+        return new TemplateSource(path, path, StandardCharsets.UTF_8);
+    }
+
+    public static TemplateSource fromPath(String path, Charset encoding) {
+        Validate.notEmpty(path, "Template path is empty");
+        Validate.notNull(encoding, "Template encoding is null");
+        return new TemplateSource(path, path, encoding);
+    }
+
+    public static TemplateSource fromCode(String name, String code) {
+        Validate.notEmpty(name, "Template name is empty");
+        Validate.notEmpty(code, "Template code is empty");
+        return new TemplateSource(name, code);
+    }
+
+    public Origin getOrigin() {
+        return origin;
+    }
+
+    public String getCode() {
+        return code;
+    }
+
+    public String getPath() {
+        return path;
+    }
+
+    public String getName() {
+        return name;
+    }
+
+    @Override
+    public String toString() {
+        return "TemplateSource{" +
+                "name='" + name + '\'' +
+                ", origin=" + origin +
+                ", encoding=" + encoding +
+                '}';
+    }
+}
diff --git 
a/freemarker-generator-base/src/main/java/org/apache/freemarker/generator/base/template/TemplateSourceFactory.java
 
b/freemarker-generator-base/src/main/java/org/apache/freemarker/generator/base/template/TemplateSourceFactory.java
new file mode 100644
index 0000000..df3171f
--- /dev/null
+++ 
b/freemarker-generator-base/src/main/java/org/apache/freemarker/generator/base/template/TemplateSourceFactory.java
@@ -0,0 +1,24 @@
+package org.apache.freemarker.generator.base.template;
+
+import org.apache.freemarker.generator.base.datasource.DataSource;
+import org.apache.freemarker.generator.base.datasource.DataSourceFactory;
+import org.apache.freemarker.generator.base.util.UriUtils;
+
+import java.io.File;
+
+public class TemplateSourceFactory {
+
+    public static TemplateSource create(String str) {
+        if (isTemplatePath(str)) {
+            return TemplateSource.fromPath(str);
+        } else {
+            try (DataSource dataSource = DataSourceFactory.create(str)) {
+                return TemplateSource.fromCode(dataSource.getName(), 
dataSource.getText());
+            }
+        }
+    }
+
+    private static boolean isTemplatePath(String str) {
+        return !UriUtils.isUri(str) && !new File(str).exists();
+    }
+}
diff --git 
a/freemarker-generator-base/src/main/java/org/apache/freemarker/generator/base/util/ClosableUtils.java
 
b/freemarker-generator-base/src/main/java/org/apache/freemarker/generator/base/util/ClosableUtils.java
index dfefc01..0d04517 100644
--- 
a/freemarker-generator-base/src/main/java/org/apache/freemarker/generator/base/util/ClosableUtils.java
+++ 
b/freemarker-generator-base/src/main/java/org/apache/freemarker/generator/base/util/ClosableUtils.java
@@ -26,8 +26,8 @@ public class ClosableUtils {
             if (closeable != null) {
                 closeable.close();
             }
-        } catch (final IOException e) {
-            // e.printStackTrace();
+        } catch (IOException e) {
+            e.printStackTrace();
         }
     }
 }
diff --git 
a/freemarker-generator-base/src/main/java/org/apache/freemarker/generator/base/util/Validate.java
 
b/freemarker-generator-base/src/main/java/org/apache/freemarker/generator/base/util/Validate.java
index 71bd28a..af2b497 100644
--- 
a/freemarker-generator-base/src/main/java/org/apache/freemarker/generator/base/util/Validate.java
+++ 
b/freemarker-generator-base/src/main/java/org/apache/freemarker/generator/base/util/Validate.java
@@ -16,6 +16,8 @@
  */
 package org.apache.freemarker.generator.base.util;
 
+import java.io.File;
+
 /**
  * Simple validation methods designed for interal use.
  */
@@ -140,6 +142,18 @@ public final class Validate {
     }
 
     /**
+     * Validates that the file exists
+     *
+     * @param file the file to test
+     * @param msg  message to output if validation fails
+     */
+    public static void fileExists(File file, String msg) {
+        if (file == null || !file.exists()) {
+            throw new IllegalArgumentException(msg);
+        }
+    }
+
+    /**
      * Cause a failure.
      *
      * @param msg message to output.
@@ -147,4 +161,5 @@ public final class Validate {
     public static void fail(String msg) {
         throw new IllegalArgumentException(msg);
     }
+
 }
diff --git a/freemarker-generator-base/src/test/data/env/nginx.env 
b/freemarker-generator-base/src/test/data/env/nginx.env
new file mode 100644
index 0000000..94973df
--- /dev/null
+++ b/freemarker-generator-base/src/test/data/env/nginx.env
@@ -0,0 +1,3 @@
+NGINX_HOSTNAME=localhost
+NGINX_WEBROOT=/var/www/project
+NGINX_LOGS=/var/log/nginx/
\ No newline at end of file
diff --git 
a/freemarker-generator-base/src/test/java/org/apache/freemarker/generator/datasource/DataSourcesSupplierTest.java
 
b/freemarker-generator-base/src/test/java/org/apache/freemarker/generator/datasource/DataSourcesSupplierTest.java
index 8089c48..aacfd75 100644
--- 
a/freemarker-generator-base/src/test/java/org/apache/freemarker/generator/datasource/DataSourcesSupplierTest.java
+++ 
b/freemarker-generator-base/src/test/java/org/apache/freemarker/generator/datasource/DataSourcesSupplierTest.java
@@ -44,7 +44,8 @@ public class DataSourcesSupplierTest {
         assertEquals(1, supplier("pom=./pom.xml", "*", 
NO_EXCLUDE).get().size());
         assertEquals(1, supplier("pom=./pom.xml#mimetype=application/xml", 
"*", NO_EXCLUDE).get().size());
         assertEquals(1, supplier("pom=" + PWD + "/pom.xml", "*", 
NO_EXCLUDE).get().size());
-        assertEquals(1, supplier("pom=file:///" + PWD + 
"/pom.xml#mimetype=application/xml", "*", NO_EXCLUDE).get().size());
+        assertEquals(1, supplier("pom=file:///" + PWD + 
"/pom.xml#mimetype=application/xml", "*", NO_EXCLUDE).get()
+                .size());
     }
 
     @Test
@@ -62,10 +63,10 @@ public class DataSourcesSupplierTest {
 
     @Test
     public void shouldResolveDirectory() {
-        assertEquals(4, supplier(DATA_DIRECTORY, null, null).get().size());
-        assertEquals(4, supplier(DATA_DIRECTORY, "", null).get().size());
-        assertEquals(4, supplier(DATA_DIRECTORY, "*", null).get().size());
-        assertEquals(4, supplier(DATA_DIRECTORY, "*.*", null).get().size());
+        assertEquals(5, supplier(DATA_DIRECTORY, null, null).get().size());
+        assertEquals(5, supplier(DATA_DIRECTORY, "", null).get().size());
+        assertEquals(5, supplier(DATA_DIRECTORY, "*", null).get().size());
+        assertEquals(5, supplier(DATA_DIRECTORY, "*.*", null).get().size());
         assertEquals(2, supplier(DATA_DIRECTORY, "*.csv", null).get().size());
         assertEquals(1, supplier(DATA_DIRECTORY, "*.t*", null).get().size());
         assertEquals(0, supplier(DATA_DIRECTORY, "*.bin", null).get().size());
@@ -75,10 +76,10 @@ public class DataSourcesSupplierTest {
     public void shouldResolveFilesAndDirectory() {
         final List<String> sources = Arrays.asList("pom.xml", "README.md", 
DATA_DIRECTORY);
 
-        assertEquals(6, supplier(sources, null, null).get().size());
-        assertEquals(6, supplier(sources, "", null).get().size());
-        assertEquals(6, supplier(sources, "*", null).get().size());
-        assertEquals(6, supplier(sources, "*.*", null).get().size());
+        assertEquals(7, supplier(sources, null, null).get().size());
+        assertEquals(7, supplier(sources, "", null).get().size());
+        assertEquals(7, supplier(sources, "*", null).get().size());
+        assertEquals(7, supplier(sources, "*.*", null).get().size());
         assertEquals(2, supplier(sources, "*.csv", null).get().size());
         assertEquals(1, supplier(sources, "*.t*", null).get().size());
         assertEquals(1, supplier(sources, "*.xml", null).get().size());
@@ -87,8 +88,9 @@ public class DataSourcesSupplierTest {
         assertEquals(0, supplier(sources, null, "*").get().size());
         assertEquals(0, supplier(sources, null, "*.*").get().size());
         assertEquals(0, supplier(sources, "*", "*").get().size());
-        assertEquals(5, supplier(sources, "*", "*.md").get().size());
-        assertEquals(3, supplier(sources, "*", "file*.*").get().size());
+
+        assertEquals(6, supplier(sources, "*", "*.md").get().size());
+        assertEquals(4, supplier(sources, "*", "file*.*").get().size());
     }
 
     @Test
diff --git 
a/freemarker-generator-base/src/test/java/org/apache/freemarker/generator/file/RecursiveFileResolverTest.java
 
b/freemarker-generator-base/src/test/java/org/apache/freemarker/generator/file/RecursiveFileResolverTest.java
index 7c20b49..72fc5c2 100644
--- 
a/freemarker-generator-base/src/test/java/org/apache/freemarker/generator/file/RecursiveFileResolverTest.java
+++ 
b/freemarker-generator-base/src/test/java/org/apache/freemarker/generator/file/RecursiveFileResolverTest.java
@@ -35,7 +35,7 @@ public class RecursiveFileResolverTest {
 
     @Test
     public void shouldResolveAllFilesOfDirectory() {
-        assertEquals(4, fileResolver(ANY_DIRECTORY, null, null).get().size());
+        assertEquals(5, fileResolver(ANY_DIRECTORY, null, null).get().size());
         assertTrue(fileResolver(ANY_DIRECTORY, UNKNOWN_FILE_NAME, 
null).get().isEmpty());
     }
 
@@ -77,9 +77,10 @@ public class RecursiveFileResolverTest {
     public void shouldExcludeFiles() {
         final List<File> files = fileResolver(ANY_DIRECTORY, null, 
"*.csv").get();
 
-        assertEquals(2, files.size());
+        assertEquals(3, files.size());
         assertEquals("file_01.txt", files.get(0).getName());
-        assertEquals("test.properties", files.get(1).getName());
+        assertEquals("nginx.env", files.get(1).getName());
+        assertEquals("test.properties", files.get(2).getName());
     }
 
     @Test
diff --git 
a/freemarker-generator-base/src/test/java/org/apache/freemarker/generator/template/TemplateProcessingInfoSupplierTest.java
 
b/freemarker-generator-base/src/test/java/org/apache/freemarker/generator/template/TemplateProcessingInfoSupplierTest.java
new file mode 100644
index 0000000..a1559e5
--- /dev/null
+++ 
b/freemarker-generator-base/src/test/java/org/apache/freemarker/generator/template/TemplateProcessingInfoSupplierTest.java
@@ -0,0 +1,85 @@
+/*
+ * 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.template;
+
+import org.apache.freemarker.generator.base.template.TemplateProcessingInfo;
+import 
org.apache.freemarker.generator.base.template.TemplateProcessingInfoSupplier;
+import org.junit.Test;
+
+import java.io.File;
+import java.io.StringWriter;
+import java.util.Collections;
+import java.util.List;
+
+import static org.junit.Assert.assertEquals;
+import static org.junit.Assert.assertNotNull;
+
+public class TemplateProcessingInfoSupplierTest {
+
+    private static final String ANY_TEMPLATE_FILE_NAME = 
"src/test/template/application.properties";
+    private static final String ANY_TEMPLATE_PATH = "template/info.ftl";
+    private static final String ANY_TEMPLATE_DIRECTORY_NAME = 
"src/test/template";
+
+    @Test
+    public void shouldCreateFromTemplateFile() {
+        final TemplateProcessingInfoSupplier supplier = new 
TemplateProcessingInfoSupplier(
+                Collections.singleton(ANY_TEMPLATE_FILE_NAME),
+                null,
+                null,
+                null,
+                new StringWriter(1024));
+
+
+        final List<TemplateProcessingInfo> templateProcessingInfos = 
supplier.get();
+
+        assertNotNull(templateProcessingInfos);
+        assertEquals(1, templateProcessingInfos.size());
+    }
+
+    @Test
+    public void shouldCreateFromTemplatePath() {
+        final TemplateProcessingInfoSupplier supplier = new 
TemplateProcessingInfoSupplier(
+                Collections.singleton(ANY_TEMPLATE_PATH),
+                null,
+                null,
+                null,
+                new StringWriter(1024));
+
+
+        final List<TemplateProcessingInfo> templateProcessingInfos = 
supplier.get();
+
+        assertNotNull(templateProcessingInfos);
+        assertEquals(1, templateProcessingInfos.size());
+    }
+
+    @Test
+    public void shouldCreateFromTemplateDirectory() {
+        final TemplateProcessingInfoSupplier supplier = new 
TemplateProcessingInfoSupplier(
+                Collections.singleton(ANY_TEMPLATE_DIRECTORY_NAME),
+                null,
+                null,
+                new File("."),
+                null);
+
+
+        final List<TemplateProcessingInfo> templateProcessingInfos = 
supplier.get();
+
+        assertNotNull(templateProcessingInfos);
+        assertEquals(2, templateProcessingInfos.size());
+    }
+
+}
diff --git 
a/freemarker-generator-base/src/test/java/org/apache/freemarker/generator/template/TemplateSourceFactoryTest.java
 
b/freemarker-generator-base/src/test/java/org/apache/freemarker/generator/template/TemplateSourceFactoryTest.java
new file mode 100644
index 0000000..50a60d6
--- /dev/null
+++ 
b/freemarker-generator-base/src/test/java/org/apache/freemarker/generator/template/TemplateSourceFactoryTest.java
@@ -0,0 +1,88 @@
+/*
+ * 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.template;
+
+import org.apache.freemarker.generator.base.template.TemplateSource;
+import org.apache.freemarker.generator.base.template.TemplateSource.Origin;
+import org.apache.freemarker.generator.base.template.TemplateSourceFactory;
+import org.junit.Test;
+
+import static org.junit.Assert.assertEquals;
+import static org.junit.Assert.assertFalse;
+import static org.junit.Assert.assertNotNull;
+import static org.junit.Assert.assertNull;
+
+public class TemplateSourceFactoryTest {
+
+    private static final String ANY_TEMPLATE_PATH = "any/template/path.ftl";
+    private static final String ANY_FILE_NAME = "pom.xml";
+    private static final String ANY_URL = 
"https://jsonplaceholder.typicode.com/posts/2";;
+    private static final String ANY_ENVIRONMENT_VARIABLE = "env:///PWD";
+    private static final String ANY_NAMED_URI = 
"content:www=https://www.google.com?foo=bar#contenttype=application/json";;
+
+    @Test
+    public void shouldCreateFromTemplatePath() {
+        final TemplateSource templateSource = 
TemplateSourceFactory.create(ANY_TEMPLATE_PATH);
+
+        assertEquals(ANY_TEMPLATE_PATH, templateSource.getName());
+        assertEquals(Origin.PATH, templateSource.getOrigin());
+        assertEquals(ANY_TEMPLATE_PATH, templateSource.getPath());
+        assertNull(templateSource.getCode());
+    }
+
+    @Test
+    public void shouldCreateFromFile() {
+        final TemplateSource templateSource = 
TemplateSourceFactory.create(ANY_FILE_NAME);
+
+        assertEquals(ANY_FILE_NAME, templateSource.getName());
+        assertEquals(Origin.CODE, templateSource.getOrigin());
+        assertNull(templateSource.getPath());
+        assertFalse(templateSource.getCode().isEmpty());
+    }
+
+    @Test
+    public void shouldCreateFromEnvironmentVariable() {
+        final TemplateSource templateSource = 
TemplateSourceFactory.create(ANY_ENVIRONMENT_VARIABLE);
+
+        assertEquals("PWD", templateSource.getName());
+        assertEquals(Origin.CODE, templateSource.getOrigin());
+        assertNull(templateSource.getPath());
+        assertFalse(templateSource.getCode().isEmpty());
+    }
+
+    @Test
+    // @Ignore("Requires internet access")
+    public void shouldCreateFromUrl() {
+        final TemplateSource templateSource = 
TemplateSourceFactory.create(ANY_URL);
+
+        assertNotNull(templateSource.getName());
+        assertEquals(Origin.CODE, templateSource.getOrigin());
+        assertNull(templateSource.getPath());
+        assertFalse(templateSource.getCode().isEmpty());
+    }
+
+    @Test
+    // @Ignore("Requires internet access")
+    public void shouldCreateFromNamedUri() {
+        final TemplateSource templateSource = 
TemplateSourceFactory.create(ANY_NAMED_URI);
+
+        assertNotNull(templateSource.getName());
+        assertEquals(Origin.CODE, templateSource.getOrigin());
+        assertNull(templateSource.getPath());
+        assertFalse(templateSource.getCode().isEmpty());
+    }
+}
diff --git a/freemarker-generator-base/src/test/template/application.properties 
b/freemarker-generator-base/src/test/template/application.properties
new file mode 100644
index 0000000..685cd4b
--- /dev/null
+++ b/freemarker-generator-base/src/test/template/application.properties
@@ -0,0 +1,2 @@
+server.name=${NGINX_HOSTNAME}
+server.logs=${NGINX_LOGS}
\ 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
new file mode 100644
index 0000000..4d048e8
--- /dev/null
+++ b/freemarker-generator-base/src/test/template/nginx/nginx.conf.ftl
@@ -0,0 +1,7 @@
+server {
+  listen 80;
+  server_name ${NGINX_HOSTNAME};
+
+  root ${NGINX_WEBROOT};
+  index index.htm;
+}

Reply via email to