This is an automated email from the ASF dual-hosted git repository.

sgoeschl pushed a commit to branch FREEMARKER-188
in repository https://gitbox.apache.org/repos/asf/freemarker-generator.git


The following commit(s) were added to refs/heads/FREEMARKER-188 by this push:
     new 16d6c47  FREEMARKER-188 Provide "OutputMapper"
16d6c47 is described below

commit 16d6c47e31f5c1b6fb27dcf207b1e8115b0e7e94
Author: Siegfried Goeschl <[email protected]>
AuthorDate: Wed Sep 8 21:38:01 2021 +0200

    FREEMARKER-188 Provide "OutputMapper"
---
 .../generator/base/FreeMarkerConstants.java        |  8 +--
 .../cli/config/OutputGeneratorsSupplier.java       | 30 +++++-----
 ....java => DataSourceSeedingOutputGenerator.java} | 44 +++++++-------
 .../output/DataSourceSeedingOutputMapper.java      | 32 ++++++++++
 ...or.java => TemplateSeedingOutputGenerator.java} | 54 +++--------------
 .../cli/picocli/OutputGeneratorDefinition.java     | 26 ++++----
 ...Definition.java => OutputMapperDefinition.java} |  2 +-
 ...deDefinition.java => OutputSeedDefinition.java} |  8 +--
 .../output/DataSourceSeedingOutputMapperTest.java  | 69 ++++++++++++++++++++++
 9 files changed, 172 insertions(+), 101 deletions(-)

diff --git 
a/freemarker-generator-base/src/main/java/org/apache/freemarker/generator/base/FreeMarkerConstants.java
 
b/freemarker-generator-base/src/main/java/org/apache/freemarker/generator/base/FreeMarkerConstants.java
index e4500ff..f4e19bd 100644
--- 
a/freemarker-generator-base/src/main/java/org/apache/freemarker/generator/base/FreeMarkerConstants.java
+++ 
b/freemarker-generator-base/src/main/java/org/apache/freemarker/generator/base/FreeMarkerConstants.java
@@ -93,13 +93,13 @@ public class FreeMarkerConstants {
         public static final String FREEMARKER_USER_PARAMETERS = 
"freemarker.user.parameters";
     }
 
