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

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

commit 55366518bf7ca8662d9557cc6f2ab92d56a7b9d6
Author: Siegfried Goeschl <[email protected]>
AuthorDate: Fri Feb 28 22:25:07 2020 +0100

    FREEMARKER-135 Support user-supplied names for datasources
---
 .../generator/base/FreeMarkerConstants.java        |  5 ++++
 .../base/datasource/DatasourceFactory.java         |  6 +++-
 .../base/datasource/DatasourcesSupplier.java       | 16 +++++++++--
 .../freemarker/generator/base/uri/NamedUri.java    |  5 ++++
 .../org/apache/freemarker/generator/cli/Main.java  | 32 ++++++++++++++++++++--
 .../freemarker/generator/cli/config/Settings.java  | 26 +++++++++---------
 .../freemarker/generator/cli/config/Suppliers.java |  2 +-
 .../freemarker/generator/cli/ManualTest.java       |  3 +-
 .../generator/cli/config/SettingsTest.java         |  4 +--
 freemarker-generator-cli/templates/info.ftl        |  2 +-
 10 files changed, 77 insertions(+), 24 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 94508d1..c40c29e 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
@@ -26,6 +26,11 @@ public class FreeMarkerConstants {
     /* Default encoding for textual content */
     public static final Charset DEFAULT_CHARSET = UTF_8;
 
+    public enum GeneratorMode {
+        DATASOURCE,
+        TEMPLATE
+    }
+
     public static class Configuration {
 
         private Configuration() {
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 c54aa4e..08af5df 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
@@ -51,8 +51,12 @@ public class DatasourceFactory {
     }
 
     public static Datasource create(File file, Charset charset) {
+        return create(file.getName(), file, charset);
+    }
+
+    public static Datasource create(String name, File file, Charset charset) {
         final FileDataSource dataSource = new FileDataSource(file);
-        return create(file.getName(), dataSource, file.getAbsolutePath(), 
charset);
+        return create(name, dataSource, file.getAbsolutePath(), charset);
     }
 
     public static Datasource create(String name, byte[] content) {
diff --git 
a/freemarker-generator-base/src/main/java/org/apache/freemarker/generator/base/datasource/DatasourcesSupplier.java
 
b/freemarker-generator-base/src/main/java/org/apache/freemarker/generator/base/datasource/DatasourcesSupplier.java
index 3e5a686..7ae7819 100644
--- 
a/freemarker-generator-base/src/main/java/org/apache/freemarker/generator/base/datasource/DatasourcesSupplier.java
+++ 
b/freemarker-generator-base/src/main/java/org/apache/freemarker/generator/base/datasource/DatasourcesSupplier.java
@@ -17,6 +17,8 @@
 package org.apache.freemarker.generator.base.datasource;
 
 import org.apache.freemarker.generator.base.file.RecursiveFileSupplier;
+import org.apache.freemarker.generator.base.uri.NamedUri;
+import org.apache.freemarker.generator.base.uri.NamedUriParser;
 
 import java.net.MalformedURLException;
 import java.net.URL;
@@ -83,8 +85,12 @@ public class DatasourcesSupplier implements 
Supplier<List<Datasource>> {
     }
 
     private static List<Datasource> resolveFile(String source, String include, 
String exclude, Charset charset) {
-        return fileResolver(source, include, exclude).get().stream()
-                .map(file -> DatasourceFactory.create(file, charset))
+        final NamedUri namedUri = NamedUriParser.parse(source);
+        final String path = namedUri.getUri().getPath();
+        final Charset currCharset = getCharset(namedUri, charset);
+        final String name = namedUri.hasName() ? namedUri.getName() : path;
+        return fileResolver(path, include, exclude).get().stream()
+                .map(file -> DatasourceFactory.create(name, file, currCharset))
                 .collect(toList());
     }
 
@@ -93,7 +99,7 @@ public class DatasourcesSupplier implements 
Supplier<List<Datasource>> {
     }
 
     private static boolean isHttpUrl(String value) {
-        return value.startsWith("http://";) || value.startsWith("https://";);
+        return value.contains("http://";) || value.startsWith("https://";);
     }
 
     private static URL toUrl(String value) {
@@ -103,4 +109,8 @@ public class DatasourcesSupplier implements 
Supplier<List<Datasource>> {
             throw new IllegalArgumentException(value, e);
         }
     }
+
+    private static Charset getCharset(NamedUri namedUri, Charset def) {
+        return 
Charset.forName(namedUri.getParameters().getOrDefault("charset", def.name()));
+    }
 }
diff --git 
a/freemarker-generator-base/src/main/java/org/apache/freemarker/generator/base/uri/NamedUri.java
 
b/freemarker-generator-base/src/main/java/org/apache/freemarker/generator/base/uri/NamedUri.java
index cc0b52c..c2dffdb 100644
--- 
a/freemarker-generator-base/src/main/java/org/apache/freemarker/generator/base/uri/NamedUri.java
+++ 
b/freemarker-generator-base/src/main/java/org/apache/freemarker/generator/base/uri/NamedUri.java
@@ -21,6 +21,7 @@ import java.util.Map;
 
 import static java.util.Collections.emptyMap;
 import static java.util.Objects.requireNonNull;
+import static org.apache.freemarker.generator.base.util.StringUtils.isEmpty;
 
 /**
  * Caputeres the information of a user-supplied "named URI".
@@ -66,6 +67,10 @@ public class NamedUri {
         return parameters;
     }
 
+    public boolean hasName() {
+        return !isEmpty(this.name);
+    }
+
     @Override
     public String toString() {
         return "NamedUri{" +
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 93ea256..406c70e 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
@@ -16,6 +16,7 @@
  */
 package org.apache.freemarker.generator.cli;
 
+import org.apache.freemarker.generator.base.FreeMarkerConstants.GeneratorMode;
 import org.apache.freemarker.generator.base.util.ClosableUtils;
 import org.apache.freemarker.generator.base.util.StringUtils;
 import org.apache.freemarker.generator.cli.config.Settings;
@@ -33,13 +34,16 @@ import java.io.FileWriter;
 import java.io.IOException;
 import java.io.OutputStreamWriter;
 import java.io.Writer;
-import java.util.ArrayList;
+import java.util.Collection;
 import java.util.HashMap;
 import java.util.List;
 import java.util.Map;
+import java.util.Objects;
 import java.util.Properties;
 import java.util.concurrent.Callable;
+import java.util.stream.Collectors;
 import java.util.stream.IntStream;
+import java.util.stream.Stream;
 
 import static java.util.Objects.requireNonNull;
 import static 
org.apache.freemarker.generator.cli.config.Suppliers.propertiesSupplier;
@@ -79,6 +83,9 @@ public class Main implements Callable<Integer> {
     @Option(names = { "-l", "--locale" }, description = "Locale being used for 
the output, e.g. 'en_US'")
     String locale;
 
+    @Option(names = { "-m", "--mode" }, description = "[template|datasource]", 
defaultValue = "TEMPLATE")
+    GeneratorMode mode;
+
     @Option(names = { "-o", "--output" }, description = "Output file")
     String outputFile;
 
@@ -185,7 +192,7 @@ public class Main implements Callable<Integer> {
                 .setOutputEncoding(outputEncoding)
                 .setOutputFile(outputFile)
                 .setParameters(parameters != null ? parameters : new 
HashMap<>())
-                .setSources(sources != null ? sources : new ArrayList<>())
+                .setDatasources(getCombindedDatasources())
                 .setSystemProperties(systemProperties != null ? 
systemProperties : new Properties())
                 .setTemplateDirectories(templateDirectories)
                 .setTemplateName(templateSourceOptions.template)
@@ -213,6 +220,27 @@ public class Main implements Callable<Integer> {
         }
     }
 
+    /**
+     * Datasources can be passed via command line option and/or
+     * positional parameter so we need to merge them.
+     *
+     * @return List of datasources
+     */
+    private List<String> getCombindedDatasources() {
+        if (isTemplateDrivenGeneration()) {
+            return Stream.of(datasources, sources)
+                    .filter(Objects::nonNull)
+                    .flatMap(Collection::stream)
+                    .collect(Collectors.toList());
+        } else {
+            throw new IllegalArgumentException("Not implemented yet");
+        }
+    }
+
+    private boolean isTemplateDrivenGeneration() {
+        return mode == GeneratorMode.TEMPLATE;
+    }
+
     private static List<File> getTemplateDirectories(String baseDir) {
         return templateDirectorySupplier(baseDir).get();
     }
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 c1a63b3..5facf82 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
@@ -52,7 +52,7 @@ public class Settings {
     /** List of FreeMarker template directories */
     private final List<File> templateDirectories;
 
-    /** Name of the template to be loaded and rendered  */
+    /** Name of the template to be loaded and rendered */
     private final String templateName;
 
     /** Template provided by the user interactivly */
@@ -86,7 +86,7 @@ public class Settings {
     private final boolean isEnvironmentExposed;
 
     /** User-supplied list of source files or directories */
-    private final List<String> sources;
+    private final List<String> datasources;
 
     /** User-supplied parameters */
     private final Map<String, String> parameters;
@@ -112,7 +112,7 @@ public class Settings {
             Locale locale,
             boolean isReadFromStdin,
             boolean isEnvironmentExposed,
-            List<String> sources,
+            List<String> datasources,
             Map<String, String> parameters,
             Properties sytemProperties,
             Writer writer) {
@@ -133,7 +133,7 @@ public class Settings {
         this.locale = requireNonNull(locale);
         this.isReadFromStdin = isReadFromStdin;
         this.isEnvironmentExposed = isEnvironmentExposed;
-        this.sources = requireNonNull(sources);
+        this.datasources = requireNonNull(datasources);
         this.parameters = requireNonNull(parameters);
         this.sytemProperties = requireNonNull(sytemProperties);
         this.configuration = requireNonNull(configuration);
@@ -204,8 +204,8 @@ public class Settings {
         return isEnvironmentExposed;
     }
 
-    public List<String> getSources() {
-        return sources;
+    public List<String> getDatasources() {
+        return datasources;
     }
 
     public Map<String, String> getParameters() {
@@ -262,7 +262,7 @@ public class Settings {
                 ", locale=" + locale +
                 ", isReadFromStdin=" + isReadFromStdin +
                 ", isEnvironmentExposed=" + isEnvironmentExposed +
-                ", sources=" + sources +
+                ", datasources=" + datasources +
                 ", properties=" + parameters +
                 ", sytemProperties=" + sytemProperties +
                 ", writer=" + writer +
@@ -288,7 +288,7 @@ public class Settings {
         private String locale;
         private boolean isReadFromStdin;
         private boolean isEnvironmentExposed;
-        private List<String> sources;
+        private List<String> datasources;
         private Map<String, String> parameters;
         private Properties systemProperties;
         private Properties configuration;
@@ -302,7 +302,7 @@ public class Settings {
             this.systemProperties = new Properties();
             this.setInputEncoding(DEFAULT_CHARSET.name());
             this.setOutputEncoding(DEFAULT_CHARSET.name());
-            this.sources = emptyList();
+            this.datasources = emptyList();
             this.templateDirectories = emptyList();
         }
 
@@ -380,8 +380,8 @@ public class Settings {
             return this;
         }
 
-        public SettingsBuilder setSources(List<String> sources) {
-            this.sources = sources;
+        public SettingsBuilder setDatasources(List<String> datasources) {
+            this.datasources = datasources;
             return this;
         }
 
@@ -393,7 +393,7 @@ public class Settings {
         }
 
         public SettingsBuilder setSystemProperties(Properties 
systemProperties) {
-            if(systemProperties != null) {
+            if (systemProperties != null) {
                 this.systemProperties = systemProperties;
             }
             return this;
@@ -432,7 +432,7 @@ public class Settings {
                     LocaleUtils.parseLocale(currLocale),
                     isReadFromStdin,
                     isEnvironmentExposed,
-                    sources,
+                    datasources,
                     parameters,
                     systemProperties,
                     writer
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 7d2f5f1..0a7a9f2 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
@@ -34,7 +34,7 @@ public class Suppliers {
     }
 
     public static DatasourcesSupplier datasourcesSupplier(Settings settings) {
-        return new DatasourcesSupplier(settings.getSources(),
+        return new DatasourcesSupplier(settings.getDatasources(),
                 settings.getInclude(),
                 settings.getExclude(),
                 settings.getInputEncoding());
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 35b1069..f2a8e8a 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
@@ -35,7 +35,8 @@ public class ManualTest {
     // private static final String CMD = "-i 
${JsoupTool.parse(Datasources.first).select('a')[0]} 
site/sample/html/dependencies.html";
     // private static final String CMD = "-b ./src/test -t 
templates/properties/csv/locker-test-users.ftl site/sample/properties";
     // private static final String CMD = "-b ./src/test -e UTF-8 -l de_AT 
-Dcolumn=Order%20ID -Dvalues=226939189,957081544 -Dformat=DEFAULT 
-Ddelimiter=COMMA -t templates/csv/md/filter.ftl 
site/sample/csv/sales-records.csv";
-    private static final String CMD = "-E -b ./src/test -t 
templates/environment.ftl";
+    // private static final String CMD = "-E -b ./src/test -t 
templates/environment.ftl";
+    private static final String CMD = "-b ./src/test -l de_AT -DFOO=foo 
-DBAR=bar -t templates/info.ftl site/sample/csv/transactions.csv -d 
contract=site/sample/csv/contract.csv#charset=UTF-16";
 
     public static void main(String[] args) {
         Main.execute(toArgs(CMD));
diff --git 
a/freemarker-generator-cli/src/test/java/org/apache/freemarker/generator/cli/config/SettingsTest.java
 
b/freemarker-generator-cli/src/test/java/org/apache/freemarker/generator/cli/config/SettingsTest.java
index 4821723..655fdf6 100644
--- 
a/freemarker-generator-cli/src/test/java/org/apache/freemarker/generator/cli/config/SettingsTest.java
+++ 
b/freemarker-generator-cli/src/test/java/org/apache/freemarker/generator/cli/config/SettingsTest.java
@@ -56,7 +56,7 @@ public class SettingsTest {
         assertEquals(ANY_OUTPUT_ENCODING, settings.getOutputEncoding().name());
         assertEquals(ANY_OUTPUT_FILE, settings.getOutputFile().getName());
         assertEquals(ANY_TEMPLATE_NAME, settings.getTemplateName());
-        assertNotNull(settings.getSources());
+        assertNotNull(settings.getDatasources());
         assertNotNull(settings.getParameters());
         assertNotNull(settings.getSytemProperties());
         assertTrue(settings.isReadFromStdin());
@@ -78,7 +78,7 @@ public class SettingsTest {
                 .setOutputEncoding(ANY_OUTPUT_ENCODING)
                 .setOutputFile(ANY_OUTPUT_FILE)
                 .setParameters(ANY_USER_PARAMETERS)
-                .setSources(ANY_SOURCES)
+                .setDatasources(ANY_SOURCES)
                 .setSystemProperties(ANY_SYSTEM_PROPERTIES)
                 .setTemplateName(ANY_TEMPLATE_NAME)
                 .setWriter(new StringWriter())
diff --git a/freemarker-generator-cli/templates/info.ftl 
b/freemarker-generator-cli/templates/info.ftl
index 3ec4891..154416e 100644
--- a/freemarker-generator-cli/templates/info.ftl
+++ b/freemarker-generator-cli/templates/info.ftl
@@ -42,7 +42,7 @@ FreeMarker CLI Tools
 FreeMarker CLI Datasources
 ---------------------------------------------------------------------------
 <#list Datasources.list as datasource>
-[${datasource?counter}] ${datasource.name}, ${datasource.location}, 
${datasource.length} Bytes
+[${datasource?counter}] ${datasource.name}, ${datasource.location}, 
${datasource.charset}, ${datasource.length} Bytes
 </#list>
 
 User Supplied Parameters

Reply via email to