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/05 22:03:58 UTC

[freemarker-generator] 09/11: FREEMARKER-140 freemarker-cli: Expose DataSources directly in the data model

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

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

commit c8af6edc68ade0ba6418d0825204dc503259a296
Author: Siegfried Goeschl <si...@gmail.com>
AuthorDate: Sun Apr 5 23:25:01 2020 +0200

    FREEMARKER-140 freemarker-cli: Expose DataSources directly in the data model
---
 .../generator/cli/config}/DataModelsSupplier.java    | 20 +++++++++++++++++++-
 .../freemarker/generator/cli/config/Suppliers.java   |  1 -
 .../src/test/data/json/environments.json             |  4 ++++
 .../src/test/data/properties/test.properties         | 17 +++++++++++++++++
 .../cli/config}/DataModelsSupplierTest.java          | 14 ++++++++++++--
 .../freemarker/generator/tools/gson/GsonTool.java    |  4 +++-
 6 files changed, 55 insertions(+), 5 deletions(-)

diff --git a/freemarker-generator-base/src/main/java/org/apache/freemarker/generator/base/datamodel/DataModelsSupplier.java b/freemarker-generator-cli/src/main/java/org/apache/freemarker/generator/cli/config/DataModelsSupplier.java
similarity index 81%
rename from freemarker-generator-base/src/main/java/org/apache/freemarker/generator/base/datamodel/DataModelsSupplier.java
rename to freemarker-generator-cli/src/main/java/org/apache/freemarker/generator/cli/config/DataModelsSupplier.java
index f9da638..91187c4 100644
--- a/freemarker-generator-base/src/main/java/org/apache/freemarker/generator/base/datamodel/DataModelsSupplier.java
+++ b/freemarker-generator-cli/src/main/java/org/apache/freemarker/generator/cli/config/DataModelsSupplier.java
@@ -14,7 +14,7 @@
  * See the License for the specific language governing permissions and
  * limitations under the License.
  */
-package org.apache.freemarker.generator.base.datamodel;
+package org.apache.freemarker.generator.cli.config;
 
 import org.apache.freemarker.generator.base.datasource.DataSource;
 import org.apache.freemarker.generator.base.datasource.DataSourceFactory;
@@ -22,6 +22,7 @@ import org.apache.freemarker.generator.base.uri.NamedUri;
 import org.apache.freemarker.generator.base.uri.NamedUriStringParser;
 import org.apache.freemarker.generator.base.util.PropertiesFactory;
 import org.apache.freemarker.generator.base.util.UriUtils;
+import org.apache.freemarker.generator.tools.gson.GsonTool;
 
 import java.net.URI;
 import java.util.ArrayList;
@@ -34,6 +35,7 @@ import java.util.function.Supplier;
 
 import static java.util.Objects.requireNonNull;
 import static java.util.stream.Collectors.toMap;
