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>