001    /**
002     *   Licensed to the Apache Software Foundation (ASF) under one or more
003     *  contributor license agreements.  See the NOTICE file distributed with
004     *  this work for additional information regarding copyright ownership.
005     *  The ASF licenses this file to You under the Apache License, Version 2.0
006     *  (the "License"); you may not use this file except in compliance with
007     *  the License.  You may obtain a copy of the License at
008     *
009     *     http://www.apache.org/licenses/LICENSE-2.0
010     *
011     *  Unless required by applicable law or agreed to in writing, software
012     *  distributed under the License is distributed on an "AS IS" BASIS,
013     *  WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
014     *  See the License for the specific language governing permissions and
015     *  limitations under the License.
016     */
017    
018    package org.apache.geronimo.system.configuration.condition;
019    
020    //
021    // NOTE: Lifted from Jakarta commons-lang to avoid needing to pull in all of
022    //       commons-lang into the bootstrap classpath.
023    //
024    //       DO NOT MODIFY ANY CODE BELOW
025    //
026    
027    import java.io.File;
028    
029    /**
030     * <p>Helpers for <code>java.lang.System</code>.</p>
031     * 
032     * <p>If a system property cannot be read due to security restrictions, 
033     * the corresponding field in this class will be set to <code>null</code>
034     * and a message will be written to <code>System.err</code>.</p>
035     *
036     * @author Based on code from Avalon Excalibur
037     * @author Based on code from Lucene
038     * @author Stephen Colebourne
039     * @author <a href="mailto:sdowney@panix.com">Steve Downey</a>
040     * @author Gary Gregory
041     * @author Michael Becke
042     * @author Tetsuya Kaneuchi
043     * @author Rafal Krupinski
044     * @author Jason Gritman
045     * @since 1.0
046     * @version $Rev: 470597 $ $Date: 2006-11-02 19:30:55 -0400 (Thu, 02 Nov 2006) $
047     */
048    public class SystemUtils
049    {
050        /**
051         * The prefix String for all Windows OS.
052         */
053        private static final String OS_NAME_WINDOWS_PREFIX = "Windows";
054        
055        // System property constants
056        //-----------------------------------------------------------------------
057        // These MUST be declared first. Other constants depend on this.
058        
059        /**
060         * The System property key for the user home directory.
061         */
062        private static final String USER_HOME_KEY = "user.home";
063    
064        /**
065         * The System property key for the user directory.
066         */
067        private static final String USER_DIR_KEY = "user.dir";
068        
069        /**
070         * The System property key for the Java IO temporary directory.
071         */
072        private static final String JAVA_IO_TMPDIR_KEY = "java.io.tmpdir";
073        
074        /**
075         * The System property key for the Java home directory.
076         */
077        private static final String JAVA_HOME_KEY = "java.home";
078        
079        /**
080         * <p>The <code>awt.toolkit</code> System Property.</p>
081         * <p>Holds a class name, on Windows XP this is <code>sun.awt.windows.WToolkit</code>.</p>
082         * <p><b>On platforms without a GUI, this value is <code>null</code>.</b></p>
083         * 
084         * <p>Defaults to <code>null</code> if the runtime does not have
085         * security access to read this property or the property does not exist.</p>
086         * 
087         * <p>
088         * This value is initialized when the class is loaded. If {@link System#setProperty(String,String)}
089         * or {@link System#setProperties(java.util.Properties)} is called after this class is loaded, the value
090         * will be out of sync with that System property.
091         * </p>
092         * 
093         * @since 2.1
094         */
095        public static final String AWT_TOOLKIT = getSystemProperty("awt.toolkit");
096    
097        /**
098         * <p>The <code>file.encoding</code> System Property.</p>
099         * <p>File encoding, such as <code>Cp1252</code>.</p>
100         * 
101         * <p>Defaults to <code>null</code> if the runtime does not have
102         * security access to read this property or the property does not exist.</p>
103         * 
104         * <p>
105         * This value is initialized when the class is loaded. If {@link System#setProperty(String,String)}
106         * or {@link System#setProperties(java.util.Properties)} is called after this class is loaded, the value
107         * will be out of sync with that System property.
108         * </p>
109         * 
110         * @since 2.0
111         * @since Java 1.2
112         */
113        public static final String FILE_ENCODING = getSystemProperty("file.encoding");
114    
115        /**
116         * <p>The <code>file.separator</code> System Property.
117         * File separator (<code>&quot;/&quot;</code> on UNIX).</p>
118         *
119         * <p>Defaults to <code>null</code> if the runtime does not have
120         * security access to read this property or the property does not exist.</p>
121         * 
122         * <p>
123         * This value is initialized when the class is loaded. If {@link System#setProperty(String,String)}
124         * or {@link System#setProperties(java.util.Properties)} is called after this class is loaded, the value
125         * will be out of sync with that System property.
126         * </p>
127         * 
128         * @since Java 1.1
129         */
130        public static final String FILE_SEPARATOR = getSystemProperty("file.separator");
131    
132        /**
133         * <p>The <code>java.awt.fonts</code> System Property.</p>
134         *
135         * <p>Defaults to <code>null</code> if the runtime does not have
136         * security access to read this property or the property does not exist.</p>
137         * 
138         * <p>
139         * This value is initialized when the class is loaded. If {@link System#setProperty(String,String)}
140         * or {@link System#setProperties(java.util.Properties)} is called after this class is loaded, the value
141         * will be out of sync with that System property.
142         * </p>
143         * 
144         * @since 2.1
145         */
146        public static final String JAVA_AWT_FONTS = getSystemProperty("java.awt.fonts");
147    
148        /**
149         * <p>The <code>java.awt.graphicsenv</code> System Property.</p>
150         *
151         * <p>Defaults to <code>null</code> if the runtime does not have
152         * security access to read this property or the property does not exist.</p>
153         * 
154         * <p>
155         * This value is initialized when the class is loaded. If {@link System#setProperty(String,String)}
156         * or {@link System#setProperties(java.util.Properties)} is called after this class is loaded, the value
157         * will be out of sync with that System property.
158         * </p>
159         * 
160         * @since 2.1
161         */
162        public static final String JAVA_AWT_GRAPHICSENV = getSystemProperty("java.awt.graphicsenv");
163    
164        /**
165         * <p>
166         * The <code>java.awt.headless</code> System Property.
167         * The value of this property is the String <code>"true"</code> or <code>"false"</code>. 
168         * </p>
169         *
170         * <p>Defaults to <code>null</code> if the runtime does not have
171         * security access to read this property or the property does not exist.</p>
172         * 
173         * <p>
174         * This value is initialized when the class is loaded. If {@link System#setProperty(String,String)}
175         * or {@link System#setProperties(java.util.Properties)} is called after this class is loaded, the value
176         * will be out of sync with that System property.
177         * </p>
178         * 
179         * @see #isJavaAwtHeadless()
180         * @since 2.1
181         * @since Java 1.4
182         */
183        public static final String JAVA_AWT_HEADLESS = getSystemProperty("java.awt.headless");
184    
185        /**
186         * <p>The <code>java.awt.printerjob</code> System Property.</p>
187         *
188         * <p>Defaults to <code>null</code> if the runtime does not have
189         * security access to read this property or the property does not exist.</p>
190         * 
191         * <p>
192         * This value is initialized when the class is loaded. If {@link System#setProperty(String,String)}
193         * or {@link System#setProperties(java.util.Properties)} is called after this class is loaded, the value
194         * will be out of sync with that System property.
195         * </p>
196         * 
197         * @since 2.1
198         */
199        public static final String JAVA_AWT_PRINTERJOB = getSystemProperty("java.awt.printerjob");
200    
201        /**
202         * <p>The <code>java.class.path</code> System Property. Java class path.</p>
203         *
204         * <p>Defaults to <code>null</code> if the runtime does not have
205         * security access to read this property or the property does not exist.</p>
206         * 
207         * <p>
208         * This value is initialized when the class is loaded. If {@link System#setProperty(String,String)}
209         * or {@link System#setProperties(java.util.Properties)} is called after this class is loaded, the value
210         * will be out of sync with that System property.
211         * </p>
212         * 
213         * @since Java 1.1
214         */
215        public static final String JAVA_CLASS_PATH = getSystemProperty("java.class.path");
216    
217        /**
218         * <p>The <code>java.class.version</code> System Property.
219         * Java class format version number.</p>
220         *
221         * <p>Defaults to <code>null</code> if the runtime does not have
222         * security access to read this property or the property does not exist.</p>
223         * 
224         * <p>
225         * This value is initialized when the class is loaded. If {@link System#setProperty(String,String)}
226         * or {@link System#setProperties(java.util.Properties)} is called after this class is loaded, the value
227         * will be out of sync with that System property.
228         * </p>
229         * 
230         * @since Java 1.1
231         */
232        public static final String JAVA_CLASS_VERSION = getSystemProperty("java.class.version");
233    
234        /**
235         * <p>The <code>java.compiler</code> System Property. Name of JIT compiler to use.
236         * First in JDK version 1.2. Not used in Sun JDKs after 1.2.</p>
237         *
238         * <p>Defaults to <code>null</code> if the runtime does not have
239         * security access to read this property or the property does not exist.</p>
240         * 
241         * <p>
242         * This value is initialized when the class is loaded. If {@link System#setProperty(String,String)}
243         * or {@link System#setProperties(java.util.Properties)} is called after this class is loaded, the value
244         * will be out of sync with that System property.
245         * </p>
246         * 
247         * @since Java 1.2. Not used in Sun versions after 1.2.
248         */
249        public static final String JAVA_COMPILER = getSystemProperty("java.compiler");
250    
251        /**
252         * <p>The <code>java.endorsed.dirs</code> System Property. Path of endorsed directory
253         * or directories.</p>
254         *
255         * <p>Defaults to <code>null</code> if the runtime does not have
256         * security access to read this property or the property does not exist.</p>
257         * 
258         * <p>
259         * This value is initialized when the class is loaded. If {@link System#setProperty(String,String)}
260         * or {@link System#setProperties(java.util.Properties)} is called after this class is loaded, the value
261         * will be out of sync with that System property.
262         * </p>
263         * 
264         * @since Java 1.4
265         */
266        public static final String JAVA_ENDORSED_DIRS = getSystemProperty("java.endorsed.dirs");
267    
268        /**
269         * <p>The <code>java.ext.dirs</code> System Property. Path of extension directory
270         * or directories.</p>
271         *
272         * <p>Defaults to <code>null</code> if the runtime does not have
273         * security access to read this property or the property does not exist.</p>
274         * 
275         * <p>
276         * This value is initialized when the class is loaded. If {@link System#setProperty(String,String)}
277         * or {@link System#setProperties(java.util.Properties)} is called after this class is loaded, the value
278         * will be out of sync with that System property.
279         * </p>
280         * 
281         * @since Java 1.3
282         */
283        public static final String JAVA_EXT_DIRS = getSystemProperty("java.ext.dirs");
284    
285        /**
286         * <p>The <code>java.home</code> System Property. Java installation directory.</p>
287         *
288         * <p>Defaults to <code>null</code> if the runtime does not have
289         * security access to read this property or the property does not exist.</p>
290         * 
291         * <p>
292         * This value is initialized when the class is loaded. If {@link System#setProperty(String,String)}
293         * or {@link System#setProperties(java.util.Properties)} is called after this class is loaded, the value
294         * will be out of sync with that System property.
295         * </p>
296         * 
297         * @since Java 1.1
298         */
299        public static final String JAVA_HOME = getSystemProperty(JAVA_HOME_KEY);
300    
301        /**
302         * <p>The <code>java.io.tmpdir</code> System Property. Default temp file path.</p>
303         *
304         * <p>Defaults to <code>null</code> if the runtime does not have
305         * security access to read this property or the property does not exist.</p>
306         * 
307         * <p>
308         * This value is initialized when the class is loaded. If {@link System#setProperty(String,String)}
309         * or {@link System#setProperties(java.util.Properties)} is called after this class is loaded, the value
310         * will be out of sync with that System property.
311         * </p>
312         * 
313         * @since Java 1.2
314         */
315        public static final String JAVA_IO_TMPDIR = getSystemProperty(JAVA_IO_TMPDIR_KEY);
316    
317        /**
318         * <p>The <code>java.library.path</code> System Property. List of paths to search
319         * when loading libraries.</p>
320         *
321         * <p>Defaults to <code>null</code> if the runtime does not have
322         * security access to read this property or the property does not exist.</p>
323         * 
324         * <p>
325         * This value is initialized when the class is loaded. If {@link System#setProperty(String,String)}
326         * or {@link System#setProperties(java.util.Properties)} is called after this class is loaded, the value
327         * will be out of sync with that System property.
328         * </p>
329         * 
330         * @since Java 1.2
331         */
332        public static final String JAVA_LIBRARY_PATH = getSystemProperty("java.library.path");
333    
334        /**
335         * <p>The <code>java.runtime.name</code> System Property. Java Runtime Environment
336         * name.</p>
337         *
338         * <p>Defaults to <code>null</code> if the runtime does not have
339         * security access to read this property or the property does not exist.</p>
340         * 
341         * <p>
342         * This value is initialized when the class is loaded. If {@link System#setProperty(String,String)}
343         * or {@link System#setProperties(java.util.Properties)} is called after this class is loaded, the value
344         * will be out of sync with that System property.
345         * </p>
346         * 
347         * @since 2.0
348         * @since Java 1.3
349         */
350        public static final String JAVA_RUNTIME_NAME = getSystemProperty("java.runtime.name");
351    
352        /**
353         * <p>The <code>java.runtime.version</code> System Property. Java Runtime Environment
354         * version.</p>
355         *
356         * <p>Defaults to <code>null</code> if the runtime does not have
357         * security access to read this property or the property does not exist.</p>
358         * 
359         * <p>
360         * This value is initialized when the class is loaded. If {@link System#setProperty(String,String)}
361         * or {@link System#setProperties(java.util.Properties)} is called after this class is loaded, the value
362         * will be out of sync with that System property.
363         * </p>
364         * 
365         * @since 2.0
366         * @since Java 1.3
367         */
368        public static final String JAVA_RUNTIME_VERSION = getSystemProperty("java.runtime.version");
369    
370        /**
371         * <p>The <code>java.specification.name</code> System Property. Java Runtime Environment
372         * specification name.</p>
373         *
374         * <p>Defaults to <code>null</code> if the runtime does not have
375         * security access to read this property or the property does not exist.</p>
376         * 
377         * <p>
378         * This value is initialized when the class is loaded. If {@link System#setProperty(String,String)}
379         * or {@link System#setProperties(java.util.Properties)} is called after this class is loaded, the value
380         * will be out of sync with that System property.
381         * </p>
382         * 
383         * @since Java 1.2
384         */
385        public static final String JAVA_SPECIFICATION_NAME = getSystemProperty("java.specification.name");
386    
387        /**
388         * <p>The <code>java.specification.vendor</code> System Property. Java Runtime Environment
389         * specification vendor.</p>
390         *
391         * <p>Defaults to <code>null</code> if the runtime does not have
392         * security access to read this property or the property does not exist.</p>
393         * 
394         * <p>
395         * This value is initialized when the class is loaded. If {@link System#setProperty(String,String)}
396         * or {@link System#setProperties(java.util.Properties)} is called after this class is loaded, the value
397         * will be out of sync with that System property.
398         * </p>
399         * 
400         * @since Java 1.2
401         */
402        public static final String JAVA_SPECIFICATION_VENDOR = getSystemProperty("java.specification.vendor");
403    
404        /**
405         * <p>The <code>java.specification.version</code> System Property. Java Runtime Environment
406         * specification version.</p>
407         *
408         * <p>Defaults to <code>null</code> if the runtime does not have
409         * security access to read this property or the property does not exist.</p>
410         * 
411         * <p>
412         * This value is initialized when the class is loaded. If {@link System#setProperty(String,String)}
413         * or {@link System#setProperties(java.util.Properties)} is called after this class is loaded, the value
414         * will be out of sync with that System property.
415         * </p>
416         * 
417         * @since Java 1.3
418         */
419        public static final String JAVA_SPECIFICATION_VERSION = getSystemProperty("java.specification.version");
420    
421        /**
422         * <p>The <code>java.util.prefs.PreferencesFactory</code> System Property. A class name.</p>
423         *
424         * <p>Defaults to <code>null</code> if the runtime does not have
425         * security access to read this property or the property does not exist.</p>
426         * 
427         * <p>
428         * This value is initialized when the class is loaded. If {@link System#setProperty(String,String)}
429         * or {@link System#setProperties(java.util.Properties)} is called after this class is loaded, the value
430         * will be out of sync with that System property.
431         * </p>
432         * 
433         * @since 2.1
434         * @since Java 1.4
435         */
436        public static final String JAVA_UTIL_PREFS_PREFERENCES_FACTORY = 
437            getSystemProperty("java.util.prefs.PreferencesFactory");
438    
439        /**
440         * <p>The <code>java.vendor</code> System Property. Java vendor-specific string.</p>
441         *
442         * <p>Defaults to <code>null</code> if the runtime does not have
443         * security access to read this property or the property does not exist.</p>
444         * 
445         * <p>
446         * This value is initialized when the class is loaded. If {@link System#setProperty(String,String)}
447         * or {@link System#setProperties(java.util.Properties)} is called after this class is loaded, the value
448         * will be out of sync with that System property.
449         * </p>
450         * 
451         * @since Java 1.1
452         */
453        public static final String JAVA_VENDOR = getSystemProperty("java.vendor");
454    
455        /**
456         * <p>The <code>java.vendor.url</code> System Property. Java vendor URL.</p>
457         *
458         * <p>Defaults to <code>null</code> if the runtime does not have
459         * security access to read this property or the property does not exist.</p>
460         * 
461         * <p>
462         * This value is initialized when the class is loaded. If {@link System#setProperty(String,String)}
463         * or {@link System#setProperties(java.util.Properties)} is called after this class is loaded, the value
464         * will be out of sync with that System property.
465         * </p>
466         * 
467         * @since Java 1.1
468        */
469        public static final String JAVA_VENDOR_URL = getSystemProperty("java.vendor.url");
470    
471        /**
472         * <p>The <code>java.version</code> System Property. Java version number.</p>
473         *
474         * <p>Defaults to <code>null</code> if the runtime does not have
475         * security access to read this property or the property does not exist.</p>
476         * 
477         * <p>
478         * This value is initialized when the class is loaded. If {@link System#setProperty(String,String)}
479         * or {@link System#setProperties(java.util.Properties)} is called after this class is loaded, the value
480         * will be out of sync with that System property.
481         * </p>
482         * 
483         * @since Java 1.1
484         */
485        public static final String JAVA_VERSION = getSystemProperty("java.version");
486    
487        /**
488         * <p>The <code>java.vm.info</code> System Property. Java Virtual Machine implementation
489         * info.</p>
490         *
491         * <p>Defaults to <code>null</code> if the runtime does not have
492         * security access to read this property or the property does not exist.</p>
493         * 
494         * <p>
495         * This value is initialized when the class is loaded. If {@link System#setProperty(String,String)}
496         * or {@link System#setProperties(java.util.Properties)} is called after this class is loaded, the value
497         * will be out of sync with that System property.
498         * </p>
499         * 
500         * @since 2.0
501         * @since Java 1.2
502         */
503        public static final String JAVA_VM_INFO = getSystemProperty("java.vm.info");
504    
505        /**
506         * <p>The <code>java.vm.name</code> System Property. Java Virtual Machine implementation
507         * name.</p>
508         *
509         * <p>Defaults to <code>null</code> if the runtime does not have
510         * security access to read this property or the property does not exist.</p>
511         * 
512         * <p>
513         * This value is initialized when the class is loaded. If {@link System#setProperty(String,String)}
514         * or {@link System#setProperties(java.util.Properties)} is called after this class is loaded, the value
515         * will be out of sync with that System property.
516         * </p>
517         * 
518         * @since Java 1.2
519         */
520        public static final String JAVA_VM_NAME = getSystemProperty("java.vm.name");
521    
522        /**
523         * <p>The <code>java.vm.specification.name</code> System Property. Java Virtual Machine
524         * specification name.</p>
525         *
526         * <p>Defaults to <code>null</code> if the runtime does not have
527         * security access to read this property or the property does not exist.</p>
528         * 
529         * <p>
530         * This value is initialized when the class is loaded. If {@link System#setProperty(String,String)}
531         * or {@link System#setProperties(java.util.Properties)} is called after this class is loaded, the value
532         * will be out of sync with that System property.
533         * </p>
534         * 
535         * @since Java 1.2
536         */
537        public static final String JAVA_VM_SPECIFICATION_NAME = getSystemProperty("java.vm.specification.name");
538    
539        /**
540         * <p>The <code>java.vm.specification.vendor</code> System Property. Java Virtual
541         * Machine specification vendor.</p>
542         *
543         * <p>Defaults to <code>null</code> if the runtime does not have
544         * security access to read this property or the property does not exist.</p>
545         * 
546         * <p>
547         * This value is initialized when the class is loaded. If {@link System#setProperty(String,String)}
548         * or {@link System#setProperties(java.util.Properties)} is called after this class is loaded, the value
549         * will be out of sync with that System property.
550         * </p>
551         * 
552         * @since Java 1.2
553         */
554        public static final String JAVA_VM_SPECIFICATION_VENDOR = getSystemProperty("java.vm.specification.vendor");
555    
556        /**
557         * <p>The <code>java.vm.specification.version</code> System Property. Java Virtual Machine
558         * specification version.</p>
559         *
560         * <p>Defaults to <code>null</code> if the runtime does not have
561         * security access to read this property or the property does not exist.</p>
562         * 
563         * <p>
564         * This value is initialized when the class is loaded. If {@link System#setProperty(String,String)}
565         * or {@link System#setProperties(java.util.Properties)} is called after this class is loaded, the value
566         * will be out of sync with that System property.
567         * </p>
568         * 
569         * @since Java 1.2
570         */
571        public static final String JAVA_VM_SPECIFICATION_VERSION = getSystemProperty("java.vm.specification.version");
572    
573        /**
574         * <p>The <code>java.vm.vendor</code> System Property. Java Virtual Machine implementation
575         * vendor.</p>
576         *
577         * <p>Defaults to <code>null</code> if the runtime does not have
578         * security access to read this property or the property does not exist.</p>
579         * 
580         * <p>
581         * This value is initialized when the class is loaded. If {@link System#setProperty(String,String)}
582         * or {@link System#setProperties(java.util.Properties)} is called after this class is loaded, the value
583         * will be out of sync with that System property.
584         * </p>
585         * 
586         * @since Java 1.2
587         */
588        public static final String JAVA_VM_VENDOR = getSystemProperty("java.vm.vendor");
589    
590        /**
591         * <p>The <code>java.vm.version</code> System Property. Java Virtual Machine
592         * implementation version.</p>
593         *
594         * <p>Defaults to <code>null</code> if the runtime does not have
595         * security access to read this property or the property does not exist.</p>
596         * 
597         * <p>
598         * This value is initialized when the class is loaded. If {@link System#setProperty(String,String)}
599         * or {@link System#setProperties(java.util.Properties)} is called after this class is loaded, the value
600         * will be out of sync with that System property.
601         * </p>
602         * 
603         * @since Java 1.2
604         */
605        public static final String JAVA_VM_VERSION = getSystemProperty("java.vm.version");
606    
607        /**
608         * <p>The <code>line.separator</code> System Property. Line separator
609         * (<code>&quot;\n&quot;</code> on UNIX).</p>
610         *
611         * <p>Defaults to <code>null</code> if the runtime does not have
612         * security access to read this property or the property does not exist.</p>
613         * 
614         * <p>
615         * This value is initialized when the class is loaded. If {@link System#setProperty(String,String)}
616         * or {@link System#setProperties(java.util.Properties)} is called after this class is loaded, the value
617         * will be out of sync with that System property.
618         * </p>
619         * 
620         * @since Java 1.1
621         */
622        public static final String LINE_SEPARATOR = getSystemProperty("line.separator");
623    
624        /**
625         * <p>The <code>os.arch</code> System Property. Operating system architecture.</p>
626         *
627         * <p>Defaults to <code>null</code> if the runtime does not have
628         * security access to read this property or the property does not exist.</p>
629         * 
630         * <p>
631         * This value is initialized when the class is loaded. If {@link System#setProperty(String,String)}
632         * or {@link System#setProperties(java.util.Properties)} is called after this class is loaded, the value
633         * will be out of sync with that System property.
634         * </p>
635         * 
636         * @since Java 1.1
637         */
638        public static final String OS_ARCH = getSystemProperty("os.arch");
639    
640        /**
641         * <p>The <code>os.name</code> System Property. Operating system name.</p>
642         *
643         * <p>Defaults to <code>null</code> if the runtime does not have
644         * security access to read this property or the property does not exist.</p>
645         * 
646         * <p>
647         * This value is initialized when the class is loaded. If {@link System#setProperty(String,String)}
648         * or {@link System#setProperties(java.util.Properties)} is called after this class is loaded, the value
649         * will be out of sync with that System property.
650         * </p>
651         * 
652         * @since Java 1.1
653         */
654        public static final String OS_NAME = getSystemProperty("os.name");
655    
656        /**
657         * <p>The <code>os.version</code> System Property. Operating system version.</p>
658         *
659         * <p>Defaults to <code>null</code> if the runtime does not have
660         * security access to read this property or the property does not exist.</p>
661         * 
662         * <p>
663         * This value is initialized when the class is loaded. If {@link System#setProperty(String,String)}
664         * or {@link System#setProperties(java.util.Properties)} is called after this class is loaded, the value
665         * will be out of sync with that System property.
666         * </p>
667         * 
668         * @since Java 1.1
669         */
670        public static final String OS_VERSION = getSystemProperty("os.version");
671    
672        /**
673         * <p>The <code>path.separator</code> System Property. Path separator
674         * (<code>&quot;:&quot;</code> on UNIX).</p>
675         *
676         * <p>Defaults to <code>null</code> if the runtime does not have
677         * security access to read this property or the property does not exist.</p>
678         * 
679         * <p>
680         * This value is initialized when the class is loaded. If {@link System#setProperty(String,String)}
681         * or {@link System#setProperties(java.util.Properties)} is called after this class is loaded, the value
682         * will be out of sync with that System property.
683         * </p>
684         * 
685         * @since Java 1.1
686         */
687        public static final String PATH_SEPARATOR = getSystemProperty("path.separator");
688    
689        /**
690         * <p>The <code>user.country</code> or <code>user.region</code> System Property.
691         * User's country code, such as <code>GB</code>. First in JDK version 1.2 as
692         * <code>user.region</code>. Renamed to <code>user.country</code> in 1.4</p>
693         *
694         * <p>Defaults to <code>null</code> if the runtime does not have
695         * security access to read this property or the property does not exist.</p>
696         * 
697         * <p>
698         * This value is initialized when the class is loaded. If {@link System#setProperty(String,String)}
699         * or {@link System#setProperties(java.util.Properties)} is called after this class is loaded, the value
700         * will be out of sync with that System property.
701         * </p>
702         * 
703         * @since 2.0
704         * @since Java 1.2
705         */
706        public static final String USER_COUNTRY = 
707            getSystemProperty("user.country") == null ?
708                getSystemProperty("user.region") : getSystemProperty("user.country");
709    
710        /**
711         * <p>The <code>user.dir</code> System Property. User's current working
712         * directory.</p>
713         *
714         * <p>Defaults to <code>null</code> if the runtime does not have
715         * security access to read this property or the property does not exist.</p>
716         * 
717         * <p>
718         * This value is initialized when the class is loaded. If {@link System#setProperty(String,String)}
719         * or {@link System#setProperties(java.util.Properties)} is called after this class is loaded, the value
720         * will be out of sync with that System property.
721         * </p>
722         * 
723         * @since Java 1.1
724         */
725        public static final String USER_DIR = getSystemProperty(USER_DIR_KEY);
726    
727        /**
728         * <p>The <code>user.home</code> System Property. User's home directory.</p>
729         *
730         * <p>Defaults to <code>null</code> if the runtime does not have
731         * security access to read this property or the property does not exist.</p>
732         * 
733         * <p>
734         * This value is initialized when the class is loaded. If {@link System#setProperty(String,String)}
735         * or {@link System#setProperties(java.util.Properties)} is called after this class is loaded, the value
736         * will be out of sync with that System property.
737         * </p>
738         * 
739         * @since Java 1.1
740         */
741        public static final String USER_HOME = getSystemProperty(USER_HOME_KEY);
742    
743        /**
744         * <p>The <code>user.language</code> System Property. User's language code,
745         * such as <code>"en"</code>.</p>
746         *
747         * <p>Defaults to <code>null</code> if the runtime does not have
748         * security access to read this property or the property does not exist.</p>
749         * 
750         * <p>
751         * This value is initialized when the class is loaded. If {@link System#setProperty(String,String)}
752         * or {@link System#setProperties(java.util.Properties)} is called after this class is loaded, the value
753         * will be out of sync with that System property.
754         * </p>
755         * 
756         * @since 2.0
757         * @since Java 1.2
758         */
759        public static final String USER_LANGUAGE = getSystemProperty("user.language");
760    
761        /**
762         * <p>The <code>user.name</code> System Property. User's account name.</p>
763         *
764         * <p>Defaults to <code>null</code> if the runtime does not have
765         * security access to read this property or the property does not exist.</p>
766         * 
767         * <p>
768         * This value is initialized when the class is loaded. If {@link System#setProperty(String,String)}
769         * or {@link System#setProperties(java.util.Properties)} is called after this class is loaded, the value
770         * will be out of sync with that System property.
771         * </p>
772         * 
773         * @since Java 1.1
774         */
775        public static final String USER_NAME = getSystemProperty("user.name");
776    
777        /**
778         * <p>The <code>user.timezone</code> System Property. 
779         * For example: <code>"America/Los_Angeles"</code>.</p>
780         *
781         * <p>Defaults to <code>null</code> if the runtime does not have
782         * security access to read this property or the property does not exist.</p>
783         * 
784         * <p>
785         * This value is initialized when the class is loaded. If {@link System#setProperty(String,String)}
786         * or {@link System#setProperties(java.util.Properties)} is called after this class is loaded, the value
787         * will be out of sync with that System property.
788         * </p>
789         * 
790         * @since 2.1
791         */
792        public static final String USER_TIMEZONE = getSystemProperty("user.timezone");
793    
794        // Java version
795        //-----------------------------------------------------------------------
796        // This MUST be declared after those above as it depends on the
797        // values being set up
798    
799        /**
800         * <p>Gets the Java version as a <code>String</code> trimming leading letters.</p>
801         *
802         * <p>The field will return <code>null</code> if {@link #JAVA_VERSION} is <code>null</code>.</p>
803         * 
804         * @since 2.1
805         */
806        public static final String JAVA_VERSION_TRIMMED = getJavaVersionTrimmed();
807    
808        // Java version values
809        //-----------------------------------------------------------------------
810        // These MUST be declared after the trim above as they depend on the
811        // value being set up
812    
813        /**
814         * <p>Gets the Java version as a <code>float</code>.</p>
815         *
816         * <p>Example return values:</p>
817         * <ul>
818         *  <li><code>1.2f</code> for JDK 1.2
819         *  <li><code>1.31f</code> for JDK 1.3.1
820         * </ul>
821         *
822         * <p>The field will return zero if {@link #JAVA_VERSION} is <code>null</code>.</p>
823         * 
824         * @since 2.0
825         */
826        public static final float JAVA_VERSION_FLOAT = getJavaVersionAsFloat();
827    
828        /**
829         * <p>Gets the Java version as an <code>int</code>.</p>
830         *
831         * <p>Example return values:</p>
832         * <ul>
833         *  <li><code>120</code> for JDK 1.2
834         *  <li><code>131</code> for JDK 1.3.1
835         * </ul>
836         *
837         * <p>The field will return zero if {@link #JAVA_VERSION} is <code>null</code>.</p>
838         * 
839         * @since 2.0
840         */
841        public static final int JAVA_VERSION_INT = getJavaVersionAsInt();
842    
843        // Java version checks
844        //-----------------------------------------------------------------------
845        // These MUST be declared after those above as they depend on the
846        // values being set up
847        
848        /**
849         * <p>Is <code>true</code> if this is Java version 1.1 (also 1.1.x versions).</p>
850         *
851         * <p>The field will return <code>false</code> if {@link #JAVA_VERSION} is
852         * <code>null</code>.</p>
853         */
854        public static final boolean IS_JAVA_1_1 = getJavaVersionMatches("1.1");
855    
856        /**
857         * <p>Is <code>true</code> if this is Java version 1.2 (also 1.2.x versions).</p>
858         *
859         * <p>The field will return <code>false</code> if {@link #JAVA_VERSION} is
860         * <code>null</code>.</p>
861         */
862        public static final boolean IS_JAVA_1_2 = getJavaVersionMatches("1.2");
863    
864        /**
865         * <p>Is <code>true</code> if this is Java version 1.3 (also 1.3.x versions).</p>
866         *
867         * <p>The field will return <code>false</code> if {@link #JAVA_VERSION} is
868         * <code>null</code>.</p>
869         */
870        public static final boolean IS_JAVA_1_3 = getJavaVersionMatches("1.3");
871    
872        /**
873         * <p>Is <code>true</code> if this is Java version 1.4 (also 1.4.x versions).</p>
874         *
875         * <p>The field will return <code>false</code> if {@link #JAVA_VERSION} is
876         * <code>null</code>.</p>
877         */
878        public static final boolean IS_JAVA_1_4 = getJavaVersionMatches("1.4");
879    
880        /**
881         * <p>Is <code>true</code> if this is Java version 1.5 (also 1.5.x versions).</p>
882         *
883         * <p>The field will return <code>false</code> if {@link #JAVA_VERSION} is
884         * <code>null</code>.</p>
885         */
886        public static final boolean IS_JAVA_1_5 = getJavaVersionMatches("1.5");
887    
888        /**
889         * <p>Is <code>true</code> if this is Java version 1.6 (also 1.6.x versions).</p>
890         *
891         * <p>The field will return <code>false</code> if {@link #JAVA_VERSION} is
892         * <code>null</code>.</p>
893         */
894        public static final boolean IS_JAVA_1_6 = getJavaVersionMatches("1.6");
895    
896        // Operating system checks
897        //-----------------------------------------------------------------------
898        // These MUST be declared after those above as they depend on the
899        // values being set up
900        // OS names from http://www.vamphq.com/os.html
901        // Selected ones included - please advise commons-dev@jakarta.apache.org
902        // if you want another added or a mistake corrected
903    
904        /**
905         * <p>Is <code>true</code> if this is AIX.</p>
906         *
907         * <p>The field will return <code>false</code> if <code>OS_NAME</code> is
908         * <code>null</code>.</p>
909         * 
910         * @since 2.0
911         */
912        public static final boolean IS_OS_AIX = getOSMatches("AIX");
913    
914        /**
915         * <p>Is <code>true</code> if this is HP-UX.</p>
916         *
917         * <p>The field will return <code>false</code> if <code>OS_NAME</code> is
918         * <code>null</code>.</p>
919         * 
920         * @since 2.0
921         */
922        public static final boolean IS_OS_HP_UX = getOSMatches("HP-UX");
923    
924        /**
925         * <p>Is <code>true</code> if this is Irix.</p>
926         *
927         * <p>The field will return <code>false</code> if <code>OS_NAME</code> is
928         * <code>null</code>.</p>
929         * 
930         * @since 2.0
931         */
932        public static final boolean IS_OS_IRIX = getOSMatches("Irix");
933    
934        /**
935         * <p>Is <code>true</code> if this is Linux.</p>
936         *
937         * <p>The field will return <code>false</code> if <code>OS_NAME</code> is
938         * <code>null</code>.</p>
939         * 
940         * @since 2.0
941         */
942        public static final boolean IS_OS_LINUX = getOSMatches("Linux") || getOSMatches("LINUX");
943    
944        /**
945         * <p>Is <code>true</code> if this is Mac.</p>
946         *
947         * <p>The field will return <code>false</code> if <code>OS_NAME</code> is
948         * <code>null</code>.</p>
949         * 
950         * @since 2.0
951         */
952        public static final boolean IS_OS_MAC = getOSMatches("Mac");
953    
954        /**
955         * <p>Is <code>true</code> if this is Mac.</p>
956         *
957         * <p>The field will return <code>false</code> if <code>OS_NAME</code> is
958         * <code>null</code>.</p>
959         * 
960         * @since 2.0
961         */
962        public static final boolean IS_OS_MAC_OSX = getOSMatches("Mac OS X");
963    
964        /**
965         * <p>Is <code>true</code> if this is OS/2.</p>
966         *
967         * <p>The field will return <code>false</code> if <code>OS_NAME</code> is
968         * <code>null</code>.</p>
969         * 
970         * @since 2.0
971         */
972        public static final boolean IS_OS_OS2 = getOSMatches("OS/2");
973    
974        /**
975         * <p>Is <code>true</code> if this is Solaris.</p>
976         *
977         * <p>The field will return <code>false</code> if <code>OS_NAME</code> is
978         * <code>null</code>.</p>
979         * 
980         * @since 2.0
981         */
982        public static final boolean IS_OS_SOLARIS = getOSMatches("Solaris");
983    
984        /**
985         * <p>Is <code>true</code> if this is SunOS.</p>
986         *
987         * <p>The field will return <code>false</code> if <code>OS_NAME</code> is
988         * <code>null</code>.</p>
989         * 
990         * @since 2.0
991         */
992        public static final boolean IS_OS_SUN_OS = getOSMatches("SunOS");
993    
994        /**
995         * <p>Is <code>true</code> if this is a POSIX compilant system,
996         * as in any of AIX, HP-UX, Irix, Linux, MacOSX, Solaris or SUN OS.</p>
997         *
998         * <p>The field will return <code>false</code> if <code>OS_NAME</code> is
999         * <code>null</code>.</p>
1000         * 
1001         * @since 2.1
1002         */
1003        public static final boolean IS_OS_UNIX =
1004            IS_OS_AIX || IS_OS_HP_UX || IS_OS_IRIX || IS_OS_LINUX ||
1005            IS_OS_MAC_OSX || IS_OS_SOLARIS || IS_OS_SUN_OS;
1006    
1007        /**
1008         * <p>Is <code>true</code> if this is Windows.</p>
1009         *
1010         * <p>The field will return <code>false</code> if <code>OS_NAME</code> is
1011         * <code>null</code>.</p>
1012         * 
1013         * @since 2.0
1014         */
1015        public static final boolean IS_OS_WINDOWS = getOSMatches(OS_NAME_WINDOWS_PREFIX);
1016    
1017        /**
1018         * <p>Is <code>true</code> if this is Windows 2000.</p>
1019         *
1020         * <p>The field will return <code>false</code> if <code>OS_NAME</code> is
1021         * <code>null</code>.</p>
1022         * 
1023         * @since 2.0
1024         */
1025        public static final boolean IS_OS_WINDOWS_2000 = getOSMatches(OS_NAME_WINDOWS_PREFIX, "5.0");
1026    
1027        /**
1028         * <p>Is <code>true</code> if this is Windows 95.</p>
1029         *
1030         * <p>The field will return <code>false</code> if <code>OS_NAME</code> is
1031         * <code>null</code>.</p>
1032         * 
1033         * @since 2.0
1034         */
1035        public static final boolean IS_OS_WINDOWS_95 = getOSMatches(OS_NAME_WINDOWS_PREFIX + " 9", "4.0");
1036        // JDK 1.2 running on Windows98 returns 'Windows 95', hence the above
1037    
1038        /**
1039         * <p>Is <code>true</code> if this is Windows 98.</p>
1040         *
1041         * <p>The field will return <code>false</code> if <code>OS_NAME</code> is
1042         * <code>null</code>.</p>
1043         * 
1044         * @since 2.0
1045         */
1046        public static final boolean IS_OS_WINDOWS_98 = getOSMatches(OS_NAME_WINDOWS_PREFIX + " 9", "4.1");
1047        // JDK 1.2 running on Windows98 returns 'Windows 95', hence the above
1048    
1049        /**
1050         * <p>Is <code>true</code> if this is Windows ME.</p>
1051         *
1052         * <p>The field will return <code>false</code> if <code>OS_NAME</code> is
1053         * <code>null</code>.</p>
1054         * 
1055         * @since 2.0
1056         */
1057        public static final boolean IS_OS_WINDOWS_ME = getOSMatches(OS_NAME_WINDOWS_PREFIX, "4.9");
1058        // JDK 1.2 running on WindowsME may return 'Windows 95', hence the above
1059    
1060        /**
1061         * <p>Is <code>true</code> if this is Windows NT.</p>
1062         *
1063         * <p>The field will return <code>false</code> if <code>OS_NAME</code> is
1064         * <code>null</code>.</p>
1065         * 
1066         * @since 2.0
1067         */
1068        public static final boolean IS_OS_WINDOWS_NT = getOSMatches(OS_NAME_WINDOWS_PREFIX + " NT");
1069        // Windows 2000 returns 'Windows 2000' but may suffer from same JDK1.2 problem
1070    
1071        /**
1072         * <p>Is <code>true</code> if this is Windows XP.</p>
1073         *
1074         * <p>The field will return <code>false</code> if <code>OS_NAME</code> is
1075         * <code>null</code>.</p>
1076         * 
1077         * @since 2.0
1078         */
1079        public static final boolean IS_OS_WINDOWS_XP = getOSMatches(OS_NAME_WINDOWS_PREFIX, "5.1");
1080    
1081        //-----------------------------------------------------------------------    
1082        /**
1083         * <p>SystemUtils instances should NOT be constructed in standard
1084         * programming. Instead, the class should be used as
1085         * <code>SystemUtils.FILE_SEPARATOR</code>.</p>
1086         *
1087         * <p>This constructor is public to permit tools that require a JavaBean
1088         * instance to operate.</p>
1089         */
1090        public SystemUtils() {
1091            super();
1092        }
1093        
1094        //-----------------------------------------------------------------------    
1095        /**
1096         * <p>Gets the Java version number as a <code>float</code>.</p>
1097         *
1098         * <p>Example return values:</p>
1099         * <ul>
1100         *  <li><code>1.2f</code> for JDK 1.2
1101         *  <li><code>1.31f</code> for JDK 1.3.1
1102         * </ul>
1103         * 
1104         * @return the version, for example 1.31f for JDK 1.3.1
1105         * @deprecated Use {@link #JAVA_VERSION_FLOAT} instead.
1106         *             Method will be removed in Commons Lang 3.0.
1107         */
1108        public static float getJavaVersion() {
1109            return JAVA_VERSION_FLOAT;
1110        }
1111    
1112        /**
1113         * <p>Gets the Java version number as a <code>float</code>.</p>
1114         *
1115         * <p>Example return values:</p>
1116         * <ul>
1117         *  <li><code>1.2f</code> for JDK 1.2
1118         *  <li><code>1.31f</code> for JDK 1.3.1
1119         * </ul>
1120         * 
1121         * <p>Patch releases are not reported.
1122         * Zero is returned if {@link #JAVA_VERSION_TRIMMED} is <code>null</code>.</p>
1123         * 
1124         * @return the version, for example 1.31f for JDK 1.3.1
1125         */
1126        private static float getJavaVersionAsFloat() {
1127            if (JAVA_VERSION_TRIMMED == null) {
1128                return 0f;
1129            }
1130            String str = JAVA_VERSION_TRIMMED.substring(0, 3);
1131            if (JAVA_VERSION_TRIMMED.length() >= 5) {
1132                str = str + JAVA_VERSION_TRIMMED.substring(4, 5);
1133            }
1134            try {
1135                return Float.parseFloat(str);
1136            } catch (Exception ex) {
1137                return 0;
1138            }
1139        }
1140        
1141        /**
1142         * <p>Gets the Java version number as an <code>int</code>.</p>
1143         *
1144         * <p>Example return values:</p>
1145         * <ul>
1146         *  <li><code>120</code> for JDK 1.2
1147         *  <li><code>131</code> for JDK 1.3.1
1148         * </ul>
1149         * 
1150         * <p>Patch releases are not reported.
1151         * Zero is returned if {@link #JAVA_VERSION_TRIMMED} is <code>null</code>.</p>
1152         * 
1153         * @return the version, for example 131 for JDK 1.3.1
1154         */
1155        private static int getJavaVersionAsInt() {
1156            if (JAVA_VERSION_TRIMMED == null) {
1157                return 0;
1158            }
1159            String str = JAVA_VERSION_TRIMMED.substring(0, 1);
1160            str = str + JAVA_VERSION_TRIMMED.substring(2, 3);
1161            if (JAVA_VERSION_TRIMMED.length() >= 5) {
1162                str = str + JAVA_VERSION_TRIMMED.substring(4, 5);
1163            } else {
1164                str = str + "0";
1165            }
1166            try {
1167                return Integer.parseInt(str);
1168            } catch (Exception ex) {
1169                return 0;
1170            }
1171        }
1172    
1173        /**
1174         * Trims the text of the java version to start with numbers.
1175         * 
1176         * @return the trimmed java version
1177         */
1178        private static String getJavaVersionTrimmed() {
1179            if (JAVA_VERSION != null) {
1180                for (int i = 0; i < JAVA_VERSION.length(); i++) {
1181                    char ch = JAVA_VERSION.charAt(i);
1182                    if (ch >= '0' && ch <= '9') {
1183                        return JAVA_VERSION.substring(i);
1184                    }
1185                }
1186            }
1187            return null;
1188        }
1189    
1190        /**
1191         * <p>Decides if the java version matches.</p>
1192         * 
1193         * @param versionPrefix  the prefix for the java version
1194         * @return true if matches, or false if not or can't determine
1195         */
1196        private static boolean getJavaVersionMatches(String versionPrefix) {
1197            if (JAVA_VERSION_TRIMMED == null) {
1198                return false;
1199            }
1200            return JAVA_VERSION_TRIMMED.startsWith(versionPrefix);
1201        }    
1202        
1203        /**
1204         * <p>Decides if the operating system matches.</p>
1205         * 
1206         * @param osNamePrefix  the prefix for the os name
1207         * @return true if matches, or false if not or can't determine
1208         */
1209        private static boolean getOSMatches(String osNamePrefix) {
1210            if (OS_NAME == null) {
1211                return false;
1212            }
1213            return OS_NAME.startsWith(osNamePrefix);
1214        }    
1215    
1216        /**
1217         * <p>Decides if the operating system matches.</p>
1218         * 
1219         * @param osNamePrefix  the prefix for the os name
1220         * @param osVersionPrefix  the prefix for the version
1221         * @return true if matches, or false if not or can't determine
1222         */
1223        private static boolean getOSMatches(String osNamePrefix, String osVersionPrefix) {
1224            if (OS_NAME == null || OS_VERSION == null) {
1225                return false;
1226            }
1227            return OS_NAME.startsWith(osNamePrefix) && OS_VERSION.startsWith(osVersionPrefix);
1228        }    
1229    
1230        //-----------------------------------------------------------------------
1231        /**
1232         * <p>Gets a System property, defaulting to <code>null</code> if the property
1233         * cannot be read.</p>
1234         *
1235         * <p>If a <code>SecurityException</code> is caught, the return
1236         * value is <code>null</code> and a message is written to <code>System.err</code>.</p>
1237         * 
1238         * @param property the system property name
1239         * @return the system property value or <code>null</code> if a security problem occurs
1240         */
1241        private static String getSystemProperty(String property) {
1242            try {
1243                return System.getProperty(property);
1244            } catch (SecurityException ex) {
1245                // we are not allowed to look at this property
1246                System.err.println(
1247                    "Caught a SecurityException reading the system property '" + property 
1248                    + "'; the SystemUtils property value will default to null."
1249                );
1250                return null;
1251            }
1252        }
1253        
1254        /**
1255         * <p>Is the Java version at least the requested version.</p>
1256         *
1257         * <p>Example input:</p>
1258         * <ul>
1259         *  <li><code>1.2f</code> to test for JDK 1.2</li>
1260         *  <li><code>1.31f</code> to test for JDK 1.3.1</li>
1261         * </ul>
1262         * 
1263         * @param requiredVersion  the required version, for example 1.31f
1264         * @return <code>true</code> if the actual version is equal or greater
1265         *  than the required version
1266         */
1267        public static boolean isJavaVersionAtLeast(float requiredVersion) {
1268            return JAVA_VERSION_FLOAT >= requiredVersion;
1269        }
1270        
1271        /**
1272         * <p>Is the Java version at least the requested version.</p>
1273         *
1274         * <p>Example input:</p>
1275         * <ul>
1276         *  <li><code>120</code> to test for JDK 1.2 or greater</li>
1277         *  <li><code>131</code> to test for JDK 1.3.1 or greater</li>
1278         * </ul>
1279         * 
1280         * @param requiredVersion  the required version, for example 131
1281         * @return <code>true</code> if the actual version is equal or greater
1282         *  than the required version
1283         * @since 2.0
1284         */
1285        public static boolean isJavaVersionAtLeast(int requiredVersion) {
1286            return JAVA_VERSION_INT >= requiredVersion;
1287        }
1288    
1289        /**
1290         * Returns whether the {@link #JAVA_AWT_HEADLESS} value is <code>true</code>.
1291         *  
1292         * @return <code>true</code> if <code>JAVA_AWT_HEADLESS</code> is <code>"true"</code>,
1293         * <code>false</code> otherwise.
1294         * 
1295         * @see #JAVA_AWT_HEADLESS
1296         * @since 2.1
1297         * @since Java 1.4
1298         */
1299        public static boolean isJavaAwtHeadless() {
1300            return JAVA_AWT_HEADLESS != null ? JAVA_AWT_HEADLESS.equals(Boolean.TRUE.toString()) : false;
1301        }
1302        /**
1303         * <p>Gets the Java home directory as a <code>File</code>.</p>
1304         * 
1305         * @return a directory
1306         * @throws  SecurityException  if a security manager exists and its  
1307         *             <code>checkPropertyAccess</code> method doesn't allow
1308         *              access to the specified system property.
1309         * @see System#getProperty(String)
1310         * @since 2.1
1311         */
1312        public static File getJavaHome() {
1313            return new File(System.getProperty(JAVA_HOME_KEY));
1314        }
1315    
1316        /**
1317         * <p>Gets the Java IO temporary directory as a <code>File</code>.</p>
1318         * 
1319         * @return a directory
1320         * @throws  SecurityException  if a security manager exists and its  
1321         *             <code>checkPropertyAccess</code> method doesn't allow
1322         *              access to the specified system property.
1323         * @see System#getProperty(String)
1324         * @since 2.1
1325         */
1326        public static File getJavaIoTmpDir() {
1327            return new File(System.getProperty(JAVA_IO_TMPDIR_KEY));
1328        }
1329    
1330        /**
1331         * <p>Gets the user directory as a <code>File</code>.</p>
1332         * 
1333         * @return a directory
1334         * @throws  SecurityException  if a security manager exists and its  
1335         *             <code>checkPropertyAccess</code> method doesn't allow
1336         *              access to the specified system property.
1337         * @see System#getProperty(String)
1338         * @since 2.1
1339         */
1340        public static File getUserDir() {
1341            return new File(System.getProperty(USER_DIR_KEY));
1342        }
1343    
1344        /**
1345         * <p>Gets the user home directory as a <code>File</code>.</p>
1346         * 
1347         * @return a directory
1348         * @throws  SecurityException  if a security manager exists and its  
1349         *             <code>checkPropertyAccess</code> method doesn't allow
1350         *              access to the specified system property.
1351         * @see System#getProperty(String)
1352         * @since 2.1
1353         */
1354        public static File getUserHome() {
1355            return new File(System.getProperty(USER_HOME_KEY));
1356        }
1357    
1358    }