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 @SuppressWarnings("PMD.ExcessivePublicCount")
023 public 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 }