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);