From dbc0a8433134a341f6a359234e62b744f1a9555c Mon Sep 17 00:00:00 2001
From: Kai Reinhard <K.Reinhard@micromata.de>
Date: Sat, 17 Apr 2021 12:09:49 +0000
Subject: [PATCH] WIP

---
 borgbutler-server/src/main/kotlin/de/micromata/borgbutler/server/ServerConfiguration.kt        |   17 ---
 /dev/null                                                                                      |   87 ---------------------
 borgbutler-server/src/main/java/de/micromata/borgbutler/server/Version.java                    |    2 
 borgbutler-server/src/main/kotlin/de/micromata/borgbutler/server/BorgButlerApplication.kt      |   22 ++--
 borgbutler-server/src/main/java/de/micromata/borgbutler/server/BorgInstallation.java           |    5 
 borgbutler-core/src/main/kotlin/de/micromata/borgbutler/config/ConfigurationHandler.kt         |   22 +++--
 borgbutler-server/src/main/kotlin/de/micromata/borgbutler/server/rest/RestUtils.kt             |    2 
 borgbutler-server/src/main/kotlin/de/micromata/borgbutler/server/rest/FilesystemBrowserRest.kt |    2 
 borgbutler-server/src/main/kotlin/de/micromata/borgbutler/server/RunningMode.kt                |   72 ++++++++++++++++++
 borgbutler-server/src/main/kotlin/de/micromata/borgbutler/server/WebConfig.kt                  |    3 
 10 files changed, 103 insertions(+), 131 deletions(-)

diff --git a/borgbutler-core/src/main/kotlin/de/micromata/borgbutler/config/ConfigurationHandler.kt b/borgbutler-core/src/main/kotlin/de/micromata/borgbutler/config/ConfigurationHandler.kt
index d4f9444..2fdc9f1 100644
--- a/borgbutler-core/src/main/kotlin/de/micromata/borgbutler/config/ConfigurationHandler.kt
+++ b/borgbutler-core/src/main/kotlin/de/micromata/borgbutler/config/ConfigurationHandler.kt
@@ -1,7 +1,5 @@
 package de.micromata.borgbutler.config
 
-import de.micromata.borgbutler.config.Definitions
-import de.micromata.borgbutler.json.JsonUtils
 import mu.KotlinLogging
 import org.apache.commons.io.FileUtils
 import java.io.File
