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