config: fix config creation bug

This commit is contained in:
Bixilon 2020-09-30 20:56:05 +02:00
parent 3071fa7499
commit d26c32d83f
No known key found for this signature in database
GPG Key ID: 5CAD791931B09AC4
5 changed files with 52 additions and 35 deletions

View File

@ -115,7 +115,7 @@ public class Minosoft {
public static void checkClientToken() { public static void checkClientToken() {
if (config.getString(GameConfiguration.CLIENT_TOKEN) == null || config.getString(GameConfiguration.CLIENT_TOKEN).equals("randomGenerated")) { if (config.getString(GameConfiguration.CLIENT_TOKEN) == null || config.getString(GameConfiguration.CLIENT_TOKEN).equals("randomGenerated")) {
config.putString(GameConfiguration.CLIENT_TOKEN, UUID.randomUUID().toString()); config.putString(GameConfiguration.CLIENT_TOKEN, UUID.randomUUID().toString());
config.saveToFile(Config.configFileName); config.saveToFile();
} }
} }
@ -135,7 +135,7 @@ public class Minosoft {
if (account == null) { if (account == null) {
selectedAccount = null; selectedAccount = null;
config.putString(GameConfiguration.ACCOUNT_SELECTED, null); config.putString(GameConfiguration.ACCOUNT_SELECTED, null);
config.saveToFile(Config.configFileName); config.saveToFile();
return; return;
} }
MojangAccount.RefreshStates refreshState = account.refreshToken(); MojangAccount.RefreshStates refreshState = account.refreshToken();

View File

@ -29,6 +29,7 @@ import java.util.UUID;
public class Configuration { public class Configuration {
final LinkedHashMap<String, Object> config; final LinkedHashMap<String, Object> config;
final Thread thread;
public Configuration(String filename) throws IOException { public Configuration(String filename) throws IOException {
@ -47,7 +48,48 @@ public class Configuration {
file = new File(Config.homeDir + "config/" + filename); file = new File(Config.homeDir + "config/" + filename);
} }
Yaml yml = new Yaml(); Yaml yml = new Yaml();
config = yml.load(new FileInputStream(file)); FileInputStream inputStream = new FileInputStream(file);
config = yml.load(inputStream);
inputStream.close();
final File finalFile = file;
thread = new Thread(() -> {
while (true) {
// wait for interrupt
try {
Thread.sleep(Integer.MAX_VALUE);
} catch (InterruptedException ignored) {
}
// write config to temp file, delete original config, rename temp file to original file to avoid conflicts if minosoft gets closed while saving the config
File tempFile = new File(Config.homeDir + "config/" + filename + ".tmp");
Yaml yaml = new Yaml();
FileWriter writer;
try {
writer = new FileWriter(tempFile);
} catch (IOException e) {
e.printStackTrace();
return;
}
synchronized (config) {
yaml.dump(config, writer);
}
try {
writer.close();
} catch (IOException e) {
e.printStackTrace();
}
if (finalFile.exists()) {
finalFile.delete();
}
if (!tempFile.renameTo(finalFile)) {
Log.fatal("An error occurred while saving the config file");
} else {
Log.verbose(String.format("Configuration saved to file %s", filename));
}
}
});
thread.setName("IO-Thread");
thread.start();
} }
public boolean getBoolean(String path) { public boolean getBoolean(String path) {
@ -171,30 +213,8 @@ public class Configuration {
config.remove(path); config.remove(path);
} }
public void saveToFile(String filename) { public void saveToFile() {
Thread thread = new Thread(() -> { thread.interrupt();
// write config to temp file, delete original config, rename temp file to original file to avoid conflicts if minosoft gets closed while saving the config
File tempFile = new File(Config.homeDir + "config/" + filename + ".tmp");
File file = new File(Config.homeDir + "config/" + filename);
Yaml yaml = new Yaml();
FileWriter writer;
try {
writer = new FileWriter(tempFile);
} catch (IOException e) {
e.printStackTrace();
return;
}
synchronized (config) {
yaml.dump(config, writer);
}
if (!file.delete() || !tempFile.renameTo(file)) {
Log.fatal("An error occurred while saving the config file");
} else {
Log.verbose(String.format("Configuration saved to file %s", filename));
}
});
thread.setName("IO-Thread");
thread.start();
} }
public HashBiMap<String, MojangAccount> getMojangAccounts() { public HashBiMap<String, MojangAccount> getMojangAccounts() {

View File

@ -13,7 +13,6 @@
package de.bixilon.minosoft.gui.main; package de.bixilon.minosoft.gui.main;
import de.bixilon.minosoft.Config;
import de.bixilon.minosoft.Minosoft; import de.bixilon.minosoft.Minosoft;
import de.bixilon.minosoft.protocol.network.Connection; import de.bixilon.minosoft.protocol.network.Connection;
import de.bixilon.minosoft.protocol.protocol.ConnectionReasons; import de.bixilon.minosoft.protocol.protocol.ConnectionReasons;
@ -95,12 +94,12 @@ public class Server {
public void saveToConfig() { public void saveToConfig() {
Minosoft.getConfig().putServer(this); Minosoft.getConfig().putServer(this);
Minosoft.getConfig().saveToFile(Config.configFileName); Minosoft.getConfig().saveToFile();
} }
public void delete() { public void delete() {
Minosoft.getConfig().removeServer(this); Minosoft.getConfig().removeServer(this);
Minosoft.getConfig().saveToFile(Config.configFileName); Minosoft.getConfig().saveToFile();
} }
public Connection getLastPing() { public Connection getLastPing() {

View File

@ -13,7 +13,6 @@
package de.bixilon.minosoft.gui.main; package de.bixilon.minosoft.gui.main;
import de.bixilon.minosoft.Config;
import de.bixilon.minosoft.Minosoft; import de.bixilon.minosoft.Minosoft;
import de.bixilon.minosoft.config.GameConfiguration; import de.bixilon.minosoft.config.GameConfiguration;
import de.bixilon.minosoft.logging.Log; import de.bixilon.minosoft.logging.Log;
@ -43,7 +42,7 @@ public class SettingsWindow implements Initializable {
} }
Log.setLevel(newLevel); Log.setLevel(newLevel);
Minosoft.getConfig().putString(GameConfiguration.GENERAL_LOG_LEVEL, newLevel.name()); Minosoft.getConfig().putString(GameConfiguration.GENERAL_LOG_LEVEL, newLevel.name());
Minosoft.getConfig().saveToFile(Config.configFileName); Minosoft.getConfig().saveToFile();
})); }));
} }
} }

View File

@ -14,7 +14,6 @@
package de.bixilon.minosoft.util.mojang.api; package de.bixilon.minosoft.util.mojang.api;
import com.google.gson.JsonObject; import com.google.gson.JsonObject;
import de.bixilon.minosoft.Config;
import de.bixilon.minosoft.Minosoft; import de.bixilon.minosoft.Minosoft;
import de.bixilon.minosoft.util.Util; import de.bixilon.minosoft.util.Util;
@ -92,7 +91,7 @@ public class MojangAccount {
public void saveToConfig() { public void saveToConfig() {
Minosoft.getConfig().putMojangAccount(this); Minosoft.getConfig().putMojangAccount(this);
Minosoft.getConfig().saveToFile(Config.configFileName); Minosoft.getConfig().saveToFile();
} }
@Override @Override
@ -103,7 +102,7 @@ public class MojangAccount {
public void delete() { public void delete() {
Minosoft.getAccountList().remove(this.getUserId()); Minosoft.getAccountList().remove(this.getUserId());
Minosoft.getConfig().removeAccount(this); Minosoft.getConfig().removeAccount(this);
Minosoft.getConfig().saveToFile(Config.configFileName); Minosoft.getConfig().saveToFile();
} }
@Override @Override