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" +