-    public static class Mode {
+    public static class SeedType {
 
-        private Mode() {
+        private SeedType() {
         }
 
-        public static final String AGGREGATE = "aggregate";
-        public static final String GENERATE = "generate";
+        public static final String TEMPLATE = "template";
+        public static final String DATASOURCE = "datasource";
     }
 
     public static class SystemProperties {
diff --git 
a/freemarker-generator-cli/src/main/java/org/apache/freemarker/generator/cli/config/OutputGeneratorsSupplier.java
 
b/freemarker-generator-cli/src/main/java/org/apache/freemarker/generator/cli/config/OutputGeneratorsSupplier.java
index a8e819b..71046df 100644
--- 
a/freemarker-generator-cli/src/main/java/org/apache/freemarker/generator/cli/config/OutputGeneratorsSupplier.java
+++ 
b/freemarker-generator-cli/src/main/java/org/apache/freemarker/generator/cli/config/OutputGeneratorsSupplier.java
@@ -16,10 +16,10 @@
  */
 package org.apache.freemarker.generator.cli.config;
 
-import org.apache.freemarker.generator.base.FreeMarkerConstants.Mode;
+import org.apache.freemarker.generator.base.FreeMarkerConstants.SeedType;
 import org.apache.freemarker.generator.base.output.OutputGenerator;
-import 
org.apache.freemarker.generator.cli.config.output.AggregatingOutputGenerator;
-import 
org.apache.freemarker.generator.cli.config.output.GeneratingOutputGenerator;
+import 
org.apache.freemarker.generator.cli.config.output.DataSourceSeedingOutputGenerator;
+import 
org.apache.freemarker.generator.cli.config.output.TemplateSeedingOutputGenerator;
 import org.apache.freemarker.generator.cli.picocli.OutputGeneratorDefinition;
 
 import java.util.Collection;
@@ -27,37 +27,35 @@ import java.util.List;
 import java.util.function.Supplier;
 import java.util.stream.Collectors;
 
+import static java.util.Objects.requireNonNull;
+
 /**
  * Supplies a list of list of <code>OutputGenerators</code> based on the user 
input.
  */
 public class OutputGeneratorsSupplier implements 
Supplier<List<OutputGenerator>> {
 
     private final Settings settings;
-    private final AggregatingOutputGenerator aggregatingOutputGenerator;
-    private final GeneratingOutputGenerator generatingOutputGenerator;
 
     public OutputGeneratorsSupplier(Settings settings) {
-        this.settings = settings;
-        aggregatingOutputGenerator = new AggregatingOutputGenerator(settings);
-        generatingOutputGenerator = new GeneratingOutputGenerator(settings);
+        this.settings = requireNonNull(settings);
     }
 
     @Override
     public List<OutputGenerator> get() {
         return settings.getOutputGeneratorDefinitions().stream()
-                .map(this::outputGenerator)
+                .map(definition -> outputGenerator(settings, definition))
                 .flatMap(Collection::stream)
                 .collect(Collectors.toList());
     }
 
-    private List<OutputGenerator> outputGenerator(OutputGeneratorDefinition 
definition) {
-        final String mode = definition.getOutputGeneratorMode();
-        if (Mode.AGGREGATE.equalsIgnoreCase(mode)) {
-            return aggregatingOutputGenerator.apply(definition);
-        } else if (Mode.GENERATE.equalsIgnoreCase(mode)) {
-            return generatingOutputGenerator.apply(definition);
+    private List<OutputGenerator> outputGenerator(Settings settings, 
OutputGeneratorDefinition definition) {
+        final String seedType = definition.getOutputSeedType();
+        if (SeedType.TEMPLATE.equalsIgnoreCase(seedType)) {
+            return new 
TemplateSeedingOutputGenerator(settings).apply(definition);
+        } else if (SeedType.DATASOURCE.equalsIgnoreCase(seedType)) {
+            return new 
DataSourceSeedingOutputGenerator(settings).apply(definition);
         } else {
-            throw new RuntimeException("Unknown output generator mode:" + 
mode);
+            throw new RuntimeException("Unknown seed type:" + seedType);
         }
     }
 }
diff --git 
a/freemarker-generator-cli/src/main/java/org/apache/freemarker/generator/cli/config/output/GeneratingOutputGenerator.java
 
b/freemarker-generator-cli/src/main/java/org/apache/freemarker/generator/cli/config/output/DataSourceSeedingOutputGenerator.java
similarity index 78%
rename from 
freemarker-generator-cli/src/main/java/org/apache/freemarker/generator/cli/config/output/GeneratingOutputGenerator.java
rename to 
freemarker-generator-cli/src/main/java/org/apache/freemarker/generator/cli/config/output/DataSourceSeedingOutputGenerator.java
index 4f6eaf8..fc9a418 100644
--- 
a/freemarker-generator-cli/src/main/java/org/apache/freemarker/generator/cli/config/output/GeneratingOutputGenerator.java
+++ 
b/freemarker-generator-cli/src/main/java/org/apache/freemarker/generator/cli/config/output/DataSourceSeedingOutputGenerator.java
@@ -22,7 +22,6 @@ import 
org.apache.freemarker.generator.base.output.OutputGenerator.SeedType;
 import org.apache.freemarker.generator.base.template.TemplateOutput;
 import org.apache.freemarker.generator.base.template.TemplateSource;
 import org.apache.freemarker.generator.base.util.ListUtils;
-import org.apache.freemarker.generator.base.util.StringUtils;
 import org.apache.freemarker.generator.base.util.Validate;
 import org.apache.freemarker.generator.cli.config.Settings;
 import org.apache.freemarker.generator.cli.config.Suppliers;
@@ -40,31 +39,35 @@ import java.util.function.Function;
 
 import static java.util.Collections.singletonList;
 
-public class GeneratingOutputGenerator
+/**
+ * Generates an <code>OutputGenerator</code> per <code>DataSource</code>.
+ */
+public class DataSourceSeedingOutputGenerator
         extends AbstractOutputGenerator
         implements Function<OutputGeneratorDefinition, List<OutputGenerator>> {
 
     private final Settings settings;
 
-    public GeneratingOutputGenerator(Settings settings) {
+    public DataSourceSeedingOutputGenerator(Settings settings) {
         this.settings = settings;
     }
 
     @Override
-    public List<OutputGenerator> apply(OutputGeneratorDefinition definition) {
-        Validate.notNull(definition, "definition must not be null");
+    public List<OutputGenerator> apply(OutputGeneratorDefinition 
outputGeneratorDefinition) {
+        Validate.notNull(outputGeneratorDefinition, "outputGeneratorDefinition 
must not be null");
 
         final List<OutputGenerator> result = new ArrayList<>();
-        final TemplateSourceDefinition templateSourceDefinition = 
definition.getTemplateSourceDefinition();
-        final TemplateOutputDefinition templateOutputDefinition = 
definition.getTemplateOutputDefinition();
-        final Map<String, Object> dataModels = super.dataModels(definition);
-        final List<DataSource> dataSources = super.dataSources(settings, 
definition);
+        final TemplateSourceDefinition templateSourceDefinition = 
outputGeneratorDefinition.getTemplateSourceDefinition();
+        final TemplateOutputDefinition templateOutputDefinition = 
outputGeneratorDefinition.getTemplateOutputDefinition();
+        final Map<String, Object> dataModels = 
super.dataModels(outputGeneratorDefinition);
+        final List<DataSource> dataSources = super.dataSources(settings, 
outputGeneratorDefinition);
         final List<DataSource> sharedDataSources = 
Suppliers.sharedDataSourcesSupplier(settings).get();
         final List<DataSource> combinedDataSources = 
ListUtils.concatenate(dataSources, sharedDataSources);
         final TemplateSource templateSource = 
TemplateSourceFactory.create(templateSourceDefinition, 
settings.getTemplateEncoding());
+        final DataSourceSeedingOutputMapper outputMapper = 
outputMapper(outputGeneratorDefinition.getOutputMapper());
 
         for (DataSource dataSource : combinedDataSources) {
-            final TemplateOutput templateOutput = 
templateOutput(templateOutputDefinition, settings, dataSource);
+            final TemplateOutput templateOutput = 
templateOutput(templateOutputDefinition, settings, dataSource, outputMapper);
             final OutputGenerator outputGenerator = new OutputGenerator(
                     templateSource,
                     templateOutput,
@@ -78,9 +81,9 @@ public class GeneratingOutputGenerator
         return result;
     }
 
-    private TemplateOutput templateOutput(TemplateOutputDefinition 
templateOutputDefinition, Settings settings, DataSource dataSource) {
+    private TemplateOutput templateOutput(TemplateOutputDefinition 
templateOutputDefinition, Settings settings, DataSource dataSource, 
DataSourceSeedingOutputMapper outputMapper) {
         final Charset outputEncoding = settings.getOutputEncoding();
-        final File templateOutputFile = 
templateOutputFile(templateOutputDefinition, dataSource);
+        final File templateOutputFile = 
templateOutputFile(templateOutputDefinition, dataSource, outputMapper);
         if (settings.getCallerSuppliedWriter() != null) {
             return 
TemplateOutput.fromWriter(settings.getCallerSuppliedWriter());
         } else if (templateOutputFile != null) {
@@ -90,19 +93,20 @@ public class GeneratingOutputGenerator
         }
     }
 
-    private File templateOutputFile(TemplateOutputDefinition 
templateOutputDefinition, DataSource dataSource) {
+    private File templateOutputFile(
+            TemplateOutputDefinition templateOutputDefinition,
+            DataSource dataSource,
+            DataSourceSeedingOutputMapper outputMapper) {
+
         if (templateOutputDefinition == null || 
!templateOutputDefinition.hasOutput()) {
             return null;
         }
 
         final File outputDirectory = new 
File(templateOutputDefinition.outputs.get(0));
-        final String relativeFilePath = dataSource.getRelativeFilePath();
-        final String fileName = dataSource.getBaseName() + ".html";
+        return outputMapper.map(outputDirectory, dataSource);
+    }
 
-        if (StringUtils.isEmpty(relativeFilePath)) {
-            return new File(outputDirectory, fileName);
-        } else {
-            return new File(outputDirectory, relativeFilePath + "/" + 
fileName);
-        }
+    private DataSourceSeedingOutputMapper outputMapper(String template) {
+        return new DataSourceSeedingOutputMapper(template);
     }
 }
diff --git 
a/freemarker-generator-cli/src/main/java/org/apache/freemarker/generator/cli/config/output/DataSourceSeedingOutputMapper.java
 
b/freemarker-generator-cli/src/main/java/org/apache/freemarker/generator/cli/config/output/DataSourceSeedingOutputMapper.java
new file mode 100644
index 0000000..d5d7568
--- /dev/null
+++ 
b/freemarker-generator-cli/src/main/java/org/apache/freemarker/generator/cli/config/output/DataSourceSeedingOutputMapper.java
@@ -0,0 +1,32 @@
+package org.apache.freemarker.generator.cli.config.output;
+
+import org.apache.freemarker.generator.base.datasource.DataSource;
+import org.apache.freemarker.generator.base.util.StringUtils;
+
+import java.io.File;
+
+public class DataSourceSeedingOutputMapper {
+
+    private final String template;
+
+    public DataSourceSeedingOutputMapper(String template) {
+        this.template = template;
+    }
+
+    public File map(File outputDirectory, DataSource dataSource) {
+        final String relativeFilePath = dataSource.getRelativeFilePath();
+        final String fileName = expand(template, dataSource);
+
+        return (StringUtils.isEmpty(relativeFilePath)) ?
+                new File(outputDirectory, fileName) :
+                new File(new File(outputDirectory, relativeFilePath), 
fileName);
+    }
+
+    private static String expand(String value, DataSource dataSource) {
+        if (StringUtils.isEmpty(value)) {
+            return dataSource.getBaseName() + "." + dataSource.getExtension();
+        }
+
+        return value.replace("*", dataSource.getBaseName());
+    }
+}
diff --git 
a/freemarker-generator-cli/src/main/java/org/apache/freemarker/generator/cli/config/output/AggregatingOutputGenerator.java
 
b/freemarker-generator-cli/src/main/java/org/apache/freemarker/generator/cli/config/output/TemplateSeedingOutputGenerator.java
similarity index 63%
rename from 
freemarker-generator-cli/src/main/java/org/apache/freemarker/generator/cli/config/output/AggregatingOutputGenerator.java
rename to 
freemarker-generator-cli/src/main/java/org/apache/freemarker/generator/cli/config/output/TemplateSeedingOutputGenerator.java
index 56fe9ea..7bb59a0 100644
--- 
a/freemarker-generator-cli/src/main/java/org/apache/freemarker/generator/cli/config/output/AggregatingOutputGenerator.java
+++ 
b/freemarker-generator-cli/src/main/java/org/apache/freemarker/generator/cli/config/output/TemplateSeedingOutputGenerator.java
@@ -16,40 +16,32 @@
  */
 package org.apache.freemarker.generator.cli.config.output;
 
-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.DataSourcesSupplier;
 import org.apache.freemarker.generator.base.output.OutputGenerator;
 import org.apache.freemarker.generator.base.output.OutputGenerator.SeedType;
 import org.apache.freemarker.generator.base.template.TemplateTransformation;
 import 
org.apache.freemarker.generator.base.template.TemplateTransformationsBuilder;
-import org.apache.freemarker.generator.base.util.UriUtils;
-import org.apache.freemarker.generator.cli.config.DataModelSupplier;
 import org.apache.freemarker.generator.cli.config.Settings;
 import org.apache.freemarker.generator.cli.picocli.OutputGeneratorDefinition;
 import org.apache.freemarker.generator.cli.picocli.TemplateOutputDefinition;
 import org.apache.freemarker.generator.cli.picocli.TemplateSourceDefinition;
 
-import java.net.URI;
 import java.util.ArrayList;
-import java.util.HashMap;
 import java.util.List;
-import java.util.Map;
 import java.util.function.Function;
 
-import static java.nio.charset.StandardCharsets.UTF_8;
 import static java.util.Objects.requireNonNull;
-import static 
org.apache.freemarker.generator.base.FreeMarkerConstants.DEFAULT_GROUP;
-import static 
org.apache.freemarker.generator.base.FreeMarkerConstants.Location.STDIN;
-import static 
org.apache.freemarker.generator.base.mime.Mimetypes.MIME_TEXT_PLAIN;
 
-public class AggregatingOutputGenerator implements 
Function<OutputGeneratorDefinition, List<OutputGenerator>> {
+/**
+ * Generates an <code>OutputGenerator</code> per <code>Template</code>.
+ */
+public class TemplateSeedingOutputGenerator
+        extends AbstractOutputGenerator
+        implements Function<OutputGeneratorDefinition, List<OutputGenerator>> {
 
     private final Settings settings;
 
-    public AggregatingOutputGenerator(Settings settings) {
-        this.settings = settings;
+    public TemplateSeedingOutputGenerator(Settings settings) {
+        this.settings = requireNonNull(settings);
     }
 
     @Override
@@ -104,34 +96,4 @@ public class AggregatingOutputGenerator implements 
Function<OutputGeneratorDefin
 
         return result;
     }
-
-    private List<DataSource> dataSources(Settings settings, 
OutputGeneratorDefinition outputGeneratorDefinition) {
-        final ArrayList<DataSource> result = new ArrayList<>();
-
-        // Add optional data source from STDIN at the start of the list since
-        // this allows easy sequence slicing in FreeMarker.
-        if (settings.isReadFromStdin()) {
-            result.add(0, stdinDataSource());
-        }
-
-        final DataSourcesSupplier outputGeneratorDataSourcesSupplier = new 
DataSourcesSupplier(
-                outputGeneratorDefinition.getDataSources(),
-                settings.getSourceIncludePattern(),
-                settings.getSourceExcludePattern(),
-                settings.getInputEncoding()
-        );
-
-        result.addAll(outputGeneratorDataSourcesSupplier.get());
-
-        return result;
-    }
-
-    private Map<String, Object> dataModels(OutputGeneratorDefinition 
outputGeneratorDefinition) {
-        return new 
DataModelSupplier(outputGeneratorDefinition.getDataModels()).get();
-    }
-
-    private static DataSource stdinDataSource() {
-        final URI uri = UriUtils.toUri(Location.SYSTEM, STDIN);
-        return DataSourceFactory.fromInputStream(STDIN, DEFAULT_GROUP, uri, 
System.in, MIME_TEXT_PLAIN, UTF_8, new HashMap<>());
-    }
 }
diff --git 
a/freemarker-generator-cli/src/main/java/org/apache/freemarker/generator/cli/picocli/OutputGeneratorDefinition.java
 
b/freemarker-generator-cli/src/main/java/org/apache/freemarker/generator/cli/picocli/OutputGeneratorDefinition.java
index 98d2347..d824524 100644
--- 
a/freemarker-generator-cli/src/main/java/org/apache/freemarker/generator/cli/picocli/OutputGeneratorDefinition.java
+++ 
b/freemarker-generator-cli/src/main/java/org/apache/freemarker/generator/cli/picocli/OutputGeneratorDefinition.java
@@ -16,7 +16,7 @@
  */
 package org.apache.freemarker.generator.cli.picocli;
 
-import org.apache.freemarker.generator.base.FreeMarkerConstants.Mode;
+import org.apache.freemarker.generator.base.FreeMarkerConstants.SeedType;
 import picocli.CommandLine;
 import picocli.CommandLine.ArgGroup;
 import picocli.CommandLine.ParameterException;
@@ -25,6 +25,9 @@ import java.util.List;
 
 import static java.util.Collections.emptyList;
 
+/**
+ * Collects the setting for an output generator.
+ */
 public class OutputGeneratorDefinition {
 
     @ArgGroup(multiplicity = "1")
@@ -37,16 +40,16 @@ public class OutputGeneratorDefinition {
     public TemplateOutputDefinition templateOutputDefinition;
 
     @ArgGroup(exclusive = false)
-    public TemplateOutputMapperDefinition templateOutputMapperDefinition;
-
-    @ArgGroup(exclusive = false)
     public DataSourceDefinition dataSourceDefinition;
 
     @ArgGroup(exclusive = false)
     public DataModelDefinition dataModelDefinition;
 
     @ArgGroup(exclusive = false)
-    public OutputGeneratorModeDefinition outputGeneratorModeDefinition;
+    public OutputSeedDefinition outputSeedDefinition;
+
+    @ArgGroup(exclusive = false)
+    public OutputMapperDefinition outputMapperDefinition;
 
     public void validate(CommandLine commandLine) {
         if (templateSourceDefinition == null) {
@@ -106,15 +109,18 @@ public class OutputGeneratorDefinition {
                 
!getTemplateSourceFilterDefinition().templateExcludePatterns.isEmpty();
     }
 
-    public String getOutputGeneratorMode() {
-        if (outputGeneratorModeDefinition != null &&
-                outputGeneratorModeDefinition.outputGeneratorMode != null) {
-            return outputGeneratorModeDefinition.outputGeneratorMode;
+    public String getOutputSeedType() {
+        if (outputSeedDefinition != null && outputSeedDefinition.type != null) 
{
+            return outputSeedDefinition.type;
         } else {
-            return Mode.AGGREGATE;
+            return SeedType.TEMPLATE;
         }
     }
 
+    public String getOutputMapper() {
+        return (outputMapperDefinition != null) ? 
outputMapperDefinition.outputMapper : null;
+    }
+
     private static boolean isFileSource(String source) {
         if (source.contains("file://")) {
             return true;
diff --git 
a/freemarker-generator-cli/src/main/java/org/apache/freemarker/generator/cli/picocli/TemplateOutputMapperDefinition.java
 
b/freemarker-generator-cli/src/main/java/org/apache/freemarker/generator/cli/picocli/OutputMapperDefinition.java
similarity index 95%
rename from 
freemarker-generator-cli/src/main/java/org/apache/freemarker/generator/cli/picocli/TemplateOutputMapperDefinition.java
rename to 
freemarker-generator-cli/src/main/java/org/apache/freemarker/generator/cli/picocli/OutputMapperDefinition.java
index 1512a5d..d23ec74 100644
--- 
a/freemarker-generator-cli/src/main/java/org/apache/freemarker/generator/cli/picocli/TemplateOutputMapperDefinition.java
+++ 
b/freemarker-generator-cli/src/main/java/org/apache/freemarker/generator/cli/picocli/OutputMapperDefinition.java
@@ -18,7 +18,7 @@ package org.apache.freemarker.generator.cli.picocli;
 
 import picocli.CommandLine.Option;
 
-public class TemplateOutputMapperDefinition {
+public class OutputMapperDefinition {
 
     @Option(names = { "--output-mapper" }, description = "maps the name of the 
output file")
     public String outputMapper;
diff --git 
a/freemarker-generator-cli/src/main/java/org/apache/freemarker/generator/cli/picocli/OutputGeneratorModeDefinition.java
 
b/freemarker-generator-cli/src/main/java/org/apache/freemarker/generator/cli/picocli/OutputSeedDefinition.java
similarity index 74%
rename from 
freemarker-generator-cli/src/main/java/org/apache/freemarker/generator/cli/picocli/OutputGeneratorModeDefinition.java
rename to 
freemarker-generator-cli/src/main/java/org/apache/freemarker/generator/cli/picocli/OutputSeedDefinition.java
index ba865aa..f897cbb 100644
--- 
a/freemarker-generator-cli/src/main/java/org/apache/freemarker/generator/cli/picocli/OutputGeneratorModeDefinition.java
+++ 
b/freemarker-generator-cli/src/main/java/org/apache/freemarker/generator/cli/picocli/OutputSeedDefinition.java
@@ -19,10 +19,10 @@ package org.apache.freemarker.generator.cli.picocli;
 import picocli.CommandLine.Option;
 
 /**
- * Aggregate multiple data source into one output file or generate an output 
file per data source.
+ * Seeding of template output.
  */
-public class OutputGeneratorModeDefinition {
+public class OutputSeedDefinition {
 
-    @Option(names = { "-M", "--output-mode" }, defaultValue = "aggregate", 
description = "Output mode: [generate|aggregate]")
-    public String outputGeneratorMode;
+    @Option(names = { "--seed" }, defaultValue = "template", description = 
"seed mode: [template|datasource]")
+    public String type;
 }
diff --git 
a/freemarker-generator-cli/src/test/java/org/apache/freemarker/generator/cli/config/output/DataSourceSeedingOutputMapperTest.java
 
b/freemarker-generator-cli/src/test/java/org/apache/freemarker/generator/cli/config/output/DataSourceSeedingOutputMapperTest.java
new file mode 100644
index 0000000..8e81ca8
--- /dev/null
+++ 
b/freemarker-generator-cli/src/test/java/org/apache/freemarker/generator/cli/config/output/DataSourceSeedingOutputMapperTest.java
@@ -0,0 +1,69 @@
+package org.apache.freemarker.generator.cli.config.output;
+
+import org.apache.commons.io.FilenameUtils;
+import org.apache.freemarker.generator.base.datasource.DataSource;
+import org.apache.freemarker.generator.base.datasource.DataSourceFactory;
+import org.apache.freemarker.generator.base.util.FileUtils;
+import org.apache.freemarker.generator.base.util.OperatingSystem;
+import org.apache.freemarker.generator.base.util.StringUtils;
+import org.junit.Test;
+
+import java.io.File;
+import java.nio.charset.StandardCharsets;
+
+import static org.junit.Assert.assertEquals;
+
+public class DataSourceSeedingOutputMapperTest {
+
+    private final File CURRENT_DIRECTORY = new File(".");
+    private final File PARENT_DIRECTORY = new File("..");
+    private final File ANY_DIRECTORY = new File("target");
+    private final File ANY_FILE = new File("pom.xml");
+    private final DataSource ANY_DATA_SOURCE = 
DataSourceFactory.fromFile(ANY_FILE, StandardCharsets.UTF_8);
+
+    @Test
+    public void shouldGenerateOutputFileForCurrentDirectory() {
+        assertEquals("pom.xml", path(outputMapper(null).map(CURRENT_DIRECTORY, 
ANY_DATA_SOURCE)));
+        assertEquals("pom.xml", path(outputMapper("").map(CURRENT_DIRECTORY, 
ANY_DATA_SOURCE)));
+        assertEquals("pom.html", 
path(outputMapper("*.html").map(CURRENT_DIRECTORY, ANY_DATA_SOURCE)));
+        assertEquals("pom.html", 
path(outputMapper("pom.html").map(CURRENT_DIRECTORY, ANY_DATA_SOURCE)));
+        assertEquals("html/pom.html", 
path(outputMapper("html/*.html").map(CURRENT_DIRECTORY, ANY_DATA_SOURCE)));
+    }
+
+    @Test
+    public void shouldGenerateOutputFileForParentDirectory() {
+        assertEquals("../pom.xml", 
path(outputMapper(null).map(PARENT_DIRECTORY, ANY_DATA_SOURCE)));
+        assertEquals("../pom.xml", path(outputMapper("").map(PARENT_DIRECTORY, 
ANY_DATA_SOURCE)));
+        assertEquals("../pom.html", 
path(outputMapper("*.html").map(PARENT_DIRECTORY, ANY_DATA_SOURCE)));
+        assertEquals("../pom.html", 
path(outputMapper("pom.html").map(PARENT_DIRECTORY, ANY_DATA_SOURCE)));
+        assertEquals("../html/pom.html", 
path(outputMapper("html/*.html").map(PARENT_DIRECTORY, ANY_DATA_SOURCE)));
+    }
+
+    @Test
+    public void shouldGenerateOutputFileForAnyDirectory() {
+        assertEquals("target/pom.xml", 
path(outputMapper(null).map(ANY_DIRECTORY, ANY_DATA_SOURCE)));
+        assertEquals("target/pom.xml", 
path(outputMapper("").map(ANY_DIRECTORY, ANY_DATA_SOURCE)));
+        assertEquals("target/pom.html", 
path(outputMapper("*.html").map(ANY_DIRECTORY, ANY_DATA_SOURCE)));
+        assertEquals("target/pom.html", 
path(outputMapper("pom.html").map(ANY_DIRECTORY, ANY_DATA_SOURCE)));
+        assertEquals("target/html/pom.html", 
path(outputMapper("html/*.html").map(ANY_DIRECTORY, ANY_DATA_SOURCE)));
+    }
+
+    private static DataSourceSeedingOutputMapper outputMapper(String template) 
{
+        return new DataSourceSeedingOutputMapper(template);
+    }
+
+    private static String fixSeparators(String str) {
+        if (OperatingSystem.isWindows()) {
+            return FilenameUtils.separatorsToUnix(str);
+        } else {
+            return str;
+        }
+    }
+
+    private static String path(File file) {
+        final File workingDir = new File(".");
+        final String relativePath = FileUtils.getRelativePath(workingDir, 
file);
+        return StringUtils.isEmpty(relativePath) ?
+                file.getName() : fixSeparators(relativePath) + 
File.separatorChar + file.getName();
+    }
+}

Reply via email to