]> git.lizzy.rs Git - BoundingBoxOutlineReloaded.git/blob - src/main/java/com/irtimaled/bbor/config/Configuration.java
Cleanup code
[BoundingBoxOutlineReloaded.git] / src / main / java / com / irtimaled / bbor / config / Configuration.java
1 package com.irtimaled.bbor.config;
2
3 import com.google.common.io.Files;
4
5 import java.io.*;
6 import java.nio.charset.Charset;
7 import java.nio.charset.StandardCharsets;
8 import java.util.HashMap;
9 import java.util.List;
10 import java.util.Map;
11
12 public class Configuration {
13     public static final String FALLBACK_CATEGORY = "features";
14     private final File file;
15
16     Configuration(File file) {
17         this.file = file;
18     }
19
20     void save() {
21         try (Writer writer = new BufferedWriter(new OutputStreamWriter(new FileOutputStream(file), StandardCharsets.UTF_8))) {
22             writer.write("# Configuration file\n");
23             for (String category : settingsGroup.keySet()) {
24                 writer.write("\n");
25                 writer.write(String.format("%s {\n", category));
26                 Map<String, Setting<?>> settings = settingsGroup.get(category);
27                 boolean first = true;
28                 for (String settingName : settings.keySet()) {
29                     if (!first)
30                         writer.write("\n");
31                     first = false;
32                     Setting setting = settings.get(settingName);
33                     writer.write(String.format("    # %s\n", setting.comment));
34                     writer.write(String.format("    %s:%s=%s\n", setting.getType(), settingName, setting.getValue()));
35                 }
36                 writer.write("}\n");
37             }
38         } catch (IOException ignored) {
39         }
40     }
41
42     private Map<String, Map<String, Setting<?>>> settingsGroup = new HashMap<>();
43
44     void load() {
45         try {
46             List<String> lines = Files.readLines(file, Charset.forName("utf-8"));
47             String category = null;
48             String lastCommentLine = null;
49             for (String line : lines) {
50                 String trimmedLine = line.trim();
51                 if (trimmedLine.isEmpty()) {
52                     continue;
53                 }
54                 if (trimmedLine.startsWith("#")) {
55                     lastCommentLine = trimmedLine.substring(1).trim();
56                     continue;
57                 }
58                 if (trimmedLine.equals("}")) {
59                     category = null;
60                     continue;
61                 }
62                 if (category == null && trimmedLine.endsWith("{")) {
63                     category = trimmedLine.substring(0, trimmedLine.length() - 1).trim();
64                     settingsGroup.put(category, new HashMap<>());
65                     continue;
66                 }
67                 if (category != null) {
68                     String[] items = trimmedLine.split("[:=]");
69                     char type = items[0].charAt(0);
70                     String name = items[1];
71                     String stringValue = items[2];
72                     Setting setting = getTypedSetting(type, stringValue);
73                     setting.comment = lastCommentLine;
74                     settingsGroup.get(category).put(name, setting);
75                 }
76             }
77         } catch (IOException ignored) {
78         }
79     }
80
81     private Setting<?> getTypedSetting(char type, String value) {
82         switch (type) {
83             case 'I':
84                 return new Setting<>(type, Integer.parseInt(value));
85             case 'B':
86                 return new Setting<>(type, value.equals("1") || value.toLowerCase().equals("true"));
87         }
88         return new Setting<>(type, value);
89     }
90
91     <T> Setting<T> get(String category, String settingName, T defaultValue) {
92         char type = getType(defaultValue);
93         if (!settingsGroup.containsKey(category)) {
94             settingsGroup.put(category, new HashMap<>());
95         }
96         Map<String, Setting<?>> settings = settingsGroup.get(category);
97         Setting<?> setting = settings.get(settingName);
98         if (setting == null && category != FALLBACK_CATEGORY)
99             setting = getFallbackSetting(settingName, settings);
100         if (setting != null && setting.getType() != type) {
101             setting = null;
102         }
103         if (setting == null) {
104             settings.put(settingName, setting = new Setting<>(type, defaultValue));
105         }
106         return (Setting<T>) setting;
107     }
108
109     private Setting<?> getFallbackSetting(String settingName, Map<String, Setting<?>> settings) {
110         Map<String, Setting<?>> fallbackSettings = settingsGroup.get(FALLBACK_CATEGORY);
111         if (fallbackSettings == null) return null;
112
113         Setting<?> setting = fallbackSettings.get(settingName);
114         if (setting != null) {
115             fallbackSettings.remove(settingName);
116             settings.put(settingName, setting);
117         }
118         return setting;
119     }
120
121     private <T> char getType(T defaultValue) {
122         String[] typeNames = defaultValue.getClass().getName().split("[.]");
123         return typeNames[typeNames.length - 1].charAt(0);
124     }
125
126     void put(Setting<?> setting) {
127         String category = setting.category;
128         if (!settingsGroup.containsKey(category)) {
129             settingsGroup.put(category, new HashMap<>());
130         }
131         Map<String, Setting<?>> settings = settingsGroup.get(category);
132         settings.put(setting.name, setting);
133     }
134 }