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:14 UTC
[freemarker-generator] 06/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 f8a9c5376e349b3d4e96f1d1196ebec488f80ae7
Author: Siegfried Goeschl <si...@gmail.com>
AuthorDate: Sat Feb 29 01:05:06 2020 +0100
FREEMARKER-135 Support user-supplied names for datasources
---
.../base/datasource/DatasourcesSupplier.java | 36 +++++++++++----
.../generator/base/uri/NamedUriFragmentParser.java | 4 +-
.../generator/base/uri/NamedUriParser.java | 51 ++++++++--------------
.../generator/datasource/DatasourceTest.java | 3 ++
.../generator/uri/NamedUriParserTest.java | 50 +++++++++++++++++++--
.../freemarker/generator/cli/ManualTest.java | 2 +-
6 files changed, 97 insertions(+), 49 deletions(-)
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 7ae7819..c671fcf 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
@@ -21,6 +21,7 @@ import org.apache.freemarker.generator.base.uri.NamedUri;
import org.apache.freemarker.generator.base.uri.NamedUriParser;
import java.net.MalformedURLException;
+import java.net.URI;
import java.net.URL;
import java.nio.charset.Charset;
import java.util.ArrayList;
@@ -28,6 +29,7 @@ import java.util.Collection;
import java.util.List;
import java.util.function.Supplier;
+import static java.nio.charset.StandardCharsets.UTF_8;
import static java.util.Collections.singletonList;
import static java.util.Objects.requireNonNull;
import static java.util.stream.Collectors.toList;
@@ -73,22 +75,32 @@ public class DatasourcesSupplier implements Supplier<List<Datasource>> {
}
private List<Datasource> get(String source) {
- if (isHttpUrl(source)) {
- return singletonList(resolveHttpUrl(source));
- } else {
- return resolveFile(source, include, exclude, charset);
+ try {
+ if (isHttpUrl(source)) {
+ return singletonList(resolveHttpUrl(source));
+ } else {
+ return resolveFile(source, include, exclude, charset);
+ }
+ }
+ catch(RuntimeException e) {
+ throw new RuntimeException("Unable to create the datasource: " + source, e);
}
}
- private static Datasource resolveHttpUrl(String url) {
- return DatasourceFactory.create(toUrl(url));
+ private static Datasource resolveHttpUrl(String source) {
+ final NamedUri namedUri = NamedUriParser.parse(source);
+ final URI uri = namedUri.getUri();
+ final String location = uri.getScheme() + "://" + uri.getHost();
+ final String name = namedUri.hasName() ? namedUri.getName() : location;
+ final Charset currCharset = getCharset(namedUri, UTF_8);
+ return DatasourceFactory.create(name, toUrl(uri), currCharset);
}
private static List<Datasource> resolveFile(String source, String include, String exclude, Charset 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;
+ final Charset currCharset = getCharset(namedUri, charset);
return fileResolver(path, include, exclude).get().stream()
.map(file -> DatasourceFactory.create(name, file, currCharset))
.collect(toList());
@@ -99,7 +111,7 @@ public class DatasourcesSupplier implements Supplier<List<Datasource>> {
}
private static boolean isHttpUrl(String value) {
- return value.contains("http://") || value.startsWith("https://");
+ return value.contains("http://") || value.contains("https://");
}
private static URL toUrl(String value) {
@@ -110,6 +122,14 @@ public class DatasourcesSupplier implements Supplier<List<Datasource>> {
}
}
+ private static URL toUrl(URI uri) {
+ try {
+ return uri.toURL();
+ } catch (MalformedURLException e) {
+ throw new IllegalArgumentException(uri.toString(), 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/NamedUriFragmentParser.java b/freemarker-generator-base/src/main/java/org/apache/freemarker/generator/base/uri/NamedUriFragmentParser.java
index a94d3da..304a233 100644
--- a/freemarker-generator-base/src/main/java/org/apache/freemarker/generator/base/uri/NamedUriFragmentParser.java
+++ b/freemarker-generator-base/src/main/java/org/apache/freemarker/generator/base/uri/NamedUriFragmentParser.java
@@ -17,9 +17,9 @@
package org.apache.freemarker.generator.base.uri;
import java.util.Arrays;
-import java.util.Collections;
import java.util.Map;
+import static java.util.Collections.emptyMap;
import static java.util.stream.Collectors.toMap;
import static org.apache.freemarker.generator.base.util.StringUtils.isEmpty;
@@ -30,7 +30,7 @@ public class NamedUriFragmentParser {
public static Map<String, String> parse(String fragment) {
if (isEmpty(fragment)) {
- return Collections.emptyMap();
+ return emptyMap();
}
try {
diff --git a/freemarker-generator-base/src/main/java/org/apache/freemarker/generator/base/uri/NamedUriParser.java b/freemarker-generator-base/src/main/java/org/apache/freemarker/generator/base/uri/NamedUriParser.java
index a18d914..174a303 100644
--- a/freemarker-generator-base/src/main/java/org/apache/freemarker/generator/base/uri/NamedUriParser.java
+++ b/freemarker-generator-base/src/main/java/org/apache/freemarker/generator/base/uri/NamedUriParser.java
@@ -22,8 +22,6 @@ import java.util.Map;
import java.util.regex.Matcher;
import java.util.regex.Pattern;
-import static java.util.Objects.requireNonNull;
-
/**
* Parses a named URI provided by the caller.
* <ul>
@@ -35,47 +33,32 @@ import static java.util.Objects.requireNonNull;
*/
public class NamedUriParser {
- private static final String NAME_GROUP = "name";
- private static final String URI_GROUP = "uri";
- private static final int NR_OF_NAMED_GROUPS = 2;
+ private static final String REGEXP_GROUP_NAME = "name";
+ private static final String REGEXP_GROUP_URI = "uri";
private static final Pattern NAMED_URI_REGEXP = Pattern.compile("^(?<name>[a-zA-Z0-9-_]*)=(?<uri>.*)");
public static NamedUri parse(String value) {
- final String sanitzedUri = requireNonNull(value).trim();
+ final Matcher matcher = NAMED_URI_REGEXP.matcher(value);
- if (sanitzedUri.isEmpty()) {
- throw new IllegalArgumentException("Empty named URI");
+ if (matcher.matches()) {
+ final String name = matcher.group(REGEXP_GROUP_NAME);
+ final URI uri = uri(matcher.group(REGEXP_GROUP_URI));
+ return new NamedUri(name, uri, parameters(uri));
+ } else {
+ final URI uri = uri(value);
+ return new NamedUri(uri, parameters(uri));
}
+ }
+ private static URI uri(String value) {
try {
- // avoid invoking the regexp if it can't match anyway
- if (isSimpleUri(sanitzedUri)) {
- return new NamedUri(new URI(sanitzedUri));
- }
-
- final Matcher matcher = NAMED_URI_REGEXP.matcher(sanitzedUri);
-
- if (!matcher.matches() || matcher.groupCount() > NR_OF_NAMED_GROUPS) {
- throw new IllegalArgumentException("Invalid named URI: " + value);
- }
-
- if (matcher.groupCount() == NR_OF_NAMED_GROUPS) {
- final String name = matcher.group(NAME_GROUP);
- final URI uri = new URI(matcher.group(URI_GROUP));
- final Map<String, String> parameters = NamedUriFragmentParser.parse(uri.getFragment());
- return new NamedUri(name, uri, parameters);
- } else {
- final URI uri = new URI(matcher.group(sanitzedUri));
- final Map<String, String> parameters = NamedUriFragmentParser.parse(uri.getFragment());
- return new NamedUri(uri, parameters);
- }
- } catch (URISyntaxException | RuntimeException e) {
- throw new RuntimeException("Failed to parse named URI: " + value, e);
+ return new URI(value);
+ } catch (URISyntaxException e) {
+ throw new RuntimeException("Failed to parse URI: " + value, e);
}
}
- private static boolean isSimpleUri(String uri) {
- return !uri.contains("=");
+ private static Map<String, String> parameters(URI uri) {
+ return NamedUriFragmentParser.parse(uri.getFragment());
}
-
}
diff --git a/freemarker-generator-base/src/test/java/org/apache/freemarker/generator/datasource/DatasourceTest.java b/freemarker-generator-base/src/test/java/org/apache/freemarker/generator/datasource/DatasourceTest.java
index 878dd2c..5aba8de 100644
--- a/freemarker-generator-base/src/test/java/org/apache/freemarker/generator/datasource/DatasourceTest.java
+++ b/freemarker-generator-base/src/test/java/org/apache/freemarker/generator/datasource/DatasourceTest.java
@@ -49,6 +49,7 @@ public class DatasourceTest {
assertEquals("", datasource.getExtension());
assertEquals("string", datasource.getLocation());
assertEquals(UTF_8, datasource.getCharset());
+ assertEquals("plain/text", datasource.getContentType());
assertTrue(datasource.getLength() > 0);
assertEquals(ANY_TEXT, datasource.getText());
}
@@ -62,6 +63,7 @@ public class DatasourceTest {
assertEquals("xml", datasource.getExtension());
assertEquals(ANY_FILE.getAbsolutePath(), datasource.getLocation());
assertEquals(Charset.defaultCharset(), datasource.getCharset());
+ assertEquals("application/xml", datasource.getContentType());
assertTrue(datasource.getLength() > 0);
assertFalse(datasource.getText().isEmpty());
}
@@ -75,6 +77,7 @@ public class DatasourceTest {
assertEquals("google", datasource.getBaseName());
assertEquals("com", datasource.getExtension());
assertEquals("https://google.com", datasource.getLocation());
+ assertEquals("text/html; charset=ISO-8859-1", datasource.getContentType());
assertEquals(UTF_8, datasource.getCharset());
assertEquals(-1, datasource.getLength());
assertFalse(datasource.getText().isEmpty());
diff --git a/freemarker-generator-base/src/test/java/org/apache/freemarker/generator/uri/NamedUriParserTest.java b/freemarker-generator-base/src/test/java/org/apache/freemarker/generator/uri/NamedUriParserTest.java
index 37819a3..075491d 100644
--- a/freemarker-generator-base/src/test/java/org/apache/freemarker/generator/uri/NamedUriParserTest.java
+++ b/freemarker-generator-base/src/test/java/org/apache/freemarker/generator/uri/NamedUriParserTest.java
@@ -44,7 +44,7 @@ public class NamedUriParserTest {
}
@Test
- public void shouldParseSimpleFileUri() {
+ public void shouldParseFileUri() {
final NamedUri namedURI = parse("file:///users.csv");
assertNull(namedURI.getName());
@@ -72,9 +72,51 @@ public class NamedUriParserTest {
assertEquals("text/csv", namedURI.getParameters().get("mimetype"));
}
- @Test(expected = IllegalArgumentException.class)
- public void shouldThrowIllegalArgumentExceptionForEmptyUri() {
- parse("");
+ @Test
+ public void shouldParseUrl() {
+ final NamedUri namedURI = parse("http://google.com");
+
+ assertNull(namedURI.getName());
+ assertEquals("http://google.com", namedURI.getUri().toString());
+ assertEquals(0, namedURI.getParameters().size());
+ }
+
+ @Test
+ public void shouldParseUrlWithFragment() {
+ final NamedUri namedURI = parse("http://google.com#charset=UTF-16");
+
+ assertNull(namedURI.getName());
+ assertEquals("http://google.com#charset=UTF-16", namedURI.getUri().toString());
+ assertEquals(1, namedURI.getParameters().size());
+ assertEquals("UTF-16", namedURI.getParameters().get("charset"));
+ }
+
+ @Test
+ public void shouldParseNamedUrl() {
+ final NamedUri namedURI = parse("google=http://google.com");
+
+ assertEquals("google", namedURI.getName());
+ assertEquals("http://google.com", namedURI.getUri().toString());
+ assertEquals(0, namedURI.getParameters().size());
+ }
+
+ @Test
+ public void shouldParseNamedUrlWithQuery() {
+ final NamedUri namedURI = parse("google=http://google.com?foo=bar");
+
+ assertEquals("google", namedURI.getName());
+ assertEquals("http://google.com?foo=bar", namedURI.getUri().toString());
+ assertEquals(0, namedURI.getParameters().size());
+ }
+
+ @Test
+ public void shouldParseNamedUrlWithQueryAndFragment() {
+ final NamedUri namedURI = parse("google=http://google.com?foo=bar#charset=UTF-16");
+
+ assertEquals("google", namedURI.getName());
+ assertEquals("http://google.com?foo=bar#charset=UTF-16", namedURI.getUri().toString());
+ assertEquals(1, namedURI.getParameters().size());
+ assertEquals("UTF-16", namedURI.getParameters().get("charset"));
}
private static NamedUri parse(String value) {
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 f2a8e8a..15e918a 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
@@ -36,7 +36,7 @@ public class ManualTest {
// 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 = "-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";
+ private static final String CMD = "-b ./src/test -l de_AT -DFOO=foo -DBAR=bar -t templates/info.ftl google=https://google.com?foo=bar#charset=UTF-16";
public static void main(String[] args) {
Main.execute(toArgs(CMD));