This is an automated email from the ASF dual-hosted git repository.

sgoeschl pushed a commit to branch master
in repository https://gitbox.apache.org/repos/asf/freemarker-generator.git


The following commit(s) were added to refs/heads/master by this push:
     new cbe5f54  Minor code cleanup and improvements
cbe5f54 is described below

commit cbe5f548c9dce47f59fd687e09a1f67c8a399a37
Author: Siegfried Goeschl <[email protected]>
AuthorDate: Tue May 12 21:16:02 2020 +0200

    Minor code cleanup and improvements
---
 .../generator/base/FreeMarkerConstants.java        |   7 +-
 .../base/datasource/DataSourcesSupplier.java       |   4 +-
 .../generator/base/util/MapFlattener.java          | 124 +++++++++++++++++++++
 .../generator/util/MapFlattenerTest.java           |  27 +++++
 .../org/apache/freemarker/generator/cli/Main.java  |  20 +---
 .../freemarker/generator/cli/config/Settings.java  |   2 +-
 .../generator/cli/task/FreeMarkerTask.java         |   3 +-
 7 files changed, 161 insertions(+), 26 deletions(-)

diff --git 
a/freemarker-generator-base/src/main/java/org/apache/freemarker/generator/base/FreeMarkerConstants.java
 
b/freemarker-generator-base/src/main/java/org/apache/freemarker/generator/base/FreeMarkerConstants.java
index 0f7aab9..584fcbd 100644
--- 
a/freemarker-generator-base/src/main/java/org/apache/freemarker/generator/base/FreeMarkerConstants.java
+++ 
b/freemarker-generator-base/src/main/java/org/apache/freemarker/generator/base/FreeMarkerConstants.java
@@ -41,12 +41,7 @@ public class FreeMarkerConstants {
 
     /* Default group name for data sources */
     public static final String DEFAULT_GROUP = "default";
-
-    public enum GeneratorMode {
-        DATASOURCE,
-        TEMPLATE
-    }
-
+    
     public static class Configuration {
 
         private Configuration() {
diff --git 
a/freemarker-generator-base/src/main/java/org/apache/freemarker/generator/base/datasource/DataSourcesSupplier.java
 
b/freemarker-generator-base/src/main/java/org/apache/freemarker/generator/base/datasource/DataSourcesSupplier.java
index a514b8a..6e741e3 100644
--- 
a/freemarker-generator-base/src/main/java/org/apache/freemarker/generator/base/datasource/DataSourcesSupplier.java
+++ 
b/freemarker-generator-base/src/main/java/org/apache/freemarker/generator/base/datasource/DataSourcesSupplier.java
@@ -105,7 +105,7 @@ public class DataSourcesSupplier implements 
Supplier<List<DataSource>> {
         final String path = namedUri.getFile().getPath();
         final String group = namedUri.getGroupOrElse(DEFAULT_GROUP);
         final Charset currCharset = getCharsetOrElse(namedUri, charset);
-        return fileResolver(path, include, exclude).get().stream()
+        return fileSupplier(path, include, exclude).get().stream()
                 .map(file -> 
DataSourceFactory.fromFile(getDataSourceName(namedUri, file), group, file, 
currCharset))
                 .collect(toList());
     }
@@ -115,7 +115,7 @@ public class DataSourcesSupplier implements 
Supplier<List<DataSource>> {
         return DataSourceFactory.fromNamedUri(namedUri);
     }
 
-    private static RecursiveFileSupplier fileResolver(String source, String 
include, String exclude) {
+    private static RecursiveFileSupplier fileSupplier(String source, String 
include, String exclude) {
         return new RecursiveFileSupplier(singletonList(source), 
singletonList(include), singletonList(exclude));
     }
 
diff --git 
a/freemarker-generator-base/src/main/java/org/apache/freemarker/generator/base/util/MapFlattener.java
 
b/freemarker-generator-base/src/main/java/org/apache/freemarker/generator/base/util/MapFlattener.java
new file mode 100644
index 0000000..3800add
--- /dev/null
+++ 
b/freemarker-generator-base/src/main/java/org/apache/freemarker/generator/base/util/MapFlattener.java
@@ -0,0 +1,124 @@
+package org.apache.freemarker.generator.base.util;
+
+import java.util.Iterator;
+import java.util.LinkedHashMap;
+import java.util.Map;
+import java.util.Map.Entry;
+import java.util.function.Function;
+import java.util.function.UnaryOperator;
+
+/**
+ * Flattens a hierarchical {@link Map} of objects into a property {@link Map}.
+ * <p>
+ * Flattening is particularly useful when representing a JSON object as
+ * {@link java.util.Properties}
+ * <p>
+ * {@link MapFlattener} flattens {@link Map maps} containing nested
+ * {@link java.util.List}, {@link Map} and simple values into a flat 
representation. The
+ * hierarchical structure is reflected in properties using dot-notation. 
Nested maps are
+ * considered as sub-documents.
+ * <p>
+ * Input:
+ *
+ * <pre class="code">
+ *     {"key": {"nested: 1}, "another.key": ["one", "two"] }
+ * </pre>
+ *
+ * <br>
+ * Result
+ *
+ * <pre class="code">
+ *  key.nested=1
+ *  another.key[0]=one
+ *  another.key[1]=two
+ * </pre>
+ *
+ * @author Mark Paluch
+ * <p>
+ * Copied from 
https://github.com/spring-projects/spring-vault/blob/master/spring-vault-core/src/main/java/org/springframework/vault/support/JsonMapFlattener.java
+ */
+public abstract class MapFlattener {
+
+    private MapFlattener() {
+    }
+
+    /**
+     * Flatten a hierarchical {@link Map} into a flat {@link Map} with key 
names using
+     * property dot notation.
+     *
+     * @param inputMap must not be {@literal null}.
+     * @return the resulting {@link Map}.
+     */
+    public static Map<String, Object> flatten(Map<String, ?> inputMap) {
+        Validate.notNull(inputMap, "Input Map must not be null");
+
+        final Map<String, Object> resultMap = new LinkedHashMap<>();
+        doFlatten("", inputMap.entrySet().iterator(), resultMap, 
UnaryOperator.identity());
+        return resultMap;
+    }
+
+    /**
+     * Flatten a hierarchical {@link Map} into a flat {@link Map} with key 
names using
+     * property dot notation.
+     *
+     * @param inputMap must not be {@literal null}.
+     * @return the resulting {@link Map}.
+     * @since 2.0
+     */
+    public static Map<String, String> flattenToStringMap(Map<String, ?> 
inputMap) {
+        Validate.notNull(inputMap, "inputMap is null");
+
+        final Map<String, String> resultMap = new LinkedHashMap<>();
+        doFlatten("", inputMap.entrySet().iterator(), resultMap, it -> it == 
null ? null : it.toString());
+        return resultMap;
+    }
+
+    private static void doFlatten(String propertyPrefix,
+                                  Iterator<? extends Entry<String, ?>> 
inputMap,
+                                  Map<String, ?> resultMap,
+                                  Function<Object, Object> valueTransformer) {
+
+        if (StringUtils.isNotEmpty(propertyPrefix)) {
+            propertyPrefix = propertyPrefix + ".";
+        }
+
+        while (inputMap.hasNext()) {
+            final Entry<String, ?> entry = inputMap.next();
+            flattenElement(
+                    propertyPrefix.concat(entry.getKey()),
+                    entry.getValue(),
+                    resultMap,
+                    valueTransformer);
+        }
+    }
+
+    @SuppressWarnings("unchecked")
+    private static void flattenElement(String propertyPrefix, Object source,
+                                       Map<String, ?> resultMap, 
Function<Object, Object> valueTransformer) {
+
+        if (source instanceof Iterable) {
+            flattenCollection(propertyPrefix, (Iterable<Object>) source, 
resultMap,
+                    valueTransformer);
+            return;
+        }
+
+        if (source instanceof Map) {
+            doFlatten(propertyPrefix, ((Map<String, ?>) 
source).entrySet().iterator(),
+                    resultMap, valueTransformer);
+            return;
+        }
+
+        ((Map) resultMap).put(propertyPrefix, valueTransformer.apply(source));
+    }
+
+    private static void flattenCollection(String propertyPrefix,
+                                          Iterable<Object> iterable, 
Map<String, ?> resultMap,
+                                          Function<Object, Object> 
valueTransformer) {
+
+        int counter = 0;
+        for (Object element : iterable) {
+            flattenElement(propertyPrefix + "[" + counter + "]", element, 
resultMap, valueTransformer);
+            counter++;
+        }
+    }
+}
diff --git 
a/freemarker-generator-base/src/test/java/org/apache/freemarker/generator/util/MapFlattenerTest.java
 
b/freemarker-generator-base/src/test/java/org/apache/freemarker/generator/util/MapFlattenerTest.java
new file mode 100644
index 0000000..882ffe5
--- /dev/null
+++ 
b/freemarker-generator-base/src/test/java/org/apache/freemarker/generator/util/MapFlattenerTest.java
@@ -0,0 +1,27 @@
+package org.apache.freemarker.generator.util;
+
+import org.apache.freemarker.generator.base.util.MapFlattener;
+import org.junit.Test;
+
+import java.util.Collections;
+import java.util.Map;
+
+import static org.junit.Assert.assertEquals;
+import static org.junit.Assert.assertTrue;
+
+public class MapFlattenerTest {
+
+    @Test
+    public void shouldHandleEmptyMap() {
+        final Map<String, Object> result = 
MapFlattener.flatten(Collections.emptyMap());
+
+        assertTrue(result.isEmpty());
+    }
+
+    @Test
+    public void shouldPreserveFlatMap() {
+        final Map<String, Object> result = 
MapFlattener.flatten(Collections.singletonMap("key", "value"));
+
+        assertEquals("value", result.get("key"));
+    }
+}
diff --git 
a/freemarker-generator-cli/src/main/java/org/apache/freemarker/generator/cli/Main.java
 
b/freemarker-generator-cli/src/main/java/org/apache/freemarker/generator/cli/Main.java
index eda635e..c3c319a 100644
--- 
a/freemarker-generator-cli/src/main/java/org/apache/freemarker/generator/cli/Main.java
+++ 
b/freemarker-generator-cli/src/main/java/org/apache/freemarker/generator/cli/Main.java
@@ -16,7 +16,6 @@
  */
 package org.apache.freemarker.generator.cli;
 
-import org.apache.freemarker.generator.base.FreeMarkerConstants.GeneratorMode;
 import org.apache.freemarker.generator.base.parameter.ParameterModelSupplier;
 import org.apache.freemarker.generator.base.util.ClosableUtils;
 import org.apache.freemarker.generator.base.util.StringUtils;
@@ -104,9 +103,6 @@ public class Main implements Callable<Integer> {
     @Option(names = { "--output-encoding" }, description = "Encoding of 
output, e.g. UTF-8", defaultValue = "UTF-8")
     String outputEncoding;
 
-    @Option(names = { "--mode" }, description = "[template|datasource]", 
defaultValue = "TEMPLATE")
-    GeneratorMode mode;
-
     @Option(names = { "--stdin" }, description = "Read data  source from 
stdin")
     boolean readFromStdin;
 
@@ -255,18 +251,10 @@ public class Main implements Callable<Integer> {
      * @return List of data sources
      */
     private List<String> getCombindedDataSources() {
-        if (isTemplateDrivenGeneration()) {
-            return Stream.of(dataSources, sources)
-                    .filter(Objects::nonNull)
-                    .flatMap(Collection::stream)
-                    .collect(Collectors.toList());
-        } else {
-            throw new IllegalArgumentException("Not implemented yet");
-        }
-    }
-
-    private boolean isTemplateDrivenGeneration() {
-        return mode == GeneratorMode.TEMPLATE;
+        return Stream.of(dataSources, sources)
+                .filter(Objects::nonNull)
+                .flatMap(Collection::stream)
+                .collect(Collectors.toList());
     }
 
     private static List<File> getTemplateDirectories(String baseDir) {
diff --git 
a/freemarker-generator-cli/src/main/java/org/apache/freemarker/generator/cli/config/Settings.java
 
b/freemarker-generator-cli/src/main/java/org/apache/freemarker/generator/cli/config/Settings.java
index 5163aed..3b53e71 100644
--- 
a/freemarker-generator-cli/src/main/java/org/apache/freemarker/generator/cli/config/Settings.java
+++ 
b/freemarker-generator-cli/src/main/java/org/apache/freemarker/generator/cli/config/Settings.java
@@ -49,7 +49,7 @@ public class Settings {
     /** Command line arguments */
     private final List<String> args;
 
-    /** List of FreeMarker template directories */
+    /** List of FreeMarker template directories to be passed to FreeMarker 
<code>TemplateLoader</code> */
     private final List<File> templateDirectories;
 
     /** Name of the template to be loaded and rendered */
diff --git 
a/freemarker-generator-cli/src/main/java/org/apache/freemarker/generator/cli/task/FreeMarkerTask.java
 
b/freemarker-generator-cli/src/main/java/org/apache/freemarker/generator/cli/task/FreeMarkerTask.java
index 803b9c2..618fef9 100644
--- 
a/freemarker-generator-cli/src/main/java/org/apache/freemarker/generator/cli/task/FreeMarkerTask.java
+++ 
b/freemarker-generator-cli/src/main/java/org/apache/freemarker/generator/cli/task/FreeMarkerTask.java
@@ -42,6 +42,7 @@ import static java.util.Objects.requireNonNull;
 import static 
org.apache.freemarker.generator.base.FreeMarkerConstants.DEFAULT_GROUP;
 import static 
org.apache.freemarker.generator.base.FreeMarkerConstants.Location.STDIN;
 import static 
org.apache.freemarker.generator.base.FreeMarkerConstants.Model.DATASOURCES;
+import static 
org.apache.freemarker.generator.base.mime.Mimetypes.MIME_TEXT_PLAIN;
 import static 
org.apache.freemarker.generator.cli.config.Suppliers.configurationSupplier;
 import static 
org.apache.freemarker.generator.cli.config.Suppliers.dataModelSupplier;
 import static 
org.apache.freemarker.generator.cli.config.Suppliers.dataSourcesSupplier;
@@ -106,7 +107,7 @@ public class FreeMarkerTask implements Callable<Integer> {
         // this allows easy sequence slicing in FreeMarker.
         if (settings.isReadFromStdin()) {
             final URI uri = UriUtils.toURI(Location.SYSTEM, "in");
-            dataSources.add(0, DataSourceFactory.fromInputStream(STDIN, 
DEFAULT_GROUP, uri, System.in, "text/plain", UTF_8));
+            dataSources.add(0, DataSourceFactory.fromInputStream(STDIN, 
DEFAULT_GROUP, uri, System.in, MIME_TEXT_PLAIN, UTF_8));
         }
 
         return new DataSources(dataSources);

Reply via email to