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 1199816 2011-11-09 16:11:34Z 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 FreeBSD. 1007 * </p> 1008 * <p> 1009 * The field will return {@code false} if {@code OS_NAME} is {@code null}. 1010 * </p> 1011 * 1012 * @since 3.1 1013 */ 1014 public static final boolean IS_OS_FREE_BSD = getOSMatchesName("FreeBSD"); 1015 1016 /** 1017 * <p> 1018 * Is {@code true} if this is OpenBSD. 1019 * </p> 1020 * <p> 1021 * The field will return {@code false} if {@code OS_NAME} is {@code null}. 1022 * </p> 1023 * 1024 * @since 3.1 1025 */ 1026 public static final boolean IS_OS_OPEN_BSD = getOSMatchesName("OpenBSD"); 1027 1028 /** 1029 * <p> 1030 * Is {@code true} if this is NetBSD. 1031 * </p> 1032 * <p> 1033 * The field will return {@code false} if {@code OS_NAME} is {@code null}. 1034 * </p> 1035 * 1036 * @since 3.1 1037 */ 1038 public static final boolean IS_OS_NET_BSD = getOSMatchesName("NetBSD"); 1039 1040 /** 1041 * <p> 1042 * Is {@code true} if this is OS/2. 1043 * </p> 1044 * <p> 1045 * The field will return {@code false} if {@code OS_NAME} is {@code null}. 1046 * </p> 1047 * 1048 * @since 2.0 1049 */ 1050 public static final boolean IS_OS_OS2 = getOSMatchesName("OS/2"); 1051 1052 /** 1053 * <p> 1054 * Is {@code true} if this is Solaris. 1055 * </p> 1056 * <p> 1057 * The field will return {@code false} if {@code OS_NAME} is {@code null}. 1058 * </p> 1059 * 1060 * @since 2.0 1061 */ 1062 public static final boolean IS_OS_SOLARIS = getOSMatchesName("Solaris"); 1063 1064 /** 1065 * <p> 1066 * Is {@code true} if this is SunOS. 1067 * </p> 1068 * <p> 1069 * The field will return {@code false} if {@code OS_NAME} is {@code null}. 1070 * </p> 1071 * 1072 * @since 2.0 1073 */ 1074 public static final boolean IS_OS_SUN_OS = getOSMatchesName("SunOS"); 1075 1076 /** 1077 * <p> 1078 * Is {@code true} if this is a UNIX like system, as in any of AIX, HP-UX, Irix, Linux, MacOSX, Solaris or SUN OS. 1079 * </p> 1080 * <p> 1081 * The field will return {@code false} if {@code OS_NAME} is {@code null}. 1082 * </p> 1083 * 1084 * @since 2.1 1085 */ 1086 public static final boolean IS_OS_UNIX = IS_OS_AIX || IS_OS_HP_UX || IS_OS_IRIX || IS_OS_LINUX || IS_OS_MAC_OSX 1087 || IS_OS_SOLARIS || IS_OS_SUN_OS || IS_OS_FREE_BSD || IS_OS_OPEN_BSD || IS_OS_NET_BSD; 1088 1089 /** 1090 * <p> 1091 * Is {@code true} if this is Windows. 1092 * </p> 1093 * <p> 1094 * The field will return {@code false} if {@code OS_NAME} is {@code null}. 1095 * </p> 1096 * 1097 * @since 2.0 1098 */ 1099 public static final boolean IS_OS_WINDOWS = getOSMatchesName(OS_NAME_WINDOWS_PREFIX); 1100 1101 /** 1102 * <p> 1103 * Is {@code true} if this is Windows 2000. 1104 * </p> 1105 * <p> 1106 * The field will return {@code false} if {@code OS_NAME} is {@code null}. 1107 * </p> 1108 * 1109 * @since 2.0 1110 */ 1111 public static final boolean IS_OS_WINDOWS_2000 = getOSMatches(OS_NAME_WINDOWS_PREFIX, "5.0"); 1112 1113 /** 1114 * <p> 1115 * Is {@code true} if this is Windows 2003. 1116 * </p> 1117 * <p> 1118 * The field will return {@code false} if {@code OS_NAME} is {@code null}. 1119 * </p> 1120 * 1121 * @since 3.1 1122 */ 1123 public static final boolean IS_OS_WINDOWS_2003 = getOSMatches(OS_NAME_WINDOWS_PREFIX, "5.2"); 1124 1125 /** 1126 * <p> 1127 * Is {@code true} if this is Windows 2008. 1128 * </p> 1129 * <p> 1130 * The field will return {@code false} if {@code OS_NAME} is {@code null}. 1131 * </p> 1132 * 1133 * @since 3.1 1134 */ 1135 public static final boolean IS_OS_WINDOWS_2008 = getOSMatches(OS_NAME_WINDOWS_PREFIX + " Server 2008", "6.1"); 1136 1137 /** 1138 * <p> 1139 * Is {@code true} if this is Windows 95. 1140 * </p> 1141 * <p> 1142 * The field will return {@code false} if {@code OS_NAME} is {@code null}. 1143 * </p> 1144 * 1145 * @since 2.0 1146 */ 1147 public static final boolean IS_OS_WINDOWS_95 = getOSMatches(OS_NAME_WINDOWS_PREFIX + " 9", "4.0"); 1148 // Java 1.2 running on Windows98 returns 'Windows 95', hence the above 1149 1150 /** 1151 * <p> 1152 * Is {@code true} if this is Windows 98. 1153 * </p> 1154 * <p> 1155 * The field will return {@code false} if {@code OS_NAME} is {@code null}. 1156 * </p> 1157 * 1158 * @since 2.0 1159 */ 1160 public static final boolean IS_OS_WINDOWS_98 = getOSMatches(OS_NAME_WINDOWS_PREFIX + " 9", "4.1"); 1161 // Java 1.2 running on Windows98 returns 'Windows 95', hence the above 1162 1163 /** 1164 * <p> 1165 * Is {@code true} if this is Windows ME. 1166 * </p> 1167 * <p> 1168 * The field will return {@code false} if {@code OS_NAME} is {@code null}. 1169 * </p> 1170 * 1171 * @since 2.0 1172 */ 1173 public static final boolean IS_OS_WINDOWS_ME = getOSMatches(OS_NAME_WINDOWS_PREFIX, "4.9"); 1174 // Java 1.2 running on WindowsME may return 'Windows 95', hence the above 1175 1176 /** 1177 * <p> 1178 * Is {@code true} if this is Windows NT. 1179 * </p> 1180 * <p> 1181 * The field will return {@code false} if {@code OS_NAME} is {@code null}. 1182 * </p> 1183 * 1184 * @since 2.0 1185 */ 1186 public static final boolean IS_OS_WINDOWS_NT = getOSMatchesName(OS_NAME_WINDOWS_PREFIX + " NT"); 1187 // Windows 2000 returns 'Windows 2000' but may suffer from same Java1.2 problem 1188 1189 /** 1190 * <p> 1191 * Is {@code true} if this is Windows XP. 1192 * </p> 1193 * <p> 1194 * The field will return {@code false} if {@code OS_NAME} is {@code null}. 1195 * </p> 1196 * 1197 * @since 2.0 1198 */ 1199 public static final boolean IS_OS_WINDOWS_XP = getOSMatches(OS_NAME_WINDOWS_PREFIX, "5.1"); 1200 1201 // ----------------------------------------------------------------------- 1202 /** 1203 * <p> 1204 * Is {@code true} if this is Windows Vista. 1205 * </p> 1206 * <p> 1207 * The field will return {@code false} if {@code OS_NAME} is {@code null}. 1208 * </p> 1209 * 1210 * @since 2.4 1211 */ 1212 public static final boolean IS_OS_WINDOWS_VISTA = getOSMatches(OS_NAME_WINDOWS_PREFIX, "6.0"); 1213 1214 /** 1215 * <p> 1216 * Is {@code true} if this is Windows 7. 1217 * </p> 1218 * <p> 1219 * The field will return {@code false} if {@code OS_NAME} is {@code null}. 1220 * </p> 1221 * 1222 * @since 3.0 1223 */ 1224 public static final boolean IS_OS_WINDOWS_7 = getOSMatches(OS_NAME_WINDOWS_PREFIX, "6.1"); 1225 1226 /** 1227 * <p> 1228 * Gets the Java home directory as a {@code File}. 1229 * </p> 1230 * 1231 * @return a directory 1232 * @throws SecurityException if a security manager exists and its {@code checkPropertyAccess} method doesn't allow 1233 * access to the specified system property. 1234 * @see System#getProperty(String) 1235 * @since 2.1 1236 */ 1237 public static File getJavaHome() { 1238 return new File(System.getProperty(JAVA_HOME_KEY)); 1239 } 1240 1241 /** 1242 * <p> 1243 * Gets the Java IO temporary directory as a {@code File}. 1244 * </p> 1245 * 1246 * @return a directory 1247 * @throws SecurityException if a security manager exists and its {@code checkPropertyAccess} method doesn't allow 1248 * access to the specified system property. 1249 * @see System#getProperty(String) 1250 * @since 2.1 1251 */ 1252 public static File getJavaIoTmpDir() { 1253 return new File(System.getProperty(JAVA_IO_TMPDIR_KEY)); 1254 } 1255 1256 /** 1257 * <p> 1258 * Decides if the Java version matches. 1259 * </p> 1260 * 1261 * @param versionPrefix the prefix for the java version 1262 * @return true if matches, or false if not or can't determine 1263 */ 1264 private static boolean getJavaVersionMatches(String versionPrefix) { 1265 return isJavaVersionMatch(JAVA_SPECIFICATION_VERSION, versionPrefix); 1266 } 1267 1268 /** 1269 * Decides if the operating system matches. 1270 * 1271 * @param osNamePrefix the prefix for the os name 1272 * @param osVersionPrefix the prefix for the version 1273 * @return true if matches, or false if not or can't determine 1274 */ 1275 private static boolean getOSMatches(String osNamePrefix, String osVersionPrefix) { 1276 return isOSMatch(OS_NAME, OS_VERSION, osNamePrefix, osVersionPrefix); 1277 } 1278 1279 /** 1280 * Decides if the operating system matches. 1281 * 1282 * @param osNamePrefix the prefix for the os name 1283 * @return true if matches, or false if not or can't determine 1284 */ 1285 private static boolean getOSMatchesName(String osNamePrefix) { 1286 return isOSNameMatch(OS_NAME, osNamePrefix); 1287 } 1288 1289 // ----------------------------------------------------------------------- 1290 /** 1291 * <p> 1292 * Gets a System property, defaulting to {@code null} if the property cannot be read. 1293 * </p> 1294 * <p> 1295 * If a {@code SecurityException} is caught, the return value is {@code null} and a message is written to 1296 * {@code System.err}. 1297 * </p> 1298 * 1299 * @param property the system property name 1300 * @return the system property value or {@code null} if a security problem occurs 1301 */ 1302 private static String getSystemProperty(String property) { 1303 try { 1304 return System.getProperty(property); 1305 } catch (SecurityException ex) { 1306 // we are not allowed to look at this property 1307 System.err.println("Caught a SecurityException reading the system property '" + property 1308 + "'; the SystemUtils property value will default to null."); 1309 return null; 1310 } 1311 } 1312 1313 /** 1314 * <p> 1315 * Gets the user directory as a {@code File}. 1316 * </p> 1317 * 1318 * @return a directory 1319 * @throws SecurityException if a security manager exists and its {@code checkPropertyAccess} method doesn't allow 1320 * access to the specified system property. 1321 * @see System#getProperty(String) 1322 * @since 2.1 1323 */ 1324 public static File getUserDir() { 1325 return new File(System.getProperty(USER_DIR_KEY)); 1326 } 1327 1328 /** 1329 * <p> 1330 * Gets the user home directory as a {@code File}. 1331 * </p> 1332 * 1333 * @return a directory 1334 * @throws SecurityException if a security manager exists and its {@code checkPropertyAccess} method doesn't allow 1335 * access to the specified system property. 1336 * @see System#getProperty(String) 1337 * @since 2.1 1338 */ 1339 public static File getUserHome() { 1340 return new File(System.getProperty(USER_HOME_KEY)); 1341 } 1342 1343 /** 1344 * Returns whether the {@link #JAVA_AWT_HEADLESS} value is {@code true}. 1345 * 1346 * @return {@code true} if {@code JAVA_AWT_HEADLESS} is {@code "true"}, {@code false} otherwise. 1347 * @see #JAVA_AWT_HEADLESS 1348 * @since 2.1 1349 * @since Java 1.4 1350 */ 1351 public static boolean isJavaAwtHeadless() { 1352 return JAVA_AWT_HEADLESS != null ? JAVA_AWT_HEADLESS.equals(Boolean.TRUE.toString()) : false; 1353 } 1354 1355 /** 1356 * <p> 1357 * Is the Java version at least the requested version. 1358 * </p> 1359 * <p> 1360 * Example input: 1361 * </p> 1362 * <ul> 1363 * <li>{@code 1.2f} to test for Java 1.2</li> 1364 * <li>{@code 1.31f} to test for Java 1.3.1</li> 1365 * </ul> 1366 * 1367 * @param requiredVersion the required version, for example 1.31f 1368 * @return {@code true} if the actual version is equal or greater than the required version 1369 */ 1370 public static boolean isJavaVersionAtLeast(JavaVersion requiredVersion) { 1371 return JAVA_SPECIFICATION_VERSION_AS_ENUM.atLeast(requiredVersion); 1372 } 1373 1374 /** 1375 * <p> 1376 * Decides if the Java version matches. 1377 * </p> 1378 * <p> 1379 * This method is package private instead of private to support unit test invocation. 1380 * </p> 1381 * 1382 * @param version the actual Java version 1383 * @param versionPrefix the prefix for the expected Java version 1384 * @return true if matches, or false if not or can't determine 1385 */ 1386 static boolean isJavaVersionMatch(String version, String versionPrefix) { 1387 if (version == null) { 1388 return false; 1389 } 1390 return version.startsWith(versionPrefix); 1391 } 1392 1393 /** 1394 * Decides if the operating system matches. 1395 * <p> 1396 * This method is package private instead of private to support unit test invocation. 1397 * </p> 1398 * 1399 * @param osName the actual OS name 1400 * @param osVersion the actual OS version 1401 * @param osNamePrefix the prefix for the expected OS name 1402 * @param osVersionPrefix the prefix for the expected OS version 1403 * @return true if matches, or false if not or can't determine 1404 */ 1405 static boolean isOSMatch(String osName, String osVersion, String osNamePrefix, String osVersionPrefix) { 1406 if (osName == null || osVersion == null) { 1407 return false; 1408 } 1409 return osName.startsWith(osNamePrefix) && osVersion.startsWith(osVersionPrefix); 1410 } 1411 1412 /** 1413 * Decides if the operating system matches. 1414 * <p> 1415 * This method is package private instead of private to support unit test invocation. 1416 * </p> 1417 * 1418 * @param osName the actual OS name 1419 * @param osNamePrefix the prefix for the expected OS name 1420 * @return true if matches, or false if not or can't determine 1421 */ 1422 static boolean isOSNameMatch(String osName, String osNamePrefix) { 1423 if (osName == null) { 1424 return false; 1425 } 1426 return osName.startsWith(osNamePrefix); 1427 } 1428 1429 // ----------------------------------------------------------------------- 1430 /** 1431 * <p> 1432 * SystemUtils instances should NOT be constructed in standard programming. Instead, the class should be used as 1433 * {@code SystemUtils.FILE_SEPARATOR}. 1434 * </p> 1435 * <p> 1436 * This constructor is public to permit tools that require a JavaBean instance to operate. 1437 * </p> 1438 */ 1439 public SystemUtils() { 1440 super(); 1441 } 1442 1443 }