+import static org.apache.freemarker.generator.base.activation.Mimetypes.MIME_APPLICATION_JSON;
 import static org.apache.freemarker.generator.base.activation.Mimetypes.MIME_TEXT_PLAIN;
 
 /**
@@ -70,11 +72,27 @@ public class DataModelsSupplier implements Supplier<Map<String, Object>> {
         switch (contentType) {
             case MIME_TEXT_PLAIN:
                 return fromProperties(dataSource, isExplodedDataModel);
+            case MIME_APPLICATION_JSON:
+                return fromJson(dataSource, isExplodedDataModel);
             default:
                 throw new IllegalArgumentException("Don't know how to handle :" + contentType);
         }
     }
 
+    protected Map<String, Object> fromJson(DataSource dataSource, boolean isExplodedDataModel) {
+        final Map<String, Object> result = new HashMap<>();
+        final GsonTool gsonTool = new GsonTool();
+        final Map<String, Object> map = gsonTool.parse(dataSource);
+
+        if (isExplodedDataModel) {
+            map.forEach((key, value) -> result.put(key.toString(), value));
+        } else {
+            result.put(dataSource.getName(), map);
+        }
+
+        return result;
+    }
+
     protected Map<String, Object> fromProperties(DataSource dataSource, boolean isExplodedDataModel) {
         final Map<String, Object> result = new HashMap<>();
         final URI uri = dataSource.getUri();
diff --git a/freemarker-generator-cli/src/main/java/org/apache/freemarker/generator/cli/config/Suppliers.java b/freemarker-generator-cli/src/main/java/org/apache/freemarker/generator/cli/config/Suppliers.java
index 41cd94a..1692443 100644
--- a/freemarker-generator-cli/src/main/java/org/apache/freemarker/generator/cli/config/Suppliers.java
+++ b/freemarker-generator-cli/src/main/java/org/apache/freemarker/generator/cli/config/Suppliers.java
@@ -17,7 +17,6 @@
 package org.apache.freemarker.generator.cli.config;
 
 import freemarker.cache.TemplateLoader;
-import org.apache.freemarker.generator.base.datamodel.DataModelsSupplier;
 import org.apache.freemarker.generator.base.datasource.DataSourcesSupplier;
 import org.apache.freemarker.generator.base.file.PropertiesClassPathSupplier;
 import org.apache.freemarker.generator.base.file.PropertiesFileSystemSupplier;
diff --git a/freemarker-generator-cli/src/test/data/json/environments.json b/freemarker-generator-cli/src/test/data/json/environments.json
new file mode 100644
index 0000000..eb11bc4
--- /dev/null
+++ b/freemarker-generator-cli/src/test/data/json/environments.json
@@ -0,0 +1,4 @@
+{
+   "db_default_user": "scott",
+   "db_default_password": "tiger"
+}
\ No newline at end of file
diff --git a/freemarker-generator-cli/src/test/data/properties/test.properties b/freemarker-generator-cli/src/test/data/properties/test.properties
new file mode 100644
index 0000000..6431653
--- /dev/null
+++ b/freemarker-generator-cli/src/test/data/properties/test.properties
@@ -0,0 +1,17 @@
+## ---------------------------------------------------------------------------
+## 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.
+## ---------------------------------------------------------------------------
+foo=bar
\ No newline at end of file
diff --git a/freemarker-generator-base/src/test/java/org/apache/freemarker/generator/datamodel/DataModelsSupplierTest.java b/freemarker-generator-cli/src/test/java/org/apache/freemarker/generator/cli/config/DataModelsSupplierTest.java
similarity index 88%
rename from freemarker-generator-base/src/test/java/org/apache/freemarker/generator/datamodel/DataModelsSupplierTest.java
rename to freemarker-generator-cli/src/test/java/org/apache/freemarker/generator/cli/config/DataModelsSupplierTest.java
index e3ebb6e..0c831c7 100644
--- a/freemarker-generator-base/src/test/java/org/apache/freemarker/generator/datamodel/DataModelsSupplierTest.java
+++ b/freemarker-generator-cli/src/test/java/org/apache/freemarker/generator/cli/config/DataModelsSupplierTest.java
@@ -14,9 +14,8 @@
  * See the License for the specific language governing permissions and
  * limitations under the License.
  */
-package org.apache.freemarker.generator.datamodel;
+package org.apache.freemarker.generator.cli.config;
 
-import org.apache.freemarker.generator.base.datamodel.DataModelsSupplier;
 import org.junit.Test;
 
 import java.util.Map;
@@ -90,6 +89,17 @@ public class DataModelsSupplierTest {
         assertEquals("bar", toMap(model, "props").get("foo"));
     }
 
+    @Test
+    public void shouldResolveJsonFileToTopLevelDataModel() {
+        final DataModelsSupplier supplier = supplier("./src/test/data/json/environments.json");
+
+        final Map<String, Object> model = supplier.get();
+
+        assertEquals(2, model.size());
+        assertEquals("scott", model.get("db_default_user"));
+        assertEquals("tiger", model.get("db_default_password"));
+    }
+
     private static DataModelsSupplier supplier(String source) {
         return new DataModelsSupplier(singletonList(source));
     }
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 9805afd..6a864eb 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
@@ -32,9 +32,11 @@ public class GsonTool {
     private Gson gson;
     private Type type;
 
-    public Map<String, Object> parse(DataSource dataSource) throws IOException {
+    public Map<String, Object> parse(DataSource dataSource) {
         try (JsonReader reader = new JsonReader(new InputStreamReader(dataSource.getUnsafeInputStream()))) {
             return gson().fromJson(reader, type());
+        } catch (IOException e) {
+            throw new RuntimeException("Failed to parse data source:" + dataSource, e);
         }
     }