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/04/03 22:11:05 UTC
[freemarker-generator] 01/01: FREEMARKER-139 freemarker-cli:
Provide GsonTool to align with Maven plugin
This is an automated email from the ASF dual-hosted git repository.
sgoeschl pushed a commit to branch FREEMARKER-139
in repository https://gitbox.apache.org/repos/asf/freemarker-generator.git
commit 175d72a5f98e2abe5799cfd68b680f29ce985ce7
Author: Siegfried Goeschl <si...@gmail.com>
AuthorDate: Sat Apr 4 00:10:47 2020 +0200
FREEMARKER-139 freemarker-cli: Provide GsonTool to align with Maven plugin
---
CHANGELOG.md | 4 +-
.../src/main/config/freemarker-cli.properties | 1 +
.../src/main/resources/freemarker-cli.properties | 1 +
.../freemarker/generator/cli/ManualTest.java | 3 +-
.../templates/json/csv/swagger-endpoints.ftl | 26 ++++----
freemarker-generator-tools/pom.xml | 77 +++++++++++-----------
.../freemarker/generator/tools/gson/GsonTool.java | 63 ++++++++++++++++++
.../GsonToolTest.java} | 45 +++++++------
.../generator/tools/jsonpath/JsonPathToolTest.java | 2 +-
9 files changed, 145 insertions(+), 77 deletions(-)
diff --git a/CHANGELOG.md b/CHANGELOG.md
index 1867116..2846d0a 100644
--- a/CHANGELOG.md
+++ b/CHANGELOG.md
@@ -5,6 +5,7 @@ All notable changes to this project will be documented in this file. We try to a
## 0.1.0-SNAPSHOT
### Added
+* [FREEMARKER-139] freemarker-cli: Provide GsonTool to align with Maven plugin
* An environment variable can bes passed as `DataSource`
* [FREEMARKER-135] Support user-supplied names for `DataSource` on the command line
* [FREEMARKER-129] Support `DataSource` exclude pattern in addition to include pattern
@@ -34,4 +35,5 @@ All notable changes to this project will be documented in this file. We try to a
[FREEMARKER-134]: https://issues.apache.org/jira/browse/FREEMARKER-134
[FREEMARKER-135]: https://issues.apache.org/jira/browse/FREEMARKER-135
[FREEMARKER-136]: https://issues.apache.org/jira/browse/FREEMARKER-136
-[FREEMARKER-138]: https://issues.apache.org/jira/browse/FREEMARKER-1386
\ No newline at end of file
+[FREEMARKER-138]: https://issues.apache.org/jira/browse/FREEMARKER-138
+[FREEMARKER-139]: https://issues.apache.org/jira/browse/FREEMARKER-139
\ No newline at end of file
diff --git a/freemarker-generator-cli/src/main/config/freemarker-cli.properties b/freemarker-generator-cli/src/main/config/freemarker-cli.properties
index af23b05..c8fdcbe 100644
--- a/freemarker-generator-cli/src/main/config/freemarker-cli.properties
+++ b/freemarker-generator-cli/src/main/config/freemarker-cli.properties
@@ -29,6 +29,7 @@ freemarker.tools.ExecTool=org.apache.freemarker.generator.tools.commonsexec.Comm
freemarker.tools.ExcelTool=org.apache.freemarker.generator.tools.excel.ExcelTool
freemarker.tools.FreeMarkerTool=org.apache.freemarker.generator.tools.freemarker.FreeMarkerTool
freemarker.tools.GrokTool=org.apache.freemarker.generator.tools.grok.GrokTool
+freemarker.tools.GsonTool=org.apache.freemarker.generator.tools.grok.GsonTool
freemarker.tools.JsonPathTool=org.apache.freemarker.generator.tools.jsonpath.JsonPathTool
freemarker.tools.JsoupTool=org.apache.freemarker.generator.tools.jsoup.JsoupTool
freemarker.tools.PropertiesTool=org.apache.freemarker.generator.tools.properties.PropertiesTool
diff --git a/freemarker-generator-cli/src/main/resources/freemarker-cli.properties b/freemarker-generator-cli/src/main/resources/freemarker-cli.properties
index 8dd5f59..0a0542a 100644
--- a/freemarker-generator-cli/src/main/resources/freemarker-cli.properties
+++ b/freemarker-generator-cli/src/main/resources/freemarker-cli.properties
@@ -29,6 +29,7 @@ freemarker.tools.ExcelTool=org.apache.freemarker.generator.tools.excel.ExcelTool
freemarker.tools.ExecTool=org.apache.freemarker.generator.tools.commonsexec.CommonsExecTool
freemarker.tools.FreeMarkerTool=org.apache.freemarker.generator.tools.freemarker.FreeMarkerTool
freemarker.tools.GrokTool=org.apache.freemarker.generator.tools.grok.GrokTool
+freemarker.tools.GsonTool=org.apache.freemarker.generator.tools.gson.GsonTool
freemarker.tools.JsonPathTool=org.apache.freemarker.generator.tools.jsonpath.JsonPathTool
freemarker.tools.JsoupTool=org.apache.freemarker.generator.tools.jsoup.JsoupTool
freemarker.tools.PropertiesTool=org.apache.freemarker.generator.tools.properties.PropertiesTool
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 8eb44cf..ff83957 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
@@ -39,7 +39,8 @@ public class ManualTest {
// private static final String CMD = "-b ./src/test -l de_AT -DFOO=foo -DBAR=bar -t templates/info.ftl -d user:admin=site/sample/csv/contract.csv#charset=UTF-16 google:www=https://www.google.com?foo=bar#contenttype=application/json";
// private static final String CMD = "-b ./src/test -t templates/info.ftl -d :user=site/sample/properties -d contract=site/sample/csv/contract.csv";
// private static final String CMD = "-b ./src/test -t site/sample/ftl/nginx/nginx.conf.ftl -d env=site/sample/ftl/nginx/nginx.env";
- private static final String CMD = "-b ./src/test -t templates/info.ftl -d env=site/sample/ftl/nginx/nginx.env";
+ // private static final String CMD = "-b ./src/test -t templates/info.ftl -d env=site/sample/ftl/nginx/nginx.env";
+ private static final String CMD = "-b ./src/test -t templates/json/csv/swagger-endpoints.ftl site/sample/json/swagger-spec.json";
public static void main(String[] args) {
Main.execute(toArgs(CMD));
diff --git a/freemarker-generator-cli/templates/json/csv/swagger-endpoints.ftl b/freemarker-generator-cli/templates/json/csv/swagger-endpoints.ftl
index 7fab37f..5f9d6a0 100644
--- a/freemarker-generator-cli/templates/json/csv/swagger-endpoints.ftl
+++ b/freemarker-generator-cli/templates/json/csv/swagger-endpoints.ftl
@@ -15,21 +15,23 @@
specific language governing permissions and limitations
under the License.
-->
-<#assign json = JsonPathTool.parse(DataSources.get(0))>
-<#assign basePath = json.read("$.basePath")>
-<#assign paths = json.read("$.paths")>
+<#assign map = GsonTool.parse(DataSources.get(0))>
+<#assign basePath = map.basePath!"/">
+<#assign paths = map.paths!{}>
<#compress>
- ENDPOINT;METHOD;CONSUMES;PRODUCES;SUMMARY;DESCRIPTION
+ ENDPOINT;METHOD;CONSUMES;PRODUCES;PARAMETERS;SUMMARY;DESCRIPTION
<#list paths as endpoint,metadata>
- <#assign relative_url = basePath + endpoint>
- <#assign methods = metadata?keys>
- <#list methods as method>
- <#assign summary = sanitize(paths[endpoint][method]["summary"]!"")>
- <#assign description = sanitize(paths[endpoint][method]["description"]!"")>
- <#assign consumes = join(paths[endpoint][method]["consumes"]![])>
- <#assign produces = join(paths[endpoint][method]["produces"]![])>
- ${relative_url};${method?upper_case};${consumes};${produces};${summary};${description}
+ <#assign url = basePath + endpoint>
+ <#assign names = metadata?keys?sort>
+ <#list names as name>
+ <#assign method = paths[endpoint][name]>
+ <#assign summary = sanitize(method["summary"]!"")>
+ <#assign description = sanitize(method["description"]!"")>
+ <#assign consumes = join(method["consumes"]![])>
+ <#assign produces = join(method["produces"]![])>
+ <#assign parameters = method["parameters"]>
+ ${url};${name?upper_case};${consumes};${produces};${parameters?size};${summary};${description}
</#list>
</#list>
</#compress>
diff --git a/freemarker-generator-tools/pom.xml b/freemarker-generator-tools/pom.xml
index 80815d9..95e7d4c 100644
--- a/freemarker-generator-tools/pom.xml
+++ b/freemarker-generator-tools/pom.xml
@@ -42,55 +42,19 @@
<artifactId>freemarker-generator-base</artifactId>
<version>${project.version}</version>
</dependency>
- <dependency>
- <groupId>org.slf4j</groupId>
- <artifactId>slf4j-api</artifactId>
- </dependency>
- <dependency>
- <groupId>io.krakens</groupId>
- <artifactId>java-grok</artifactId>
- <version>0.1.9</version>
- </dependency>
- <dependency>
- <groupId>com.jayway.jsonpath</groupId>
- <artifactId>json-path</artifactId>
- <version>2.4.0</version>
- </dependency>
- <dependency>
- <groupId>info.picocli</groupId>
- <artifactId>picocli</artifactId>
- <version>4.1.4</version>
- </dependency>
- <dependency>
- <groupId>javax.activation</groupId>
- <artifactId>activation</artifactId>
- </dependency>
- <dependency>
- <groupId>org.jsoup</groupId>
- <artifactId>jsoup</artifactId>
- <version>1.12.1</version>
- </dependency>
- <dependency>
- <groupId>org.yaml</groupId>
- <artifactId>snakeyaml</artifactId>
- <version>1.25</version>
- </dependency>
- <!-- Apache libraries -->
+ <!-- CommonsCSVTool -->
<dependency>
<groupId>org.apache.commons</groupId>
<artifactId>commons-exec</artifactId>
<version>1.3</version>
</dependency>
+ <!-- CommonsExecTool -->
<dependency>
<groupId>org.apache.commons</groupId>
<artifactId>commons-csv</artifactId>
<version>1.8</version>
</dependency>
- <dependency>
- <groupId>org.freemarker</groupId>
- <artifactId>freemarker</artifactId>
- </dependency>
- <!-- Apache POI -->
+ <!-- ExcelTool -->
<dependency>
<groupId>org.apache.poi</groupId>
<artifactId>poi</artifactId>
@@ -106,6 +70,41 @@
<artifactId>poi-ooxml-schemas</artifactId>
<version>${apache.poi.version}</version>
</dependency>
+ <!-- FreeMarkerTool -->
+ <dependency>
+ <groupId>org.freemarker</groupId>
+ <artifactId>freemarker</artifactId>
+ </dependency>
+ <!-- GrokTool -->
+ <dependency>
+ <groupId>io.krakens</groupId>
+ <artifactId>java-grok</artifactId>
+ <version>0.1.9</version>
+ </dependency>
+ <!-- GsonTool -->
+ <dependency>
+ <groupId>com.google.code.gson</groupId>
+ <artifactId>gson</artifactId>
+ <version>2.8.6</version>
+ </dependency>
+ <!-- JsonPath Tool -->
+ <dependency>
+ <groupId>com.jayway.jsonpath</groupId>
+ <artifactId>json-path</artifactId>
+ <version>2.4.0</version>
+ </dependency>
+ <!-- JsoupTool -->
+ <dependency>
+ <groupId>org.jsoup</groupId>
+ <artifactId>jsoup</artifactId>
+ <version>1.12.1</version>
+ </dependency>
+ <!-- SnakeYamlTool -->
+ <dependency>
+ <groupId>org.yaml</groupId>
+ <artifactId>snakeyaml</artifactId>
+ <version>1.25</version>
+ </dependency>
<!-- Testing -->
<dependency>
<groupId>junit</groupId>
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
new file mode 100644
index 0000000..d53e7e9
--- /dev/null
+++ b/freemarker-generator-tools/src/main/java/org/apache/freemarker/generator/tools/gson/GsonTool.java
@@ -0,0 +1,63 @@
+/*
+ * 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.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.Map;
+
+public class GsonTool {
+
+ private Gson gson;
+ private Type type;
+
+ public Map<String, Object> parse(DataSource dataSource) throws IOException {
+ try (JsonReader reader = new JsonReader(new InputStreamReader(dataSource.getUnsafeInputStream()))) {
+ return gson().fromJson(reader, type());
+ }
+ }
+
+ public Map<String, Object> parse(String json) {
+ return gson().fromJson(json, type());
+ }
+
+ @Override
+ public String toString() {
+ return "Process JSON files using GSON (see https://github.com/google/gson)";
+ }
+
+ private synchronized Gson gson() {
+ if (gson == null) {
+ gson = new GsonBuilder().setLenient().create();
+ }
+ return gson;
+ }
+
+ private synchronized Type type() {
+ if (type == null) {
+ type = new TypeToken<Map<String, Object>>() {}.getType();
+ }
+ return type;
+ }
+}
diff --git a/freemarker-generator-tools/src/test/java/org/apache/freemarker/generator/tools/jsonpath/JsonPathToolTest.java b/freemarker-generator-tools/src/test/java/org/apache/freemarker/generator/tools/gson/GsonToolTest.java
similarity index 66%
copy from freemarker-generator-tools/src/test/java/org/apache/freemarker/generator/tools/jsonpath/JsonPathToolTest.java
copy to freemarker-generator-tools/src/test/java/org/apache/freemarker/generator/tools/gson/GsonToolTest.java
index aaed1b5..4c1906c 100644
--- a/freemarker-generator-tools/src/test/java/org/apache/freemarker/generator/tools/jsonpath/JsonPathToolTest.java
+++ b/freemarker-generator-tools/src/test/java/org/apache/freemarker/generator/tools/gson/GsonToolTest.java
@@ -14,20 +14,21 @@
* See the License for the specific language governing permissions and
* limitations under the License.
*/
-package org.apache.freemarker.generator.tools.jsonpath;
+package org.apache.freemarker.generator.tools.gson;
-import com.jayway.jsonpath.DocumentContext;
import org.junit.Test;
+import java.util.List;
+import java.util.Map;
+
import static junit.framework.TestCase.assertEquals;
-import static junit.framework.TestCase.assertNull;
-public class JsonPathToolTest {
+public class GsonToolTest {
private static final String JSON_OBJECT_STRING = "{\n" +
"\"id\": 110,\n" +
"\"language\": \"Python\",\n" +
- "\"price\": 1900,\n" +
+ "\"price\": 1900\n" +
"}";
private static final String JSON_ARRAY_STRING = "{\n" +
@@ -56,38 +57,36 @@ public class JsonPathToolTest {
@Test
public void shallParseJsonObject() {
- final DocumentContext json = parse(JSON_OBJECT_STRING);
+ final Map<String, Object> map = parse(JSON_OBJECT_STRING);
- assertEquals(json.read("$.language"), "Python");
- assertEquals(json.read("$['language']"), "Python");
+ 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 shallParseJsonArray() {
- final DocumentContext json = parse(JSON_ARRAY_STRING);
+ final Map<String, Object> map = parse(JSON_ARRAY_STRING);
+
+ assertEquals(1, map.size());
+ assertEquals(3, ((List) map.get("eBooks")).size());
- assertEquals(json.read("$.eBooks[0].language"), "Pascal");
- assertEquals(json.read("$['eBooks'][0]['language']"), "Pascal");
+ return;
}
@Test
public void failsToParseJsonComments() {
- final DocumentContext json = parse(JSON_WITH_COMMENTS);
+ final Map<String, Object> map = parse(JSON_WITH_COMMENTS);
- assertNull(json.read("$.fruit"));
- assertEquals("Large", json.read("$.size"));
- }
-
- @Test
- public void shallSuppressExceptionForUnknonwPath() {
- assertNull(parse(JSON_OBJECT_STRING).read("$.unknown"));
+ assertEquals("Apple", map.get("fruit"));
}
- private DocumentContext parse(String json) {
- return jsonPathTool().parse(json);
+ private Map<String, Object> parse(String json) {
+ return gsonTool().parse(json);
}
- private JsonPathTool jsonPathTool() {
- return new JsonPathTool();
+ private GsonTool gsonTool() {
+ return new GsonTool();
}
}
diff --git a/freemarker-generator-tools/src/test/java/org/apache/freemarker/generator/tools/jsonpath/JsonPathToolTest.java b/freemarker-generator-tools/src/test/java/org/apache/freemarker/generator/tools/jsonpath/JsonPathToolTest.java
index aaed1b5..dd21f67 100644
--- a/freemarker-generator-tools/src/test/java/org/apache/freemarker/generator/tools/jsonpath/JsonPathToolTest.java
+++ b/freemarker-generator-tools/src/test/java/org/apache/freemarker/generator/tools/jsonpath/JsonPathToolTest.java
@@ -27,7 +27,7 @@ public class JsonPathToolTest {
private static final String JSON_OBJECT_STRING = "{\n" +
"\"id\": 110,\n" +
"\"language\": \"Python\",\n" +
- "\"price\": 1900,\n" +
+ "\"price\": 1900\n" +
"}";
private static final String JSON_ARRAY_STRING = "{\n" +