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() {