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