Created
July 24, 2013 05:40
-
-
Save riking/6068289 to your computer and use it in GitHub Desktop.
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
package com.gmail.nossr50.config; | |
import java.io.BufferedReader; | |
import java.io.BufferedWriter; | |
import java.io.File; | |
import java.io.FileWriter; | |
import java.io.InputStreamReader; | |
import java.util.HashMap; | |
import java.util.HashSet; | |
import java.util.Set; | |
import org.bukkit.configuration.file.FileConfiguration; | |
import org.bukkit.configuration.file.YamlConfiguration; | |
import com.gmail.nossr50.metrics.MetricsManager; | |
public abstract class AutoUpdateConfigLoader extends ConfigLoader { | |
public AutoUpdateConfigLoader(String relativePath, String fileName) { | |
super(relativePath, fileName); | |
} | |
public AutoUpdateConfigLoader(String fileName) { | |
super(fileName); | |
} | |
@Override | |
protected void loadFile() { | |
super.loadFile(); | |
FileConfiguration internalConfig = YamlConfiguration.loadConfiguration(plugin.getResource(fileName)); | |
Set<String> configKeys = config.getKeys(true); | |
Set<String> internalConfigKeys = internalConfig.getKeys(true); | |
boolean needSave = false; | |
Set<String> oldKeys = new HashSet<String>(configKeys); | |
oldKeys.removeAll(internalConfigKeys); | |
Set<String> newKeys = new HashSet<String>(internalConfigKeys); | |
newKeys.removeAll(configKeys); | |
// Don't need a re-save if we have old keys sticking around? | |
// Would be less saving, but less... correct? | |
if (!newKeys.isEmpty() || !oldKeys.isEmpty()) { | |
needSave = true; | |
} | |
for (String key : oldKeys) { | |
plugin.debug("Removing unused key: " + key); | |
config.set(key, null); | |
} | |
for (String key : newKeys) { | |
plugin.debug("Adding new key: " + key + " = " + internalConfig.get(key)); | |
config.set(key, internalConfig.get(key)); | |
} | |
if (needSave) { | |
// Get Bukkit's version of an acceptable config with new keys, and no old keys | |
String output = config.saveToString(); | |
// Convert to the superior 4 space indentation | |
output = output.replace(" ", " "); | |
// Rip out Bukkit's attempt to save comments at the top of the file | |
while (output.indexOf('#') != -1) { | |
output = output.substring(output.indexOf('\n', output.indexOf('#')) + 1); | |
} | |
// Read the internal config to get comments, then put them in the new one | |
try { | |
// Read internal | |
BufferedReader reader = new BufferedReader(new InputStreamReader(plugin.getResource(fileName))); | |
HashMap<String, String> comments = new HashMap<String, String>(); | |
String temp = ""; | |
String line; | |
while ((line = reader.readLine()) != null) { | |
if (line.contains("#")) { | |
temp += line + "\n"; | |
} | |
else if (line.contains(":")) { | |
line = line.substring(0, line.indexOf(":") + 1); | |
if (!temp.isEmpty()) { | |
comments.put(line, temp); | |
temp = ""; | |
} | |
} | |
} | |
// Dump to the new one | |
for (String key : comments.keySet()) { | |
if (output.indexOf(key) != -1) { | |
output = output.substring(0, output.indexOf(key)) + comments.get(key) + output.substring(output.indexOf(key)); | |
} | |
} | |
} | |
catch (Exception e) { | |
e.printStackTrace(); | |
} | |
// Save it | |
try { | |
String saveName = fileName; | |
// At this stage we cannot guarantee that Config has been loaded, so we do the check directly here | |
if (!plugin.getConfig().getBoolean("General.Config_Update_Overwrite", true)) { | |
saveName += ".new"; | |
} | |
BufferedWriter writer = new BufferedWriter(new FileWriter(new File(plugin.getDataFolder(), saveName))); | |
writer.write(output); | |
writer.flush(); | |
writer.close(); | |
} | |
catch (Exception e) { | |
e.printStackTrace(); | |
} | |
} | |
else { | |
for (String key : configKeys) { | |
if (!config.isConfigurationSection(key) && !config.get(key).equals(internalConfig.get(key))) { | |
MetricsManager.customConfig(); | |
break; | |
} | |
} | |
} | |
} | |
} |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
package com.gmail.nossr50.config; | |
import java.io.File; | |
import java.io.FileNotFoundException; | |
import java.io.FileOutputStream; | |
import java.io.IOException; | |
import java.io.InputStream; | |
import java.io.OutputStream; | |
import org.bukkit.configuration.file.FileConfiguration; | |
import org.bukkit.configuration.file.YamlConfiguration; | |
import com.gmail.nossr50.mcMMO; | |
public abstract class ConfigLoader { | |
protected static final mcMMO plugin = mcMMO.p; | |
protected String fileName; | |
protected File configFile; | |
protected FileConfiguration config; | |
public ConfigLoader(String relativePath, String fileName) { | |
this.fileName = fileName; | |
configFile = new File(plugin.getDataFolder(), relativePath + File.separator + fileName); | |
loadFile(); | |
} | |
public ConfigLoader(String fileName) { | |
this.fileName = fileName; | |
configFile = new File(plugin.getDataFolder(), fileName); | |
loadFile(); | |
} | |
protected void loadFile() { | |
if (!configFile.exists()) { | |
plugin.debug("Creating mcMMO " + fileName + " File..."); | |
createFile(); | |
} | |
else { | |
plugin.debug("Loading mcMMO " + fileName + " File..."); | |
} | |
config = YamlConfiguration.loadConfiguration(configFile); | |
} | |
protected abstract void loadKeys(); | |
protected void createFile() { | |
configFile.getParentFile().mkdirs(); | |
InputStream inputStream = plugin.getResource(fileName); | |
if (inputStream == null) { | |
plugin.getLogger().severe("Missing resource file: '" + fileName + "' please notify the plugin authors"); | |
return; | |
} | |
OutputStream outputStream = null; | |
try { | |
outputStream = new FileOutputStream(configFile); | |
int read; | |
byte[] bytes = new byte[1024]; | |
while ((read = inputStream.read(bytes)) != -1) { | |
outputStream.write(bytes, 0, read); | |
} | |
} | |
catch (FileNotFoundException e) { | |
e.printStackTrace(); | |
} | |
catch (IOException e) { | |
e.printStackTrace(); | |
} | |
finally { | |
if (outputStream != null) { | |
try { | |
outputStream.close(); | |
} | |
catch (IOException e) { | |
e.printStackTrace(); | |
} | |
} | |
try { | |
inputStream.close(); | |
} | |
catch (IOException e) { | |
e.printStackTrace(); | |
} | |
} | |
} | |
} |
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment