148 lines
6.4 KiB
Java
148 lines
6.4 KiB
Java
/*
|
|
*
|
|
* Setup.java
|
|
*
|
|
* Setup is a singleton object that runs on the initial mod setup to run critical checks to make sure the mod
|
|
* is allowed to do things on the users filesystem (reading conf files, writing conf files, etc). It's quite
|
|
* important for the mod to know this!
|
|
*
|
|
*/
|
|
|
|
package jesse.keeblarcraft.Utils;
|
|
|
|
import java.util.List;
|
|
|
|
import java.util.ArrayList;
|
|
|
|
import jesse.keeblarcraft.Keeblarcraft;
|
|
import jesse.keeblarcraft.ConfigMgr.ConfigManager;
|
|
import jesse.keeblarcraft.Utils.CustomExceptions.SETUP_FAILED_EXCEPTION;
|
|
|
|
// Singleton class is designed to help the mod set itself up and create all the important things. It does two things:
|
|
//
|
|
// Thing 1: If on initial setup of mod for first time; creates all necessary directories and files.
|
|
// Doing this helps the mod know if it has permissions to do things, or if it shouldn't even bother!
|
|
// Some functionality is disabled if the mod can't access the hard drive in various ways.
|
|
//
|
|
// Thing 2: On any sequential startup; it checks to make sure all the directories exist & replaces missing ones.
|
|
// It will also do a state-check of the system to make sure we will have permissions to read & write.
|
|
// If we do not have these, or only partial - then functionality may be disabled for runtime performance
|
|
public final class Setup {
|
|
private static Setup static_inst;
|
|
|
|
public Setup() {}
|
|
|
|
// Returns the singleton object
|
|
public static Setup GetInstance() {
|
|
if (static_inst == null) {
|
|
static_inst = new Setup();
|
|
}
|
|
|
|
return static_inst;
|
|
}
|
|
|
|
/// Unit testing functions below
|
|
public static Boolean has_read = false;
|
|
public static Boolean has_write = false;
|
|
|
|
// First time setup variables
|
|
private static final List<String> DIRECTORY_LIST = new ArrayList<String>() {{
|
|
add("notes"); // Expect 1 file per player!
|
|
add("factions"); // Expect 1 file per faction!
|
|
add("story"); // Expect 1 file per story chapter!
|
|
add("commands"); // Expect 1 file per command that's configurable!
|
|
add("events"); // Expect 1 file per event that is configurable!
|
|
add("bank");
|
|
add("attributes");
|
|
add("misc");
|
|
}};
|
|
|
|
// These will be top-level config files above the directories this mod creates
|
|
private static final List<String> FILE_LIST = new ArrayList<String>() {{
|
|
add("story/general_story_config.json"); // Big config file, determines when players can do certain things at different story levels
|
|
add("factions/general_factions_config.json"); // General configuration file for factions stuff
|
|
add("events/general_event_config.json"); // General configuration file for story events!
|
|
add("general.json"); // The super general configuration file! (May be removed)
|
|
add("attributes/general_attribute_config.json");
|
|
}};
|
|
|
|
// RunChecks()
|
|
//
|
|
// Checks if we are able to create necessary directories and run reading over the file system for the current
|
|
// directory this mod is maintained in. This will return false if any checks fail; but individual checks can
|
|
// be accessed in class variables (above)
|
|
public Boolean RunChecks() {
|
|
ConfigManager conf = new ConfigManager();
|
|
|
|
// Create directory check
|
|
has_write = conf.CreateDirectory("test_dir");
|
|
|
|
if (!has_write) {
|
|
Keeblarcraft.LOGGER.error("Uh oh! It appears we could not successfully identify that we have write permissions. Attempt to create a directory failed.");
|
|
} else {
|
|
has_write = conf.CreateFile("test_dir/test_note.txt");
|
|
has_write = conf.WriteToFile("test_dir/test_note.txt", "test_write_read", "w");
|
|
|
|
List<String> lines = conf.GetFileLines("test_dir/test_note.txt");
|
|
if (lines.size() == 0) {
|
|
has_read = false;
|
|
} else {
|
|
has_read = true;
|
|
}
|
|
|
|
has_write = conf.DeleteFile("test_dir/test_note.txt");
|
|
has_write = conf.DeleteDirectory("test_dir");
|
|
|
|
if (!has_write) {
|
|
Keeblarcraft.LOGGER.error("Uh oh! It appears we lost the ability to write or delete files after making one. Something is seriously wrong!");
|
|
}
|
|
}
|
|
|
|
Keeblarcraft.LOGGER.debug("CHECKS DEBUG: Value of has_write: "+has_write.toString()+". Value of has_read: "+has_read.toString());
|
|
// return has_write && has_read;
|
|
return true; /// TODO: ConfigManager has been rewritten so much that the above code is out dated. Fix later return true for now
|
|
}
|
|
|
|
// RunSetup
|
|
//
|
|
// Primary function call that will execute when mod starts up
|
|
public Boolean RunSetup() throws SETUP_FAILED_EXCEPTION {
|
|
Boolean ret = false;
|
|
|
|
// Setup can only complete if it has guarenteed we have read & write permissions
|
|
if (ret = RunChecks()) {
|
|
try {
|
|
// Create necessary directories
|
|
ConfigManager conf = new ConfigManager();
|
|
for (Integer i = 0; i < DIRECTORY_LIST.size(); i++) {
|
|
if ( ! conf.DoesDirectoryExist(DIRECTORY_LIST.get(i))) {
|
|
conf.CreateDirectory(DIRECTORY_LIST.get(i));
|
|
Keeblarcraft.LOGGER.debug("Creating directory " + DIRECTORY_LIST.get(i));
|
|
} else {
|
|
Keeblarcraft.LOGGER.debug(DIRECTORY_LIST.get(i) + " already exists. Skipping creation.");
|
|
}
|
|
}
|
|
|
|
// Create necessary files
|
|
for (Integer i = 0; i < FILE_LIST.size(); i++) {
|
|
if ( ! conf.DoesFileExist(FILE_LIST.get(i))) {
|
|
conf.CreateFile(FILE_LIST.get(i));
|
|
Keeblarcraft.LOGGER.debug("Creating file " + DIRECTORY_LIST.get(i));
|
|
} else {
|
|
Keeblarcraft.LOGGER.debug(DIRECTORY_LIST.get(i) + " already exists. Skipping creation.");
|
|
}
|
|
}
|
|
} catch (Exception e) {
|
|
throw new SETUP_FAILED_EXCEPTION();
|
|
}
|
|
} else {
|
|
Keeblarcraft.LOGGER.error("The setup phase failed in its processing and has determined it does not have necessary read or write priviliges in this hosted area and will now exit.");
|
|
throw new SETUP_FAILED_EXCEPTION();
|
|
}
|
|
|
|
Keeblarcraft.LOGGER.debug("DID SETUP COMPLETE SUCCESSFULLY? " + (ret ? "YES":"NO"));
|
|
|
|
return ret;
|
|
}
|
|
}
|