From 0bdefbf053beb80736eff0a13fe8b90618c8d6dc Mon Sep 17 00:00:00 2001
From: Kai Reinhard <K.Reinhard@micromata.de>
Date: Fri, 21 Dec 2018 22:56:09 +0000
Subject: [PATCH] ServerConfiguration is also stored in json.

---
 borgbutler-webapp/src/components/views/config/ConfigurationPage.jsx                        |    8 
 borgbutler-server/src/main/java/de/micromata/borgbutler/server/Main.java                   |    4 
 borgbutler-core/src/main/java/de/micromata/borgbutler/config/Configuration.java            |   15 +
 borgbutler-core/src/main/java/de/micromata/borgbutler/config/BorgRepoConfig.java           |    1 
 borgbutler-server/src/main/java/de/micromata/borgbutler/server/rest/ConfigurationRest.java |   23 ---
 borgbutler-webapp/src/components/views/config/ConfigurationServerTab.jsx                   |   31 +---
 borgbutler-server/src/main/java/de/micromata/borgbutler/server/user/SingleUserManager.java |   29 +++-
 borgbutler-server/src/main/java/de/micromata/borgbutler/server/ServerConfiguration.java    |   32 ++--
 /dev/null                                                                                  |  117 -------------------
 borgbutler-server/src/main/java/de/micromata/borgbutler/server/jetty/JettyServer.java      |   11 -
 borgbutler-webapp/src/components/views/config/ConfigurationAccountTab.jsx                  |   26 ---
 borgbutler-core/src/main/java/de/micromata/borgbutler/config/ConfigurationHandler.java     |   32 +++-
 borgbutler-core/src/test/java/de/micromata/borgbutler/config/ConfigHandlerTest.java        |    2 
 13 files changed, 97 insertions(+), 234 deletions(-)

diff --git a/borgbutler-core/src/main/java/de/micromata/borgbutler/config/BorgRepoConfig.java b/borgbutler-core/src/main/java/de/micromata/borgbutler/config/BorgRepoConfig.java
index 25b78b4..6000d6b 100644
--- a/borgbutler-core/src/main/java/de/micromata/borgbutler/config/BorgRepoConfig.java
+++ b/borgbutler-core/src/main/java/de/micromata/borgbutler/config/BorgRepoConfig.java
@@ -10,7 +10,6 @@
      * A name describing this config. Only used for displaying purposes.
      */
     @Getter @Setter
-    @JsonProperty("display_name")
     private String displayName;
     @Getter @Setter
     private String repo;
diff --git a/borgbutler-core/src/main/java/de/micromata/borgbutler/config/Configuration.java b/borgbutler-core/src/main/java/de/micromata/borgbutler/config/Configuration.java
index 14589ae..1b39a9e 100644
--- a/borgbutler-core/src/main/java/de/micromata/borgbutler/config/Configuration.java
+++ b/borgbutler-core/src/main/java/de/micromata/borgbutler/config/Configuration.java
@@ -17,26 +17,28 @@
      * Default dir name for restoring archives.
      */
     private static final String RESTORE_DIRNAME = "restore";
+
+    @JsonIgnore
+    private File workingDir;
+
     @Getter
     private String borgCommand = "borg";
     /**
      * Default is 100 MB (approximately).
      */
     @Getter
-    @JsonProperty("max_archive_ontent_cache_capacity_mb")
     private int maxArchiveContentCacheCapacityMb = 100;
 
     /**
      * Default is restore inside BorgButler's home dir (~/.borgbutler/restore).
      */
     @Getter
-    @JsonProperty("restore_dir")
+    @JsonProperty("restoreDir")
     private String restoreDirPath;
     @JsonIgnore
     private File restoreHomeDir;
 
     @Getter
-    @JsonProperty("repo-configs")
     private List<BorgRepoConfig> repoConfigs = new ArrayList<>();
 
     public void add(BorgRepoConfig repoConfig) {
@@ -60,7 +62,7 @@
             if (StringUtils.isNotBlank(restoreDirPath)) {
                 restoreHomeDir = new File(restoreDirPath);
             } else {
-                restoreHomeDir = new File(ConfigurationHandler.getInstance().getWorkingDir(), RESTORE_DIRNAME);
+                restoreHomeDir = new File(workingDir, RESTORE_DIRNAME);
             }
             if (!restoreHomeDir.exists()) {
                 log.info("Creating dir '" + restoreHomeDir.getAbsolutePath() + "' for restoring backup files and directories.");
@@ -68,4 +70,9 @@
         }
         return restoreHomeDir;
     }
