001    package net.minecraft.server.dedicated;
002    
003    import java.io.File;
004    import java.io.FileInputStream;
005    import java.io.FileOutputStream;
006    import java.io.IOException;
007    import java.util.Properties;
008    import java.util.logging.Level;
009    import java.util.logging.Logger;
010    
011    public class PropertyManager
012    {
013        /** Reference to the logger. */
014        public static Logger logger = Logger.getLogger("Minecraft");
015        private Properties properties = new Properties();
016        private File associatedFile;
017    
018        public PropertyManager(File par1File)
019        {
020            this.associatedFile = par1File;
021    
022            if (par1File.exists())
023            {
024                FileInputStream var2 = null;
025    
026                try
027                {
028                    var2 = new FileInputStream(par1File);
029                    this.properties.load(var2);
030                }
031                catch (Exception var12)
032                {
033                    logger.log(Level.WARNING, "Failed to load " + par1File, var12);
034                    this.logMessageAndSave();
035                }
036                finally
037                {
038                    if (var2 != null)
039                    {
040                        try
041                        {
042                            var2.close();
043                        }
044                        catch (IOException var11)
045                        {
046                            ;
047                        }
048                    }
049                }
050            }
051            else
052            {
053                logger.log(Level.WARNING, par1File + " does not exist");
054                this.logMessageAndSave();
055            }
056        }
057    
058        /**
059         * logs an info message then calls saveSettingsToFile Yes this appears to be a potential stack overflow - these 2
060         * functions call each other repeatdly if an exception occurs.
061         */
062        public void logMessageAndSave()
063        {
064            logger.log(Level.INFO, "Generating new properties file");
065            this.saveProperties();
066        }
067    
068        /**
069         * Writes the properties to the properties file.
070         */
071        public void saveProperties()
072        {
073            FileOutputStream var1 = null;
074    
075            try
076            {
077                var1 = new FileOutputStream(this.associatedFile);
078                this.properties.store(var1, "Minecraft server properties");
079            }
080            catch (Exception var11)
081            {
082                logger.log(Level.WARNING, "Failed to save " + this.associatedFile, var11);
083                this.logMessageAndSave();
084            }
085            finally
086            {
087                if (var1 != null)
088                {
089                    try
090                    {
091                        var1.close();
092                    }
093                    catch (IOException var10)
094                    {
095                        ;
096                    }
097                }
098            }
099        }
100    
101        /**
102         * Returns this PropertyManager's file object used for property saving.
103         */
104        public File getPropertiesFile()
105        {
106            return this.associatedFile;
107        }
108    
109        /**
110         * Gets a property. If it does not exist, set it to the specified value.
111         */
112        public String getProperty(String par1Str, String par2Str)
113        {
114            if (!this.properties.containsKey(par1Str))
115            {
116                this.properties.setProperty(par1Str, par2Str);
117                this.saveProperties();
118            }
119    
120            return this.properties.getProperty(par1Str, par2Str);
121        }
122    
123        /**
124         * Gets an integer property. If it does not exist, set it to the specified value.
125         */
126        public int getIntProperty(String par1Str, int par2)
127        {
128            try
129            {
130                return Integer.parseInt(this.getProperty(par1Str, "" + par2));
131            }
132            catch (Exception var4)
133            {
134                this.properties.setProperty(par1Str, "" + par2);
135                return par2;
136            }
137        }
138    
139        /**
140         * Gets a boolean property. If it does not exist, set it to the specified value.
141         */
142        public boolean getBooleanProperty(String par1Str, boolean par2)
143        {
144            try
145            {
146                return Boolean.parseBoolean(this.getProperty(par1Str, "" + par2));
147            }
148            catch (Exception var4)
149            {
150                this.properties.setProperty(par1Str, "" + par2);
151                return par2;
152            }
153        }
154    
155        /**
156         * Saves an Object with the given property name.
157         */
158        public void setProperty(String par1Str, Object par2Obj)
159        {
160            this.properties.setProperty(par1Str, "" + par2Obj);
161        }
162    }