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
022@SuppressWarnings("PMD.ExcessivePublicCount")
023public class Config implements Cloneable, Serializable
024{
025    public static final String KEY_PREFIX = "org.ini4j.config.";
026    public static final String PROP_EMPTY_OPTION = "emptyOption";
027    public static final String PROP_EMPTY_SECTION = "emptySection";
028    public static final String PROP_GLOBAL_SECTION = "globalSection";
029    public static final String PROP_GLOBAL_SECTION_NAME = "globalSectionName";
030    public static final String PROP_INCLUDE = "include";
031    public static final String PROP_LOWER_CASE_OPTION = "lowerCaseOption";
032    public static final String PROP_LOWER_CASE_SECTION = "lowerCaseSection";
033    public static final String PROP_MULTI_OPTION = "multiOption";
034    public static final String PROP_MULTI_SECTION = "multiSection";
035    public static final String PROP_STRICT_OPERATOR = "strictOperator";
036    public static final String PROP_UNNAMED_SECTION = "unnamedSection";
037    public static final String PROP_ESCAPE = "escape";
038    public static final String PROP_PATH_SEPARATOR = "pathSeparator";
039    public static final String PROP_TREE = "tree";
040    public static final String PROP_PROPERTY_FIRST_UPPER = "propertyFirstUpper";
041    public static final String PROP_FILE_ENCODING = "fileEncoding";
042    public static final String PROP_LINE_SEPARATOR = "lineSeparator";
043    public static final String PROP_COMMENT = "comment";
044    public static final String PROP_HEADER_COMMENT = "headerComment";
045    public static final boolean DEFAULT_EMPTY_OPTION = false;
046    public static final boolean DEFAULT_EMPTY_SECTION = false;
047    public static final boolean DEFAULT_GLOBAL_SECTION = false;
048    public static final String DEFAULT_GLOBAL_SECTION_NAME = "?";
049    public static final boolean DEFAULT_INCLUDE = false;
050    public static final boolean DEFAULT_LOWER_CASE_OPTION = false;
051    public static final boolean DEFAULT_LOWER_CASE_SECTION = false;
052    public static final boolean DEFAULT_MULTI_OPTION = true;
053    public static final boolean DEFAULT_MULTI_SECTION = false;
054    public static final boolean DEFAULT_STRICT_OPERATOR = false;
055    public static final boolean DEFAULT_UNNAMED_SECTION = false;
056    public static final boolean DEFAULT_ESCAPE = true;
057    public static final boolean DEFAULT_TREE = true;
058    public static final boolean DEFAULT_PROPERTY_FIRST_UPPER = false;
059    public static final boolean DEFAULT_COMMENT = true;
060    public static final boolean DEFAULT_HEADER_COMMENT = true;
061    public static final char DEFAULT_PATH_SEPARATOR = '/';
062    public static final String DEFAULT_LINE_SEPARATOR = getSystemProperty("line.separator", "\n");
063    public static final Charset DEFAULT_FILE_ENCODING = Charset.forName("UTF-8");
064    private static final Config GLOBAL = new Config();
065    private static final long serialVersionUID = 2865793267410367814L;
066    private boolean _comment;
067    private boolean _emptyOption;
068    private boolean _emptySection;
069    private boolean _escape;
070    private Charset _fileEncoding;
071    private boolean _globalSection;
072    private String _globalSectionName;
073    private boolean _headerComment;
074    private boolean _include;
075    private String _lineSeparator;
076    private boolean _lowerCaseOption;
077    private boolean _lowerCaseSection;
078    private boolean _multiOption;
079    private boolean _multiSection;
080    private char _pathSeparator;
081    private boolean _propertyFirstUpper;
082    private boolean _strictOperator;
083    private boolean _tree;
084    private boolean _unnamedSection;
085
086    public Config()
087    {
088        reset();
089    }
090
091    public static String getEnvironment(String name)
092    {
093        return getEnvironment(name, null);
094    }
095
096    public static String getEnvironment(String name, String defaultValue)
097    {
098        String value;
099
100        try
101        {
102            value = System.getenv(name);
103        }
104        catch (SecurityException x)
105        {
106            value = null;
107        }
108
109        return (value == null) ? defaultValue : value;
110    }
111
112    public static Config getGlobal()
113    {
114        return GLOBAL;
115    }
116
117    public static String getSystemProperty(String name)
118    {
119        return getSystemProperty(name, null);
120    }
121
122    public static String getSystemProperty(String name, String defaultValue)
123    {
124        String value;
125
126        try
127        {
128            value = System.getProperty(name);
129        }
130        catch (SecurityException x)
131        {
132            value = null;
133        }
134
135        return (value == null) ? defaultValue : value;
136    }
137
138    public void setComment(boolean value)
139    {
140        _comment = value;
141    }
142
143    public boolean isEscape()
144    {
145        return _escape;
146    }
147
148    public boolean isInclude()
149    {
150        return _include;
151    }
152
153    public boolean isTree()
154    {
155        return _tree;
156    }
157
158    public void setEmptyOption(boolean value)
159    {
160        _emptyOption = value;
161    }
162
163    public void setEmptySection(boolean value)
164    {
165        _emptySection = value;
166    }
167
168    public void setEscape(boolean value)
169    {
170        _escape = value;
171    }
172
173    public Charset getFileEncoding()
174    {
175        return _fileEncoding;
176    }
177
178    public void setFileEncoding(Charset value)
179    {
180        _fileEncoding = value;
181    }
182
183    public void setGlobalSection(boolean value)
184    {
185        _globalSection = value;
186    }
187
188    public String getGlobalSectionName()
189    {
190        return _globalSectionName;
191    }
192
193    public void setGlobalSectionName(String value)
194    {
195        _globalSectionName = value;
196    }
197
198    public void setHeaderComment(boolean value)
199    {
200        _headerComment = value;
201    }
202
203    public void setInclude(boolean value)
204    {
205        _include = value;
206    }
207
208    public String getLineSeparator()
209    {
210        return _lineSeparator;
211    }
212
213    public void setLineSeparator(String value)
214    {
215        _lineSeparator = value;
216    }
217
218    public void setLowerCaseOption(boolean value)
219    {
220        _lowerCaseOption = value;
221    }
222
223    public void setLowerCaseSection(boolean value)
224    {
225        _lowerCaseSection = value;
226    }
227
228    public void setMultiOption(boolean value)
229    {
230        _multiOption = value;
231    }
232
233    public void setMultiSection(boolean value)
234    {
235        _multiSection = value;
236    }
237
238    public boolean isEmptyOption()
239    {
240        return _emptyOption;
241    }
242
243    public boolean isEmptySection()
244    {
245        return _emptySection;
246    }
247
248    public boolean isGlobalSection()
249    {
250        return _globalSection;
251    }
252
253    public boolean isLowerCaseOption()
254    {
255        return _lowerCaseOption;
256    }
257
258    public boolean isLowerCaseSection()
259    {
260        return _lowerCaseSection;
261    }
262
263    public boolean isMultiOption()
264    {
265        return _multiOption;
266    }
267
268    public boolean isMultiSection()
269    {
270        return _multiSection;
271    }
272
273    public boolean isUnnamedSection()
274    {
275        return _unnamedSection;
276    }
277
278    public char getPathSeparator()
279    {
280        return _pathSeparator;
281    }
282
283    public void setPathSeparator(char value)
284    {
285        _pathSeparator = value;
286    }
287
288    public void setPropertyFirstUpper(boolean value)
289    {
290        _propertyFirstUpper = value;
291    }
292
293    public boolean isPropertyFirstUpper()
294    {
295        return _propertyFirstUpper;
296    }
297
298    public boolean isStrictOperator()
299    {
300        return _strictOperator;
301    }
302
303    public void setStrictOperator(boolean value)
304    {
305        _strictOperator = value;
306    }
307
308    public boolean isComment()
309    {
310        return _comment;
311    }
312
313    public boolean isHeaderComment()
314    {
315        return _headerComment;
316    }
317
318    public void setTree(boolean value)
319    {
320        _tree = value;
321    }
322
323    public void setUnnamedSection(boolean value)
324    {
325        _unnamedSection = value;
326    }
327
328    @Override public Config clone()
329    {
330        try
331        {
332            return (Config) super.clone();
333        }
334        catch (CloneNotSupportedException x)
335        {
336            throw new AssertionError(x);
337        }
338    }
339
340    public final void reset()
341    {
342        _emptyOption = getBoolean(PROP_EMPTY_OPTION, DEFAULT_EMPTY_OPTION);
343        _emptySection = getBoolean(PROP_EMPTY_SECTION, DEFAULT_EMPTY_SECTION);
344        _globalSection = getBoolean(PROP_GLOBAL_SECTION, DEFAULT_GLOBAL_SECTION);
345        _globalSectionName = getString(PROP_GLOBAL_SECTION_NAME, DEFAULT_GLOBAL_SECTION_NAME);
346        _include = getBoolean(PROP_INCLUDE, DEFAULT_INCLUDE);
347        _lowerCaseOption = getBoolean(PROP_LOWER_CASE_OPTION, DEFAULT_LOWER_CASE_OPTION);
348        _lowerCaseSection = getBoolean(PROP_LOWER_CASE_SECTION, DEFAULT_LOWER_CASE_SECTION);
349        _multiOption = getBoolean(PROP_MULTI_OPTION, DEFAULT_MULTI_OPTION);
350        _multiSection = getBoolean(PROP_MULTI_SECTION, DEFAULT_MULTI_SECTION);
351        _strictOperator = getBoolean(PROP_STRICT_OPERATOR, DEFAULT_STRICT_OPERATOR);
352        _unnamedSection = getBoolean(PROP_UNNAMED_SECTION, DEFAULT_UNNAMED_SECTION);
353        _escape = getBoolean(PROP_ESCAPE, DEFAULT_ESCAPE);
354        _pathSeparator = getChar(PROP_PATH_SEPARATOR, DEFAULT_PATH_SEPARATOR);
355        _tree = getBoolean(PROP_TREE, DEFAULT_TREE);
356        _propertyFirstUpper = getBoolean(PROP_PROPERTY_FIRST_UPPER, DEFAULT_PROPERTY_FIRST_UPPER);
357        _lineSeparator = getString(PROP_LINE_SEPARATOR, DEFAULT_LINE_SEPARATOR);
358        _fileEncoding = getCharset(PROP_FILE_ENCODING, DEFAULT_FILE_ENCODING);
359        _comment = getBoolean(PROP_COMMENT, DEFAULT_COMMENT);
360        _headerComment = getBoolean(PROP_HEADER_COMMENT, DEFAULT_HEADER_COMMENT);
361    }
362
363    private boolean getBoolean(String name, boolean defaultValue)
364    {
365        String value = getSystemProperty(KEY_PREFIX + name);
366
367        return (value == null) ? defaultValue : Boolean.parseBoolean(value);
368    }
369
370    private char getChar(String name, char defaultValue)
371    {
372        String value = getSystemProperty(KEY_PREFIX + name);
373
374        return (value == null) ? defaultValue : value.charAt(0);
375    }
376
377    private Charset getCharset(String name, Charset defaultValue)
378    {
379        String value = getSystemProperty(KEY_PREFIX + name);
380
381        return (value == null) ? defaultValue : Charset.forName(value);
382    }
383
384    private String getString(String name, String defaultValue)
385    {
386        return getSystemProperty(KEY_PREFIX + name, defaultValue);
387    }
388}