View Javadoc
1   /*
2    * Licensed to the Apache Software Foundation (ASF) under one or more
3    * contributor license agreements.  See the NOTICE file distributed with
4    * this work for additional information regarding copyright ownership.
5    * The ASF licenses this file to You under the Apache License, Version 2.0
6    * (the "License"); you may not use this file except in compliance with
7    * the License.  You may obtain a copy of the License at
8    *
9    *      https://www.apache.org/licenses/LICENSE-2.0
10   *
11   * Unless required by applicable law or agreed to in writing, software
12   * distributed under the License is distributed on an "AS IS" BASIS,
13   * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
14   * See the License for the specific language governing permissions and
15   * limitations under the License.
16   */
17  package org.apache.commons.lang3;
18  
19  import java.io.File;
20  import java.nio.file.Path;
21  import java.nio.file.Paths;
22  
23  /**
24   * Helpers for {@link System}.
25   *
26   * <p>
27   * If a system property cannot be read due to security restrictions, the corresponding field in this class will be set to {@code null} and a message will be
28   * written to {@code System.err}.
29   * </p>
30   * <p>
31   * #ThreadSafe#
32   * </p>
33   *
34   * @since 1.0
35   * @see SystemProperties
36   */
37  public class SystemUtils {
38  
39      /**
40       * The prefix String for all Windows OS.
41       */
42      private static final String OS_NAME_WINDOWS_PREFIX = "Windows";
43  
44      // System property constants
45      // -----------------------------------------------------------------------
46      // These MUST be declared first. Other constants depend on this.
47  
48      /**
49       * A constant for the System Property {@code file.encoding}.
50       *
51       * <p>
52       * File encoding, such as {@code Cp1252}.
53       * </p>
54       * <p>
55       * Defaults to {@code null} if the runtime does not have security access to read this property or the property does not exist.
56       * </p>
57       * <p>
58       * This value is initialized when the class is loaded. If {@link System#setProperty(String,String)} or {@link System#setProperties(java.util.Properties)} is
59       * called after this class is loaded, the value will be out of sync with that System property.
60       * </p>
61       *
62       * @see SystemProperties#getFileEncoding()
63       * @since 2.0
64       * @since Java 1.2
65       */
66      public static final String FILE_ENCODING = SystemProperties.getFileEncoding();
67  
68      /**
69       * A constant for the System Property {@code file.separator}.
70       * <p>
71       * The file separator is:
72       * </p>
73       * <ul>
74       * <li>{@code "/"} on Unix</li>
75       * <li>{@code "\"} on Windows.</li>
76       * </ul>
77       *
78       * <p>
79       * Defaults to {@code null} if the runtime does not have security access to read this property or the property does not exist.
80       * </p>
81       * <p>
82       * This value is initialized when the class is loaded. If {@link System#setProperty(String,String)} or {@link System#setProperties(java.util.Properties)} is
83       * called after this class is loaded, the value will be out of sync with that System property.
84       * </p>
85       *
86       * @see SystemProperties#getFileSeparator()
87       * @deprecated Use {@link File#separator}, since it is guaranteed to be a string containing a single character and it does not require a privilege check.
88       * @since Java 1.1
89       */
90      @Deprecated
91      public static final String FILE_SEPARATOR = SystemProperties.getFileSeparator();
92  
93      /**
94       * A constant for the System Property {@code java.awt.fonts}.
95       *
96       * <p>
97       * Defaults to {@code null} if the runtime does not have security access to read this property or the property does not exist.
98       * </p>
99       * <p>
100      * This value is initialized when the class is loaded. If {@link System#setProperty(String,String)} or {@link System#setProperties(java.util.Properties)} is
101      * called after this class is loaded, the value will be out of sync with that System property.
102      * </p>
103      *
104      * @see SystemProperties#getJavaAwtFonts()
105      * @since 2.1
106      * @deprecated Deprecated without replacement.
107      */
108     @Deprecated
109     public static final String JAVA_AWT_FONTS = SystemProperties.getJavaAwtFonts();
110 
111     /**
112      * A constant for the System Property {@code java.awt.graphicsenv}.
113      *
114      * <p>
115      * Defaults to {@code null} if the runtime does not have security access to read this property or the property does not exist.
116      * </p>
117      * <p>
118      * This value is initialized when the class is loaded. If {@link System#setProperty(String,String)} or {@link System#setProperties(java.util.Properties)} is
119      * called after this class is loaded, the value will be out of sync with that System property.
120      * </p>
121      *
122      * @see SystemProperties#getJavaAwtGraphicsenv()
123      * @since 2.1
124      * @deprecated Deprecated without replacement.
125      */
126     @Deprecated
127     public static final String JAVA_AWT_GRAPHICSENV = SystemProperties.getJavaAwtGraphicsenv();
128 
129     /**
130      * A constant for the System Property {@code java.awt.headless}. The value of this property is the String {@code "true"} or {@code "false"}.
131      *
132      * <p>
133      * Defaults to {@code null} if the runtime does not have security access to read this property or the property does not exist.
134      * </p>
135      * <p>
136      * This value is initialized when the class is loaded. If {@link System#setProperty(String,String)} or {@link System#setProperties(java.util.Properties)} is
137      * called after this class is loaded, the value will be out of sync with that System property.
138      * </p>
139      *
140      * @see #isJavaAwtHeadless()
141      * @see SystemProperties#getJavaAwtHeadless()
142      * @since 2.1
143      * @since Java 1.4
144      * @deprecated Deprecated without replacement.
145      */
146     @Deprecated
147     public static final String JAVA_AWT_HEADLESS = SystemProperties.getJavaAwtHeadless();
148 
149     /**
150      * A constant for the System Property {@code java.awt.printerjob}.
151      *
152      * <p>
153      * Defaults to {@code null} if the runtime does not have security access to read this property or the property does not exist.
154      * </p>
155      * <p>
156      * This value is initialized when the class is loaded. If {@link System#setProperty(String,String)} or {@link System#setProperties(java.util.Properties)} is
157      * called after this class is loaded, the value will be out of sync with that System property.
158      * </p>
159      *
160      * @see SystemProperties#getJavaAwtPrinterjob()
161      * @since 2.1
162      * @deprecated Deprecated without replacement.
163      */
164     @Deprecated
165     public static final String JAVA_AWT_PRINTERJOB = SystemProperties.getJavaAwtPrinterjob();
166 
167     /**
168      * A constant for the System Property {@code java.class.path}. Java class path.
169      *
170      * <p>
171      * Defaults to {@code null} if the runtime does not have security access to read this property or the property does not exist.
172      * </p>
173      * <p>
174      * This value is initialized when the class is loaded. If {@link System#setProperty(String,String)} or {@link System#setProperties(java.util.Properties)} is
175      * called after this class is loaded, the value will be out of sync with that System property.
176      * </p>
177      *
178      * @see SystemProperties#getJavaClassPath()
179      * @since Java 1.1
180      */
181     public static final String JAVA_CLASS_PATH = SystemProperties.getJavaClassPath();
182 
183     /**
184      * A constant for the System Property {@code java.class.version}. Java class format version number.
185      *
186      * <p>
187      * Defaults to {@code null} if the runtime does not have security access to read this property or the property does not exist.
188      * </p>
189      * <p>
190      * This value is initialized when the class is loaded. If {@link System#setProperty(String,String)} or {@link System#setProperties(java.util.Properties)} is
191      * called after this class is loaded, the value will be out of sync with that System property.
192      * </p>
193      *
194      * @see SystemProperties#getJavaClassVersion()
195      * @since Java 1.1
196      */
197     public static final String JAVA_CLASS_VERSION = SystemProperties.getJavaClassVersion();
198 
199     /**
200      * A constant for the System Property {@code java.compiler}. Name of JIT compiler to use. First in JDK version 1.2. Not used in Sun JDKs after 1.2.
201      *
202      * <p>
203      * Defaults to {@code null} if the runtime does not have security access to read this property or the property does not exist.
204      * </p>
205      * <p>
206      * This value is initialized when the class is loaded. If {@link System#setProperty(String,String)} or {@link System#setProperties(java.util.Properties)} is
207      * called after this class is loaded, the value will be out of sync with that System property.
208      * </p>
209      *
210      * @see SystemProperties#getJavaCompiler()
211      * @since Java 1.2. Not used in Sun versions after 1.2.
212      * @deprecated Deprecated without replacement; see https://bugs.openjdk.org/browse/JDK-8305998
213      */
214     @Deprecated
215     public static final String JAVA_COMPILER = SystemProperties.getJavaCompiler();
216 
217     /**
218      * A constant for the System Property {@code java.endorsed.dirs}. Path of endorsed directory or directories.
219      *
220      * <p>
221      * Defaults to {@code null} if the runtime does not have security access to read this property or the property does not exist.
222      * </p>
223      * <p>
224      * This value is initialized when the class is loaded. If {@link System#setProperty(String,String)} or {@link System#setProperties(java.util.Properties)} is
225      * called after this class is loaded, the value will be out of sync with that System property.
226      * </p>
227      *
228      * @see SystemProperties#getJavaEndorsedDirs()
229      * @since Java 1.4
230      * @deprecated Deprecated without replacement.
231      */
232     @Deprecated
233     public static final String JAVA_ENDORSED_DIRS = SystemProperties.getJavaEndorsedDirs();
234 
235     /**
236      * A constant for the System Property {@code java.ext.dirs}. Path of extension directory or directories.
237      *
238      * <p>
239      * Defaults to {@code null} if the runtime does not have security access to read this property or the property does not exist.
240      * </p>
241      * <p>
242      * This value is initialized when the class is loaded. If {@link System#setProperty(String,String)} or {@link System#setProperties(java.util.Properties)} is
243      * called after this class is loaded, the value will be out of sync with that System property.
244      * </p>
245      *
246      * @see SystemProperties#getJavaExtDirs()
247      * @since Java 1.3
248      * @deprecated Deprecated without replacement.
249      */
250     @Deprecated
251     public static final String JAVA_EXT_DIRS = SystemProperties.getJavaExtDirs();
252 
253     /**
254      * A constant for the System Property {@code java.home}. Java installation directory.
255      *
256      * <p>
257      * Defaults to {@code null} if the runtime does not have security access to read this property or the property does not exist.
258      * </p>
259      * <p>
260      * This value is initialized when the class is loaded. If {@link System#setProperty(String,String)} or {@link System#setProperties(java.util.Properties)} is
261      * called after this class is loaded, the value will be out of sync with that System property.
262      * </p>
263      *
264      * @see SystemProperties#getJavaHome()
265      * @since Java 1.1
266      */
267     public static final String JAVA_HOME = SystemProperties.getJavaHome();
268 
269     /**
270      * A constant for the System Property {@code java.io.tmpdir}. Default temp file path.
271      *
272      * <p>
273      * Defaults to {@code null} if the runtime does not have security access to read this property or the property does not exist.
274      * </p>
275      * <p>
276      * This value is initialized when the class is loaded. If {@link System#setProperty(String,String)} or {@link System#setProperties(java.util.Properties)} is
277      * called after this class is loaded, the value will be out of sync with that System property.
278      * </p>
279      *
280      * @see SystemProperties#getJavaIoTmpdir()
281      * @since Java 1.2
282      */
283     public static final String JAVA_IO_TMPDIR = SystemProperties.getJavaIoTmpdir();
284 
285     /**
286      * A constant for the System Property {@code java.library.path}. List of paths to search when loading libraries.
287      *
288      * <p>
289      * Defaults to {@code null} if the runtime does not have security access to read this property or the property does not exist.
290      * </p>
291      * <p>
292      * This value is initialized when the class is loaded. If {@link System#setProperty(String,String)} or {@link System#setProperties(java.util.Properties)} is
293      * called after this class is loaded, the value will be out of sync with that System property.
294      * </p>
295      *
296      * @see SystemProperties#getJavaLibraryPath()
297      * @since Java 1.2
298      */
299     public static final String JAVA_LIBRARY_PATH = SystemProperties.getJavaLibraryPath();
300 
301     /**
302      * A constant for the System Property {@code java.runtime.name}. Java Runtime Environment name.
303      *
304      * <p>
305      * Defaults to {@code null} if the runtime does not have security access to read this property or the property does not exist.
306      * </p>
307      * <p>
308      * This value is initialized when the class is loaded. If {@link System#setProperty(String,String)} or {@link System#setProperties(java.util.Properties)} is
309      * called after this class is loaded, the value will be out of sync with that System property.
310      * </p>
311      *
312      * @see SystemProperties#getJavaRuntimeName()
313      * @since 2.0
314      * @since Java 1.3
315      */
316     public static final String JAVA_RUNTIME_NAME = SystemProperties.getJavaRuntimeName();
317 
318     /**
319      * A constant for the System Property {@code java.runtime.version}. Java Runtime Environment version.
320      *
321      * <p>
322      * Defaults to {@code null} if the runtime does not have security access to read this property or the property does not exist.
323      * </p>
324      * <p>
325      * This value is initialized when the class is loaded. If {@link System#setProperty(String,String)} or {@link System#setProperties(java.util.Properties)} is
326      * called after this class is loaded, the value will be out of sync with that System property.
327      * </p>
328      *
329      * @see SystemProperties#getJavaRuntimeVersion()
330      * @since 2.0
331      * @since Java 1.3
332      */
333     public static final String JAVA_RUNTIME_VERSION = SystemProperties.getJavaRuntimeVersion();
334 
335     /**
336      * A constant for the System Property {@code java.specification.name}. Java Runtime Environment specification name.
337      *
338      * <p>
339      * Defaults to {@code null} if the runtime does not have security access to read this property or the property does not exist.
340      * </p>
341      * <p>
342      * This value is initialized when the class is loaded. If {@link System#setProperty(String,String)} or {@link System#setProperties(java.util.Properties)} is
343      * called after this class is loaded, the value will be out of sync with that System property.
344      * </p>
345      *
346      * @see SystemProperties#getJavaSpecificationName()
347      * @since Java 1.2
348      */
349     public static final String JAVA_SPECIFICATION_NAME = SystemProperties.getJavaSpecificationName();
350 
351     /**
352      * A constant for the System Property {@code java.specification.vendor}. Java Runtime Environment specification vendor.
353      *
354      * <p>
355      * Defaults to {@code null} if the runtime does not have security access to read this property or the property does not exist.
356      * </p>
357      * <p>
358      * This value is initialized when the class is loaded. If {@link System#setProperty(String,String)} or {@link System#setProperties(java.util.Properties)} is
359      * called after this class is loaded, the value will be out of sync with that System property.
360      * </p>
361      *
362      * @see SystemProperties#getJavaSpecificationVendor()
363      * @since Java 1.2
364      */
365     public static final String JAVA_SPECIFICATION_VENDOR = SystemProperties.getJavaSpecificationVendor();
366 
367     /**
368      * A constant for the System Property {@code java.specification.version}. Java Runtime Environment specification version.
369      *
370      * <p>
371      * Defaults to {@code null} if the runtime does not have security access to read this property or the property does not exist.
372      * </p>
373      * <p>
374      * This value is initialized when the class is loaded. If {@link System#setProperty(String,String)} or {@link System#setProperties(java.util.Properties)} is
375      * called after this class is loaded, the value will be out of sync with that System property.
376      * </p>
377      *
378      * @see SystemProperties#getJavaSpecificationVersion()
379      * @since Java 1.3
380      */
381     public static final String JAVA_SPECIFICATION_VERSION = SystemProperties.getJavaSpecificationVersion();
382 
383     private static final JavaVersion JAVA_SPECIFICATION_VERSION_AS_ENUM = JavaVersion.get(JAVA_SPECIFICATION_VERSION);
384 
385     /**
386      * A constant for the System Property {@code java.util.prefs.PreferencesFactory}. A class name.
387      *
388      * <p>
389      * Defaults to {@code null} if the runtime does not have security access to read this property or the property does not exist.
390      * </p>
391      * <p>
392      * This value is initialized when the class is loaded. If {@link System#setProperty(String,String)} or {@link System#setProperties(java.util.Properties)} is
393      * called after this class is loaded, the value will be out of sync with that System property.
394      * </p>
395      *
396      * @see SystemProperties#getJavaUtilPrefsPreferencesFactory()
397      * @since 2.1
398      * @since Java 1.4
399      */
400     public static final String JAVA_UTIL_PREFS_PREFERENCES_FACTORY = SystemProperties.getJavaUtilPrefsPreferencesFactory();
401 
402     /**
403      * A constant for the System Property {@code java.vendor}. Java vendor-specific string.
404      *
405      * <p>
406      * Defaults to {@code null} if the runtime does not have security access to read this property or the property does not exist.
407      * </p>
408      * <p>
409      * This value is initialized when the class is loaded. If {@link System#setProperty(String,String)} or {@link System#setProperties(java.util.Properties)} is
410      * called after this class is loaded, the value will be out of sync with that System property.
411      * </p>
412      *
413      * @see SystemProperties#getJavaVendor()
414      * @since Java 1.1
415      */
416     public static final String JAVA_VENDOR = SystemProperties.getJavaVendor();
417 
418     /**
419      * A constant for the System Property {@code java.vendor.url}. Java vendor URL.
420      *
421      * <p>
422      * Defaults to {@code null} if the runtime does not have security access to read this property or the property does not exist.
423      * </p>
424      * <p>
425      * This value is initialized when the class is loaded. If {@link System#setProperty(String,String)} or {@link System#setProperties(java.util.Properties)} is
426      * called after this class is loaded, the value will be out of sync with that System property.
427      * </p>
428      *
429      * @see SystemProperties#getJavaVendorUrl()
430      * @since Java 1.1
431      */
432     public static final String JAVA_VENDOR_URL = SystemProperties.getJavaVendorUrl();
433 
434     /**
435      * A constant for the System Property {@code java.version}. Java version number.
436      *
437      * <p>
438      * Defaults to {@code null} if the runtime does not have security access to read this property or the property does not exist.
439      * </p>
440      * <p>
441      * This value is initialized when the class is loaded. If {@link System#setProperty(String,String)} or {@link System#setProperties(java.util.Properties)} is
442      * called after this class is loaded, the value will be out of sync with that System property.
443      * </p>
444      *
445      * @see SystemProperties#getJavaVersion()
446      * @since Java 1.1
447      */
448     public static final String JAVA_VERSION = SystemProperties.getJavaVersion();
449 
450     /**
451      * A constant for the System Property {@code java.vm.info}. Java Virtual Machine implementation info.
452      *
453      * <p>
454      * Defaults to {@code null} if the runtime does not have security access to read this property or the property does not exist.
455      * </p>
456      * <p>
457      * This value is initialized when the class is loaded. If {@link System#setProperty(String,String)} or {@link System#setProperties(java.util.Properties)} is
458      * called after this class is loaded, the value will be out of sync with that System property.
459      * </p>
460      *
461      * @see SystemProperties#getJavaVmInfo()
462      * @since 2.0
463      * @since Java 1.2
464      */
465     public static final String JAVA_VM_INFO = SystemProperties.getJavaVmInfo();
466 
467     /**
468      * A constant for the System Property {@code java.vm.name}. Java Virtual Machine implementation name.
469      *
470      * <p>
471      * Defaults to {@code null} if the runtime does not have security access to read this property or the property does not exist.
472      * </p>
473      * <p>
474      * This value is initialized when the class is loaded. If {@link System#setProperty(String,String)} or {@link System#setProperties(java.util.Properties)} is
475      * called after this class is loaded, the value will be out of sync with that System property.
476      * </p>
477      *
478      * @see SystemProperties#getJavaVmName()
479      * @since Java 1.2
480      */
481     public static final String JAVA_VM_NAME = SystemProperties.getJavaVmName();
482 
483     /**
484      * A constant for the System Property {@code java.vm.specification.name}. Java Virtual Machine specification name.
485      *
486      * <p>
487      * Defaults to {@code null} if the runtime does not have security access to read this property or the property does not exist.
488      * </p>
489      * <p>
490      * This value is initialized when the class is loaded. If {@link System#setProperty(String,String)} or {@link System#setProperties(java.util.Properties)} is
491      * called after this class is loaded, the value will be out of sync with that System property.
492      * </p>
493      *
494      * @see SystemProperties#getJavaVmSpecificationName()
495      * @since Java 1.2
496      */
497     public static final String JAVA_VM_SPECIFICATION_NAME = SystemProperties.getJavaVmSpecificationName();
498 
499     /**
500      * A constant for the System Property {@code java.vm.specification.vendor}. Java Virtual Machine specification vendor.
501      *
502      * <p>
503      * Defaults to {@code null} if the runtime does not have security access to read this property or the property does not exist.
504      * </p>
505      * <p>
506      * This value is initialized when the class is loaded. If {@link System#setProperty(String,String)} or {@link System#setProperties(java.util.Properties)} is
507      * called after this class is loaded, the value will be out of sync with that System property.
508      * </p>
509      *
510      * @see SystemProperties#getJavaVmSpecificationVendor()
511      * @since Java 1.2
512      */
513     public static final String JAVA_VM_SPECIFICATION_VENDOR = SystemProperties.getJavaVmSpecificationVendor();
514 
515     /**
516      * A constant for the System Property {@code java.vm.specification.version}. Java Virtual Machine specification version.
517      *
518      * <p>
519      * Defaults to {@code null} if the runtime does not have security access to read this property or the property does not exist.
520      * </p>
521      * <p>
522      * This value is initialized when the class is loaded. If {@link System#setProperty(String,String)} or {@link System#setProperties(java.util.Properties)} is
523      * called after this class is loaded, the value will be out of sync with that System property.
524      * </p>
525      *
526      * @see SystemProperties#getJavaVmSpecificationVersion()
527      * @since Java 1.2
528      */
529     public static final String JAVA_VM_SPECIFICATION_VERSION = SystemProperties.getJavaVmSpecificationVersion();
530 
531     /**
532      * A constant for the System Property {@code java.vm.vendor}. Java Virtual Machine implementation vendor.
533      *
534      * <p>
535      * Defaults to {@code null} if the runtime does not have security access to read this property or the property does not exist.
536      * </p>
537      * <p>
538      * This value is initialized when the class is loaded. If {@link System#setProperty(String,String)} or {@link System#setProperties(java.util.Properties)} is
539      * called after this class is loaded, the value will be out of sync with that System property.
540      * </p>
541      *
542      * @see SystemProperties#getJavaVmVendor()
543      * @since Java 1.2
544      */
545     public static final String JAVA_VM_VENDOR = SystemProperties.getJavaVmVendor();
546 
547     /**
548      * A constant for the System Property {@code java.vm.version}. Java Virtual Machine implementation version.
549      *
550      * <p>
551      * Defaults to {@code null} if the runtime does not have security access to read this property or the property does not exist.
552      * </p>
553      * <p>
554      * This value is initialized when the class is loaded. If {@link System#setProperty(String,String)} or {@link System#setProperties(java.util.Properties)} is
555      * called after this class is loaded, the value will be out of sync with that System property.
556      * </p>
557      *
558      * @see SystemProperties#getJavaVmVersion()
559      * @since Java 1.2
560      */
561     public static final String JAVA_VM_VERSION = SystemProperties.getJavaVmVersion();
562 
563     /**
564      * A constant for the System Property {@code line.separator}. Line separator ({@code &quot;\n&quot;} on Unix).
565      *
566      * <p>
567      * Defaults to {@code null} if the runtime does not have security access to read this property or the property does not exist.
568      * </p>
569      * <p>
570      * This value is initialized when the class is loaded. If {@link System#setProperty(String,String)} or {@link System#setProperties(java.util.Properties)} is
571      * called after this class is loaded, the value will be out of sync with that System property.
572      * </p>
573      *
574      * @see SystemProperties#getLineSeparator()
575      * @since Java 1.1
576      * @deprecated Use {@link System#lineSeparator()} instead, since it does not require a privilege check.
577      */
578     @Deprecated
579     public static final String LINE_SEPARATOR = SystemProperties.getLineSeparator();
580 
581     /**
582      * A constant for the System Property {@code os.arch}. Operating system architecture.
583      *
584      * <p>
585      * Defaults to {@code null} if the runtime does not have security access to read this property or the property does not exist.
586      * </p>
587      * <p>
588      * This value is initialized when the class is loaded. If {@link System#setProperty(String,String)} or {@link System#setProperties(java.util.Properties)} is
589      * called after this class is loaded, the value will be out of sync with that System property.
590      * </p>
591      *
592      * @see SystemProperties#getOsArch()
593      * @since Java 1.1
594      */
595     public static final String OS_ARCH = SystemProperties.getOsArch();
596 
597     /**
598      * A constant for the System Property {@code os.name}. Operating system name.
599      *
600      * <p>
601      * Defaults to {@code null} if the runtime does not have security access to read this property or the property does not exist.
602      * </p>
603      * <p>
604      * This value is initialized when the class is loaded. If {@link System#setProperty(String,String)} or {@link System#setProperties(java.util.Properties)} is
605      * called after this class is loaded, the value will be out of sync with that System property.
606      * </p>
607      *
608      * @see SystemProperties#getOsName()
609      * @since Java 1.1
610      */
611     public static final String OS_NAME = SystemProperties.getOsName();
612 
613     /**
614      * A constant for the System Property {@code os.version}. Operating system version.
615      *
616      * <p>
617      * Defaults to {@code null} if the runtime does not have security access to read this property or the property does not exist.
618      * </p>
619      * <p>
620      * This value is initialized when the class is loaded. If {@link System#setProperty(String,String)} or {@link System#setProperties(java.util.Properties)} is
621      * called after this class is loaded, the value will be out of sync with that System property.
622      * </p>
623      *
624      * @see SystemProperties#getOsVersion()
625      * @since Java 1.1
626      */
627     public static final String OS_VERSION = SystemProperties.getOsVersion();
628 
629     /**
630      * A constant for the System Property {@code path.separator}. Path separator ({@code &quot;:&quot;} on Unix).
631      *
632      * <p>
633      * Defaults to {@code null} if the runtime does not have security access to read this property or the property does not exist.
634      * </p>
635      * <p>
636      * This value is initialized when the class is loaded. If {@link System#setProperty(String,String)} or {@link System#setProperties(java.util.Properties)} is
637      * called after this class is loaded, the value will be out of sync with that System property.
638      * </p>
639      *
640      * @see SystemProperties#getPathSeparator()
641      * @since Java 1.1
642      * @deprecated Use {@link File#pathSeparator}, since it is guaranteed to be a string containing a single character and it does not require a privilege
643      *             check.
644      */
645     @Deprecated
646     public static final String PATH_SEPARATOR = SystemProperties.getPathSeparator();
647 
648     /**
649      * A constant for the System Property {@code user.country} or {@code user.region}. User's country code, such as {@code "GB"}. First in Java version 1.2 as
650      * {@code user.region}. Renamed to {@code user.country} in 1.4
651      *
652      * <p>
653      * Defaults to {@code null} if the runtime does not have security access to read this property or the property does not exist.
654      * </p>
655      * <p>
656      * This value is initialized when the class is loaded. If {@link System#setProperty(String,String)} or {@link System#setProperties(java.util.Properties)} is
657      * called after this class is loaded, the value will be out of sync with that System property.
658      * </p>
659      *
660      * @since 2.0
661      * @since Java 1.2
662      */
663     public static final String USER_COUNTRY = SystemProperties.getProperty(SystemProperties.USER_COUNTRY,
664             () -> SystemProperties.getProperty(SystemProperties.USER_REGION));
665 
666     /**
667      * A constant for the System Property {@code user.dir}. User's current working directory.
668      *
669      * <p>
670      * Defaults to {@code null} if the runtime does not have security access to read this property or the property does not exist.
671      * </p>
672      * <p>
673      * This value is initialized when the class is loaded. If {@link System#setProperty(String,String)} or {@link System#setProperties(java.util.Properties)} is
674      * called after this class is loaded, the value will be out of sync with that System property.
675      * </p>
676      *
677      * @see SystemProperties#getUserDir()
678      * @since Java 1.1
679      */
680     public static final String USER_DIR = SystemProperties.getUserDir();
681 
682     /**
683      * A constant for the System Property {@code user.home}. User's home directory.
684      *
685      * <p>
686      * Defaults to {@code null} if the runtime does not have security access to read this property or the property does not exist.
687      * </p>
688      * <p>
689      * This value is initialized when the class is loaded. If {@link System#setProperty(String,String)} or {@link System#setProperties(java.util.Properties)} is
690      * called after this class is loaded, the value will be out of sync with that System property.
691      * </p>
692      *
693      * @see SystemProperties#getUserHome()
694      * @since Java 1.1
695      */
696     public static final String USER_HOME = SystemProperties.getUserHome();
697 
698     /**
699      * A constant for the System Property {@code user.language}. User's language code, such as {@code "en"}.
700      *
701      * <p>
702      * Defaults to {@code null} if the runtime does not have security access to read this property or the property does not exist.
703      * </p>
704      * <p>
705      * This value is initialized when the class is loaded. If {@link System#setProperty(String,String)} or {@link System#setProperties(java.util.Properties)} is
706      * called after this class is loaded, the value will be out of sync with that System property.
707      * </p>
708      *
709      * @see SystemProperties#getUserLanguage()
710      * @since 2.0
711      * @since Java 1.2
712      */
713     public static final String USER_LANGUAGE = SystemProperties.getUserLanguage();
714 
715     /**
716      * A constant for the System Property {@code user.name}. User's account name.
717      *
718      * <p>
719      * Defaults to {@code null} if the runtime does not have security access to read this property or the property does not exist.
720      * </p>
721      * <p>
722      * This value is initialized when the class is loaded. If {@link System#setProperty(String,String)} or {@link System#setProperties(java.util.Properties)} is
723      * called after this class is loaded, the value will be out of sync with that System property.
724      * </p>
725      *
726      * @see SystemProperties#getUserName()
727      * @since Java 1.1
728      */
729     public static final String USER_NAME = SystemProperties.getUserName();
730 
731     /**
732      * A constant for the System Property {@code user.timezone}. For example: {@code "America/Los_Angeles"}.
733      *
734      * <p>
735      * Defaults to {@code null} if the runtime does not have security access to read this property or the property does not exist.
736      * </p>
737      * <p>
738      * This value is initialized when the class is loaded. If {@link System#setProperty(String,String)} or {@link System#setProperties(java.util.Properties)} is
739      * called after this class is loaded, the value will be out of sync with that System property.
740      * </p>
741      *
742      * @see SystemProperties#getUserTimezone()
743      * @since 2.1
744      */
745     public static final String USER_TIMEZONE = SystemProperties.getUserTimezone();
746 
747     // Java version checks
748     // -----------------------------------------------------------------------
749     // These MUST be declared after those above as they depend on the
750     // values being set up
751 
752     /**
753      * The constant {@code true} if this is Java version 1.1 (also 1.1.x versions).
754      * <p>
755      * The result depends on the value of the {@link #JAVA_SPECIFICATION_VERSION} constant.
756      * </p>
757      * <p>
758      * The field will return {@code false} if {@link #JAVA_SPECIFICATION_VERSION} is {@code null}.
759      * </p>
760      * <p>
761      * This value is initialized when the class is loaded.
762      * </p>
763      */
764     public static final boolean IS_JAVA_1_1 = getJavaVersionMatches("1.1");
765 
766     /**
767      * The constant {@code true} if this is Java version 1.2 (also 1.2.x versions).
768      * <p>
769      * The result depends on the value of the {@link #JAVA_SPECIFICATION_VERSION} constant.
770      * </p>
771      * <p>
772      * The field will return {@code false} if {@link #JAVA_SPECIFICATION_VERSION} is {@code null}.
773      * </p>
774      * <p>
775      * This value is initialized when the class is loaded.
776      * </p>
777      */
778     public static final boolean IS_JAVA_1_2 = getJavaVersionMatches("1.2");
779 
780     /**
781      * The constant {@code true} if this is Java version 1.3 (also 1.3.x versions).
782      * <p>
783      * The result depends on the value of the {@link #JAVA_SPECIFICATION_VERSION} constant.
784      * </p>
785      * <p>
786      * The field will return {@code false} if {@link #JAVA_SPECIFICATION_VERSION} is {@code null}.
787      * </p>
788      * <p>
789      * This value is initialized when the class is loaded.
790      * </p>
791      */
792     public static final boolean IS_JAVA_1_3 = getJavaVersionMatches("1.3");
793 
794     /**
795      * The constant {@code true} if this is Java version 1.4 (also 1.4.x versions).
796      * <p>
797      * The result depends on the value of the {@link #JAVA_SPECIFICATION_VERSION} constant.
798      * </p>
799      * <p>
800      * The field will return {@code false} if {@link #JAVA_SPECIFICATION_VERSION} is {@code null}.
801      * </p>
802      * <p>
803      * This value is initialized when the class is loaded.
804      * </p>
805      */
806     public static final boolean IS_JAVA_1_4 = getJavaVersionMatches("1.4");
807 
808     /**
809      * The constant {@code true} if this is Java version 1.5 (also 1.5.x versions).
810      * <p>
811      * The result depends on the value of the {@link #JAVA_SPECIFICATION_VERSION} constant.
812      * </p>
813      * <p>
814      * The field will return {@code false} if {@link #JAVA_SPECIFICATION_VERSION} is {@code null}.
815      * </p>
816      * <p>
817      * This value is initialized when the class is loaded.
818      * </p>
819      */
820     public static final boolean IS_JAVA_1_5 = getJavaVersionMatches("1.5");
821 
822     /**
823      * The constant {@code true} if this is Java version 1.6 (also 1.6.x versions).
824      * <p>
825      * The result depends on the value of the {@link #JAVA_SPECIFICATION_VERSION} constant.
826      * </p>
827      * <p>
828      * The field will return {@code false} if {@link #JAVA_SPECIFICATION_VERSION} is {@code null}.
829      * </p>
830      * <p>
831      * This value is initialized when the class is loaded.
832      * </p>
833      */
834     public static final boolean IS_JAVA_1_6 = getJavaVersionMatches("1.6");
835 
836     /**
837      * The constant {@code true} if this is Java version 1.7 (also 1.7.x versions).
838      * <p>
839      * The result depends on the value of the {@link #JAVA_SPECIFICATION_VERSION} constant.
840      * </p>
841      * <p>
842      * The field will return {@code false} if {@link #JAVA_SPECIFICATION_VERSION} is {@code null}.
843      * </p>
844      * <p>
845      * This value is initialized when the class is loaded.
846      * </p>
847      *
848      * @since 3.0
849      */
850     public static final boolean IS_JAVA_1_7 = getJavaVersionMatches("1.7");
851 
852     /**
853      * The constant {@code true} if this is Java version 1.8 (also 1.8.x versions).
854      * <p>
855      * The result depends on the value of the {@link #JAVA_SPECIFICATION_VERSION} constant.
856      * </p>
857      * <p>
858      * The field will return {@code false} if {@link #JAVA_SPECIFICATION_VERSION} is {@code null}.
859      * </p>
860      * <p>
861      * This value is initialized when the class is loaded.
862      * </p>
863      *
864      * @since 3.3.2
865      */
866     public static final boolean IS_JAVA_1_8 = getJavaVersionMatches("1.8");
867 
868     /**
869      * The constant {@code true} if this is Java version 1.9 (also 1.9.x versions).
870      * <p>
871      * The result depends on the value of the {@link #JAVA_SPECIFICATION_VERSION} constant.
872      * </p>
873      * <p>
874      * The field will return {@code false} if {@link #JAVA_SPECIFICATION_VERSION} is {@code null}.
875      * </p>
876      * <p>
877      * This value is initialized when the class is loaded.
878      * </p>
879      *
880      * @since 3.4
881      * @deprecated As of release 3.5, replaced by {@link #IS_JAVA_9}.
882      */
883     @Deprecated
884     public static final boolean IS_JAVA_1_9 = getJavaVersionMatches("9");
885 
886     /**
887      * The constant {@code true} if this is Java version 9 (also 9.x versions).
888      * <p>
889      * The result depends on the value of the {@link #JAVA_SPECIFICATION_VERSION} constant.
890      * </p>
891      * <p>
892      * The field will return {@code false} if {@link #JAVA_SPECIFICATION_VERSION} is {@code null}.
893      * </p>
894      * <p>
895      * This value is initialized when the class is loaded.
896      * </p>
897      *
898      * @since 3.5
899      */
900     public static final boolean IS_JAVA_9 = getJavaVersionMatches("9");
901 
902     /**
903      * The constant {@code true} if this is Java version 10 (also 10.x versions).
904      * <p>
905      * The result depends on the value of the {@link #JAVA_SPECIFICATION_VERSION} constant.
906      * </p>
907      * <p>
908      * The field will return {@code false} if {@link #JAVA_SPECIFICATION_VERSION} is {@code null}.
909      * </p>
910      * <p>
911      * This value is initialized when the class is loaded.
912      * </p>
913      *
914      * @since 3.7
915      */
916     public static final boolean IS_JAVA_10 = getJavaVersionMatches("10");
917 
918     /**
919      * The constant {@code true} if this is Java version 11 (also 11.x versions).
920      * <p>
921      * The result depends on the value of the {@link #JAVA_SPECIFICATION_VERSION} constant.
922      * </p>
923      * <p>
924      * The field will return {@code false} if {@link #JAVA_SPECIFICATION_VERSION} is {@code null}.
925      * </p>
926      * <p>
927      * This value is initialized when the class is loaded.
928      * </p>
929      *
930      * @since 3.8
931      */
932     public static final boolean IS_JAVA_11 = getJavaVersionMatches("11");
933 
934     /**
935      * The constant {@code true} if this is Java version 12 (also 12.x versions).
936      * <p>
937      * The result depends on the value of the {@link #JAVA_SPECIFICATION_VERSION} constant.
938      * </p>
939      * <p>
940      * The field will return {@code false} if {@link #JAVA_SPECIFICATION_VERSION} is {@code null}.
941      * </p>
942      * <p>
943      * This value is initialized when the class is loaded.
944      * </p>
945      *
946      * @since 3.9
947      */
948     public static final boolean IS_JAVA_12 = getJavaVersionMatches("12");
949 
950     /**
951      * The constant {@code true} if this is Java version 13 (also 13.x versions).
952      * <p>
953      * The result depends on the value of the {@link #JAVA_SPECIFICATION_VERSION} constant.
954      * </p>
955      * <p>
956      * The field will return {@code false} if {@link #JAVA_SPECIFICATION_VERSION} is {@code null}.
957      * </p>
958      * <p>
959      * This value is initialized when the class is loaded.
960      * </p>
961      *
962      * @since 3.9
963      */
964     public static final boolean IS_JAVA_13 = getJavaVersionMatches("13");
965 
966     /**
967      * The constant {@code true} if this is Java version 14 (also 14.x versions).
968      * <p>
969      * The result depends on the value of the {@link #JAVA_SPECIFICATION_VERSION} constant.
970      * </p>
971      * <p>
972      * The field will return {@code false} if {@link #JAVA_SPECIFICATION_VERSION} is {@code null}.
973      * </p>
974      * <p>
975      * This value is initialized when the class is loaded.
976      * </p>
977      *
978      * @since 3.10
979      */
980     public static final boolean IS_JAVA_14 = getJavaVersionMatches("14");
981 
982     /**
983      * The constant {@code true} if this is Java version 15 (also 15.x versions).
984      * <p>
985      * The result depends on the value of the {@link #JAVA_SPECIFICATION_VERSION} constant.
986      * </p>
987      * <p>
988      * The field will return {@code false} if {@link #JAVA_SPECIFICATION_VERSION} is {@code null}.
989      * </p>
990      * <p>
991      * This value is initialized when the class is loaded.
992      * </p>
993      *
994      * @since 3.10
995      */
996     public static final boolean IS_JAVA_15 = getJavaVersionMatches("15");
997 
998     /**
999      * The constant {@code true} if this is Java version 16 (also 16.x versions).
1000      * <p>
1001      * The result depends on the value of the {@link #JAVA_SPECIFICATION_VERSION} constant.
1002      * </p>
1003      * <p>
1004      * The field will return {@code false} if {@link #JAVA_SPECIFICATION_VERSION} is {@code null}.
1005      * </p>
1006      * <p>
1007      * This value is initialized when the class is loaded.
1008      * </p>
1009      *
1010      * @since 3.13.0
1011      */
1012     public static final boolean IS_JAVA_16 = getJavaVersionMatches("16");
1013 
1014     /**
1015      * The constant {@code true} if this is Java version 17 (also 17.x versions).
1016      * <p>
1017      * The result depends on the value of the {@link #JAVA_SPECIFICATION_VERSION} constant.
1018      * </p>
1019      * <p>
1020      * The field will return {@code false} if {@link #JAVA_SPECIFICATION_VERSION} is {@code null}.
1021      * </p>
1022      * <p>
1023      * This value is initialized when the class is loaded.
1024      * </p>
1025      *
1026      * @since 3.13.0
1027      */
1028     public static final boolean IS_JAVA_17 = getJavaVersionMatches("17");
1029 
1030     /**
1031      * The constant {@code true} if this is Java version 18 (also 18.x versions).
1032      * <p>
1033      * The result depends on the value of the {@link #JAVA_SPECIFICATION_VERSION} constant.
1034      * </p>
1035      * <p>
1036      * The field will return {@code false} if {@link #JAVA_SPECIFICATION_VERSION} is {@code null}.
1037      * </p>
1038      * <p>
1039      * This value is initialized when the class is loaded.
1040      * </p>
1041      *
1042      * @since 3.13.0
1043      */
1044     public static final boolean IS_JAVA_18 = getJavaVersionMatches("18");
1045 
1046     /**
1047      * The constant {@code true} if this is Java version 19 (also 19.x versions).
1048      * <p>
1049      * The result depends on the value of the {@link #JAVA_SPECIFICATION_VERSION} constant.
1050      * </p>
1051      * <p>
1052      * The field will return {@code false} if {@link #JAVA_SPECIFICATION_VERSION} is {@code null}.
1053      * </p>
1054      * <p>
1055      * This value is initialized when the class is loaded.
1056      * </p>
1057      *
1058      * @since 3.13.0
1059      */
1060     public static final boolean IS_JAVA_19 = getJavaVersionMatches("19");
1061 
1062     /**
1063      * The constant {@code true} if this is Java version 20 (also 20.x versions).
1064      * <p>
1065      * The result depends on the value of the {@link #JAVA_SPECIFICATION_VERSION} constant.
1066      * </p>
1067      * <p>
1068      * The field will return {@code false} if {@link #JAVA_SPECIFICATION_VERSION} is {@code null}.
1069      * </p>
1070      * <p>
1071      * This value is initialized when the class is loaded.
1072      * </p>
1073      *
1074      * @since 3.13.0
1075      */
1076     public static final boolean IS_JAVA_20 = getJavaVersionMatches("20");
1077 
1078     /**
1079      * The constant {@code true} if this is Java version 21 (also 21.x versions).
1080      * <p>
1081      * The result depends on the value of the {@link #JAVA_SPECIFICATION_VERSION} constant.
1082      * </p>
1083      * <p>
1084      * The field will return {@code false} if {@link #JAVA_SPECIFICATION_VERSION} is {@code null}.
1085      * </p>
1086      * <p>
1087      * This value is initialized when the class is loaded.
1088      * </p>
1089      *
1090      * @since 3.13.0
1091      */
1092     public static final boolean IS_JAVA_21 = getJavaVersionMatches("21");
1093 
1094     /**
1095      * The constant {@code true} if this is Java version 22 (also 22.x versions).
1096      * <p>
1097      * The result depends on the value of the {@link #JAVA_SPECIFICATION_VERSION} constant.
1098      * </p>
1099      * <p>
1100      * The field will return {@code false} if {@link #JAVA_SPECIFICATION_VERSION} is {@code null}.
1101      * </p>
1102      * <p>
1103      * This value is initialized when the class is loaded.
1104      * </p>
1105      *
1106      * @since 3.15.0
1107      */
1108     public static final boolean IS_JAVA_22 = getJavaVersionMatches("22");
1109 
1110     /**
1111      * The constant {@code true} if this is Java version 23 (also 23.x versions).
1112      * <p>
1113      * The result depends on the value of the {@link #JAVA_SPECIFICATION_VERSION} constant.
1114      * </p>
1115      * <p>
1116      * The field will return {@code false} if {@link #JAVA_SPECIFICATION_VERSION} is {@code null}.
1117      * </p>
1118      * <p>
1119      * This value is initialized when the class is loaded.
1120      * </p>
1121      *
1122      * @since 3.18.0
1123      */
1124     public static final boolean IS_JAVA_23 = getJavaVersionMatches("23");
1125 
1126     /**
1127      * The constant {@code true} if this is Java version 24 (also 24.x versions).
1128      * <p>
1129      * The result depends on the value of the {@link #JAVA_SPECIFICATION_VERSION} constant.
1130      * </p>
1131      * <p>
1132      * The field will return {@code false} if {@link #JAVA_SPECIFICATION_VERSION} is {@code null}.
1133      * </p>
1134      * <p>
1135      * This value is initialized when the class is loaded.
1136      * </p>
1137      *
1138      * @since 3.18.0
1139      */
1140     public static final boolean IS_JAVA_24 = getJavaVersionMatches("24");
1141 
1142     /**
1143      * The constant {@code true} if this is Java version 25 (also 25.x versions).
1144      * <p>
1145      * The result depends on the value of the {@link #JAVA_SPECIFICATION_VERSION} constant.
1146      * </p>
1147      * <p>
1148      * The field will return {@code false} if {@link #JAVA_SPECIFICATION_VERSION} is {@code null}.
1149      * </p>
1150      * <p>
1151      * This value is initialized when the class is loaded.
1152      * </p>
1153      *
1154      * @since 3.20.0
1155      */
1156     public static final boolean IS_JAVA_25 = getJavaVersionMatches("25");
1157 
1158     /**
1159      * The constant {@code true} if this is Java version 26 (also 26.x versions).
1160      * <p>
1161      * The result depends on the value of the {@link #JAVA_SPECIFICATION_VERSION} constant.
1162      * </p>
1163      * <p>
1164      * The field will return {@code false} if {@link #JAVA_SPECIFICATION_VERSION} is {@code null}.
1165      * </p>
1166      * <p>
1167      * This value is initialized when the class is loaded.
1168      * </p>
1169      *
1170      * @since 3.20.0
1171      */
1172     public static final boolean IS_JAVA_26 = getJavaVersionMatches("26");
1173 
1174     // Operating system checks
1175     // -----------------------------------------------------------------------
1176     // These MUST be declared after those above as they depend on the
1177     // values being set up
1178     // Please advise dev@commons.apache.org if you want another added
1179     // or a mistake corrected
1180 
1181     /**
1182      * The constant {@code true} if this is AIX.
1183      * <p>
1184      * The result depends on the value of the {@link #OS_NAME} constant.
1185      * </p>
1186      * <p>
1187      * The field will return {@code false} if {@link #OS_NAME} is {@code null}.
1188      * </p>
1189      * <p>
1190      * This value is initialized when the class is loaded.
1191      * </p>
1192      *
1193      * @since 2.0
1194      */
1195     public static final boolean IS_OS_AIX = getOsNameMatches("AIX");
1196 
1197     /**
1198      * The constant {@code true} if this is Android.
1199      *
1200      * <p>
1201      * See https://developer.android.com/reference/java/lang/System#getProperties().
1202      * </p>
1203      * <p>
1204      * This value is initialized when the class is loaded.
1205      * </p>
1206      *
1207      * @since 3.15.0
1208      */
1209     public static final boolean IS_OS_ANDROID = Strings.CS.contains(SystemProperties.getJavaVendor(), "Android");
1210 
1211     /**
1212      * The constant {@code true} if this is HP-UX.
1213      * <p>
1214      * The result depends on the value of the {@link #OS_NAME} constant.
1215      * </p>
1216      * <p>
1217      * The field will return {@code false} if {@link #OS_NAME} is {@code null}.
1218      * </p>
1219      * <p>
1220      * This value is initialized when the class is loaded.
1221      * </p>
1222      *
1223      * @since 2.0
1224      */
1225     public static final boolean IS_OS_HP_UX = getOsNameMatches("HP-UX");
1226 
1227     /**
1228      * The constant {@code true} if this is IBM OS/400.
1229      * <p>
1230      * The result depends on the value of the {@link #OS_NAME} constant.
1231      * </p>
1232      * <p>
1233      * The field will return {@code false} if {@link #OS_NAME} is {@code null}.
1234      * </p>
1235      * <p>
1236      * This value is initialized when the class is loaded.
1237      * </p>
1238      *
1239      * @since 3.3
1240      */
1241     public static final boolean IS_OS_400 = getOsNameMatches("OS/400");
1242 
1243     /**
1244      * The constant {@code true} if this is Irix.
1245      * <p>
1246      * The result depends on the value of the {@link #OS_NAME} constant.
1247      * </p>
1248      * <p>
1249      * The field will return {@code false} if {@link #OS_NAME} is {@code null}.
1250      * </p>
1251      * <p>
1252      * This value is initialized when the class is loaded.
1253      * </p>
1254      *
1255      * @since 2.0
1256      */
1257     public static final boolean IS_OS_IRIX = getOsNameMatches("Irix");
1258 
1259     /**
1260      * The constant {@code true} if this is Linux.
1261      * <p>
1262      * The result depends on the value of the {@link #OS_NAME} constant.
1263      * </p>
1264      * <p>
1265      * The field will return {@code false} if {@link #OS_NAME} is {@code null}.
1266      * </p>
1267      * <p>
1268      * This value is initialized when the class is loaded.
1269      * </p>
1270      *
1271      * @since 2.0
1272      */
1273     public static final boolean IS_OS_LINUX = getOsNameMatches("Linux");
1274 
1275     /**
1276      * The constant {@code true} if this is Mac.
1277      * <p>
1278      * The result depends on the value of the {@link #OS_NAME} constant.
1279      * </p>
1280      * <p>
1281      * The field will return {@code false} if {@link #OS_NAME} is {@code null}.
1282      * </p>
1283      * <p>
1284      * This value is initialized when the class is loaded.
1285      * </p>
1286      *
1287      * @since 2.0
1288      */
1289     public static final boolean IS_OS_MAC = getOsNameMatches("Mac");
1290 
1291     /**
1292      * The constant {@code true} if this is Mac.
1293      * <p>
1294      * The result depends on the value of the {@link #OS_NAME} constant.
1295      * </p>
1296      * <p>
1297      * The field will return {@code false} if {@link #OS_NAME} is {@code null}.
1298      * </p>
1299      * <p>
1300      * This value is initialized when the class is loaded.
1301      * </p>
1302      *
1303      * @since 2.0
1304      */
1305     public static final boolean IS_OS_MAC_OSX = getOsNameMatches("Mac OS X");
1306 
1307     /**
1308      * The constant {@code true} if this is macOS X Cheetah.
1309      * <p>
1310      * The value depends on the value of the {@link #OS_NAME} and {@link #OS_VERSION} constants.
1311      * </p>
1312      * <p>
1313      * The value is {@code false} if {@link #OS_NAME} or {@link #OS_VERSION} is {@code null}.
1314      * </p>
1315      * <p>
1316      * This value is initialized when the class is loaded.
1317      * </p>
1318      *
1319      * @since 3.4
1320      */
1321     public static final boolean IS_OS_MAC_OSX_CHEETAH = getOsMatches("Mac OS X", "10.0");
1322 
1323     /**
1324      * The constant {@code true} if this is macOS X Puma.
1325      * <p>
1326      * The value depends on the value of the {@link #OS_NAME} and {@link #OS_VERSION} constants.
1327      * </p>
1328      * <p>
1329      * The value is {@code false} if {@link #OS_NAME} or {@link #OS_VERSION} is {@code null}.
1330      * </p>
1331      * <p>
1332      * This value is initialized when the class is loaded.
1333      * </p>
1334      *
1335      * @since 3.4
1336      */
1337     public static final boolean IS_OS_MAC_OSX_PUMA = getOsMatches("Mac OS X", "10.1");
1338 
1339     /**
1340      * The constant {@code true} if this is macOS X Jaguar.
1341      * <p>
1342      * The value depends on the value of the {@link #OS_NAME} and {@link #OS_VERSION} constants.
1343      * </p>
1344      * <p>
1345      * The value is {@code false} if {@link #OS_NAME} or {@link #OS_VERSION} is {@code null}.
1346      * </p>
1347      * <p>
1348      * This value is initialized when the class is loaded.
1349      * </p>
1350      *
1351      * @since 3.4
1352      */
1353     public static final boolean IS_OS_MAC_OSX_JAGUAR = getOsMatches("Mac OS X", "10.2");
1354 
1355     /**
1356      * The constant {@code true} if this is macOS X Panther.
1357      * <p>
1358      * The value depends on the value of the {@link #OS_NAME} and {@link #OS_VERSION} constants.
1359      * </p>
1360      * <p>
1361      * The value is {@code false} if {@link #OS_NAME} or {@link #OS_VERSION} is {@code null}.
1362      * </p>
1363      * <p>
1364      * This value is initialized when the class is loaded.
1365      * </p>
1366      *
1367      * @since 3.4
1368      */
1369     public static final boolean IS_OS_MAC_OSX_PANTHER = getOsMatches("Mac OS X", "10.3");
1370 
1371     /**
1372      * The constant {@code true} if this is macOS X Tiger.
1373      * <p>
1374      * The value depends on the value of the {@link #OS_NAME} and {@link #OS_VERSION} constants.
1375      * </p>
1376      * <p>
1377      * The value is {@code false} if {@link #OS_NAME} or {@link #OS_VERSION} is {@code null}.
1378      * </p>
1379      * <p>
1380      * This value is initialized when the class is loaded.
1381      * </p>
1382      *
1383      * @since 3.4
1384      */
1385     public static final boolean IS_OS_MAC_OSX_TIGER = getOsMatches("Mac OS X", "10.4");
1386 
1387     /**
1388      * The constant {@code true} if this is macOS X Leopard.
1389      * <p>
1390      * The value depends on the value of the {@link #OS_NAME} and {@link #OS_VERSION} constants.
1391      * </p>
1392      * <p>
1393      * The value is {@code false} if {@link #OS_NAME} or {@link #OS_VERSION} is {@code null}.
1394      * </p>
1395      * <p>
1396      * This value is initialized when the class is loaded.
1397      * </p>
1398      *
1399      * @since 3.4
1400      */
1401     public static final boolean IS_OS_MAC_OSX_LEOPARD = getOsMatches("Mac OS X", "10.5");
1402 
1403     /**
1404      * The constant {@code true} if this is macOS X Snow Leopard.
1405      * <p>
1406      * The value depends on the value of the {@link #OS_NAME} and {@link #OS_VERSION} constants.
1407      * </p>
1408      * <p>
1409      * The value is {@code false} if {@link #OS_NAME} or {@link #OS_VERSION} is {@code null}.
1410      * </p>
1411      * <p>
1412      * This value is initialized when the class is loaded.
1413      * </p>
1414      *
1415      * @since 3.4
1416      */
1417     public static final boolean IS_OS_MAC_OSX_SNOW_LEOPARD = getOsMatches("Mac OS X", "10.6");
1418 
1419     /**
1420      * The constant {@code true} if this is macOS X Lion.
1421      * <p>
1422      * The value depends on the value of the {@link #OS_NAME} and {@link #OS_VERSION} constants.
1423      * </p>
1424      * <p>
1425      * The value is {@code false} if {@link #OS_NAME} or {@link #OS_VERSION} is {@code null}.
1426      * </p>
1427      * <p>
1428      * This value is initialized when the class is loaded.
1429      * </p>
1430      *
1431      * @since 3.4
1432      */
1433     public static final boolean IS_OS_MAC_OSX_LION = getOsMatches("Mac OS X", "10.7");
1434 
1435     /**
1436      * The constant {@code true} if this is macOS X Mountain Lion.
1437      * <p>
1438      * The value depends on the value of the {@link #OS_NAME} and {@link #OS_VERSION} constants.
1439      * </p>
1440      * <p>
1441      * The value is {@code false} if {@link #OS_NAME} or {@link #OS_VERSION} is {@code null}.
1442      * </p>
1443      * <p>
1444      * This value is initialized when the class is loaded.
1445      * </p>
1446      *
1447      * @since 3.4
1448      */
1449     public static final boolean IS_OS_MAC_OSX_MOUNTAIN_LION = getOsMatches("Mac OS X", "10.8");
1450 
1451     /**
1452      * The constant {@code true} if this is macOS X Mavericks.
1453      * <p>
1454      * The value depends on the value of the {@link #OS_NAME} and {@link #OS_VERSION} constants.
1455      * </p>
1456      * <p>
1457      * The value is {@code false} if {@link #OS_NAME} or {@link #OS_VERSION} is {@code null}.
1458      * </p>
1459      * <p>
1460      * This value is initialized when the class is loaded.
1461      * </p>
1462      *
1463      * @since 3.4
1464      */
1465     public static final boolean IS_OS_MAC_OSX_MAVERICKS = getOsMatches("Mac OS X", "10.9");
1466 
1467     /**
1468      * The constant {@code true} if this is macOS X Yosemite.
1469      * <p>
1470      * The value depends on the value of the {@link #OS_NAME} and {@link #OS_VERSION} constants.
1471      * </p>
1472      * <p>
1473      * The value is {@code false} if {@link #OS_NAME} or {@link #OS_VERSION} is {@code null}.
1474      * </p>
1475      * <p>
1476      * This value is initialized when the class is loaded.
1477      * </p>
1478      *
1479      * @since 3.4
1480      */
1481     public static final boolean IS_OS_MAC_OSX_YOSEMITE = getOsMatches("Mac OS X", "10.10");
1482 
1483     /**
1484      * The constant {@code true} if this is macOS X El Capitan.
1485      * <p>
1486      * The value depends on the value of the {@link #OS_NAME} and {@link #OS_VERSION} constants.
1487      * </p>
1488      * <p>
1489      * The value is {@code false} if {@link #OS_NAME} or {@link #OS_VERSION} is {@code null}.
1490      * </p>
1491      * <p>
1492      * This value is initialized when the class is loaded.
1493      * </p>
1494      *
1495      * @since 3.5
1496      */
1497     public static final boolean IS_OS_MAC_OSX_EL_CAPITAN = getOsMatches("Mac OS X", "10.11");
1498 
1499     /**
1500      * The constant {@code true} if this is macOS X Sierra.
1501      * <p>
1502      * The value depends on the value of the {@link #OS_NAME} and {@link #OS_VERSION} constants.
1503      * </p>
1504      * <p>
1505      * The value is {@code false} if {@link #OS_NAME} or {@link #OS_VERSION} is {@code null}.
1506      * </p>
1507      * <p>
1508      * This value is initialized when the class is loaded.
1509      * </p>
1510      *
1511      * @since 3.12.0
1512      */
1513     public static final boolean IS_OS_MAC_OSX_SIERRA = getOsMatches("Mac OS X", "10.12");
1514 
1515     /**
1516      * The constant {@code true} if this is macOS X High Sierra.
1517      * <p>
1518      * The value depends on the value of the {@link #OS_NAME} and {@link #OS_VERSION} constants.
1519      * </p>
1520      * <p>
1521      * The value is {@code false} if {@link #OS_NAME} or {@link #OS_VERSION} is {@code null}.
1522      * </p>
1523      * <p>
1524      * This value is initialized when the class is loaded.
1525      * </p>
1526      *
1527      * @since 3.12.0
1528      */
1529     public static final boolean IS_OS_MAC_OSX_HIGH_SIERRA = getOsMatches("Mac OS X", "10.13");
1530 
1531     /**
1532      * The constant {@code true} if this is macOS X Mojave.
1533      * <p>
1534      * The value depends on the value of the {@link #OS_NAME} and {@link #OS_VERSION} constants.
1535      * </p>
1536      * <p>
1537      * The value is {@code false} if {@link #OS_NAME} or {@link #OS_VERSION} is {@code null}.
1538      * </p>
1539      * <p>
1540      * This value is initialized when the class is loaded.
1541      * </p>
1542      *
1543      * @since 3.12.0
1544      */
1545     public static final boolean IS_OS_MAC_OSX_MOJAVE = getOsMatches("Mac OS X", "10.14");
1546 
1547     /**
1548      * The constant {@code true} if this is macOS X Catalina.
1549      *
1550      * <p>
1551      * The field will return {@code false} if {@code OS_NAME} is {@code null}.
1552      * </p>
1553      * <p>
1554      * This value is initialized when the class is loaded.
1555      * </p>
1556      *
1557      * @since 3.12.0
1558      */
1559     public static final boolean IS_OS_MAC_OSX_CATALINA = getOsMatches("Mac OS X", "10.15");
1560 
1561     /**
1562      * The constant {@code true} if this is macOS X Big Sur.
1563      * <p>
1564      * The value depends on the value of the {@link #OS_NAME} and {@link #OS_VERSION} constants.
1565      * </p>
1566      * <p>
1567      * The value is {@code false} if {@link #OS_NAME} or {@link #OS_VERSION} is {@code null}.
1568      * </p>
1569      * <p>
1570      * This value is initialized when the class is loaded.
1571      * </p>
1572      *
1573      * @since 3.12.0
1574      */
1575     public static final boolean IS_OS_MAC_OSX_BIG_SUR = getOsMatches("Mac OS X", "11");
1576 
1577     /**
1578      * The constant {@code true} if this is macOS X Monterey.
1579      * <p>
1580      * The value depends on the value of the {@link #OS_NAME} and {@link #OS_VERSION} constants.
1581      * </p>
1582      * <p>
1583      * The value is {@code false} if {@link #OS_NAME} or {@link #OS_VERSION} is {@code null}.
1584      * </p>
1585      * <p>
1586      * This value is initialized when the class is loaded.
1587      * </p>
1588      *
1589      * @since 3.13.0
1590      */
1591     public static final boolean IS_OS_MAC_OSX_MONTEREY = getOsMatches("Mac OS X", "12");
1592 
1593     /**
1594      * The constant {@code true} if this is macOS X Ventura.
1595      * <p>
1596      * The value depends on the value of the {@link #OS_NAME} and {@link #OS_VERSION} constants.
1597      * </p>
1598      * <p>
1599      * The value is {@code false} if {@link #OS_NAME} or {@link #OS_VERSION} is {@code null}.
1600      * </p>
1601      * <p>
1602      * This value is initialized when the class is loaded.
1603      * </p>
1604      *
1605      * @since 3.13.0
1606      */
1607     public static final boolean IS_OS_MAC_OSX_VENTURA = getOsMatches("Mac OS X", "13");
1608 
1609     /**
1610      * The constant {@code true} if this is macOS X Sonoma.
1611      * <p>
1612      * The value depends on the value of the {@link #OS_NAME} and {@link #OS_VERSION} constants.
1613      * </p>
1614      * <p>
1615      * The value is {@code false} if {@link #OS_NAME} or {@link #OS_VERSION} is {@code null}.
1616      * </p>
1617      * <p>
1618      * This value is initialized when the class is loaded.
1619      * </p>
1620      *
1621      * @since 3.15.0
1622      */
1623     public static final boolean IS_OS_MAC_OSX_SONOMA = getOsMatches("Mac OS X", "14");
1624 
1625     /**
1626      * The constant {@code true} if this is macOS X Sequoia.
1627      * <p>
1628      * The value depends on the value of the {@link #OS_NAME} and {@link #OS_VERSION} constants.
1629      * </p>
1630      * <p>
1631      * The value is {@code false} if {@link #OS_NAME} or {@link #OS_VERSION} is {@code null}.
1632      * </p>
1633      * <p>
1634      * This value is initialized when the class is loaded.
1635      * </p>
1636      *
1637      * @since 3.18.0
1638      */
1639     public static final boolean IS_OS_MAC_OSX_SEQUOIA = getOsMatches("Mac OS X", "15");
1640 
1641     /**
1642      * The constant {@code true} if this is FreeBSD.
1643      * <p>
1644      * The result depends on the value of the {@link #OS_NAME} constant.
1645      * </p>
1646      * <p>
1647      * The field will return {@code false} if {@link #OS_NAME} is {@code null}.
1648      * </p>
1649      * <p>
1650      * This value is initialized when the class is loaded.
1651      * </p>
1652      *
1653      * @since 3.1
1654      */
1655     public static final boolean IS_OS_FREE_BSD = getOsNameMatches("FreeBSD");
1656 
1657     /**
1658      * The constant {@code true} if this is OpenBSD.
1659      * <p>
1660      * The result depends on the value of the {@link #OS_NAME} constant.
1661      * </p>
1662      * <p>
1663      * The field will return {@code false} if {@link #OS_NAME} is {@code null}.
1664      * </p>
1665      * <p>
1666      * This value is initialized when the class is loaded.
1667      * </p>
1668      *
1669      * @since 3.1
1670      */
1671     public static final boolean IS_OS_OPEN_BSD = getOsNameMatches("OpenBSD");
1672 
1673     /**
1674      * The constant {@code true} if this is NetBSD.
1675      * <p>
1676      * The result depends on the value of the {@link #OS_NAME} constant.
1677      * </p>
1678      * <p>
1679      * The field will return {@code false} if {@link #OS_NAME} is {@code null}.
1680      * </p>
1681      * <p>
1682      * This value is initialized when the class is loaded.
1683      * </p>
1684      *
1685      * @since 3.1
1686      */
1687     public static final boolean IS_OS_NET_BSD = getOsNameMatches("NetBSD");
1688 
1689     /**
1690      * The constant {@code true} if this is Netware.
1691      * <p>
1692      * The result depends on the value of the {@link #OS_NAME} constant.
1693      * </p>
1694      * <p>
1695      * The field will return {@code false} if {@link #OS_NAME} is {@code null}.
1696      * </p>
1697      * <p>
1698      * This value is initialized when the class is loaded.
1699      * </p>
1700      *
1701      * @since 3.19.0
1702      */
1703     public static final boolean IS_OS_NETWARE = getOsNameMatches("Netware");
1704 
1705     /**
1706      * The constant {@code true} if this is OS/2.
1707      * <p>
1708      * The result depends on the value of the {@link #OS_NAME} constant.
1709      * </p>
1710      * <p>
1711      * The field will return {@code false} if {@link #OS_NAME} is {@code null}.
1712      * </p>
1713      * <p>
1714      * This value is initialized when the class is loaded.
1715      * </p>
1716      *
1717      * @since 2.0
1718      */
1719     public static final boolean IS_OS_OS2 = getOsNameMatches("OS/2");
1720 
1721     /**
1722      * The constant {@code true} if this is Solaris.
1723      * <p>
1724      * The result depends on the value of the {@link #OS_NAME} constant.
1725      * </p>
1726      * <p>
1727      * The field will return {@code false} if {@link #OS_NAME} is {@code null}.
1728      * </p>
1729      * <p>
1730      * This value is initialized when the class is loaded.
1731      * </p>
1732      *
1733      * @since 2.0
1734      */
1735     public static final boolean IS_OS_SOLARIS = getOsNameMatches("Solaris");
1736 
1737     /**
1738      * The constant {@code true} if this is SunOS.
1739      * <p>
1740      * The result depends on the value of the {@link #OS_NAME} constant.
1741      * </p>
1742      * <p>
1743      * The field will return {@code false} if {@link #OS_NAME} is {@code null}.
1744      * </p>
1745      * <p>
1746      * This value is initialized when the class is loaded.
1747      * </p>
1748      *
1749      * @since 2.0
1750      */
1751     public static final boolean IS_OS_SUN_OS = getOsNameMatches("SunOS");
1752 
1753     /**
1754      * The constant {@code true} if this is a Unix like system, as in any of AIX, HP-UX, Irix, Linux, MacOSX, Solaris or SUN OS.
1755      *
1756      * <p>
1757      * The field will return {@code false} if {@code OS_NAME} is {@code null}.
1758      * </p>
1759      * <p>
1760      * This value is initialized when the class is loaded.
1761      * </p>
1762      *
1763      * @since 2.1
1764      */
1765     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 || IS_OS_SUN_OS
1766             || IS_OS_FREE_BSD || IS_OS_OPEN_BSD || IS_OS_NET_BSD;
1767 
1768     /**
1769      * The constant {@code true} if this is Windows.
1770      * <p>
1771      * The result depends on the value of the {@link #OS_NAME} constant.
1772      * </p>
1773      * <p>
1774      * The field will return {@code false} if {@link #OS_NAME} is {@code null}.
1775      * </p>
1776      * <p>
1777      * This value is initialized when the class is loaded.
1778      * </p>
1779      *
1780      * @since 2.0
1781      */
1782     public static final boolean IS_OS_WINDOWS = getOsNameMatches(OS_NAME_WINDOWS_PREFIX);
1783 
1784     /**
1785      * The constant {@code true} if this is Windows 2000.
1786      * <p>
1787      * The result depends on the value of the {@link #OS_NAME} constant.
1788      * </p>
1789      * <p>
1790      * The field will return {@code false} if {@link #OS_NAME} is {@code null}.
1791      * </p>
1792      * <p>
1793      * This value is initialized when the class is loaded.
1794      * </p>
1795      *
1796      * @since 2.0
1797      */
1798     public static final boolean IS_OS_WINDOWS_2000 = getOsNameMatches(OS_NAME_WINDOWS_PREFIX + " 2000");
1799 
1800     /**
1801      * The constant {@code true} if this is Windows 2003.
1802      * <p>
1803      * The result depends on the value of the {@link #OS_NAME} constant.
1804      * </p>
1805      * <p>
1806      * The field will return {@code false} if {@link #OS_NAME} is {@code null}.
1807      * </p>
1808      * <p>
1809      * This value is initialized when the class is loaded.
1810      * </p>
1811      *
1812      * @since 3.1
1813      */
1814     public static final boolean IS_OS_WINDOWS_2003 = getOsNameMatches(OS_NAME_WINDOWS_PREFIX + " 2003");
1815 
1816     /**
1817      * The constant {@code true} if this is Windows Server 2008.
1818      * <p>
1819      * The result depends on the value of the {@link #OS_NAME} constant.
1820      * </p>
1821      * <p>
1822      * The field will return {@code false} if {@link #OS_NAME} is {@code null}.
1823      * </p>
1824      * <p>
1825      * This value is initialized when the class is loaded.
1826      * </p>
1827      *
1828      * @since 3.1
1829      */
1830     public static final boolean IS_OS_WINDOWS_2008 = getOsNameMatches(OS_NAME_WINDOWS_PREFIX + " Server 2008");
1831 
1832     /**
1833      * The constant {@code true} if this is Windows Server 2012.
1834      * <p>
1835      * The result depends on the value of the {@link #OS_NAME} constant.
1836      * </p>
1837      * <p>
1838      * The field will return {@code false} if {@link #OS_NAME} is {@code null}.
1839      * </p>
1840      * <p>
1841      * This value is initialized when the class is loaded.
1842      * </p>
1843      *
1844      * @since 3.4
1845      */
1846     public static final boolean IS_OS_WINDOWS_2012 = getOsNameMatches(OS_NAME_WINDOWS_PREFIX + " Server 2012");
1847 
1848     /**
1849      * The constant {@code true} if this is Windows 95.
1850      * <p>
1851      * The result depends on the value of the {@link #OS_NAME} constant.
1852      * </p>
1853      * <p>
1854      * The field will return {@code false} if {@link #OS_NAME} is {@code null}.
1855      * </p>
1856      * <p>
1857      * This value is initialized when the class is loaded.
1858      * </p>
1859      *
1860      * @since 2.0
1861      */
1862     public static final boolean IS_OS_WINDOWS_95 = getOsNameMatches(OS_NAME_WINDOWS_PREFIX + " 95");
1863 
1864     /**
1865      * The constant {@code true} if this is Windows 98.
1866      * <p>
1867      * The result depends on the value of the {@link #OS_NAME} constant.
1868      * </p>
1869      * <p>
1870      * The field will return {@code false} if {@link #OS_NAME} is {@code null}.
1871      * </p>
1872      * <p>
1873      * This value is initialized when the class is loaded.
1874      * </p>
1875      *
1876      * @since 2.0
1877      */
1878     public static final boolean IS_OS_WINDOWS_98 = getOsNameMatches(OS_NAME_WINDOWS_PREFIX + " 98");
1879 
1880     /**
1881      * The constant {@code true} if this is Windows ME.
1882      * <p>
1883      * The result depends on the value of the {@link #OS_NAME} constant.
1884      * </p>
1885      * <p>
1886      * The field will return {@code false} if {@link #OS_NAME} is {@code null}.
1887      * </p>
1888      * <p>
1889      * This value is initialized when the class is loaded.
1890      * </p>
1891      *
1892      * @since 2.0
1893      */
1894     public static final boolean IS_OS_WINDOWS_ME = getOsNameMatches(OS_NAME_WINDOWS_PREFIX + " Me");
1895 
1896     /**
1897      * The constant {@code true} if this is Windows NT.
1898      * <p>
1899      * The result depends on the value of the {@link #OS_NAME} constant.
1900      * </p>
1901      * <p>
1902      * The field will return {@code false} if {@link #OS_NAME} is {@code null}.
1903      * </p>
1904      * <p>
1905      * This value is initialized when the class is loaded.
1906      * </p>
1907      *
1908      * @since 2.0
1909      */
1910     public static final boolean IS_OS_WINDOWS_NT = getOsNameMatches(OS_NAME_WINDOWS_PREFIX + " NT");
1911 
1912     /**
1913      * The constant {@code true} if this is Windows XP.
1914      * <p>
1915      * The result depends on the value of the {@link #OS_NAME} constant.
1916      * </p>
1917      * <p>
1918      * The field will return {@code false} if {@link #OS_NAME} is {@code null}.
1919      * </p>
1920      * <p>
1921      * This value is initialized when the class is loaded.
1922      * </p>
1923      *
1924      * @since 2.0
1925      */
1926     public static final boolean IS_OS_WINDOWS_XP = getOsNameMatches(OS_NAME_WINDOWS_PREFIX + " XP");
1927 
1928     /**
1929      * The constant {@code true} if this is Windows Vista.
1930      * <p>
1931      * The result depends on the value of the {@link #OS_NAME} constant.
1932      * </p>
1933      * <p>
1934      * The field will return {@code false} if {@link #OS_NAME} is {@code null}.
1935      * </p>
1936      * <p>
1937      * This value is initialized when the class is loaded.
1938      * </p>
1939      *
1940      * @since 2.4
1941      */
1942     public static final boolean IS_OS_WINDOWS_VISTA = getOsNameMatches(OS_NAME_WINDOWS_PREFIX + " Vista");
1943 
1944     /**
1945      * The constant {@code true} if this is Windows 7.
1946      * <p>
1947      * The result depends on the value of the {@link #OS_NAME} constant.
1948      * </p>
1949      * <p>
1950      * The field will return {@code false} if {@link #OS_NAME} is {@code null}.
1951      * </p>
1952      * <p>
1953      * This value is initialized when the class is loaded.
1954      * </p>
1955      *
1956      * @since 3.0
1957      */
1958     public static final boolean IS_OS_WINDOWS_7 = getOsNameMatches(OS_NAME_WINDOWS_PREFIX + " 7");
1959 
1960     /**
1961      * The constant {@code true} if this is Windows 8.
1962      * <p>
1963      * The result depends on the value of the {@link #OS_NAME} constant.
1964      * </p>
1965      * <p>
1966      * The field will return {@code false} if {@link #OS_NAME} is {@code null}.
1967      * </p>
1968      * <p>
1969      * This value is initialized when the class is loaded.
1970      * </p>
1971      *
1972      * @since 3.2
1973      */
1974     public static final boolean IS_OS_WINDOWS_8 = getOsNameMatches(OS_NAME_WINDOWS_PREFIX + " 8");
1975 
1976     /**
1977      * The constant {@code true} if this is Windows 10.
1978      * <p>
1979      * The result depends on the value of the {@link #OS_NAME} constant.
1980      * </p>
1981      * <p>
1982      * The field will return {@code false} if {@link #OS_NAME} is {@code null}.
1983      * </p>
1984      * <p>
1985      * This value is initialized when the class is loaded.
1986      * </p>
1987      *
1988      * @since 3.5
1989      */
1990     public static final boolean IS_OS_WINDOWS_10 = getOsNameMatches(OS_NAME_WINDOWS_PREFIX + " 10");
1991 
1992     /**
1993      * The constant {@code true} if this is Windows 11.
1994      * <p>
1995      * The result depends on the value of the {@link #OS_NAME} constant.
1996      * </p>
1997      * <p>
1998      * The field will return {@code false} if {@link #OS_NAME} is {@code null}.
1999      * </p>
2000      * <p>
2001      * OpenJDK fixed the return value for {@code os.name} on Windows 11 to versions 8, 11, and 17:
2002      * </p>
2003      * <ul>
2004      * <li>Affects Java versions 7u321, 8u311, 11.0.13-oracle, 17.0.1: https://bugs.openjdk.org/browse/JDK-8274737</li>
2005      * <li>Fixed in OpenJDK commit https://github.com/openjdk/jdk/commit/97ea9dd2f24f9f1fb9b9345a4202a825ee28e014</li>
2006      * </ul>
2007      * <p>
2008      * This value is initialized when the class is loaded.
2009      * </p>
2010      *
2011      * @since 3.13.0
2012      */
2013     public static final boolean IS_OS_WINDOWS_11 = getOsNameMatches(OS_NAME_WINDOWS_PREFIX + " 11");
2014 
2015     /**
2016      * The constant {@code true} if this is z/OS.
2017      * <p>
2018      * The result depends on the value of the {@link #OS_NAME} constant.
2019      * </p>
2020      * <p>
2021      * The field will return {@code false} if {@link #OS_NAME} is {@code null}.
2022      * </p>
2023      * <p>
2024      * This value is initialized when the class is loaded.
2025      * </p>
2026      *
2027      * @since 3.5
2028      */
2029     // Values on a z/OS system I tested (Gary Gregory - 2016-03-12)
2030     // os.arch = s390x
2031     // os.encoding = ISO8859_1
2032     // os.name = z/OS
2033     // os.version = 02.02.00
2034     public static final boolean IS_OS_ZOS = getOsNameMatches("z/OS");
2035 
2036     /**
2037      * The System property key for the user home directory.
2038      */
2039     public static final String USER_HOME_KEY = "user.home";
2040 
2041     /**
2042      * The System property key for the user name.
2043      *
2044      * @deprecated Use {@link SystemProperties#USER_NAME}.
2045      */
2046     @Deprecated
2047     public static final String USER_NAME_KEY = "user.name";
2048 
2049     /**
2050      * The System property key for the user directory.
2051      *
2052      * @deprecated Use {@link SystemProperties#USER_DIR}.
2053      */
2054     @Deprecated
2055     public static final String USER_DIR_KEY = "user.dir";
2056 
2057     /**
2058      * The System property key for the Java IO temporary directory.
2059      *
2060      * @deprecated Use {@link SystemProperties#JAVA_IO_TMPDIR}.
2061      */
2062     @Deprecated
2063     public static final String JAVA_IO_TMPDIR_KEY = "java.io.tmpdir";
2064 
2065     /**
2066      * The System property key for the Java home directory.
2067      *
2068      * @deprecated Use {@link SystemProperties#JAVA_HOME}.
2069      */
2070     @Deprecated
2071     public static final String JAVA_HOME_KEY = "java.home";
2072 
2073     /**
2074      * A constant for the System Property {@code awt.toolkit}.
2075      *
2076      * <p>
2077      * Holds a class name, on Windows XP this is {@code sun.awt.windows.WToolkit}.
2078      * </p>
2079      * <p>
2080      * <strong>On platforms without a GUI, this value is {@code null}.</strong>
2081      * </p>
2082      * <p>
2083      * Defaults to {@code null} if the runtime does not have security access to read this property or the property does not exist.
2084      * </p>
2085      * <p>
2086      * This value is initialized when the class is loaded. If {@link System#setProperty(String,String)} or {@link System#setProperties(java.util.Properties)} is
2087      * called after this class is loaded, the value will be out of sync with that System property.
2088      * </p>
2089      *
2090      * @since 2.1
2091      * @see SystemProperties#getAwtToolkit()
2092      * @deprecated Deprecated without replacement.
2093      */
2094     @Deprecated
2095     public static final String AWT_TOOLKIT = SystemProperties.getAwtToolkit();
2096 
2097     /**
2098      * Gets an environment variable, defaulting to {@code defaultValue} if the variable cannot be read.
2099      *
2100      * <p>
2101      * If a {@link SecurityException} is caught, the return value is {@code defaultValue} and a message is written to {@code System.err}.
2102      * </p>
2103      *
2104      * @param name         the environment variable name.
2105      * @param defaultValue the default value.
2106      * @return the environment variable value or {@code defaultValue} if a security problem occurs.
2107      * @since 3.8
2108      */
2109     public static String getEnvironmentVariable(final String name, final String defaultValue) {
2110         try {
2111             final String value = System.getenv(name);
2112             return value == null ? defaultValue : value;
2113         } catch (final SecurityException ex) {
2114             // we are not allowed to look at this property
2115             // System.err.println("Caught a SecurityException reading the environment variable '" + name + "'.");
2116             return defaultValue;
2117         }
2118     }
2119 
2120     /**
2121      * Gets the host name from an environment variable ({@code COMPUTERNAME} on Windows, {@code HOSTNAME} elsewhere).
2122      *
2123      * <p>
2124      * If you want to know what the network stack says is the host name, you should use {@code InetAddress.getLocalHost().getHostName()}.
2125      * </p>
2126      *
2127      * @return the host name. Will be {@code null} if the environment variable is not defined.
2128      * @since 3.6
2129      */
2130     public static String getHostName() {
2131         return IS_OS_WINDOWS ? System.getenv("COMPUTERNAME") : System.getenv("HOSTNAME");
2132     }
2133 
2134     /**
2135      * Gets the current Java home directory as a {@link File}.
2136      *
2137      * @return a directory.
2138      * @throws SecurityException if a security manager exists and its {@code checkPropertyAccess} method doesn't allow access to the specified system property.
2139      * @see SystemProperties#getJavaHome()
2140      * @since 2.1
2141      */
2142     public static File getJavaHome() {
2143         return new File(SystemProperties.getJavaHome());
2144     }
2145 
2146     /**
2147      * Gets the current Java home directory as a {@link File}.
2148      *
2149      * @return a directory.
2150      * @throws SecurityException if a security manager exists and its {@code checkPropertyAccess} method doesn't allow access to the specified system property.
2151      * @see SystemProperties#getJavaHome()
2152      * @since 3.18.0
2153      */
2154     public static Path getJavaHomePath() {
2155         return Paths.get(SystemProperties.getJavaHome());
2156     }
2157 
2158     /**
2159      * Gets the current Java IO temporary directory as a {@link File}.
2160      *
2161      * @return a directory.
2162      * @throws SecurityException if a security manager exists and its {@code checkPropertyAccess} method doesn't allow access to the specified system property.
2163      * @see SystemProperties#getJavaIoTmpdir()
2164      * @since 2.1
2165      */
2166     public static File getJavaIoTmpDir() {
2167         return new File(SystemProperties.getJavaIoTmpdir());
2168     }
2169 
2170     /**
2171      * Gets the current Java IO temporary directory as a {@link Path}.
2172      *
2173      * @return a directory.
2174      * @throws SecurityException if a security manager exists and its {@code checkPropertyAccess} method doesn't allow access to the specified system property.
2175      * @see SystemProperties#getJavaIoTmpdir()
2176      * @since 3.18.0
2177      */
2178     public static Path getJavaIoTmpDirPath() {
2179         return Paths.get(SystemProperties.getJavaIoTmpdir());
2180     }
2181 
2182     /**
2183      * Tests if the Java version matches the version we are running.
2184      * <p>
2185      * The result depends on the value of the {@link #JAVA_SPECIFICATION_VERSION} constant.
2186      * </p>
2187      *
2188      * @param versionPrefix the prefix for the Java version.
2189      * @return true if matches, or false if not or can't determine.
2190      */
2191     private static boolean getJavaVersionMatches(final String versionPrefix) {
2192         return isJavaVersionMatch(JAVA_SPECIFICATION_VERSION, versionPrefix);
2193     }
2194 
2195     /**
2196      * Tests if the operating system matches the given name prefix and version prefix.
2197      * <p>
2198      * The result depends on the value of the {@link #OS_NAME} and {@link #OS_VERSION} constants.
2199      * </p>
2200      * <p>
2201      * The method returns {@code false} if {@link #OS_NAME} or {@link #OS_VERSION} is {@code null}.
2202      * </p>
2203      *
2204      * @param osNamePrefix    the prefix for the OS name.
2205      * @param osVersionPrefix the prefix for the version.
2206      * @return true if matches, or false if not or can't determine.
2207      */
2208     private static boolean getOsMatches(final String osNamePrefix, final String osVersionPrefix) {
2209         return isOsMatch(OS_NAME, OS_VERSION, osNamePrefix, osVersionPrefix);
2210     }
2211 
2212     /**
2213      * Tests if the operating system matches the given string with a case-insensitive comparison.
2214      * <p>
2215      * The result depends on the value of the {@link #OS_NAME} constant.
2216      * </p>
2217      * <p>
2218      * The method returns {@code false} if {@link #OS_NAME} is {@code null}.
2219      * </p>
2220      *
2221      * @param osNamePrefix the prefix for the OS name.
2222      * @return true if matches, or false if not or can't determine.
2223      */
2224     private static boolean getOsNameMatches(final String osNamePrefix) {
2225         return isOsNameMatch(OS_NAME, osNamePrefix);
2226     }
2227 
2228     /**
2229      * Gets the current user directory as a {@link File}.
2230      * <p>
2231      * The result is based on the system property {@value SystemProperties#USER_DIR}.
2232      * </p>
2233      *
2234      * @return a directory.
2235      * @throws SecurityException if a security manager exists and its {@code checkPropertyAccess} method doesn't allow access to the specified system property.
2236      * @see SystemProperties#getUserDir()
2237      * @since 2.1
2238      */
2239     public static File getUserDir() {
2240         return new File(SystemProperties.getUserDir());
2241     }
2242 
2243     /**
2244      * Gets the current user directory as a {@link Path}.
2245      * <p>
2246      * The result is based on the system property {@value SystemProperties#USER_DIR}.
2247      * </p>
2248      *
2249      * @return a directory.
2250      * @throws SecurityException if a security manager exists and its {@code checkPropertyAccess} method doesn't allow access to the specified system property.
2251      * @see SystemProperties#getUserDir()
2252      * @since 3.18.0
2253      */
2254     public static Path getUserDirPath() {
2255         return Paths.get(SystemProperties.getUserDir());
2256     }
2257 
2258     /**
2259      * Gets the current user home directory as a {@link File}.
2260      * <p>
2261      * The result is based on the system property {@value SystemProperties#USER_HOME}.
2262      * </p>
2263      *
2264      * @return a directory.
2265      * @throws SecurityException if a security manager exists and its {@code checkPropertyAccess} method doesn't allow access to the specified system property.
2266      * @see SystemProperties#getUserHome()
2267      * @since 2.1
2268      */
2269     public static File getUserHome() {
2270         return new File(SystemProperties.getUserHome());
2271     }
2272 
2273     /**
2274      * Gets the current user home directory as a {@link Path}.
2275      * <p>
2276      * The result is based on the system property {@value SystemProperties#USER_HOME}.
2277      * </p>
2278      *
2279      * @return a directory.
2280      * @throws SecurityException if a security manager exists and its {@code checkPropertyAccess} method doesn't allow access to the specified system property.
2281      * @see SystemProperties#getUserHome()
2282      * @since 3.18.0
2283      */
2284     public static Path getUserHomePath() {
2285         return Paths.get(SystemProperties.getUserHome());
2286     }
2287 
2288     /**
2289      * Gets the current user name.
2290      * <p>
2291      * The result is based on the system property {@value SystemProperties#USER_NAME}.
2292      * </p>
2293      *
2294      * @return a name.
2295      * @throws SecurityException if a security manager exists and its {@code checkPropertyAccess} method doesn't allow access to the specified system property.
2296      * @see SystemProperties#getUserName()
2297      * @since 3.10
2298      * @deprecated Use {@link SystemProperties#getUserName()}.
2299      */
2300     @Deprecated
2301     public static String getUserName() {
2302         return SystemProperties.getUserName();
2303     }
2304 
2305     /**
2306      * Gets the user name.
2307      * <p>
2308      * The result is based on the system property {@value SystemProperties#USER_NAME}.
2309      * </p>
2310      *
2311      * @param defaultValue A default value.
2312      * @return a name.
2313      * @throws SecurityException if a security manager exists and its {@code checkPropertyAccess} method doesn't allow access to the specified system property.
2314      * @see SystemProperties#getUserName()
2315      * @since 3.10
2316      * @deprecated Use {@link SystemProperties#getUserName(String)}.
2317      */
2318     @Deprecated
2319     public static String getUserName(final String defaultValue) {
2320         return SystemProperties.getUserName(defaultValue);
2321     }
2322 
2323     /**
2324      * Tests whether the {@link #JAVA_AWT_HEADLESS} value is {@code true}.
2325      * <p>
2326      * The result is based on the system property {@value SystemProperties#JAVA_AWT_HEADLESS}.
2327      * </p>
2328      *
2329      * @return {@code true} if {@code JAVA_AWT_HEADLESS} is {@code "true"}, {@code false} otherwise.
2330      * @see #JAVA_AWT_HEADLESS
2331      * @since 2.1
2332      * @since Java 1.4
2333      * @deprecated Deprecated without replacement.
2334      */
2335     @Deprecated
2336     public static boolean isJavaAwtHeadless() {
2337         return Boolean.TRUE.toString().equals(JAVA_AWT_HEADLESS);
2338     }
2339 
2340     /**
2341      * Tests whether the Java version is at least the requested version.
2342      * <p>
2343      * The result is based on the system property saved in {@link #JAVA_SPECIFICATION_VERSION}.
2344      * </p>
2345      *
2346      * @param requiredVersion the required version, for example 1.31f.
2347      * @return {@code true} if the actual version is equal or greater than the required version.
2348      */
2349     public static boolean isJavaVersionAtLeast(final JavaVersion requiredVersion) {
2350         return JAVA_SPECIFICATION_VERSION_AS_ENUM != null && JAVA_SPECIFICATION_VERSION_AS_ENUM.atLeast(requiredVersion);
2351     }
2352 
2353     /**
2354      * Tests whether the Java version is at most the requested version.
2355      * <p>
2356      * The result is based on the system property saved in {@link #JAVA_SPECIFICATION_VERSION}.
2357      * </p>
2358      *
2359      * @param requiredVersion the required version, for example 1.31f.
2360      * @return {@code true} if the actual version is equal or less than the required version.
2361      * @since 3.9
2362      */
2363     public static boolean isJavaVersionAtMost(final JavaVersion requiredVersion) {
2364         return JAVA_SPECIFICATION_VERSION_AS_ENUM != null && JAVA_SPECIFICATION_VERSION_AS_ENUM.atMost(requiredVersion);
2365     }
2366 
2367     /**
2368      * Tests whether the Java version matches.
2369      *
2370      * <p>
2371      * This method is package private instead of private to support unit test invocation.
2372      * </p>
2373      *
2374      * @param version       the actual Java version.
2375      * @param versionPrefix the prefix for the expected Java version.
2376      * @return true if matches, or false if not or can't determine.
2377      */
2378     static boolean isJavaVersionMatch(final String version, final String versionPrefix) {
2379         if (version == null) {
2380             return false;
2381         }
2382         return version.startsWith(versionPrefix);
2383     }
2384 
2385     /**
2386      * Tests whether the operating system matches.
2387      * <p>
2388      * This method is package private instead of private to support unit test invocation.
2389      * </p>
2390      *
2391      * @param osName          the actual OS name.
2392      * @param osVersion       the actual OS version.
2393      * @param osNamePrefix    the prefix for the expected OS name.
2394      * @param osVersionPrefix the prefix for the expected OS version.
2395      * @return true if matches, or false if not or can't determine.
2396      */
2397     static boolean isOsMatch(final String osName, final String osVersion, final String osNamePrefix, final String osVersionPrefix) {
2398         if (osName == null || osVersion == null) {
2399             return false;
2400         }
2401         return isOsNameMatch(osName, osNamePrefix) && isOsVersionMatch(osVersion, osVersionPrefix);
2402     }
2403 
2404     /**
2405      * Tests whether the operating system matches with a case-insensitive comparison.
2406      * <p>
2407      * This method is package private instead of private to support unit test invocation.
2408      * </p>
2409      *
2410      * @param osName       the actual OS name.
2411      * @param osNamePrefix the prefix for the expected OS name.
2412      * @return true for a case-insensitive match, or false if not.
2413      */
2414     static boolean isOsNameMatch(final String osName, final String osNamePrefix) {
2415         if (osName == null) {
2416             return false;
2417         }
2418         return Strings.CI.startsWith(osName, osNamePrefix);
2419     }
2420 
2421     /**
2422      * Tests whether the operating system version matches.
2423      * <p>
2424      * This method is package private instead of private to support unit test invocation.
2425      * </p>
2426      *
2427      * @param osVersion       the actual OS version.
2428      * @param osVersionPrefix the prefix for the expected OS version.
2429      * @return true if matches, or false if not or can't determine.
2430      */
2431     static boolean isOsVersionMatch(final String osVersion, final String osVersionPrefix) {
2432         if (StringUtils.isEmpty(osVersion)) {
2433             return false;
2434         }
2435         // Compare parts of the version string instead of using String.startsWith(String) because otherwise
2436         // osVersionPrefix 10.1 would also match osVersion 10.10
2437         final String[] versionPrefixParts = JavaVersion.split(osVersionPrefix);
2438         final String[] versionParts = JavaVersion.split(osVersion);
2439         for (int i = 0; i < Math.min(versionPrefixParts.length, versionParts.length); i++) {
2440             if (!versionPrefixParts[i].equals(versionParts[i])) {
2441                 return false;
2442             }
2443         }
2444         return true;
2445     }
2446 
2447     /**
2448      * SystemUtils instances shouldn't be constructed in standard programming. Instead, elements should be accessed directly, for example
2449      * {@code SystemUtils.FILE_SEPARATOR}.
2450      *
2451      * <p>
2452      * This constructor is public to permit tools that require a JavaBean instance to operate.
2453      * </p>
2454      */
2455     public SystemUtils() {
2456     }
2457 
2458 }