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:56 UTC

[freemarker-generator] 07/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 30947874f1a1c06942afbb762c0ea590d56a92bf
Author: Siegfried Goeschl <si...@gmail.com>
AuthorDate: Sun Apr 5 22:42:58 2020 +0200

    FREEMARKER-140 freemarker-cli: Expose DataSources directly in the data model
---
 .../base/datamodel/DataModelsSupplier.java         |  61 ++++++++++---
 .../base/datasource/DataSourceFactory.java         |   7 +-
 .../generator/base/util/StringUtils.java           |  10 --
 .../datamodel/DataModelsSupplierTest.java          | 101 +++++++++++++++++++++
 .../freemarker/generator/cli/ManualTest.java       |   7 +-
 5 files changed, 158 insertions(+), 28 deletions(-)

diff --git a/freemarker-generator-base/src/main/java/org/apache/freemarker/generator/base/datamodel/DataModelsSupplier.java b/freemarker-generator-base/src/main/java/org/apache/freemarker/generator/base/datamodel/DataModelsSupplier.java
index 8f9f268..f9da638 100644
--- a/freemarker-generator-base/src/main/java/org/apache/freemarker/generator/base/datamodel/DataModelsSupplier.java
+++ b/freemarker-generator-base/src/main/java/org/apache/freemarker/generator/base/datamodel/DataModelsSupplier.java
@@ -18,15 +18,23 @@ package org.apache.freemarker.generator.base.datamodel;
 
 import org.apache.freemarker.generator.base.datasource.DataSource;
 import org.apache.freemarker.generator.base.datasource.DataSourceFactory;
+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 java.net.URI;
 import java.util.ArrayList;
 import java.util.Collection;
-import java.util.Collections;
-import java.util.List;
+import java.util.HashMap;
 import java.util.Map;
+import java.util.Map.Entry;
+import java.util.Properties;
 import java.util.function.Supplier;
 
-import static java.util.stream.Collectors.toList;
+import static java.util.Objects.requireNonNull;
+import static java.util.stream.Collectors.toMap;
+import static org.apache.freemarker.generator.base.activation.Mimetypes.MIME_TEXT_PLAIN;
 
 /**
  * Create a list of <code>DataSource</code> based on a list of sources consisting of
@@ -34,7 +42,6 @@ import static java.util.stream.Collectors.toList;
  */
 public class DataModelsSupplier implements Supplier<Map<String, Object>> {
 
-    /** List of source files, named URIs and URIs */
     private final Collection<String> sources;
 
     /**
@@ -43,22 +50,46 @@ public class DataModelsSupplier implements Supplier<Map<String, Object>> {
      * @param sources List of sources
      */
     public DataModelsSupplier(Collection<String> sources) {
-        this.sources = new ArrayList<>(sources);
+        this.sources = new ArrayList<>(requireNonNull(sources));
     }
 
     @Override
     public Map<String, Object> get() {
-        final List<DataSource> dataModels = sources.stream().map(this::resolve).collect(toList());
-        return Collections.emptyMap();
+        return sources.stream()
+                .map(this::toDataModel)
+                .flatMap(map -> map.entrySet().stream())
+                .collect(toMap(Entry::getKey, Entry::getValue));
     }
 
-    /**
-     * Resolve a <code>source</code> to a <code>DataSource</code>.
-     *
-     * @param source the source being a file name, an <code>URI</code> or <code>NamedUri</code>
-     * @return list of <code>DataSource</code>
-     */
-    protected DataSource resolve(String source) {
-        return DataSourceFactory.create(source);
+    protected Map<String, Object> toDataModel(String source) {
+        final NamedUri namedUri = NamedUriStringParser.parse(source);
+        final DataSource dataSource = DataSourceFactory.fromNamedUri(namedUri);
+        final boolean isExplodedDataModel = !namedUri.hasName();
+        final String contentType = dataSource.getContentType();
+
+        switch (contentType) {
+            case MIME_TEXT_PLAIN:
+                return fromProperties(dataSource, isExplodedDataModel);
+            default:
+                throw new IllegalArgumentException("Don't know how to handle :" + contentType);
+        }
+    }
+
+    protected Map<String, Object> fromProperties(DataSource dataSource, boolean isExplodedDataModel) {
+        final Map<String, Object> result = new HashMap<>();
+        final URI uri = dataSource.getUri();
+
+        if (UriUtils.isEnvUri(uri) && !"env:///".equals(uri.toString())) {
+            result.put(dataSource.getName(), dataSource.getText());
+        } else {
+            final Properties properties = PropertiesFactory.create(dataSource.getText());
+            if (isExplodedDataModel) {
+                properties.forEach((key, value) -> result.put(key.toString(), value));
+            } else {
+                result.put(dataSource.getName(), properties);
+            }
+        }
+
+        return result;
     }
 }
diff --git a/freemarker-generator-base/src/main/java/org/apache/freemarker/generator/base/datasource/DataSourceFactory.java b/freemarker-generator-base/src/main/java/org/apache/freemarker/generator/base/datasource/DataSourceFactory.java
index a2ee5e3..3f98adc 100644
--- a/freemarker-generator-base/src/main/java/org/apache/freemarker/generator/base/datasource/DataSourceFactory.java
+++ b/freemarker-generator-base/src/main/java/org/apache/freemarker/generator/base/datasource/DataSourceFactory.java
@@ -81,7 +81,10 @@ public class DataSourceFactory {
                 return fromEnvironment(name, group, key, contentType);
             }
         } else {
-            throw new IllegalArgumentException("Don't knowm how to handle: " + namedUri);
+            // handle things such as "foo=some.file"
+            final File file = namedUri.getFile();
+            final String name = namedUri.getNameOrElse(file.getName());
+            return fromFile(name, group, file, charset);
         }
     }
 
