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 */
016package org.ini4j;
017
018import java.io.Serializable;
019
020import java.nio.charset.Charset;
021
022public 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}