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();
}