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 <[email protected]> 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));
