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));