@@ -151,7 +154,7 @@ public class DataSourceFactory {
             final StringWriter writer = new StringWriter();
             properties.store(writer, null);
             final StringDataSource dataSource = new StringDataSource(name, writer.toString(), contentType, UTF_8);
-            final URI uri = UriUtils.toURI(Location.ENVIRONMENT);
+            final URI uri = UriUtils.toURI(Location.ENVIRONMENT, "");
             return create(name, group, uri, dataSource, contentType, UTF_8);
         } catch (IOException e) {
             throw new RuntimeException(e);
diff --git a/freemarker-generator-base/src/main/java/org/apache/freemarker/generator/base/util/StringUtils.java b/freemarker-generator-base/src/main/java/org/apache/freemarker/generator/base/util/StringUtils.java
index bee41e7..24b81af 100644
--- a/freemarker-generator-base/src/main/java/org/apache/freemarker/generator/base/util/StringUtils.java
+++ b/freemarker-generator-base/src/main/java/org/apache/freemarker/generator/base/util/StringUtils.java
@@ -45,14 +45,4 @@ public class StringUtils {
         return null;
     }
 
-    public static String firstNonNull(final String... values) {
-        if (values != null) {
-            for (final String value : values) {
-                if (value != null) {
-                    return value;
-                }
-            }
-        }
-        return null;
-    }
 }