@@ -23,14 +21,8 @@
     private var configuration: Configuration? = null
 
     private fun read() {
-        if (configFile.canRead()) {
-            log.info("Reading config file '" + configFile.absolutePath + "'")
-            val jsonConfigFile = File(workingDir, CONFIG_FILENAME)
-            if (jsonConfigFile.canRead()) {
-                val yaml = FileUtils.readFileToString(jsonConfigFile, Definitions.STD_CHARSET)
-                configuration = YamlUtils.fromYaml(configClazz, yaml)
-            }
-        } else {
+        configuration = readJsonConfigfile(workingDir)
+        if (configuration == null) {
             Legacy.readOldJsonConfigFile(workingDir, OLD_JSON_CONFIG_FILENAME)?.let {
                 configuration = it
                 save()
@@ -120,6 +112,16 @@
         fun getConfigClazz(): Class<out Configuration> {
             return configClazz
         }
+
+        fun readJsonConfigfile(workingDir: File): Configuration? {
+            val configFile = File(workingDir, CONFIG_FILENAME)
+            if (!configFile.canRead()) {
+                return null
+            }
+            log.info("Reading config file '" + configFile.absolutePath + "'")
+            val yaml = FileUtils.readFileToString(configFile, Definitions.STD_CHARSET)
+            return YamlUtils.fromYaml(configClazz, yaml)
+        }
     }
 
     init {
diff --git a/borgbutler-server/src/main/java/de/micromata/borgbutler/server/BorgInstallation.java b/borgbutler-server/src/main/java/de/micromata/borgbutler/server/BorgInstallation.java
index 2f288ff..de65328 100644
--- a/borgbutler-server/src/main/java/de/micromata/borgbutler/server/BorgInstallation.java
+++ b/borgbutler-server/src/main/java/de/micromata/borgbutler/server/BorgInstallation.java
@@ -37,10 +37,9 @@
         }
         borgVersion.setBinariesDownloadVersion(configuration.getBorgVersion());
         initialize(getBinary(RunningMode.getOSType()));
-        if (version(configuration)) {
-            return;
+        if (!borgVersion.isVersionOK()) {
+            log.warn("No working borg version found. Please configure a borg version with minimal version '" + borgVersion.getMinimumRequiredBorgVersion() + "'.");
         }
-        log.warn("No working borg version found. Please configure a borg version with minimal version '" + borgVersion.getMinimumRequiredBorgVersion() + "'.");
     }
 
     /**
diff --git a/borgbutler-server/src/main/java/de/micromata/borgbutler/server/RunningMode.java b/borgbutler-server/src/main/java/de/micromata/borgbutler/server/RunningMode.java
deleted file mode 100644
index 3da4739..0000000
--- a/borgbutler-server/src/main/java/de/micromata/borgbutler/server/RunningMode.java
+++ /dev/null
@@ -1,87 +0,0 @@
-package de.micromata.borgbutler.server;
-
-import org.slf4j.Logger;
-import org.slf4j.LoggerFactory;
-
-import java.io.File;
-import java.util.TimeZone;
-
-public class RunningMode {
-    private static Logger log = LoggerFactory.getLogger(RunningMode.class);
-    private static OSType osType;
-
-    public enum Mode {PRODUCTION, DEVELOPMENT}
-
-    public enum ServerType {DESKTOP, SERVER}
-
-    public enum UserManagement {SINGLE}
-
-    public enum OSType {MAC_OS, WINDOWS, LINUX, FREEBSD, OTHER}
-
-    private static boolean running;
-    private static File baseDir;
-    private static Boolean development;
-    private static ServerType serverType;
-    private static UserManagement userManagement = UserManagement.SINGLE;
-
-    public static Mode getMode() {
-        return isDevelopmentMode() ? Mode.DEVELOPMENT : Mode.PRODUCTION;
-    }
-
-    public static boolean isDevelopmentMode() {
-        if (development == null) {
-            development = new File(ServerConfiguration.getApplicationHome(), "borgbutler-core").exists();
-            if (development) {
-                log.warn("*** Starting BorgButler server in development mode. This mode shouldn't be used in production environments. ***");
-            }
-        }
-        return development;
-    }
-
-    public static OSType getOSType() {
-        if (osType == null) {
-            String osTypeString = System.getProperty("os.name");
-            if (osTypeString == null) {
-                osType = OSType.OTHER;
-            } else if (osTypeString.toLowerCase().contains("mac")) {
-                osType = OSType.MAC_OS;
-            } else if (osTypeString.toLowerCase().contains("win")) {
-                osType = OSType.WINDOWS;
-            } else if (osTypeString.toLowerCase().contains("linux")) {
-                osType = OSType.LINUX;
-            } else if (osTypeString.toLowerCase().contains("freebsd")) {
-                osType = OSType.FREEBSD;
-            } else {
-                osType = OSType.OTHER;
-            }
-        }
-        return osType;
-    }
-
-    public static ServerType getServerType() {
-        return serverType;
-    }
-
-    public static void setServerType(ServerType serverType) {
-        if (RunningMode.serverType != null && serverType != RunningMode.serverType) {
-            throw new IllegalArgumentException("Can't set server-type twice with different values: new='"
-                    + serverType + "', old='" + RunningMode.serverType + "'.");
-        }
-        RunningMode.serverType = serverType;
-    }
-
-    public static UserManagement getUserManagement() {
-        return userManagement;
-    }
-
-    /**
-     * After setting all values you should call this method for a logging output with all current settings.
-     */
-    public static void logMode() {
-        log.info("Starting " + Version.getInstance().getAppName() + " " + Version.getInstance().getVersion()
-                + " (" + Version.getInstance().formatBuildDateISO(TimeZone.getDefault())
-                + ") with: mode='" + RunningMode.getMode() + "', serverType='" + RunningMode.serverType
-                + "', home dir='" + ServerConfiguration.getApplicationHome() + "', javaVersion='"
-                + System.getProperty("java.version") + "'.");
-    }
-}
diff --git a/borgbutler-server/src/main/java/de/micromata/borgbutler/server/Version.java b/borgbutler-server/src/main/java/de/micromata/borgbutler/server/Version.java
index 7afb727..ebbd2fa 100644
--- a/borgbutler-server/src/main/java/de/micromata/borgbutler/server/Version.java
+++ b/borgbutler-server/src/main/java/de/micromata/borgbutler/server/Version.java
@@ -31,7 +31,7 @@
             }
             try (InputStream inputStream = ClassLoader.getSystemResourceAsStream("version.properties")) {
                 if (inputStream == null) {
-                    log.warn("version.properties not found (OK, if started e. g. in IDE");
+                    log.warn("version.properties not found (OK, if started e. g. in IDE).");
                     version = "99.0";
                     appName = "BorgButler";
                     buildDate = new Date();
diff --git a/borgbutler-server/src/main/kotlin/de/micromata/borgbutler/server/BorgButlerApplication.kt b/borgbutler-server/src/main/kotlin/de/micromata/borgbutler/server/BorgButlerApplication.kt
index e90f96c..983d9e3 100644
--- a/borgbutler-server/src/main/kotlin/de/micromata/borgbutler/server/BorgButlerApplication.kt
+++ b/borgbutler-server/src/main/kotlin/de/micromata/borgbutler/server/BorgButlerApplication.kt
@@ -1,6 +1,7 @@
 package de.micromata.borgbutler.server
 
 import de.micromata.borgbutler.cache.ButlerCache
+import de.micromata.borgbutler.config.ConfigurationHandler
 import de.micromata.borgbutler.config.ConfigurationHandler.Companion.init
 import de.micromata.borgbutler.config.ConfigurationHandler.Companion.setConfigClazz
 import de.micromata.borgbutler.server.user.SingleUserManager
@@ -42,13 +43,19 @@
             borgButlerHome = File(System.getProperty("user.home"), ".borgbutler").absolutePath
             System.setProperty("BorgButlerHome", borgButlerHome)
         }
+        // Preread configuration to get setting development mode for WebConfig (logging not yet initialized, so
+        // reread configuration later after logging is available for getting log information on errors etc.)
+        val configuration = ConfigurationHandler.readJsonConfigfile(File(borgButlerHome))
+        RunningMode.webDevelopment = RunningMode.runningInIDE || (configuration as? ServerConfiguration)?.webDevelopmentMode == true
         if (System.getProperty("LOG_PATH").isNullOrBlank()) {
+            // Needed by logback-spring.xml
             System.setProperty("LOG_PATH", borgButlerHome)
         }
+        SpringApplication.run(BorgButlerApplication::class.java, *args)
+
         if (borgButlerHome != null) {
             init(borgButlerHome)
         }
-        SpringApplication.run(BorgButlerApplication::class.java, *args)
         // create Options object
         val options = Options()
         options.addOption(
@@ -89,11 +96,6 @@
                     return
                 }
             }
-            if (Desktop.isDesktopSupported()) {
-                RunningMode.setServerType(RunningMode.ServerType.DESKTOP)
-            } else {
-                RunningMode.setServerType(RunningMode.ServerType.SERVER)
-            }
             RunningMode.logMode()
 
             UserManager.setUserManager(SingleUserManager())
@@ -104,9 +106,7 @@
             val url = "http://$serverAddress:$serverPort/".replace("0.0.0.0", "127.0.0.1")
             val uri = URI.create(url)
             val quietMode = line.hasOption('q')
-            val desktopSupportsBrowse = Desktop.isDesktopSupported() && Desktop.getDesktop().isSupported(Desktop.Action.BROWSE)
-            val headlessMode = System.getProperty("java.awt.headless") == "true"
-            if (!quietMode && desktopSupportsBrowse && headlessMode) {
+            if (!quietMode && RunningMode.desktopSupportsBrowse && RunningMode.headlessMode) {
                 try {
                     log.info { "Trying to open your local web browser: $uri" }
                     Desktop.getDesktop().browse(uri)
@@ -117,9 +117,9 @@
             } else {
                 if (quietMode) {
                     log.info("Server started in quiet mode (option -q). Please open your browser manually: $uri")
-                } else if (!desktopSupportsBrowse) {
+                } else if (!RunningMode.desktopSupportsBrowse) {
                     log.info("Desktop not available. Please open your browser manually: $uri")
-                } else if (headlessMode) {
+                } else if (RunningMode.headlessMode) {
                     log.info("Desktop not available in headless mode. Please open your browser manually: $uri")
                 }
             }
diff --git a/borgbutler-server/src/main/kotlin/de/micromata/borgbutler/server/RunningMode.kt b/borgbutler-server/src/main/kotlin/de/micromata/borgbutler/server/RunningMode.kt
new file mode 100644
index 0000000..98a7b0c
--- /dev/null
+++ b/borgbutler-server/src/main/kotlin/de/micromata/borgbutler/server/RunningMode.kt
@@ -0,0 +1,72 @@
+package de.micromata.borgbutler.server
+
+import org.slf4j.LoggerFactory
+import java.awt.Desktop
+import java.io.File
+import java.util.*
+
+object RunningMode {
+    private val log = LoggerFactory.getLogger(RunningMode::class.java)
+    private var osType: OSType? = null
+    var webDevelopment: Boolean = false
+        internal set
+    val headlessMode: Boolean = System.getProperty("java.awt.headless") == "true"
+    val desktopSupported = Desktop.isDesktopSupported()
+    val desktopSupportsBrowse = desktopSupported && Desktop.getDesktop().isSupported(Desktop.Action.BROWSE)
+
+    @JvmStatic
+    val userManagement = UserManagement.SINGLE
+
+    @JvmStatic
+    val oSType: OSType?
+        get() {
+            if (osType == null) {
+                val osTypeString = System.getProperty("os.name")
+                osType = if (osTypeString == null) {
+                    OSType.OTHER
+                } else if (osTypeString.toLowerCase().contains("mac")) {
+                    OSType.MAC_OS
+                } else if (osTypeString.toLowerCase().contains("win")) {
+                    OSType.WINDOWS
+                } else if (osTypeString.toLowerCase().contains("linux")) {
+                    OSType.LINUX
+                } else if (osTypeString.toLowerCase().contains("freebsd")) {
+                    OSType.FREEBSD
+                } else {
+                    OSType.OTHER
+                }
+            }
+            return osType
+        }
+
+    val runningInIDE: Boolean
+        get() {
+            val currentDir = System.getProperty("user.dir")
+            val coreDir = File(currentDir, "borgbutler-core")
+            val development = coreDir.exists() && File(coreDir, "build.gradle").exists()
+            if (development) {
+                log.warn("*** Starting BorgButler server in IDE mode. This mode shouldn't be used in production environments. ***")
+            }
+            return development
+        }
+
+    /**
+     * After setting all values you should call this method for a logging output with all current settings.
+     */
+    fun logMode() {
+        log.info(
+            "Starting ${Version.getInstance().appName} ${Version.getInstance().version} ("
+                    + Version.getInstance().formatBuildDateISO(TimeZone.getDefault())
+                    + ") with: webDevelopment=$webDevelopment, desktopSupported=$desktopSupported, javaVersion='"
+                    + System.getProperty("java.version") + "'."
+        )
+    }
+
+    enum class UserManagement {
+        SINGLE
+    }
+
+    enum class OSType {
+        MAC_OS, WINDOWS, LINUX, FREEBSD, OTHER
+    }
+}
diff --git a/borgbutler-server/src/main/kotlin/de/micromata/borgbutler/server/ServerConfiguration.kt b/borgbutler-server/src/main/kotlin/de/micromata/borgbutler/server/ServerConfiguration.kt
index cbfcc81..d4419d9 100644
--- a/borgbutler-server/src/main/kotlin/de/micromata/borgbutler/server/ServerConfiguration.kt
+++ b/borgbutler-server/src/main/kotlin/de/micromata/borgbutler/server/ServerConfiguration.kt
@@ -16,31 +16,18 @@
     /**
      * If true, CrossOriginFilter will be set.
      */
-    var isWebDevelopmentMode = WEB_DEVELOPMENT_MODE_PREF_DEFAULT
+    var webDevelopmentMode = WEB_DEVELOPMENT_MODE_PREF_DEFAULT
 
     fun copyFrom(other: ServerConfiguration) {
         super.copyFrom(other)
         port = other.port
-        isWebDevelopmentMode = other.isWebDevelopmentMode
+        webDevelopmentMode = other.webDevelopmentMode
     }
 
     companion object {
         val supportedLanguages = arrayOf("en", "de")
         const val WEBSERVER_PORT_DEFAULT = 9042
         private const val WEB_DEVELOPMENT_MODE_PREF_DEFAULT = false
-        @JvmStatic
-        var applicationHome: String? = null
-            get() {
-                if (field == null) {
-                    field = System.getProperty("applicationHome")
-                    if (StringUtils.isBlank(field)) {
-                        field = System.getProperty("user.dir")
-                        log.info("applicationHome is not given as JVM   parameter. Using current working dir (OK for start in IDE): $field")
-                    }
-                }
-                return field
-            }
-            private set
 
         @JvmStatic
         fun get(): ServerConfiguration {
diff --git a/borgbutler-server/src/main/kotlin/de/micromata/borgbutler/server/WebConfig.kt b/borgbutler-server/src/main/kotlin/de/micromata/borgbutler/server/WebConfig.kt
index 9b8b4f1..16d26d1 100644
--- a/borgbutler-server/src/main/kotlin/de/micromata/borgbutler/server/WebConfig.kt
+++ b/borgbutler-server/src/main/kotlin/de/micromata/borgbutler/server/WebConfig.kt
@@ -1,7 +1,6 @@
 package de.micromata.borgbutler.server
 
 import mu.KotlinLogging
-import org.springframework.beans.factory.annotation.Autowired
 import org.springframework.context.annotation.Configuration
 import org.springframework.web.servlet.config.annotation.CorsRegistry
 import org.springframework.web.servlet.config.annotation.EnableWebMvc
@@ -14,7 +13,7 @@
 @EnableWebMvc
 open class WebConfig : WebMvcConfigurer {
     override fun addCorsMappings(registry: CorsRegistry) {
-        if (RunningMode.isDevelopmentMode() || ServerConfiguration.get().isWebDevelopmentMode) {
+        if (RunningMode.webDevelopment) {
             log.warn("*********************************")
             log.warn("***********            **********")
             log.warn("*********** ATTENTION! **********")
diff --git a/borgbutler-server/src/main/kotlin/de/micromata/borgbutler/server/rest/FilesystemBrowserRest.kt b/borgbutler-server/src/main/kotlin/de/micromata/borgbutler/server/rest/FilesystemBrowserRest.kt
index afa4896..8dc708c 100644
--- a/borgbutler-server/src/main/kotlin/de/micromata/borgbutler/server/rest/FilesystemBrowserRest.kt
+++ b/borgbutler-server/src/main/kotlin/de/micromata/borgbutler/server/rest/FilesystemBrowserRest.kt
@@ -58,7 +58,7 @@
                 val label = JLabel("Click for choosing directory...", SwingConstants.CENTER)
                 fr.add(label)
             }
-            if (RunningMode.getOSType() == RunningMode.OSType.MAC_OS) {
+            if (RunningMode.oSType == RunningMode.OSType.MAC_OS) {
                 // The JFileChooser will hang after several calls, use AWT file dialog instead for Mac OS:
                 System.setProperty("apple.awt.fileDialogForDirectories", "true")
                 frame?.let {
diff --git a/borgbutler-server/src/main/kotlin/de/micromata/borgbutler/server/rest/RestUtils.kt b/borgbutler-server/src/main/kotlin/de/micromata/borgbutler/server/rest/RestUtils.kt
index 9586f7d..26ff078 100644
--- a/borgbutler-server/src/main/kotlin/de/micromata/borgbutler/server/rest/RestUtils.kt
+++ b/borgbutler-server/src/main/kotlin/de/micromata/borgbutler/server/rest/RestUtils.kt
@@ -23,7 +23,7 @@
      * service isn't available.
      */
     fun checkLocalDesktopAvailable(requestContext: HttpServletRequest): String? {
-        if (RunningMode.getServerType() != RunningMode.ServerType.DESKTOP) {
+        if (!RunningMode.desktopSupported) {
             return "Service unavailable. No desktop app on localhost available."
         }
         val remoteAddr = requestContext.remoteAddr

--
Gitblit v1.10.0