summaryrefslogtreecommitdiffstats
path: root/dozentenmodul/src/main/java/org/openslx/dozmod/Config.java
diff options
context:
space:
mode:
authorSimon Rettberg2015-07-10 19:57:55 +0200
committerSimon Rettberg2015-07-10 19:57:55 +0200
commitd3b015ba0ef85459f3eba313d1d8bcc3765a5348 (patch)
treedfd0c0374bd53bd5770f076283655f039aaba946 /dozentenmodul/src/main/java/org/openslx/dozmod/Config.java
parentMerge branch 'v1.1' of git.openslx.org:openslx-ng/tutor-module into v1.1 (diff)
downloadtutor-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.java330
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();
}
}