diff --git a/freemarker-generator-base/src/test/java/org/apache/freemarker/generator/datamodel/DataModelsSupplierTest.java b/freemarker-generator-base/src/test/java/org/apache/freemarker/generator/datamodel/DataModelsSupplierTest.java
new file mode 100644
index 0000000..e3ebb6e
--- /dev/null
+++ b/freemarker-generator-base/src/test/java/org/apache/freemarker/generator/datamodel/DataModelsSupplierTest.java
@@ -0,0 +1,101 @@
+/*
+ * 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.datamodel;
+
+import org.apache.freemarker.generator.base.datamodel.DataModelsSupplier;
+import org.junit.Test;
+
+import java.util.Map;
+
+import static java.util.Collections.singletonList;
+import static org.junit.Assert.assertEquals;
+
+public class DataModelsSupplierTest {
+
+    private static final String PWD_VALUE = System.getenv("PWD");
+    private static final int NR_OF_ENVS = System.getenv().size();
+
+    @Test
+    public void shouldResolveAllEnvironmentVariablesToTopLevelDataModel() {
+        final DataModelsSupplier supplier = supplier("env:///");
+
+        final Map<String, Object> model = supplier.get();
+
+        assertEquals(NR_OF_ENVS, model.size());
+        assertEquals(PWD_VALUE, model.get("PWD"));
+    }
+
+    @Test
+    public void shouldResolveAllEnvironmentVariablesToDataModelVariable() {
+        final DataModelsSupplier supplier = supplier("env=env:///");
+
+        final Map<String, Object> model = supplier.get();
+
+        assertEquals(1, model.size());
+        assertEquals(NR_OF_ENVS, toMap(model, "env").size());
+        assertEquals(PWD_VALUE, toMap(model, "env").get("PWD"));
+    }
+
+    @Test
+    public void shouldResolveEnvironmentVariableToDataModelVariable() {
+        final DataModelsSupplier supplier = supplier("foo=env:///PWD");
+
+        final Map<String, Object> model = supplier.get();
+
+        assertEquals(1, model.size());
+        assertEquals(PWD_VALUE, model.get("foo"));
+    }
+
+    @Test
+    public void shouldResolvePropertiesFileToTopLevelDataModel() {
+        final DataModelsSupplier supplier = supplier("./src/test/data/properties/test.properties");
+
+        final Map<String, Object> model = supplier.get();
+
+        assertEquals(1, model.size());
+        assertEquals("bar", model.get("foo"));
+    }
+
+    @Test
+    public void shouldResolvePropertiesFileToDataModelVariable() {
+        final DataModelsSupplier supplier = supplier("props=./src/test/data/properties/test.properties");
+
+        final Map<String, Object> model = supplier.get();
+
+        assertEquals(1, model.size());
+        assertEquals("bar", toMap(model, "props").get("foo"));
+    }
+
+    @Test
+    public void shouldResolvePropertiesUriToDataModelVariable() {
+        final DataModelsSupplier supplier = supplier("props=file://./src/test/data/properties/test.properties");
+
+        final Map<String, Object> model = supplier.get();
+
+        assertEquals(1, model.size());
+        assertEquals("bar", toMap(model, "props").get("foo"));
+    }
+
+    private static DataModelsSupplier supplier(String source) {
+        return new DataModelsSupplier(singletonList(source));
+    }
+
+    @SuppressWarnings("unchecked")
+    private static Map<String, Object> toMap(Map<String, Object> model, String key) {
+        return (Map<String, Object>) model.get(key);
+    }
+}
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 67e8e39..3e44808 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
@@ -35,13 +35,18 @@ public class ManualTest {
     // private static final String CMD = "-i ${JsoupTool.parse(DataSources.first).select('a')[0]} site/sample/html/dependencies.html";
     // private static final String CMD = "-b ./src/test -t templates/properties/csv/locker-test-users.ftl site/sample/properties";
     // private static final String CMD = "-b ./src/test -e UTF-8 -l de_AT -Dcolumn=Order%20ID -Dvalues=226939189,957081544 -Dformat=DEFAULT -Ddelimiter=COMMA -t templates/csv/md/filter.ftl site/sample/csv/sales-records.csv";
-    private static final String CMD = "-E -b ./src/test -t templates/environment.ftl";
+    // private static final String CMD = "-E -b ./src/test -t templates/environment.ftl";
     // 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/json/yaml/transform.ftl site/sample/json/swagger-spec.json";
     // private static final String CMD = "-b ./src/test -t templates/yaml/json/transform.ftl site/sample/yaml/swagger-spec.yaml";
+    // private static final String CMD = "-b ./src/test -t templates/demo.ftl -m env=env:///";
+    private static final String CMD = "-b ./src/test -t templates/demo.ftl -m env:///";
+    // private static final String CMD = "-b ./src/test -t templates/demo.ftl -m env:///HOME";
+    // 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";
 
     public static void main(String[] args) {
         Main.execute(toArgs(CMD));