Parse list of `DataSources` for the various tools
diff --git a/freemarker-generator-cli/CHANGELOG.md b/freemarker-generator-cli/CHANGELOG.md
index 2b564b3..c6abcd7 100644
--- a/freemarker-generator-cli/CHANGELOG.md
+++ b/freemarker-generator-cli/CHANGELOG.md
@@ -5,6 +5,7 @@
 ## 0.1.0-SNAPSHOT
 
 ### Added
+* Parse list of `DataSources` for the various tools
 * [FREEMARKER-163] Integrate Java Faker library for test data generation
 * [FREEMARKER-148] Make usage of "DataSources" more "Freemarker" like
 * [FREEMARKER-149] Support multiple template transformations on the command line
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 1dcda46..552ae16 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
@@ -47,6 +47,12 @@
         return parse(dataSource, defaultCSVInputFormat());
     }
 
+    public List<CSVParser> parse(Collection<DataSource> dataSources) {
+        return dataSources.stream()
+                .map(this::parse)
+                .collect(Collectors.toList());
+    }
+
     public CSVParser parse(DataSource dataSource, CSVFormat format) {
         if (dataSource == null) {
             throw new IllegalArgumentException("No data source was provided");
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 406a927..eff89ea 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
@@ -32,9 +32,11 @@
 import java.time.LocalDateTime;
 import java.time.ZoneId;
 import java.util.ArrayList;
+import java.util.Collection;
 import java.util.Date;
 import java.util.Iterator;
 import java.util.List;
+import java.util.stream.Collectors;
 
 import static org.apache.poi.ss.usermodel.Row.MissingCellPolicy.CREATE_NULL_AS_BLANK;
 
@@ -57,6 +59,12 @@
         }
     }
 
+    public List<Workbook> parse(Collection<DataSource> dataSources) {
+        return dataSources.stream()
+                .map(this::parse)
+                .collect(Collectors.toList());
+    }
+
     /**
      * Get all sheets of a workbook.
      *
diff --git a/freemarker-generator-tools/src/main/java/org/apache/freemarker/generator/tools/gson/GsonTool.java b/freemarker-generator-tools/src/main/java/org/apache/freemarker/generator/tools/gson/GsonTool.java
index dd8128b..96f02bd 100644
--- a/freemarker-generator-tools/src/main/java/org/apache/freemarker/generator/tools/gson/GsonTool.java
+++ b/freemarker-generator-tools/src/main/java/org/apache/freemarker/generator/tools/gson/GsonTool.java
@@ -23,6 +23,9 @@
 
 import java.io.IOException;
 import java.io.InputStreamReader;
+import java.util.Collection;
+import java.util.List;
+import java.util.stream.Collectors;
 
 /**
  * JSON processing using <a href="https://github.com/google/gson">Google GSON</a>
@@ -46,6 +49,18 @@
     }
 
     /**
+     * Parse a list of data sources.
+     *
+     * @param dataSources list of data sources
+     * @return list of parsed JSON (either as a map or list)
+     */
+    public List<Object> parse(Collection<DataSource> dataSources) {
+        return dataSources.stream()
+                .map(this::parse)
+                .collect(Collectors.toList());
+    }
+
+    /**
      * Parse a JSON object string.
      *
      * @param json Json string
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 8bd38e7..e57898c 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
@@ -24,15 +24,26 @@
 
 import java.io.IOException;
 import java.io.InputStream;
+import java.util.Collection;
+import java.util.List;
+import java.util.stream.Collectors;
 
 public class JsonPathTool {
 
-    public DocumentContext parse(DataSource dataSource) throws IOException {
+    public DocumentContext parse(DataSource dataSource) {
         try (InputStream is = dataSource.getUnsafeInputStream()) {
             return JsonPath.using(configuration()).parse(is);
+        } catch (IOException e) {
+            throw new RuntimeException("Failed to parse data source:" + dataSource, e);
         }
     }
 
+    public List<DocumentContext> parse(Collection<DataSource> dataSources) {
+        return dataSources.stream()
+                .map(this::parse)
+                .collect(Collectors.toList());
+    }
+
     public DocumentContext parse(String json) {
         return JsonPath.using(configuration()).parse(json);
     }
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 6656e2d..0f520fa 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
@@ -21,7 +21,10 @@
 
 import java.io.IOException;
 import java.io.InputStream;
+import java.util.Collection;
+import java.util.List;
 import java.util.Properties;
+import java.util.stream.Collectors;
 
 public class PropertiesTool {
 
@@ -33,6 +36,12 @@
         }
     }
 
+    public List<Properties> parse(Collection<DataSource> dataSources) {
+        return dataSources.stream()
+                .map(this::parse)
+                .collect(Collectors.toList());
+    }
+
     public Properties parse(String value) {
         return PropertiesFactory.create(value);
     }
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 efacaea..5516d0d 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
@@ -22,6 +22,9 @@
 
 import java.io.IOException;
 import java.io.InputStream;
+import java.util.Collection;
+import java.util.List;
+import java.util.stream.Collectors;
 
 import static org.yaml.snakeyaml.DumperOptions.FlowStyle.BLOCK;
 
@@ -37,6 +40,12 @@
         }
     }
 
+    public List<Object> parse(Collection<DataSource> dataSources) {
+        return dataSources.stream()
+                .map(this::parse)
+                .collect(Collectors.toList());
+    }
+
     public Object parse(String yaml) {
         return yaml().load(yaml);
     }
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 ddacf1c..6404fd4 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
@@ -22,6 +22,9 @@
 
 import java.io.InputStream;
 import java.io.StringReader;
+import java.util.Collection;
+import java.util.List;
+import java.util.stream.Collectors;
 
 public class XmlTool {
 
@@ -33,6 +36,12 @@
         }
     }
 
+    public List<NodeModel> parse(Collection<DataSource> dataSources) {
+        return dataSources.stream()
+                .map(this::parse)
+                .collect(Collectors.toList());
+    }
+
     public NodeModel parse(String value) {
         try (StringReader reader = new StringReader(value)) {
             return NodeModel.parse(new InputSource(reader));
diff --git a/freemarker-generator-tools/src/test/java/org/apache/freemarker/generator/tools/gson/GsonToolTest.java b/freemarker-generator-tools/src/test/java/org/apache/freemarker/generator/tools/gson/GsonToolTest.java
index 1914fda..965b62f 100644
--- a/freemarker-generator-tools/src/test/java/org/apache/freemarker/generator/tools/gson/GsonToolTest.java
+++ b/freemarker-generator-tools/src/test/java/org/apache/freemarker/generator/tools/gson/GsonToolTest.java
@@ -16,10 +16,14 @@
  */
 package org.apache.freemarker.generator.tools.gson;
 
