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/02/29 00:06:10 UTC
[freemarker-generator] 02/06: FREEMARKER-135 Support user-supplied
names for datasources
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 <si...@gmail.com>
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