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

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


The following commit(s) were added to refs/heads/FREEMARKER-188 by this push:
     new 7e178a7  FREEMARKER-188 Add "relativeFilePath" to DataSource
7e178a7 is described below

commit 7e178a72c6cb104385364196038dd6d0ce17a5c0
Author: Siegfried Goeschl <[email protected]>
AuthorDate: Tue Sep 7 00:07:38 2021 +0200

    FREEMARKER-188 Add "relativeFilePath" to DataSource
---
 .../generator/base/datasource/DataSource.java      | 109 ++++++++++++++++++---
 .../base/datasource/DataSourceFactory.java         |  18 +++-
 .../base/datasource/DataSourcesSupplier.java       |  34 ++++++-
 .../freemarker/generator/base/util/FileUtils.java  |  31 ++++++
 .../generator/datasource/DataSourceTest.java       |  18 ++--
 .../generator/datasource/DataSourcesTest.java      |   2 +-
 .../freemarker/generator/util/FileUtilsTest.java   |  46 +++++++++
 .../src/app/examples/templates/datasources.ftl     |  23 ++---
 .../src/app/examples/templates/demo.ftl            |   2 +-
 .../templates/freemarker-generator/datasources.ftl |  40 ++++++++
 .../app/templates/freemarker-generator/info.ftl    |   1 -
 .../src/site/markdown/cli/concepts/data-sources.md |  30 +++---
 .../src/site/markdown/cli/concepts/named-uris.md   |   8 +-
 .../freemarker/generator/cli/ExamplesTest.java     |   1 +
 14 files changed, 309 insertions(+), 54 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 66557d1..6383258 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
@@ -59,20 +59,22 @@ 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_RELATIVE_FILE_PATH = 
"relativeFilePath";
     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_RELATIVE_FILE_PATH,
             METADATA_GROUP,
             METADATA_NAME,
             METADATA_URI,
