package net.t7seven7t.util;
import com.google.common.collect.MapMaker;
import org.bukkit.configuration.file.FileConfiguration;
import org.bukkit.configuration.file.YamlConfiguration;
import org.bukkit.plugin.Plugin;
import java.io.File;
import java.io.IOException;
import java.util.Map;
/**
*
*/
public class Configs {
private static Map<ConfigDescription, File> configFiles;
private static Map<ConfigDescription, FileConfiguration> configs;
private static String DEFAULT_NAME = "config";
static {
MapMaker mm = new MapMaker();
configFiles = mm.makeMap();
configs = mm.makeMap();
}
public static FileConfiguration loadConfig(ConfigDescription desc) throws IOException {
if (desc.name.equals(DEFAULT_NAME)) {
desc.plugin.saveDefaultConfig();
desc.plugin.reloadConfig();
desc.plugin.getConfig().options().copyDefaults(true);
desc.plugin.saveConfig();
return desc.plugin.getConfig();
}
try {
File f = new File(desc.plugin.getDataFolder(), desc.name + ".yml");
if (!f.exists()) {
try {
desc.plugin.saveResource(f.getName(), false);
} catch (IllegalArgumentException e) {
f.createNewFile();
}
}
FileConfiguration c = YamlConfiguration.loadConfiguration(f);
if (desc.plugin.getResource(desc.name + ".yml") != null) {
FileConfiguration def = YamlConfiguration
.loadConfiguration(desc.plugin.getResource(desc.name + ".yml"));
c.setDefaults(def);
c.options().copyDefaults(true);
c.save(f);
}
configs.put(desc, c);
configFiles.put(desc, f);
return c;
} catch (IOException e) {
throw new IOException(String.format(
"An IO error occurred while attempting to load a config file. Details are: %s",
desc), e);
}
}
public static void saveConfig(ConfigDescription desc) throws IOException {
if (desc.name.equals(DEFAULT_NAME)) {
desc.plugin.saveConfig();
}
if (configs.get(desc) == null || configFiles.get(desc) == null) {
return;
}
try {
configs.get(desc).save(configFiles.get(desc));
} catch (IOException e) {
throw new IOException(String.format(
"An IO error occurred while attempting to save a config file. Details are: %s",
desc), e);
}
}
/**
* Gets the config described by the given ConfigDescription. If the config has not yet been
* loaded then this method will return null.
*
* @param desc Config description
* @return FileConfiguration or null if not yet loaded
*/
public static FileConfiguration getConfig(ConfigDescription desc) {
return desc.name.equals(DEFAULT_NAME) ? desc.plugin.getConfig() : configs.get(desc);
}
public static final class ConfigDescription {
private final Plugin plugin;
private final String name;
public ConfigDescription(Plugin plugin, String name) {
this.plugin = plugin;
this.name = name.toLowerCase().replaceAll(".yml", "");
}
public FileConfiguration get() {
return Configs.getConfig(this);
}
public void load() throws IOException {
loadConfig(this);
}
@Override
public boolean equals(Object o) {
if (this == o) return true;
if (o == null || getClass() != o.getClass()) return false;
ConfigDescription that = (ConfigDescription) o;
return plugin.equals(that.plugin) && name.equals(that.name);
}
@Override
public int hashCode() {
int result = plugin.hashCode();
result = 31 * result + name.hashCode();
return result;
}
public void save() throws IOException {
saveConfig(this);
}
@Override
public String toString() {
return "Plugin: " + plugin + "; Config name: " + name + ".yml";
}
}
}