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