@@ -91,6 +93,9 @@ public class DataSource implements Closeable, 
javax.activation.DataSource {
     /** The underlying "javax.activation.DataSource" */
     private final javax.activation.DataSource dataSource;
 
+    /** The relative path for a file-based data source */
+    private final String relativeFilePath;
+
     /** Content type of data source either provided by the caller or fetched 
directly from the data source */
     private final String contentType;
 
@@ -106,19 +111,21 @@ public class DataSource implements Closeable, 
javax.activation.DataSource {
     /**
      * 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
+     * @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 relativeFilePath relative path regarding a source directory
+     * @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 relativeFilePath,
             String contentType,
             Charset charset,
             Map<String, String> properties) {
@@ -126,12 +133,17 @@ public class DataSource implements Closeable, 
javax.activation.DataSource {
         this.group = StringUtils.emptyToNull(group);
         this.uri = requireNonNull(uri);
         this.dataSource = requireNonNull(dataSource);
+        this.relativeFilePath = relativeFilePath != null ? relativeFilePath : 
".";
         this.contentType = contentType;
         this.charset = charset;
         this.properties = properties != null ? new HashMap<>(properties) : new 
HashMap<>();
         this.closeables = new CloseableReaper();
     }
 
+    public static DataSourceBuilder builder() {
+        return DataSourceBuilder.builder();
+    }
+
     @Override
     public String getName() {
         return name;
@@ -202,6 +214,16 @@ public class DataSource implements Closeable, 
javax.activation.DataSource {
     }
 
     /**
+     * Get the relative path for a file-based data source starting from
+     * the data source directory.
+     *
+     * @return relative path
+     */
+    public String getRelativeFilePath() {
+        return relativeFilePath;
+    }
+
+    /**
      * Get the charset. If no charset can be detected UTF-8 is assumed.
      *
      * @return charset
@@ -347,6 +369,8 @@ public class DataSource implements Closeable, 
javax.activation.DataSource {
                 return getFileName();
             case METADATA_FILE_PATH:
                 return FilenameUtils.getFullPathNoEndSeparator(uri.getPath());
+            case METADATA_RELATIVE_FILE_PATH:
+                return getRelativeFilePath();
             case METADATA_GROUP:
                 return getGroup();
             case METADATA_NAME:
@@ -432,4 +456,67 @@ public class DataSource implements Closeable, 
javax.activation.DataSource {
     private boolean isByteArrayDataSource() {
         return dataSource instanceof ByteArrayDataSource;
     }
+
+
+    public static final class DataSourceBuilder {
+        private String name;
+        private String group;
+        private URI uri;
+        private javax.activation.DataSource dataSource;
+        private String relativeFilePath;
+        private String contentType;
+        private Charset charset;
+        private Map<String, String> properties;
+
+        private DataSourceBuilder() {
+        }
+
+        static DataSourceBuilder builder() {
+            return new DataSourceBuilder();
+        }
+
+        public DataSourceBuilder name(String name) {
+            this.name = name;
+            return this;
+        }
+
+        public DataSourceBuilder group(String group) {
+            this.group = group;
+            return this;
+        }
+
+        public DataSourceBuilder uri(URI uri) {
+            this.uri = uri;
+            return this;
+        }
+
+        public DataSourceBuilder dataSource(javax.activation.DataSource 
dataSource) {
+            this.dataSource = dataSource;
+            return this;
+        }
+
+        public DataSourceBuilder relativeFilePath(String relativeFilePath) {
+            this.relativeFilePath = relativeFilePath;
+            return this;
+        }
+
+        public DataSourceBuilder contentType(String contentType) {
+            this.contentType = contentType;
+            return this;
+        }
+
+        public DataSourceBuilder charset(Charset charset) {
+            this.charset = charset;
+            return this;
+        }
+
+        public DataSourceBuilder properties(Map<String, String> properties) {
+            this.properties = properties;
+            return this;
+        }
+
+        public DataSource build() {
+            return new DataSource(name, group, uri, dataSource, 
relativeFilePath, contentType, charset, properties);
+        }
+    }
 }
diff --git 
a/freemarker-generator-base/src/main/java/org/apache/freemarker/generator/base/datasource/DataSourceFactory.java
 
b/freemarker-generator-base/src/main/java/org/apache/freemarker/generator/base/datasource/DataSourceFactory.java
index 6930e91..ad9439c 100644
--- 
a/freemarker-generator-base/src/main/java/org/apache/freemarker/generator/base/datasource/DataSourceFactory.java
+++ 
b/freemarker-generator-base/src/main/java/org/apache/freemarker/generator/base/datasource/DataSourceFactory.java
@@ -60,7 +60,13 @@ public abstract class DataSourceFactory {
             URI uri,
             javax.activation.DataSource dataSource,
             Map<String, String> properties) {
-        return new DataSource(name, group, uri, dataSource, null, null, 
properties);
+        return DataSource.builder()
+                .name(name)
+                .group(group)
+                .uri(uri)
+                .dataSource(dataSource)
+                .properties(properties)
+                .build();
     }
 
     public static DataSource create(
@@ -71,7 +77,15 @@ public abstract class DataSourceFactory {
             String contentType,
             Charset charset,
             Map<String, String> properties) {
-        return new DataSource(name, group, uri, dataSource, contentType, 
charset, properties);
+        return DataSource.builder()
+                .name(name)
+                .group(group)
+                .uri(uri)
+                .dataSource(dataSource)
+                .contentType(contentType)
+                .charset(charset)
+                .properties(properties)
+                .build();
     }
 
     // == URL ===============================================================
diff --git 
a/freemarker-generator-base/src/main/java/org/apache/freemarker/generator/base/datasource/DataSourcesSupplier.java
 
b/freemarker-generator-base/src/main/java/org/apache/freemarker/generator/base/datasource/DataSourcesSupplier.java
index cc919fc..809d861 100644
--- 
a/freemarker-generator-base/src/main/java/org/apache/freemarker/generator/base/datasource/DataSourcesSupplier.java
+++ 
b/freemarker-generator-base/src/main/java/org/apache/freemarker/generator/base/datasource/DataSourcesSupplier.java
@@ -17,11 +17,14 @@
 package org.apache.freemarker.generator.base.datasource;
 
 import org.apache.freemarker.generator.base.file.RecursiveFileSupplier;
+import org.apache.freemarker.generator.base.mime.MimetypesFileTypeMapFactory;
 import org.apache.freemarker.generator.base.uri.NamedUri;
 import org.apache.freemarker.generator.base.uri.NamedUriStringParser;
+import org.apache.freemarker.generator.base.util.FileUtils;
 import org.apache.freemarker.generator.base.util.UriUtils;
 import org.apache.freemarker.generator.base.util.Validate;
 
+import javax.activation.FileDataSource;
 import java.io.File;
 import java.nio.charset.Charset;
 import java.util.ArrayList;
@@ -34,7 +37,6 @@ import static java.util.Collections.singletonList;
 import static java.util.Objects.requireNonNull;
 import static java.util.stream.Collectors.toList;
 import static 
org.apache.freemarker.generator.base.FreeMarkerConstants.DEFAULT_GROUP;
-import static 
org.apache.freemarker.generator.base.datasource.DataSourceFactory.fromFile;
 
 /**
  * Create a list of <code>DataSource</code> based on a list URIs, directories 
and files.
@@ -116,10 +118,38 @@ public class DataSourcesSupplier implements 
Supplier<List<DataSource>> {
         final Charset currCharset = getCharsetOrDefault(namedUri, charset);
         final Map<String, String> parameters = namedUri.getParameters();
         return fileSupplier(path, include, exclude).get().stream()
-                .map(file -> fromFile(getDataSourceName(namedUri, file), 
group, file, currCharset, parameters))
+                .map(file -> fromFile(namedUri, getDataSourceName(namedUri, 
file), group, file, currCharset, parameters))
                 .collect(toList());
     }
 
+    private static DataSource fromFile(
+            NamedUri sourceUri,
+            String name,
+            String group,
+            File file,
+            Charset charset,
+            Map<String, String> properties) {
+        Validate.isTrue(file.exists(), "File not found: " + file);
+
+        final FileDataSource dataSource = new FileDataSource(file);
+        // content type is determined from file extension
+        dataSource.setFileTypeMap(MimetypesFileTypeMapFactory.create());
+        final String relativePath = 
FileUtils.getRelativePath(sourceUri.getFile(), file);
+        final String contentType = dataSource.getContentType();
+
+        return DataSource.builder()
+                .name(name)
+                .group(group)
+                .uri(file.toURI())
+                .dataSource(dataSource)
+                .relativeFilePath(relativePath)
+                .contentType(contentType)
+                .charset(charset)
+                .properties(properties)
+                .build();
+    }
+
+
     private static RecursiveFileSupplier fileSupplier(String source, String 
include, String exclude) {
         return new RecursiveFileSupplier(singletonList(source), 
singletonList(include), singletonList(exclude));
     }
diff --git 
a/freemarker-generator-base/src/main/java/org/apache/freemarker/generator/base/util/FileUtils.java
 
b/freemarker-generator-base/src/main/java/org/apache/freemarker/generator/base/util/FileUtils.java
new file mode 100644
index 0000000..e83ee02
--- /dev/null
+++ 
b/freemarker-generator-base/src/main/java/org/apache/freemarker/generator/base/util/FileUtils.java
@@ -0,0 +1,31 @@
+package org.apache.freemarker.generator.base.util;
+
+import java.io.File;
+import java.nio.file.Path;
+import java.nio.file.Paths;
+
+public class FileUtils {
+
+    /**
+     * Determines the relative path between a directory and a file within the 
directory (excluding the file name)
+     *
+     * @param directory the directory
+     * @param file      the file
+     * @return relative path
+     */
+    public static String getRelativePath(File directory, File file) {
+        Validate.notNull(directory, "directory is null");
+        Validate.notNull(file, "file is null");
+        Validate.isTrue(directory.exists(), "directory does not exist");
+
+        final Path filePath = Paths.get(file.toURI()).normalize();
+        final Path directoryPath = Paths.get(directory.toURI()).normalize();
+        final String relativePath = 
directoryPath.relativize(filePath).normalize().toString();
+
+        if (relativePath.lastIndexOf('/') > 0) {
+            return relativePath.substring(0, relativePath.lastIndexOf("/"));
+        } else {
+            return ".";
+        }
+    }
+}
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 e1a8f80..38617ba 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
@@ -36,6 +36,7 @@ import static 
org.apache.freemarker.generator.base.datasource.DataSourceFactory.
 import static 
org.apache.freemarker.generator.base.mime.Mimetypes.MIME_TEXT_HTML;
 import static org.junit.Assert.assertEquals;
 import static org.junit.Assert.assertFalse;
+import static org.junit.Assert.assertNull;
 import static org.junit.Assert.assertTrue;
 
 public class DataSourceTest {
@@ -54,6 +55,7 @@ public class DataSourceTest {
             assertEquals("", dataSource.getBaseName());
             assertEquals("", dataSource.getExtension());
             
assertTrue(dataSource.getUri().toString().startsWith("string:///"));
+            assertEquals(".", dataSource.getRelativeFilePath());
             assertEquals(UTF_8, dataSource.getCharset());
             assertEquals("text/plain", dataSource.getContentType());
             assertTrue(dataSource.getLength() > 0);
@@ -72,13 +74,14 @@ public class DataSourceTest {
             assertEquals("xml", dataSource.getExtension());
             assertEquals(ANY_FILE.toURI().toString(), 
dataSource.getUri().toString());
             assertEquals(ANY_CHAR_SET.name(), dataSource.getCharset().name());
+            assertEquals(".", dataSource.getRelativeFilePath());
             assertEquals("application/xml", dataSource.getContentType());
             assertTrue(dataSource.getLength() > 0);
             assertFalse(dataSource.getText().isEmpty());
             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"));
         }
     }
 
@@ -91,6 +94,7 @@ public class DataSourceTest {
             assertEquals("", dataSource.getBaseName());
             assertEquals("", dataSource.getExtension());
             assertEquals("https://www.google.com/?foo=bar";, 
dataSource.getUri().toString());
+            assertNull(dataSource.getRelativeFilePath());
             assertEquals("text/html; charset=ISO-8859-1", 
dataSource.getContentType());
             assertEquals(MIME_TEXT_HTML, dataSource.getMimeType());
             assertEquals("ISO-8859-1", dataSource.getCharset().name());
@@ -128,15 +132,17 @@ public class DataSourceTest {
         try (DataSource dataSource = stringDataSource()) {
             final Map<String, String> metadata = dataSource.getMetadata();
 
-            assertEquals(8, metadata.size());
-            assertEquals("", metadata.get("basename"));
+            assertEquals(9, metadata.size());
+            assertEquals("", metadata.get("baseName"));
             assertEquals("", metadata.get("extension"));
-            assertEquals("", metadata.get("filename"));
-            assertEquals("/", metadata.get("filepath"));
+            assertEquals("", metadata.get("fileName"));
+            assertEquals("/", metadata.get("filePath"));
+            assertEquals(".", metadata.get("relativeFilePath"));
+
             assertEquals("default", metadata.get("group"));
             assertEquals("stdin", metadata.get("name"));
             assertTrue(metadata.get("uri").startsWith("string://"));
-            assertEquals("text/plain", metadata.get("mimetype"));
+            assertEquals("text/plain", metadata.get("mimeType"));
         }
     }
 
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 85bdedc..5dd4360 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
@@ -100,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("default", "default", "default"), 
dataSources().getMetadata("group"));
         assertEquals(asList("", "xml", ""), 
dataSources().getMetadata("extension"));
         assertEquals(asList("unknown", "pom.xml", "server.invalid?foo=bar"), 
dataSources().getMetadata("name"));
diff --git 
a/freemarker-generator-base/src/test/java/org/apache/freemarker/generator/util/FileUtilsTest.java
 
b/freemarker-generator-base/src/test/java/org/apache/freemarker/generator/util/FileUtilsTest.java
new file mode 100644
index 0000000..584db0b
--- /dev/null
+++ 
b/freemarker-generator-base/src/test/java/org/apache/freemarker/generator/util/FileUtilsTest.java
@@ -0,0 +1,46 @@
+package org.apache.freemarker.generator.util;
+
+import org.apache.freemarker.generator.base.util.FileUtils;
+import org.junit.Test;
+
+import java.io.File;
+
+import static org.junit.Assert.assertEquals;
+
+public class FileUtilsTest {
+
+    @Test
+    public void shouldGetRelativePathForSameDirectory() {
+        assertEquals(".", FileUtils.getRelativePath(new File("."), new 
File("pom.xml")));
+        assertEquals(".", FileUtils.getRelativePath(new File("."), new 
File("./pom.xml")));
+        assertEquals(".", FileUtils.getRelativePath(new File("."), new 
File("./pom.xml")));
+        assertEquals(".", FileUtils.getRelativePath(new 
File("../freemarker-generator-base"), new File("pom.xml")));
+        assertEquals(".", FileUtils.getRelativePath(new 
File("../freemarker-generator-base"), new File("./pom.xml")));
+        assertEquals(".", FileUtils.getRelativePath(new 
File("../freemarker-generator-base"), new 
File("../freemarker-generator-base/pom.xml")));
+    }
+
+    @Test
+    public void shouldGetRelativePathForNestedDirectory() {
+        assertEquals("src/test/data/env", FileUtils.getRelativePath(new 
File("."), new File("src/test/data/env/nginx.env")));
+        assertEquals("src/test/data/env", FileUtils.getRelativePath(new 
File("."), new File("./src/test/data/env/nginx.env")));
+    }
+
+    @Test
+    public void shouldGetRelativePathForDisjunctDirectories() {
+        assertEquals("../test/data/env", FileUtils.getRelativePath(new 
File("./src/site"), new File("src/test/data/env/nginx.env")));
+    }
+
+    @Test
+    public void shouldHandleInvalidArgumentsGracefully() {
+        assertEquals(".", FileUtils.getRelativePath(new File("."), new 
File(".")));
+        assertEquals(".", FileUtils.getRelativePath(new File("pom.xml"), new 
File("pom.xml")));
+        assertEquals(".", FileUtils.getRelativePath(new File("."), new 
File("does-not-exist.xml")));
+        assertEquals("foo", FileUtils.getRelativePath(new File("."), new 
File("foo/does-not-exist.xml")));
+        assertEquals("foo", FileUtils.getRelativePath(new File("."), new 
File("foo/./does-not-exist.xml")));
+    }
+
+    @Test(expected = IllegalArgumentException.class)
+    public void shouldThrowIllegalArgumentExceptionForNonExistingDirectoy() {
+        FileUtils.getRelativePath(new File("does-not-exit"), new 
File("pom.xml"));
+    }
+}
diff --git 
a/freemarker-generator-cli/src/app/examples/templates/datasources.ftl 
b/freemarker-generator-cli/src/app/examples/templates/datasources.ftl
index bfb7675..4c7d11f 100644
--- a/freemarker-generator-cli/src/app/examples/templates/datasources.ftl
+++ b/freemarker-generator-cli/src/app/examples/templates/datasources.ftl
@@ -53,17 +53,18 @@ ${dataSource.name}
 Invoke Arbitrary Methods On DataSource
 ---------------------------------------------------------------------------
 <#assign dataSource=dataSources?values?first>
-Name            : ${dataSource.name}
-Group           : ${dataSource.group}
-Nr of lines     : ${dataSource.lines?size}
-ContentType     : ${dataSource.contentType}
-MimeType        : ${dataSource.mimeType}
-Charset         : ${dataSource.charset}
-Extension       : ${dataSource.extension}
-Nr of chars     : ${dataSource.text?length}
-Nr of bytes     : ${dataSource.bytes?size}
-File name       : ${dataSource.fileName}
-URI schema      : ${dataSource.uri.scheme}
+Name                : ${dataSource.name}
+Group               : ${dataSource.group}
+Nr of lines         : ${dataSource.lines?size}
+ContentType         : ${dataSource.contentType}
+MimeType            : ${dataSource.mimeType}
+Charset             : ${dataSource.charset}
+Extension           : ${dataSource.extension}
+Nr of chars         : ${dataSource.text?length}
+Nr of bytes         : ${dataSource.bytes?size}
+File name           : ${dataSource.fileName}
+URI schema          : ${dataSource.uri.scheme}
+Relative File Path  : ${dataSource.relativeFilePath}
 
 Iterating Over Metadata Of A Datasource
 ---------------------------------------------------------------------------
diff --git a/freemarker-generator-cli/src/app/examples/templates/demo.ftl 
b/freemarker-generator-cli/src/app/examples/templates/demo.ftl
index 1154838..879fb3f 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/app/templates/freemarker-generator/datasources.ftl
 
b/freemarker-generator-cli/src/app/templates/freemarker-generator/datasources.ftl
new file mode 100644
index 0000000..17dc43c
--- /dev/null
+++ 
b/freemarker-generator-cli/src/app/templates/freemarker-generator/datasources.ftl
@@ -0,0 +1,40 @@
+<#ftl output_format="plainText" strip_whitespace=true>
+<#--
+  Licensed to the Apache Software Foundation (ASF) under one
+  or more contributor license agreements.  See the NOTICE file
+  distributed with this work for additional information
+  regarding copyright ownership.  The ASF licenses this file
+  to you under the Apache License, Version 2.0 (the
+  "License"); you may not use this file except in compliance
+  with the License.  You may obtain a copy of the License at
+    http://www.apache.org/licenses/LICENSE-2.0
+  Unless required by applicable law or agreed to in writing,
+  software distributed under the License is distributed on an
+  "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+  KIND, either express or implied.  See the License for the
+  specific language governing permissions and limitations
+  under the License.
+-->
+FreeMarker Generator DataSources
+==============================================================================
+
+<#if dataSources?has_content>
+<#list dataSources?values as ds>
+DataSource #${ds?counter}
+------------------------------------------------------------------------------
+name=${ds.name}
+group=${ds.group}
+contentType=${ds.contentType}
+fileName=${ds.fileName}
+baseName=${ds.baseName}
+extension=${ds.extension}
+relativeFilePath=${ds.relativeFilePath}
+charset=${ds.charset}
+mimeType=${ds.mimeType}
+uri=charset=${ds.uri}
+length=${ds.length} Bytes
+
+</#list>
+<#else>
+No data sources found ...
+</#if>
diff --git 
a/freemarker-generator-cli/src/app/templates/freemarker-generator/info.ftl 
b/freemarker-generator-cli/src/app/templates/freemarker-generator/info.ftl
index 6e60ae2..04121ec 100644
--- a/freemarker-generator-cli/src/app/templates/freemarker-generator/info.ftl
+++ b/freemarker-generator-cli/src/app/templates/freemarker-generator/info.ftl
@@ -48,7 +48,6 @@ FreeMarker Generator DataSources
 <#if dataSources?has_content>
 <#list dataSources?values as ds>
 [#${ds?counter}]: name=${ds.name}, group=${ds.group}, fileName=${ds.fileName}, 
mimeType=${ds.mimeType}, charset=${ds.charset}, length=${ds.length} Bytes
-URI : ${ds.uri}
 </#list>
 <#else>
 No data sources found ...
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 f46f71d..9527180 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
@@ -199,10 +199,10 @@ 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
+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
+mimeType        : text/csv
 uri             : 
file:/Users/sgoeschl/work/github/apache/freemarker-generator/freemarker-generator-cli/src/app/examples/data/csv/contract.csv
 group           : default
 ```
@@ -235,11 +235,11 @@ URI schema      : file
 Iterating Over Metadata Of A Datasource
 ---------------------------------------------------------------------------
 extension       : csv
-basename        : transactions
-filename        : transactions.csv
-filepath        : 
/Users/sgoeschl/work/github/apache/freemarker-generator/freemarker-generator-cli/target/appassembler/examples/data/csv
+baseName        : transactions
+fileName        : transactions.csv
+filePath        : 
/Users/sgoeschl/work/github/apache/freemarker-generator/freemarker-generator-cli/target/appassembler/examples/data/csv
 name            : transactions
-mimetype        : text/csv
+mimeType        : text/csv
 uri             : 
file:/Users/sgoeschl/work/github/apache/freemarker-generator/freemarker-generator-cli/target/appassembler/examples/data/csv/transactions.csv
 group           : csv
 
@@ -266,11 +266,11 @@ URI schema      : https
 Iterating Over Metadata Of A Datasource
 ---------------------------------------------------------------------------
 extension       :
-basename        :
-filename        :
-filepath        : /
+baseName        :
+fileName        :
+filePath        : /
 name            : https://xkcd.com/info.0.json
-mimetype        : application/json
+mimeType        : application/json
 uri             : https://xkcd.com/info.0.json
 group           : default
 
@@ -296,11 +296,11 @@ URI schema      : env
 Iterating Over Metadata Of A Datasource
 ---------------------------------------------------------------------------
 extension       :
-basename        :
-filename        :
-filepath        : /
+baseName        :
+fileName        :
+filePath        : /
 name            : envvars
-mimetype        : text/plain
+mimeType        : text/plain
 uri             : env:///
 group           : default
 
diff --git 
a/freemarker-generator-cli/src/site/markdown/cli/concepts/named-uris.md 
b/freemarker-generator-cli/src/site/markdown/cli/concepts/named-uris.md
index 5fecc46..d34b32e 100644
--- a/freemarker-generator-cli/src/site/markdown/cli/concepts/named-uris.md
+++ b/freemarker-generator-cli/src/site/markdown/cli/concepts/named-uris.md
@@ -128,11 +128,11 @@ URI schema      : file
 Iterating Over Metadata Of A Datasource
 ---------------------------------------------------------------------------
 extension       : csv
-basename        : user
-filename        : user.csv
-filepath        : 
/Users/sgoeschl/work/github/apache/freemarker-generator/freemarker-generator-cli/target/appassembler/examples/data/csv
+baseName        : user
+fileName        : user.csv
+filePath        : 
/Users/sgoeschl/work/github/apache/freemarker-generator/freemarker-generator-cli/target/appassembler/examples/data/csv
 name            : 
file:/Users/sgoeschl/work/github/apache/freemarker-generator/freemarker-generator-cli/target/appassembler/examples/data/csv/user.csv
-mimetype        : text/csv
+mimeType        : text/csv
 uri             : 
file:/Users/sgoeschl/work/github/apache/freemarker-generator/freemarker-generator-cli/target/appassembler/examples/data/csv/user.csv
 group           : default
 
diff --git 
a/freemarker-generator-cli/src/test/java/org/apache/freemarker/generator/cli/ExamplesTest.java
 
b/freemarker-generator-cli/src/test/java/org/apache/freemarker/generator/cli/ExamplesTest.java
index 49e536f..d14b57a 100644
--- 
a/freemarker-generator-cli/src/test/java/org/apache/freemarker/generator/cli/ExamplesTest.java
+++ 
b/freemarker-generator-cli/src/test/java/org/apache/freemarker/generator/cli/ExamplesTest.java
@@ -49,6 +49,7 @@ public class ExamplesTest extends AbstractMainTest {
 
     @Test
     public void shouldRunDataSourceExamples() throws IOException {
+        assertValid(execute("-t freemarker-generator/datasources.ftl ."));
         assertValid(execute("-t src/app/examples/templates/datasources.ftl -s 
:csv=src/app/examples/data/csv"));
     }
 

Reply via email to