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/15 22:26:22 UTC
[freemarker-generator] 01/08: FREEMARKER-141 freemarker-cli: Expose
user-supplied parameters in the data model
This is an automated email from the ASF dual-hosted git repository.
sgoeschl pushed a commit to branch FREEMARKER-141
in repository https://gitbox.apache.org/repos/asf/freemarker-generator.git
commit 0dee113a03e2792dbac6583208d0de90b23bfe66
Author: Siegfried Goeschl <si...@gmail.com>
AuthorDate: Sat Apr 11 23:42:05 2020 +0200
FREEMARKER-141 freemarker-cli: Expose user-supplied parameters in the data model
---
.../base/parameter/ParameterDataModelSupplier.java | 89 ++++++++++++++++++++++
.../parameter/ParameterDataModelSupplierTest.java | 80 +++++++++++++++++++
.../generator/uri/NamedUriStringParserTest.java | 11 +++
.../freemarker/generator/cli/PicocliTest.java | 15 ++++
4 files changed, 195 insertions(+)
diff --git a/freemarker-generator-base/src/main/java/org/apache/freemarker/generator/base/parameter/ParameterDataModelSupplier.java b/freemarker-generator-base/src/main/java/org/apache/freemarker/generator/base/parameter/ParameterDataModelSupplier.java
new file mode 100644
index 0000000..78da855
--- /dev/null
+++ b/freemarker-generator-base/src/main/java/org/apache/freemarker/generator/base/parameter/ParameterDataModelSupplier.java
@@ -0,0 +1,89 @@
+/*
+ * 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.base.parameter;
+
+import org.apache.freemarker.generator.base.uri.NamedUri;
+import org.apache.freemarker.generator.base.uri.NamedUriStringParser;
+import org.apache.freemarker.generator.base.util.StringUtils;
+
+import java.util.Collection;
+import java.util.HashMap;
+import java.util.List;
+import java.util.Map;
+import java.util.function.Supplier;
+
+import static java.util.Objects.requireNonNull;
+import static java.util.stream.Collectors.toList;
+
+/**
+ * Converts a list of parameters (as <code>Named Uris</code>)
+ * to a map. The map contains either (key->String) or
+ * (key->Map<String, Object>).
+ */
+public class ParameterDataModelSupplier implements Supplier<Map<String, Object>> {
+
+ private final Collection<String> parameters;
+
+ public ParameterDataModelSupplier(Collection<String> parameters) {
+ this.parameters = requireNonNull(parameters);
+ }
+
+ @Override
+ public Map<String, Object> get() {
+ final List<NamedUri> namedUris = toNamedUris(parameters);
+ return toMap(namedUris);
+ }
+
+ private static Map<String, Object> toMap(List<NamedUri> namedUris) {
+ final Map<String, Object> map = new HashMap<>();
+
+ for (NamedUri namedUri : namedUris) {
+ final String key = namedUri.getName();
+ final String value = namedUri.getUri().getPath().substring(1);
+
+ if (namedUri.hasGroup()) {
+ final String group = namedUri.getGroup();
+ final Map<String, Object> groupMap = getOrCreateGroupMap(map, group);
+ groupMap.put(key, value);
+ } else {
+ map.put(key, value);
+ }
+ }
+
+ return map;
+ }
+
+ private static List<NamedUri> toNamedUris(Collection<String> parameters) {
+ return parameters.stream()
+ .filter(StringUtils::isNotEmpty)
+ .distinct()
+ .map(NamedUriStringParser::parse)
+ .collect(toList());
+ }
+
+ @SuppressWarnings("unchecked")
+ private static Map<String, Object> getOrCreateGroupMap(Map<String, Object> map, String group) {
+ if (map.containsKey(group)) {
+ return (Map<String, Object>) map.get(group);
+ } else {
+ final Map<String, Object> groupMap = new HashMap<>();
+ map.put(group, groupMap);
+ return groupMap;
+ }
+ }
+
+}
diff --git a/freemarker-generator-base/src/test/java/org/apache/freemarker/generator/parameter/ParameterDataModelSupplierTest.java b/freemarker-generator-base/src/test/java/org/apache/freemarker/generator/parameter/ParameterDataModelSupplierTest.java
new file mode 100644
index 0000000..8eeedf8
--- /dev/null
+++ b/freemarker-generator-base/src/test/java/org/apache/freemarker/generator/parameter/ParameterDataModelSupplierTest.java
@@ -0,0 +1,80 @@
+/*
+ * 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.parameter;
+
+import org.apache.freemarker.generator.base.parameter.ParameterDataModelSupplier;
+import org.junit.Test;
+
+import java.util.ArrayList;
+import java.util.Arrays;
+import java.util.Map;
+
+import static org.junit.Assert.assertEquals;
+
+public class ParameterDataModelSupplierTest {
+
+ @Test
+ public void shouldConvertMissingParametersToMap() {
+ assertEquals(0, supplier(new String[0]).get().size());
+ assertEquals(0, supplier("").get().size());
+ }
+
+ @Test
+ public void shouldConverNameValueToMap() {
+ final Map<String, Object> map = supplier("name=value").get();
+
+ assertEquals(1, map.size());
+ assertEquals("value", map.get("name"));
+ }
+
+ @Test
+ public void shouldConvertGroupedNameValueToMap() {
+ final Map<String, Object> map = supplier("name1:group=value1").get();
+
+ assertEquals(1, map.size());
+ assertEquals("value1", toMap(map, "group").get("name1"));
+ }
+
+ @Test
+ public void shouldConvertGroupedNameValuesToMap() {
+ final Map<String, Object> map = supplier("name1:group=value1", "name2:group=value2").get();
+
+ assertEquals(1, map.size());
+ assertEquals("value1", toMap(map, "group").get("name1"));
+ assertEquals("value2", toMap(map, "group").get("name2"));
+ }
+
+ @Test
+ public void shouldConvertMultipleGroupedNameValuesToMap() {
+ final Map<String, Object> map = supplier("name1:group1=value1", "name1:group2=value1", "name2:group2=value2").get();
+
+ assertEquals(2, map.size());
+ assertEquals("value1", toMap(map, "group1").get("name1"));
+ assertEquals("value1", toMap(map, "group2").get("name1"));
+ assertEquals("value2", toMap(map, "group2").get("name2"));
+ }
+
+ private static ParameterDataModelSupplier supplier(String... values) {
+ final ArrayList<String> parameters = new ArrayList<>(Arrays.asList(values));
+ return new ParameterDataModelSupplier(parameters);
+ }
+
+ @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-base/src/test/java/org/apache/freemarker/generator/uri/NamedUriStringParserTest.java b/freemarker-generator-base/src/test/java/org/apache/freemarker/generator/uri/NamedUriStringParserTest.java
index f007064..5de2289 100644
--- a/freemarker-generator-base/src/test/java/org/apache/freemarker/generator/uri/NamedUriStringParserTest.java
+++ b/freemarker-generator-base/src/test/java/org/apache/freemarker/generator/uri/NamedUriStringParserTest.java
@@ -85,6 +85,17 @@ public class NamedUriStringParserTest {
}
@Test
+ public void shouldParseNamedGroupFileName() {
+ final NamedUri namedURI = parse("name:group=users.csv");
+
+ assertEquals("name", namedURI.getName());
+ assertEquals("group", namedURI.getGroup());
+ assertEquals("file:///users.csv", namedURI.getUri().toString());
+ assertEquals("users.csv", namedURI.getFile().getName());
+ assertEquals(0, namedURI.getParameters().size());
+ }
+
+ @Test
public void shouldParseNamedFileUri() {
final NamedUri namedURI = parse("users=file:///users.csv");
diff --git a/freemarker-generator-cli/src/test/java/org/apache/freemarker/generator/cli/PicocliTest.java b/freemarker-generator-cli/src/test/java/org/apache/freemarker/generator/cli/PicocliTest.java
index d5e15d6..d465fd0 100644
--- a/freemarker-generator-cli/src/test/java/org/apache/freemarker/generator/cli/PicocliTest.java
+++ b/freemarker-generator-cli/src/test/java/org/apache/freemarker/generator/cli/PicocliTest.java
@@ -81,6 +81,21 @@ public class PicocliTest {
assertNull(main.sources);
}
+ @Test
+ public void testSingleParameter() {
+ final Main main = parse("-t", TEMPLATE, "-P", "name:group=value");
+
+ assertEquals("value", main.parameters.get("name:group"));
+ }
+
+ @Test
+ public void testMultipleParameters() {
+ final Main main = parse("-t", TEMPLATE, "-P", "name1:group=value1", "-P", "name2:group=value2");
+
+ assertEquals("value1", main.parameters.get("name1:group"));
+ assertEquals("value2", main.parameters.get("name2:group"));
+ }
+
private static Main parse(String... args) {
final Main main = new Main();
new CommandLine(main).parseArgs(args);