+
+    public void copyFrom(Configuration other) {
+        this.borgCommand = other.borgCommand;
+        this.maxArchiveContentCacheCapacityMb = other.maxArchiveContentCacheCapacityMb;
+    }
 }
diff --git a/borgbutler-core/src/main/java/de/micromata/borgbutler/config/ConfigurationHandler.java b/borgbutler-core/src/main/java/de/micromata/borgbutler/config/ConfigurationHandler.java
index 5cc4fb7..a5a6f26 100644
--- a/borgbutler-core/src/main/java/de/micromata/borgbutler/config/ConfigurationHandler.java
+++ b/borgbutler-core/src/main/java/de/micromata/borgbutler/config/ConfigurationHandler.java
@@ -2,6 +2,7 @@
 
 import de.micromata.borgbutler.json.JsonUtils;
 import lombok.Getter;
+import lombok.Setter;
 import org.apache.commons.io.FileUtils;
 import org.apache.commons.lang3.StringUtils;
 import org.slf4j.Logger;
@@ -12,7 +13,7 @@
 
 public class ConfigurationHandler {
     private static Logger log = LoggerFactory.getLogger(ConfigurationHandler.class);
-    private static ConfigurationHandler instance = new ConfigurationHandler();
+    private static ConfigurationHandler instance;
     private static final String BUTLER_HOME_DIR = ".borgbutler";
     private static final String CONFIG_FILENAME = "borgbutler-config.json";
     private static final String CONFIG_BACKUP_FILENAME = "borgbutler-config-bak.json";
@@ -21,24 +22,37 @@
     private File configBackupFile;
     @Getter
     private File workingDir;
-    private Configuration configuration = new Configuration();
+    private Configuration configuration;
+    @Setter
+    private static Class<? extends Configuration> configClazz = Configuration.class;
 
     public static ConfigurationHandler getInstance() {
+        if (instance == null) instance = new ConfigurationHandler();
         return instance;
     }
 
     public static Configuration getConfiguration() {
-        return instance.configuration;
+        return getInstance().configuration;
     }
 
     private void read() {
         log.info("Reading config file '" + configFile.getAbsolutePath() + "'");
         try {
-            String json = FileUtils.readFileToString(configFile, Definitions.STD_CHARSET);
-            this.configuration = JsonUtils.fromJson(Configuration.class, json);
-            for (BorgRepoConfig repoConfig : this.configuration.getRepoConfigs()) {
-                if (StringUtils.isBlank(repoConfig.getDisplayName())) {
-                    repoConfig.setDisplayName(repoConfig.getRepo());
+            String json = "{}";
+            if (configFile.exists()) {
+                json = FileUtils.readFileToString(configFile, Definitions.STD_CHARSET);
+                // Migrate from first version:
+                if (json.contains("repo-configs")) {
+                    json = json.replace("repo-configs", "repoConfigs");
+                    json = json.replace("display_name", "displayName");
+                }
+            }
+            this.configuration = JsonUtils.fromJson(configClazz, json);
+            if (this.configuration.getRepoConfigs() != null) {
+                for (BorgRepoConfig repoConfig : this.configuration.getRepoConfigs()) {
+                    if (StringUtils.isBlank(repoConfig.getDisplayName())) {
+                        repoConfig.setDisplayName(repoConfig.getRepo());
+                    }
                 }
             }
         } catch (IOException ex) {
@@ -47,7 +61,7 @@
         }
     }
 
-    public void write() {
+    public void save() {
         String json = JsonUtils.toJson(configuration, true);
         try {
             if (configFile.exists()) {
diff --git a/borgbutler-core/src/test/java/de/micromata/borgbutler/config/ConfigHandlerTest.java b/borgbutler-core/src/test/java/de/micromata/borgbutler/config/ConfigHandlerTest.java
index eb71dda..161f0de 100644
--- a/borgbutler-core/src/test/java/de/micromata/borgbutler/config/ConfigHandlerTest.java
+++ b/borgbutler-core/src/test/java/de/micromata/borgbutler/config/ConfigHandlerTest.java
@@ -12,7 +12,7 @@
         File workingDir = ConfigurationHandler.getInstance().getWorkingDir();
         File origConfigFile = new File(workingDir, ".borgbutler-orig.json");
         FileUtils.copyFile(ConfigurationHandler.getInstance().getConfigFile(), origConfigFile);
-        ConfigurationHandler.getInstance().write();
+        ConfigurationHandler.getInstance().save();
         FileUtils.copyFile(origConfigFile, ConfigurationHandler.getInstance().getConfigFile());
     }
 }
diff --git a/borgbutler-server/src/main/java/de/micromata/borgbutler/server/Main.java b/borgbutler-server/src/main/java/de/micromata/borgbutler/server/Main.java
index 0ef680e..88d2829 100644
--- a/borgbutler-server/src/main/java/de/micromata/borgbutler/server/Main.java
+++ b/borgbutler-server/src/main/java/de/micromata/borgbutler/server/Main.java
@@ -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.json.borg.BorgFilesystemItem;
 import de.micromata.borgbutler.server.jetty.JettyServer;
 import de.micromata.borgbutler.server.user.SingleUserManager;
@@ -45,6 +46,7 @@
 
 
     private void _start(String[] args) {
+        ConfigurationHandler.setConfigClazz(ServerConfiguration.class);
         // create Options object
         Options options = new Options();
         options.addOption("e", "extract-archive-content", true, "Extracts the content of an archive cache file only (doesn't start the server). A complete file list of the archive will be extracted to stdout.");
@@ -73,7 +75,7 @@
                         System.err.println("Port outside range.");
                         return;
                     }
-                    ServerConfigurationHandler.getDefaultConfiguration().setPort(port);
+                    ServerConfiguration.get().setPort(port);
                 } catch (NumberFormatException ex) {
                     printHelp(options);
                     return;
diff --git a/borgbutler-server/src/main/java/de/micromata/borgbutler/server/ServerConfiguration.java b/borgbutler-server/src/main/java/de/micromata/borgbutler/server/ServerConfiguration.java
index 516db28..d6b7074 100644
--- a/borgbutler-server/src/main/java/de/micromata/borgbutler/server/ServerConfiguration.java
+++ b/borgbutler-server/src/main/java/de/micromata/borgbutler/server/ServerConfiguration.java
@@ -1,5 +1,9 @@
 package de.micromata.borgbutler.server;
 
+import com.fasterxml.jackson.annotation.JsonIgnore;
+import com.fasterxml.jackson.annotation.JsonProperty;
+import de.micromata.borgbutler.config.Configuration;
+import de.micromata.borgbutler.config.ConfigurationHandler;
 import lombok.Getter;
 import lombok.Setter;
 import org.apache.commons.lang3.StringUtils;
@@ -8,20 +12,24 @@
 
 import java.beans.Transient;
 
-public class ServerConfiguration {
+public class ServerConfiguration extends Configuration {
     private static Logger log = LoggerFactory.getLogger(ServerConfiguration.class);
     private final static String[] SUPPORTED_LANGUAGES = {"en", "de"};
+    public static final int WEBSERVER_PORT_DEFAULT = 9042;
+    private static final boolean SHOW_TEST_DATA_PREF_DEFAULT = false;
+    private static final boolean WEB_DEVELOPMENT_MODE_PREF_DEFAULT = false;
+
     private static String applicationHome;
 
-    private int port;
+    private int port = WEBSERVER_PORT_DEFAULT;
     @Getter
     @Setter
-    private boolean showTestData = true;
-    private boolean webDevelopmentMode = false;
-    private boolean templatesDirModified = false;
+    @JsonIgnore
+    private boolean showTestData = SHOW_TEST_DATA_PREF_DEFAULT;
+    private boolean webDevelopmentMode = WEB_DEVELOPMENT_MODE_PREF_DEFAULT;
 
-    public static ServerConfiguration getDefault() {
-        return ServerConfigurationHandler.getDefaultConfiguration();
+    public static ServerConfiguration get() {
+        return (ServerConfiguration)ConfigurationHandler.getConfiguration();
     }
 
     public static String[] getSupportedLanguages() {
@@ -39,15 +47,6 @@
         return applicationHome;
     }
 
-    public void resetModifiedFlag() {
-        templatesDirModified = false;
-    }
-
-    @Transient
-    public boolean isTemplatesDirModified() {
-        return templatesDirModified;
-    }
-
     public int getPort() {
         return port;
     }
@@ -68,6 +67,7 @@
     }
 
     public void copyFrom(ServerConfiguration other) {
+        super.copyFrom(other);
         this.port = other.port;
         this.showTestData = other.showTestData;
         this.webDevelopmentMode = other.webDevelopmentMode;
diff --git a/borgbutler-server/src/main/java/de/micromata/borgbutler/server/ServerConfigurationHandler.java b/borgbutler-server/src/main/java/de/micromata/borgbutler/server/ServerConfigurationHandler.java
deleted file mode 100644
index ec58029..0000000
--- a/borgbutler-server/src/main/java/de/micromata/borgbutler/server/ServerConfigurationHandler.java
+++ /dev/null
@@ -1,117 +0,0 @@
-package de.micromata.borgbutler.server;
-
-import org.apache.commons.lang3.StringUtils;
-import org.slf4j.Logger;
-import org.slf4j.LoggerFactory;
-
-import java.util.HashSet;
-import java.util.Set;
-import java.util.prefs.BackingStoreException;
-import java.util.prefs.Preferences;
-
-public class ServerConfigurationHandler {
-    private Logger log = LoggerFactory.getLogger(ServerConfigurationHandler.class);
-    private static final ServerConfigurationHandler instance = new ServerConfigurationHandler();
-    private static final String WEBSERVER_PORT_PREF = "webserver-port";
-    public static final int WEBSERVER_PORT_DEFAULT = 9042;
-    private static final String LANGUAGE_PREF = "language";
-    private static final String LANGUAGE_DEFAULT = null;
-    private static final String SHOW_TEST_DATA_PREF = "show-test-data";
-    private static final boolean SHOW_TEST_DATA_PREF_DEFAULT = true;
-    private static final String WEB_DEVELOPMENT_MODE_PREF = "web-development-mode";
-    private static final boolean WEB_DEVELOPMENT_MODE_PREF_DEFAULT = false;
-
-    private Preferences preferences;
-    private ServerConfiguration configuration = new ServerConfiguration();
-    private Set<String> extraPreferences = new HashSet<>();
-
-    /**
-     * Only for test case.
-     *
-     * @param preferences
-     */
-    ServerConfigurationHandler(Preferences preferences) {
-        this.preferences = preferences;
-    }
-
-    private ServerConfigurationHandler() {
-        preferences = Preferences.userRoot().node("de").node("micromata").node("merlin");
-        load();
-    }
-
-    public static ServerConfigurationHandler getInstance() {
-        return instance;
-    }
-
-    public static ServerConfiguration getDefaultConfiguration() {
-        return instance.getConfiguration();
-    }
-
-    public ServerConfiguration getConfiguration() {
-        return configuration;
-    }
-
-    public void load() {
-        configuration.setPort(preferences.getInt(WEBSERVER_PORT_PREF, WEBSERVER_PORT_DEFAULT));
-        configuration.setShowTestData(preferences.getBoolean(SHOW_TEST_DATA_PREF, SHOW_TEST_DATA_PREF_DEFAULT));
-        configuration.setWebDevelopmentMode(preferences.getBoolean(WEB_DEVELOPMENT_MODE_PREF, WEB_DEVELOPMENT_MODE_PREF_DEFAULT));
-        configuration.resetModifiedFlag();
-    }
-
-    public void save() {
-        log.info("Saving configuration to user prefs.");
-        preferences.putInt(WEBSERVER_PORT_PREF, configuration.getPort());
-        preferences.putBoolean(SHOW_TEST_DATA_PREF, configuration.isShowTestData());
-        preferences.putBoolean(WEB_DEVELOPMENT_MODE_PREF, configuration.isWebDevelopmentMode());
-        try {
-            preferences.flush();
-        } catch (BackingStoreException ex) {
-            log.error("Couldn't flush user preferences: " + ex.getMessage(), ex);
-        }
-    }
-
-    /**
-     * For saving own properties.
-     *
-     * @param key   The key under which to save the given value.
-     * @param value The value to store. If null, any previous stored value under the given key will be removed.
-     */
-    public void save(String key, String value) {
-        if (StringUtils.isEmpty(value)) {
-            preferences.remove(key);
-        } else {
-            preferences.put(key, value);
-            extraPreferences.add(key);
-        }
-        try {
-            preferences.flush();
-        } catch (BackingStoreException ex) {
-            log.error("Couldn't flush user preferences: " + ex.getMessage(), ex);
-        }
-    }
-
-    /**
-     * @param key Gets own property saved with {@link #save()}.
-     */
-    public String get(String key, String defaultValue) {
-        extraPreferences.add(key);
-        return preferences.get(key, defaultValue);
-    }
-
-    public void removeAllSettings() {
-        log.warn("Removes all configuration settings from user prefs.");
-        preferences.remove(WEBSERVER_PORT_PREF);
-        preferences.remove(LANGUAGE_PREF);
-        preferences.remove(SHOW_TEST_DATA_PREF);
-        preferences.remove(WEB_DEVELOPMENT_MODE_PREF);
-        for(String extraKey : extraPreferences) {
-            preferences.remove(extraKey);
-        }
-        try {
-            preferences.flush();
-        } catch (BackingStoreException ex) {
-            log.error("Couldn't flush user preferences: " + ex.getMessage(), ex);
-        }
-        load();
-    }
-}
diff --git a/borgbutler-server/src/main/java/de/micromata/borgbutler/server/jetty/JettyServer.java b/borgbutler-server/src/main/java/de/micromata/borgbutler/server/jetty/JettyServer.java
index 38a84fa..4f04b29 100644
--- a/borgbutler-server/src/main/java/de/micromata/borgbutler/server/jetty/JettyServer.java
+++ b/borgbutler-server/src/main/java/de/micromata/borgbutler/server/jetty/JettyServer.java
@@ -1,7 +1,6 @@
 package de.micromata.borgbutler.server.jetty;
 
 import de.micromata.borgbutler.server.ServerConfiguration;
-import de.micromata.borgbutler.server.ServerConfigurationHandler;
 import de.micromata.borgbutler.server.RunningMode;
 import de.micromata.borgbutler.server.rest.ConfigurationRest;
 import de.micromata.borgbutler.server.user.UserFilter;
@@ -99,7 +98,7 @@
         errorHandler.addErrorPage(404, "/");
         ctx.setErrorHandler(errorHandler);
 
-        if (RunningMode.isDevelopmentMode() || ServerConfigurationHandler.getDefaultConfiguration().isWebDevelopmentMode()) {
+        if (RunningMode.isDevelopmentMode() || ServerConfiguration.get().isWebDevelopmentMode()) {
             log.warn("*********************************");
             log.warn("***********            **********");
             log.warn("*********** ATTENTION! **********");
@@ -139,7 +138,7 @@
     }
 
     private int findFreePort() {
-        int port = ServerConfigurationHandler.getInstance().getConfiguration().getPort();
+        int port = ServerConfiguration.get().getPort();
         return findFreePort(port);
     }
 
@@ -147,7 +146,7 @@
         int port = startPort > 0 ? startPort : 1;
         if (port > MAX_PORT_NUMBER) {
             log.warn("Port can't be higher than " + MAX_PORT_NUMBER + ": " + port + ". It's a possible mis-configuration.");
-            port = ServerConfigurationHandler.WEBSERVER_PORT_DEFAULT;
+            port = ServerConfiguration.WEBSERVER_PORT_DEFAULT;
         }
         for (int i = port; i < port + 10; i++) {
             try (ServerSocket socket = new ServerSocket()) {
@@ -158,9 +157,9 @@
                 continue; // try next port
             }
         }
-        if (startPort != ServerConfigurationHandler.WEBSERVER_PORT_DEFAULT) {
+        if (startPort != ServerConfiguration.WEBSERVER_PORT_DEFAULT) {
             log.info("Trying to fix port due to a possible mis-configuration.");
-            return findFreePort(ServerConfigurationHandler.WEBSERVER_PORT_DEFAULT);
+            return findFreePort(ServerConfiguration.WEBSERVER_PORT_DEFAULT);
         }
         log.error("No free port found! Giving up.");
         return -1;
diff --git a/borgbutler-server/src/main/java/de/micromata/borgbutler/server/rest/ConfigurationRest.java b/borgbutler-server/src/main/java/de/micromata/borgbutler/server/rest/ConfigurationRest.java
index 15e7f45..06abb81 100644
--- a/borgbutler-server/src/main/java/de/micromata/borgbutler/server/rest/ConfigurationRest.java
+++ b/borgbutler-server/src/main/java/de/micromata/borgbutler/server/rest/ConfigurationRest.java
@@ -1,9 +1,9 @@
 package de.micromata.borgbutler.server.rest;
 
 import de.micromata.borgbutler.cache.ButlerCache;
+import de.micromata.borgbutler.config.ConfigurationHandler;
 import de.micromata.borgbutler.json.JsonUtils;
 import de.micromata.borgbutler.server.ServerConfiguration;
-import de.micromata.borgbutler.server.ServerConfigurationHandler;
 import de.micromata.borgbutler.server.user.UserData;
 import de.micromata.borgbutler.server.user.UserManager;
 import org.apache.commons.lang3.StringUtils;
@@ -26,9 +26,7 @@
      * @see JsonUtils#toJson(Object, boolean)
      */
     public String getConfig(@QueryParam("prettyPrinter") boolean prettyPrinter) {
-        ServerConfiguration config = new ServerConfiguration();
-        config.copyFrom(ServerConfigurationHandler.getInstance().getConfiguration());
-        String json = JsonUtils.toJson(config, prettyPrinter);
+        String json = JsonUtils.toJson(ServerConfiguration.get(), prettyPrinter);
         return json;
     }
 
@@ -36,8 +34,8 @@
     @Path("config")
     @Produces(MediaType.TEXT_PLAIN)
     public void setConfig(String jsonConfig) {
-        ServerConfigurationHandler configurationHandler = ServerConfigurationHandler.getInstance();
-        ServerConfiguration config = configurationHandler.getConfiguration();
+        ConfigurationHandler configurationHandler = ConfigurationHandler.getInstance();
+        ServerConfiguration config = (ServerConfiguration)configurationHandler.getConfiguration();
         ServerConfiguration srcConfig = JsonUtils.fromJson(ServerConfiguration.class, jsonConfig);
         config.copyFrom(srcConfig);
         configurationHandler.save();
@@ -77,19 +75,6 @@
      * Resets the settings to default values (deletes all settings).
      */
     @GET
-    @Path("reset")
-    @Produces(MediaType.APPLICATION_JSON)
-    public String resetConfig(@QueryParam("IKnowWhatImDoing") boolean securityQuestion) {
-        if (securityQuestion) {
-            ServerConfigurationHandler.getInstance().removeAllSettings();
-        }
-        return getConfig(false);
-    }
-
-    /**
-     * Resets the settings to default values (deletes all settings).
-     */
-    @GET
     @Path("clearAllCaches")
     @Produces(MediaType.APPLICATION_JSON)
     public String clearAllCaches() {
diff --git a/borgbutler-server/src/main/java/de/micromata/borgbutler/server/user/SingleUserManager.java b/borgbutler-server/src/main/java/de/micromata/borgbutler/server/user/SingleUserManager.java
index b7f2528..0391b8d 100644
--- a/borgbutler-server/src/main/java/de/micromata/borgbutler/server/user/SingleUserManager.java
+++ b/borgbutler-server/src/main/java/de/micromata/borgbutler/server/user/SingleUserManager.java
@@ -2,11 +2,12 @@
 
 import de.micromata.borgbutler.server.Languages;
 import de.micromata.borgbutler.server.RunningMode;
-import de.micromata.borgbutler.server.ServerConfigurationHandler;
 import org.slf4j.Logger;
 import org.slf4j.LoggerFactory;
 
 import java.util.Locale;
+import java.util.prefs.BackingStoreException;
+import java.util.prefs.Preferences;
 
 /**
  * Contains only one (dummy) user (for desktop version).
@@ -15,6 +16,7 @@
     private static final String USER_LOCAL_PREF_KEY = "userLocale";
     private static Logger log = LoggerFactory.getLogger(SingleUserManager.class);
     private UserData singleUser;
+    private Preferences preferences;
 
     public SingleUserManager() {
         if (RunningMode.getUserManagement() != RunningMode.UserManagement.SINGLE) {
@@ -22,14 +24,11 @@
                     + "'. Only allowed in '" + RunningMode.UserManagement.SINGLE + "'.");
         }
         log.info("Using SingleUserManger as user manager.");
+        preferences = Preferences.userRoot().node("de").node("micromata").node("borgbutler");
         singleUser = new UserData();
         singleUser.setUsername("admin");
         singleUser.setAdmin(true);
-        String language = ServerConfigurationHandler.getInstance().get("userLocale", null);
-        Locale locale = Languages.asLocale(language);
-        singleUser.setLocale(locale);
-        String dateFormat = ServerConfigurationHandler.getInstance().get("userDateFormat", null);
-        singleUser.setDateFormat(dateFormat);
+        load(singleUser);
     }
 
     public UserData getUser(String id) {
@@ -37,10 +36,10 @@
     }
 
     /**
-     * Stores only the user's configured locale.
+     * Stores only the user's configured locale as preference.
      *
      * @param userData
-     * @see ServerConfigurationHandler#save(String, String)
+     * @see Preferences
      */
     @Override
     public void saveUser(UserData userData) {
@@ -49,7 +48,17 @@
         String dateFormat = userData.getDateFormat();
         this.singleUser.setDateFormat(dateFormat);
         String lang = Languages.asString(locale);
-        ServerConfigurationHandler.getInstance().save("userLocale", lang);
-        ServerConfigurationHandler.getInstance().save("userDateFormat", dateFormat);
+        preferences.put(USER_LOCAL_PREF_KEY, lang);
+        try {
+            preferences.flush();
+        } catch (BackingStoreException ex) {
+            log.error("Can't save user locale to preferences: " + ex.getMessage(), ex);
+        }
+    }
+
+    private void load(UserData userData) {
+        String language = preferences.get(USER_LOCAL_PREF_KEY, "en");
+        Locale locale = Languages.asLocale(language);
+        singleUser.setLocale(locale);
     }
 }
diff --git a/borgbutler-webapp/src/components/views/config/ConfigurationAccountTab.jsx b/borgbutler-webapp/src/components/views/config/ConfigurationAccountTab.jsx
index 8a7a133..72d8e80 100644
--- a/borgbutler-webapp/src/components/views/config/ConfigurationAccountTab.jsx
+++ b/borgbutler-webapp/src/components/views/config/ConfigurationAccountTab.jsx
@@ -32,11 +32,10 @@
                 return resp.json()
             })
             .then((data) => {
-                const {locale, dateFormat, ...user} = data;
+                const {locale, ...user} = data;
                 this.setState({
                     loading: false,
                     locale: locale ? locale : '',
-                    dateFormat: dateFormat ? dateFormat : '',
                     ...user
                 })
             })
@@ -55,8 +54,7 @@
         this.state = {
             loading: true,
             failed: false,
-            locale: null,
-            dateFormat: null
+            locale: null
         };
 
         this.handleTextChange = this.handleTextChange.bind(this);
@@ -74,8 +72,7 @@
 
     save() {
         var user = {
-            locale: this.state.locale,
-            dateFormat: this.state.dateFormat
+            locale: this.state.locale
         };
         return fetch(getRestServiceUrl("configuration/user"), {
             method: 'POST',
@@ -113,23 +110,6 @@
                         <FormOption value={'de'} i18nKey={'language.german'}/>
                     </FormSelect>
                 </FormLabelField>
-                <FormGroup>
-                    <FormLabel length={2} htmlFor={'dateFormat'}>
-                        <I18n name={'configuration.application.dateFormat'}/>
-                    </FormLabel>
-                    <FormField length={2}>
-                        <FormSelect value={this.state.dateFormat} name={'dateFormat'} onChange={this.handleTextChange}>
-                            <FormOption value={''} i18nKey={'configuration.application.dateFormat.option.auto'}/>
-                            <FormOption value={'dd.MM.yyyy'} label={'16.01.2018'}/>
-                            <FormOption value={'d.M.yy'} label={'16.1.18'}/>
-                            <FormOption value={'yyyy-MM-dd'} label={'2018-01-16'}/>
-                            <FormOption value={'dd/MM/yyyy'} label={'16/01/2018'}/>
-                            <FormOption value={'d/M/yy'} label={'16/1/18'}/>
-                            <FormOption value={'MM/dd/yyyy'} label={'01/16/2018'}/>
-                            <FormOption value={'M/d/yy'} label={'1/16/18'}/>
-                        </FormSelect>
-                    </FormField>
-                </FormGroup>
             </form>
         );
     }
diff --git a/borgbutler-webapp/src/components/views/config/ConfigurationPage.jsx b/borgbutler-webapp/src/components/views/config/ConfigurationPage.jsx
index 8f49632..3a26b4d 100644
--- a/borgbutler-webapp/src/components/views/config/ConfigurationPage.jsx
+++ b/borgbutler-webapp/src/components/views/config/ConfigurationPage.jsx
@@ -71,23 +71,23 @@
                         className={classNames({active: this.state.activeTab === '1'})}
                         onClick={this.toggleTab('1')}
                     >
-                        <I18n name={'configuration.account'}/>
+                        <I18n name={'configuration.server'}/>
                     </NavLink>
                     <NavLink
                         className={classNames({active: this.state.activeTab === '2'})}
                         onClick={this.toggleTab('2')}
                     >
-                        <I18n name={'configuration.server'}/>
+                        <I18n name={'configuration.account'}/>
                     </NavLink>
                 </Nav>
                 <TabContent activeTab={this.state.activeTab}>
                     <TabPane tabId={'1'}>
-                        <ConfigAccountTab ref={this.accountTabRef}/>
+                        <ConfigServerTab ref={this.serverTabRef}/>
                     </TabPane>
                 </TabContent>
                 <TabContent activeTab={this.state.activeTab}>
                     <TabPane tabId={'2'}>
-                        <ConfigServerTab ref={this.serverTabRef}/>
+                        <ConfigAccountTab ref={this.accountTabRef}/>
                     </TabPane>
                 </TabContent>
                 <FormGroup>
diff --git a/borgbutler-webapp/src/components/views/config/ConfigurationServerTab.jsx b/borgbutler-webapp/src/components/views/config/ConfigurationServerTab.jsx
index 08d4247..8f73c99 100644
--- a/borgbutler-webapp/src/components/views/config/ConfigurationServerTab.jsx
+++ b/borgbutler-webapp/src/components/views/config/ConfigurationServerTab.jsx
@@ -1,8 +1,6 @@
 import React from 'react';
 import {FormButton, FormCheckbox, FormLabelField, FormLabelInputField} from "../../general/forms/FormComponents";
 import {getRestServiceUrl} from "../../../utilities/global";
-import {IconDanger} from '../../general/IconComponents';
-import {getTranslation} from "../../../utilities/i18n";
 import I18n from "../../general/translation/I18n";
 import ErrorAlertGenericRestFailure from '../../general/ErrorAlertGenericRestFailure';
 import Loading from "../../general/Loading";
@@ -45,13 +43,13 @@
             loading: true,
             failed: false,
             port: 9042,
-            webDevelopmentMode: false,
+            webdevelopmentMode: false,
+            maxArchiveContentCacheCapacityMb: 100,
             redirect: false
         };
 
         this.handleTextChange = this.handleTextChange.bind(this);
         this.handleCheckboxChange = this.handleCheckboxChange.bind(this);
-        this.onResetConfiguration = this.onResetConfiguration.bind(this);
         this.onClearAllCaches = this.onClearAllCaches.bind(this);
         this.loadConfig = this.loadConfig.bind(this);
     }
@@ -72,6 +70,7 @@
     save() {
         var config = {
             port: this.state.port,
+            maxArchiveContentCacheCapacityMb : this.state.maxArchiveContentCacheCapacityMb,
             webDevelopmentMode: this.state.webDevelopmentMode
         };
         return fetch(getRestServiceUrl("configuration/config"), {
@@ -83,18 +82,6 @@
         })
     }
 
-    onResetConfiguration() {
-        if (window.confirm(getTranslation('configuration.resetAllSettings.question'))) {
-            fetch(getRestServiceUrl("configuration/reset?IKnowWhatImDoing=true"), {
-                method: "GET",
-                dataType: "JSON",
-                headers: {
-                    "Content-Type": "text/plain; charset=utf-8"
-                }
-            })
-        }
-    }
-
     onClearAllCaches() {
         if (window.confirm('Do you really want to clear all caches? All Archive file lists and caches for repo and archive informatino will be cleared.')) {
             fetch(getRestServiceUrl("configuration/clearAllCaches"), {
@@ -115,7 +102,6 @@
         if (this.state.failed) {
             return <ErrorAlertGenericRestFailure handleClick={this.loadConfig}/>;
         }
-
         return (
             <form>
                 <FormLabelField>
@@ -127,18 +113,17 @@
                                      name={'port'} value={this.state.port}
                                      onChange={this.handleTextChange}
                                      placeholder="Enter port"/>
+                <FormLabelInputField label={'Maximum disc capacity (MB)'} fieldLength={2} type="number" min={50} max={10000}
+                                     step={50}
+                                     name={'maxArchiveContentCacheCapacityMb'} value={this.state.maxArchiveContentCacheCapacityMb}
+                                     onChange={this.handleTextChange}
+                                     placeholder="Enter maximum Capacity"/>
                 <FormLabelField label={<I18n name={'configuration.webDevelopmentMode'}/>} fieldLength={2}>
                     <FormCheckbox checked={this.state.webDevelopmentMode}
                                   hintKey={'configuration.webDevelopmentMode.hint'}
                                   name="webDevelopmentMode"
                                   onChange={this.handleCheckboxChange}/>
                 </FormLabelField>
-                <FormLabelField>
-                    <FormButton id={'resetFactorySettings'} onClick={this.onResetConfiguration}
-                                hintKey={'configuration.resetAllSettings.hint'}> <IconDanger/> <I18n
-                        name={'configuration.resetAllSettings'}/>
-                    </FormButton>
-                </FormLabelField>
             </form>
         );
     }

--
Gitblit v1.10.0