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));