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:27 UTC
[freemarker-generator] 06/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 8d6050f9b2ccb0a1ac6ce97df0c0d71411563a2c
Author: Siegfried Goeschl <si...@gmail.com>
AuthorDate: Wed Apr 15 22:33:38 2020 +0200
FREEMARKER-141 freemarker-cli: Expose user-supplied parameters in the data model
---
.../generator/base/parameter/Parameter.java | 73 ++++++++++++++++++++++
.../base/parameter/ParameterModelSupplier.java | 54 ++++------------
.../generator/base/parameter/ParameterParser.java | 66 +++++++++++++++++++
.../generator/base/util/StringUtils.java | 11 ++++
.../parameter/ParameterModelSupplierTest.java | 18 +++++-
.../generator/tools/system/SystemTool.java | 8 +--
6 files changed, 180 insertions(+), 50 deletions(-)
diff --git a/freemarker-generator-base/src/main/java/org/apache/freemarker/generator/base/parameter/Parameter.java b/freemarker-generator-base/src/main/java/org/apache/freemarker/generator/base/parameter/Parameter.java
new file mode 100644
index 0000000..707a038
--- /dev/null
+++ b/freemarker-generator-base/src/main/java/org/apache/freemarker/generator/base/parameter/Parameter.java
@@ -0,0 +1,73 @@
+/*
+ * 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 static java.lang.String.format;
+import static java.util.Objects.requireNonNull;
+import static org.apache.freemarker.generator.base.util.StringUtils.isNotEmpty;
+
+/**
+ * Caputeres the information of a user-supplied parameter.
+ */
+public class Parameter {
+
+ /** User-supplied name */
+ private final String name;
+
+ /** User-supplied group */
+ private final String group;
+
+ /** User-supplied value */
+ private final String value;
+
+ public Parameter(String name, String value) {
+ this.name = requireNonNull(name);
+ this.group = null;
+ this.value = requireNonNull(value);
+ }
+
+ public Parameter(String name, String group, String value) {
+ this.name = requireNonNull(name);
+ this.group = requireNonNull(group);
+ this.value = requireNonNull(value);
+ }
+
+ public String getName() {
+ return name;
+ }
+
+ public String getGroup() {
+ return group;
+ }
+
+ public String getValue() {
+ return value;
+ }
+
+ public boolean hasGroup() {
+ return isNotEmpty(group);
+ }
+
+ public String getKey() {
+ return hasGroup() ? format("%s:%s", name, group) : format("%s", name);
+ }
+
+ @Override
+ public String toString() {
+ return format("%s=%s", getKey(), value);
+ }
+}
diff --git a/freemarker-generator-base/src/main/java/org/apache/freemarker/generator/base/parameter/ParameterModelSupplier.java b/freemarker-generator-base/src/main/java/org/apache/freemarker/generator/base/parameter/ParameterModelSupplier.java
index 29503a6..da5a757 100644
--- a/freemarker-generator-base/src/main/java/org/apache/freemarker/generator/base/parameter/ParameterModelSupplier.java
+++ b/freemarker-generator-base/src/main/java/org/apache/freemarker/generator/base/parameter/ParameterModelSupplier.java
@@ -16,70 +16,44 @@
*/
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 java.util.stream.Collectors;
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>).
+ * Converts a map of parameters to a map. The resulting map contains
+ * either (key -> String) or (key -> Map<String, Object>).
*/
public class ParameterModelSupplier implements Supplier<Map<String, Object>> {
- private final Collection<String> parameters;
+ private final Map<String, String> parameters;
public ParameterModelSupplier(Map<String, String> parameters) {
- this(toStrings(parameters));
- }
-
- public ParameterModelSupplier(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();
+ for (Map.Entry<String, String> entry : parameters.entrySet()) {
+ final Parameter parameter = ParameterParser.parse(entry.getKey(), entry.getValue());
+ final String name = parameter.getName();
+ final String value = parameter.getValue();
- if (namedUri.hasGroup()) {
- final String group = namedUri.getGroup();
- final Map<String, Object> groupMap = getOrCreateGroupMap(map, group);
- groupMap.put(key, value);
+ if (parameter.hasGroup()) {
+ final String group = parameter.getGroup();
+ getOrCreateGroupMap(map, group).put(name, value);
} else {
- map.put(key, value);
+ map.put(parameter.getName(), 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)) {
@@ -90,10 +64,4 @@ public class ParameterModelSupplier implements Supplier<Map<String, Object>> {
return groupMap;
}
}
-
- private static Collection<String> toStrings(Map<String, String> parameters) {
- return parameters.entrySet().stream()
- .map(e -> e.getKey() + "=" + e.getValue())
- .collect(Collectors.toList());
- }
}
diff --git a/freemarker-generator-base/src/main/java/org/apache/freemarker/generator/base/parameter/ParameterParser.java b/freemarker-generator-base/src/main/java/org/apache/freemarker/generator/base/parameter/ParameterParser.java
new file mode 100644
index 0000000..4bf7b75
--- /dev/null
+++ b/freemarker-generator-base/src/main/java/org/apache/freemarker/generator/base/parameter/ParameterParser.java
@@ -0,0 +1,66 @@
+/*
+ * 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.util.Validate;
+
+import java.util.regex.Matcher;
+import java.util.regex.Pattern;
+
+import static java.lang.String.format;
+import static java.util.regex.Pattern.compile;
+import static org.apache.freemarker.generator.base.util.StringUtils.count;
+import static org.apache.freemarker.generator.base.util.StringUtils.isEmpty;
+
+/**
+ * Parses a parameter provided by the user
+ * <ul>
+ * <li>name=value</li>
+ * <li>name:group=value</li>
+ * </ul>
+ */
+public class ParameterParser {
+
+ private static final String NAME = "name";
+ private static final String GROUP = "group";
+ private static final Pattern NAME_GROUP_REGEXP = compile("^(?<name>[a-zA-Z0-9-._]*):?(?<group>[a-zA-Z0-9-._]*)");
+
+ public static Parameter parse(String str) {
+ Validate.notEmpty(str, "parameter is empty");
+ Validate.isTrue(count(str, '=') == 1, "invalid parameter");
+
+ final String[] parts = str.split("=");
+ return parse(parts[0], parts[1]);
+ }
+
+ public static Parameter parse(String key, String value) {
+ Validate.notEmpty(key, "key is empty");
+ Validate.notEmpty(value, "value is empty");
+
+ final Matcher matcher = NAME_GROUP_REGEXP.matcher(key);
+
+ if (matcher.matches()) {
+ return parameter(matcher.group(NAME), matcher.group(GROUP), value);
+ } else {
+ throw new IllegalArgumentException(format("Unable to parse parameter: %s=%s", key, value));
+ }
+ }
+
+ private static Parameter parameter(String name, String group, String value) {
+ return isEmpty(group) ? new Parameter(name, value) : new Parameter(name, group, value);
+ }
+}
\ No newline at end of file
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 24b81af..a36bf1e 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,4 +45,15 @@ public class StringUtils {
return null;
}
+ public static int count(final String s, final char c) {
+ final char[] chars = s.toCharArray();
+ int count = 0;
+ for (final char aChar : chars) {
+ if (aChar == c) {
+ count++;
+ }
+ }
+ return count;
+ }
+
}
diff --git a/freemarker-generator-base/src/test/java/org/apache/freemarker/generator/parameter/ParameterModelSupplierTest.java b/freemarker-generator-base/src/test/java/org/apache/freemarker/generator/parameter/ParameterModelSupplierTest.java
index 73ce918..3ad7bc7 100644
--- a/freemarker-generator-base/src/test/java/org/apache/freemarker/generator/parameter/ParameterModelSupplierTest.java
+++ b/freemarker-generator-base/src/test/java/org/apache/freemarker/generator/parameter/ParameterModelSupplierTest.java
@@ -16,12 +16,14 @@
*/
package org.apache.freemarker.generator.parameter;
+import org.apache.freemarker.generator.base.parameter.Parameter;
import org.apache.freemarker.generator.base.parameter.ParameterModelSupplier;
+import org.apache.freemarker.generator.base.parameter.ParameterParser;
import org.junit.Test;
-import java.util.ArrayList;
import java.util.Arrays;
import java.util.Map;
+import java.util.stream.Collectors;
import static org.junit.Assert.assertEquals;
@@ -30,7 +32,6 @@ public class ParameterModelSupplierTest {
@Test
public void shouldConvertMissingParametersToMap() {
assertEquals(0, supplier(new String[0]).get().size());
- assertEquals(0, supplier("").get().size());
}
@Test
@@ -42,6 +43,14 @@ public class ParameterModelSupplierTest {
}
@Test
+ public void shouldConverNameValueWithSpacesToMap() {
+ final Map<String, Object> map = supplier("name=value with spaces").get();
+
+ assertEquals(1, map.size());
+ assertEquals("value with spaces", map.get("name"));
+ }
+
+ @Test
public void shouldConvertGroupedNameValueToMap() {
final Map<String, Object> map = supplier("name1:group=value1").get();
@@ -69,7 +78,10 @@ public class ParameterModelSupplierTest {
}
private static ParameterModelSupplier supplier(String... values) {
- final ArrayList<String> parameters = new ArrayList<>(Arrays.asList(values));
+ final Map<String, String> parameters = Arrays.stream(values)
+ .map(ParameterParser::parse)
+ .collect(Collectors.toMap(Parameter::getKey, Parameter::getValue));
+
return new ParameterModelSupplier(parameters);
}
diff --git a/freemarker-generator-tools/src/main/java/org/apache/freemarker/generator/tools/system/SystemTool.java b/freemarker-generator-tools/src/main/java/org/apache/freemarker/generator/tools/system/SystemTool.java
index 2b50c99..183b9da 100644
--- a/freemarker-generator-tools/src/main/java/org/apache/freemarker/generator/tools/system/SystemTool.java
+++ b/freemarker-generator-tools/src/main/java/org/apache/freemarker/generator/tools/system/SystemTool.java
@@ -92,12 +92,12 @@ public class SystemTool {
return System.getProperties();
}
- public String getParameter(String key) {
- return parameters.get(key);
+ public String getParameter(String name) {
+ return parameters.get(name);
}
- public String getParameter(String key, String def) {
- return parameters.getOrDefault(key, def);
+ public String getParameter(String name, String def) {
+ return parameters.getOrDefault(name, def);
}
public Map<String, String> getParameters() {