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 2021/02/08 22:32:32 UTC

[freemarker-generator] 02/03: FREEMARKER-173 [freemarker-generator] Allow to pass arbitrary key/value pairs to DataSource when using NamedURIs

This is an automated email from the ASF dual-hosted git repository.

sgoeschl pushed a commit to branch FREEMARKER-173
in repository https://gitbox.apache.org/repos/asf/freemarker-generator.git

commit aef2993055c8c15c441dae2920a11c758bc3bbb0
Author: Siegfried Goeschl <si...@gmail.com>
AuthorDate: Mon Feb 8 23:13:12 2021 +0100

    FREEMARKER-173 [freemarker-generator] Allow to pass arbitrary key/value pairs to DataSource when using NamedURIs
---
 .../generator/base/datasource/DataSource.java      | 29 +++++++++++++++++++---
 .../generator/datasource/DataSourceTest.java       | 23 +++++++++--------
 2 files changed, 38 insertions(+), 14 deletions(-)

diff --git a/freemarker-generator-base/src/main/java/org/apache/freemarker/generator/base/datasource/DataSource.java b/freemarker-generator-base/src/main/java/org/apache/freemarker/generator/base/datasource/DataSource.java
index 0bb4b57..5d5d42d 100644
--- a/freemarker-generator-base/src/main/java/org/apache/freemarker/generator/base/datasource/DataSource.java
+++ b/freemarker-generator-base/src/main/java/org/apache/freemarker/generator/base/datasource/DataSource.java
@@ -35,6 +35,7 @@ import java.io.StringWriter;
 import java.net.URI;
 import java.nio.charset.Charset;
 import java.util.Arrays;
+import java.util.HashMap;
 import java.util.List;
 import java.util.Map;
 import java.util.stream.Collectors;
@@ -90,28 +91,44 @@ public class DataSource implements Closeable, javax.activation.DataSource {
     /** The underlying "javax.activation.DataSource" */
     private final javax.activation.DataSource dataSource;
 
-    /** Content type of data source either provided by the user or fetched directly from the data source */
+    /** Content type of data source either provided by the caller or fetched directly from the data source */
     private final String contentType;
 
     /** Charset for directly accessing text-based content */
     private final Charset charset;
 
+    /** Additional properties as name/value pairs */
+    private final Map<String, String> properties;
+
     /** Collect all closeables handed out to the caller to be closed when the data source is closed itself */
     private final CloseableReaper closeables;
 
+    /**
+     * Constructor.
+     *
+     * @param name        Human-readable name of the data source
+     * @param group       Optional group of data source
+     * @param uri         source URI of the data source
+     * @param dataSource  JAF data source being wrapped
+     * @param contentType content type of data source either provided by the caller or fetched directly from the data source
+     * @param charset     option charset for directly accessing text-based content
+     * @param properties  optional name/value pairs
+     */
     public DataSource(
             String name,
             String group,
             URI uri,
             javax.activation.DataSource dataSource,
             String contentType,
-            Charset charset) {
-        this.name = requireNonNull(name);
+            Charset charset,
+            Map<String, String> properties) {
+        this.name = requireNonNull(name).trim();
         this.group = StringUtils.emptyToNull(group);
         this.uri = requireNonNull(uri);
         this.dataSource = requireNonNull(dataSource);
         this.contentType = contentType;
         this.charset = charset;
+        this.properties = properties != null ? new HashMap<>(properties) : new HashMap<>();
         this.closeables = new CloseableReaper();
     }
 
@@ -206,6 +223,10 @@ public class DataSource implements Closeable, javax.activation.DataSource {
         return uri;
     }
 
+    public Map<String, String> getProperties() {
+        return properties;
+    }
+
     /**
      * Try to get the length lazily, efficient and without consuming the input stream.
      *
@@ -339,7 +360,7 @@ public class DataSource implements Closeable, javax.activation.DataSource {
             case METADATA_MIME_TYPE:
                 return getMimeType();
             default:
-                throw new IllegalArgumentException("Unknown key: " + key);
+                throw new IllegalArgumentException("Unknown metatdata key: " + key);
         }
     }
 
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 8961359..e1a8f80 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
@@ -28,6 +28,7 @@ import java.io.File;
 import java.io.IOException;
 import java.nio.charset.Charset;
 import java.util.Iterator;
+import java.util.Map;
 
 import static java.nio.charset.StandardCharsets.UTF_8;
 import static org.apache.freemarker.generator.base.FreeMarkerConstants.DEFAULT_GROUP;
@@ -84,7 +85,7 @@ public class DataSourceTest {
     @Test
     @Ignore("Requires internet access")
     public void shouldSupportUrlDataSource() {
-        try (DataSource dataSource = DataSourceFactory.fromUrl("www.google.com", DEFAULT_GROUP, toUrl("https://www.google.com/?foo=bar"), null, null)) {
+        try (DataSource dataSource = DataSourceFactory.fromUrl("www.google.com", DEFAULT_GROUP, toUrl("https://www.google.com/?foo=bar"), null, null, null)) {
             assertEquals("www.google.com", dataSource.getName());
             assertEquals(DEFAULT_GROUP, dataSource.getGroup());
             assertEquals("", dataSource.getBaseName());
@@ -125,15 +126,17 @@ public class DataSourceTest {
     @Test
     public void shouldGetMetadata() {
         try (DataSource dataSource = stringDataSource()) {
-            assertEquals(8, dataSource.getMetadata().size());
-            assertEquals("", dataSource.getMetadata().get("basename"));
-            assertEquals("", dataSource.getMetadata().get("extension"));
-            assertEquals("", dataSource.getMetadata().get("filename"));
-            assertEquals("/", dataSource.getMetadata().get("filepath"));
-            assertEquals("default", dataSource.getMetadata().get("group"));
-            assertEquals("stdin", dataSource.getMetadata().get("name"));
-            assertTrue(dataSource.getMetadata().get("uri").startsWith("string://"));
-            assertEquals("text/plain", dataSource.getMetadata().get("mimetype"));
+            final Map<String, String> metadata = dataSource.getMetadata();
+
+            assertEquals(8, metadata.size());
+            assertEquals("", metadata.get("basename"));
+            assertEquals("", metadata.get("extension"));
+            assertEquals("", metadata.get("filename"));
+            assertEquals("/", metadata.get("filepath"));
+            assertEquals("default", metadata.get("group"));
+            assertEquals("stdin", metadata.get("name"));
+            assertTrue(metadata.get("uri").startsWith("string://"));
+            assertEquals("text/plain", metadata.get("mimetype"));
         }
     }