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 <[email protected]> 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>
