001    /*
002     * Copyright 2005,2009 Ivan SZKIBA
003     *
004     * Licensed under the Apache License, Version 2.0 (the "License");
005     * you may not use this file except in compliance with the License.
006     * You may obtain a copy of the License at
007     *
008     *      http://www.apache.org/licenses/LICENSE-2.0
009     *
010     * Unless required by applicable law or agreed to in writing, software
011     * distributed under the License is distributed on an "AS IS" BASIS,
012     * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
013     * See the License for the specific language governing permissions and
014     * limitations under the License.
015     */
016    package org.ini4j;
017    
018    import java.io.Serializable;
019    
020    import java.nio.charset.Charset;
021    
022    public class Config implements Cloneable, Serializable
023    {
024        public static final String KEY_PREFIX = "org.ini4j.config.";
025        public static final String PROP_EMPTY_OPTION = "emptyOption";
026        public static final String PROP_EMPTY_SECTION = "emptySection";
027        public static final String PROP_GLOBAL_SECTION = "globalSection";
028        public static final String PROP_GLOBAL_SECTION_NAME = "globalSectionName";
029        public static final String PROP_INCLUDE = "include";
030        public static final String PROP_LOWER_CASE_OPTION = "lowerCaseOption";
031        public static final String PROP_LOWER_CASE_SECTION = "lowerCaseSection";
032        public static final String PROP_MULTI_OPTION = "multiOption";
033        public static final String PROP_MULTI_SECTION = "multiSection";
034        public static final String PROP_STRICT_OPERATOR = "strictOperator";
035        public static final String PROP_UNNAMED_SECTION = "unnamedSection";
036        public static final String PROP_ESCAPE = "escape";
037        public static final String PROP_PATH_SEPARATOR = "pathSeparator";
038        public static final String PROP_TREE = "tree";
039        public static final String PROP_PROPERTY_FIRST_UPPER = "propertyFirstUpper";
040        public static final String PROP_FILE_ENCODING = "fileEncoding";
041        public static final String PROP_LINE_SEPARATOR = "lineSeparator";
042        public static final boolean DEFAULT_EMPTY_OPTION = false;
043        public static final boolean DEFAULT_EMPTY_SECTION = false;
044        public static final boolean DEFAULT_GLOBAL_SECTION = false;
045        public static final String DEFAULT_GLOBAL_SECTION_NAME = "?";
046        public static final boolean DEFAULT_INCLUDE = false;
047        public static final boolean DEFAULT_LOWER_CASE_OPTION = false;
048        public static final boolean DEFAULT_LOWER_CASE_SECTION = false;
049        public static final boolean DEFAULT_MULTI_OPTION = true;
050        public static final boolean DEFAULT_MULTI_SECTION = false;
051        public static final boolean DEFAULT_STRICT_OPERATOR = false;
052        public static final boolean DEFAULT_UNNAMED_SECTION = false;
053        public static final boolean DEFAULT_ESCAPE = true;
054        public static final boolean DEFAULT_TREE = true;
055        public static final boolean DEFAULT_PROPERTY_FIRST_UPPER = false;
056        public static final char DEFAULT_PATH_SEPARATOR = '/';
057        public static final String DEFAULT_LINE_SEPARATOR = getSystemProperty("line.separator", "\n");
058        public static final Charset DEFAULT_FILE_ENCODING = Charset.forName("UTF-8");
059        private static final Config GLOBAL = new Config();
060        private static final long serialVersionUID = 2865793267410367814L;
061        private boolean _emptyOption;
062        private boolean _emptySection;
063        private boolean _escape;
064        private Charset _fileEncoding;
065        private boolean _globalSection;
066        private String _globalSectionName;
067        private boolean _include;
068        private String _lineSeparator;
069        private boolean _lowerCaseOption;
070        private boolean _lowerCaseSection;
071        private boolean _multiOption;
072        private boolean _multiSection;
073        private char _pathSeparator;
074        private boolean _propertyFirstUpper;
075        private boolean _strictOperator;
076        private boolean _tree;
077        private boolean _unnamedSection;
078    
079        public Config()
080        {
081            reset();
082        }
083    
084        public static String getEnvironment(String name)
085        {
086            return getEnvironment(name, null);
087        }
088    
089        public static String getEnvironment(String name, String defaultValue)
090        {
091            String value;
092    
093            try
094            {
095                value = System.getenv(name);
096            }
097            catch (SecurityException x)
098            {
099                value = null;
100            }
101    
102            return (value == null) ? defaultValue : value;
103        }
104    
105        public static Config getGlobal()
106        {
107            return GLOBAL;
108        }
109    
110        public static String getSystemProperty(String name)
111        {
112            return getSystemProperty(name, null);
113        }
114    
115        public static String getSystemProperty(String name, String defaultValue)
116        {
117            String value;
118    
119            try
120            {
121                value = System.getProperty(name);
122            }
123            catch (SecurityException x)
124            {
125                value = null;
126            }
127    
128            return (value == null) ? defaultValue : value;
129        }
130    
131        public boolean isEscape()
132        {
133            return _escape;
134        }
135    
136        public boolean isInclude()
137        {
138            return _include;
139        }
140    
141        public boolean isTree()
142        {
143            return _tree;
144        }
145    
146        public void setEmptyOption(boolean value)
147        {
148            _emptyOption = value;
149        }
150    
151        public void setEmptySection(boolean value)
152        {
153            _emptySection = value;
154        }
155    
156        public void setEscape(boolean value)
157        {
158            _escape = value;
159        }
160    
161        public Charset getFileEncoding()
162        {
163            return _fileEncoding;
164        }
165    
166        public void setFileEncoding(Charset value)
167        {
168            _fileEncoding = value;
169        }
170    
171        public void setGlobalSection(boolean value)
172        {
173            _globalSection = value;
174        }
175    
176        public String getGlobalSectionName()
177        {
178            return _globalSectionName;
179        }
180    
181        public void setGlobalSectionName(String value)
182        {
183            _globalSectionName = value;
184        }
185    
186        public void setInclude(boolean value)
187        {
188            _include = value;
189        }
190    
191        public String getLineSeparator()
192        {
193            return _lineSeparator;
194        }
195    
196        public void setLineSeparator(String value)
197        {
198            _lineSeparator = value;
199        }
200    
201        public void setLowerCaseOption(boolean value)
202        {
203            _lowerCaseOption = value;
204        }
205    
206        public void setLowerCaseSection(boolean value)
207        {
208            _lowerCaseSection = value;
209        }
210    
211        public void setMultiOption(boolean value)
212        {
213            _multiOption = value;
214        }
215    
216        public void setMultiSection(boolean value)
217        {
218            _multiSection = value;
219        }
220    
221        public boolean isEmptyOption()
222        {
223            return _emptyOption;
224        }
225    
226        public boolean isEmptySection()
227        {
228            return _emptySection;
229        }
230    
231        public boolean isGlobalSection()
232        {
233            return _globalSection;
234        }
235    
236        public boolean isLowerCaseOption()
237        {
238            return _lowerCaseOption;
239        }
240    
241        public boolean isLowerCaseSection()
242        {
243            return _lowerCaseSection;
244        }
245    
246        public boolean isMultiOption()
247        {
248            return _multiOption;
249        }
250    
251        public boolean isMultiSection()
252        {
253            return _multiSection;
254        }
255    
256        public boolean isUnnamedSection()
257        {
258            return _unnamedSection;
259        }
260    
261        public char getPathSeparator()
262        {
263            return _pathSeparator;
264        }
265    
266        public void setPathSeparator(char value)
267        {
268            _pathSeparator = value;
269        }
270    
271        public void setPropertyFirstUpper(boolean value)
272        {
273            _propertyFirstUpper = value;
274        }
275    
276        public boolean isPropertyFirstUpper()
277        {
278            return _propertyFirstUpper;
279        }
280    
281        public boolean isStrictOperator()
282        {
283            return _strictOperator;
284        }
285    
286        public void setStrictOperator(boolean value)
287        {
288            _strictOperator = value;
289        }
290    
291        public void setTree(boolean value)
292        {
293            _tree = value;
294        }
295    
296        public void setUnnamedSection(boolean value)
297        {
298            _unnamedSection = value;
299        }
300    
301        @Override public Config clone()
302        {
303            try
304            {
305                return (Config) super.clone();
306            }
307            catch (CloneNotSupportedException x)
308            {
309                throw new AssertionError(x);
310            }
311        }
312    
313        public final void reset()
314        {
315            _emptyOption = getBoolean(PROP_EMPTY_OPTION, DEFAULT_EMPTY_OPTION);
316            _emptySection = getBoolean(PROP_EMPTY_SECTION, DEFAULT_EMPTY_SECTION);
317            _globalSection = getBoolean(PROP_GLOBAL_SECTION, DEFAULT_GLOBAL_SECTION);
318            _globalSectionName = getString(PROP_GLOBAL_SECTION_NAME, DEFAULT_GLOBAL_SECTION_NAME);
319            _include = getBoolean(PROP_INCLUDE, DEFAULT_INCLUDE);
320            _lowerCaseOption = getBoolean(PROP_LOWER_CASE_OPTION, DEFAULT_LOWER_CASE_OPTION);
321            _lowerCaseSection = getBoolean(PROP_LOWER_CASE_SECTION, DEFAULT_LOWER_CASE_SECTION);
322            _multiOption = getBoolean(PROP_MULTI_OPTION, DEFAULT_MULTI_OPTION);
323            _multiSection = getBoolean(PROP_MULTI_SECTION, DEFAULT_MULTI_SECTION);
324            _strictOperator = getBoolean(PROP_STRICT_OPERATOR, DEFAULT_STRICT_OPERATOR);
325            _unnamedSection = getBoolean(PROP_UNNAMED_SECTION, DEFAULT_UNNAMED_SECTION);
326            _escape = getBoolean(PROP_ESCAPE, DEFAULT_ESCAPE);
327            _pathSeparator = getChar(PROP_PATH_SEPARATOR, DEFAULT_PATH_SEPARATOR);
328            _tree = getBoolean(PROP_TREE, DEFAULT_TREE);
329            _propertyFirstUpper = getBoolean(PROP_PROPERTY_FIRST_UPPER, DEFAULT_PROPERTY_FIRST_UPPER);
330            _lineSeparator = getString(PROP_LINE_SEPARATOR, DEFAULT_LINE_SEPARATOR);
331            _fileEncoding = getCharset(PROP_FILE_ENCODING, DEFAULT_FILE_ENCODING);
332        }
333    
334        private boolean getBoolean(String name, boolean defaultValue)
335        {
336            String value = getSystemProperty(KEY_PREFIX + name);
337    
338            return (value == null) ? defaultValue : Boolean.parseBoolean(value);
339        }
340    
341        private char getChar(String name, char defaultValue)
342        {
343            String value = getSystemProperty(KEY_PREFIX + name);
344    
345            return (value == null) ? defaultValue : value.charAt(0);
346        }
347    
348        private Charset getCharset(String name, Charset defaultValue)
349        {
350            String value = getSystemProperty(KEY_PREFIX + name);
351    
352            return (value == null) ? defaultValue : Charset.forName(value);
353        }
354    
355        private String getString(String name, String defaultValue)
356        {
357            return getSystemProperty(KEY_PREFIX + name, defaultValue);
358        }
359    }