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