Properly initialize yaml config
[instantlauncher.git] / src / main / java / eu / svjatoslav / instantlauncher / configuration / ConfigurationManager.java
index 4bf00c9..7a8f8bc 100755 (executable)
@@ -1,79 +1,80 @@
 package eu.svjatoslav.instantlauncher.configuration;
 
+import com.esotericsoftware.yamlbeans.YamlConfig;
 import com.esotericsoftware.yamlbeans.YamlReader;
 import com.esotericsoftware.yamlbeans.YamlWriter;
 
 import java.io.*;
 import java.util.HashSet;
-import java.util.Map;
 
 public class ConfigurationManager {
 
     private static final String CONFIG_FILE_NAME = ".instantlauncher";
-
-    private boolean propertiesChanged = false;
-
-    Configuration configuration;
+    private Configuration configuration;
 
     public ConfigurationManager() throws IOException {
-        initialize();
+        initConfig();
     }
 
-    private File getPropertiesFile() {
-        return new File(System.getProperty("user.home") + "/" + CONFIG_FILE_NAME);
+    public Configuration getConfiguration() {
+        return configuration;
     }
 
-    public File getNavigationRootDirectory() {
-        if (configuration.navigationRootPath == null){
-            configuration.navigationRootPath = System.getProperty("user.home") + "/";
-            propertiesChanged = true;
-            registerDefaultAssociations();
-        }
-
-        return new File(configuration.navigationRootPath);
+    private File getPropertiesFile() {
+        return new File(System.getProperty("user.home") + "/" + CONFIG_FILE_NAME);
     }
 
-    private void initialize() throws IOException {
-
-        loadIfFileExists();
 
-        validatePropertiesFile();
-
-        if (propertiesChanged) {
-            saveFile();
-        }
-    }
-
-    private void loadIfFileExists() throws IOException {
+    private void initConfig() throws IOException {
         final File propertiesFile = getPropertiesFile();
-        if (!propertiesFile.exists())
-            return;
+        if (!propertiesFile.exists()) {
+            initDefaultConfiguration();
+        } else
+            loadConfigFile(propertiesFile);
+    }
 
+    private void loadConfigFile(File propertiesFile) throws IOException {
         YamlReader reader = new YamlReader(new FileReader(propertiesFile));
+        configureYaml(reader.getConfig());
         configuration = reader.read(Configuration.class);
-        if (configuration == null) {
-            configuration = new Configuration();
-            configuration.fileAssociations = new HashSet<>();
-        };
+        if (configuration == null)
+            initDefaultConfiguration();
     }
 
-    private void saveFile() throws IOException {
+    private void saveConfigFile() throws IOException {
         YamlWriter writer = new YamlWriter(new FileWriter(getPropertiesFile()));
+        configureYaml(writer.getConfig());
         writer.write(configuration);
         writer.close();
     }
 
-    private void validatePropertiesFile() {
-        getNavigationRootDirectory();
+    private void configureYaml(YamlConfig config) {
+        config.setClassTag("configuration",  Configuration.class);
+        config.setPropertyElementType(Configuration.class, "fileAssociations", FileAssociation.class);
     }
 
-    private void registerFileAssociation(String fileRegex, String command){
+    private void registerFileAssociation(String fileRegex, String command) {
         FileAssociation association = new FileAssociation(fileRegex, command);
         configuration.fileAssociations.add(association);
-        propertiesChanged = true;
     }
 
-    private void registerDefaultAssociations(){
-        registerFileAssociation(".jpeg$", "eog {file}");
+    private void initDefaultConfiguration() throws IOException {
+        configuration = new Configuration();
+        configuration.fileAssociations = new HashSet<>();
+
+        configuration.navigationRootPath = System.getProperty("user.home") + "/";
+        configuration.directoryOpenCommand = "nautilus -w {file}";
+        configuration.directoryTerminalOpenCommand = "gnome-terminal --working-directory={file}";
+
+        registerFileAssociation(".*\\.jpeg$", "eog {file}");
+        registerFileAssociation(".*\\.jpg$", "eog {file}");
+        registerFileAssociation(".*\\.png$", "eog {file}");
+        registerFileAssociation(".*\\.txt$", "emacs {file}");
+        registerFileAssociation(".*\\.org$", "emacs {file}");
+        registerFileAssociation(".*\\.avi$", "vlc {file}");
+        registerFileAssociation(".*\\.mp4$", "vlc {file}");
+        registerFileAssociation(".*\\.mkv$", "vlc {file}");
+
+        saveConfigFile();
     }
 }