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 2020/02/29 15:15:11 UTC

[freemarker-generator] branch FREEMARKER-134 created (now d2ff9bc)

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

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


      at d2ff9bc  FREEMARKER-134 Rename "Document" to "Datasource"

This branch includes the following new commits:

     new d2ff9bc  FREEMARKER-134 Rename "Document" to "Datasource"

The 1 revisions listed above as "new" are entirely new to this
repository and will be described in separate emails.  The revisions
listed as "add" were already present in the repository and have only
been added to this reference.



[freemarker-generator] 01/01: FREEMARKER-134 Rename "Document" to "Datasource"

Posted by sg...@apache.org.
This is an automated email from the ASF dual-hosted git repository.

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

commit d2ff9bc4ba868c61445780c401b0e8aeb9e15082
Author: Siegfried Goeschl <si...@gmail.com>
AuthorDate: Sat Feb 29 16:14:35 2020 +0100

    FREEMARKER-134 Rename "Document" to "Datasource"
---
 freemarker-generator-base/README.md                |   6 +-
 .../generator/base/FreeMarkerConstants.java        |   6 +-
 .../Document.java => datasource/Datasource.java}   |  32 ++---
 .../DatasourceFactory.java}                        |  24 ++--
 .../Documents.java => datasource/Datasources.java} |  74 +++++------
 .../DatasourcesSupplier.java}                      |  20 +--
 .../datasource/DatasourceFactoryTest.java          |  83 ++++++++++++
 .../generator/datasource/DatasourceTest.java       | 146 +++++++++++++++++++++
 .../DatasourcesSupplierTest.java}                  |  20 +--
 .../generator/datasource/DatasourcesTest.java      | 117 +++++++++++++++++
 .../{document => datasource}/UriTest.java          |   2 +-
 .../generator/document/DocumentFactoryTest.java    |  83 ------------
 .../generator/document/DocumentTest.java           | 146 ---------------------
 .../generator/document/DocumentsTest.java          | 117 -----------------
 freemarker-generator-cli/README.md                 |  95 +++++++-------
 freemarker-generator-cli/run-samples.sh            |   6 +-
 .../org/apache/freemarker/generator/cli/Main.java  |   8 +-
 .../freemarker/generator/cli/config/Suppliers.java |   6 +-
 .../generator/cli/task/FreeMarkerTask.java         |  36 ++---
 .../src/main/scripts/run-samples.sh                |   6 +-
 .../freemarker/generator/cli/ExamplesTest.java     |   6 +-
 .../freemarker/generator/cli/ManualTest.java       |   6 +-
 .../src/test/templates/echo.ftl                    |   6 +-
 .../src/test/templates/tools/csv.ftl               |   2 +-
 .../templates/accesslog/combined-access.ftl        |   4 +-
 freemarker-generator-cli/templates/cat.ftl         |   2 +-
 .../templates/csv/csv/gatling-user-credentials.ftl |   4 +-
 .../templates/csv/fo/transactions.ftl              |   6 +-
 .../templates/csv/fo/transform.ftl                 |   2 +-
 .../templates/csv/html/transactions.ftl            |   6 +-
 .../templates/csv/html/transform.ftl               |   6 +-
 .../templates/csv/md/filter.ftl                    |  14 +-
 .../templates/csv/md/transform.ftl                 |   2 +-
 .../templates/csv/shell/curl.ftl                   |   2 +-
 .../templates/csv/transform.ftl                    |   6 +-
 freemarker-generator-cli/templates/demo.ftl        |  28 ++--
 .../templates/excel/csv/custom.ftl                 |   4 +-
 .../templates/excel/csv/transform.ftl              |   4 +-
 .../templates/excel/html/transform.ftl             |  10 +-
 .../templates/excel/md/transform.ftl               |   8 +-
 .../templates/html/csv/dependencies.ftl            |   6 +-
 freemarker-generator-cli/templates/info.ftl        |   6 +-
 .../templates/json/csv/swagger-endpoints.ftl       |   2 +-
 .../templates/json/md/github-users.ftl             |   2 +-
 .../templates/properties/csv/locker-test-users.ftl |   4 +-
 .../templates/tsv/fo/transactions.ftl              |   2 +-
 .../templates/xml/txt/recipients.ftl               |   2 +-
 .../templates/yaml/txt/transform.ftl               |   2 +-
 freemarker-generator-tools/README.md               |   4 +-
 freemarker-generator-tools/pom.xml                 |   2 +-
 .../generator/tools/commonscsv/CommonsCSVTool.java |  20 +--
 .../generator/tools/excel/ExcelTool.java           |  12 +-
 .../generator/tools/jsonpath/JsonPathTool.java     |   6 +-
 .../generator/tools/jsoup/JsoupTool.java           |  10 +-
 .../generator/tools/properties/PropertiesTool.java |   8 +-
 .../generator/tools/snakeyaml/SnakeYamlTool.java   |   8 +-
 .../freemarker/generator/tools/xml/XmlTool.java    |  10 +-
 .../tools/commonscsv/CommonsCSVToolTest.java       |  26 ++--
 .../generator/tools/excel/ExcelToolTest.java       |  10 +-
 .../tools/properties/PropertiesToolTest.java       |  14 +-
 .../tools/snakeyaml/SnakeYamlToolTest.java         |  14 +-
 .../generator/tools/xml/XmlToolTest.java           |  14 +-
 62 files changed, 672 insertions(+), 673 deletions(-)

diff --git a/freemarker-generator-base/README.md b/freemarker-generator-base/README.md
index 9dd180d..3a17212 100644
--- a/freemarker-generator-base/README.md
+++ b/freemarker-generator-base/README.md
@@ -2,8 +2,8 @@
 
 This module provides common functionality for `freemarker-generator-cli` and `freemarker-generator-maven-plugin` such as
 
-* Various implementation of `DataSources`
-* Implementation of `Document` and utitity methods
-* Creating `Documents` 
+* Various implementation of `javax.activation.DataSources`
+* Implementation of `Datasource` and utitity methods
+* Creating `Datasources` 
 
 The code actually does not depend on Apache FreeMarker since it useful for other command line tools as well.
