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