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