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 2020/05/23 16:22:18 UTC
[freemarker-generator] 02/02: FREEMARKER-142 First draft of
supporting multiple templates on the command line
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 <si...@gmail.com>
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);