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