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

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


The following commit(s) were added to refs/heads/FREEMARKER-144 by this push:
     new 1ac8ec1  FREEMARKER-144 Proof Of Concept for providing DataFrames
1ac8ec1 is described below

commit 1ac8ec1f049b9820bc92d4a0a923802119a14241
Author: Siegfried Goeschl <[email protected]>
AuthorDate: Thu Jun 4 12:29:26 2020 +0200

    FREEMARKER-144 Proof Of Concept for providing DataFrames
---
 freemarker-generator-cli/README.md                 |  2 +-
 freemarker-generator-cli/nginx.yaml                |  2 +
 freemarker-generator-cli/run-samples.sh            |  2 +-
 .../site/template/application.properties           |  2 +-
 .../site/template/nginx/nginx.conf.ftl             |  2 +-
 .../generator/cli/config/DataModelSupplier.java    | 47 +++++++++++++-------
 .../src/main/scripts/run-samples.sh                |  2 +-
 .../markdown/cli/usage/transforming-directories.md | 21 ++++++++-
 .../src/test/data/json/list.json                   |  1 +
 .../freemarker/generator/cli/ExamplesTest.java     |  6 +--
 .../freemarker/generator/cli/ManualTest.java       |  3 +-
 .../cli/config/DataModelSupplierTest.java          | 47 ++++++++++++++------
 .../templates/json/csv/swagger-endpoints.ftl       |  2 +-
 .../templates/json/yaml/transform.ftl              |  2 +-
 .../freemarker/generator/tools/gson/GsonTool.java  | 49 +++------------------
 .../generator/tools/snakeyaml/SnakeYamlTool.java   |  7 ++-
 .../tools/dataframe/DataFrameToolTest.java         | 11 +----
 .../generator/tools/gson/GsonToolTest.java         | 22 ++++++----
 .../tools/snakeyaml/SnakeYamlToolTest.java         | 50 ++++++++++++++++------
 19 files changed, 160 insertions(+), 120 deletions(-)

diff --git a/freemarker-generator-cli/README.md 
b/freemarker-generator-cli/README.md
index 6c6ee23..587dadb 100644
--- a/freemarker-generator-cli/README.md
+++ b/freemarker-generator-cli/README.md
@@ -1119,7 +1119,7 @@ Sometimes we simply need to transform a JSON into an 
equivalent YAML or the othe
 > ./bin/freemarker-cli -i '${GsonTool.toJson(yaml)}' -m 
 > yaml=site/sample/yaml/swagger-spec.yaml
 
 > ./bin/freemarker-cli -t templates/json/yaml/transform.ftl 
 > site/sample/json/swagger-spec.json
