+ Added safety features
This commit is contained in:
+37
-4
@@ -1,10 +1,12 @@
|
||||
package core;
|
||||
|
||||
import java.io.IOException;
|
||||
import java.util.List;
|
||||
import java.util.Map;
|
||||
import java.util.Vector;
|
||||
|
||||
import utils.GlobalLog;
|
||||
import utils.LogFilter;
|
||||
import utils.io.FileMonitor;
|
||||
|
||||
public class Config
|
||||
@@ -20,6 +22,8 @@ public class Config
|
||||
public Config()
|
||||
{
|
||||
if(instance == null)
|
||||
{
|
||||
try
|
||||
{
|
||||
sections = new Vector<IConfigSection>();
|
||||
|
||||
@@ -34,17 +38,42 @@ public class Config
|
||||
|
||||
instance = this;
|
||||
}
|
||||
catch(Exception e)
|
||||
{
|
||||
String logText = "Failure during config startup. The config must start correctly, or the bot cannot run - aborting. Error: " + e.getMessage();
|
||||
GlobalLog.error(LogFilter.Core, logText);
|
||||
System.exit(-1);
|
||||
}
|
||||
}
|
||||
else
|
||||
{
|
||||
System.out.println("Only one config class is allowed, period. Aborting.");
|
||||
System.out.flush();
|
||||
GlobalLog.error(LogFilter.Core, "Only one config class is allowed, period. Aborting.");
|
||||
System.exit(-1);
|
||||
}
|
||||
}
|
||||
|
||||
public void buildConfigFile(String path)
|
||||
// This has more overhead but safely builds the file.
|
||||
// It returns if it succeeded or not.
|
||||
private boolean safelyBuildConfigFile(String path)
|
||||
{
|
||||
try
|
||||
{
|
||||
buildConfigFile(path);
|
||||
}
|
||||
catch (Exception e)
|
||||
{
|
||||
GlobalLog.error("Failure during config file updating, aborting update immediately and attempting to salvage operation! The error was: " + e);
|
||||
return false;
|
||||
}
|
||||
|
||||
return true;
|
||||
}
|
||||
|
||||
// Builds the config file and will throw an exception if it fails
|
||||
public void buildConfigFile(String path) throws IOException
|
||||
{
|
||||
configCSV = new ConfigCSV(sections, path);
|
||||
|
||||
Map<String, List<ConfigItem>> groupedSections = ConfigCSV.groupByColumn(configCSV.getItems(), 0);
|
||||
|
||||
if(groupedSections != null)
|
||||
@@ -59,18 +88,22 @@ public class Config
|
||||
configCSV.writeFile();
|
||||
}
|
||||
|
||||
// Call very frequently, but lazily. This will update the file content.
|
||||
public void upkeep()
|
||||
{
|
||||
monitoredConfigFile.update((monitoredFile) ->
|
||||
{
|
||||
GlobalLog.log("File updated at " + monitoredFile.path);
|
||||
buildConfigFile(monitoredFile.path.toString());
|
||||
|
||||
// Attempt to rebuild. If we do it safely, then force-sync the DB and re-register.
|
||||
if(safelyBuildConfigFile(monitoredFile.path.toString()))
|
||||
{
|
||||
// Re-register all commands now that we've updated the config.
|
||||
// Before we do that tho, sync off anything that needs syncing.
|
||||
// TODO: This is not thread safe.
|
||||
DatabaseManager.instance.upkeep();
|
||||
CommandManager.instance.registerAllCommands();
|
||||
}
|
||||
});
|
||||
}
|
||||
}
|
||||
|
||||
@@ -25,7 +25,7 @@ public class ConfigCSV
|
||||
private List<IConfigSection> sections;
|
||||
|
||||
// Constructor
|
||||
public ConfigCSV(List<IConfigSection> sections, String path)
|
||||
public ConfigCSV(List<IConfigSection> sections, String path) throws IOException
|
||||
{
|
||||
this.path = path;
|
||||
this.sections = sections;
|
||||
@@ -46,9 +46,7 @@ public class ConfigCSV
|
||||
}
|
||||
|
||||
// Read the file. This is internal only.
|
||||
private void read(String filepath)
|
||||
{
|
||||
try
|
||||
private void read(String filepath) throws IOException
|
||||
{
|
||||
File configFile = new File(filepath);
|
||||
|
||||
@@ -85,11 +83,6 @@ public class ConfigCSV
|
||||
csvReader.close();
|
||||
reader.close();
|
||||
}
|
||||
catch (Exception e)
|
||||
{
|
||||
e.printStackTrace();
|
||||
}
|
||||
}
|
||||
|
||||
// Get a copy of the internal items
|
||||
public List<ConfigItem> getItems()
|
||||
|
||||
@@ -36,13 +36,14 @@ public class GlobalLog
|
||||
System.out.println(logLine);
|
||||
}
|
||||
|
||||
public static void log(String msg) { write(log, LogFilter.Debug, msg); }
|
||||
public static void warn(String msg) { write(warn, LogFilter.Debug, msg); }
|
||||
public static void error(String msg) { write(error, LogFilter.Debug, msg); }
|
||||
public static void fatal(String msg) throws Exception { write(fatal, LogFilter.Debug, msg); throw new Exception(msg); }
|
||||
|
||||
public static void log(LogFilter filter, String msg) { write(log, filter, msg); }
|
||||
public static void warn(LogFilter filter, String msg) { write(warn, filter, msg); }
|
||||
public static void error(LogFilter filter, String msg) { write(error, filter, msg); }
|
||||
public static void error(LogFilter filter, String msg) { write(error, filter, msg); System.err.println(msg); System.err.flush(); }
|
||||
public static void fatal(LogFilter filter, String msg) throws Exception { write(fatal, filter, msg); throw new Exception(msg); }
|
||||
|
||||
public static void log(String msg) { log(LogFilter.Debug, msg); }
|
||||
public static void warn(String msg) { warn(LogFilter.Debug, msg); }
|
||||
public static void error(String msg) { error(LogFilter.Debug, msg); }
|
||||
public static void fatal(String msg) throws Exception { fatal(LogFilter.Debug, msg); }
|
||||
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user