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 <[email protected]> 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));
