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/08/23 18:15:40 UTC

[freemarker-generator] branch FREEMARKER-153 updated: FREEMARKER-153 Bootstrap configuration files from system property "app.home"

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

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


The following commit(s) were added to refs/heads/FREEMARKER-153 by this push:
     new 7bfd310  FREEMARKER-153 Bootstrap configuration files from system property "app.home"
7bfd310 is described below

commit 7bfd310275998af47d36c2276246f50035a02c60
Author: Siegfried Goeschl <si...@gmail.com>
AuthorDate: Sun Aug 23 20:15:26 2020 +0200

    FREEMARKER-153 Bootstrap configuration files from system property "app.home"
---
 .../generator/base/FreeMarkerConstants.java        | 19 +++++++++-
 .../template/TemplateTransformationsBuilder.java   |  1 -
 .../org/apache/freemarker/generator/cli/Main.java  | 26 +++++++++++---
 .../cli/config/TemplateDirectorySupplier.java      | 42 +++++++++++-----------
 .../freemarker/generator/cli/AbstractMainTest.java |  7 +++-
 5 files changed, 68 insertions(+), 27 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 779cf8b..86a69ab 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
@@ -47,6 +47,12 @@ public class FreeMarkerConstants {
         private Configuration() {
         }
 
+        // The default config file for freemarker generator
+        public static final String CONFIG_FILE_NAME = "config/freemarker-generator.properties";
+
+        /** The user's optional ".freemarker-generator" directory in the user's home directory */
+        public static final String USER_CONFIGURATION_DIR_NAME = ".freemarker-generator";
+
         /** Prefix to extract tools from 'freemarker-generator.properties' */
         public static final String TOOLS_PREFIX = "freemarker.tools.";
 
@@ -69,7 +75,6 @@ public class FreeMarkerConstants {
         public static final String STDIN = "stdin";
         public static final String SYSTEM = "system";
         public static final String STRING = "string";
-        public static final String URL = "url";
     }
 
     public static class Model {
@@ -87,4 +92,16 @@ public class FreeMarkerConstants {
         public static final String FREEMARKER_USER_SYSTEM_PROPERTIES = "freemarker.user.system.properties";
         public static final String FREEMARKER_USER_PARAMETERS = "freemarker.user.parameters";
     }
+
+    public static class SystemProperties {
+
+        private SystemProperties() {
+        }
+
+        /** Installation directory of "freemarker-generator" when invoked with shell wrapper */
+        public static final String APP_HOME = "app.home";
+
+        /** Home directory of the user */
+        public static final String USER_HOME = "user.home";
+    }
 }
diff --git a/freemarker-generator-base/src/main/java/org/apache/freemarker/generator/base/template/TemplateTransformationsBuilder.java b/freemarker-generator-base/src/main/java/org/apache/freemarker/generator/base/template/TemplateTransformationsBuilder.java
index 5411152..bdef609 100644
--- a/freemarker-generator-base/src/main/java/org/apache/freemarker/generator/base/template/TemplateTransformationsBuilder.java
+++ b/freemarker-generator-base/src/main/java/org/apache/freemarker/generator/base/template/TemplateTransformationsBuilder.java
@@ -16,7 +16,6 @@
  */
 package org.apache.freemarker.generator.base.template;
 
-import org.apache.freemarker.generator.base.FreeMarkerConstants;
 import org.apache.freemarker.generator.base.FreeMarkerConstants.Location;
 import org.apache.freemarker.generator.base.file.RecursiveFileSupplier;
 import org.apache.freemarker.generator.base.util.NonClosableWriterWrapper;
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 f87cd35..4869909 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,6 +16,8 @@
  */
 package org.apache.freemarker.generator.cli;
 
+import org.apache.freemarker.generator.base.FreeMarkerConstants.Configuration;
+import org.apache.freemarker.generator.base.FreeMarkerConstants.SystemProperties;
 import org.apache.freemarker.generator.base.parameter.ParameterModelSupplier;
 import org.apache.freemarker.generator.base.util.ClosableUtils;
 import org.apache.freemarker.generator.base.util.ListUtils;
@@ -47,14 +49,14 @@ import java.util.stream.IntStream;
 import java.util.stream.Stream;
 
 import static java.util.Objects.requireNonNull;
+import static org.apache.freemarker.generator.base.util.StringUtils.isEmpty;
+import static org.apache.freemarker.generator.base.util.StringUtils.isNotEmpty;
 import static org.apache.freemarker.generator.cli.config.Suppliers.propertiesSupplier;
 import static org.apache.freemarker.generator.cli.config.Suppliers.templateDirectorySupplier;
 
 @Command(description = "Apache FreeMarker Generator", name = "freemarker-generator", mixinStandardHelpOptions = true, versionProvider = GitVersionProvider.class)
 public class Main implements Callable<Integer> {
 
-    private static final String FREEMARKER_GENERATOR_PROPERTY_FILE = "freemarker-generator.properties";
-
     @ArgGroup(multiplicity = "1")
     TemplateSourceOptions templateSourceOptions;
 
@@ -87,7 +89,7 @@ public class Main implements Callable<Integer> {
     @Option(names = { "-s", "--data-source" }, description = "data source used for rendering")
     List<String> dataSources;
 
-    @Option(names = { "--config" }, defaultValue = FREEMARKER_GENERATOR_PROPERTY_FILE, description = "FreeMarker Generator configuration file")
+    @Option(names = { "--config" }, description = "FreeMarker Generator configuration file")
     String configFile;
 
     @Option(names = { "--data-source-include" }, description = "file include pattern for data sources")
@@ -166,7 +168,8 @@ public class Main implements Callable<Integer> {
     private Integer onCall() {
         updateSystemProperties();
 
-        final Properties configuration = loadFreeMarkerCliConfiguration(configFile);
+        final String currentConfigFile = isNotEmpty(configFile) ? configFile : getDefaultConfigFileName();
+        final Properties configuration = loadFreeMarkerCliConfiguration(currentConfigFile);
         final List<File> templateDirectories = getTemplateDirectories(templateDir);
         final Settings settings = settings(configuration, templateDirectories);
 
@@ -262,7 +265,22 @@ public class Main implements Callable<Integer> {
         return templateDirectorySupplier(additionalTemplateDir).get();
     }
 
+    /**
+     * Get the default configuration file based on the "app.home" system property
+     * provided by the shell wrapper.
+     *
+     * @return default configuration file name or null
+     */
+    private static String getDefaultConfigFileName() {
+        final String appHome = System.getProperty(SystemProperties.APP_HOME);
+        return isNotEmpty(appHome) ? new File(appHome, Configuration.CONFIG_FILE_NAME).getAbsolutePath() : null;
+    }
+
     private static Properties loadFreeMarkerCliConfiguration(String fileName) {
+        if (isEmpty(fileName)) {
+            return new Properties();
+        }
+
         final Properties properties = propertiesSupplier(fileName).get();
         if (properties != null) {
             return properties;
diff --git a/freemarker-generator-cli/src/main/java/org/apache/freemarker/generator/cli/config/TemplateDirectorySupplier.java b/freemarker-generator-cli/src/main/java/org/apache/freemarker/generator/cli/config/TemplateDirectorySupplier.java
index 8e644a9..c92c680 100644
--- a/freemarker-generator-cli/src/main/java/org/apache/freemarker/generator/cli/config/TemplateDirectorySupplier.java
+++ b/freemarker-generator-cli/src/main/java/org/apache/freemarker/generator/cli/config/TemplateDirectorySupplier.java
@@ -17,36 +17,29 @@
 package org.apache.freemarker.generator.cli.config;
 
 import org.apache.commons.io.FilenameUtils;
+import org.apache.freemarker.generator.base.FreeMarkerConstants.Configuration;
+import org.apache.freemarker.generator.base.FreeMarkerConstants.SystemProperties;
+import org.apache.freemarker.generator.base.util.StringUtils;
 
 import java.io.File;
 import java.util.ArrayList;
 import java.util.List;
-import java.util.Objects;
 import java.util.function.Supplier;
 
 import static java.util.Arrays.asList;
 import static java.util.stream.Collectors.toList;
+import static org.apache.freemarker.generator.base.util.StringUtils.isNotEmpty;
 
 /**
  * Determine a list of directories to load a relative template file in the following order
  * <ol>
  *    <li>User-defined template directory</li>
- *    <li>Current working directory</li>
  *    <li>~/.freemarker-generator</li>
  *    <li>Application installation directory</li>
  * </ol>
  */
 public class TemplateDirectorySupplier implements Supplier<List<File>> {
 
-    /** Installation directory of "freemarker-generator" when invoked with shell wrapper */
-    private static final String APP_HOME = "app.home";
-
-    /** Home directory of the user */
-    private static final String USER_HOME = "user.home";
-
-    /** The user's optional "freemarker-generator" directory */
-    private static final String USER_CONFIGURATION_DIR_NAME = ".freemarker-generator";
-
     /** Additional template directory, e.g. provided as command line parameter */
     private final String additionalTemplateDirName;
 
@@ -57,7 +50,7 @@ public class TemplateDirectorySupplier implements Supplier<List<File>> {
     @Override
     public List<File> get() {
         return templateLoaderDirectories().stream()
-                .filter(Objects::nonNull)
+                .filter(StringUtils::isNotEmpty)
                 .map(FilenameUtils::normalize)
                 .map(File::new)
                 .distinct()
@@ -74,24 +67,33 @@ public class TemplateDirectorySupplier implements Supplier<List<File>> {
     }
 
     private String additionalTemplatesDirectory() {
-        return additionalTemplateDirName != null ? new File(additionalTemplateDirName).getAbsolutePath() : null;
+        return isNotEmpty(additionalTemplateDirName) ? new File(additionalTemplateDirName).getAbsolutePath() : null;
     }
 
     private String userConfigDirectory() {
-        final String userHomeDir = System.getProperty(USER_HOME);
-        return new File(userHomeDir, USER_CONFIGURATION_DIR_NAME).getAbsolutePath();
+        final String userHomeDir = System.getProperty(SystemProperties.USER_HOME);
+        if (isNotEmpty(userHomeDir)) {
+            return new File(userHomeDir, Configuration.USER_CONFIGURATION_DIR_NAME).getAbsolutePath();
+        } else {
+            return null;
+        }
     }
 
     private String userConfigTemplatesDirectory() {
-        return userConfigDirectory() + "/templates";
+        return templatesDirectory(userConfigDirectory());
     }
 
-    private static String applicationDirectory() {
-        return System.getProperty(APP_HOME);
+    private static String applicationTemplatesDirectory() {
+        final String appHomeDir = System.getProperty(SystemProperties.APP_HOME);
+        return templatesDirectory(appHomeDir);
     }
 
-    private static String applicationTemplatesDirectory() {
-        return applicationDirectory() + "/templates";
+    private static String templatesDirectory(String baseDirName) {
+        if (isNotEmpty(baseDirName)) {
+            return new File(baseDirName, "templates").getAbsolutePath();
+        } else {
+            return null;
+        }
     }
 
     private static boolean isDirectory(File directory) {
diff --git a/freemarker-generator-cli/src/test/java/org/apache/freemarker/generator/cli/AbstractMainTest.java b/freemarker-generator-cli/src/test/java/org/apache/freemarker/generator/cli/AbstractMainTest.java
index 94b8a00..640535c 100644
--- a/freemarker-generator-cli/src/test/java/org/apache/freemarker/generator/cli/AbstractMainTest.java
+++ b/freemarker-generator-cli/src/test/java/org/apache/freemarker/generator/cli/AbstractMainTest.java
@@ -26,6 +26,7 @@ import java.util.Arrays;
  */
 abstract class AbstractMainTest {
 
+    protected static final boolean WRITE_TO_STDOUT = false;
     protected static final String TEST_TEMPLATES_DIRECTORY = "./src/app/templates";
     protected static final String TEST_CONFIG_FILE = "./src/app/config/freemarker-generator.properties";
 
@@ -35,7 +36,11 @@ abstract class AbstractMainTest {
         try (Writer writer = new StringWriter()) {
             final String[] args = buildFinalCommandLine(commandLine).split(SPACE);
             if (Main.execute(args, writer) == 0) {
-                return writer.toString();
+                final String output = writer.toString();
+                if (WRITE_TO_STDOUT) {
+                    System.out.println(output);
+                }
+                return output;
             } else {
                 throw new RuntimeException("Executing freemarker-cli failed: " + Arrays.toString(args));
             }