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/06 12:43:20 UTC

[freemarker-generator] 01/02: FREEMARKER-172 [freemarker-generator] Use lower-case keys for DataSource metadata map

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

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

commit d2506e79fe70c216558fabcf59d72274d0446731
Author: Siegfried Goeschl <si...@gmail.com>
AuthorDate: Sat Feb 6 13:38:48 2021 +0100

    FREEMARKER-172 [freemarker-generator] Use lower-case keys for DataSource metadata map
---
 .../generator/base/datasource/DataSource.java      | 32 +++++++++--
 .../generator/datasource/DataSourceTest.java       | 27 +++++++---
 .../generator/datasource/DataSourcesTest.java      |  3 +-
 .../src/app/examples/templates/demo.ftl            |  2 +-
 .../src/site/markdown/cli/concepts/data-sources.md | 62 ++++++++++++++++++++--
 .../freemarker/generator/cli/ManualTest.java       |  2 +-
 .../src/test/templates/manual.ftl                  | 47 +++++++---------
 7 files changed, 131 insertions(+), 44 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 c030a19..0bb4b57 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
@@ -34,7 +34,10 @@ import java.io.OutputStream;
 import java.io.StringWriter;
 import java.net.URI;
 import java.nio.charset.Charset;
+import java.util.Arrays;
 import java.util.List;
+import java.util.Map;
+import java.util.stream.Collectors;
 
 import static java.nio.charset.StandardCharsets.UTF_8;
 import static java.util.Objects.requireNonNull;
@@ -55,14 +58,25 @@ import static org.apache.freemarker.generator.base.mime.Mimetypes.MIME_APPLICATI
  */
 public class DataSource implements Closeable, javax.activation.DataSource {
 
-    public static final String METADATA_BASE_NAME = "baseName";
+    public static final String METADATA_BASE_NAME = "basename";
     public static final String METADATA_EXTENSION = "extension";
-    public static final String METADATA_FILE_NAME = "fileName";
-    public static final String METADATA_FILE_PATH = "filePath";
+    public static final String METADATA_FILE_NAME = "filename";
+    public static final String METADATA_FILE_PATH = "filepath";
     public static final String METADATA_GROUP = "group";
     public static final String METADATA_NAME = "name";
     public static final String METADATA_URI = "uri";
-    public static final String METADATA_MIME_TYPE = "mimeType";
+    public static final String METADATA_MIME_TYPE = "mimetype";
+
+    public static final List<String> METADATA_KEYS = Arrays.asList(
+            METADATA_BASE_NAME,
+            METADATA_EXTENSION,
+            METADATA_FILE_NAME,
+            METADATA_FILE_PATH,
+            METADATA_GROUP,
+            METADATA_NAME,
+            METADATA_URI,
+            METADATA_MIME_TYPE
+    );
 
     /** Human-readable name of the data source */
     private final String name;
@@ -330,6 +344,16 @@ public class DataSource implements Closeable, javax.activation.DataSource {
     }
 
     /**
+     * Get all metadata parts as map.
+     *
+     * @return Map of metadata parts
+     */
+    public Map<String, String> getMetadata() {
+        return METADATA_KEYS.stream()
+                .collect(Collectors.toMap(key -> key, this::getMetadata));
+    }
+
+    /**
      * Matches a metadata key with a wildcard expression.
      *
      * @param key      metadata key, e.g. "name", "fileName", "baseName", "extension", "uri", "group"
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 e27beb3..8961359 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
@@ -77,7 +77,7 @@ public class DataSourceTest {
             assertTrue(dataSource.match("name", "*" + ANY_FILE_NAME));
             assertTrue(dataSource.match("uri", "file:/*/pom.xml"));
             assertTrue(dataSource.match("extension", "xml"));
-            assertTrue(dataSource.match("baseName", "pom"));
+            assertTrue(dataSource.match("basename", "pom"));
         }
     }
 
