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);