\ No newline at end of file
diff --git a/freemarker-generator-base/src/main/java/org/apache/freemarker/generator/base/FreeMarkerConstants.java b/freemarker-generator-base/src/main/java/org/apache/freemarker/generator/base/FreeMarkerConstants.java
index ab6a11f..94508d1 100644
--- a/freemarker-generator-base/src/main/java/org/apache/freemarker/generator/base/FreeMarkerConstants.java
+++ b/freemarker-generator-base/src/main/java/org/apache/freemarker/generator/base/FreeMarkerConstants.java
@@ -17,8 +17,8 @@ public class FreeMarkerConstants {
     /** Content type for binary data */
     public static final String APPLICATION_OCTET_STREAM = "application/octet-stream";
 
-    /** Unknown length for a <code>Document </code> */
-    public static final int DOCUMENT_UNKNOWN_LENGTH = -1;
+    /** Unknown length for a <code>Datasource</code> */
+    public static final int DATASOURCE_UNKNOWN_LENGTH = -1;
 
     /** Default locale for rendering templates */
     public static final Locale DEFAULT_LOCALE = US;
@@ -59,7 +59,7 @@ public class FreeMarkerConstants {
         private Model() {
         }
 
-        public static final String DOCUMENTS = "Documents";
+        public static final String DATASOURCES = "Datasources";
 
         public static final String FREEMARKER_CLI_ARGS = "freemarker.cli.args";
         public static final String FREEMARKER_LOCALE = "freemarker.locale";
diff --git a/freemarker-generator-base/src/main/java/org/apache/freemarker/generator/base/document/Document.java b/freemarker-generator-base/src/main/java/org/apache/freemarker/generator/base/datasource/Datasource.java
similarity index 87%
rename from freemarker-generator-base/src/main/java/org/apache/freemarker/generator/base/document/Document.java
rename to freemarker-generator-base/src/main/java/org/apache/freemarker/generator/base/datasource/Datasource.java
index 6fddd42..5de9cae 100644
--- a/freemarker-generator-base/src/main/java/org/apache/freemarker/generator/base/document/Document.java
+++ b/freemarker-generator-base/src/main/java/org/apache/freemarker/generator/base/datasource/Datasource.java
@@ -14,7 +14,7 @@
  * See the License for the specific language governing permissions and
  * limitations under the License.
  */
-package org.apache.freemarker.generator.base.document;
+package org.apache.freemarker.generator.base.datasource;
 
 import org.apache.commons.io.FilenameUtils;
 import org.apache.commons.io.IOUtils;
@@ -35,31 +35,31 @@ import java.util.List;
 import static java.nio.charset.Charset.forName;
 import static java.util.Objects.requireNonNull;
 import static org.apache.commons.io.IOUtils.lineIterator;
-import static org.apache.freemarker.generator.base.FreeMarkerConstants.DOCUMENT_UNKNOWN_LENGTH;
+import static org.apache.freemarker.generator.base.FreeMarkerConstants.DATASOURCE_UNKNOWN_LENGTH;
 
 /**
- * Source document which encapsulates a data source. When accessing
- * content it is loaded on demand on not kept in memory to allow
- * processing of large volumes of data.
+ * Datasource which encapsulates data to be used for rendering
+ * a template. When accessing content it is loaded on demand on not
+ * kept in memory to allow processing of large volumes of data.
  */
-public class Document implements Closeable {
+public class Datasource implements Closeable {
 
-    /** Human-readable name of the document */
+    /** Human-readable name of the datasource */
     private final String name;
 
     /** Charset for directly accessing text-based content */
     private final Charset charset;
 
-    /** The data source */
+    /** The underlying "javax.activation.DataSource" */
     private final DataSource dataSource;
 
     /** The location of the content, e.g. file name */
     private final String location;
 
-    /** Collect all closables handed out to the caller to be closed when the document is closed itself */
+    /** Collect all closables handed out to the caller to be closed when the datasource is closed itself */
     private final CloseableReaper closables;
 
-    public Document(String name, DataSource dataSource, String location, Charset charset) {
+    public Datasource(String name, DataSource dataSource, String location, Charset charset) {
         this.name = requireNonNull(name);
         this.dataSource = requireNonNull(dataSource);
         this.location = requireNonNull(location);
@@ -90,7 +90,7 @@ public class Document implements Closeable {
     /**
      * Try to get the length lazily, efficient and without consuming the input stream.
      *
-     * @return Length of document or UNKNOWN_LENGTH
+     * @return Length of datasource or UNKNOWN_LENGTH
      */
     public long getLength() {
         if (dataSource instanceof FileDataSource) {
@@ -100,12 +100,12 @@ public class Document implements Closeable {
         } else if (dataSource instanceof ByteArrayDataSource) {
             return ((ByteArrayDataSource) dataSource).length();
         } else {
-            return DOCUMENT_UNKNOWN_LENGTH;
+            return DATASOURCE_UNKNOWN_LENGTH;
         }
     }
 
     /**
-     * Get an input stream which is closed together with this document.
+     * Get an input stream which is closed together with this datasource.
      *
      * @return InputStream
      * @throws IOException Operation failed
@@ -193,8 +193,8 @@ public class Document implements Closeable {
 
     /**
      * Some tools create a {@link java.io.Closeable} which can bound to the
-     * lifecycle of the document. When the document is closed all the bound
-     * {@link java.io.Closeable} are closed as well.
+     * lifecycle of the datasource. When the datasource is closed all the
+     * associated {@link java.io.Closeable} are closed as well.
      *
      * @param closeable Closable
      * @param <T>       Type of closable
@@ -211,7 +211,7 @@ public class Document implements Closeable {
 
     @Override
     public String toString() {
-        return "Document{" +
+        return "Datasource{" +
                 "name='" + name + '\'' +
                 ", location=" + location +
                 ", charset='" + charset + '\'' +
diff --git a/freemarker-generator-base/src/main/java/org/apache/freemarker/generator/base/document/DocumentFactory.java b/freemarker-generator-base/src/main/java/org/apache/freemarker/generator/base/datasource/DatasourceFactory.java
similarity index 75%
rename from freemarker-generator-base/src/main/java/org/apache/freemarker/generator/base/document/DocumentFactory.java
rename to freemarker-generator-base/src/main/java/org/apache/freemarker/generator/base/datasource/DatasourceFactory.java
index de4ed51..c54aa4e 100644
--- a/freemarker-generator-base/src/main/java/org/apache/freemarker/generator/base/document/DocumentFactory.java
+++ b/freemarker-generator-base/src/main/java/org/apache/freemarker/generator/base/datasource/DatasourceFactory.java
@@ -14,7 +14,7 @@
  * See the License for the specific language governing permissions and
  * limitations under the License.
  */
-package org.apache.freemarker.generator.base.document;
+package org.apache.freemarker.generator.base.datasource;
 
 import org.apache.freemarker.generator.base.FreeMarkerConstants.Location;
 import org.apache.freemarker.generator.base.activation.ByteArrayDataSource;
@@ -32,45 +32,45 @@ import java.nio.charset.Charset;
 import static java.nio.charset.StandardCharsets.UTF_8;
 
 /**
- * Creates a document from various sources.
+ * Creates a Datasource from various sources.
  */
-public class DocumentFactory {
+public class DatasourceFactory {
 
-    private DocumentFactory() {
+    private DatasourceFactory() {
     }
 
-    public static Document create(URL url) {
+    public static Datasource create(URL url) {
         final String location = url.getProtocol() + "://" + url.getHost();
         final URLDataSource dataSource = new URLDataSource(url);
         return create(url.getHost(), dataSource, location, UTF_8);
     }
 
-    public static Document create(String name, String content) {
+    public static Datasource create(String name, String content) {
         final StringDataSource dataSource = new StringDataSource(name, content, UTF_8);
         return create(name, dataSource, Location.STRING, UTF_8);
     }
 
-    public static Document create(File file, Charset charset) {
+    public static Datasource create(File file, Charset charset) {
         final FileDataSource dataSource = new FileDataSource(file);
         return create(file.getName(), dataSource, file.getAbsolutePath(), charset);
     }
 
-    public static Document create(String name, byte[] content) {
+    public static Datasource create(String name, byte[] content) {
         final ByteArrayDataSource dataSource = new ByteArrayDataSource(name, content);
         return create(name, dataSource, Location.BYTES, UTF_8);
     }
 
-    public static Document create(String name, InputStream is, Charset charset) {
+    public static Datasource create(String name, InputStream is, Charset charset) {
         final InputStreamDataSource dataSource = new InputStreamDataSource(name, is);
         return create(name, dataSource, Location.INPUTSTREAM, charset);
     }
 
-    public static Document create(String name, InputStream is, String location, Charset charset) {
+    public static Datasource create(String name, InputStream is, String location, Charset charset) {
         final InputStreamDataSource dataSource = new InputStreamDataSource(name, is);
         return create(name, dataSource, location, charset);
     }
 
-    public static Document create(String name, DataSource dataSource, String location, Charset charset) {
-        return new Document(name, dataSource, location, charset);
+    public static Datasource create(String name, DataSource dataSource, String location, Charset charset) {
+        return new Datasource(name, dataSource, location, charset);
     }
 }
diff --git a/freemarker-generator-base/src/main/java/org/apache/freemarker/generator/base/document/Documents.java b/freemarker-generator-base/src/main/java/org/apache/freemarker/generator/base/datasource/Datasources.java
similarity index 50%
rename from freemarker-generator-base/src/main/java/org/apache/freemarker/generator/base/document/Documents.java
rename to freemarker-generator-base/src/main/java/org/apache/freemarker/generator/base/datasource/Datasources.java
index c1c4680..51d2804 100644
--- a/freemarker-generator-base/src/main/java/org/apache/freemarker/generator/base/document/Documents.java
+++ b/freemarker-generator-base/src/main/java/org/apache/freemarker/generator/base/datasource/Datasources.java
@@ -14,7 +14,7 @@
  * See the License for the specific language governing permissions and
  * limitations under the License.
  */
-package org.apache.freemarker.generator.base.document;
+package org.apache.freemarker.generator.base.datasource;
 
 import org.apache.freemarker.generator.base.util.ClosableUtils;
 
@@ -27,98 +27,98 @@ import static java.util.stream.Collectors.toList;
 import static org.apache.commons.io.FilenameUtils.wildcardMatch;
 
 /**
- * Container for documents with a couple of convenience functions to select
- * a subset of documents.
+ * Container for datasources with a couple of convenience functions to select
+ * a subset of datasources.
  */
-public class Documents implements Closeable {
+public class Datasources implements Closeable {
 
-    private final List<Document> documents;
+    private final List<Datasource> datasources;
 
-    public Documents(Collection<Document> documents) {
-        this.documents = new ArrayList<>(documents);
+    public Datasources(Collection<Datasource> datasources) {
+        this.datasources = new ArrayList<>(datasources);
     }
 
     /**
-     * Get the names of all documents.
+     * Get the names of all datasources.
      *
-     * @return document names
+     * @return datasource names
      */
     public List<String> getNames() {
-        return documents.stream()
-                .map(Document::getName)
+        return datasources.stream()
+                .map(Datasource::getName)
                 .collect(toList());
     }
 
     public int size() {
-        return documents.size();
+        return datasources.size();
     }
 
     public boolean isEmpty() {
-        return documents.isEmpty();
+        return datasources.isEmpty();
     }
 
-    public Document getFirst() {
-        return documents.get(0);
+    public Datasource getFirst() {
+        return datasources.get(0);
     }
 
-    public List<Document> getList() {
-        return new ArrayList<>(documents);
+    public List<Datasource> getList() {
+        return new ArrayList<>(datasources);
     }
 
-    public Document get(int index) {
-        return documents.get(index);
+    public Datasource get(int index) {
+        return datasources.get(index);
     }
 
-    public boolean add(Document document) {
-        return documents.add(document);
+    public boolean add(Datasource datasource) {
+        return datasources.add(datasource);
     }
 
-    public Document remove(int index) {
-        return documents.remove(index);
+    public Datasource remove(int index) {
+        return datasources.remove(index);
     }
 
     /**
-     * Get exactly one document. If not exactly one document
+     * Get exactly one datasource. If not exactly one datasource
      * is found an exception is thrown.
      *
-     * @param name name of the document
-     * @return document
+     * @param name name of the datasource
+     * @return datasource
      */
-    public Document get(String name) {
-        final List<Document> list = find(name);
+    public Datasource get(String name) {
+        final List<Datasource> list = find(name);
 
         if (list.isEmpty()) {
-            throw new IllegalArgumentException("Document not found : " + name);
+            throw new IllegalArgumentException("Datasource not found : " + name);
         }
 
         if (list.size() > 1) {
-            throw new IllegalArgumentException("More than one document found : " + name);
+            throw new IllegalArgumentException("More than one datasource found : " + name);
         }
 
         return list.get(0);
     }
 
     /**
-     * Find document based on theit name and globbing pattern.
+     * Find datasources based on their name and globbing pattern.
      *
      * @param wildcard globbing pattern
-     * @return list of mathching documents
+     * @return list of mathching datasources
      */
-    public List<Document> find(String wildcard) {
-        return documents.stream()
+    public List<Datasource> find(String wildcard) {
+        return datasources.stream()
                 .filter(d -> wildcardMatch(d.getName(), wildcard))
                 .collect(toList());
     }
 
     @Override
     public void close() {
-        documents.forEach(ClosableUtils::closeQuietly);
+        datasources.forEach(ClosableUtils::closeQuietly);
     }
 
     @Override
     public String toString() {
-        return "Documents{" +
-                "documents=" + documents +
+        return "Datasources{" +
+                "datasources=" + datasources +
                 '}';
     }
 }
diff --git a/freemarker-generator-base/src/main/java/org/apache/freemarker/generator/base/document/DocumentsSupplier.java b/freemarker-generator-base/src/main/java/org/apache/freemarker/generator/base/datasource/DatasourcesSupplier.java
similarity index 81%
rename from freemarker-generator-base/src/main/java/org/apache/freemarker/generator/base/document/DocumentsSupplier.java
rename to freemarker-generator-base/src/main/java/org/apache/freemarker/generator/base/datasource/DatasourcesSupplier.java
index e4b85a9..3e5a686 100644
--- a/freemarker-generator-base/src/main/java/org/apache/freemarker/generator/base/document/DocumentsSupplier.java
+++ b/freemarker-generator-base/src/main/java/org/apache/freemarker/generator/base/datasource/DatasourcesSupplier.java
@@ -14,7 +14,7 @@
  * See the License for the specific language governing permissions and
  * limitations under the License.
  */
-package org.apache.freemarker.generator.base.document;
+package org.apache.freemarker.generator.base.datasource;
 
 import org.apache.freemarker.generator.base.file.RecursiveFileSupplier;
 
@@ -31,10 +31,10 @@ import static java.util.Objects.requireNonNull;
 import static java.util.stream.Collectors.toList;
 
 /**
- * Create a list of <code>Document</code> based on a list of sources consisting of
+ * Create a list of <code>Datasource</code> based on a list of sources consisting of
  * URLs, directories and files.
  */
-public class DocumentsSupplier implements Supplier<List<Document>> {
+public class DatasourcesSupplier implements Supplier<List<Datasource>> {
 
     /** List of source files and/or directories */
     private final Collection<String> sources;
@@ -55,7 +55,7 @@ public class DocumentsSupplier implements Supplier<List<Document>> {
      * @param include Optional include pattern for resolving source files or directory
      * @param charset The charset for loading text files
      */
-    public DocumentsSupplier(Collection<String> sources, String include, String exclude, Charset charset) {
+    public DatasourcesSupplier(Collection<String> sources, String include, String exclude, Charset charset) {
         this.sources = new ArrayList<>(sources);
         this.include = include;
         this.exclude = exclude;
@@ -63,14 +63,14 @@ public class DocumentsSupplier implements Supplier<List<Document>> {
     }
 
     @Override
-    public List<Document> get() {
+    public List<Datasource> get() {
         return sources.stream()
                 .map(this::get)
                 .flatMap(Collection::stream)
                 .collect(toList());
     }
 
-    private List<Document> get(String source) {
+    private List<Datasource> get(String source) {
         if (isHttpUrl(source)) {
             return singletonList(resolveHttpUrl(source));
         } else {
@@ -78,13 +78,13 @@ public class DocumentsSupplier implements Supplier<List<Document>> {
         }
     }
 
-    private static Document resolveHttpUrl(String url) {
-        return DocumentFactory.create(toUrl(url));
+    private static Datasource resolveHttpUrl(String url) {
+        return DatasourceFactory.create(toUrl(url));
     }
 
-    private static List<Document> resolveFile(String source, String include, String exclude, Charset charset) {
+    private static List<Datasource> resolveFile(String source, String include, String exclude, Charset charset) {
         return fileResolver(source, include, exclude).get().stream()
-                .map(file -> DocumentFactory.create(file, charset))
+                .map(file -> DatasourceFactory.create(file, charset))
                 .collect(toList());
     }
 
diff --git a/freemarker-generator-base/src/test/java/org/apache/freemarker/generator/datasource/DatasourceFactoryTest.java b/freemarker-generator-base/src/test/java/org/apache/freemarker/generator/datasource/DatasourceFactoryTest.java
new file mode 100644
index 0000000..677f991
--- /dev/null
+++ b/freemarker-generator-base/src/test/java/org/apache/freemarker/generator/datasource/DatasourceFactoryTest.java
@@ -0,0 +1,83 @@
+/*
+ * 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.
+ */
+package org.apache.freemarker.generator.datasource;
+
+import org.apache.freemarker.generator.base.datasource.Datasource;
+import org.apache.freemarker.generator.base.datasource.DatasourceFactory;
+import org.junit.Test;
+
+import java.io.ByteArrayInputStream;
+import java.io.File;
+import java.io.IOException;
+import java.io.InputStream;
+import java.nio.charset.Charset;
+
+import static java.nio.charset.StandardCharsets.UTF_8;
+import static junit.framework.TestCase.assertTrue;
+import static org.junit.Assert.assertEquals;
+
+public class DatasourceFactoryTest {
+
+    private static final String ANY_TEXT = "Hello World";
+    private static final String ANY_FILE_NAME = "pom.xml";
+    private static final Charset ANY_CHAR_SET = UTF_8;
+    private static final File ANY_FILE = new File(ANY_FILE_NAME);
+
+    @Test
+    public void shouldCreateFileBasedDatasource() throws IOException {
+        final Datasource datasource = DatasourceFactory.create(ANY_FILE, ANY_CHAR_SET);
+
+        assertEquals(ANY_FILE_NAME, datasource.getName());
+        assertEquals(UTF_8, datasource.getCharset());
+        assertEquals(ANY_FILE.getAbsolutePath(), datasource.getLocation());
+        assertTrue(!datasource.getLines().isEmpty());
+    }
+
+    @Test
+    public void shouldCreateStringBasedDatasource() throws IOException {
+        final Datasource datasource = DatasourceFactory.create("test.txt", ANY_TEXT);
+
+        assertEquals("test.txt", datasource.getName());
+        assertEquals(UTF_8, datasource.getCharset());
+        assertEquals("string", datasource.getLocation());
+        assertEquals(ANY_TEXT, datasource.getText());
+        assertEquals(1, datasource.getLines().size());
+    }
+
+    @Test
+    public void shouldCreateByteArrayBasedDatasource() throws IOException {
+        final Datasource datasource = DatasourceFactory.create("test.txt", ANY_TEXT.getBytes(UTF_8));
+
+        assertEquals("test.txt", datasource.getName());
+        assertEquals(UTF_8, datasource.getCharset());
+        assertEquals("bytes", datasource.getLocation());
+        assertEquals(ANY_TEXT, datasource.getText());
+        assertEquals(1, datasource.getLines().size());
+    }
+
+    @Test
+    public void shouldCreateInputStreamBasedDatasource() throws IOException {
+        final InputStream is = new ByteArrayInputStream(ANY_TEXT.getBytes(UTF_8));
+        final Datasource datasource = DatasourceFactory.create("test.txt", is, UTF_8);
+
+        assertEquals("test.txt", datasource.getName());
+        assertEquals(UTF_8, datasource.getCharset());
+        assertEquals("inputstream", datasource.getLocation());
+        assertEquals(ANY_TEXT, datasource.getText());
+    }
+
+}
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
new file mode 100644
index 0000000..878dd2c
--- /dev/null
+++ b/freemarker-generator-base/src/test/java/org/apache/freemarker/generator/datasource/DatasourceTest.java
@@ -0,0 +1,146 @@
+/*
+ * 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.
+ */
+package org.apache.freemarker.generator.datasource;
+
+import org.apache.commons.io.LineIterator;
+import org.apache.freemarker.generator.base.datasource.Datasource;
+import org.apache.freemarker.generator.base.datasource.DatasourceFactory;
+import org.junit.Ignore;
+import org.junit.Test;
+
+import java.io.Closeable;
+import java.io.File;
+import java.io.IOException;
+import java.net.URL;
+import java.nio.charset.Charset;
+import java.util.Iterator;
+
+import static java.nio.charset.StandardCharsets.UTF_8;
+import static org.junit.Assert.assertEquals;
+import static org.junit.Assert.assertFalse;
+import static org.junit.Assert.assertTrue;
+
+public class DatasourceTest {
+
+    private static final String ANY_TEXT = "Hello World";
+    private static final String ANY_FILE_NAME = "pom.xml";
+    private static final Charset ANY_CHAR_SET = UTF_8;
+    private static final File ANY_FILE = new File(ANY_FILE_NAME);
+
+    @Test
+    public void shouldSupportTextDatasource() throws IOException {
+        try (Datasource datasource = DatasourceFactory.create("stdin", ANY_TEXT)) {
+            assertEquals("stdin", datasource.getName());
+            assertEquals("stdin", datasource.getBaseName());
+            assertEquals("", datasource.getExtension());
+            assertEquals("string", datasource.getLocation());
+            assertEquals(UTF_8, datasource.getCharset());
+            assertTrue(datasource.getLength() > 0);
+            assertEquals(ANY_TEXT, datasource.getText());
+        }
+    }
+
+    @Test
+    public void shouldSupportFileDatasource() throws IOException {
+        try (Datasource datasource = DatasourceFactory.create(ANY_FILE, ANY_CHAR_SET)) {
+            assertEquals(ANY_FILE_NAME, datasource.getName());
+            assertEquals("pom", datasource.getBaseName());
+            assertEquals("xml", datasource.getExtension());
+            assertEquals(ANY_FILE.getAbsolutePath(), datasource.getLocation());
+            assertEquals(Charset.defaultCharset(), datasource.getCharset());
+            assertTrue(datasource.getLength() > 0);
+            assertFalse(datasource.getText().isEmpty());
+        }
+    }
+
+    @Ignore
+    @Test
+    public void shouldSupportUrlDatasource() throws IOException {
+        try (Datasource datasource = DatasourceFactory.create(new URL("https://google.com?foo=bar"))) {
+            assertEquals("google.com", datasource.getName());
+            assertEquals("google", datasource.getBaseName());
+            assertEquals("com", datasource.getExtension());
+            assertEquals("https://google.com", datasource.getLocation());
+            assertEquals(UTF_8, datasource.getCharset());
+            assertEquals(-1, datasource.getLength());
+            assertFalse(datasource.getText().isEmpty());
+        }
+    }
+
+    @Test
+    public void shouldSupportLineIterator() throws IOException {
+        try (Datasource datasource = textDatasource()) {
+            try (LineIterator iterator = datasource.getLineIterator(ANY_CHAR_SET.name())) {
+                assertEquals(1, count(iterator));
+            }
+        }
+    }
+
+    @Test
+    public void shouldReadLines() throws IOException {
+        try (Datasource datasource = textDatasource()) {
+            assertEquals(1, datasource.getLines().size());
+            assertEquals(ANY_TEXT, datasource.getLines().get(0));
+        }
+    }
+
+    @Test
+    public void shouldGetBytes() throws IOException {
+        try (Datasource datasource = textDatasource()) {
+            assertEquals(11, datasource.getBytes().length);
+        }
+    }
+
+    @Test
+    public void shouldCloseDatasource() {
+        final Datasource datasource = textDatasource();
+        final TestClosable closable1 = datasource.addClosable(new TestClosable());
+        final TestClosable closable2 = datasource.addClosable(new TestClosable());
+
+        datasource.close();
+
+        assertTrue(closable1.isClosed());
+        assertTrue(closable2.isClosed());
+    }
+
+    private static int count(Iterator<String> iterator) {
+        int count = 0;
+        while (iterator.hasNext()) {
+            count++;
+            iterator.next();
+        }
+        return count;
+    }
+
+    private static Datasource textDatasource() {
+        return DatasourceFactory.create("stdin", ANY_TEXT);
+    }
+
+    private static final class TestClosable implements Closeable {
+
+        private boolean closed = false;
+
+        @Override
+        public void close() throws IOException {
+            closed = true;
+        }
+
+        public boolean isClosed() {
+            return closed;
+        }
+    }
+}
diff --git a/freemarker-generator-base/src/test/java/org/apache/freemarker/generator/document/DocumentsSupplierTest.java b/freemarker-generator-base/src/test/java/org/apache/freemarker/generator/datasource/DatasourcesSupplierTest.java
similarity index 85%
rename from freemarker-generator-base/src/test/java/org/apache/freemarker/generator/document/DocumentsSupplierTest.java
rename to freemarker-generator-base/src/test/java/org/apache/freemarker/generator/datasource/DatasourcesSupplierTest.java
index 2a87db1..d06f16f 100644
--- a/freemarker-generator-base/src/test/java/org/apache/freemarker/generator/document/DocumentsSupplierTest.java
+++ b/freemarker-generator-base/src/test/java/org/apache/freemarker/generator/datasource/DatasourcesSupplierTest.java
@@ -14,10 +14,10 @@
  * See the License for the specific language governing permissions and
  * limitations under the License.
  */
-package org.apache.freemarker.generator.document;
+package org.apache.freemarker.generator.datasource;
 
-import org.apache.freemarker.generator.base.document.Document;
-import org.apache.freemarker.generator.base.document.DocumentsSupplier;
+import org.apache.freemarker.generator.base.datasource.Datasource;
+import org.apache.freemarker.generator.base.datasource.DatasourcesSupplier;
 import org.junit.Test;
 
 import java.nio.charset.Charset;
@@ -28,7 +28,7 @@ import static java.util.Collections.singletonList;
 import static org.junit.Assert.assertEquals;
 import static org.junit.Assert.assertFalse;
 
-public class DocumentsSupplierTest {
+public class DatasourcesSupplierTest {
 
     private static final String NO_EXCLUDE = null;
     private static final String ANY_FILE = "./pom.xml";
@@ -85,8 +85,8 @@ public class DocumentsSupplierTest {
 
     @Test
     public void shouldResolveLargeDirectory() {
-        final List<Document> documents = supplier(".", null, null).get();
-        assertFalse(documents.isEmpty());
+        final List<Datasource> datasources = supplier(".", null, null).get();
+        assertFalse(datasources.isEmpty());
     }
 
     @Test(expected = RuntimeException.class)
@@ -100,11 +100,11 @@ public class DocumentsSupplierTest {
         assertEquals(2, supplier(sources, "*.xml", null).get().size());
     }
 
-    private static DocumentsSupplier supplier(String directory, String include, String exclude) {
-        return new DocumentsSupplier(singletonList(directory), include, exclude, Charset.defaultCharset());
+    private static DatasourcesSupplier supplier(String directory, String include, String exclude) {
+        return new DatasourcesSupplier(singletonList(directory), include, exclude, Charset.defaultCharset());
     }
 
-    private static DocumentsSupplier supplier(List<String> files, String include, String exclude) {
-        return new DocumentsSupplier(files, include, exclude, Charset.defaultCharset());
+    private static DatasourcesSupplier supplier(List<String> files, String include, String exclude) {
+        return new DatasourcesSupplier(files, include, exclude, Charset.defaultCharset());
     }
 }
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
new file mode 100644
index 0000000..b580191
--- /dev/null
+++ b/freemarker-generator-base/src/test/java/org/apache/freemarker/generator/datasource/DatasourcesTest.java
@@ -0,0 +1,117 @@
+/*
+ * 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.
+ */
+package org.apache.freemarker.generator.datasource;
+
+import org.apache.freemarker.generator.base.datasource.Datasource;
+import org.apache.freemarker.generator.base.datasource.DatasourceFactory;
+import org.apache.freemarker.generator.base.datasource.Datasources;
+import org.junit.Test;
+
+import java.io.File;
+import java.net.MalformedURLException;
+import java.net.URL;
+
+import static java.nio.charset.StandardCharsets.UTF_8;
+import static java.util.Arrays.asList;
+import static org.junit.Assert.assertEquals;
+import static org.junit.Assert.assertFalse;
+import static org.junit.Assert.assertNotNull;
+
+public class DatasourcesTest {
+
+    private static final String UNKNOWN = "unknown";
+    private static final String ANY_TEXT = "Hello World";
+    private static final String ANY_FILE_NAME = "pom.xml";
+    private static final String ANY_FILE_EXTENSION = "xml";
+    private static final File ANY_FILE = new File(ANY_FILE_NAME);
+    private static final String ANY_URL = "https://server.invalid?foo=bar";
+
+    @Test
+    public void shouldFindByWildcard() {
+        final Datasources datasources = datasources();
+
+        assertEquals(0, datasources.find(null).size());
+        assertEquals(0, datasources.find("").size());
+        assertEquals(0, datasources.find("*.bar").size());
+        assertEquals(0, datasources.find("foo.*").size());
+        assertEquals(0, datasources.find("foo.bar").size());
+
+        assertEquals(2, datasources.find("*.*").size());
+        assertEquals(1, datasources.find("*." + ANY_FILE_EXTENSION).size());
+        assertEquals(1, datasources.find("*.???").size());
+        assertEquals(1, datasources.find("*om*").size());
+        assertEquals(1, datasources.find("*o*.xml").size());
+
+        assertEquals(1, datasources.find(ANY_FILE_NAME).size());
+        assertEquals(1, datasources.find(ANY_FILE_NAME.charAt(0) + "*").size());
+
+        assertEquals(3, datasources.find("*").size());
+    }
+
+    @Test
+    public void shouldGetDatasource() {
+        assertNotNull(datasources().get(ANY_FILE_NAME));
+    }
+
+    @Test
+    public void shouldGetAllDatasources() {
+        final Datasources datasources = datasources();
+
+        assertEquals("unknown", datasources().get(0).getName());
+        assertEquals("pom.xml", datasources().get(1).getName());
+        assertEquals("server.invalid", datasources().get(2).getName());
+        assertEquals("unknown", datasources().getFirst().getName());
+        assertEquals(3, datasources.getList().size());
+        assertEquals(3, datasources.size());
+        assertFalse(datasources.isEmpty());
+    }
+
+    @Test
+    public void shouldGetNames() {
+        assertEquals(asList("unknown", "pom.xml", "server.invalid"), datasources().getNames());
+    }
+
+    @Test(expected = IllegalArgumentException.class)
+    public void shouldThrowExceptionWhenGetDoesNotFindDatasource() {
+        datasources().get("file-does-not-exist");
+    }
+
+    @Test(expected = IllegalArgumentException.class)
+    public void shouldThrowExceptionWhenGetFindsMultipleDatasources() {
+        datasources().get("*");
+    }
+
+    private static Datasources datasources() {
+        return new Datasources(asList(textDatasource(), fileDatasource(), urlDatasource()));
+    }
+
+    private static Datasource textDatasource() {
+        return DatasourceFactory.create(UNKNOWN, ANY_TEXT);
+    }
+
+    private static Datasource fileDatasource() {
+        return DatasourceFactory.create(ANY_FILE, UTF_8);
+    }
+
+    private static Datasource urlDatasource() {
+        try {
+            return DatasourceFactory.create(new URL(ANY_URL));
+        } catch (MalformedURLException e) {
+            throw new RuntimeException(e);
+        }
+    }
+}
diff --git a/freemarker-generator-base/src/test/java/org/apache/freemarker/generator/document/UriTest.java b/freemarker-generator-base/src/test/java/org/apache/freemarker/generator/datasource/UriTest.java
similarity index 98%
rename from freemarker-generator-base/src/test/java/org/apache/freemarker/generator/document/UriTest.java
rename to freemarker-generator-base/src/test/java/org/apache/freemarker/generator/datasource/UriTest.java
index d6b66b1..bf5f865 100644
--- a/freemarker-generator-base/src/test/java/org/apache/freemarker/generator/document/UriTest.java
+++ b/freemarker-generator-base/src/test/java/org/apache/freemarker/generator/datasource/UriTest.java
@@ -14,7 +14,7 @@
  * See the License for the specific language governing permissions and
  * limitations under the License.
  */
-package org.apache.freemarker.generator.document;
+package org.apache.freemarker.generator.datasource;
 
 import org.junit.Test;
 
diff --git a/freemarker-generator-base/src/test/java/org/apache/freemarker/generator/document/DocumentFactoryTest.java b/freemarker-generator-base/src/test/java/org/apache/freemarker/generator/document/DocumentFactoryTest.java
deleted file mode 100644
index 172e0c6..0000000
--- a/freemarker-generator-base/src/test/java/org/apache/freemarker/generator/document/DocumentFactoryTest.java
+++ /dev/null
@@ -1,83 +0,0 @@
-/*
- * 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.
- */
-package org.apache.freemarker.generator.document;
-
-import org.apache.freemarker.generator.base.document.Document;
-import org.apache.freemarker.generator.base.document.DocumentFactory;
-import org.junit.Test;
-
-import java.io.ByteArrayInputStream;
-import java.io.File;
-import java.io.IOException;
-import java.io.InputStream;
-import java.nio.charset.Charset;
-
-import static java.nio.charset.StandardCharsets.UTF_8;
-import static junit.framework.TestCase.assertTrue;
-import static org.junit.Assert.assertEquals;
-
-public class DocumentFactoryTest {
-
-    private static final String ANY_TEXT = "Hello World";
-    private static final String ANY_FILE_NAME = "pom.xml";
-    private static final Charset ANY_CHAR_SET = UTF_8;
-    private static final File ANY_FILE = new File(ANY_FILE_NAME);
-
-    @Test
-    public void shouldCreateFileBasedDocument() throws IOException {
-        final Document document = DocumentFactory.create(ANY_FILE, ANY_CHAR_SET);
-
-        assertEquals(ANY_FILE_NAME, document.getName());
-        assertEquals(UTF_8, document.getCharset());
-        assertEquals(ANY_FILE.getAbsolutePath(), document.getLocation());
-        assertTrue(!document.getLines().isEmpty());
-    }
-
-    @Test
-    public void shouldCreateStringBasedDocument() throws IOException {
-        final Document document = DocumentFactory.create("test.txt", ANY_TEXT);
-
-        assertEquals("test.txt", document.getName());
-        assertEquals(UTF_8, document.getCharset());
-        assertEquals("string", document.getLocation());
-        assertEquals(ANY_TEXT, document.getText());
-        assertEquals(1, document.getLines().size());
-    }
-
-    @Test
-    public void shouldCreateByteArrayBasedDocument() throws IOException {
-        final Document document = DocumentFactory.create("test.txt", ANY_TEXT.getBytes(UTF_8));
-
-        assertEquals("test.txt", document.getName());
-        assertEquals(UTF_8, document.getCharset());
-        assertEquals("bytes", document.getLocation());
-        assertEquals(ANY_TEXT, document.getText());
-        assertEquals(1, document.getLines().size());
-    }
-
-    @Test
-    public void shouldCreateInputStreamBasedDocument() throws IOException {
-        final InputStream is = new ByteArrayInputStream(ANY_TEXT.getBytes(UTF_8));
-        final Document document = DocumentFactory.create("test.txt", is, UTF_8);
-
-        assertEquals("test.txt", document.getName());
-        assertEquals(UTF_8, document.getCharset());
-        assertEquals("inputstream", document.getLocation());
-        assertEquals(ANY_TEXT, document.getText());
-    }
-
-}
diff --git a/freemarker-generator-base/src/test/java/org/apache/freemarker/generator/document/DocumentTest.java b/freemarker-generator-base/src/test/java/org/apache/freemarker/generator/document/DocumentTest.java
deleted file mode 100644
index 22d5952..0000000
--- a/freemarker-generator-base/src/test/java/org/apache/freemarker/generator/document/DocumentTest.java
+++ /dev/null
@@ -1,146 +0,0 @@
-/*
- * 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.
- */
-package org.apache.freemarker.generator.document;
-
-import org.apache.commons.io.LineIterator;
-import org.apache.freemarker.generator.base.document.Document;
-import org.apache.freemarker.generator.base.document.DocumentFactory;
-import org.junit.Ignore;
-import org.junit.Test;
-
-import java.io.Closeable;
-import java.io.File;
-import java.io.IOException;
-import java.net.URL;
-import java.nio.charset.Charset;
-import java.util.Iterator;
-
-import static java.nio.charset.StandardCharsets.UTF_8;
-import static org.junit.Assert.assertEquals;
-import static org.junit.Assert.assertFalse;
-import static org.junit.Assert.assertTrue;
-
-public class DocumentTest {
-
-    private static final String ANY_TEXT = "Hello World";
-    private static final String ANY_FILE_NAME = "pom.xml";
-    private static final Charset ANY_CHAR_SET = UTF_8;
-    private static final File ANY_FILE = new File(ANY_FILE_NAME);
-
-    @Test
-    public void shouldSupportTextDocument() throws IOException {
-        try (Document document = DocumentFactory.create("stdin", ANY_TEXT)) {
-            assertEquals("stdin", document.getName());
-            assertEquals("stdin", document.getBaseName());
-            assertEquals("", document.getExtension());
-            assertEquals("string", document.getLocation());
-            assertEquals(UTF_8, document.getCharset());
-            assertTrue(document.getLength() > 0);
-            assertEquals(ANY_TEXT, document.getText());
-        }
-    }
-
-    @Test
-    public void shouldSupportFileDocument() throws IOException {
-        try (Document document = DocumentFactory.create(ANY_FILE, ANY_CHAR_SET)) {
-            assertEquals(ANY_FILE_NAME, document.getName());
-            assertEquals("pom", document.getBaseName());
-            assertEquals("xml", document.getExtension());
-            assertEquals(ANY_FILE.getAbsolutePath(), document.getLocation());
-            assertEquals(Charset.defaultCharset(), document.getCharset());
-            assertTrue(document.getLength() > 0);
-            assertFalse(document.getText().isEmpty());
-        }
-    }
-
-    @Ignore
-    @Test
-    public void shouldSupportUrlDocument() throws IOException {
-        try (Document document = DocumentFactory.create(new URL("https://google.com?foo=bar"))) {
-            assertEquals("google.com", document.getName());
-            assertEquals("google", document.getBaseName());
-            assertEquals("com", document.getExtension());
-            assertEquals("https://google.com", document.getLocation());
-            assertEquals(UTF_8, document.getCharset());
-            assertEquals(-1, document.getLength());
-            assertFalse(document.getText().isEmpty());
-        }
-    }
-
-    @Test
-    public void shouldSupportLineIterator() throws IOException {
-        try (Document document = textDocument()) {
-            try (LineIterator iterator = document.getLineIterator(ANY_CHAR_SET.name())) {
-                assertEquals(1, count(iterator));
-            }
-        }
-    }
-
-    @Test
-    public void shouldReadLines() throws IOException {
-        try (Document document = textDocument()) {
-            assertEquals(1, document.getLines().size());
-            assertEquals(ANY_TEXT, document.getLines().get(0));
-        }
-    }
-
-    @Test
-    public void shouldGetBytes() throws IOException {
-        try (Document document = textDocument()) {
-            assertEquals(11, document.getBytes().length);
-        }
-    }
-
-    @Test
-    public void shouldCloseDocument() {
-        final Document document = textDocument();
-        final TestClosable closable1 = document.addClosable(new TestClosable());
-        final TestClosable closable2 = document.addClosable(new TestClosable());
-
-        document.close();
-
-        assertTrue(closable1.isClosed());
-        assertTrue(closable2.isClosed());
-    }
-
-    private static int count(Iterator<String> iterator) {
-        int count = 0;
-        while (iterator.hasNext()) {
-            count++;
-            iterator.next();
-        }
-        return count;
-    }
-
-    private static Document textDocument() {
-        return DocumentFactory.create("stdin", ANY_TEXT);
-    }
-
-    private static final class TestClosable implements Closeable {
-
-        private boolean closed = false;
-
-        @Override
-        public void close() throws IOException {
-            closed = true;
-        }
-
-        public boolean isClosed() {
-            return closed;
-        }
-    }
-}
diff --git a/freemarker-generator-base/src/test/java/org/apache/freemarker/generator/document/DocumentsTest.java b/freemarker-generator-base/src/test/java/org/apache/freemarker/generator/document/DocumentsTest.java
deleted file mode 100644
index 5c7f90a..0000000
--- a/freemarker-generator-base/src/test/java/org/apache/freemarker/generator/document/DocumentsTest.java
+++ /dev/null
@@ -1,117 +0,0 @@
-/*
- * 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.
- */
-package org.apache.freemarker.generator.document;
-
-import org.apache.freemarker.generator.base.document.Document;
-import org.apache.freemarker.generator.base.document.DocumentFactory;
-import org.apache.freemarker.generator.base.document.Documents;
-import org.junit.Test;
-
-import java.io.File;
-import java.net.MalformedURLException;
-import java.net.URL;
-
-import static java.nio.charset.StandardCharsets.UTF_8;
-import static java.util.Arrays.asList;
-import static org.junit.Assert.assertEquals;
-import static org.junit.Assert.assertFalse;
-import static org.junit.Assert.assertNotNull;
-
-public class DocumentsTest {
-
-    private static final String UNKNOWN = "unknown";
-    private static final String ANY_TEXT = "Hello World";
-    private static final String ANY_FILE_NAME = "pom.xml";
-    private static final String ANY_FILE_EXTENSION = "xml";
-    private static final File ANY_FILE = new File(ANY_FILE_NAME);
-    private static final String ANY_URL = "https://server.invalid?foo=bar";
-
-    @Test
-    public void shouldFindByWildcard() {
-        final Documents documents = documents();
-
-        assertEquals(0, documents.find(null).size());
-        assertEquals(0, documents.find("").size());
-        assertEquals(0, documents.find("*.bar").size());
-        assertEquals(0, documents.find("foo.*").size());
-        assertEquals(0, documents.find("foo.bar").size());
-
-        assertEquals(2, documents.find("*.*").size());
-        assertEquals(1, documents.find("*." + ANY_FILE_EXTENSION).size());
-        assertEquals(1, documents.find("*.???").size());
-        assertEquals(1, documents.find("*om*").size());
-        assertEquals(1, documents.find("*o*.xml").size());
-
-        assertEquals(1, documents.find(ANY_FILE_NAME).size());
-        assertEquals(1, documents.find(ANY_FILE_NAME.charAt(0) + "*").size());
-
-        assertEquals(3, documents.find("*").size());
-    }
-
-    @Test
-    public void shouldGetDocument() {
-        assertNotNull(documents().get(ANY_FILE_NAME));
-    }
-
-    @Test
-    public void shouldGetAllDocuments() {
-        final Documents documents = documents();
-
-        assertEquals("unknown", documents().get(0).getName());
-        assertEquals("pom.xml", documents().get(1).getName());
-        assertEquals("server.invalid", documents().get(2).getName());
-        assertEquals("unknown", documents().getFirst().getName());
-        assertEquals(3, documents.getList().size());
-        assertEquals(3, documents.size());
-        assertFalse(documents.isEmpty());
-    }
-
-    @Test
-    public void shouldGetNames() {
-        assertEquals(asList("unknown", "pom.xml", "server.invalid"), documents().getNames());
-    }
-
-    @Test(expected = IllegalArgumentException.class)
-    public void shouldThrowExceptionWhenGetDoesNotFindDocument() {
-        documents().get("file-does-not-exist");
-    }
-
-    @Test(expected = IllegalArgumentException.class)
-    public void shouldThrowExceptionWhenGetFindsMultipleDocuments() {
-        documents().get("*");
-    }
-
-    private static Documents documents() {
-        return new Documents(asList(textDocument(), fileDocument(), urlDocument()));
-    }
-
-    private static Document textDocument() {
-        return DocumentFactory.create(UNKNOWN, ANY_TEXT);
-    }
-
-    private static Document fileDocument() {
-        return DocumentFactory.create(ANY_FILE, UTF_8);
-    }
-
-    private static Document urlDocument() {
-        try {
-            return DocumentFactory.create(new URL(ANY_URL));
-        } catch (MalformedURLException e) {
-            throw new RuntimeException(e);
-        }
-    }
-}
diff --git a/freemarker-generator-cli/README.md b/freemarker-generator-cli/README.md
index 06b7680..754dd24 100644
--- a/freemarker-generator-cli/README.md
+++ b/freemarker-generator-cli/README.md
@@ -58,7 +58,7 @@ Some years later the not-so-small-any-longer-and-not-having-tests Groovy script
 * Support transformation of HTML using [JSoup](https://jsoup.org)
 * Support transformation of structured logfiles using [Grok](https://github.com/thekrakken/java-grok)
 * XML & XPath is supported by FreeMarker [out-of-the-box](http://freemarker.org/docs/xgui.html)
-* Support for reading document content from STDIN to integrate with command line tools
+* Support for reading a datasource content from STDIN to integrate with command line tools
 * Support execution of arbitrary commands using [Apache Commons Exec](https://commons.apache.org/proper/commons-exec/)
 * Add some commonly useful information such as `System Properties`, `Enviroment Variables`
 * Support embedding the code in existing applications
@@ -106,7 +106,7 @@ FreeMarker CLI Tools
 - XmlTool              : Process XML files using Apache FreeMarker (see https://freemarker.apache.org/docs/xgui.html)
 - YamlTool             : Process YAML files using SnakeYAML(see https://bitbucket.org/asomov/snakeyaml/wiki/Home)
 
-FreeMarker CLI Documents
+FreeMarker CLI Datasources
 ---------------------------------------------------------------------------
 
 User Supplied Parameters
@@ -190,7 +190,6 @@ Please note that generated PDF files are very likely not found since they requir
 
 ```text
 > ./bin/freemarker-cli  -h
-
 Usage: freemarker-cli (-t=<template> | -i=<interactiveTemplate>) [-EhV]
                       [--stdin] [-b=<baseDir>] [--config=<configFile>]
                       [-e=<inputEncoding>] [--exclude=<exclude>]
@@ -205,24 +204,25 @@ Apache FreeMarker CLI
   -D, --system-property=<String=String>
                             Set system property
   -e, --input-encoding=<inputEncoding>
-                            Encoding of input documents
+                            Encoding of datasource
   -E, --expose-env          Expose environment variables and user-supplied
                               properties globally
-      --exclude=<exclude>   File pattern for document input directory
+      --exclude=<exclude>   File pattern for datasource input directory
   -h, --help                Show this help message and exit.
   -i, --interactive=<interactiveTemplate>
                             Interactive FreeMarker template
-      --include=<include>   File pattern for document input directory
+      --include=<include>   File pattern for datasource input directory
   -l, --locale=<locale>     Locale being used for the output, e.g. 'en_US'
   -o, --output=<outputFile> Output file
       --output-encoding=<outputEncoding>
                             Encoding of output, e.g. UTF-8
   -P, --param=<String=String>
                             Set parameter
-      --stdin               Read input document from stdin
+      --stdin               Read datasource from stdin
   -t, --template=<template> FreeMarker template to render
       --times=<times>       Re-run X times for profiling
   -V, --version             Print version information and exit.
+
 ```
 
 # 6. Examples
@@ -255,7 +255,7 @@ or pipe a cURL response
 
 ```text
 <#ftl output_format="plainText" >
-<#assign json = JsonPathTool.parse(Documents.get(0))>
+<#assign json = JsonPathTool.parse(Datasources.get(0))>
 <#assign users = json.read("$[*]")>
 <#--------------------------------------------------------------------------->
 # GitHub Users
@@ -293,7 +293,7 @@ The FreeMarker template is shown below
 ```text
 <#ftl output_format="plainText">
 <#assign cvsFormat = CSVTool.formats["DEFAULT"].withHeader()>
-<#assign csvParser = CSVTool.parse(Documents.get(0), cvsFormat)>
+<#assign csvParser = CSVTool.parse(Datasources.get(0), cvsFormat)>
 <#assign csvHeaders = csvParser.getHeaderMap()?keys>
 <#assign csvRecords = csvParser.records>
 <#--------------------------------------------------------------------------->
@@ -330,7 +330,7 @@ using the following template
 
 ```text
 <#ftl output_format="plainText" >
-<#assign xml = XmlTool.parse(Documents.get(0))>
+<#assign xml = XmlTool.parse(Datasources.get(0))>
 <#list xml.recipients.person as recipient>
 To: ${recipient.name}
 ${recipient.address}
@@ -377,7 +377,7 @@ One day I was asked a to prepare a CSV files containing REST endpoints described
 
 ```text
 <#ftl output_format="plainText" strip_text="true">
-<#assign json = JsonPathTool.parse(Documents.get(0))>
+<#assign json = JsonPathTool.parse(Datasources.get(0))>
 <#assign basePath = json.read("$.basePath")>
 <#assign paths = json.read("$.paths")>
 
@@ -439,15 +439,15 @@ The provided FTL transforms an Excel into a HTML document supporting multiple Ex
 
 ```text
 <#ftl output_format="HTML" >
-<#assign document = Documents.get(0)>
-<#assign documentName = document.name>
-<#assign workbook = ExcelTool.parse(document)>
+<#assign datasource = Datasources.get(0)>
+<#assign name = datasource.name>
+<#assign workbook = ExcelTool.parse(datasource)>
 <#assign date = .now?iso_utc>
 <#--------------------------------------------------------------------------->
 <!DOCTYPE html>
 <html>
 <head>
-    <title>${documentName}</title>
+    <title>${name}</title>
     <meta charset="UTF-8">
     <meta name="viewport" content="width=device-width, initial-scale=1">
     <link rel="stylesheet" href="https://maxcdn.bootstrapcdn.com/bootstrap/4.1.3/css/bootstrap.min.css">
@@ -455,7 +455,7 @@ The provided FTL transforms an Excel into a HTML document supporting multiple Ex
 <body>
 <div class="container-fluid">
     <h1>Excel Test
-        <small>${documentName}, ${date}</small>
+        <small>${name}, ${date}</small>
     </h1>
     <@writeSheets workbook/>
 </div>
@@ -535,8 +535,8 @@ The FTL uses a couple of interesting features
 <#ftl output_format="plainText" strip_text="true">
 <#compress>
     TENANT,SITE,USER_ID,DISPOSER_ID,PASSWORD,SMS_OTP,NAME,DESCRIPTION
-    <#list Documents.list as document>
-        <#assign properties = PropertiesTool.parse(document)>
+    <#list Datasources.list as datasource>
+        <#assign properties = PropertiesTool.parse(datasource)>
         <#assign environments = properties["ENVIRONMENTS"]!"">
         <#assign tenant = extractTenant(environments)>
         <#assign site = extractSite(environments)>
@@ -565,10 +565,10 @@ For a POC (proof of concept) I created a sample transformation from CSV to XML-F
 
 ```text
 <#ftl output_format="XML" >
-<#assign document = Documents.get(0)>
-<#assign name = document.name>
+<#assign datasource = Datasources.get(0)>
+<#assign name = datasource.name>
 <#assign cvsFormat = CSVTool.formats.DEFAULT.withDelimiter('\t').withHeader()>
-<#assign csvParser = CSVTool.parse(document, cvsFormat)>
+<#assign csvParser = CSVTool.parse(datasource, cvsFormat)>
 <#assign csvHeaders = csvParser.getHeaderMap()?keys>
 <#assign csvRecords = csvParser.records>
 <#--------------------------------------------------------------------------->
@@ -686,9 +686,8 @@ Recently I got the rather unusual question how to determine the list of dependen
 
 ```text
 <#ftl output_format="plainText" strip_text="true">
-<#assign document = Documents.get(0)>
-<#assign documentName = document.name>
-<#assign html = JsoupTool.parse(document)>
+<#assign datasource = Datasources.get(0)>
+<#assign html = JsoupTool.parse(datasource)>
 
 <#compress>
     <@writeHeader/>
@@ -762,7 +761,7 @@ and the final FTL is found below
 ```text
 <#ftl output_format="plainText">
 <#assign cvsFormat = CSVTool.formats["DEFAULT"].withHeader()>
-<#assign csvParser = CSVTool.parse(Documents.get(0), cvsFormat)>
+<#assign csvParser = CSVTool.parse(Datasources.get(0), cvsFormat)>
 <#assign records = csvParser.records>
 <#assign csvMap = CSVTool.toMap(records, "disposer")>
 <#--------------------------------------------------------------------------->
@@ -846,8 +845,8 @@ using the following FreeMarker template
 ```text
 <#ftl output_format="plainText" strip_whitespace=true>
 <#assign grok = GrokTool.compile("%{COMBINEDAPACHELOG}")>
-<#assign document = Documents.get(0)>
-<#assign lines = document.getLineIterator()>
+<#assign datasource = Datasources.get(0)>
+<#assign lines = datasource.getLineIterator()>
 
 <#compress>
     TIMESTAMP;VERB;REQUEST;HTTPVERSION
@@ -865,7 +864,7 @@ using the following FreeMarker template
 While this looks small and tidy there are some nifty features
 
 * `GrokTool.compile("%{COMBINEDAPACHELOG}")` builds the `Grok` instance to parse access logs in `Combined Format`
-* The source document is streamed line by line and not loaded into memory in one piece
+* The datasource is streamed line by line and not loaded into memory in one piece
 * This also works for using `stdin` so are able to parse GB of access log or other files
 
 ## 6.11 CSV Transformation
@@ -878,7 +877,7 @@ renders the following template
 
 ```text
 <#ftl output_format="plainText" strip_text="true">
-<#assign csvParser = createCsvParser(Documents.get(0))>
+<#assign csvParser = createCsvParser(Datasources.get(0))>
 <#assign csvPrinter = createCsvPrinter()>
 <#-- Print each line without materializing the CSV in memory -->
 <#compress>
@@ -887,11 +886,11 @@ renders the following template
     </#list>
 </#compress>
 
-<#function createCsvParser document>
+<#function createCsvParser datasource>
     <#assign initialCvsInFormat = CSVTool.formats[SystemTool.getParameter("csv.in.format", "DEFAULT")]>
     <#assign csvInDelimiter = CSVTool.toDelimiter(SystemTool.getParameter("csv.in.delimiter", initialCvsInFormat.getDelimiter()))>
     <#assign cvsInFormat = initialCvsInFormat.withDelimiter(csvInDelimiter)>
-    <#return CSVTool.parse(document, cvsInFormat)>
+    <#return CSVTool.parse(datasource, cvsInFormat)>
 </#function>
 
 <#function createCsvPrinter>
@@ -981,13 +980,13 @@ Sometime you need to apply a CSS, JSON or XPath query in ad ad-hoc way without i
 > bin/freemarker-cli -i 'Hello ${SystemTool.envs["USER"]}'; echo
 Hello sgoeschl
 
-> bin/freemarker-cli -i '${JsonPathTool.parse(Documents.first).read("$.info.title")}' site/sample/json/swagger-spec.json; echo
+> bin/freemarker-cli -i '${JsonPathTool.parse(Datasources.first).read("$.info.title")}' site/sample/json/swagger-spec.json; echo
 Swagger Petstore
 
-> bin/freemarker-cli -i '${XmlTool.parse(Documents.first)["recipients/person[1]/name"]}' site/sample/xml/recipients.xml; echo
+> bin/freemarker-cli -i '${XmlTool.parse(Datasources.first)["recipients/person[1]/name"]}' site/sample/xml/recipients.xml; echo
 John Smith
 
-> bin/freemarker-cli -i '${JsoupTool.parse(Documents.first).select("a")[0]}' site/sample/html/dependencies.html; echo
+> bin/freemarker-cli -i '${JsoupTool.parse(Datasources.first).select("a")[0]}' site/sample/html/dependencies.html; echo
 <a href="${project.url}" title="FreeMarker CLI">FreeMarker CLI</a>
 
 > ./bin/freemarker-cli -i '<#list SystemTool.envs as name,value>${name} ==> ${value}${"\n"}</#list>'
@@ -1016,8 +1015,8 @@ and Apache FreeMarker template
 
 ```text
 <#ftl output_format="plainText" strip_text="true">
-<#assign document = Documents.get(0)>
-<#assign parser = parser(document)>
+<#assign datasource = Datasources.get(0)>
+<#assign parser = parser(datasource)>
 <#assign headers = parser.getHeaderNames()>
 <#assign column = SystemTool.getProperty("column")>
 <#assign values = SystemTool.getProperty("values")?split(",")>
@@ -1025,7 +1024,7 @@ and Apache FreeMarker template
 <#-- Process each line without materializing the whole file in memory -->
 
 <#compress>
-    <@writePageHeader document/>
+    <@writePageHeader datasource/>
     <#list parser.iterator() as record>
         <#if filter(record)>
             <@writeCsvRecord headers record/>
@@ -1033,18 +1032,18 @@ and Apache FreeMarker template
     </#list>
 </#compress>
 
-<#function parser document>
+<#function parser datasource>
     <#assign format = CSVTool.formats[SystemTool.getProperty("format", "DEFAULT")]>
     <#assign delimiter = CSVTool.toDelimiter(SystemTool.getProperty("delimiter", format.getDelimiter()))>
-    <#return CSVTool.parse(document, format.withFirstRecordAsHeader().withDelimiter(delimiter))>
+    <#return CSVTool.parse(datasource, format.withFirstRecordAsHeader().withDelimiter(delimiter))>
 </#function>
 
 <#function filter record>
     <#return values?seq_contains(record.get(column))>
 </#function>
 
-<#macro writePageHeader document>
-    # ${document.name}
+<#macro writePageHeader datasource>
+    # ${datasource.name}
 </#macro>
 
 <#macro writeCsvRecord headers record>
@@ -1189,13 +1188,13 @@ user.home    : /Users/sgoeschl
 - java.vendor.url ==> http://java.oracle.com/
 - java.vm.name ==> Java HotSpot(TM) 64-Bit Server VM
 
-11) Access Documents
+11) Access Datasources
 ---------------------------------------------------------------------------
-Get the number of documents:
+Get the number of datasources:
 - 0
 List all files containing "README" in the name
 List all files having "md" extension
-Get all documents
+Get all datasources
 
 12) FreeMarker CLI Tools
 ---------------------------------------------------------------------------
@@ -1215,7 +1214,7 @@ Get all documents
 13) Document Data Model
 ---------------------------------------------------------------------------
 - CSVTool
-- Documents
+- Datasources
 - ExcelTool
 - ExecTool
 - FreeMarkerTool
@@ -1255,19 +1254,19 @@ Sat Feb 22 16:54:20 CET 2020
 ## 7.1 How It Works
 
 * The user-supplied files are loaded or input is read from `stdin`
-* The FreeMarker data model containing the documents and tools is created and passed to the template
+* The FreeMarker data model containing the datasources and tools is created and passed to the template
 * The generated output is written to the user-supplied file or to `stdout`
 
 ## 7.2 FreeMarker Data Model
 
-Within the script a FreeMarker data model is set up and passed to the template - it contains the documents to be processed and the following tools
+Within the script a FreeMarker data model is set up and passed to the template - it contains the datasources to be processed and the following tools
 
 | Entry                 | Description                                                                                               |
 |-----------------------|-----------------------------------------------------------------------------------------------------------|
 | CSVTool               | Process CSV files using [Apache Commons CSV](https://commons.apache.org/proper/commons-csv/)              |
 | ExecTool              | Execute command line tools using [Apache Commons Exec](https://commons.apache.org/proper/commons-exec/)   |
 | ExcelTool             | Process Excels files (XLS, XLSX) using [Apache POI](https://poi.apache.org)                               |
-| Documents             | Helper class to find documents, e.g. by name, extension or index                                          |
+| Datasources           | Helper class to find datasources, e.g. by name, extension or index                                          |
 | FreeMarkerTool        | Expose useful FreeMarker classes                                                                          |
 | GrokTool              | Process text files using [Grok](https://github.com/thekrakken/java-grok) instead of regular expressions   |
 | JsonPathTool          | Process JSON file using [Java JSON Path](https://github.com/json-path/JsonPath)                           |
diff --git a/freemarker-generator-cli/run-samples.sh b/freemarker-generator-cli/run-samples.sh
index 4e0e867..1bc86d2 100755
--- a/freemarker-generator-cli/run-samples.sh
+++ b/freemarker-generator-cli/run-samples.sh
@@ -46,9 +46,9 @@ $FREEMARKER_CMD -t templates/demo.ftl README.md > target/out/demo.txt || { echo
 # Interactive Mode
 #############################################################################
 
-$FREEMARKER_CMD -i '${JsonPathTool.parse(Documents.first).read("$.info.title")}' site/sample/json/swagger-spec.json > target/out/interactive-json.txt || { echo >&2 "Test failed.  Aborting."; exit 1; }
-$FREEMARKER_CMD -i '${XmlTool.parse(Documents.first)["recipients/person[1]/name"]}' site/sample/xml/recipients.xml > target/out/interactive-xml.txt || { echo >&2 "Test failed.  Aborting."; exit 1; }
-$FREEMARKER_CMD -i '${JsoupTool.parse(Documents.first).select("a")[0]}' site/sample/html/dependencies.html > target/out/interactive-html.txt || { echo >&2 "Test failed.  Aborting."; exit 1; }
+$FREEMARKER_CMD -i '${JsonPathTool.parse(Datasources.first).read("$.info.title")}' site/sample/json/swagger-spec.json > target/out/interactive-json.txt || { echo >&2 "Test failed.  Aborting."; exit 1; }
+$FREEMARKER_CMD -i '${XmlTool.parse(Datasources.first)["recipients/person[1]/name"]}' site/sample/xml/recipients.xml > target/out/interactive-xml.txt || { echo >&2 "Test failed.  Aborting."; exit 1; }
+$FREEMARKER_CMD -i '${JsoupTool.parse(Datasources.first).select("a")[0]}' site/sample/html/dependencies.html > target/out/interactive-html.txt || { echo >&2 "Test failed.  Aborting."; exit 1; }
 
 #############################################################################
 # CSV
diff --git a/freemarker-generator-cli/src/main/java/org/apache/freemarker/generator/cli/Main.java b/freemarker-generator-cli/src/main/java/org/apache/freemarker/generator/cli/Main.java
index 5b7ac9b..82dbc6f 100644
--- a/freemarker-generator-cli/src/main/java/org/apache/freemarker/generator/cli/Main.java
+++ b/freemarker-generator-cli/src/main/java/org/apache/freemarker/generator/cli/Main.java
@@ -67,7 +67,7 @@ public class Main implements Callable<Integer> {
     @Option(names = { "-D", "--system-property" }, description = "Set system property")
     private Properties systemProperties;
 
-    @Option(names = { "-e", "--input-encoding" }, description = "Encoding of input documents", defaultValue = "UTF-8")
+    @Option(names = { "-e", "--input-encoding" }, description = "Encoding of datasource", defaultValue = "UTF-8")
     private String inputEncoding;
 
     @Option(names = { "-E", "--expose-env" }, description = "Expose environment variables and user-supplied properties globally")
@@ -85,16 +85,16 @@ public class Main implements Callable<Integer> {
     @Option(names = { "--config" }, defaultValue = FREEMARKER_CLI_PROPERTY_FILE, description = "FreeMarker CLI configuration file")
     private String configFile;
 
-    @Option(names = { "--include" }, description = "File pattern for document input directory")
+    @Option(names = { "--include" }, description = "File pattern for datasource input directory")
     private String include;
 
-    @Option(names = { "--exclude" }, description = "File pattern for document input directory")
+    @Option(names = { "--exclude" }, description = "File pattern for datasource input directory")
     private String exclude;
 
     @Option(names = { "--output-encoding" }, description = "Encoding of output, e.g. UTF-8", defaultValue = "UTF-8")
     private String outputEncoding;
 
-    @Option(names = { "--stdin" }, description = "Read input document from stdin")
+    @Option(names = { "--stdin" }, description = "Read datasource from stdin")
     private boolean readFromStdin;
 
     @Option(names = { "--times" }, defaultValue = "1", description = "Re-run X times for profiling")
diff --git a/freemarker-generator-cli/src/main/java/org/apache/freemarker/generator/cli/config/Suppliers.java b/freemarker-generator-cli/src/main/java/org/apache/freemarker/generator/cli/config/Suppliers.java
index 084be3d..7d2f5f1 100644
--- a/freemarker-generator-cli/src/main/java/org/apache/freemarker/generator/cli/config/Suppliers.java
+++ b/freemarker-generator-cli/src/main/java/org/apache/freemarker/generator/cli/config/Suppliers.java
@@ -1,7 +1,7 @@
 package org.apache.freemarker.generator.cli.config;
 
 import freemarker.cache.TemplateLoader;
-import org.apache.freemarker.generator.base.document.DocumentsSupplier;
+import org.apache.freemarker.generator.base.datasource.DatasourcesSupplier;
 import org.apache.freemarker.generator.base.file.PropertiesClassPathSupplier;
 import org.apache.freemarker.generator.base.file.PropertiesFileSystemSupplier;
 import org.apache.freemarker.generator.base.file.PropertiesSupplier;
@@ -33,8 +33,8 @@ public class Suppliers {
         return new ToolsSupplier(settings.getConfiguration(), settings.toMap());
     }
 
-    public static DocumentsSupplier documentsSupplier(Settings settings) {
-        return new DocumentsSupplier(settings.getSources(),
+    public static DatasourcesSupplier datasourcesSupplier(Settings settings) {
+        return new DatasourcesSupplier(settings.getSources(),
                 settings.getInclude(),
                 settings.getExclude(),
                 settings.getInputEncoding());
diff --git a/freemarker-generator-cli/src/main/java/org/apache/freemarker/generator/cli/task/FreeMarkerTask.java b/freemarker-generator-cli/src/main/java/org/apache/freemarker/generator/cli/task/FreeMarkerTask.java
index c09faae..f537309 100644
--- a/freemarker-generator-cli/src/main/java/org/apache/freemarker/generator/cli/task/FreeMarkerTask.java
+++ b/freemarker-generator-cli/src/main/java/org/apache/freemarker/generator/cli/task/FreeMarkerTask.java
@@ -20,9 +20,9 @@ import freemarker.template.Configuration;
 import freemarker.template.Template;
 import org.apache.commons.io.FileUtils;
 import org.apache.freemarker.generator.base.FreeMarkerConstants.Location;
-import org.apache.freemarker.generator.base.document.Document;
-import org.apache.freemarker.generator.base.document.DocumentFactory;
-import org.apache.freemarker.generator.base.document.Documents;
+import org.apache.freemarker.generator.base.datasource.Datasource;
+import org.apache.freemarker.generator.base.datasource.DatasourceFactory;
+import org.apache.freemarker.generator.base.datasource.Datasources;
 import org.apache.freemarker.generator.cli.config.Settings;
 
 import java.io.File;
@@ -38,9 +38,9 @@ import java.util.function.Supplier;
 import static java.nio.charset.StandardCharsets.UTF_8;
 import static java.util.Objects.requireNonNull;
 import static org.apache.freemarker.generator.base.FreeMarkerConstants.Location.STDIN;
-import static org.apache.freemarker.generator.base.FreeMarkerConstants.Model.DOCUMENTS;
+import static org.apache.freemarker.generator.base.FreeMarkerConstants.Model.DATASOURCES;
 import static org.apache.freemarker.generator.cli.config.Suppliers.configurationSupplier;
-import static org.apache.freemarker.generator.cli.config.Suppliers.documentsSupplier;
+import static org.apache.freemarker.generator.cli.config.Suppliers.datasourcesSupplier;
 import static org.apache.freemarker.generator.cli.config.Suppliers.toolsSupplier;
 
 /**
@@ -52,28 +52,28 @@ public class FreeMarkerTask implements Callable<Integer> {
 
     private final Settings settings;
     private final Supplier<Map<String, Object>> toolsSupplier;
-    private final Supplier<List<Document>> documentsSupplier;
+    private final Supplier<List<Datasource>> datasourcesSupplier;
     private final Supplier<Configuration> configurationSupplier;
 
     public FreeMarkerTask(Settings settings) {
-        this(settings, toolsSupplier(settings), documentsSupplier(settings), configurationSupplier(settings));
+        this(settings, toolsSupplier(settings), datasourcesSupplier(settings), configurationSupplier(settings));
     }
 
     public FreeMarkerTask(Settings settings,
                           Supplier<Map<String, Object>> toolsSupplier,
-                          Supplier<List<Document>> documentsSupplier,
+                          Supplier<List<Datasource>> datasourcesSupplier,
                           Supplier<Configuration> configurationSupplier) {
         this.settings = requireNonNull(settings);
         this.toolsSupplier = requireNonNull(toolsSupplier);
-        this.documentsSupplier = requireNonNull(documentsSupplier);
+        this.datasourcesSupplier = requireNonNull(datasourcesSupplier);
         this.configurationSupplier = requireNonNull(configurationSupplier);
     }
 
     @Override
     public Integer call() {
         final Template template = template(settings, configurationSupplier);
-        try (Writer writer = settings.getWriter(); Documents documents = documents(settings, documentsSupplier)) {
-            final Map<String, Object> dataModel = dataModel(settings, documents, toolsSupplier);
+        try (Writer writer = settings.getWriter(); Datasources datasources = datasources(settings, datasourcesSupplier)) {
+            final Map<String, Object> dataModel = dataModel(settings, datasources, toolsSupplier);
             template.process(dataModel, writer);
             return SUCCESS;
         } catch (RuntimeException e) {
@@ -83,16 +83,16 @@ public class FreeMarkerTask implements Callable<Integer> {
         }
     }
 
-    private static Documents documents(Settings settings, Supplier<List<Document>> documentsSupplier) {
-        final List<Document> documents = new ArrayList<>(documentsSupplier.get());
+    private static Datasources datasources(Settings settings, Supplier<List<Datasource>> datasourcesSupplier) {
+        final List<Datasource> datasources = new ArrayList<>(datasourcesSupplier.get());
 
-        // Add optional document from STDIN at the start of the list since
+        // Add optional datasource from STDIN at the start of the list since
         // this allows easy sequence slicing in FreeMarker.
         if (settings.isReadFromStdin()) {
-            documents.add(0, DocumentFactory.create(STDIN, System.in, STDIN, UTF_8));
+            datasources.add(0, DatasourceFactory.create(STDIN, System.in, STDIN, UTF_8));
         }
 
-        return new Documents(documents);
+        return new Datasources(datasources);
     }
 
     /**
@@ -122,10 +122,10 @@ public class FreeMarkerTask implements Callable<Integer> {
         }
     }
 
-    private static Map<String, Object> dataModel(Settings settings, Documents documents, Supplier<Map<String, Object>> tools) {
+    private static Map<String, Object> dataModel(Settings settings, Datasources datasources, Supplier<Map<String, Object>> tools) {
         final Map<String, Object> dataModel = new HashMap<>();
 
-        dataModel.put(DOCUMENTS, documents);
+        dataModel.put(DATASOURCES, datasources);
 
         if (settings.isEnvironmentExposed()) {
             // add all system & user-supplied properties as top-level entries
diff --git a/freemarker-generator-cli/src/main/scripts/run-samples.sh b/freemarker-generator-cli/src/main/scripts/run-samples.sh
index cf192cc..a751cc5 100755
--- a/freemarker-generator-cli/src/main/scripts/run-samples.sh
+++ b/freemarker-generator-cli/src/main/scripts/run-samples.sh
@@ -46,9 +46,9 @@ $FREEMARKER_CMD -t templates/demo.ftl README.md > target/out/demo.txt || { echo
 # Interactive Mode
 #############################################################################
 
-$FREEMARKER_CMD -i '${JsonPathTool.parse(Documents.first).read("$.info.title")}' site/sample/json/swagger-spec.json > target/out/interactive-json.txt || { echo >&2 "Test failed.  Aborting."; exit 1; }
-$FREEMARKER_CMD -i '${XmlTool.parse(Documents.first)["recipients/person[1]/name"]}' site/sample/xml/recipients.xml > target/out/interactive-xml.txt || { echo >&2 "Test failed.  Aborting."; exit 1; }
-$FREEMARKER_CMD -i '${JsoupTool.parse(Documents.first).select("a")[0]}' site/sample/html/dependencies.html > target/out/interactive-html.txt || { echo >&2 "Test failed.  Aborting."; exit 1; }
+$FREEMARKER_CMD -i '${JsonPathTool.parse(Datasources.first).read("$.info.title")}' site/sample/json/swagger-spec.json > target/out/interactive-json.txt || { echo >&2 "Test failed.  Aborting."; exit 1; }
+$FREEMARKER_CMD -i '${XmlTool.parse(Datasources.first)["recipients/person[1]/name"]}' site/sample/xml/recipients.xml > target/out/interactive-xml.txt || { echo >&2 "Test failed.  Aborting."; exit 1; }
+$FREEMARKER_CMD -i '${JsoupTool.parse(Datasources.first).select("a")[0]}' site/sample/html/dependencies.html > target/out/interactive-html.txt || { echo >&2 "Test failed.  Aborting."; exit 1; }
 
 #############################################################################
 # CSV
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 6e152dd..e5fa6ac 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
@@ -102,9 +102,9 @@ public class ExamplesTest extends AbstractMainTest {
 
     @Test
     public void shouldRunInteractiveTemplateExamples() throws IOException {
-        assertValid(execute("-i ${JsonPathTool.parse(Documents.first).read(\"$.info.title\")} site/sample/json/swagger-spec.json"));
-        assertValid(execute("-i ${XmlTool.parse(Documents.first)[\"recipients/person[1]/name\"]} site/sample/xml/recipients.xml"));
-        assertValid(execute("-i ${JsoupTool.parse(Documents.first).select(\"a\")[0]} site/sample/html/dependencies.html"));
+        assertValid(execute("-i ${JsonPathTool.parse(Datasources.first).read(\"$.info.title\")} site/sample/json/swagger-spec.json"));
+        assertValid(execute("-i ${XmlTool.parse(Datasources.first)[\"recipients/person[1]/name\"]} site/sample/xml/recipients.xml"));
+        assertValid(execute("-i ${JsoupTool.parse(Datasources.first).select(\"a\")[0]} site/sample/html/dependencies.html"));
     }
 
     @Test
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 81f47eb..35b1069 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
@@ -30,9 +30,9 @@ public class ManualTest {
     // private static final String CMD = "-b ./src/test -DFOO=foo -PBAR=bar -t templates/demo.ftl site/sample/csv/transactions.csv";
     // private static final String CMD = "-b ./src/test -Dcsv.out.format=TDF -t templates/csv/transform.ftl site/sample/csv/contract.csv";
     // private static final String CMD = "-t templates/excel/csv/transform.ftl -l de_AT site/sample/excel/test.xlsx";
-    // private static final String CMD = "-i ${JsonPathTool.parse(Documents.first).read('$.info.title')} site/sample/json/swagger-spec.json";
-    // private static final String CMD = "-i ${XmlTool.parse(Documents.first)['recipients/person[1]/name']} site/sample/xml/recipients.xml";
-    // private static final String CMD = "-i ${JsoupTool.parse(Documents.first).select('a')[0]} site/sample/html/dependencies.html";
+    // private static final String CMD = "-i ${JsonPathTool.parse(Datasources.first).read('$.info.title')} site/sample/json/swagger-spec.json";
+    // private static final String CMD = "-i ${XmlTool.parse(Datasources.first)['recipients/person[1]/name']} site/sample/xml/recipients.xml";
+    // private static final String CMD = "-i ${JsoupTool.parse(Datasources.first).select('a')[0]} site/sample/html/dependencies.html";
     // private static final String CMD = "-b ./src/test -t templates/properties/csv/locker-test-users.ftl site/sample/properties";
     // private static final String CMD = "-b ./src/test -e UTF-8 -l de_AT -Dcolumn=Order%20ID -Dvalues=226939189,957081544 -Dformat=DEFAULT -Ddelimiter=COMMA -t templates/csv/md/filter.ftl site/sample/csv/sales-records.csv";
     private static final String CMD = "-E -b ./src/test -t templates/environment.ftl";
diff --git a/freemarker-generator-cli/src/test/templates/echo.ftl b/freemarker-generator-cli/src/test/templates/echo.ftl
index 3499bb0..bbd148f 100644
--- a/freemarker-generator-cli/src/test/templates/echo.ftl
+++ b/freemarker-generator-cli/src/test/templates/echo.ftl
@@ -15,8 +15,8 @@
   specific language governing permissions and limitations
   under the License.
 -->
-<#list Documents.list as document>
-${document.name}, ${document.location}
+<#list Datasources.list as datasource>
+${datasource.name}, ${datasource.location}
 =============================================================================
-${document.text}
+${datasource.text}
 </#list>
\ No newline at end of file
diff --git a/freemarker-generator-cli/src/test/templates/tools/csv.ftl b/freemarker-generator-cli/src/test/templates/tools/csv.ftl
index 93b53f8..d069b57 100644
--- a/freemarker-generator-cli/src/test/templates/tools/csv.ftl
+++ b/freemarker-generator-cli/src/test/templates/tools/csv.ftl
@@ -15,7 +15,7 @@
   specific language governing permissions and limitations
   under the License.
 -->
-<#assign records = CSVTool.parse(Documents.get(0), CSVFormat.DEFAULT.withHeader()).records>
+<#assign records = CSVTool.parse(Datasources.get(0), CSVFormat.DEFAULT.withHeader()).records>
 
 CSVTool.toMap(name)
 =============================================================================
diff --git a/freemarker-generator-cli/templates/accesslog/combined-access.ftl b/freemarker-generator-cli/templates/accesslog/combined-access.ftl
index fbcb71e..817ec59 100644
--- a/freemarker-generator-cli/templates/accesslog/combined-access.ftl
+++ b/freemarker-generator-cli/templates/accesslog/combined-access.ftl
@@ -16,8 +16,8 @@
   under the License.
 -->
 <#assign grok = GrokTool.compile("%{COMBINEDAPACHELOG}")>
-<#assign document = Documents.get(0)>
-<#assign lines = document.getLineIterator()>
+<#assign datasource = Datasources.get(0)>
+<#assign lines = datasource.getLineIterator()>
 
 <#compress>
     TIMESTAMP;VERB;REQUEST;HTTPVERSION
diff --git a/freemarker-generator-cli/templates/cat.ftl b/freemarker-generator-cli/templates/cat.ftl
index 77fd4c2..820e4ff 100644
--- a/freemarker-generator-cli/templates/cat.ftl
+++ b/freemarker-generator-cli/templates/cat.ftl
@@ -15,7 +15,7 @@
   specific language governing permissions and limitations
   under the License.
 -->
-<#assign lines = Documents.get(0).getLineIterator()>
+<#assign lines = Datasources.get(0).getLineIterator()>
 <#compress>
     <#list lines as line>
         ${line}
diff --git a/freemarker-generator-cli/templates/csv/csv/gatling-user-credentials.ftl b/freemarker-generator-cli/templates/csv/csv/gatling-user-credentials.ftl
index 3cfe9e8..19bb9b9 100644
--- a/freemarker-generator-cli/templates/csv/csv/gatling-user-credentials.ftl
+++ b/freemarker-generator-cli/templates/csv/csv/gatling-user-credentials.ftl
@@ -15,9 +15,9 @@
   specific language governing permissions and limitations
   under the License.
 -->
-<#assign document = Documents.get(0)>
+<#assign datasource = Datasources.get(0)>
 <#assign cvsFormat = CSVTool.formats["DEFAULT"].withDelimiter(';')>
-<#assign csvParser = CSVTool.parse(document, cvsFormat)>
+<#assign csvParser = CSVTool.parse(datasource, cvsFormat)>
 <#assign csvRecords = csvParser.records>
 
 <#compress>
diff --git a/freemarker-generator-cli/templates/csv/fo/transactions.ftl b/freemarker-generator-cli/templates/csv/fo/transactions.ftl
index 4715484..ff9c009 100644
--- a/freemarker-generator-cli/templates/csv/fo/transactions.ftl
+++ b/freemarker-generator-cli/templates/csv/fo/transactions.ftl
@@ -15,10 +15,10 @@
   specific language governing permissions and limitations
   under the License.
 -->
-<#assign document = Documents.get(0)>
-<#assign name = document.name>
+<#assign datasource = Datasources.get(0)>
+<#assign name = datasource.name>
 <#assign cvsFormat = CSVTool.formats.DEFAULT.withDelimiter('\t').withHeader()>
-<#assign csvParser = CSVTool.parse(document, cvsFormat)>
+<#assign csvParser = CSVTool.parse(datasource, cvsFormat)>
 <#assign csvHeaders = csvParser.getHeaderMap()?keys>
 <#assign csvRecords = csvParser.records>
 <#--------------------------------------------------------------------------->
diff --git a/freemarker-generator-cli/templates/csv/fo/transform.ftl b/freemarker-generator-cli/templates/csv/fo/transform.ftl
index 38594cd..d20f625 100644
--- a/freemarker-generator-cli/templates/csv/fo/transform.ftl
+++ b/freemarker-generator-cli/templates/csv/fo/transform.ftl
@@ -17,7 +17,7 @@
 -->
 <#assign csvFormatName = SystemTool.parameters["csv.format"]!"DEFAULT">
 <#assign cvsFormat = CSVTool.formats[csvFormatName].withHeader()>
-<#assign csvParser = CSVTool.parse(Documents.get(0), cvsFormat)>
+<#assign csvParser = CSVTool.parse(Datasources.get(0), cvsFormat)>
 <#assign csvHeaders = csvParser.getHeaderMap()?keys>
 <#assign csvRecords = csvParser.records>
 <#--------------------------------------------------------------------------->
diff --git a/freemarker-generator-cli/templates/csv/html/transactions.ftl b/freemarker-generator-cli/templates/csv/html/transactions.ftl
index b31d6c0..9fae075 100644
--- a/freemarker-generator-cli/templates/csv/html/transactions.ftl
+++ b/freemarker-generator-cli/templates/csv/html/transactions.ftl
@@ -15,10 +15,10 @@
   specific language governing permissions and limitations
   under the License.
 -->
-<#assign document = Documents.get(0)>
-<#assign name = document.name>
+<#assign datasource = Datasources.get(0)>
+<#assign name = datasource.name>
 <#assign cvsFormat = CSVTool.formats["DEFAULT"].withDelimiter('\t').withHeader()>
-<#assign csvParser = CSVTool.parse(document, cvsFormat)>
+<#assign csvParser = CSVTool.parse(datasource, cvsFormat)>
 <#assign csvHeaders = csvParser.getHeaderMap()?keys>
 <#assign csvRecords = csvParser.records>
 <#--------------------------------------------------------------------------->
diff --git a/freemarker-generator-cli/templates/csv/html/transform.ftl b/freemarker-generator-cli/templates/csv/html/transform.ftl
index 54a805e..5985857 100644
--- a/freemarker-generator-cli/templates/csv/html/transform.ftl
+++ b/freemarker-generator-cli/templates/csv/html/transform.ftl
@@ -15,10 +15,10 @@
   specific language governing permissions and limitations
   under the License.
 -->
-<#assign document = Documents.get(0)>
-<#assign name = document.name>
+<#assign datasource = Datasources.get(0)>
+<#assign name = datasource.name>
 <#assign cvsFormat = CSVTool.formats["DEFAULT"].withHeader()>
-<#assign csvParser = CSVTool.parse(document, cvsFormat)>
+<#assign csvParser = CSVTool.parse(datasource, cvsFormat)>
 <#assign csvHeaders = csvParser.getHeaderNames()>
 <#--------------------------------------------------------------------------->
 <!DOCTYPE html>
diff --git a/freemarker-generator-cli/templates/csv/md/filter.ftl b/freemarker-generator-cli/templates/csv/md/filter.ftl
index 3967e0c..92a0304 100644
--- a/freemarker-generator-cli/templates/csv/md/filter.ftl
+++ b/freemarker-generator-cli/templates/csv/md/filter.ftl
@@ -15,14 +15,14 @@
   specific language governing permissions and limitations
   under the License.
 -->
-<#assign document = Documents.get(0)>
-<#assign parser = parser(document)>
+<#assign datasource = Datasources.get(0)>
+<#assign parser = parser(datasource)>
 <#assign headers = parser.getHeaderNames()>
 <#assign column = SystemTool.getParameter("column")>
 <#assign values = SystemTool.getParameter("values")?split(",")>
 
 <#compress>
-    <@writePageHeader document/>
+    <@writePageHeader datasource/>
     <#-- Process each line without materializing the whole file in memory -->
     <#list parser.iterator() as record>
         <#if filter(record)>
@@ -31,18 +31,18 @@
     </#list>
 </#compress>
 
-<#function parser document>
+<#function parser datasource>
     <#assign format = CSVTool.formats[SystemTool.getParameter("format", "DEFAULT")]>
     <#assign delimiter = CSVTool.toDelimiter(SystemTool.getParameter("delimiter", format.getDelimiter()))>
-    <#return CSVTool.parse(document, format.withFirstRecordAsHeader().withDelimiter(delimiter))>
+    <#return CSVTool.parse(datasource, format.withFirstRecordAsHeader().withDelimiter(delimiter))>
 </#function>
 
 <#function filter record>
     <#return values?seq_contains(record.get(column))>
 </#function>
 
-<#macro writePageHeader document>
-    # ${document.name}
+<#macro writePageHeader datasource>
+    # ${datasource.name}
 </#macro>
 
 <#macro writeCsvRecord headers record>
diff --git a/freemarker-generator-cli/templates/csv/md/transform.ftl b/freemarker-generator-cli/templates/csv/md/transform.ftl
index efcf276..994e3f3 100644
--- a/freemarker-generator-cli/templates/csv/md/transform.ftl
+++ b/freemarker-generator-cli/templates/csv/md/transform.ftl
@@ -16,7 +16,7 @@
   under the License.
 -->
 <#assign cvsFormat = CSVTool.formats["DEFAULT"].withHeader()>
-<#assign csvParser = CSVTool.parse(Documents.get(0), cvsFormat)>
+<#assign csvParser = CSVTool.parse(Datasources.get(0), cvsFormat)>
 <#assign csvHeaders = csvParser.getHeaderMap()?keys>
 <#assign csvRecords = csvParser.records>
 <#--------------------------------------------------------------------------->
diff --git a/freemarker-generator-cli/templates/csv/shell/curl.ftl b/freemarker-generator-cli/templates/csv/shell/curl.ftl
index 8df601f..d7c75c9 100644
--- a/freemarker-generator-cli/templates/csv/shell/curl.ftl
+++ b/freemarker-generator-cli/templates/csv/shell/curl.ftl
@@ -16,7 +16,7 @@
   under the License.
 -->
 <#assign cvsFormat = CSVTool.formats["DEFAULT"].withHeader()>
-<#assign csvParser = CSVTool.parse(Documents.get(0), cvsFormat)>
+<#assign csvParser = CSVTool.parse(Datasources.get(0), cvsFormat)>
 <#assign records = csvParser.records>
 <#assign csvMap = CSVTool.toMap(records, "disposer")>
 <#--------------------------------------------------------------------------->
diff --git a/freemarker-generator-cli/templates/csv/transform.ftl b/freemarker-generator-cli/templates/csv/transform.ftl
index 0380abb..e13c9b5 100644
--- a/freemarker-generator-cli/templates/csv/transform.ftl
+++ b/freemarker-generator-cli/templates/csv/transform.ftl
@@ -15,7 +15,7 @@
   specific language governing permissions and limitations
   under the License.
 -->
-<#assign csvParser = createCsvParser(Documents.get(0))>
+<#assign csvParser = createCsvParser(Datasources.get(0))>
 <#assign csvPrinter = createCsvPrinter()>
 <#-- Print each line without materializing the CSV in memory -->
 <#compress>
@@ -24,11 +24,11 @@
     </#list>
 </#compress>
 
-<#function createCsvParser document>
+<#function createCsvParser datasource>
     <#assign initialCvsInFormat = CSVTool.formats[SystemTool.getParameter("csv.in.format", "DEFAULT")]>
     <#assign csvInDelimiter = CSVTool.toDelimiter(SystemTool.getParameter("csv.in.delimiter", initialCvsInFormat.getDelimiter()))>
     <#assign cvsInFormat = initialCvsInFormat.withDelimiter(csvInDelimiter)>
-    <#return CSVTool.parse(document, cvsInFormat)>
+    <#return CSVTool.parse(datasource, cvsInFormat)>
 </#function>
 
 <#function createCsvPrinter>
diff --git a/freemarker-generator-cli/templates/demo.ftl b/freemarker-generator-cli/templates/demo.ftl
index b3cad69..f981a9e 100644
--- a/freemarker-generator-cli/templates/demo.ftl
+++ b/freemarker-generator-cli/templates/demo.ftl
@@ -45,11 +45,11 @@ java.math.RoundingMode#UP: ${FreeMarkerTool.enums["java.math.RoundingMode"].UP}
 - java.math.RoundingMode.${roundingMode}<#lt>
 </#list>
 
-6) Display list of input files
+6) Display list of datasources
 ---------------------------------------------------------------------------
-List all files:
-<#list Documents.list as document>
-- Document: name=${document.name} location=${document.location} length=${document.length} encoding=${document.encoding!""}
+List all datasources:
+<#list Datasources.list as datasource>
+- Document: name=${datasource.name} location=${datasource.location} length=${datasource.length} encoding=${datasource.encoding!""}
 </#list>
 
 7) SystemTool
@@ -83,25 +83,25 @@ user.home    : ${SystemTool.systemProperties["user.home"]!""}
 - ${name} ==> ${value}<#lt>
 </#list>
 
-11) Access Documents
+11) Access Datasources
 ---------------------------------------------------------------------------
 Get the number of documents:
-- ${Documents.size()}
-<#if !Documents.isEmpty()>
+- ${Datasources.size()}
+<#if !Datasources.isEmpty()>
 Get the first document
-- ${Documents.get(0)!"NA"}
+- ${Datasources.get(0)!"NA"}
 </#if>
 List all files containing "README" in the name
-<#list Documents.find("*README*") as document>
-- ${document.name}
+<#list Datasources.find("*README*") as datasource>
+- ${datasource.name}
 </#list>
 List all files having "md" extension
-<#list Documents.find("*.md") as document>
-- ${document.name}
+<#list Datasources.find("*.md") as datasource>
+- ${datasource.name}
 </#list>
 Get all documents
-<#list Documents.list as document>
-- ${document.name} => ${document.location}
+<#list Datasources.list as datasource>
+- ${datasource.name} => ${datasource.location}
 </#list>
 
 12) FreeMarker CLI Tools
diff --git a/freemarker-generator-cli/templates/excel/csv/custom.ftl b/freemarker-generator-cli/templates/excel/csv/custom.ftl
index 9235460..6d6f90a 100644
--- a/freemarker-generator-cli/templates/excel/csv/custom.ftl
+++ b/freemarker-generator-cli/templates/excel/csv/custom.ftl
@@ -17,8 +17,8 @@
 -->
 <#assign format = SystemTool.parameters["csv.format"]!"DEFAULT">
 <#assign salt = SystemTool.parameters["salt"]!"salt">
-<#-- Parse the first document & sheet of the Excel document -->
-<#assign workbook = ExcelTool.parse(Documents.get(0))>
+<#-- Parse the first datasource & sheet of the Excel document -->
+<#assign workbook = ExcelTool.parse(Datasources.get(0))>
 <#assign sheet = ExcelTool.getSheets(workbook)[0]>
 <#assign records = ExcelTool.toTable(sheet)>
 <#-- Setup CSVPrinter  -->
diff --git a/freemarker-generator-cli/templates/excel/csv/transform.ftl b/freemarker-generator-cli/templates/excel/csv/transform.ftl
index a1e2497..4ddc529 100644
--- a/freemarker-generator-cli/templates/excel/csv/transform.ftl
+++ b/freemarker-generator-cli/templates/excel/csv/transform.ftl
@@ -16,8 +16,8 @@
   under the License.
 -->
 <#assign format = SystemTool.parameters["csv.format"]!"DEFAULT">
-<#-- Parse the first document & sheet of the Excel document -->
-<#assign workbook = ExcelTool.parse(Documents.get(0))>
+<#-- Parse the first datasource & sheet of the Excel document -->
+<#assign workbook = ExcelTool.parse(Datasources.get(0))>
 <#assign sheet = ExcelTool.getSheets(workbook)[0]>
 <#assign records = ExcelTool.toTable(sheet)>
 <#-- Setup CSVPrinter  -->
diff --git a/freemarker-generator-cli/templates/excel/html/transform.ftl b/freemarker-generator-cli/templates/excel/html/transform.ftl
index 5fa4ad9..a261410 100644
--- a/freemarker-generator-cli/templates/excel/html/transform.ftl
+++ b/freemarker-generator-cli/templates/excel/html/transform.ftl
@@ -15,15 +15,15 @@
   specific language governing permissions and limitations
   under the License.
 -->
-<#assign document = Documents.get(0)>
-<#assign documentName = document.name>
-<#assign workbook = ExcelTool.parse(document)>
+<#assign datasource = Datasources.get(0)>
+<#assign name = datasource.name>
+<#assign workbook = ExcelTool.parse(datasource)>
 <#assign date = .now?iso_utc>
 <#--------------------------------------------------------------------------->
 <!DOCTYPE html>
 <html>
 <head>
-    <title>${documentName}</title>
+    <title>${name}</title>
     <meta charset="UTF-8">
     <meta name="viewport" content="width=device-width, initial-scale=1">
     <link rel="stylesheet" href="https://maxcdn.bootstrapcdn.com/bootstrap/4.1.3/css/bootstrap.min.css">
@@ -31,7 +31,7 @@
 <body>
 <div class="container-fluid">
     <h1>Excel Test
-        <small>${documentName}, ${date}</small>
+        <small>${name}, ${date}</small>
     </h1>
     <@writeSheets workbook/>
 </div>
diff --git a/freemarker-generator-cli/templates/excel/md/transform.ftl b/freemarker-generator-cli/templates/excel/md/transform.ftl
index 6ce112e..9b3a068 100644
--- a/freemarker-generator-cli/templates/excel/md/transform.ftl
+++ b/freemarker-generator-cli/templates/excel/md/transform.ftl
@@ -15,13 +15,13 @@
   specific language governing permissions and limitations
   under the License.
 -->
-<#assign document = Documents.get(0)>
-<#assign documentName = document.name>
-<#assign workbook = ExcelTool.parse(document)>
+<#assign datasource = Datasources.get(0)>
+<#assign name = datasource.name>
+<#assign workbook = ExcelTool.parse(datasource)>
 <#assign date = .now?iso_utc>
 
 <#compress>
-    # ${documentName}
+    # ${name}
     <@writeSheets workbook/>
 </#compress>
 ${'\n'}
diff --git a/freemarker-generator-cli/templates/html/csv/dependencies.ftl b/freemarker-generator-cli/templates/html/csv/dependencies.ftl
index 0eaad6c..b0df23e 100644
--- a/freemarker-generator-cli/templates/html/csv/dependencies.ftl
+++ b/freemarker-generator-cli/templates/html/csv/dependencies.ftl
@@ -15,9 +15,9 @@
   specific language governing permissions and limitations
   under the License.
 -->
-<#assign document = Documents.get(0)>
-<#assign documentName = document.name>
-<#assign html = JsoupTool.parse(document)>
+<#assign datasource = Datasources.get(0)>
+<#assign name = datasource.name>
+<#assign html = JsoupTool.parse(datasource)>
 
 <#compress>
     <@writeHeader/>
diff --git a/freemarker-generator-cli/templates/info.ftl b/freemarker-generator-cli/templates/info.ftl
index 9f2fbe8..3ec4891 100644
--- a/freemarker-generator-cli/templates/info.ftl
+++ b/freemarker-generator-cli/templates/info.ftl
@@ -39,10 +39,10 @@ FreeMarker CLI Tools
 </#if>
 </#list>
 
-FreeMarker CLI Documents
+FreeMarker CLI Datasources
 ---------------------------------------------------------------------------
-<#list Documents.list as document>
-[${document?counter}] ${document.name}, ${document.location}, ${document.length} Bytes
+<#list Datasources.list as datasource>
+[${datasource?counter}] ${datasource.name}, ${datasource.location}, ${datasource.length} Bytes
 </#list>
 
 User Supplied Parameters
diff --git a/freemarker-generator-cli/templates/json/csv/swagger-endpoints.ftl b/freemarker-generator-cli/templates/json/csv/swagger-endpoints.ftl
index 7e34ac5..61b9f78 100644
--- a/freemarker-generator-cli/templates/json/csv/swagger-endpoints.ftl
+++ b/freemarker-generator-cli/templates/json/csv/swagger-endpoints.ftl
@@ -15,7 +15,7 @@
   specific language governing permissions and limitations
   under the License.
 -->
-<#assign json = JsonPathTool.parse(Documents.get(0))>
+<#assign json = JsonPathTool.parse(Datasources.get(0))>
 <#assign basePath = json.read("$.basePath")>
 <#assign paths = json.read("$.paths")>
 
diff --git a/freemarker-generator-cli/templates/json/md/github-users.ftl b/freemarker-generator-cli/templates/json/md/github-users.ftl
index 581d1ca..5aecf18 100644
--- a/freemarker-generator-cli/templates/json/md/github-users.ftl
+++ b/freemarker-generator-cli/templates/json/md/github-users.ftl
@@ -15,7 +15,7 @@ KIND, either express or implied.  See the License for the
 specific language governing permissions and limitations
 under the License.
 -->
-<#assign json = JsonPathTool.parse(Documents.get(0))>
+<#assign json = JsonPathTool.parse(Datasources.get(0))>
 <#assign users = json.read("$[*]")>
 <#--------------------------------------------------------------------------->
 # GitHub Users
diff --git a/freemarker-generator-cli/templates/properties/csv/locker-test-users.ftl b/freemarker-generator-cli/templates/properties/csv/locker-test-users.ftl
index 4328182..237b71f 100644
--- a/freemarker-generator-cli/templates/properties/csv/locker-test-users.ftl
+++ b/freemarker-generator-cli/templates/properties/csv/locker-test-users.ftl
@@ -17,8 +17,8 @@
 -->
 <#compress>
     TENANT,SITE,USER_ID,DISPOSER_ID,PASSWORD,SMS_OTP,NAME,DESCRIPTION
-    <#list Documents.list as document>
-        <#assign properties = PropertiesTool.parse(document)>
+    <#list Datasources.list as datasource>
+        <#assign properties = PropertiesTool.parse(datasource)>
         <#assign environments = properties["ENVIRONMENTS"]!"">
         <#assign tenant = extractTenant(environments)>
         <#assign site = extractSite(environments)>
diff --git a/freemarker-generator-cli/templates/tsv/fo/transactions.ftl b/freemarker-generator-cli/templates/tsv/fo/transactions.ftl
index 2485e48..99b7a1c 100644
--- a/freemarker-generator-cli/templates/tsv/fo/transactions.ftl
+++ b/freemarker-generator-cli/templates/tsv/fo/transactions.ftl
@@ -16,7 +16,7 @@
   under the License.
 -->
 <#assign cvsFormat = CSVTool.formats["TDF"].withHeader()>
-<#assign csvParser = CSVTool.parse(Documents.get(0), cvsFormat)>
+<#assign csvParser = CSVTool.parse(Datasources.get(0), cvsFormat)>
 <#assign csvHeaders = csvParser.getHeaderMap()?keys>
 <#assign csvRecords = csvParser.records>
 <#--------------------------------------------------------------------------->
diff --git a/freemarker-generator-cli/templates/xml/txt/recipients.ftl b/freemarker-generator-cli/templates/xml/txt/recipients.ftl
index 434d7ea..87a9f57 100644
--- a/freemarker-generator-cli/templates/xml/txt/recipients.ftl
+++ b/freemarker-generator-cli/templates/xml/txt/recipients.ftl
@@ -15,7 +15,7 @@
   specific language governing permissions and limitations
   under the License.
 -->
-<#assign xml = XmlTool.parse(Documents.get(0))>
+<#assign xml = XmlTool.parse(Datasources.get(0))>
 <#list xml.recipients.person as recipient>
 To: ${recipient.name}
 ${recipient.address}
diff --git a/freemarker-generator-cli/templates/yaml/txt/transform.ftl b/freemarker-generator-cli/templates/yaml/txt/transform.ftl
index 00911bc..07160cf 100644
--- a/freemarker-generator-cli/templates/yaml/txt/transform.ftl
+++ b/freemarker-generator-cli/templates/yaml/txt/transform.ftl
@@ -15,7 +15,7 @@
   specific language governing permissions and limitations
   under the License.
 -->
-<#assign map = YamlTool.parse(Documents.get(0))>
+<#assign map = YamlTool.parse(Datasources.get(0))>
 <#--------------------------------------------------------------------------->
 <#compress>
 <@print map 1/>
diff --git a/freemarker-generator-tools/README.md b/freemarker-generator-tools/README.md
index 12d1c61..6a1e74e 100644
--- a/freemarker-generator-tools/README.md
+++ b/freemarker-generator-tools/README.md
@@ -7,9 +7,9 @@ Design Considerations
 ------------------------------------------------------------------------------
 
 * A tool shall expose a default constructor and/or a constructor taking a `Map<String, Object> settings`
-* A tool processing documents shall provide a `parse(Document document)` method
+* A tool processing datasources shall provide a `parse(Datasource)` method
 * A tool shall be stateless, multi-thread safe and potentially long-lived to enable usage in a different context
-* A tool shall support arbitrary large source documents and process them efficiently
+* A tool shall support arbitrary large source datasources and process them efficiently
 * A tool shall expose a `toString()` method for documentation purposes
 
 Available Tools
diff --git a/freemarker-generator-tools/pom.xml b/freemarker-generator-tools/pom.xml
index 32fa5b7..8a2d0c8 100644
--- a/freemarker-generator-tools/pom.xml
+++ b/freemarker-generator-tools/pom.xml
@@ -27,7 +27,7 @@
 
     <artifactId>freemarker-generator-tools</artifactId>
     <name>Apache FreeMarker Generator: Tools</name>
-    <description>Document processing tools for Apache FreeMarker Generator</description>
+    <description>Datasource processing tools for Apache FreeMarker Generator</description>
 
     <properties>
         <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
diff --git a/freemarker-generator-tools/src/main/java/org/apache/freemarker/generator/tools/commonscsv/CommonsCSVTool.java b/freemarker-generator-tools/src/main/java/org/apache/freemarker/generator/tools/commonscsv/CommonsCSVTool.java
index da7779a..755ea33 100644
--- a/freemarker-generator-tools/src/main/java/org/apache/freemarker/generator/tools/commonscsv/CommonsCSVTool.java
+++ b/freemarker-generator-tools/src/main/java/org/apache/freemarker/generator/tools/commonscsv/CommonsCSVTool.java
@@ -21,7 +21,7 @@ import org.apache.commons.csv.CSVParser;
 import org.apache.commons.csv.CSVPrinter;
 import org.apache.commons.csv.CSVRecord;
 import org.apache.commons.io.input.BOMInputStream;
-import org.apache.freemarker.generator.base.document.Document;
+import org.apache.freemarker.generator.base.datasource.Datasource;
 import org.apache.freemarker.generator.base.util.StringUtils;
 
 import java.io.IOException;
@@ -44,23 +44,23 @@ import static org.apache.commons.io.IOUtils.toInputStream;
 
 public class CommonsCSVTool {
 
-    public CSVParser parse(Document document) {
-        return parse(document, CSVFormat.DEFAULT);
+    public CSVParser parse(Datasource da) {
+        return parse(da, CSVFormat.DEFAULT);
     }
 
-    public CSVParser parse(Document document, CSVFormat format) {
-        if (document == null) {
-            throw new IllegalArgumentException("No document was provided");
+    public CSVParser parse(Datasource datasource, CSVFormat format) {
+        if (datasource == null) {
+            throw new IllegalArgumentException("No datasource was provided");
         }
 
         try {
             // As stated in the documentation : "If you do not read all records from the given {@code reader},
             // you should call {@link #close()} on the parser, unless you close the {@code reader}."
-            // The underlying input stream is closed by the document by its "CloseableReaper".
-            final InputStream is = new BOMInputStream(document.getInputStream(), false);
-            return parse(is, document.getCharset(), format);
+            // The underlying input stream is closed by the datasource by its "CloseableReaper".
+            final InputStream is = new BOMInputStream(datasource.getInputStream(), false);
+            return parse(is, datasource.getCharset(), format);
         } catch (IOException e) {
-            throw new RuntimeException("Failed to parse CSV: " + document, e);
+            throw new RuntimeException("Failed to parse CSV: " + datasource, e);
         }
     }
 
diff --git a/freemarker-generator-tools/src/main/java/org/apache/freemarker/generator/tools/excel/ExcelTool.java b/freemarker-generator-tools/src/main/java/org/apache/freemarker/generator/tools/excel/ExcelTool.java
index 43fa5ea..8f2d635 100644
--- a/freemarker-generator-tools/src/main/java/org/apache/freemarker/generator/tools/excel/ExcelTool.java
+++ b/freemarker-generator-tools/src/main/java/org/apache/freemarker/generator/tools/excel/ExcelTool.java
@@ -16,7 +16,7 @@
  */
 package org.apache.freemarker.generator.tools.excel;
 
-import org.apache.freemarker.generator.base.document.Document;
+import org.apache.freemarker.generator.base.datasource.Datasource;
 import org.apache.poi.ss.usermodel.Cell;
 import org.apache.poi.ss.usermodel.CellType;
 import org.apache.poi.ss.usermodel.DataFormatter;
@@ -47,13 +47,13 @@ public class ExcelTool {
     private static final SimpleDateFormat TIME_DATE_FORMAT = new SimpleDateFormat("HH:mm:ss");
     private static final SimpleDateFormat YEAR_TIME_FORMAT = new SimpleDateFormat("yyyy");
 
-    public Workbook parse(Document document) {
-        try (InputStream is = document.getUnsafeInputStream()) {
+    public Workbook parse(Datasource datasource) {
+        try (InputStream is = datasource.getUnsafeInputStream()) {
             final Workbook workbook = WorkbookFactory.create(is);
-            // make sure that the workbook is closed together with the document
-            return document.addClosable(workbook);
+            // make sure that the workbook is closed together with the datasource
+            return datasource.addClosable(workbook);
         } catch (IOException e) {
-            throw new RuntimeException("Failed to parse Ecxel document: " + document, e);
+            throw new RuntimeException("Failed to parse Ecxel datasource: " + datasource, e);
         }
     }
 
diff --git a/freemarker-generator-tools/src/main/java/org/apache/freemarker/generator/tools/jsonpath/JsonPathTool.java b/freemarker-generator-tools/src/main/java/org/apache/freemarker/generator/tools/jsonpath/JsonPathTool.java
index 3e31ffc..1859428 100644
--- a/freemarker-generator-tools/src/main/java/org/apache/freemarker/generator/tools/jsonpath/JsonPathTool.java
+++ b/freemarker-generator-tools/src/main/java/org/apache/freemarker/generator/tools/jsonpath/JsonPathTool.java
@@ -20,15 +20,15 @@ import com.jayway.jsonpath.Configuration;
 import com.jayway.jsonpath.DocumentContext;
 import com.jayway.jsonpath.JsonPath;
 import com.jayway.jsonpath.Option;
-import org.apache.freemarker.generator.base.document.Document;
+import org.apache.freemarker.generator.base.datasource.Datasource;
 
 import java.io.IOException;
 import java.io.InputStream;
 
 public class JsonPathTool {
 
-    public DocumentContext parse(Document document) throws IOException {
-        try (InputStream is = document.getUnsafeInputStream()) {
+    public DocumentContext parse(Datasource datasource) throws IOException {
+        try (InputStream is = datasource.getUnsafeInputStream()) {
             return JsonPath.using(configuration()).parse(is);
         }
     }
diff --git a/freemarker-generator-tools/src/main/java/org/apache/freemarker/generator/tools/jsoup/JsoupTool.java b/freemarker-generator-tools/src/main/java/org/apache/freemarker/generator/tools/jsoup/JsoupTool.java
index 62d0944..0e18ad8 100644
--- a/freemarker-generator-tools/src/main/java/org/apache/freemarker/generator/tools/jsoup/JsoupTool.java
+++ b/freemarker-generator-tools/src/main/java/org/apache/freemarker/generator/tools/jsoup/JsoupTool.java
@@ -16,7 +16,7 @@
  */
 package org.apache.freemarker.generator.tools.jsoup;
 
-import org.apache.freemarker.generator.base.document.Document;
+import org.apache.freemarker.generator.base.datasource.Datasource;
 import org.jsoup.Jsoup;
 
 import java.io.IOException;
@@ -24,11 +24,11 @@ import java.io.InputStream;
 
 public class JsoupTool {
 
-    public org.jsoup.nodes.Document parse(Document document) {
-        try (InputStream is = document.getUnsafeInputStream()) {
-            return Jsoup.parse(is, document.getCharset().name(), "");
+    public org.jsoup.nodes.Document parse(Datasource datasource) {
+        try (InputStream is = datasource.getUnsafeInputStream()) {
+            return Jsoup.parse(is, datasource.getCharset().name(), "");
         } catch (IOException e) {
-            throw new RuntimeException("Failed to parse HTML document: " + document, e);
+            throw new RuntimeException("Failed to parse HTML datasource: " + datasource, e);
         }
     }
 
diff --git a/freemarker-generator-tools/src/main/java/org/apache/freemarker/generator/tools/properties/PropertiesTool.java b/freemarker-generator-tools/src/main/java/org/apache/freemarker/generator/tools/properties/PropertiesTool.java
index 96acb0d..09d2549 100644
--- a/freemarker-generator-tools/src/main/java/org/apache/freemarker/generator/tools/properties/PropertiesTool.java
+++ b/freemarker-generator-tools/src/main/java/org/apache/freemarker/generator/tools/properties/PropertiesTool.java
@@ -16,7 +16,7 @@
  */
 package org.apache.freemarker.generator.tools.properties;
 
-import org.apache.freemarker.generator.base.document.Document;
+import org.apache.freemarker.generator.base.datasource.Datasource;
 import org.apache.freemarker.generator.base.util.PropertiesFactory;
 
 import java.io.IOException;
@@ -25,11 +25,11 @@ import java.util.Properties;
 
 public class PropertiesTool {
 
-    public Properties parse(Document document) {
-        try (InputStream is = document.getUnsafeInputStream()) {
+    public Properties parse(Datasource datasource) {
+        try (InputStream is = datasource.getUnsafeInputStream()) {
             return PropertiesFactory.create(is);
         } catch (IOException e) {
-            throw new RuntimeException("Failed to parse properties: " + document, e);
+            throw new RuntimeException("Failed to parse properties: " + datasource, e);
         }
     }
 
diff --git a/freemarker-generator-tools/src/main/java/org/apache/freemarker/generator/tools/snakeyaml/SnakeYamlTool.java b/freemarker-generator-tools/src/main/java/org/apache/freemarker/generator/tools/snakeyaml/SnakeYamlTool.java
index 96bc938..1ee005d 100644
--- a/freemarker-generator-tools/src/main/java/org/apache/freemarker/generator/tools/snakeyaml/SnakeYamlTool.java
+++ b/freemarker-generator-tools/src/main/java/org/apache/freemarker/generator/tools/snakeyaml/SnakeYamlTool.java
@@ -16,7 +16,7 @@
  */
 package org.apache.freemarker.generator.tools.snakeyaml;
 
-import org.apache.freemarker.generator.base.document.Document;
+import org.apache.freemarker.generator.base.datasource.Datasource;
 import org.yaml.snakeyaml.Yaml;
 
 import java.io.IOException;
@@ -25,11 +25,11 @@ import java.util.Map;
 
 public class SnakeYamlTool {
 
-    public Map<String, Object> parse(Document document) {
-        try (InputStream is = document.getUnsafeInputStream()) {
+    public Map<String, Object> parse(Datasource datasource) {
+        try (InputStream is = datasource.getUnsafeInputStream()) {
             return new Yaml().load(is);
         } catch (IOException e) {
-            throw new RuntimeException("Failed to load YAML document: " + document, e);
+            throw new RuntimeException("Failed to load YAML datasource: " + datasource, e);
         }
     }
 
diff --git a/freemarker-generator-tools/src/main/java/org/apache/freemarker/generator/tools/xml/XmlTool.java b/freemarker-generator-tools/src/main/java/org/apache/freemarker/generator/tools/xml/XmlTool.java
index 5977ae7..a80b579 100644
--- a/freemarker-generator-tools/src/main/java/org/apache/freemarker/generator/tools/xml/XmlTool.java
+++ b/freemarker-generator-tools/src/main/java/org/apache/freemarker/generator/tools/xml/XmlTool.java
@@ -17,7 +17,7 @@
 package org.apache.freemarker.generator.tools.xml;
 
 import freemarker.ext.dom.NodeModel;
-import org.apache.freemarker.generator.base.document.Document;
+import org.apache.freemarker.generator.base.datasource.Datasource;
 import org.xml.sax.InputSource;
 
 import java.io.InputStream;
@@ -25,11 +25,11 @@ import java.io.StringReader;
 
 public class XmlTool {
 
-    public NodeModel parse(Document document) {
-        try (InputStream is = document.getUnsafeInputStream()) {
+    public NodeModel parse(Datasource datasource) {
+        try (InputStream is = datasource.getUnsafeInputStream()) {
             return NodeModel.parse(new InputSource(is));
         } catch (Exception e) {
-            throw new RuntimeException("Failed to parse XML document: " + document, e);
+            throw new RuntimeException("Failed to parse XML datasource: " + datasource, e);
         }
     }
 
@@ -37,7 +37,7 @@ public class XmlTool {
         try (StringReader reader = new StringReader(value)) {
             return NodeModel.parse(new InputSource(reader));
         } catch (Exception e) {
-            throw new RuntimeException("Failed to parse XML document: " + value, e);
+            throw new RuntimeException("Failed to parse XML string: " + value, e);
         }
     }
 
diff --git a/freemarker-generator-tools/src/test/java/org/apache/freemarker/generator/tools/commonscsv/CommonsCSVToolTest.java b/freemarker-generator-tools/src/test/java/org/apache/freemarker/generator/tools/commonscsv/CommonsCSVToolTest.java
index 770309e..d60a070 100644
--- a/freemarker-generator-tools/src/test/java/org/apache/freemarker/generator/tools/commonscsv/CommonsCSVToolTest.java
+++ b/freemarker-generator-tools/src/test/java/org/apache/freemarker/generator/tools/commonscsv/CommonsCSVToolTest.java
@@ -20,8 +20,8 @@ import org.apache.commons.csv.CSVFormat;
 import org.apache.commons.csv.CSVParser;
 import org.apache.commons.csv.CSVPrinter;
 import org.apache.commons.csv.CSVRecord;
-import org.apache.freemarker.generator.base.document.Document;
-import org.apache.freemarker.generator.base.document.DocumentFactory;
+import org.apache.freemarker.generator.base.datasource.Datasource;
+import org.apache.freemarker.generator.base.datasource.DatasourceFactory;
 import org.junit.Test;
 
 import java.io.File;
@@ -48,7 +48,7 @@ public class CommonsCSVToolTest {
 
     @Test
     public void shallParseCvsFile() throws IOException {
-        try (CSVParser parser = commonsCsvTool().parse(document(), DEFAULT.withHeader())) {
+        try (CSVParser parser = commonsCsvTool().parse(datasource(), DEFAULT.withHeader())) {
             assertNotNull(parser);
             assertEquals(32, parser.getHeaderMap().size());
             assertEquals(22, parser.getRecords().size());
@@ -57,7 +57,7 @@ public class CommonsCSVToolTest {
 
     @Test
     public void shallParseCvsString() throws IOException {
-        try (CSVParser parser = commonsCsvTool().parse(document().getText(), DEFAULT.withHeader())) {
+        try (CSVParser parser = commonsCsvTool().parse(datasource().getText(), DEFAULT.withHeader())) {
             assertNotNull(parser);
             assertEquals(32, parser.getHeaderMap().size());
             assertEquals(22, parser.getRecords().size());
@@ -69,7 +69,7 @@ public class CommonsCSVToolTest {
         final CommonsCSVTool commonsCsvTool = commonsCsvTool();
         final List<String> keys;
 
-        try (CSVParser parser = commonsCsvTool.parse(document(), DEFAULT.withHeader())) {
+        try (CSVParser parser = commonsCsvTool.parse(datasource(), DEFAULT.withHeader())) {
             keys = commonsCsvTool.toKeys(parser.getRecords(), CONTRACT_ID);
         }
 
@@ -89,7 +89,7 @@ public class CommonsCSVToolTest {
         final CommonsCSVTool commonsCsvTool = commonsCsvTool();
         final Map<String, CSVRecord> map;
 
-        try (CSVParser parser = commonsCsvTool.parse(document(), DEFAULT.withHeader())) {
+        try (CSVParser parser = commonsCsvTool.parse(datasource(), DEFAULT.withHeader())) {
             map = commonsCsvTool.toMap(parser.getRecords(), CONTRACT_ID);
         }
 
@@ -102,7 +102,7 @@ public class CommonsCSVToolTest {
         final CommonsCSVTool commonsCsvTool = commonsCsvTool();
         final Map<String, List<CSVRecord>> map;
 
-        try (CSVParser parser = commonsCsvTool.parse(document(), DEFAULT.withHeader())) {
+        try (CSVParser parser = commonsCsvTool.parse(datasource(), DEFAULT.withHeader())) {
             map = commonsCsvTool.toMultiMap(parser.getRecords(), CONTRACT_ID);
         }
 
@@ -116,7 +116,7 @@ public class CommonsCSVToolTest {
         final CSVFormat cvsFormat = DEFAULT.withHeader();
         final Writer writer = new StringWriter();
 
-        try (CSVParser parser = commonsCsvTool.parse(document(), cvsFormat)) {
+        try (CSVParser parser = commonsCsvTool.parse(datasource(), cvsFormat)) {
             try (CSVPrinter printer = commonsCsvTool.printer(cvsFormat, writer)) {
                 printer.printRecord(parser.getHeaderMap());
             }
@@ -127,7 +127,7 @@ public class CommonsCSVToolTest {
 
     @Test
     public void shallStripBomFromCsvFile() throws IOException {
-        try (CSVParser parser = commonsCsvTool().parse(document(BOM_CSV), EXCEL.withHeader().withDelimiter(';'))) {
+        try (CSVParser parser = commonsCsvTool().parse(datasource(BOM_CSV), EXCEL.withHeader().withDelimiter(';'))) {
             assertEquals("Text", parser.getHeaderNames().get(0));
         }
     }
@@ -139,12 +139,12 @@ public class CommonsCSVToolTest {
         assertEquals('^', commonsCsvTool().toDelimiter("^"));
     }
 
-    private Document document() {
-        return document(TEST_CSV);
+    private Datasource datasource() {
+        return datasource(TEST_CSV);
     }
 
-    private Document document(File file) {
-        return DocumentFactory.create(file, UTF_8);
+    private Datasource datasource(File file) {
+        return DatasourceFactory.create(file, UTF_8);
     }
 
     private CommonsCSVTool commonsCsvTool() {
diff --git a/freemarker-generator-tools/src/test/java/org/apache/freemarker/generator/tools/excel/ExcelToolTest.java b/freemarker-generator-tools/src/test/java/org/apache/freemarker/generator/tools/excel/ExcelToolTest.java
index 9003a38..1583001 100644
--- a/freemarker-generator-tools/src/test/java/org/apache/freemarker/generator/tools/excel/ExcelToolTest.java
+++ b/freemarker-generator-tools/src/test/java/org/apache/freemarker/generator/tools/excel/ExcelToolTest.java
@@ -16,8 +16,8 @@
  */
 package org.apache.freemarker.generator.tools.excel;
 
-import org.apache.freemarker.generator.base.document.Document;
-import org.apache.freemarker.generator.base.document.DocumentFactory;
+import org.apache.freemarker.generator.base.datasource.Datasource;
+import org.apache.freemarker.generator.base.datasource.DatasourceFactory;
 import org.apache.poi.ss.usermodel.Sheet;
 import org.apache.poi.ss.usermodel.Workbook;
 import org.junit.Test;
@@ -102,14 +102,14 @@ public class ExcelToolTest {
     }
 
     private Workbook workbook(File file) {
-        return excelTool().parse(document(file));
+        return excelTool().parse(datasource(file));
     }
 
     private ExcelTool excelTool() {
         return new ExcelTool();
     }
 
-    private Document document(File file) {
-        return DocumentFactory.create(file, UTF_8);
+    private Datasource datasource(File file) {
+        return DatasourceFactory.create(file, UTF_8);
     }
 }
diff --git a/freemarker-generator-tools/src/test/java/org/apache/freemarker/generator/tools/properties/PropertiesToolTest.java b/freemarker-generator-tools/src/test/java/org/apache/freemarker/generator/tools/properties/PropertiesToolTest.java
index 8e010e7..3a29908 100644
--- a/freemarker-generator-tools/src/test/java/org/apache/freemarker/generator/tools/properties/PropertiesToolTest.java
+++ b/freemarker-generator-tools/src/test/java/org/apache/freemarker/generator/tools/properties/PropertiesToolTest.java
@@ -16,8 +16,8 @@
  */
 package org.apache.freemarker.generator.tools.properties;
 
-import org.apache.freemarker.generator.base.document.Document;
-import org.apache.freemarker.generator.base.document.DocumentFactory;
+import org.apache.freemarker.generator.base.datasource.Datasource;
+import org.apache.freemarker.generator.base.datasource.DatasourceFactory;
 import org.junit.Test;
 
 import static junit.framework.TestCase.assertEquals;
@@ -27,9 +27,9 @@ public class PropertiesToolTest {
     private static final String ANY_PROPERTIES_STRING = "foo=bar";
 
     @Test
-    public void shallParsePropertiesDocument() {
-        try (Document document = document(ANY_PROPERTIES_STRING)) {
-            assertEquals("bar", propertiesTool().parse(document).getProperty("foo"));
+    public void shallParsePropertiesDatasource() {
+        try (Datasource datasource = datasource(ANY_PROPERTIES_STRING)) {
+            assertEquals("bar", propertiesTool().parse(datasource).getProperty("foo"));
         }
     }
 
@@ -42,7 +42,7 @@ public class PropertiesToolTest {
         return new PropertiesTool();
     }
 
-    private Document document(String value) {
-        return DocumentFactory.create("test.properties", value);
+    private Datasource datasource(String value) {
+        return DatasourceFactory.create("test.properties", value);
     }
 }
diff --git a/freemarker-generator-tools/src/test/java/org/apache/freemarker/generator/tools/snakeyaml/SnakeYamlToolTest.java b/freemarker-generator-tools/src/test/java/org/apache/freemarker/generator/tools/snakeyaml/SnakeYamlToolTest.java
index 4a522b6..ee34a28 100644
--- a/freemarker-generator-tools/src/test/java/org/apache/freemarker/generator/tools/snakeyaml/SnakeYamlToolTest.java
+++ b/freemarker-generator-tools/src/test/java/org/apache/freemarker/generator/tools/snakeyaml/SnakeYamlToolTest.java
@@ -16,8 +16,8 @@
  */
 package org.apache.freemarker.generator.tools.snakeyaml;
 
-import org.apache.freemarker.generator.base.document.Document;
-import org.apache.freemarker.generator.base.document.DocumentFactory;
+import org.apache.freemarker.generator.base.datasource.Datasource;
+import org.apache.freemarker.generator.base.datasource.DatasourceFactory;
 import org.junit.Test;
 
 import java.util.List;
@@ -34,9 +34,9 @@ public class SnakeYamlToolTest {
             "    - image: postgres:9.4.1";
 
     @Test
-    public void shallParseYamlDocument() {
-        try (Document document = document(ANY_YAML_STRING)) {
-            final Map<String, Object> map = snakeYamlTool().parse(document);
+    public void shallParseYamlDatasource() {
+        try (Datasource datasource = datasource(ANY_YAML_STRING)) {
+            final Map<String, Object> map = snakeYamlTool().parse(datasource);
 
             assertEquals(1, map.size());
             assertEquals(3, ((List<?>) map.get("docker")).size());
@@ -55,7 +55,7 @@ public class SnakeYamlToolTest {
         return new SnakeYamlTool();
     }
 
-    private Document document(String value) {
-        return DocumentFactory.create("test.yml", value);
+    private Datasource datasource(String value) {
+        return DatasourceFactory.create("test.yml", value);
     }
 }
diff --git a/freemarker-generator-tools/src/test/java/org/apache/freemarker/generator/tools/xml/XmlToolTest.java b/freemarker-generator-tools/src/test/java/org/apache/freemarker/generator/tools/xml/XmlToolTest.java
index de69881..79a5432 100644
--- a/freemarker-generator-tools/src/test/java/org/apache/freemarker/generator/tools/xml/XmlToolTest.java
+++ b/freemarker-generator-tools/src/test/java/org/apache/freemarker/generator/tools/xml/XmlToolTest.java
@@ -17,8 +17,8 @@
 package org.apache.freemarker.generator.tools.xml;
 
 import freemarker.ext.dom.NodeModel;
-import org.apache.freemarker.generator.base.document.Document;
-import org.apache.freemarker.generator.base.document.DocumentFactory;
+import org.apache.freemarker.generator.base.datasource.Datasource;
+import org.apache.freemarker.generator.base.datasource.DatasourceFactory;
 import org.junit.Test;
 
 import static junit.framework.TestCase.assertEquals;
@@ -35,9 +35,9 @@ public class XmlToolTest {
             "</note>";
 
     @Test
-    public void shallParseXmlDocument() throws Exception {
-        try (Document document = document(ANY_XML_STRING)) {
-            final NodeModel model = xmlTool().parse(document);
+    public void shallParseXmlDatasource() throws Exception {
+        try (Datasource datasource = datasource(ANY_XML_STRING)) {
+            final NodeModel model = xmlTool().parse(datasource);
 
             assertNotNull(model);
             assertEquals(1, model.getChildNodes().size());
@@ -56,7 +56,7 @@ public class XmlToolTest {
         return new XmlTool();
     }
 
-    private Document document(String value) {
-        return DocumentFactory.create("test.xml", value);
+    private Datasource datasource(String value) {
+        return DatasourceFactory.create("test.xml", value);
     }
 }