+import org.apache.freemarker.generator.base.datasource.DataSource;
+import org.apache.freemarker.generator.base.datasource.DataSourceFactory;
+import org.apache.freemarker.generator.base.mime.Mimetypes;
 import org.junit.Test;
 
 import java.io.File;
 import java.io.IOException;
+import java.util.Arrays;
 import java.util.List;
 import java.util.Map;
 
@@ -104,7 +108,7 @@
 
     @Test
     @SuppressWarnings("unchecked")
-    public void shouldParseJsonWithComemnts() {
+    public void shouldParseJsonWithComments() {
         final Map<String, Object> map = (Map) gsonTool.parse(JSON_WITH_COMMENTS);
 
         assertEquals("Apple", map.get("fruit"));
@@ -123,6 +127,25 @@
 
     @Test
     @SuppressWarnings("unchecked")
+    public void shouldParseDataSource() {
+        final DataSource dataSource = dataSource();
+        final Map<String, Object> map = (Map) gsonTool.parse(dataSource);
+
+        assertEquals(3, map.size());
+        assertEquals("110.0", map.get("id").toString());
+        assertEquals("Python", map.get("language"));
+        assertEquals("1900.0", map.get("price").toString());
+    }
+
+    @Test
+    public void shouldParseDataSources() {
+        final List<DataSource> dataSources = Arrays.asList(dataSource(), dataSource());
+        final List<Object> jsonList = gsonTool.parse(dataSources);
+
+        assertEquals(2, jsonList.size());
+    }
+
+    @Test
     public void shouldConvertToJson() {
         assertEquals(JSON_OBJECT, gsonTool.toJson(gsonTool.parse(JSON_OBJECT)));
         assertEquals(JSON_OBJECT_WITH_ARRAY, gsonTool.toJson(gsonTool.parse(JSON_OBJECT_WITH_ARRAY)));
@@ -140,4 +163,8 @@
     private GsonTool gsonTool() {
         return new GsonTool();
     }
+
+    private DataSource dataSource() {
+        return DataSourceFactory.fromString("name", "group", JSON_OBJECT, Mimetypes.MIME_APPLICATION_JSON);
+    }
 }
diff --git a/freemarker-generator-tools/src/test/java/org/apache/freemarker/generator/tools/jsoup/JsoupToolTest.java b/freemarker-generator-tools/src/test/java/org/apache/freemarker/generator/tools/jsoup/JsoupToolTest.java
index a8f3a61..88f396a 100644
--- a/freemarker-generator-tools/src/test/java/org/apache/freemarker/generator/tools/jsoup/JsoupToolTest.java
+++ b/freemarker-generator-tools/src/test/java/org/apache/freemarker/generator/tools/jsoup/JsoupToolTest.java
@@ -54,6 +54,4 @@
     private JsoupTool jsoupTool() {
         return new JsoupTool();
     }
-
-
 }