@@ -100,7 +100,7 @@ public class DataSourceTest {
 
     @Test
     public void shouldSupportLineIterator() throws IOException {
-        try (DataSource dataSource = textDataSource()) {
+        try (DataSource dataSource = stringDataSource()) {
             try (LineIterator iterator = dataSource.getLineIterator()) {
                 assertEquals(1, count(iterator));
             }
@@ -109,7 +109,7 @@ public class DataSourceTest {
 
     @Test
     public void shouldReadLines() {
-        try (DataSource dataSource = textDataSource()) {
+        try (DataSource dataSource = stringDataSource()) {
             assertEquals(1, dataSource.getLines().size());
             assertEquals(ANY_TEXT, dataSource.getLines().get(0));
         }
@@ -117,14 +117,29 @@ public class DataSourceTest {
 
     @Test
     public void shouldGetBytes() {
-        try (DataSource dataSource = textDataSource()) {
+        try (DataSource dataSource = stringDataSource()) {
             assertEquals(11, dataSource.getBytes().length);
         }
     }
 
     @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"));
+        }
+    }
+
+    @Test
     public void shouldCloseDataSource() {
-        final DataSource dataSource = textDataSource();
+        final DataSource dataSource = stringDataSource();
         final TestClosable closable1 = dataSource.addClosable(new TestClosable());
         final TestClosable closable2 = dataSource.addClosable(new TestClosable());
 
@@ -143,7 +158,7 @@ public class DataSourceTest {
         return count;
     }
 
-    private static DataSource textDataSource() {
+    private static DataSource stringDataSource() {
         return DataSourceFactory.fromString("stdin", "default", ANY_TEXT, "text/plain");
     }
 
diff --git a/freemarker-generator-base/src/test/java/org/apache/freemarker/generator/datasource/DataSourcesTest.java b/freemarker-generator-base/src/test/java/org/apache/freemarker/generator/datasource/DataSourcesTest.java
index 60ba5e9..3591e38 100644
--- a/freemarker-generator-base/src/test/java/org/apache/freemarker/generator/datasource/DataSourcesTest.java
+++ b/freemarker-generator-base/src/test/java/org/apache/freemarker/generator/datasource/DataSourcesTest.java
@@ -32,6 +32,7 @@ import static org.apache.freemarker.generator.base.FreeMarkerConstants.DEFAULT_G
 import static org.junit.Assert.assertEquals;
 import static org.junit.Assert.assertFalse;
 import static org.junit.Assert.assertNotNull;
+import static org.junit.Assert.assertTrue;
 
 public class DataSourcesTest {
 
@@ -99,7 +100,7 @@ public class DataSourcesTest {
 
     @Test
     public void shouldGetMetadataParts() {
-        assertEquals(asList("", "pom.xml", ""), dataSources().getMetadata("fileName"));
+        assertEquals(asList("", "pom.xml", ""), dataSources().getMetadata("filename"));
         assertEquals(asList("", "xml", ""), dataSources().getMetadata("extension"));
         assertEquals(asList("unknown", "pom.xml", "server.invalid?foo=bar"), dataSources().getMetadata("name"));
     }
diff --git a/freemarker-generator-cli/src/app/examples/templates/demo.ftl b/freemarker-generator-cli/src/app/examples/templates/demo.ftl
index 879fb3f..1154838 100644
--- a/freemarker-generator-cli/src/app/examples/templates/demo.ftl
+++ b/freemarker-generator-cli/src/app/examples/templates/demo.ftl
@@ -104,7 +104,7 @@ List all data sources having "json" extension
 - ${ds.name}
 </#list>
 List all data sources having "src/test/data/properties" in their file path
-<#list dataSources?values?filter(ds -> ds.match("filePath", "*/src/test/data/properties")) as ds>
+<#list dataSources?values?filter(ds -> ds.match("filepath", "*/src/test/data/properties")) as ds>
 - ${ds.name}
 </#list>
 
diff --git a/freemarker-generator-cli/src/site/markdown/cli/concepts/data-sources.md b/freemarker-generator-cli/src/site/markdown/cli/concepts/data-sources.md
index e77476e..b4205e3 100644
--- a/freemarker-generator-cli/src/site/markdown/cli/concepts/data-sources.md
+++ b/freemarker-generator-cli/src/site/markdown/cli/concepts/data-sources.md
@@ -98,7 +98,7 @@ URI : system:///stdin
 
 After loading one or more `DataSource` they are accessible as `dataSource` map in the FreeMarker model
 
-* `dataSources?values[0]` selects the first data source
+* `dataSources?values[0]` or `dataSources?values?first` selects the first data source
 * `dataSources["user.csv"]` selects the data source with the name "user.csv"
 
 ### Iterating Over DataSources
@@ -108,7 +108,7 @@ The data sources are exposed as map within FreeMarker's data model
 ```
 <#-- Do something with the data sources -->
 <#if dataSources?has_content>
-${dataSources?values[0].name}
+Some data sources found
 <#else>
 No data sources found ...
 </#if>
@@ -117,8 +117,8 @@ No data sources found ...
 ${dataSources?size}
 
 <#-- Iterate over a map of data sources -->
-<#list dataSources as name, ds>
-- ${name} => ${ds.length}
+<#list dataSources as name, dataSource>
+- ${name} => ${dataSource.length}
 </#list>
 
 <#-- Iterate over a list of data sources -->
@@ -154,3 +154,57 @@ selection of data sources (using Apache Commons IO wild-card matching)
 </#list>
 
 ```
+
+### Using a DataSource
+
+In most cases the data source will passed to a tool but the are some useful operations available as shown below
+
+```text
+Invoke Arbitrary Methods On DataSource
+---------------------------------------------------------------------------
+<#if dataSources?has_content>
+<#assign dataSource=dataSources?values?first>
+Name            : ${dataSource.name}
+Nr of lines     : ${dataSource.lines?size}
+Content Type    : ${dataSource.contentType}
+Charset         : ${dataSource.charset}
+Extension       : ${dataSource.extension}
+Nr of chars     : ${dataSource.text?length}
+Nr of bytes     : ${dataSource.bytes?size}
+File name       : ${dataSource.metadata["filename"]}
+
+Iterating Over Metadata Of A Datasource
+---------------------------------------------------------------------------
+<#list dataSource.metadata as name, value>
+${name?right_pad(15)} : ${value}
+</#list>
+</#if>
+```
+
+will result in
+
+```text
+Invoke Arbitrary Methods On DataSource
+---------------------------------------------------------------------------
+Name            : file:/Users/sgoeschl/work/github/apache/freemarker-generator/freemarker-generator-cli/src/app/examples/data/csv/contract.csv
+Nr of lines     : 23
+Content Type    : text/csv
+Charset         : UTF-8
+Extension       : csv
+Nr of chars     : 6,328
+Nr of bytes     : 6,328
+File name       : contract.csv
+
+Iterating Over Metadata Of A Datasource
+---------------------------------------------------------------------------
+extension       : csv
+filename        : contract.csv
+basename        : contract
+filepath        : /Users/sgoeschl/work/github/apache/freemarker-generator/freemarker-generator-cli/src/app/examples/data/csv
+name            : file:/Users/sgoeschl/work/github/apache/freemarker-generator/freemarker-generator-cli/src/app/examples/data/csv/contract.csv
+mimetype        : text/csv
+uri             : file:/Users/sgoeschl/work/github/apache/freemarker-generator/freemarker-generator-cli/src/app/examples/data/csv/contract.csv
+group           : default
+```
+
+
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 95ab41c..54be597 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
@@ -24,7 +24,7 @@ import java.io.IOException;
 public class ManualTest extends AbstractMainTest {
 
     // private static final String CMD = "-V";
-    private static final String CMD = "-t src/app/templates/freemarker-generator/info.ftl -s :csv=src/app/examples/data/csv -s :json=src/app/examples/data/json";
+    private static final String CMD = "-t src/test/templates/manual.ftl -s src/app/examples/data/csv";
 
     @Override
     public String execute(String commandLine) throws IOException {
diff --git a/freemarker-generator-cli/src/test/templates/manual.ftl b/freemarker-generator-cli/src/test/templates/manual.ftl
index 128274e..3ad42c6 100644
--- a/freemarker-generator-cli/src/test/templates/manual.ftl
+++ b/freemarker-generator-cli/src/test/templates/manual.ftl
@@ -22,44 +22,37 @@ Nr. of Documents: ${dataSources?size}
 
 Use FTL Array-style Access
 ---------------------------------------------------------------------------
-${dataSources[0].toString()}
-
-Use FTL Map-style access
----------------------------------------------------------------------------
-${DataSources["github-users.json"].toString()}
-${DataSources["github-users.json"].name}
+${dataSources?values[0].toString()}
+${dataSources?values?first.toString()}
 
 Get Document Names As Keys
 ---------------------------------------------------------------------------
-<#list DataSources?keys as name>
+<#list dataSources?keys as name>
     ${name}<#lt>
 </#list>
 
 Iterate Over Names & DataSources
 ---------------------------------------------------------------------------
-<#list DataSources as name, dataSource>
-    ${name} => ${dataSource}<#lt>
+<#list dataSources as name, dataSource>
+    ${name} => ${dataSource.uri}<#lt>
 </#list>
 
-Find DataSources By Group
+Invoke Arbitrary Methods On DataSource
 ---------------------------------------------------------------------------
-<#list dataSources.findByGroup("default") as dataSource>
-    ${dataSource}<#lt>
-</#list>
+<#if dataSources?has_content>
+<#assign dataSource=dataSources?values?first>
+Name            : ${dataSource.name}
+Nr of lines     : ${dataSource.lines?size}
+Content Type    : ${dataSource.contentType}
+Charset         : ${dataSource.charset}
+Extension       : ${dataSource.extension}
+Nr of chars     : ${dataSource.text?length}
+Nr of bytes     : ${dataSource.bytes?size}
+File name       : ${dataSource.metadata["filename"]}
 
-Find DataSources By Wildcard
+Iterating Over Metadata Of A Datasource
 ---------------------------------------------------------------------------
-<#list dataSources.find("*.csv") as dataSource>
-    ${dataSource}<#lt>
+<#list dataSource.metadata as name, value>
+${name?right_pad(15)} : ${value}
 </#list>
-
-Java Array-style access
----------------------------------------------------------------------------
-${dataSources?values[0].toString()}
-
-Invoke Arbitrary Methods On DataSources
----------------------------------------------------------------------------
-empty       : ${dataSources.empty?c}
-isEmpty()   : ${dataSources.isEmpty()?c}
-size()      : ${dataSources.size()}
-close()     : ${dataSources.close()}worx
+</#if>