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
