package net.minecraft.server.dedicated; import java.io.File; import java.io.FileInputStream; import java.io.FileOutputStream; import java.io.IOException; import java.util.Properties; import net.minecraft.logging.ILogAgent; public class PropertyManager { private final Properties properties = new Properties(); /** Reference to the logger. */ private final ILogAgent logger; private final File associatedFile; public PropertyManager(File par1File, ILogAgent par2ILogAgent) { this.associatedFile = par1File; this.logger = par2ILogAgent; if (par1File.exists()) { FileInputStream fileinputstream = null; try { fileinputstream = new FileInputStream(par1File); this.properties.load(fileinputstream); } catch (Exception exception) { par2ILogAgent.logWarningException("Failed to load " + par1File, exception); this.logMessageAndSave(); } finally { if (fileinputstream != null) { try { fileinputstream.close(); } catch (IOException ioexception) { ; } } } } else { par2ILogAgent.logWarning(par1File + " does not exist"); this.logMessageAndSave(); } } /** * logs an info message then calls saveSettingsToFile Yes this appears to be a potential stack overflow - these 2 * functions call each other repeatdly if an exception occurs. */ public void logMessageAndSave() { this.logger.logInfo("Generating new properties file"); this.saveProperties(); } /** * Writes the properties to the properties file. */ public void saveProperties() { FileOutputStream fileoutputstream = null; try { fileoutputstream = new FileOutputStream(this.associatedFile); this.properties.store(fileoutputstream, "Minecraft server properties"); } catch (Exception exception) { this.logger.logWarningException("Failed to save " + this.associatedFile, exception); this.logMessageAndSave(); } finally { if (fileoutputstream != null) { try { fileoutputstream.close(); } catch (IOException ioexception) { ; } } } } /** * Returns this PropertyManager's file object used for property saving. */ public File getPropertiesFile() { return this.associatedFile; } /** * Gets a property. If it does not exist, set it to the specified value. */ public String getProperty(String par1Str, String par2Str) { if (!this.properties.containsKey(par1Str)) { this.properties.setProperty(par1Str, par2Str); this.saveProperties(); } return this.properties.getProperty(par1Str, par2Str); } /** * Gets an integer property. If it does not exist, set it to the specified value. */ public int getIntProperty(String par1Str, int par2) { try { return Integer.parseInt(this.getProperty(par1Str, "" + par2)); } catch (Exception exception) { this.properties.setProperty(par1Str, "" + par2); return par2; } } /** * Gets a boolean property. If it does not exist, set it to the specified value. */ public boolean getBooleanProperty(String par1Str, boolean par2) { try { return Boolean.parseBoolean(this.getProperty(par1Str, "" + par2)); } catch (Exception exception) { this.properties.setProperty(par1Str, "" + par2); return par2; } } /** * Saves an Object with the given property name. */ public void setProperty(String par1Str, Object par2Obj) { this.properties.setProperty(par1Str, "" + par2Obj); } }