-> ./bin/freemarker-cli -i 
'${YamlTool.toYaml(GsonTool.toMap(DataSources.get(0)))}' 
site/sample/json/swagger-spec.json
+> ./bin/freemarker-cli -i 
'${YamlTool.toYaml(GsonTool.parse(DataSources.get(0)))}' 
site/sample/json/swagger-spec.json
 > ./bin/freemarker-cli -i '${YamlTool.toYaml(json)}' -m 
 > json=site/sample/json/swagger-spec.json
 ```
 
diff --git a/freemarker-generator-cli/nginx.yaml 
b/freemarker-generator-cli/nginx.yaml
new file mode 100644
index 0000000..5c005c4
--- /dev/null
+++ b/freemarker-generator-cli/nginx.yaml
@@ -0,0 +1,2 @@
+- NGINX_PORT: 8443
+- NGINX_HOSTNAME: localhost
diff --git a/freemarker-generator-cli/run-samples.sh 
b/freemarker-generator-cli/run-samples.sh
index cdc3d6a..c6600cb 100755
--- a/freemarker-generator-cli/run-samples.sh
+++ b/freemarker-generator-cli/run-samples.sh
@@ -50,7 +50,7 @@ $FREEMARKER_CMD -i 
'${JsonPathTool.parse(DataSources.first).read("$.info.title")
 $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; }
 $FREEMARKER_CMD -i '${GsonTool.toJson(YamlTool.parse(DataSources.get(0)))}' 
site/sample/yaml/swagger-spec.yaml > target/out/interactive-swagger.json || { 
echo >&2 "Test failed.  Aborting."; exit 1; }
-$FREEMARKER_CMD -i '${YamlTool.toYaml(GsonTool.toMap(DataSources.get(0)))}' 
site/sample/json/swagger-spec.json > target/out/interactive-swagger.yaml || { 
echo >&2 "Test failed.  Aborting."; exit 1; }
+$FREEMARKER_CMD -i '${YamlTool.toYaml(GsonTool.parse(DataSources.get(0)))}' 
site/sample/json/swagger-spec.json > target/out/interactive-swagger.yaml || { 
echo >&2 "Test failed.  Aborting."; exit 1; }
 
 #############################################################################
 # CSV
diff --git a/freemarker-generator-cli/site/template/application.properties 
b/freemarker-generator-cli/site/template/application.properties
index d5f2114..fe83a14 100644
--- a/freemarker-generator-cli/site/template/application.properties
+++ b/freemarker-generator-cli/site/template/application.properties
@@ -15,5 +15,5 @@ specific language governing permissions and limitations
 under the License.
 -->
 # == application.properties ==================================================
-server.name=${NGINX_HOSTNAME!"somehost"}
+server.name=${NGINX_HOSTNAME!"127.0.0.1"}
 server.logs=${NGINX_LOGS!"/var/log/nginx"}
diff --git a/freemarker-generator-cli/site/template/nginx/nginx.conf.ftl 
b/freemarker-generator-cli/site/template/nginx/nginx.conf.ftl
index ac57019..72a1b3a 100644
--- a/freemarker-generator-cli/site/template/nginx/nginx.conf.ftl
+++ b/freemarker-generator-cli/site/template/nginx/nginx.conf.ftl
@@ -17,7 +17,7 @@
 # == nginx-conf =============================================================
 server {
   listen ${NGINX_PORT!"80"};
-  server_name ${NGINX_HOSTNAME!"somehost"};
+  server_name ${NGINX_HOSTNAME!"127.0.0.1"};
 
   root ${NGINX_WEBROOT!"/usr/share/nginx/www"};
   index index.htm;
diff --git 
a/freemarker-generator-cli/src/main/java/org/apache/freemarker/generator/cli/config/DataModelSupplier.java
 
b/freemarker-generator-cli/src/main/java/org/apache/freemarker/generator/cli/config/DataModelSupplier.java
index e09a74c..79d94b0 100644
--- 
a/freemarker-generator-cli/src/main/java/org/apache/freemarker/generator/cli/config/DataModelSupplier.java
+++ 
b/freemarker-generator-cli/src/main/java/org/apache/freemarker/generator/cli/config/DataModelSupplier.java
@@ -30,13 +30,14 @@ import java.net.URI;
 import java.util.ArrayList;
 import java.util.Collection;
 import java.util.HashMap;
+import java.util.List;
 import java.util.Map;
 import java.util.Map.Entry;
 import java.util.Properties;
 import java.util.function.Supplier;
+import java.util.stream.Collectors;
 
 import static java.util.Objects.requireNonNull;
-import static java.util.stream.Collectors.toMap;
 import static 
org.apache.freemarker.generator.base.mime.Mimetypes.MIME_APPLICATION_JSON;
 import static 
org.apache.freemarker.generator.base.mime.Mimetypes.MIME_TEXT_PLAIN;
 import static 
org.apache.freemarker.generator.base.mime.Mimetypes.MIME_TEXT_YAML;
@@ -62,12 +63,12 @@ public class DataModelSupplier implements 
Supplier<Map<String, Object>> {
     public Map<String, Object> get() {
         return sources.stream()
                 .filter(StringUtils::isNotEmpty)
-                .map(this::toDataModel)
+                .map(DataModelSupplier::toDataModel)
                 .flatMap(map -> map.entrySet().stream())
-                .collect(toMap(Entry::getKey, Entry::getValue));
+                .collect(Collectors.toMap(Entry::getKey, Entry::getValue));
     }
 
-    protected Map<String, Object> toDataModel(String source) {
+    private static Map<String, Object> toDataModel(String source) {
         final NamedUri namedUri = NamedUriStringParser.parse(source);
         final DataSource dataSource = DataSourceFactory.fromNamedUri(namedUri);
         final boolean isExplodedDataModel = !namedUri.hasName();
@@ -84,19 +85,19 @@ public class DataModelSupplier implements 
Supplier<Map<String, Object>> {
         }
     }
 
-    private Map<String, Object> fromJson(DataSource dataSource, boolean 
isExplodedDataModel) {
+    private static Map<String, Object> fromJson(DataSource dataSource, boolean 
isExplodedDataModel) {
         final GsonTool gsonTool = new GsonTool();
-        final Map<String, Object> map = gsonTool.toMap(dataSource);
-        return fromMap(dataSource.getName(), map, isExplodedDataModel);
+        final Object json = gsonTool.parse(dataSource);
+        return toMap(dataSource.getName(), json, isExplodedDataModel);
     }
 
-    private Map<String, Object> fromYaml(DataSource dataSource, boolean 
isExplodedDataModel) {
+    private static Map<String, Object> fromYaml(DataSource dataSource, boolean 
isExplodedDataModel) {
         final SnakeYamlTool snakeYamlTool = new SnakeYamlTool();
-        final Map<String, Object> map = snakeYamlTool.parse(dataSource);
-        return fromMap(dataSource.getName(), map, isExplodedDataModel);
+        final Object yaml = snakeYamlTool.parse(dataSource);
+        return toMap(dataSource.getName(), yaml, isExplodedDataModel);
     }
 
-    private Map<String, Object> fromProperties(DataSource dataSource, boolean 
isExplodedDataModel) {
+    private static Map<String, Object> fromProperties(DataSource dataSource, 
boolean isExplodedDataModel) {
         final Map<String, Object> result = new HashMap<>();
         final URI uri = dataSource.getUri();
 
@@ -114,13 +115,27 @@ public class DataModelSupplier implements 
Supplier<Map<String, Object>> {
         return result;
     }
 
-    private Map<String, Object> fromMap(String name, Map<String, Object> map, 
boolean isExplodedDataModel) {
+    @SuppressWarnings("unchecked")
+    private static Map<String, Object> toMap(String name, Object obj, boolean 
isExplodedDataModel) {
         final Map<String, Object> result = new HashMap<>();
 
-        if (isExplodedDataModel) {
-            map.forEach(result::put);
-        } else {
-            result.put(name, map);
+        if (obj instanceof Map) {
+            final Map<String, Object> map = (Map<String, Object>) obj;
+            if (isExplodedDataModel) {
+                map.forEach(result::put);
+            } else {
+                result.put(name, map);
+            }
+        } else if (obj instanceof List) {
+            final List<Object> list = (List<Object>) obj;
+            if (isExplodedDataModel) {
+                for (Object entry : list) {
+                    final Map<String, Object> map = (Map<String, Object>) 
entry;
+                    map.forEach(result::put);
+                }
+            } else {
+                result.put(name, list);
+            }
         }
 
         return result;
diff --git a/freemarker-generator-cli/src/main/scripts/run-samples.sh 
b/freemarker-generator-cli/src/main/scripts/run-samples.sh
index ee8571e..98c6391 100755
--- a/freemarker-generator-cli/src/main/scripts/run-samples.sh
+++ b/freemarker-generator-cli/src/main/scripts/run-samples.sh
@@ -50,7 +50,7 @@ $FREEMARKER_CMD -i 
'${JsonPathTool.parse(DataSources.first).read("$.info.title")
 $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; }
 $FREEMARKER_CMD -i '${GsonTool.toJson(YamlTool.parse(DataSources.get(0)))}' 
site/sample/yaml/swagger-spec.yaml > target/out/interactive-swagger.json || { 
echo >&2 "Test failed.  Aborting."; exit 1; }
-$FREEMARKER_CMD -i '${YamlTool.toYaml(GsonTool.toMap(DataSources.get(0)))}' 
site/sample/json/swagger-spec.json > target/out/interactive-swagger.yaml || { 
echo >&2 "Test failed.  Aborting."; exit 1; }
+$FREEMARKER_CMD -i '${YamlTool.toYaml(GsonTool.parse(DataSources.get(0)))}' 
site/sample/json/swagger-spec.json > target/out/interactive-swagger.yaml || { 
echo >&2 "Test failed.  Aborting."; exit 1; }
 
 #############################################################################
 # CSV
diff --git 
a/freemarker-generator-cli/src/site/markdown/cli/usage/transforming-directories.md
 
b/freemarker-generator-cli/src/site/markdown/cli/usage/transforming-directories.md
index 3181907..62af750 100644
--- 
a/freemarker-generator-cli/src/site/markdown/cli/usage/transforming-directories.md
+++ 
b/freemarker-generator-cli/src/site/markdown/cli/usage/transforming-directories.md
@@ -33,7 +33,7 @@ total 8
 drwxr-xr-x  3 sgoeschl  staff   96 May 30 20:02 nginx
 ```
 
-### Pass Parameter On The Command Line
+### Use Command Line Parameters
 
 ```
 bin/freemarker-cli -t site/template/ -P NGINX_HOSTNAME=localhost
@@ -102,13 +102,30 @@ server {
   root /usr/share/nginx/www;
   index index.htm;
 }
+```
+
+### Use YAML File
+
+```
+echo -e "- NGINX_PORT": "\"8443\"\n- NGINX_HOSTNAME": "localhost" > nginx.yaml
+bin/freemarker-cli -t site/template/ -m nginx.yaml 
+# == application.properties ==================================================
+server.name=localhost
+server.logs=/var/log/nginx
+# == nginx-conf =============================================================
+server {
+  listen 8443;
+  server_name localhost;
 
+  root /usr/share/nginx/www;
+  index index.htm;
+}
 ```
 
 ### Use Environment Variable With JSON Payload
 
 ```
-export NGINX_CONF='{"NGINX_PORT":"8443","NGINX_HOSTNAME":"localhost"}'
+export NGINX_CONF='{"NGINX_PORT":"8443","NGINX_HOSTNAME":"somehost"}'
 echo $NGINX_CONF
 {"NGINX_PORT":"8443","NGINX_HOSTNAME":"localhost"}
 bin/freemarker-cli -t site/template/ -m 
env:///NGINX_CONF#mimetype=application/json
diff --git a/freemarker-generator-cli/src/test/data/json/list.json 
b/freemarker-generator-cli/src/test/data/json/list.json
new file mode 100644
index 0000000..40ea060
--- /dev/null
+++ b/freemarker-generator-cli/src/test/data/json/list.json
@@ -0,0 +1 @@
+["first", "second"]
\ No newline at end of file
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 a595aee..ff787c1 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
@@ -114,14 +114,14 @@ public class ExamplesTest extends AbstractMainTest {
         assertValid(execute("-i 
${JsoupTool.parse(DataSources.first).select(\"a\")[0]} 
site/sample/html/dependencies.html"));
         assertValid(execute("-i 
${GsonTool.toJson(YamlTool.parse(DataSources.get(0)))} 
site/sample/yaml/swagger-spec.yaml"));
         assertValid(execute("-i ${GsonTool.toJson(yaml)} -m 
yaml=site/sample/yaml/swagger-spec.yaml"));
-        assertValid(execute("-i 
${YamlTool.toYaml(GsonTool.toMap(DataSources.get(0)))} 
site/sample/json/swagger-spec.json"));
+        assertValid(execute("-i 
${YamlTool.toYaml(GsonTool.parse(DataSources.get(0)))} 
site/sample/json/swagger-spec.json"));
         assertValid(execute("-i ${YamlTool.toYaml(json)} -m 
json=site/sample/json/swagger-spec.json"));
     }
 
     @Test
     public void shouldTransformTemplateDirectory() throws IOException {
-        assertTrue(execute("-t 
site/template").contains("server.name=somehost"));
-        assertTrue(execute("-t site/template 
-PNGINX_HOSTNAME=localhost").contains("server.name=localhost"));
+        assertTrue(execute("-t 
site/template").contains("server.name=127.0.0.1"));
+        assertTrue(execute("-t site/template 
-PNGINX_HOSTNAME=my.domain.com").contains("server.name=my.domain.com"));
     }
 
     @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 fd2c11c..9fc8d49 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
@@ -48,7 +48,8 @@ public class ManualTest {
     // private static final String CMD = "-b ./src/test -t templates/demo.ftl 
-m env=./site/sample/properties/user_0001/user.properties";
     // private static final String CMD = "-b ./src/test -t templates/demo.ftl 
-m ./site/sample/properties/user_0001/user.properties";
     // private static final String CMD = "-b ./src/test --data-model 
post=https://jsonplaceholder.typicode.com/posts/2 -t templates/info.ftl";
-    private static final String CMD = "-DCSV_TOOL_DELIMITER=SEMICOLON 
-DCSV_TOOL_HEADERS=true -b ./src/test -t templates/dataframe/example.ftl 
https://raw.githubusercontent.com/nRo/DataFrame/master/src/test/resources/users.csv";;
+    // private static final String CMD = "-DCSV_TOOL_DELIMITER=SEMICOLON 
-DCSV_TOOL_HEADERS=true -b ./src/test -t templates/dataframe/example.ftl 
https://raw.githubusercontent.com/nRo/DataFrame/master/src/test/resources/users.csv";;
+    private static final String CMD = "-b ./src/test -t site/template/ -m 
nginx.yaml";
 
 
     public static void main(String[] args) {
diff --git 
a/freemarker-generator-cli/src/test/java/org/apache/freemarker/generator/cli/config/DataModelSupplierTest.java
 
b/freemarker-generator-cli/src/test/java/org/apache/freemarker/generator/cli/config/DataModelSupplierTest.java
index def6a86..1924ccc 100644
--- 
a/freemarker-generator-cli/src/test/java/org/apache/freemarker/generator/cli/config/DataModelSupplierTest.java
+++ 
b/freemarker-generator-cli/src/test/java/org/apache/freemarker/generator/cli/config/DataModelSupplierTest.java
@@ -20,6 +20,7 @@ import org.junit.Ignore;
 import org.junit.Test;
 
 import java.nio.file.Paths;
+import java.util.List;
 import java.util.Map;
 
 import static java.util.Collections.singletonList;
@@ -36,7 +37,7 @@ public class DataModelSupplierTest {
     // === Environment Variables ===
 
     @Test
-    public void shouldResolveAllEnvironmentVariablesToTopLevelDataModel() {
+    public void shouldCopyAllEnvironmentVariablesToTopLevelDataModel() {
         final DataModelSupplier supplier = supplier("env:///");
 
         final Map<String, Object> model = supplier.get();
@@ -46,7 +47,7 @@ public class DataModelSupplierTest {
     }
 
     @Test
-    public void shouldResolveAllEnvironmentVariablesToDataModelVariable() {
+    public void shouldCopyAllEnvironmentVariablesToDataModelVariable() {
         final DataModelSupplier supplier = supplier("myenv=env:///");
 
         final Map<String, Object> model = supplier.get();
@@ -57,7 +58,7 @@ public class DataModelSupplierTest {
     }
 
     @Test
-    public void shouldResolveSingleEnvironmentVariablesToTopLevelDataModel() {
+    public void shouldCopySingleEnvironmentVariablesToTopLevelDataModel() {
         final DataModelSupplier supplier = supplier("env:///PWD");
 
         final Map<String, Object> model = supplier.get();
@@ -67,7 +68,7 @@ public class DataModelSupplierTest {
     }
 
     @Test
-    public void shouldResolveSingleEnvironmentVariableToDataModelVariable() {
+    public void shouldCopySingleEnvironmentVariableToDataModelVariable() {
         final DataModelSupplier supplier = supplier("mypwd=env:///PWD");
 
         final Map<String, Object> model = supplier.get();
@@ -84,7 +85,7 @@ public class DataModelSupplierTest {
     // === Properties ===
 
     @Test
-    public void shouldResolvePropertiesFileToTopLevelDataModel() {
+    public void shouldCopeyPropertiesFileToTopLevelDataModel() {
         final DataModelSupplier supplier = 
supplier("./src/test/data/properties/test.properties");
 
         final Map<String, Object> model = supplier.get();
@@ -95,7 +96,7 @@ public class DataModelSupplierTest {
     }
 
     @Test
-    public void shouldResolvePropertiesFileToDataModelVariable() {
+    public void shouldCopyPropertiesFileToDataModelVariable() {
         final DataModelSupplier supplier = 
supplier("props=./src/test/data/properties/test.properties");
 
         final Map<String, Object> model = supplier.get();
@@ -106,7 +107,7 @@ public class DataModelSupplierTest {
     }
 
     @Test
-    public void shouldResolvePropertiesUriToDataModelVariable() {
+    public void shouldCopyPropertiesUriToDataModelVariable() {
         final DataModelSupplier supplier = supplier("props=file:///" + PWD + 
"/src/test/data/properties/test.properties");
 
         final Map<String, Object> model = supplier.get();
@@ -119,7 +120,7 @@ public class DataModelSupplierTest {
     // === JSON ===
 
     @Test
-    public void shouldResolveJsonFileToTopLevelDataModel() {
+    public void shouldCopyJsonObjectFileToTopLevelDataModel() {
         final DataModelSupplier supplier = 
supplier("./src/test/data/json/environments.json");
 
         final Map<String, Object> model = supplier.get();
@@ -130,6 +131,24 @@ public class DataModelSupplierTest {
     }
 
     @Test
+    public void shouldCopyJsonArrayFileToDataModelVariable() {
+        final DataModelSupplier supplier = 
supplier("list=./src/test/data/json/list.json");
+
+        final Map<String, Object> model = supplier.get();
+
+        assertEquals(1, model.size());
+        assertEquals("first", ((List)model.get("list")).get(0));
+        assertEquals("second", ((List)model.get("list")).get(1));
+    }
+
+    @Test(expected = Exception.class)
+    public void shouldFailWhenCopyJsonArrayFileToTopLevelDataModel() {
+        supplier("./src/test/data/json/list.json").get();
+    }
+
+    // == YAML ===
+
+    @Test
     public void shouldResolveYamlFileToTopLevelDataModel() {
         final DataModelSupplier supplier = 
supplier("./src/test/data/yaml/environments.yaml");
 
@@ -145,25 +164,25 @@ public class DataModelSupplierTest {
     @Test
     @Ignore
     public void shouldResolveUrlToTopLevelDataModel() {
-        final DataModelSupplier supplier = 
supplier("post=https://jsonplaceholder.typicode.com/posts/2";);
+        final DataModelSupplier supplier = 
supplier("https://jsonplaceholder.typicode.com/posts/2";);
 
         final Map<String, Object> model = supplier.get();
 
-        assertEquals(1, model.size());
-        assertNotNull(model.get("post"));
+        assertTrue(model.size() == 4);
     }
 
     @Test
     @Ignore
     public void shouldResolveUrlToDataModelVariable() {
-        final DataModelSupplier supplier = 
supplier("https://jsonplaceholder.typicode.com/posts/2";);
+        final DataModelSupplier supplier = 
supplier("post=https://jsonplaceholder.typicode.com/posts/2";);
 
         final Map<String, Object> model = supplier.get();
 
-        assertTrue(model.size() == 4);
+        assertEquals(1, model.size());
+        assertNotNull(model.get("post"));
     }
 
-    @Test(expected = RuntimeException.class)
+    @Test
     @Ignore
     public void shouldResolveUrlToDataModelVariables() {
         
supplier("https://jsonplaceholder.typicode.com/posts/does-not-exist";).get();
diff --git a/freemarker-generator-cli/templates/json/csv/swagger-endpoints.ftl 
b/freemarker-generator-cli/templates/json/csv/swagger-endpoints.ftl
index 2c2121e..5f9d6a0 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 map = GsonTool.toMap(DataSources.get(0))>
+<#assign map = GsonTool.parse(DataSources.get(0))>
 <#assign basePath = map.basePath!"/">
 <#assign paths = map.paths!{}>
 
diff --git a/freemarker-generator-cli/templates/json/yaml/transform.ftl 
b/freemarker-generator-cli/templates/json/yaml/transform.ftl
index d7c36b6..80c8d2f 100644
--- a/freemarker-generator-cli/templates/json/yaml/transform.ftl
+++ b/freemarker-generator-cli/templates/json/yaml/transform.ftl
@@ -14,4 +14,4 @@
   specific language governing permissions and limitations
   under the License.
 -->
-${YamlTool.toYaml(GsonTool.toMap(DataSources.get(0)))}
\ No newline at end of file
+${YamlTool.toYaml(GsonTool.parse(DataSources.get(0)))}
\ No newline at end of file
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 c861155..dd8128b 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
@@ -18,16 +18,11 @@ package org.apache.freemarker.generator.tools.gson;
 
 import com.google.gson.Gson;
 import com.google.gson.GsonBuilder;
-import com.google.gson.reflect.TypeToken;
 import com.google.gson.stream.JsonReader;
 import org.apache.freemarker.generator.base.datasource.DataSource;
 
 import java.io.IOException;
 import java.io.InputStreamReader;
-import java.lang.reflect.Type;
-import java.util.ArrayList;
-import java.util.List;
-import java.util.Map;
 
 /**
  * JSON processing using <a href="https://github.com/google/gson";>Google 
GSON</a>
@@ -40,11 +35,11 @@ public class GsonTool {
      * Parse a data source containing a JSON object.
      *
      * @param dataSource data source
-     * @return map representing the JSON
+     * @return parsed JSON either as a map or list
      */
-    public Map<String, Object> toMap(DataSource dataSource) {
+    public Object parse(DataSource dataSource) {
         try (JsonReader reader = new JsonReader(new 
InputStreamReader(dataSource.getUnsafeInputStream()))) {
-            return gson().fromJson(reader, objectTypeToken());
+            return gson().fromJson(reader, Object.class);
         } catch (IOException e) {
             throw new RuntimeException("Failed to parse data source:" + 
dataSource, e);
         }
@@ -54,34 +49,10 @@ public class GsonTool {
      * Parse a JSON object string.
      *
      * @param json Json string
-     * @return map representing the JSON object
+     * @return parsed JSON either as a map or list
      */
-    public Map<String, Object> toMap(String json) {
-        return gson().fromJson(json, objectTypeToken());
-    }
-
-    /**
-     * Parse a data source containing a JSON array.
-     *
-     * @param dataSource data source
-     * @return list of maps
-     */
-    public List<Map<String, Object>> toList(DataSource dataSource) {
-        try (JsonReader reader = new JsonReader(new 
InputStreamReader(dataSource.getUnsafeInputStream()))) {
-            return gson().fromJson(reader, listTypeToken());
-        } catch (IOException e) {
-            throw new RuntimeException("Failed to parse data source:" + 
dataSource, e);
-        }
-    }
-
-    /**
-     * Parse a JSON string containing a JSON array.
-     *
-     * @param json Json string
-     * @return list of maps
-     */
-    public List<Map<String, Object>> toList(String json) {
-        return gson().fromJson(json, listTypeToken());
+    public Object parse(String json) {
+        return gson().fromJson(json, Object.class);
     }
 
     /**
@@ -105,12 +76,4 @@ public class GsonTool {
         }
         return gson;
     }
-
-    private static Type objectTypeToken() {
-        return new TypeToken<Map<String, Object>>() {}.getType();
-    }
-
-    private static Type listTypeToken() {
-        return new TypeToken<ArrayList<Map<String, Object>>>() {}.getType();
-    }
 }
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 1058d47..efacaea 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,7 +22,6 @@ import org.yaml.snakeyaml.Yaml;
 
 import java.io.IOException;
 import java.io.InputStream;
-import java.util.Map;
 
 import static org.yaml.snakeyaml.DumperOptions.FlowStyle.BLOCK;
 
@@ -30,7 +29,7 @@ public class SnakeYamlTool {
 
     private Yaml yaml;
 
-    public Map<String, Object> parse(DataSource dataSource) {
+    public Object parse(DataSource dataSource) {
         try (InputStream is = dataSource.getUnsafeInputStream()) {
             return yaml().load(is);
         } catch (IOException e) {
@@ -38,8 +37,8 @@ public class SnakeYamlTool {
         }
     }
 
-    public Map<String, Object> parse(String value) {
-        return yaml().load(value);
+    public Object parse(String yaml) {
+        return yaml().load(yaml);
     }
 
     public String toYaml(Object data) {
diff --git 
a/freemarker-generator-tools/src/test/java/org/apache/freemarker/generator/tools/dataframe/DataFrameToolTest.java
 
b/freemarker-generator-tools/src/test/java/org/apache/freemarker/generator/tools/dataframe/DataFrameToolTest.java
index 101a3fd..20c072d 100644
--- 
a/freemarker-generator-tools/src/test/java/org/apache/freemarker/generator/tools/dataframe/DataFrameToolTest.java
+++ 
b/freemarker-generator-tools/src/test/java/org/apache/freemarker/generator/tools/dataframe/DataFrameToolTest.java
@@ -19,17 +19,13 @@ package org.apache.freemarker.generator.tools.dataframe;
 import de.unknownreality.dataframe.DataFrame;
 import org.apache.commons.csv.CSVFormat;
 import org.apache.commons.csv.CSVParser;
-import org.apache.freemarker.generator.base.datasource.DataSource;
-import org.apache.freemarker.generator.base.datasource.DataSourceFactory;
 import org.apache.freemarker.generator.tools.commonscsv.CommonsCSVTool;
 import org.apache.freemarker.generator.tools.gson.GsonTool;
 import org.junit.Test;
 
-import java.io.File;
 import java.util.List;
 import java.util.Map;
 
-import static java.nio.charset.StandardCharsets.UTF_8;
 import static junit.framework.TestCase.assertEquals;
 import static org.apache.commons.csv.CSVFormat.DEFAULT;
 
@@ -77,9 +73,10 @@ public class DataFrameToolTest {
     // === JSON =============================================================
 
     @Test
+    @SuppressWarnings("unchecked")
     public void shouldParseJsonTable() {
         final String columnName = "Book ID";
-        final List<Map<String, Object>> json = gsonTool().toList(JSON_ARRAY);
+        final List<Map<String, Object>> json = (List) 
gsonTool().parse(JSON_ARRAY);
         final DataFrame dataFrame = dataFrameTool().toDataFrame(json);
 
         assertEquals(4, dataFrame.getColumns().size());
@@ -99,10 +96,6 @@ public class DataFrameToolTest {
         return new GsonTool();
     }
 
-    private DataSource dataSource(File file) {
-        return DataSourceFactory.fromFile(file, UTF_8);
-    }
-
     private CSVParser csvParser(String csv, CSVFormat csvFormat) {
         return commonsCSVTool().parse(csv, csvFormat);
     }
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 51981db..601b2b4 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
@@ -83,8 +83,9 @@ public class GsonToolTest {
     private final GsonTool gsonTool = gsonTool();
 
     @Test
+    @SuppressWarnings("unchecked")
     public void shouldParseJsonObject() {
-        final Map<String, Object> map = gsonTool.toMap(JSON_OBJECT);
+        final Map<String, Object> map = (Map) gsonTool.parse(JSON_OBJECT);
 
         assertEquals(3, map.size());
         assertEquals("110.0", map.get("id").toString());
@@ -93,23 +94,26 @@ public class GsonToolTest {
     }
 
     @Test
+    @SuppressWarnings("unchecked")
     public void shouldParseJsonObjectWithArray() {
-        final Map<String, Object> map = gsonTool.toMap(JSON_OBJECT_WITH_ARRAY);
+        final Map<String, Object> map = (Map) 
gsonTool.parse(JSON_OBJECT_WITH_ARRAY);
 
         assertEquals(1, map.size());
         assertEquals(3, ((List) map.get("eBooks")).size());
     }
 
     @Test
+    @SuppressWarnings("unchecked")
     public void shouldParseJsonWithComemnts() {
-        final Map<String, Object> map = gsonTool.toMap(JSON_WITH_COMMENTS);
+        final Map<String, Object> map = (Map) 
gsonTool.parse(JSON_WITH_COMMENTS);
 
         assertEquals("Apple", map.get("fruit"));
     }
 
     @Test
+    @SuppressWarnings("unchecked")
     public void shouldParseJsonArray() {
-        final List<Map<String, Object>> list = gsonTool.toList(JSON_ARRAY);
+        final List<Map<String, Object>> list = (List<Map<String, Object>>) 
gsonTool.parse(JSON_ARRAY);
 
         assertEquals(3, list.size());
         assertEquals("1", list.get(0).get("Book ID"));
@@ -118,18 +122,20 @@ public class GsonToolTest {
     }
 
     @Test
+    @SuppressWarnings("unchecked")
     public void shouldConvertToJson() {
-        assertEquals(JSON_OBJECT, 
gsonTool.toJson(gsonTool.toMap(JSON_OBJECT)));
-        assertEquals(JSON_OBJECT_WITH_ARRAY, 
gsonTool.toJson(gsonTool.toMap(JSON_OBJECT_WITH_ARRAY)));
+        assertEquals(JSON_OBJECT, 
gsonTool.toJson(gsonTool.parse(JSON_OBJECT)));
+        assertEquals(JSON_OBJECT_WITH_ARRAY, 
gsonTool.toJson(gsonTool.parse(JSON_OBJECT_WITH_ARRAY)));
     }
 
     @Test
+    @SuppressWarnings("unchecked")
     public void shouldParseComplexJson() throws IOException {
         final String json = readFileToString(new 
File("./src/test/data/json/swagger.json"), UTF_8);
-        final Map<String, Object> map = gsonTool.toMap(json);
+        final Map<String, Object> map = (Map) gsonTool.parse(json);
 
         assertEquals("petstore.swagger.io", map.get("host"));
-        assertEquals(json, gsonTool.toJson(gsonTool.toMap(json)));
+        assertEquals(json, gsonTool.toJson(gsonTool.parse(json)));
     }
 
     private GsonTool gsonTool() {
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 d588094..25ee6b1 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
@@ -34,46 +34,70 @@ public class SnakeYamlToolTest {
 
     private static final String ANY_GROUP = "group";
 
-    private static final String ANY_YAML_STRING = "docker:\n" +
+    private static final String NESTED_YAML_MAP = "docker:\n" +
             "    - image: ubuntu:14.04\n" +
             "    - image: mongo:2.6.8\n" +
             "      command: [mongod, --smallfiles]\n" +
             "    - image: postgres:9.4.1";
 
+    private static final String MAP_YAML = "- NGINX_PORT: 8443\n" +
+            "- NGINX_HOSTNAME: localhost";
+
+    private static final String LIST_YAML = "- foo\n" +
+            "- bar";
+
     @Test
-    public void shallParseYamlDataSource() {
-        try (DataSource dataSource = dataSource(ANY_YAML_STRING)) {
-            final Map<String, Object> map = snakeYamlTool().parse(dataSource);
+    public void shallParseSimpleListYamlString() {
+        final List<String> list = (List<String>) 
snakeYamlTool().parse(LIST_YAML);
 
-            assertEquals(1, map.size());
-            assertEquals(3, ((List<?>) map.get("docker")).size());
-        }
+        assertEquals(2, list.size());
+        assertEquals("foo", list.get(0));
+        assertEquals("bar", list.get(1));
     }
 
     @Test
-    public void shallParseYamlString() {
-        final Map<String, Object> map = snakeYamlTool().parse(ANY_YAML_STRING);
+    public void shallParseListOfMapYamlString() {
+        final List<Map<String, Object>> list = (List<Map<String, Object>>) 
snakeYamlTool().parse(MAP_YAML);
+
+        assertEquals(2, list.size());
+        assertEquals(8443, list.get(0).get("NGINX_PORT"));
+        assertEquals("localhost", list.get(1).get("NGINX_HOSTNAME"));
+    }
+
+    @Test
+    public void shallParseNestedYamlString() {
+        final Map<String, Object> map = (Map<String, Object>) 
snakeYamlTool().parse(NESTED_YAML_MAP);
 
         assertEquals(1, map.size());
         assertEquals(3, ((List<?>) map.get("docker")).size());
     }
 
     @Test
-    public void shallConvertToYamlString() {
-        final Map<String, Object> map = snakeYamlTool().parse(ANY_YAML_STRING);
+    public void shallParseYamlDataSource() {
+        try (DataSource dataSource = dataSource(NESTED_YAML_MAP)) {
+            final Map<String, Object> map = (Map<String, Object>) 
snakeYamlTool().parse(dataSource);
 
-        assertEquals(114, snakeYamlTool().toYaml(map).length());
+            assertEquals(1, map.size());
+            assertEquals(3, ((List<?>) map.get("docker")).size());
+        }
     }
 
     @Test
     public void shouldParseComplexYaml() throws IOException {
         final String yaml = readFileToString(new 
File("./src/test/data/yaml/swagger.yaml"), UTF_8);
-        final Map<String, Object> map = snakeYamlTool().parse(yaml);
+        final Map<String, Object> map = (Map<String, Object>) 
snakeYamlTool().parse(yaml);
 
         assertEquals("2.0", map.get("swagger"));
         assertEquals(16956, snakeYamlTool().toYaml(map).length());
     }
 
+    @Test
+    public void shallConvertToYamlString() {
+        final Map<String, Object> map = (Map<String, Object>) 
snakeYamlTool().parse(NESTED_YAML_MAP);
+
+        assertEquals(114, snakeYamlTool().toYaml(map).length());
+    }
+
     private SnakeYamlTool snakeYamlTool() {
         return new SnakeYamlTool();
     }

Reply via email to