]> git.lizzy.rs Git - BoundingBoxOutlineReloaded.git/blobdiff - src/main/java/com/irtimaled/bbor/config/Configuration.java
Fully stop needing config on BoundingBoxType
[BoundingBoxOutlineReloaded.git] / src / main / java / com / irtimaled / bbor / config / Configuration.java
index 20485262fde6a6a1b3dbd9f323df222b82d95e44..f061093ccbbdd3f1b8340289f1893534d1f9cb16 100644 (file)
@@ -3,12 +3,13 @@ package com.irtimaled.bbor.config;
 import com.google.common.io.Files;
 
 import java.io.*;
-import java.nio.charset.Charset;
+import java.nio.charset.StandardCharsets;
 import java.util.HashMap;
 import java.util.List;
 import java.util.Map;
 
 public class Configuration {
+    public static final String FALLBACK_CATEGORY = "features";
     private final File file;
 
     Configuration(File file) {
@@ -16,16 +17,13 @@ public class Configuration {
     }
 
     void save() {
-        Writer writer = null;
-        try {
-            writer = new BufferedWriter(new OutputStreamWriter(
-                    new FileOutputStream(file), "utf-8"));
+        try (Writer writer = new BufferedWriter(new OutputStreamWriter(new FileOutputStream(file), StandardCharsets.UTF_8))) {
             writer.write("# Configuration file\n");
             for (String category : settingsGroup.keySet()) {
                 writer.write("\n");
                 writer.write(String.format("%s {\n", category));
-                Map<String, Setting> settings = settingsGroup.get(category);
-                Boolean first = true;
+                Map<String, Setting<?>> settings = settingsGroup.get(category);
+                boolean first = true;
                 for (String settingName : settings.keySet()) {
                     if (!first)
                         writer.write("\n");
@@ -37,21 +35,14 @@ public class Configuration {
                 writer.write("}\n");
             }
         } catch (IOException ignored) {
-        } finally {
-            try {
-                if (writer != null) {
-                    writer.close();
-                }
-            } catch (Exception ignored) {
-            }
         }
     }
 
-    private Map<String, Map<String, Setting>> settingsGroup = new HashMap<>();
+    private final Map<String, Map<String, Setting<?>>> settingsGroup = new HashMap<>();
 
     void load() {
         try {
-            List<String> lines = Files.readLines(file, Charset.forName("utf-8"));
+            List<String> lines = Files.readLines(file, StandardCharsets.UTF_8);
             String category = null;
             String lastCommentLine = null;
             for (String line : lines) {
@@ -77,8 +68,7 @@ public class Configuration {
                     char type = items[0].charAt(0);
                     String name = items[1];
                     String stringValue = items[2];
-                    Object value = getTypedValue(type, stringValue);
-                    Setting setting = new Setting(value);
+                    Setting setting = getTypedSetting(type, stringValue);
                     setting.comment = lastCommentLine;
                     settingsGroup.get(category).put(name, setting);
                 }
@@ -87,24 +77,57 @@ public class Configuration {
         }
     }
 
-    private Object getTypedValue(char type, String stringValue) {
+    private Setting<?> getTypedSetting(char type, String value) {
         switch (type) {
             case 'I':
-                return Integer.parseInt(stringValue);
+                return new Setting<>(type, Integer.parseInt(value));
             case 'B':
-                return stringValue.equals("1") || stringValue.toLowerCase().equals("true");
+                return new Setting<>(type, value.equals("1") || value.toLowerCase().equals("true"));
         }
-        return stringValue;
+        return new Setting<>(type, value);
     }
 
-    public Setting get(String category, String settingName, Object defaultValue) {
+    <T> Setting<T> get(String category, String settingName, T defaultValue) {
+        char type = getType(defaultValue);
         if (!settingsGroup.containsKey(category)) {
             settingsGroup.put(category, new HashMap<>());
         }
-        Map<String, Setting> settings = settingsGroup.get(category);
-        if (!settings.containsKey(settingName)) {
-            settings.put(settingName, new Setting(defaultValue));
+        Map<String, Setting<?>> settings = settingsGroup.get(category);
+        Setting<?> setting = settings.get(settingName);
+        if (setting == null && !category.equals(FALLBACK_CATEGORY))
+            setting = getFallbackSetting(settingName, settings);
+        if (setting != null && setting.getType() != type) {
+            setting = null;
+        }
+        if (setting == null) {
+            settings.put(settingName, setting = new Setting<>(type, defaultValue));
+        }
+        return (Setting<T>) setting;
+    }
+
+    private Setting<?> getFallbackSetting(String settingName, Map<String, Setting<?>> settings) {
+        Map<String, Setting<?>> fallbackSettings = settingsGroup.get(FALLBACK_CATEGORY);
+        if (fallbackSettings == null) return null;
+
+        Setting<?> setting = fallbackSettings.get(settingName);
+        if (setting != null) {
+            fallbackSettings.remove(settingName);
+            settings.put(settingName, setting);
+        }
+        return setting;
+    }
+
+    private <T> char getType(T defaultValue) {
+        String[] typeNames = defaultValue.getClass().getName().split("[.]");
+        return typeNames[typeNames.length - 1].charAt(0);
+    }
+
+    void put(Setting<?> setting) {
+        String category = setting.category;
+        if (!settingsGroup.containsKey(category)) {
+            settingsGroup.put(category, new HashMap<>());
         }
-        return settings.get(settingName);
+        Map<String, Setting<?>> settings = settingsGroup.get(category);
+        settings.put(setting.name, setting);
     }
 }