summaryrefslogtreecommitdiffstats
path: root/EssentialsAntiCheat/src/com/earth2me/essentials/anticheat/config/ConfigurationManager.java
diff options
context:
space:
mode:
Diffstat (limited to 'EssentialsAntiCheat/src/com/earth2me/essentials/anticheat/config/ConfigurationManager.java')
-rw-r--r--EssentialsAntiCheat/src/com/earth2me/essentials/anticheat/config/ConfigurationManager.java257
1 files changed, 257 insertions, 0 deletions
diff --git a/EssentialsAntiCheat/src/com/earth2me/essentials/anticheat/config/ConfigurationManager.java b/EssentialsAntiCheat/src/com/earth2me/essentials/anticheat/config/ConfigurationManager.java
new file mode 100644
index 000000000..283ad88d2
--- /dev/null
+++ b/EssentialsAntiCheat/src/com/earth2me/essentials/anticheat/config/ConfigurationManager.java
@@ -0,0 +1,257 @@
+package com.earth2me.essentials.anticheat.config;
+
+import com.earth2me.essentials.anticheat.NoCheat;
+import java.io.File;
+import java.io.PrintWriter;
+import java.io.StringWriter;
+import java.text.SimpleDateFormat;
+import java.util.HashMap;
+import java.util.Map;
+import java.util.Map.Entry;
+import java.util.logging.*;
+
+
+/**
+ * Central location for everything that's described in the configuration file(s)
+ *
+ */
+public class ConfigurationManager
+{
+ private final static String configFileName = "config.yml";
+ private final Map<String, ConfigurationCacheStore> worldnameToConfigCacheMap = new HashMap<String, ConfigurationCacheStore>();
+ private FileHandler fileHandler;
+ private final NoCheat plugin;
+
+
+ private static class LogFileFormatter extends Formatter
+ {
+ private final SimpleDateFormat date;
+
+ public LogFileFormatter()
+ {
+ date = new SimpleDateFormat("yy.MM.dd HH:mm:ss");
+ }
+
+ @Override
+ public String format(LogRecord record)
+ {
+ StringBuilder builder = new StringBuilder();
+ Throwable ex = record.getThrown();
+
+ builder.append(date.format(record.getMillis()));
+ builder.append(" [");
+ builder.append(record.getLevel().getLocalizedName().toUpperCase());
+ builder.append("] ");
+ builder.append(record.getMessage());
+ builder.append('\n');
+
+ if (ex != null)
+ {
+ StringWriter writer = new StringWriter();
+ ex.printStackTrace(new PrintWriter(writer));
+ builder.append(writer);
+ }
+
+ return builder.toString();
+ }
+ }
+
+ public ConfigurationManager(NoCheat plugin, File rootConfigFolder)
+ {
+
+ this.plugin = plugin;
+
+ // Setup the real configuration
+ initializeConfig(rootConfigFolder);
+
+ }
+
+ /**
+ * Read the configuration file and assign either standard values or whatever is declared in the file
+ *
+ * @param configurationFile
+ */
+ private void initializeConfig(File rootConfigFolder)
+ {
+
+ // First try to obtain and parse the global config file
+ NoCheatConfiguration root = new NoCheatConfiguration();
+ root.setDefaults(new DefaultConfiguration());
+ root.options().copyDefaults(true);
+ root.options().copyHeader(true);
+
+ File globalConfigFile = getGlobalConfigFile(rootConfigFolder);
+
+ if (globalConfigFile.exists())
+ {
+ try
+ {
+ root.load(globalConfigFile);
+ }
+ catch (Exception e)
+ {
+ e.printStackTrace();
+ }
+ }
+
+ try
+ {
+ root.save(globalConfigFile);
+ }
+ catch (Exception e)
+ {
+ e.printStackTrace();
+ }
+
+ root.regenerateActionLists();
+
+ // Create a corresponding Configuration Cache
+ // put the global config on the config map
+ worldnameToConfigCacheMap.put(null, new ConfigurationCacheStore(root));
+
+ plugin.setFileLogger(setupFileLogger(new File(rootConfigFolder, root.getString(ConfPaths.LOGGING_FILENAME))));
+
+ // Try to find world-specific config files
+ Map<String, File> worldFiles = getWorldSpecificConfigFiles(rootConfigFolder);
+
+ for (Entry<String, File> worldEntry : worldFiles.entrySet())
+ {
+
+ File worldConfigFile = worldEntry.getValue();
+
+ NoCheatConfiguration world = new NoCheatConfiguration();
+ world.setDefaults(root);
+
+ try
+ {
+ world.load(worldConfigFile);
+
+ worldnameToConfigCacheMap.put(worldEntry.getKey(), new ConfigurationCacheStore(world));
+
+ // write the config file back to disk immediately
+ world.save(worldConfigFile);
+
+ }
+ catch (Exception e)
+ {
+ plugin.getLogger().warning("Couldn't load world-specific config for " + worldEntry.getKey());
+ e.printStackTrace();
+ }
+
+ world.regenerateActionLists();
+ }
+ }
+
+ private static File getGlobalConfigFile(File rootFolder)
+ {
+
+ File globalConfig = new File(rootFolder, configFileName);
+
+ return globalConfig;
+ }
+
+ private static Map<String, File> getWorldSpecificConfigFiles(File rootFolder)
+ {
+
+ HashMap<String, File> files = new HashMap<String, File>();
+
+ if (rootFolder.isDirectory())
+ {
+ for (File f : rootFolder.listFiles())
+ {
+ if (f.isFile())
+ {
+ String filename = f.getName();
+ if (filename.matches(".+_" + configFileName + "$"))
+ {
+ // Get the first part = world name
+ String worldname = filename.substring(0, filename.length() - (configFileName.length() + 1));
+ files.put(worldname, f);
+ }
+ }
+ }
+ }
+ return files;
+ }
+
+ private Logger setupFileLogger(File logfile)
+ {
+
+ Logger l = Logger.getAnonymousLogger();
+ l.setLevel(Level.INFO);
+ // Ignore parent's settings
+ l.setUseParentHandlers(false);
+ for (Handler h : l.getHandlers())
+ {
+ l.removeHandler(h);
+ }
+
+ if (fileHandler != null)
+ {
+ fileHandler.close();
+ l.removeHandler(fileHandler);
+ fileHandler = null;
+ }
+
+ try
+ {
+ try
+ {
+ logfile.getParentFile().mkdirs();
+ }
+ catch (Exception e)
+ {
+ e.printStackTrace();
+ }
+ fileHandler = new FileHandler(logfile.getCanonicalPath(), true);
+ fileHandler.setLevel(Level.ALL);
+ fileHandler.setFormatter(new LogFileFormatter());
+
+ l.addHandler(fileHandler);
+ }
+ catch (Exception e)
+ {
+ e.printStackTrace();
+ }
+
+ return l;
+ }
+
+ /**
+ * Reset the loggers and flush and close the fileHandlers to be able to use them next time without problems
+ */
+ public void cleanup()
+ {
+ fileHandler.flush();
+ fileHandler.close();
+ Logger l = Logger.getLogger("NoCheat");
+ l.removeHandler(fileHandler);
+ fileHandler = null;
+ }
+
+ /**
+ * Get the cache of the specified world, or the default cache, if no cache exists for that world.
+ *
+ * @param worldname
+ * @return
+ */
+ public ConfigurationCacheStore getConfigurationCacheForWorld(String worldname)
+ {
+
+ ConfigurationCacheStore cache = worldnameToConfigCacheMap.get(worldname);
+
+ if (cache != null)
+ {
+ return cache;
+ }
+ else
+ {
+ // Enter a reference to the cache under the new name
+ // to be faster in looking it up later
+ cache = worldnameToConfigCacheMap.get(null);
+ worldnameToConfigCacheMap.put(worldname, cache);
+
+ return cache;
+ }
+ }
+}