diff options
author | Simon Rettberg | 2015-07-10 19:57:55 +0200 |
---|---|---|
committer | Simon Rettberg | 2015-07-10 19:57:55 +0200 |
commit | d3b015ba0ef85459f3eba313d1d8bcc3765a5348 (patch) | |
tree | dfd0c0374bd53bd5770f076283655f039aaba946 /dozentenmodul/src/main/java/org/openslx/dozmod/Config.java | |
parent | Merge branch 'v1.1' of git.openslx.org:openslx-ng/tutor-module into v1.1 (diff) | |
download | tutor-module-d3b015ba0ef85459f3eba313d1d8bcc3765a5348.tar.gz tutor-module-d3b015ba0ef85459f3eba313d1d8bcc3765a5348.tar.xz tutor-module-d3b015ba0ef85459f3eba313d1d8bcc3765a5348.zip |
[client] Got rid of ini4j, store config as java properties file, simplified config handling
Diffstat (limited to 'dozentenmodul/src/main/java/org/openslx/dozmod/Config.java')
-rw-r--r-- | dozentenmodul/src/main/java/org/openslx/dozmod/Config.java | 330 |
1 files changed, 185 insertions, 145 deletions
diff --git a/dozentenmodul/src/main/java/org/openslx/dozmod/Config.java b/dozentenmodul/src/main/java/org/openslx/dozmod/Config.java index 80a50685..c15c6bb1 100644 --- a/dozentenmodul/src/main/java/org/openslx/dozmod/Config.java +++ b/dozentenmodul/src/main/java/org/openslx/dozmod/Config.java @@ -1,10 +1,17 @@ package org.openslx.dozmod; import java.io.File; +import java.io.FileInputStream; +import java.io.FileNotFoundException; +import java.io.FileOutputStream; import java.io.IOException; +import java.io.InputStream; +import java.util.Properties; import org.apache.log4j.Logger; -import org.ini4j.Wini; +import org.openslx.dozmod.util.FormatHelper; +import org.openslx.util.QuickTimer; +import org.openslx.util.QuickTimer.Task; /** * Represents the configuration of the client @@ -19,12 +26,20 @@ public class Config { */ private final static Logger LOGGER = Logger.getLogger(Config.class); + public static interface ErrorCallback { + void writeError(Throwable t); + } + /** - * The main configuration object is of type Wini - * It contains the content of the config.ini as - * determined in the init() function. + * Out property holder with all the setting keys */ - private static Wini ini = null; + private static final Properties prop = new Properties(); + + private static ErrorCallback errorCb = null; + + private static File configFile = null; + + private static boolean writePending = false; /** * Initializes the class by determining the path @@ -41,7 +56,6 @@ public class Config { // Variables only needed locally String configPath = null; - File configFile = null; // Determine OS String osName = System.getProperty("os.name").toLowerCase(); @@ -52,26 +66,23 @@ public class Config { // C:\Users\<user>\AppData\Roaming String appDataPath = System.getenv("APPDATA"); if (!appDataPath.isEmpty()) { - configPath = appDataPath + "\\bwSuite\\config.ini"; + configPath = appDataPath; } else { // APPDATA was empty, let's guess LOGGER.warn("APPDATA is empty."); - configPath = System.getProperty("user.home") + "\\AppData\\Roaming\\bwSuite\\config.ini"; + configPath = System.getProperty("user.home") + "\\AppData\\Roaming"; } } else if (osName.contains("linux")) { - configPath = System.getProperty("user.home") + "/.config/bwSuite/config.ini"; - } else { + configPath = System.getProperty("user.home") + "/.config"; + } + if (configPath == null || configPath.isEmpty()) { // Not Windows nor Linux, try fallback to relative path // TODO MacOS Support? - configPath = "." + File.separatorChar + "bwSuite" + File.separatorChar + "config.ini"; + configPath = "."; } // Check if we got a path - if (!(configPath.isEmpty() || configPath == null)) { - configFile = new File(configPath); - } else { - throw new IOException("Could not determine the path to the config file."); - } + configFile = new File(configPath + File.separatorChar + "bwSuite" + File.separatorChar + "config.properties"); // Check if the directory exists. if (!configFile.getParentFile().exists()) { @@ -82,33 +93,74 @@ public class Config { } } - // Check if the file already exists if (!configFile.exists()) { - // Does not, create it - configFile.createNewFile(); - - // Check if file is writeable - if (configFile.canWrite()) { - ini = new Wini(configFile); - LOGGER.info("Creating '" + configFile + "'..."); - // write default configuration options and values - ini.put("main", "disclaimer_agreement", false); - ini.put("main", "vmware_license_agreement", false); - ini.put("main", "auth_method", ""); - ini.put("main", "username", ""); - ini.put("main", "download_path", ""); - ini.put("main", "upload_path", ""); - ini.put("main", "identity_provider", ""); - ini.store(); + forceSaveInternal(); + } + + // Make sure all settings are saved when we exit + Runtime.getRuntime().addShutdownHook(new Thread() { + @Override + public void run() { + Config.forceSave(); + } + }); - } else { - throw new IOException("Can not write to '" + configFile + "'. Do you have permissions?"); + // Load configuration from java properties file + InputStream in = new FileInputStream(configFile); + try { + prop.load(in); + } finally { + in.close(); + } + } + + private static void forceSaveInternal() throws FileNotFoundException, IOException { + synchronized (prop) { + prop.store(new FileOutputStream(configFile), "bwLehrpool Dozentenmodul Client Config"); + } + } + + public static boolean forceSave() { + synchronized (prop) { + if (!writePending) + return true; + writePending = false; + if (configFile == null) + return false; + try { + forceSaveInternal(); + return true; + } catch (Exception e) { + if (errorCb != null) + errorCb.writeError(e); } - } else { - ini = new Wini(configFile); - LOGGER.info("Loaded '" + configFile + "'."); + return false; } - } // end constructor. + } + + /** + * Called internally by all set[TYPE]() methods. This triggers + * a save-task in one second, if one isn't pending yet. This is so + * we don't write the file many times, possibly concurrently, if lots + * of settings are changed. + */ + private static void queueSave() { + synchronized (prop) { + if (writePending) + return; + writePending = true; + QuickTimer.scheduleOnce(new Task() { + @Override + public void fire() { + forceSave(); + } + }, 1000); + } + } + + public static void setErrorCallback(ErrorCallback cb) { + errorCb = cb; + } /** * Query the path of the configuration file @@ -116,218 +168,206 @@ public class Config { * @return path to the configuration file */ public static String getPath() { - if (ini.getFile().getParentFile().isDirectory()) - return ini.getFile().getParentFile().toString(); - else - return null; + return configFile.getParent(); } + /* + * Getters and setters for the various config options + */ + /** * Query the value of 'BillOfRights' from the configuration file. * * @return true if the user already accepted bill of rights, false * otherwise. */ - public static boolean getDisclaimerAgreement() { - return getBoolean("main", "disclaimer_agreement", false); + public static int getDisclaimerAgreement() { + return getInteger("disclaimer.accepted_version", 0); } /** - * Query the value of 'vmware' from the configuration file. + * Sets the value of 'BillOfRights' in the configuration file to 'value' * - * @return true if the user already accepted vmware license, false - * otherwise. + * @return true if it succeeded, false otherwise */ - public static boolean getVmwareLicenseAgreement() { - return getBoolean("main", "vmware_license_agreement", false); + public static void setDisclaimerAgreement(int value) { + setInteger("disclaimer.accepted_version", value); + } + + public static boolean getVirtualizerRead() { + return getBoolean("notice.virtualizer", false); + } + + public static void setVirtualizerRead(boolean selection) { + setBoolean("notice.virtualizer", selection); } /** - * Query the value of 'Benutzername' from the configuration file. + * Get the remembered user, if set. * - * @return username if saved, an empty string otherwise. + * @return user name if saved, an empty string otherwise. */ public static String getUsername() { - return getString("main", "username", ""); + return getString("login.name", ""); } /** - * Query the value of 'Letzter Downloadpfad' from the configuration file. + * Sets the name of the remembered user * - * @return last download path if saved, the path to the user's home - * otherwise. + * @return true if it succeeded, false otherwise */ - public static String getDownloadPath() { - return getString("main", "download_path", System.getProperty("user.home")); + public static void setUsername(String value) { + setString("login.name", value); } /** - * Query the value of 'Letzter Uploadpfad' from the configuration file. + * Query the value of 'Letzter Downloadpfad' from the configuration file. * - * @return last upload path if saved, the path to the user's home otherwise. + * @return last download path if saved, the path to the user's home + * otherwise. */ - public static String getUploadPath() { - return getString("main", "upload_path", System.getProperty("user.home")); + public static String getDownloadPath() { + return getString("download.path", System.getProperty("user.home")); } /** - * Query the IdP of the configuration file + * Sets the value of 'Letzter Downloadpfad' in the configuration file to + * 'value' * - * @return stored IdP + * @return true if it succeeded, false otherwise */ - public static String getIdentityProvider() { - return getString("main", "identity_provider", ""); + public static void setDownloadPath(String value) { + setString("download.path", value); } /** - * Query the authentication method of the configuration file + * Query the value of 'Letzter Uploadpfad' from the configuration file. * - * @return stored IdP + * @return last upload path if saved, the path to the user's home otherwise. */ - public static String getAuthenticationMethod() { - return getString("main", "auth_method", "bwlp"); + public static String getUploadPath() { + return getString("upload.path", System.getProperty("user.home")); } /** - * Sets the value of 'BillOfRights' in the configuration file to 'value' + * Sets the value of "Letzter Uploadpfad" in the configuration file to + * 'value' * * @return true if it succeeded, false otherwise */ - public static boolean setDisclaimerAgreement(boolean value) { - return setBoolean("main", "disclaimer_agreement", value); + public static void setUploadPath(String value) { + setString("upload.path", value); } /** - * Sets the value of 'vmware' in the configuration file to 'value' + * Query the IdP of the configuration file * - * @return true if it succeeded, false otherwise + * @return stored IdP */ - public static boolean setVmwareLicenseAgreement(boolean value) { - return setBoolean("main", "vmware_license_agreement", value); + public static String getIdentityProvider() { + return getString("login.idp", ""); } /** - * Sets the value of 'Benutzername' in the configuration file to 'value' + * Sets the value of "IdP" in the configuration file to 'value' * * @return true if it succeeded, false otherwise */ - public static boolean setUsername(String value) { - return setString("main", "username", value); + public static void setIdentityProvider(String value) { + setString("login.idp", value); } /** - * Sets the value of 'Letzter Downloadpfad' in the configuration file to - * 'value' + * Query the authentication method of the configuration file * - * @return true if it succeeded, false otherwise + * @return stored IdP */ - public static boolean setDownloadPath(String value) { - return setString("main", "download_path", value); + public static String getAuthenticationMethod() { + return getString("login.method", "ECP"); } /** - * Sets the value of "Letzter Uploadpfad" in the configuration file to - * 'value' + * Sets the value of the selected authentication method in the configuration + * file to 'value' * * @return true if it succeeded, false otherwise */ - public static boolean setUploadPath(String value) { - return setString("main", "upload_path", value); + public static void setAuthenticationMethod(String value) { + setString("login.method", value); } - /** - * Sets the value of "IdP" in the configuration file to 'value' - * - * @return true if it succeeded, false otherwise + /* + * Generic helpers for different data types */ - public static boolean setIdentityProvider(String value) { - return setString("main", "identity_provider", value); - } /** - * Sets the value of the selected authentication method in the configuration - * file to 'value' + * Gets the boolean from the given key. + * If nothing is found, return the given default value * - * @return true if it succeeded, false otherwise + * @param key key to query in that section + * @param defaultValue default value to be returned, if none is found. + * @return */ - public static boolean setAuthenticationMethod(String value) { - return setString("main", "auth_method", value); + private static boolean getBoolean(String key, boolean defaultValue) { + return Boolean.parseBoolean(prop.getProperty(key, Boolean.toString(defaultValue))); } /** - * Save the changes to the ini file to actual file on the disk. + * Sets the given key to value. * - * @return true if succeeded, false otherwise + * @param key key to set + * @param value value to assign to key */ - public static boolean store() { - try { - ini.store(); - return true; - } catch (IOException e) { - e.printStackTrace(); - return false; - } + private static void setBoolean(String key, boolean value) { + prop.setProperty(key, Boolean.toString(value)); + queueSave(); } /** - * Gets the boolean from the given 'key' in the given 'section'. - * If nothing is found, return the given 'defaultValue' + * Gets the integer from the given key. + * If nothing is found, return the given default value * - * @param section section to search the key in * @param key key to query in that section * @param defaultValue default value to be returned, if none is found. * @return */ - private static boolean getBoolean(String section, String key, Boolean defaultValue) { - if (ini.containsKey(section) && ini.get(section).containsKey(key)) { - return ini.get(section, key, Boolean.class); - } else { - return defaultValue; - } + private static int getInteger(String key, int defaultValue) { + return FormatHelper.parseInt(prop.getProperty(key), defaultValue); } /** - * Gets the string from the given 'key' in the given 'section' - * If nothing is found, return the given 'defaultValue' + * Sets the given key to value. * - * @param section section of the configuration file to search for - * @param key key to lookup in the section - * @param defaultValue default value to return if none is found in the file - * @return value of 'key' in 'section' if it exists, 'defaultValue' - * otherwise + * @param key key to set + * @param value value to assign to key */ - private static String getString(String section, String key, String defaultValue) { - if (ini.containsKey(section) && ini.get(section).containsKey(key)) { - return ini.get(section, key); - } else { - return defaultValue; - } + private static void setInteger(String key, int value) { + prop.setProperty(key, Integer.toString(value)); + queueSave(); } /** - * Sets the given 'key' in the given 'section' to 'value'. - * Restricted to boolean. + * Gets the string from the given key. + * If nothing is found, return the given default value * - * @param section section of the configuration file - * @param key key to set - * @param value value to assign to key - * @return true if it succeeded, false otherwise + * @param key key to lookup in the section + * @param defaultValue default value to return if none is found in the file + * @return */ - private static boolean setBoolean(String section, String key, boolean value) { - return ini.put(section, key, value) != null; + private static String getString(String key, String defaultValue) { + return prop.getProperty(key, defaultValue); } /** * Sets the given 'key' in the given 'section' to 'value'. * Restricted to string. * - * @param section section of the configuration file * @param key key to set * @param value value to assign to key - * @return true if it succeeded, false otherwise */ - private static boolean setString(String section, String key, String value) { - return ini.put(section, key, value) != null; + private static void setString(String key, String value) { + prop.setProperty(key, value); + queueSave(); } } |