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 <[email protected]> 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" +
