    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>
    023     * Helpers for <code>java.lang.System</code>.
    024     * </p>
    025     *
    026     * <p>
    027     * If a system property cannot be read due to security restrictions,
    028     * the corresponding field in this class will be set to <code>null</code>
    029     * and a message will be written to <code>System.err</code>.
    030     * </p>
    031     *
    032     * <p>
    033     * #ThreadSafe#
    034     * </p>
    035     *
    036     * @author Apache Software Foundation
    037     * @author Based on code from Avalon Excalibur
    038     * @author Based on code from Lucene
    039     * @author <a href="mailto:sdowney@panix.com">Steve Downey</a>
    040     * @author Gary Gregory
    041     * @author Michael Becke
    042     * @author Tetsuya Kaneuchi
    043     * @author Rafal Krupinski
    044     * @author Jason Gritman
    045     * @since 1.0
    046     * @version $Id: SystemUtils.java 1056988 2011-01-09 17:58:53Z niallp $
    047     */
    048    public class SystemUtils {
    049
    050        private static final int JAVA_VERSION_TRIM_SIZE = 3;
    051
    052        /**
    053         * The prefix String for all Windows OS.
    054         */
    055        private static final String OS_NAME_WINDOWS_PREFIX = "Windows";
    056
    057        // System property constants
    058        // -----------------------------------------------------------------------
    059        // These MUST be declared first. Other constants depend on this.
    060
    061        /**
    062         * The System property key for the user home directory.
    063         */
    064        private static final String USER_HOME_KEY = "user.home";
    065
    066        /**
    067         * The System property key for the user directory.
    068         */
    069        private static final String USER_DIR_KEY = "user.dir";
    070
    071        /**
    072         * The System property key for the Java IO temporary directory.
    073         */
    074        private static final String JAVA_IO_TMPDIR_KEY = "java.io.tmpdir";
    075
    076        /**
    077         * The System property key for the Java home directory.
    078         */
    079        private static final String JAVA_HOME_KEY = "java.home";
    080
    081        /**
    082         * <p>
    083         * The <code>awt.toolkit</code> System Property.
    084         * </p>
    085         * <p>
    086         * Holds a class name, on Windows XP this is <code>sun.awt.windows.WToolkit</code>.
    087         * </p>
    088         * <p>
    089         * <b>On platforms without a GUI, this value is <code>null</code>.</b>
    090         * </p>
    091         *
    092         * <p>
    093         * Defaults to <code>null</code> if the runtime does not have
    094         * security access to read this property or the property does not exist.
    095         * </p>
    096         *
    097         * <p>
    098         * This value is initialized when the class is loaded. If {@link System#setProperty(String,String)} or
    099         * {@link System#setProperties(java.util.Properties)} is called after this class is loaded, the value will
    100         * be out of sync with that System property.
    101         * </p>
    102         *
    103         * @since 2.1
    104         */
    105        public static final String AWT_TOOLKIT = getSystemProperty("awt.toolkit");
    106
    107        /**
    108         * <p>
    109         * The <code>file.encoding</code> System Property.
    110         * </p>
    111         * <p>
    112         * File encoding, such as <code>Cp1252</code>.
    113         * </p>
    114         *
    115         * <p>
    116         * Defaults to <code>null</code> if the runtime does not have
    117         * security access to read this property or the property does not exist.
    118         * </p>
    119         *
    120         * <p>
    121         * This value is initialized when the class is loaded. If {@link System#setProperty(String,String)} or
    122         * {@link System#setProperties(java.util.Properties)} is called after this class is loaded, the value
    123         * will be out of sync with that System property.
    124         * </p>
    125         *
    126         * @since 2.0
    127         * @since Java 1.2
    128         */
    129        public static final String FILE_ENCODING = getSystemProperty("file.encoding");
    130
    131        /**
    132         * <p>
    133         * The <code>file.separator</code> System Property. File separator (<code>&quot;/&quot;</code> on UNIX).
    134         * </p>
    135         *
    136         * <p>
    137         * Defaults to <code>null</code> if the runtime does not have
    138         * security access to read this property or the property does not exist.
    139         * </p>
    140         *
    141         * <p>
    142         * This value is initialized when the class is loaded. If {@link System#setProperty(String,String)} or
    143         * {@link System#setProperties(java.util.Properties)} is called after this class is loaded, the value
    144         * will be out of sync with that System property.
    145         * </p>
    146         *
    147         * @since Java 1.1
    148         */
    149        public static final String FILE_SEPARATOR = getSystemProperty("file.separator");
    150
    151        /**
    152         * <p>
    153         * The <code>java.awt.fonts</code> System Property.
    154         * </p>
    155         *
    156         * <p>
    157         * Defaults to <code>null</code> if the runtime does not have
    158         * security access to read this property or the property does not exist.
    159         * </p>
    160         *
    161         * <p>
    162         * This value is initialized when the class is loaded. If {@link System#setProperty(String,String)} or
    163         * {@link System#setProperties(java.util.Properties)} is called after this class is loaded, the value
    164         * will be out of sync with that System property.
    165         * </p>
    166         *
    167         * @since 2.1
    168         */
    169        public static final String JAVA_AWT_FONTS = getSystemProperty("java.awt.fonts");
    170
    171        /**
    172         * <p>
    173         * The <code>java.awt.graphicsenv</code> System Property.
    174         * </p>
    175         *
    176         * <p>
    177         * Defaults to <code>null</code> if the runtime does not have
    178         * security access to read this property or the property does not exist.
    179         * </p>
    180         *
    181         * <p>
    182         * This value is initialized when the class is loaded. If {@link System#setProperty(String,String)} or
    183         * {@link System#setProperties(java.util.Properties)} is called after this class is loaded, the value
    184         * will be out of sync with that System property.
    185         * </p>
    186         *
    187         * @since 2.1
    188         */
    189        public static final String JAVA_AWT_GRAPHICSENV = getSystemProperty("java.awt.graphicsenv");
    190
    191        /**
    192         * <p>
    193         * The <code>java.awt.headless</code> System Property.
    194         * The value of this property is the String <code>"true"</code> or <code>"false"</code>.
    195         * </p>
    196         *
    197         * <p>
    198         * Defaults to <code>null</code> if the runtime does not have
    199         * security access to read this property or the property does not exist.
    200         * </p>
    201         *
    202         * <p>
    203         * This value is initialized when the class is loaded. If {@link System#setProperty(String,String)} or
    204         * {@link System#setProperties(java.util.Properties)} is called after this class is loaded, the value
    205         * will be out of sync with that System property.
    206         * </p>
    207         *
    208         * @see #isJavaAwtHeadless()
    209         * @since 2.1
    210         * @since Java 1.4
    211         */
    212        public static final String JAVA_AWT_HEADLESS = getSystemProperty("java.awt.headless");
    213
    214        /**
    215         * <p>
    216         * The <code>java.awt.printerjob</code> System Property.
    217         * </p>
    218         *
    219         * <p>
    220         * Defaults to <code>null</code> if the runtime does not have
    221         * security access to read this property or the property does not exist.
    222         * </p>
    223         *
    224         * <p>
    225         * This value is initialized when the class is loaded. If {@link System#setProperty(String,String)} or
    226         * {@link System#setProperties(java.util.Properties)} is called after this class is loaded, the value
    227         * will be out of sync with that System property.
    228         * </p>
    229         *
    230         * @since 2.1
    231         */
    232        public static final String JAVA_AWT_PRINTERJOB = getSystemProperty("java.awt.printerjob");
    233
    234        /**
    235         * <p>
    236         * The <code>java.class.path</code> System Property. Java class path.
    237         * </p>
    238         *
    239         * <p>
    240         * Defaults to <code>null</code> if the runtime does not have
    241         * security access to read this property or the property does not exist.
    242         * </p>
    243         *
    244         * <p>
    245         * This value is initialized when the class is loaded. If {@link System#setProperty(String,String)} or
    246         * {@link System#setProperties(java.util.Properties)} is called after this class is loaded, the value
    247         * will be out of sync with that System property.
    248         * </p>
    249         *
    250         * @since Java 1.1
    251         */
    252        public static final String JAVA_CLASS_PATH = getSystemProperty("java.class.path");
    253
    254        /**
    255         * <p>
    256         * The <code>java.class.version</code> System Property. Java class format version number.
    257         * </p>
    258         *
    259         * <p>
    260         * Defaults to <code>null</code> if the runtime does not have
    261         * security access to read this property or the property does not exist.
    262         * </p>
    263         *
    264         * <p>
    265         * This value is initialized when the class is loaded. If {@link System#setProperty(String,String)} or
    266         * {@link System#setProperties(java.util.Properties)} is called after this class is loaded, the value
    267         * will be out of sync with that System property.
    268         * </p>
    269         *
    270         * @since Java 1.1
    271         */
    272        public static final String JAVA_CLASS_VERSION = getSystemProperty("java.class.version");
    273
    274        /**
    275         * <p>
    276         * The <code>java.compiler</code> System Property. Name of JIT compiler to use.
    277         * First in JDK version 1.2. Not used in Sun JDKs after 1.2.
    278         * </p>
    279         *
    280         * <p>
    281         * Defaults to <code>null</code> if the runtime does not have
    282         * security access to read this property or the property does not exist.
    283         * </p>
    284         *
    285         * <p>
    286         * This value is initialized when the class is loaded. If {@link System#setProperty(String,String)} or
    287         * {@link System#setProperties(java.util.Properties)} is called after this class is loaded, the value
    288         * will be out of sync with that System property.
    289         * </p>
    290         *
    291         * @since Java 1.2. Not used in Sun versions after 1.2.
    292         */
    293        public static final String JAVA_COMPILER = getSystemProperty("java.compiler");
    294
    295        /**
    296         * <p>
    297         * The <code>java.endorsed.dirs</code> System Property. Path of endorsed directory or directories.
    298         * </p>
    299         *
    300         * <p>
    301         * Defaults to <code>null</code> if the runtime does not have
    302         * security access to read this property or the property does not exist.
    303         * </p>
    304         *
    305         * <p>
    306         * This value is initialized when the class is loaded. If {@link System#setProperty(String,String)} or
    307         * {@link System#setProperties(java.util.Properties)} is called after this class is loaded, the value
    308         * will be out of sync with that System property.
    309         * </p>
    310         *
    311         * @since Java 1.4
    312         */
    313        public static final String JAVA_ENDORSED_DIRS = getSystemProperty("java.endorsed.dirs");
    314
    315        /**
    316         * <p>
    317         * The <code>java.ext.dirs</code> System Property. Path of extension directory or directories.
    318         * </p>
    319         *
    320         * <p>
    321         * Defaults to <code>null</code> if the runtime does not have
    322         * security access to read this property or the property does not exist.
    323         * </p>
    324         *
    325         * <p>
    326         * This value is initialized when the class is loaded. If {@link System#setProperty(String,String)} or
    327         * {@link System#setProperties(java.util.Properties)} is called after this class is loaded, the value
    328         * will be out of sync with that System property.
    329         * </p>
    330         *
    331         * @since Java 1.3
    332         */
    333        public static final String JAVA_EXT_DIRS = getSystemProperty("java.ext.dirs");
    334
    335        /**
    336         * <p>
    337         * The <code>java.home</code> System Property. Java installation directory.
    338         * </p>
    339         *
    340         * <p>
    341         * Defaults to <code>null</code> if the runtime does not have
    342         * security access to read this property or the property does not exist.
    343         * </p>
    344         *
    345         * <p>
    346         * This value is initialized when the class is loaded. If {@link System#setProperty(String,String)} or
    347         * {@link System#setProperties(java.util.Properties)} is called after this class is loaded, the value
    348         * will be out of sync with that System property.
    349         * </p>
    350         *
    351         * @since Java 1.1
    352         */
    353        public static final String JAVA_HOME = getSystemProperty(JAVA_HOME_KEY);
    354
    355        /**
    356         * <p>
    357         * The <code>java.io.tmpdir</code> System Property. Default temp file path.
    358         * </p>
    359         *
    360         * <p>
    361         * Defaults to <code>null</code> if the runtime does not have
    362         * security access to read this property or the property does not exist.
    363         * </p>
    364         *
    365         * <p>
    366         * This value is initialized when the class is loaded. If {@link System#setProperty(String,String)} or
    367         * {@link System#setProperties(java.util.Properties)} is called after this class is loaded, the value
    368         * will be out of sync with that System property.
    369         * </p>
    370         *
    371         * @since Java 1.2
    372         */
    373        public static final String JAVA_IO_TMPDIR = getSystemProperty(JAVA_IO_TMPDIR_KEY);
    374
    375        /**
    376         * <p>
    377         * The <code>java.library.path</code> System Property. List of paths to search when loading libraries.
    378         * </p>
    379         *
    380         * <p>
    381         * Defaults to <code>null</code> if the runtime does not have
    382         * security access to read this property or the property does not exist.
    383         * </p>
    384         *
    385         * <p>
    386         * This value is initialized when the class is loaded. If {@link System#setProperty(String,String)} or
    387         * {@link System#setProperties(java.util.Properties)} is called after this class is loaded, the value
    388         * will be out of sync with that System property.
    389         * </p>
    390         *
    391         * @since Java 1.2
    392         */
    393        public static final String JAVA_LIBRARY_PATH = getSystemProperty("java.library.path");
    394
    395        /**
    396         * <p>
    397         * The <code>java.runtime.name</code> System Property. Java Runtime Environment name.
    398         * </p>
    399         *
    400         * <p>
    401         * Defaults to <code>null</code> if the runtime does not have
    402         * security access to read this property or the property does not exist.
    403         * </p>
    404         *
    405         * <p>
    406         * This value is initialized when the class is loaded. If {@link System#setProperty(String,String)} or
    407         * {@link System#setProperties(java.util.Properties)} is called after this class is loaded, the value
    408         * will be out of sync with that System property.
    409         * </p>
    410         *
    411         * @since 2.0
    412         * @since Java 1.3
    413         */
    414        public static final String JAVA_RUNTIME_NAME = getSystemProperty("java.runtime.name");
    415
    416        /**
    417         * <p>
    418         * The <code>java.runtime.version</code> System Property. Java Runtime Environment version.
    419         * </p>
    420         *
    421         * <p>
    422         * Defaults to <code>null</code> if the runtime does not have
    423         * security access to read this property or the property does not exist.
    424         * </p>
    425         *
    426         * <p>
    427         * This value is initialized when the class is loaded. If {@link System#setProperty(String,String)} or
    428         * {@link System#setProperties(java.util.Properties)} is called after this class is loaded, the value
    429         * will be out of sync with that System property.
    430         * </p>
    431         *
    432         * @since 2.0
    433         * @since Java 1.3
    434         */
    435        public static final String JAVA_RUNTIME_VERSION = getSystemProperty("java.runtime.version");
    436
    437        /**
    438         * <p>
    439         * The <code>java.specification.name</code> System Property. Java Runtime Environment specification name.
    440         * </p>
    441         *
    442         * <p>
    443         * Defaults to <code>null</code> if the runtime does not have
    444         * security access to read this property or the property does not exist.
    445         * </p>
    446         *
    447         * <p>
    448         * This value is initialized when the class is loaded. If {@link System#setProperty(String,String)} or
    449         * {@link System#setProperties(java.util.Properties)} is called after this class is loaded, the value
    450         * will be out of sync with that System property.
    451         * </p>
    452         *
    453         * @since Java 1.2
    454         */
    455        public static final String JAVA_SPECIFICATION_NAME = getSystemProperty("java.specification.name");
    456
    457        /**
    458         * <p>
    459         * The <code>java.specification.vendor</code> System Property. Java Runtime Environment specification vendor.
    460         * </p>
    461         *
    462         * <p>
    463         * Defaults to <code>null</code> if the runtime does not have
    464         * security access to read this property or the property does not exist.
    465         * </p>
    466         *
    467         * <p>
    468         * This value is initialized when the class is loaded. If {@link System#setProperty(String,String)} or
    469         * {@link System#setProperties(java.util.Properties)} is called after this class is loaded, the value
    470         * will be out of sync with that System property.
    471         * </p>
    472         *
    473         * @since Java 1.2
    474         */
    475        public static final String JAVA_SPECIFICATION_VENDOR = getSystemProperty("java.specification.vendor");
    476
    477        /**
    478         * <p>
    479         * The <code>java.specification.version</code> System Property. Java Runtime Environment specification version.
    480         * </p>
    481         *
    482         * <p>
    483         * Defaults to <code>null</code> if the runtime does not have
    484         * security access to read this property or the property does not exist.
    485         * </p>
    486         *
    487         * <p>
    488         * This value is initialized when the class is loaded. If {@link System#setProperty(String,String)} or
    489         * {@link System#setProperties(java.util.Properties)} is called after this class is loaded, the value
    490         * will be out of sync with that System property.
    491         * </p>
    492         *
    493         * @since Java 1.3
    494         */
    495        public static final String JAVA_SPECIFICATION_VERSION = getSystemProperty("java.specification.version");
    496
    497        /**
    498         * <p>
    499         * The <code>java.util.prefs.PreferencesFactory</code> System Property. A class name.
    500         * </p>
    501         *
    502         * <p>
    503         * Defaults to <code>null</code> if the runtime does not have
    504         * security access to read this property or the property does not exist.
    505         * </p>
    506         *
    507         * <p>
    508         * This value is initialized when the class is loaded. If {@link System#setProperty(String,String)} or
    509         * {@link System#setProperties(java.util.Properties)} is called after this class is loaded, the value
    510         * will be out of sync with that System property.
    511         * </p>
    512         *
    513         * @since 2.1
    514         * @since Java 1.4
    515         */
    516        public static final String JAVA_UTIL_PREFS_PREFERENCES_FACTORY =
    517            getSystemProperty("java.util.prefs.PreferencesFactory");
    518
    519        /**
    520         * <p>
    521         * The <code>java.vendor</code> System Property. Java vendor-specific string.
    522         * </p>
    523         *
    524         * <p>
    525         * Defaults to <code>null</code> if the runtime does not have
    526         * security access to read this property or the property does not exist.
    527         * </p>
    528         *
    529         * <p>
    530         * This value is initialized when the class is loaded. If {@link System#setProperty(String,String)} or
    531         * {@link System#setProperties(java.util.Properties)} is called after this class is loaded, the value
    532         * will be out of sync with that System property.
    533         * </p>
    534         *
    535         * @since Java 1.1
    536         */
    537        public static final String JAVA_VENDOR = getSystemProperty("java.vendor");
    538
    539        /**
    540         * <p>
    541         * The <code>java.vendor.url</code> System Property. Java vendor URL.
    542         * </p>
    543         *
    544         * <p>
    545         * Defaults to <code>null</code> if the runtime does not have
    546         * security access to read this property or the property does not exist.
    547         * </p>
    548         *
    549         * <p>
    550         * This value is initialized when the class is loaded. If {@link System#setProperty(String,String)} or
    551         * {@link System#setProperties(java.util.Properties)} is called after this class is loaded, the value
    552         * will be out of sync with that System property.
    553         * </p>
    554         *
    555         * @since Java 1.1
    556         */
    557        public static final String JAVA_VENDOR_URL = getSystemProperty("java.vendor.url");
    558
    559        /**
    560         * <p>
    561         * The <code>java.version</code> System Property. Java version number.
    562         * </p>
    563         *
    564         * <p>
    565         * Defaults to <code>null</code> if the runtime does not have
    566         * security access to read this property or the property does not exist.
    567         * </p>
    568         *
    569         * <p>
    570         * This value is initialized when the class is loaded. If {@link System#setProperty(String,String)} or
    571         * {@link System#setProperties(java.util.Properties)} is called after this class is loaded, the value
    572         * will be out of sync with that System property.
    573         * </p>
    574         *
    575         * @since Java 1.1
    576         */
    577        public static final String JAVA_VERSION = getSystemProperty("java.version");
    578
    579        /**
    580         * <p>
    581         * The <code>java.vm.info</code> System Property. Java Virtual Machine implementation info.
    582         * </p>
    583         *
    584         * <p>
    585         * Defaults to <code>null</code> if the runtime does not have
    586         * security access to read this property or the property does not exist.
    587         * </p>
    588         *
    589         * <p>
    590         * This value is initialized when the class is loaded. If {@link System#setProperty(String,String)} or
    591         * {@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 2.0
    596         * @since Java 1.2
    597         */
    598        public static final String JAVA_VM_INFO = getSystemProperty("java.vm.info");
    599
    600        /**
    601         * <p>
    602         * The <code>java.vm.name</code> System Property. Java Virtual Machine implementation name.
    603         * </p>
    604         *
    605         * <p>
    606         * Defaults to <code>null</code> if the runtime does not have
    607         * security access to read this property or the property does not exist.
    608         * </p>
    609         *
    610         * <p>
    611         * This value is initialized when the class is loaded. If {@link System#setProperty(String,String)} or
    612         * {@link System#setProperties(java.util.Properties)} is called after this class is loaded, the value
    613         * will be out of sync with that System property.
    614         * </p>
    615         *
    616         * @since Java 1.2
    617         */
    618        public static final String JAVA_VM_NAME = getSystemProperty("java.vm.name");
    619
    620        /**
    621         * <p>
    622         * The <code>java.vm.specification.name</code> System Property. Java Virtual Machine specification name.
    623         * </p>
    624         *
    625         * <p>
    626         * Defaults to <code>null</code> if the runtime does not have
    627         * security access to read this property or the property does not exist.
    628         * </p>
    629         *
    630         * <p>
    631         * This value is initialized when the class is loaded. If {@link System#setProperty(String,String)} or
    632         * {@link System#setProperties(java.util.Properties)} is called after this class is loaded, the value
    633         * will be out of sync with that System property.
    634         * </p>
    635         *
    636         * @since Java 1.2
    637         */
    638        public static final String JAVA_VM_SPECIFICATION_NAME = getSystemProperty("java.vm.specification.name");
    639
    640        /**
    641         * <p>
    642         * The <code>java.vm.specification.vendor</code> System Property. Java Virtual Machine specification vendor.
    643         * </p>
    644         *
    645         * <p>
    646         * Defaults to <code>null</code> if the runtime does not have
    647         * security access to read this property or the property does not exist.
    648         * </p>
    649         *
    650         * <p>
    651         * This value is initialized when the class is loaded. If {@link System#setProperty(String,String)} or
    652         * {@link System#setProperties(java.util.Properties)} is called after this class is loaded, the value
    653         * will be out of sync with that System property.
    654         * </p>
    655         *
    656         * @since Java 1.2
    657         */
    658        public static final String JAVA_VM_SPECIFICATION_VENDOR = getSystemProperty("java.vm.specification.vendor");
    659
    660        /**
    661         * <p>
    662         * The <code>java.vm.specification.version</code> System Property. Java Virtual Machine specification version.
    663         * </p>
    664         *
    665         * <p>
    666         * Defaults to <code>null</code> if the runtime does not have
    667         * security access to read this property or the property does not exist.
    668         * </p>
    669         *
    670         * <p>
    671         * This value is initialized when the class is loaded. If {@link System#setProperty(String,String)} or
    672         * {@link System#setProperties(java.util.Properties)} is called after this class is loaded, the value
    673         * will be out of sync with that System property.
    674         * </p>
    675         *
    676         * @since Java 1.2
    677         */
    678        public static final String JAVA_VM_SPECIFICATION_VERSION = getSystemProperty("java.vm.specification.version");
    679
    680        /**
    681         * <p>
    682         * The <code>java.vm.vendor</code> System Property. Java Virtual Machine implementation vendor.
    683         * </p>
    684         *
    685         * <p>
    686         * Defaults to <code>null</code> if the runtime does not have
    687         * security access to read this property or the property does not exist.
    688         * </p>
    689         *
    690         * <p>
    691         * This value is initialized when the class is loaded. If {@link System#setProperty(String,String)} or
    692         * {@link System#setProperties(java.util.Properties)} is called after this class is loaded, the value
    693         * will be out of sync with that System property.
    694         * </p>
    695         *
    696         * @since Java 1.2
    697         */
    698        public static final String JAVA_VM_VENDOR = getSystemProperty("java.vm.vendor");
    699
    700        /**
    701         * <p>
    702         * The <code>java.vm.version</code> System Property. Java Virtual Machine implementation version.
    703         * </p>
    704         *
    705         * <p>
    706         * Defaults to <code>null</code> if the runtime does not have
    707         * security access to read this property or the property does not exist.
    708         * </p>
    709         *
    710         * <p>
    711         * This value is initialized when the class is loaded. If {@link System#setProperty(String,String)} or
    712         * {@link System#setProperties(java.util.Properties)} is called after this class is loaded, the value
    713         * will be out of sync with that System property.
    714         * </p>
    715         *
    716         * @since Java 1.2
    717         */
    718        public static final String JAVA_VM_VERSION = getSystemProperty("java.vm.version");
    719
    720        /**
    721         * <p>
    722         * The <code>line.separator</code> System Property. Line separator (<code>&quot;\n&quot;</code> on UNIX).
    723         * </p>
    724         *
    725         * <p>
    726         * Defaults to <code>null</code> if the runtime does not have
    727         * security access to read this property or the property does not exist.
    728         * </p>
    729         *
    730         * <p>
    731         * This value is initialized when the class is loaded. If {@link System#setProperty(String,String)} or
    732         * {@link System#setProperties(java.util.Properties)} is called after this class is loaded, the value
    733         * will be out of sync with that System property.
    734         * </p>
    735         *
    736         * @since Java 1.1
    737         */
    738        public static final String LINE_SEPARATOR = getSystemProperty("line.separator");
    739
    740        /**
    741         * <p>
    742         * The <code>os.arch</code> System Property. Operating system architecture.
    743         * </p>
    744         *
    745         * <p>
    746         * Defaults to <code>null</code> if the runtime does not have
    747         * security access to read this property or the property does not exist.
    748         * </p>
    749         *
    750         * <p>
    751         * This value is initialized when the class is loaded. If {@link System#setProperty(String,String)} or
    752         * {@link System#setProperties(java.util.Properties)} is called after this class is loaded, the value
    753         * will be out of sync with that System property.
    754         * </p>
    755         *
    756         * @since Java 1.1
    757         */
    758        public static final String OS_ARCH = getSystemProperty("os.arch");
    759
    760        /**
    761         * <p>
    762         * The <code>os.name</code> System Property. Operating system name.
    763         * </p>
    764         *
    765         * <p>
    766         * Defaults to <code>null</code> if the runtime does not have
    767         * security access to read this property or the property does not exist.
    768         * </p>
    769         *
    770         * <p>
    771         * This value is initialized when the class is loaded. If {@link System#setProperty(String,String)} or
    772         * {@link System#setProperties(java.util.Properties)} is called after this class is loaded, the value
    773         * will be out of sync with that System property.
    774         * </p>
    775         *
    776         * @since Java 1.1
    777         */
    778        public static final String OS_NAME = getSystemProperty("os.name");
    779
    780        /**
    781         * <p>
    782         * The <code>os.version</code> System Property. Operating system version.
    783         * </p>
    784         *
    785         * <p>
    786         * Defaults to <code>null</code> if the runtime does not have
    787         * security access to read this property or the property does not exist.
    788         * </p>
    789         *
    790         * <p>
    791         * This value is initialized when the class is loaded. If {@link System#setProperty(String,String)} or
    792         * {@link System#setProperties(java.util.Properties)} is called after this class is loaded, the value
    793         * will be out of sync with that System property.
    794         * </p>
    795         *
    796         * @since Java 1.1
    797         */
    798        public static final String OS_VERSION = getSystemProperty("os.version");
    799
    800        /**
    801         * <p>
    802         * The <code>path.separator</code> System Property. Path separator (<code>&quot;:&quot;</code> on UNIX).
    803         * </p>
    804         *
    805         * <p>
    806         * Defaults to <code>null</code> if the runtime does not have
    807         * security access to read this property or the property does not exist.
    808         * </p>
    809         *
    810         * <p>
    811         * This value is initialized when the class is loaded. If {@link System#setProperty(String,String)} or
    812         * {@link System#setProperties(java.util.Properties)} is called after this class is loaded, the value
    813         * will be out of sync with that System property.
    814         * </p>
    815         *
    816         * @since Java 1.1
    817         */
    818        public static final String PATH_SEPARATOR = getSystemProperty("path.separator");
    819
    820        /**
    821         * <p>
    822         * The <code>user.country</code> or <code>user.region</code> System Property.
    823         * User's country code, such as <code>GB</code>. First in
    824         * Java version 1.2 as <code>user.region</code>. Renamed to <code>user.country</code> in 1.4
    825         * </p>
    826         *
    827         * <p>
    828         * Defaults to <code>null</code> if the runtime does not have
    829         * security access to read this property or the property does not exist.
    830         * </p>
    831         *
    832         * <p>
    833         * This value is initialized when the class is loaded. If {@link System#setProperty(String,String)} or
    834         * {@link System#setProperties(java.util.Properties)} is called after this class is loaded, the value
    835         * will be out of sync with that System property.
    836         * </p>
    837         *
    838         * @since 2.0
    839         * @since Java 1.2
    840         */
    841        public static final String USER_COUNTRY =
    842            getSystemProperty("user.country") == null ?
    843                getSystemProperty("user.region") : getSystemProperty("user.country");
    844
    845        /**
    846         * <p>
    847         * The <code>user.dir</code> System Property. User's current working directory.
    848         * </p>
    849         *
    850         * <p>
    851         * Defaults to <code>null</code> if the runtime does not have
    852         * security access to read this property or the property does not exist.
    853         * </p>
    854         *
    855         * <p>
    856         * This value is initialized when the class is loaded. If {@link System#setProperty(String,String)} or
    857         * {@link System#setProperties(java.util.Properties)} is called after this class is loaded, the value
    858         * will be out of sync with that System property.
    859         * </p>
    860         *
    861         * @since Java 1.1
    862         */
    863        public static final String USER_DIR = getSystemProperty(USER_DIR_KEY);
    864
    865        /**
    866         * <p>
    867         * The <code>user.home</code> System Property. User's home directory.
    868         * </p>
    869         *
    870         * <p>
    871         * Defaults to <code>null</code> if the runtime does not have
    872         * security access to read this property or the property does not exist.
    873         * </p>
    874         *
    875         * <p>
    876         * This value is initialized when the class is loaded. If {@link System#setProperty(String,String)} or
    877         * {@link System#setProperties(java.util.Properties)} is called after this class is loaded, the value
    878         * will be out of sync with that System property.
    879         * </p>
    880         *
    881         * @since Java 1.1
    882         */
    883        public static final String USER_HOME = getSystemProperty(USER_HOME_KEY);
    884
    885        /**
    886         * <p>
    887         * The <code>user.language</code> System Property. User's language code, such as <code>"en"</code>.
    888         * </p>
    889         *
    890         * <p>
    891         * Defaults to <code>null</code> if the runtime does not have
    892         * security access to read this property or the property does not exist.
    893         * </p>
    894         *
    895         * <p>
    896         * This value is initialized when the class is loaded. If {@link System#setProperty(String,String)} or
    897         * {@link System#setProperties(java.util.Properties)} is called after this class is loaded, the value
    898         * will be out of sync with that System property.
    899         * </p>
    900         *
    901         * @since 2.0
    902         * @since Java 1.2
    903         */
    904        public static final String USER_LANGUAGE = getSystemProperty("user.language");
    905
    906        /**
    907         * <p>
    908         * The <code>user.name</code> System Property. User's account name.
    909         * </p>
    910         *
    911         * <p>
    912         * Defaults to <code>null</code> if the runtime does not have
    913         * security access to read this property or the property does not exist.
    914         * </p>
    915         *
    916         * <p>
    917         * This value is initialized when the class is loaded. If {@link System#setProperty(String,String)} or
    918         * {@link System#setProperties(java.util.Properties)} is called after this class is loaded, the value
    919         * will be out of sync with that System property.
    920         * </p>
    921         *
    922         * @since Java 1.1
    923         */
    924        public static final String USER_NAME = getSystemProperty("user.name");
    925
    926        /**
    927         * <p>
    928         * The <code>user.timezone</code> System Property. For example: <code>"America/Los_Angeles"</code>.
    929         * </p>
    930         *
    931         * <p>
    932         * Defaults to <code>null</code> if the runtime does not have
    933         * security access to read this property or the property does not exist.
    934         * </p>
    935         *
    936         * <p>
    937         * This value is initialized when the class is loaded. If {@link System#setProperty(String,String)} or
    938         * {@link System#setProperties(java.util.Properties)} is called after this class is loaded, the value
    939         * will be out of sync with that System property.
    940         * </p>
    941         *
    942         * @since 2.1
    943         */
    944        public static final String USER_TIMEZONE = getSystemProperty("user.timezone");
    945
    946        // Java version
    947        // -----------------------------------------------------------------------
    948        // This MUST be declared after those above as it depends on the
    949        // values being set up
    950
    951        /**
    952         * <p>
    953         * Gets the Java version as a <code>String</code> trimming leading letters.
    954         * </p>
    955         *
    956         * <p>
    957         * The field will return <code>null</code> if {@link #JAVA_VERSION} is <code>null</code>.
    958         * </p>
    959         *
    960         * @since 2.1
    961         */
    962        public static final String JAVA_VERSION_TRIMMED = getJavaVersionTrimmed();
    963
    964        // Java version values
    965        // -----------------------------------------------------------------------
    966        // These MUST be declared after the trim above as they depend on the
    967        // value being set up
    968
    969        /**
    970         * <p>
    971         * Gets the Java version as a <code>float</code>.
    972         * </p>
    973         *
    974         * <p>
    975         * Example return values:
    976         * </p>
    977         * <ul>
    978         * <li><code>1.2f</code> for Java 1.2
    979         * <li><code>1.31f</code> for Java 1.3.1
    980         * </ul>
    981         *
    982         * <p>
    983         * The field will return zero if {@link #JAVA_VERSION} is <code>null</code>.
    984         * </p>
    985         *
    986         * @since 2.0
    987         */
    988        public static final float JAVA_VERSION_FLOAT = getJavaVersionAsFloat();
    989
    990        /**
    991         * <p>
    992         * Gets the Java version as an <code>int</code>.
    993         * </p>
    994         *
    995         * <p>
    996         * Example return values:
    997         * </p>
    998         * <ul>
    999         * <li><code>120</code> for Java 1.2
    1000         * <li><code>131</code> for Java 1.3.1
    1001         * </ul>
    1002         *
    1003         * <p>
    1004         * The field will return zero if {@link #JAVA_VERSION} is <code>null</code>.
    1005         * </p>
    1006         *
    1007         * @since 2.0
    1008         */
    1009        public static final int JAVA_VERSION_INT = getJavaVersionAsInt();
    1010
    1011        // Java version checks
    1012        // -----------------------------------------------------------------------
    1013        // These MUST be declared after those above as they depend on the
    1014        // values being set up
    1015
    1016        /**
    1017         * <p>
    1018         * Is <code>true</code> if this is Java version 1.1 (also 1.1.x versions).
    1019         * </p>
    1020         *
    1021         * <p>
    1022         * The field will return <code>false</code> if {@link #JAVA_VERSION} is <code>null</code>.
    1023         * </p>
    1024         */
    1025        public static final boolean IS_JAVA_1_1 = getJavaVersionMatches("1.1");
    1026
    1027        /**
    1028         * <p>
    1029         * Is <code>true</code> if this is Java version 1.2 (also 1.2.x versions).
    1030         * </p>
    1031         *
    1032         * <p>
    1033         * The field will return <code>false</code> if {@link #JAVA_VERSION} is <code>null</code>.
    1034         * </p>
    1035         */
    1036        public static final boolean IS_JAVA_1_2 = getJavaVersionMatches("1.2");
    1037
    1038        /**
    1039         * <p>
    1040         * Is <code>true</code> if this is Java version 1.3 (also 1.3.x versions).
    1041         * </p>
    1042         *
    1043         * <p>
    1044         * The field will return <code>false</code> if {@link #JAVA_VERSION} is <code>null</code>.
    1045         * </p>
    1046         */
    1047        public static final boolean IS_JAVA_1_3 = getJavaVersionMatches("1.3");
    1048
    1049        /**
    1050         * <p>
    1051         * Is <code>true</code> if this is Java version 1.4 (also 1.4.x versions).
    1052         * </p>
    1053         *
    1054         * <p>
    1055         * The field will return <code>false</code> if {@link #JAVA_VERSION} is <code>null</code>.
    1056         * </p>
    1057         */
    1058        public static final boolean IS_JAVA_1_4 = getJavaVersionMatches("1.4");
    1059
    1060        /**
    1061         * <p>
    1062         * Is <code>true</code> if this is Java version 1.5 (also 1.5.x versions).
    1063         * </p>
    1064         *
    1065         * <p>
    1066         * The field will return <code>false</code> if {@link #JAVA_VERSION} is <code>null</code>.
    1067         * </p>
    1068         */
    1069        public static final boolean IS_JAVA_1_5 = getJavaVersionMatches("1.5");
    1070
    1071        /**
    1072         * <p>
    1073         * Is <code>true</code> if this is Java version 1.6 (also 1.6.x versions).
    1074         * </p>
    1075         *
    1076         * <p>
    1077         * The field will return <code>false</code> if {@link #JAVA_VERSION} is <code>null</code>.
    1078         * </p>
    1079         */
    1080        public static final boolean IS_JAVA_1_6 = getJavaVersionMatches("1.6");
    1081
    1082        /**
    1083         * <p>
    1084         * Is <code>true</code> if this is Java version 1.7 (also 1.7.x versions).
    1085         * </p>
    1086         *
    1087         * <p>
    1088         * The field will return <code>false</code> if {@link #JAVA_VERSION} is <code>null</code>.
    1089         * </p>
    1090         *
    1091         * @since 2.5
    1092         */
    1093        public static final boolean IS_JAVA_1_7 = getJavaVersionMatches("1.7");
    1094
    1095        // Operating system checks
    1096        // -----------------------------------------------------------------------
    1097        // These MUST be declared after those above as they depend on the
    1098        // values being set up
    1099        // OS names from http://www.vamphq.com/os.html
    1100        // Selected ones included - please advise dev@commons.apache.org
    1101        // if you want another added or a mistake corrected
    1102
    1103        /**
    1104         * <p>
    1105         * Is <code>true</code> if this is AIX.
    1106         * </p>
    1107         *
    1108         * <p>
    1109         * The field will return <code>false</code> if <code>OS_NAME</code> is <code>null</code>.
    1110         * </p>
    1111         *
    1112         * @since 2.0
    1113         */
    1114        public static final boolean IS_OS_AIX = getOSMatchesName("AIX");
    1115
    1116        /**
    1117         * <p>
    1118         * Is <code>true</code> if this is HP-UX.
    1119         * </p>
    1120         *
    1121         * <p>
    1122         * The field will return <code>false</code> if <code>OS_NAME</code> is <code>null</code>.
    1123         * </p>
    1124         *
    1125         * @since 2.0
    1126         */
    1127        public static final boolean IS_OS_HP_UX = getOSMatchesName("HP-UX");
    1128
    1129        /**
    1130         * <p>
    1131         * Is <code>true</code> if this is Irix.
    1132         * </p>
    1133         *
    1134         * <p>
    1135         * The field will return <code>false</code> if <code>OS_NAME</code> is <code>null</code>.
    1136         * </p>
    1137         *
    1138         * @since 2.0
    1139         */
    1140        public static final boolean IS_OS_IRIX = getOSMatchesName("Irix");
    1141
    1142        /**
    1143         * <p>
    1144         * Is <code>true</code> if this is Linux.
    1145         * </p>
    1146         *
    1147         * <p>
    1148         * The field will return <code>false</code> if <code>OS_NAME</code> is <code>null</code>.
    1149         * </p>
    1150         *
    1151         * @since 2.0
    1152         */
    1153        public static final boolean IS_OS_LINUX = getOSMatchesName("Linux") || getOSMatchesName("LINUX");
    1154
    1155        /**
    1156         * <p>
    1157         * Is <code>true</code> if this is Mac.
    1158         * </p>
    1159         *
    1160         * <p>
    1161         * The field will return <code>false</code> if <code>OS_NAME</code> is <code>null</code>.
    1162         * </p>
    1163         *
    1164         * @since 2.0
    1165         */
    1166        public static final boolean IS_OS_MAC = getOSMatchesName("Mac");
    1167
    1168        /**
    1169         * <p>
    1170         * Is <code>true</code> if this is Mac.
    1171         * </p>
    1172         *
    1173         * <p>
    1174         * The field will return <code>false</code> if <code>OS_NAME</code> is <code>null</code>.
    1175         * </p>
    1176         *
    1177         * @since 2.0
    1178         */
    1179        public static final boolean IS_OS_MAC_OSX = getOSMatchesName("Mac OS X");
    1180
    1181        /**
    1182         * <p>
    1183         * Is <code>true</code> if this is OS/2.
    1184         * </p>
    1185         *
    1186         * <p>
    1187         * The field will return <code>false</code> if <code>OS_NAME</code> is <code>null</code>.
    1188         * </p>
    1189         *
    1190         * @since 2.0
    1191         */
    1192        public static final boolean IS_OS_OS2 = getOSMatchesName("OS/2");
    1193
    1194        /**
    1195         * <p>
    1196         * Is <code>true</code> if this is Solaris.
    1197         * </p>
    1198         *
    1199         * <p>
    1200         * The field will return <code>false</code> if <code>OS_NAME</code> is <code>null</code>.
    1201         * </p>
    1202         *
    1203         * @since 2.0
    1204         */
    1205        public static final boolean IS_OS_SOLARIS = getOSMatchesName("Solaris");
    1206
    1207        /**
    1208         * <p>
    1209         * Is <code>true</code> if this is SunOS.
    1210         * </p>
    1211         *
    1212         * <p>
    1213         * The field will return <code>false</code> if <code>OS_NAME</code> is <code>null</code>.
    1214         * </p>
    1215         *
    1216         * @since 2.0
    1217         */
    1218        public static final boolean IS_OS_SUN_OS = getOSMatchesName("SunOS");
    1219
    1220        /**
    1221         * <p>
    1222         * Is <code>true</code> if this is a UNIX like system,
    1223         * as in any of AIX, HP-UX, Irix, Linux, MacOSX, Solaris or SUN OS.
    1224         * </p>
    1225         *
    1226         * <p>
    1227         * The field will return <code>false</code> if <code>OS_NAME</code> is <code>null</code>.
    1228         * </p>
    1229         *
    1230         * @since 2.1
    1231         */
    1232        public static final boolean IS_OS_UNIX =
    1233            IS_OS_AIX || IS_OS_HP_UX || IS_OS_IRIX || IS_OS_LINUX ||
    1234            IS_OS_MAC_OSX || IS_OS_SOLARIS || IS_OS_SUN_OS;
    1235
    1236        /**
    1237         * <p>
    1238         * Is <code>true</code> if this is Windows.
    1239         * </p>
    1240         *
    1241         * <p>
    1242         * The field will return <code>false</code> if <code>OS_NAME</code> is <code>null</code>.
    1243         * </p>
    1244         *
    1245         * @since 2.0
    1246         */
    1247        public static final boolean IS_OS_WINDOWS = getOSMatchesName(OS_NAME_WINDOWS_PREFIX);
    1248
    1249        /**
    1250         * <p>
    1251         * Is <code>true</code> if this is Windows 2000.
    1252         * </p>
    1253         *
    1254         * <p>
    1255         * The field will return <code>false</code> if <code>OS_NAME</code> is <code>null</code>.
    1256         * </p>
    1257         *
    1258         * @since 2.0
    1259         */
    1260        public static final boolean IS_OS_WINDOWS_2000 = getOSMatches(OS_NAME_WINDOWS_PREFIX, "5.0");
    1261
    1262        /**
    1263         * <p>
    1264         * Is <code>true</code> if this is Windows 95.
    1265         * </p>
    1266         *
    1267         * <p>
    1268         * The field will return <code>false</code> if <code>OS_NAME</code> is <code>null</code>.
    1269         * </p>
    1270         *
    1271         * @since 2.0
    1272         */
    1273        public static final boolean IS_OS_WINDOWS_95 = getOSMatches(OS_NAME_WINDOWS_PREFIX + " 9", "4.0");
    1274        // Java 1.2 running on Windows98 returns 'Windows 95', hence the above
    1275
    1276        /**
    1277         * <p>
    1278         * Is <code>true</code> if this is Windows 98.
    1279         * </p>
    1280         *
    1281         * <p>
    1282         * The field will return <code>false</code> if <code>OS_NAME</code> is <code>null</code>.
    1283         * </p>
    1284         *
    1285         * @since 2.0
    1286         */
    1287        public static final boolean IS_OS_WINDOWS_98 = getOSMatches(OS_NAME_WINDOWS_PREFIX + " 9", "4.1");
    1288        // Java 1.2 running on Windows98 returns 'Windows 95', hence the above
    1289
    1290        /**
    1291         * <p>
    1292         * Is <code>true</code> if this is Windows ME.
    1293         * </p>
    1294         *
    1295         * <p>
    1296         * The field will return <code>false</code> if <code>OS_NAME</code> is <code>null</code>.
    1297         * </p>
    1298         *
    1299         * @since 2.0
    1300         */
    1301        public static final boolean IS_OS_WINDOWS_ME = getOSMatches(OS_NAME_WINDOWS_PREFIX, "4.9");
    1302        // Java 1.2 running on WindowsME may return 'Windows 95', hence the above
    1303
    1304        /**
    1305         * <p>
    1306         * Is <code>true</code> if this is Windows NT.
    1307         * </p>
    1308         *
    1309         * <p>
    1310         * The field will return <code>false</code> if <code>OS_NAME</code> is <code>null</code>.
    1311         * </p>
    1312         *
    1313         * @since 2.0
    1314         */
    1315        public static final boolean IS_OS_WINDOWS_NT = getOSMatchesName(OS_NAME_WINDOWS_PREFIX + " NT");
    1316        // Windows 2000 returns 'Windows 2000' but may suffer from same Java1.2 problem
    1317
    1318        /**
    1319         * <p>
    1320         * Is <code>true</code> if this is Windows XP.
    1321         * </p>
    1322         *
    1323         * <p>
    1324         * The field will return <code>false</code> if <code>OS_NAME</code> is <code>null</code>.
    1325         * </p>
    1326         *
    1327         * @since 2.0
    1328         */
    1329        public static final boolean IS_OS_WINDOWS_XP = getOSMatches(OS_NAME_WINDOWS_PREFIX, "5.1");
    1330
    1331        // -----------------------------------------------------------------------
    1332        /**
    1333         * <p>
    1334         * Is <code>true</code> if this is Windows Vista.
    1335         * </p>
    1336         *
    1337         * <p>
    1338         * The field will return <code>false</code> if <code>OS_NAME</code> is <code>null</code>.
    1339         * </p>
    1340         *
    1341         * @since 2.4
    1342         */
    1343        public static final boolean IS_OS_WINDOWS_VISTA = getOSMatches(OS_NAME_WINDOWS_PREFIX, "6.0");
    1344
    1345        /**
    1346         * <p>
    1347         * Is <code>true</code> if this is Windows 7.
    1348         * </p>
    1349         *
    1350         * <p>
    1351         * The field will return <code>false</code> if <code>OS_NAME</code> is <code>null</code>.
    1352         * </p>
    1353         *
    1354         * @since 2.5
    1355         */
    1356        public static final boolean IS_OS_WINDOWS_7 = getOSMatches(OS_NAME_WINDOWS_PREFIX, "6.1");
    1357
    1358        /**
    1359         * <p>
    1360         * Gets the Java home directory as a <code>File</code>.
    1361         * </p>
    1362         *
    1363         * @return a directory
    1364         * @throws SecurityException if a security manager exists and its
    1365         * <code>checkPropertyAccess</code> method doesn't allow access to the specified system property.
    1366         * @see System#getProperty(String)
    1367         * @since 2.1
    1368         */
    1369        public static File getJavaHome() {
    1370            return new File(System.getProperty(JAVA_HOME_KEY));
    1371        }
    1372
    1373        /**
    1374         * <p>
    1375         * Gets the Java IO temporary directory as a <code>File</code>.
    1376         * </p>
    1377         *
    1378         * @return a directory
    1379         * @throws SecurityException if a security manager exists and its
    1380         * <code>checkPropertyAccess</code> method doesn't allow access to the specified system
    1381         *             property.
    1382         * @see System#getProperty(String)
    1383         * @since 2.1
    1384         */
    1385        public static File getJavaIoTmpDir() {
    1386            return new File(System.getProperty(JAVA_IO_TMPDIR_KEY));
    1387        }
    1388
    1389        /**
    1390         * <p>Gets the Java version number as a <code>float</code>.</p>
    1391         *
    1392         * <p>Example return values:</p>
    1393         * <ul>
    1394         *  <li><code>1.2f</code> for JDK 1.2
    1395         *  <li><code>1.31f</code> for JDK 1.3.1
    1396         * </ul>
    1397         *
    1398         * @return the version, for example 1.31f for JDK 1.3.1
    1399         * @deprecated Use {@link #JAVA_VERSION_FLOAT} instead.
    1400         *             Method will be removed in Commons Lang 3.0.
    1401         */
    1402        public static float getJavaVersion() {
    1403            return JAVA_VERSION_FLOAT;
    1404        }
    1405
    1406        /**
    1407         * <p>
    1408         * Gets the Java version number as a <code>float</code>.
    1409         * </p>
    1410         *
    1411         * <p>
    1412         * Example return values:
    1413         * </p>
    1414         * <ul>
    1415         * <li><code>1.2f</code> for Java 1.2</li>
    1416         * <li><code>1.31f</code> for Java 1.3.1</li>
    1417         * <li><code>1.6f</code> for Java 1.6.0_20</li>
    1418         * </ul>
    1419         *
    1420         * <p>
    1421         * Patch releases are not reported.
    1422         * </p>
    1423         *
    1424         * @return the version, for example 1.31f for Java 1.3.1
    1425         */
    1426        private static float getJavaVersionAsFloat() {
    1427            return toVersionFloat(toJavaVersionIntArray(SystemUtils.JAVA_VERSION, JAVA_VERSION_TRIM_SIZE));
    1428        }
    1429
    1430        /**
    1431         * <p>
    1432         * Gets the Java version number as an <code>int</code>.
    1433         * </p>
    1434         *
    1435         * <p>
    1436         * Example return values:
    1437         * </p>
    1438         * <ul>
    1439         * <li><code>120</code> for Java 1.2</li>
    1440         * <li><code>131</code> for Java 1.3.1</li>
    1441         * <li><code>160</code> for Java 1.6.0_20</li>
    1442         * </ul>
    1443         *
    1444         * <p>
    1445         * Patch releases are not reported.
    1446         * </p>
    1447         *
    1448         * @return the version, for example 131 for Java 1.3.1
    1449         */
    1450        private static int getJavaVersionAsInt() {
    1451            return toVersionInt(toJavaVersionIntArray(SystemUtils.JAVA_VERSION, JAVA_VERSION_TRIM_SIZE));
    1452        }
    1453
    1454        /**
    1455         * <p>
    1456         * Decides if the Java version matches.
    1457         * </p>
    1458         *
    1459         * @param versionPrefix
    1460         *            the prefix for the java version
    1461         * @return true if matches, or false if not or can't determine
    1462         */
    1463        private static boolean getJavaVersionMatches(String versionPrefix) {
    1464            return isJavaVersionMatch(JAVA_VERSION_TRIMMED, versionPrefix);
    1465        }
    1466
    1467        /**
    1468         * Trims the text of the java version to start with numbers.
    1469         *
    1470         * @return the trimmed java version
    1471         */
    1472        private static String getJavaVersionTrimmed() {
    1473            if (JAVA_VERSION != null) {
    1474                for (int i = 0; i < JAVA_VERSION.length(); i++) {
    1475                    char ch = JAVA_VERSION.charAt(i);
    1476                    if (ch >= '0' && ch <= '9') {
    1477                        return JAVA_VERSION.substring(i);
    1478                    }
    1479                }
    1480            }
    1481            return null;
    1482        }
    1483
    1484        /**
    1485         * Decides if the operating system matches.
    1486         *
    1487         * @param osNamePrefix
    1488         *            the prefix for the os name
    1489         * @param osVersionPrefix
    1490         *            the prefix for the version
    1491         * @return true if matches, or false if not or can't determine
    1492         */
    1493        private static boolean getOSMatches(String osNamePrefix, String osVersionPrefix) {
    1494            return isOSMatch(OS_NAME, OS_VERSION, osNamePrefix, osVersionPrefix);
    1495        }
    1496
    1497        /**
    1498         * Decides if the operating system matches.
    1499         *
    1500         * @param osNamePrefix
    1501         *            the prefix for the os name
    1502         * @return true if matches, or false if not or can't determine
    1503         */
    1504        private static boolean getOSMatchesName(String osNamePrefix) {
    1505            return isOSNameMatch(OS_NAME, osNamePrefix);
    1506        }
    1507
    1508        // -----------------------------------------------------------------------
    1509        /**
    1510         * <p>
    1511         * Gets a System property, defaulting to <code>null</code> if the property cannot be read.
    1512         * </p>
    1513         *
    1514         * <p>
    1515         * If a <code>SecurityException</code> is caught, the return value is <code>null</code> and a message is written to
    1516         * <code>System.err</code>.
    1517         * </p>
    1518         *
    1519         * @param property
    1520         *            the system property name
    1521         * @return the system property value or <code>null</code> if a security problem occurs
    1522         */
    1523        private static String getSystemProperty(String property) {
    1524            try {
    1525                return System.getProperty(property);
    1526            } catch (SecurityException ex) {
    1527                // we are not allowed to look at this property
    1528                System.err.println("Caught a SecurityException reading the system property '" + property
    1529                        + "'; the SystemUtils property value will default to null.");
    1530                return null;
    1531            }
    1532        }
    1533
    1534        /**
    1535         * <p>
    1536         * Gets the user directory as a <code>File</code>.
    1537         * </p>
    1538         *
    1539         * @return a directory
    1540         * @throws SecurityException if a security manager exists and its
    1541         * <code>checkPropertyAccess</code> method doesn't allow access to the specified system property.
    1542         * @see System#getProperty(String)
    1543         * @since 2.1
    1544         */
    1545        public static File getUserDir() {
    1546            return new File(System.getProperty(USER_DIR_KEY));
    1547        }
    1548
    1549        /**
    1550         * <p>
    1551         * Gets the user home directory as a <code>File</code>.
    1552         * </p>
    1553         *
    1554         * @return a directory
    1555         * @throws SecurityException if a security manager exists and its
    1556         * <code>checkPropertyAccess</code> method doesn't allow access to the specified system property.
    1557         * @see System#getProperty(String)
    1558         * @since 2.1
    1559         */
    1560        public static File getUserHome() {
    1561            return new File(System.getProperty(USER_HOME_KEY));
    1562        }
    1563
    1564        /**
    1565         * Returns whether the {@link #JAVA_AWT_HEADLESS} value is <code>true</code>.
    1566         *
    1567         * @return <code>true</code> if <code>JAVA_AWT_HEADLESS</code> is <code>"true"</code>, <code>false</code> otherwise.
    1568         *
    1569         * @see #JAVA_AWT_HEADLESS
    1570         * @since 2.1
    1571         * @since Java 1.4
    1572         */
    1573        public static boolean isJavaAwtHeadless() {
    1574            return JAVA_AWT_HEADLESS != null ? JAVA_AWT_HEADLESS.equals(Boolean.TRUE.toString()) : false;
    1575        }
    1576
    1577        /**
    1578         * <p>
    1579         * Is the Java version at least the requested version.
    1580         * </p>
    1581         *
    1582         * <p>
    1583         * Example input:
    1584         * </p>
    1585         * <ul>
    1586         * <li><code>1.2f</code> to test for Java 1.2</li>
    1587         * <li><code>1.31f</code> to test for Java 1.3.1</li>
    1588         * </ul>
    1589         *
    1590         * @param requiredVersion
    1591         *            the required version, for example 1.31f
    1592         * @return <code>true</code> if the actual version is equal or greater than the required version
    1593         */
    1594        public static boolean isJavaVersionAtLeast(float requiredVersion) {
    1595            return JAVA_VERSION_FLOAT >= requiredVersion;
    1596        }
    1597
    1598        /**
    1599         * <p>
    1600         * Is the Java version at least the requested version.
    1601         * </p>
    1602         *
    1603         * <p>
    1604         * Example input:
    1605         * </p>
    1606         * <ul>
    1607         * <li><code>120</code> to test for Java 1.2 or greater</li>
    1608         * <li><code>131</code> to test for Java 1.3.1 or greater</li>
    1609         * </ul>
    1610         *
    1611         * @param requiredVersion
    1612         *            the required version, for example 131
    1613         * @return <code>true</code> if the actual version is equal or greater than the required version
    1614         * @since 2.0
    1615         */
    1616        public static boolean isJavaVersionAtLeast(int requiredVersion) {
    1617            return JAVA_VERSION_INT >= requiredVersion;
    1618        }
    1619
    1620        /**
    1621         * <p>
    1622         * Decides if the Java version matches.
    1623         * </p>
    1624         * <p>
    1625         * This method is package private instead of private to support unit test invocation.
    1626         * </p>
    1627         *
    1628         * @param version
    1629         *            the actual Java version
    1630         * @param versionPrefix
    1631         *            the prefix for the expected Java version
    1632         * @return true if matches, or false if not or can't determine
    1633         */
    1634        static boolean isJavaVersionMatch(String version, String versionPrefix) {
    1635            if (version == null) {
    1636                return false;
    1637            }
    1638            return version.startsWith(versionPrefix);
    1639        }
    1640
    1641        /**
    1642         * Decides if the operating system matches.
    1643         * <p>
    1644         * This method is package private instead of private to support unit test invocation.
    1645         * </p>
    1646         *
    1647         * @param osName
    1648         *            the actual OS name
    1649         * @param osVersion
    1650         *            the actual OS version
    1651         * @param osNamePrefix
    1652         *            the prefix for the expected OS name
    1653         * @param osVersionPrefix
    1654         *            the prefix for the expected OS version
    1655         * @return true if matches, or false if not or can't determine
    1656         */
    1657        static boolean isOSMatch(String osName, String osVersion, String osNamePrefix, String osVersionPrefix) {
    1658            if (osName == null || osVersion == null) {
    1659                return false;
    1660            }
    1661            return osName.startsWith(osNamePrefix) && osVersion.startsWith(osVersionPrefix);
    1662        }
    1663
    1664        /**
    1665         * Decides if the operating system matches.
    1666         * <p>
    1667         * This method is package private instead of private to support unit test invocation.
    1668         * </p>
    1669         *
    1670         * @param osName
    1671         *            the actual OS name
    1672         * @param osNamePrefix
    1673         *            the prefix for the expected OS name
    1674         * @return true if matches, or false if not or can't determine
    1675         */
    1676        static boolean isOSNameMatch(String osName, String osNamePrefix) {
    1677            if (osName == null) {
    1678                return false;
    1679            }
    1680            return osName.startsWith(osNamePrefix);
    1681        }
    1682
    1683        /**
    1684         * <p>
    1685         * Converts the given Java version string to a <code>float</code>.
    1686         * </p>
    1687         *
    1688         * <p>
    1689         * Example return values:
    1690         * </p>
    1691         * <ul>
    1692         * <li><code>1.2f</code> for Java 1.2</li>
    1693         * <li><code>1.31f</code> for Java 1.3.1</li>
    1694         * <li><code>1.6f</code> for Java 1.6.0_20</li>
    1695         * </ul>
    1696         *
    1697         * <p>
    1698         * Patch releases are not reported.
    1699         * </p>
    1700         * <p>
    1701         * This method is package private instead of private to support unit test invocation.
    1702         * </p>
    1703         *
    1704         * @param version The string version
    1705         * @return the version, for example 1.31f for Java 1.3.1
    1706         */
    1707        static float toJavaVersionFloat(String version) {
    1708            return toVersionFloat(toJavaVersionIntArray(version, JAVA_VERSION_TRIM_SIZE));
    1709        }
    1710
    1711        /**
    1712         * <p>
    1713         * Converts the given Java version string to an <code>int</code>.
    1714         * </p>
    1715         *
    1716         * <p>
    1717         * Example return values:
    1718         * </p>
    1719         * <ul>
    1720         * <li><code>120</code> for Java 1.2</li>
    1721         * <li><code>131</code> for Java 1.3.1</li>
    1722         * <li><code>160</code> for Java 1.6.0_20</li>
    1723         * </ul>
    1724         *
    1725         * <p>
    1726         * Patch releases are not reported.
    1727         * </p>
    1728         * <p>
    1729         * This method is package private instead of private to support unit test invocation.
    1730         * </p>
    1731         *
    1732         * @param version The string version
    1733         * @return the version, for example 131 for Java 1.3.1
    1734         */
    1735        static int toJavaVersionInt(String version) {
    1736            return toVersionInt(toJavaVersionIntArray(version, JAVA_VERSION_TRIM_SIZE));
    1737        }
    1738
    1739        /**
    1740         * <p>
    1741         * Converts the given Java version string to an <code>int[]</code> of maximum size <code>3</code>.
    1742         * </p>
    1743         *
    1744         * <p>
    1745         * Example return values:
    1746         * </p>
    1747         * <ul>
    1748         * <li><code>[1, 2, 0]</code> for Java 1.2</li>
    1749         * <li><code>[1, 3, 1]</code> for Java 1.3.1</li>
    1750         * <li><code>[1, 5, 0]</code> for Java 1.5.0_21</li>
    1751         * </ul>
    1752         * <p>
    1753         * This method is package private instead of private to support unit test invocation.
    1754         * </p>
    1755         *
    1756         * @param version The string version
    1757         * @return the version, for example [1, 5, 0] for Java 1.5.0_21
    1758         */
    1759        static int[] toJavaVersionIntArray(String version) {
    1760            return toJavaVersionIntArray(version, Integer.MAX_VALUE);
    1761        }
    1762
    1763        /**
    1764         * <p>
    1765         * Converts the given Java version string to an <code>int[]</code> of maximum size <code>limit</code>.
    1766         * </p>
    1767         *
    1768         * <p>
    1769         * Example return values:
    1770         * </p>
    1771         * <ul>
    1772         * <li><code>[1, 2, 0]</code> for Java 1.2</li>
    1773         * <li><code>[1, 3, 1]</code> for Java 1.3.1</li>
    1774         * <li><code>[1, 5, 0, 21]</code> for Java 1.5.0_21</li>
    1775         * </ul>
    1776         *
    1777         * @param version The string version
    1778         * @param limit version limit
    1779         * @return the version, for example [1, 5, 0, 21] for Java 1.5.0_21
    1780         */
    1781        private static int[] toJavaVersionIntArray(String version, int limit) {
    1782            if (version == null) {
    1783                return ArrayUtils.EMPTY_INT_ARRAY;
    1784            }
    1785            String[] strings = StringUtils.split(version, "._- ");
    1786            int[] ints = new int[Math.min(limit, strings.length)];
    1787            int j = 0;
    1788            for (int i = 0; i < strings.length && j < limit; i++) {
    1789                String s = strings[i];
    1790                if (s.length() > 0) {
    1791                    try {
    1792                        ints[j] = Integer.parseInt(s);
    1793                        j++;
    1794                    } catch (Exception e) {
    1795                    }
    1796                }
    1797            }
    1798            if (ints.length > j) {
    1799                int[] newInts = new int[j];
    1800                System.arraycopy(ints, 0, newInts, 0, j);
    1801                ints = newInts;
    1802            }
    1803            return ints;
    1804        }
    1805
    1806        /**
    1807         * <p>
    1808         * Converts given the Java version array to a <code>float</code>.
    1809         * </p>
    1810         *
    1811         * <p>
    1812         * Example return values:
    1813         * </p>
    1814         * <ul>
    1815         * <li><code>1.2f</code> for Java 1.2</li>
    1816         * <li><code>1.31f</code> for Java 1.3.1</li>
    1817         * <li><code>1.6f</code> for Java 1.6.0_20</li>
    1818         * </ul>
    1819         *
    1820         * <p>
    1821         * Patch releases are not reported.
    1822         * </p>
    1823         *
    1824         * @param javaVersions The version numbers
    1825         * @return the version, for example 1.31f for Java 1.3.1
    1826         */
    1827        private static float toVersionFloat(int[] javaVersions) {
    1828            if (javaVersions == null || javaVersions.length == 0) {
    1829                return 0f;
    1830            }
    1831            if (javaVersions.length == 1) {
    1832                return javaVersions[0];
    1833            }
    1834            StringBuffer builder = new StringBuffer();
    1835            builder.append(javaVersions[0]);
    1836            builder.append('.');
    1837            for (int i = 1; i < javaVersions.length; i++) {
    1838                builder.append(javaVersions[i]);
    1839            }
    1840            try {
    1841                return Float.parseFloat(builder.toString());
    1842            } catch (Exception ex) {
    1843                return 0f;
    1844            }
    1845        }
    1846
    1847        /**
    1848         * <p>
    1849         * Converts given the Java version array to an <code>int</code>.
    1850         * </p>
    1851         *
    1852         * <p>
    1853         * Example return values:
    1854         * </p>
    1855         * <ul>
    1856         * <li><code>120</code> for Java 1.2</li>
    1857         * <li><code>131</code> for Java 1.3.1</li>
    1858         * <li><code>160</code> for Java 1.6.0_20</li>
    1859         * </ul>
    1860         *
    1861         * <p>
    1862         * Patch releases are not reported.
    1863         * </p>
    1864         *
    1865         * @param javaVersions The version numbers
    1866         * @return the version, for example 1.31f for Java 1.3.1
    1867         */
    1868        private static int toVersionInt(int[] javaVersions) {
    1869            if (javaVersions == null) {
    1870                return 0;
    1871            }
    1872            int intVersion = 0;
    1873            int len = javaVersions.length;
    1874            if (len >= 1) {
    1875                intVersion = javaVersions[0] * 100;
    1876            }
    1877            if (len >= 2) {
    1878                intVersion += javaVersions[1] * 10;
    1879            }
    1880            if (len >= 3) {
    1881                intVersion += javaVersions[2];
    1882            }
    1883            return intVersion;
    1884        }
    1885
    1886        // -----------------------------------------------------------------------
    1887        /**
    1888         * <p>
    1889         * SystemUtils instances should NOT be constructed in standard programming. Instead, the class should be used as
    1890         * <code>SystemUtils.FILE_SEPARATOR</code>.
    1891         * </p>
    1892         *
    1893         * <p>
    1894         * This constructor is public to permit tools that require a JavaBean instance to operate.
    1895         * </p>
    1896         */
    1897        public SystemUtils() {
    1898            super();
    1899        }
    1900
    1901    }