001/*
002 * Licensed to the Apache Software Foundation (ASF) under one or more
003 * contributor license agreements.  See the NOTICE file distributed with
004 * this work for additional information regarding copyright ownership.
005 * The ASF licenses this file to You under the Apache License, Version 2.0
006 * (the "License"); you may not use this file except in compliance with
007 * the License.  You may obtain a copy of the License at
008 *
009 *      http://www.apache.org/licenses/LICENSE-2.0
010 *
011 * Unless required by applicable law or agreed to in writing, software
012 * distributed under the License is distributed on an "AS IS" BASIS,
013 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
014 * See the License for the specific language governing permissions and
015 * limitations under the License.
016 */
017
018package org.apache.commons.lang3;
019
020import java.util.function.BooleanSupplier;
021import java.util.function.IntSupplier;
022import java.util.function.LongSupplier;
023import java.util.function.Supplier;
024
025import org.apache.commons.lang3.function.Suppliers;
026
027/**
028 * Accesses current system property names and values.
029 *
030 * @since 3.13.0
031 */
032public final class SystemProperties {
033
034    /**
035     * The System property name {@value}.
036     */
037    public static final String AWT_TOOLKIT = "awt.toolkit";
038
039    /**
040     * The System property name {@value}.
041     */
042    public static final String FILE_ENCODING = "file.encoding";
043
044    /**
045     * The System property name {@value}.
046     */
047    public static final String FILE_SEPARATOR = "file.separator";
048
049    /**
050     * The System property name {@value}.
051     */
052    public static final String JAVA_AWT_FONTS = "java.awt.fonts";
053
054    /**
055     * The System property name {@value}.
056     */
057    public static final String JAVA_AWT_GRAPHICSENV = "java.awt.graphicsenv";
058
059    /**
060     * The System property name {@value}.
061     */
062    public static final String JAVA_AWT_HEADLESS = "java.awt.headless";
063
064    /**
065     * The System property name {@value}.
066     */
067    public static final String JAVA_AWT_PRINTERJOB = "java.awt.printerjob";
068
069    /**
070     * The System property name {@value}.
071     */
072    public static final String JAVA_CLASS_PATH = "java.class.path";
073
074    /**
075     * The System property name {@value}.
076     */
077    public static final String JAVA_CLASS_VERSION = "java.class.version";
078
079    /**
080     * The System property name {@value}.
081     */
082    public static final String JAVA_COMPILER = "java.compiler";
083
084    /**
085     * The System property name {@value}.
086     */
087    public static final String JAVA_ENDORSED_DIRS = "java.endorsed.dirs";
088
089    /**
090     * The System property name {@value}.
091     */
092    public static final String JAVA_EXT_DIRS = "java.ext.dirs";
093
094    /**
095     * The System property name {@value}.
096     */
097    public static final String JAVA_HOME = "java.home";
098
099    /**
100     * The System property name {@value}.
101     */
102    public static final String JAVA_IO_TMPDIR = "java.io.tmpdir";
103
104    /**
105     * The System property name {@value}.
106     */
107    public static final String JAVA_LIBRARY_PATH = "java.library.path";
108
109    /**
110     * The System property name {@value}.
111     */
112    public static final String JAVA_LOCALE_PROVIDERS = "java.locale.providers";
113
114    /**
115     * The System property name {@value}.
116     */
117    public static final String JAVA_RUNTIME_NAME = "java.runtime.name";
118
119    /**
120     * The System property name {@value}.
121     */
122    public static final String JAVA_RUNTIME_VERSION = "java.runtime.version";
123
124    /**
125     * The System property name {@value}.
126     */
127    public static final String JAVA_SPECIFICATION_NAME = "java.specification.name";
128
129    /**
130     * The System property name {@value}.
131     */
132    public static final String JAVA_SPECIFICATION_VENDOR = "java.specification.vendor";
133
134    /**
135     * The System property name {@value}.
136     */
137    public static final String JAVA_SPECIFICATION_VERSION = "java.specification.version";
138
139    /**
140     * The System property name {@value}.
141     */
142    public static final String JAVA_UTIL_PREFS_PREFERENCES_FACTORY = "java.util.prefs.PreferencesFactory";
143
144    /**
145     * The System property name {@value}.
146     */
147    public static final String JAVA_VENDOR = "java.vendor";
148
149    /**
150     * The System property name {@value}.
151     */
152    public static final String JAVA_VENDOR_URL = "java.vendor.url";
153
154    /**
155     * The System property name {@value}.
156     */
157    public static final String JAVA_VERSION = "java.version";
158
159    /**
160     * The System property name {@value}.
161     */
162    public static final String JAVA_VM_INFO = "java.vm.info";
163
164    /**
165     * The System property name {@value}.
166     */
167    public static final String JAVA_VM_NAME = "java.vm.name";
168
169    /**
170     * The System property name {@value}.
171     */
172    public static final String JAVA_VM_SPECIFICATION_NAME = "java.vm.specification.name";
173
174    /**
175     * The System property name {@value}.
176     */
177    public static final String JAVA_VM_SPECIFICATION_VENDOR = "java.vm.specification.vendor";
178
179    /**
180     * The System property name {@value}.
181     */
182    public static final String JAVA_VM_SPECIFICATION_VERSION = "java.vm.specification.version";
183
184    /**
185     * The System property name {@value}.
186     */
187    public static final String JAVA_VM_VENDOR = "java.vm.vendor";
188
189    /**
190     * The System property name {@value}.
191     */
192    public static final String JAVA_VM_VERSION = "java.vm.version";
193
194    /**
195     * The System property name {@value}.
196     */
197    public static final String LINE_SEPARATOR = "line.separator";
198
199    /**
200     * The System property name {@value}.
201     */
202    public static final String OS_ARCH = "os.arch";
203
204    /**
205     * The System property name {@value}.
206     */
207    public static final String OS_NAME = "os.name";
208
209    /**
210     * The System property name {@value}.
211     */
212    public static final String OS_VERSION = "os.version";
213
214    /**
215     * The System property name {@value}.
216     */
217    public static final String PATH_SEPARATOR = "path.separator";
218
219    /**
220     * The System property name {@value}.
221     */
222    public static final String USER_COUNTRY = "user.country";
223
224    /**
225     * The System property name {@value}.
226     */
227    public static final String USER_DIR = "user.dir";
228
229    /**
230     * The System property name {@value}.
231     */
232    public static final String USER_HOME = "user.home";
233
234    /**
235     * The System property name {@value}.
236     */
237    public static final String USER_LANGUAGE = "user.language";
238
239    /**
240     * The System property name {@value}.
241     */
242    public static final String USER_NAME = "user.name";
243
244    /**
245     * The System property name {@value}.
246     */
247    public static final String USER_REGION = "user.region";
248
249    /**
250     * The System property name {@value}.
251     */
252    public static final String USER_TIMEZONE = "user.timezone";
253
254    /**
255     * Gets the current value from the system properties map.
256     * <p>
257     * Returns {@code null} if the property cannot be read due to a {@link SecurityException}.
258     * </p>
259     *
260     * @return the current value from the system properties map.
261     */
262    public static String getAwtToolkit() {
263        return getProperty(AWT_TOOLKIT);
264    }
265
266    /**
267     * Gets the current value for the property named {@code key} as an {@code boolean}.
268     *
269     * @param key
270     *            The key
271     * @param defaultIfAbsent
272     *            The default value
273     * @return an {@code boolean} or defaultIfAbsent
274     */
275    public static boolean getBoolean(final String key, final BooleanSupplier defaultIfAbsent) {
276        final String str = getProperty(key);
277        return str == null ? defaultIfAbsent != null && defaultIfAbsent.getAsBoolean() : Boolean.parseBoolean(str);
278    }
279
280    /**
281     * Gets the current value from the system properties map.
282     * <p>
283     * Returns {@code null} if the property cannot be read due to a {@link SecurityException}.
284     * </p>
285     * <p>
286     * Returns {@code null} if the property cannot be read due to a {@link SecurityException}.
287     * </p>
288     *
289     * @return the current value from the system properties map.
290     */
291    public static String getFileEncoding() {
292        return getProperty(FILE_ENCODING);
293    }
294
295    /**
296     * Gets the current value from the system properties map.
297     * <p>
298     * Returns {@code null} if the property cannot be read due to a {@link SecurityException}.
299     * </p>
300     *
301     * @return the current value from the system properties map.
302     */
303    public static String getFileSeparator() {
304        return getProperty(FILE_SEPARATOR);
305    }
306
307    /**
308     * Gets the current value for the property named {@code key} as an {@code int}.
309     *
310     * @param key
311     *            The key
312     * @param defaultIfAbsent
313     *            The default value
314     * @return an {@code int} or defaultIfAbsent
315     */
316    public static int getInt(final String key, final IntSupplier defaultIfAbsent) {
317        final String str = getProperty(key);
318        return str == null ? defaultIfAbsent != null ? defaultIfAbsent.getAsInt() : 0 : Integer.parseInt(str);
319    }
320
321    /**
322     * Gets the current value from the system properties map.
323     * <p>
324     * Returns {@code null} if the property cannot be read due to a {@link SecurityException}.
325     * </p>
326     *
327     * @return the current value from the system properties map.
328     */
329    public static String getJavaAwtFonts() {
330        return getProperty(JAVA_AWT_FONTS);
331    }
332
333    /**
334     * Gets the current value from the system properties map.
335     * <p>
336     * Returns {@code null} if the property cannot be read due to a {@link SecurityException}.
337     * </p>
338     *
339     * @return the current value from the system properties map.
340     */
341    public static String getJavaAwtGraphicsenv() {
342        return getProperty(JAVA_AWT_GRAPHICSENV);
343    }
344
345    /**
346     * Gets the current value from the system properties map.
347     * <p>
348     * Returns {@code null} if the property cannot be read due to a {@link SecurityException}.
349     * </p>
350     *
351     * @return the current value from the system properties map.
352     */
353    public static String getJavaAwtHeadless() {
354        return getProperty(JAVA_AWT_HEADLESS);
355    }
356
357    /**
358     * Gets the current value from the system properties map.
359     * <p>
360     * Returns {@code null} if the property cannot be read due to a {@link SecurityException}.
361     * </p>
362     *
363     * @return the current value from the system properties map.
364     */
365    public static String getJavaAwtPrinterjob() {
366        return getProperty(JAVA_AWT_PRINTERJOB);
367    }
368
369    /**
370     * Gets the current value from the system properties map.
371     * <p>
372     * Returns {@code null} if the property cannot be read due to a {@link SecurityException}.
373     * </p>
374     *
375     * @return the current value from the system properties map.
376     */
377    public static String getJavaClassPath() {
378        return getProperty(JAVA_CLASS_PATH);
379    }
380
381    /**
382     * Gets the current value from the system properties map.
383     * <p>
384     * Returns {@code null} if the property cannot be read due to a {@link SecurityException}.
385     * </p>
386     *
387     * @return the current value from the system properties map.
388     */
389    public static String getJavaClassVersion() {
390        return getProperty(JAVA_CLASS_VERSION);
391    }
392
393    /**
394     * Gets the current value from the system properties map.
395     * <p>
396     * Returns {@code null} if the property cannot be read due to a {@link SecurityException}.
397     * </p>
398     *
399     * @return the current value from the system properties map.
400     */
401    public static String getJavaCompiler() {
402        return getProperty(JAVA_COMPILER);
403    }
404
405    /**
406     * Gets the current value from the system properties map.
407     * <p>
408     * Returns {@code null} if the property cannot be read due to a {@link SecurityException}.
409     * </p>
410     *
411     * @return the current value from the system properties map.
412     */
413    public static String getJavaEndorsedDirs() {
414        return getProperty(JAVA_ENDORSED_DIRS);
415    }
416
417    /**
418     * Gets the current value from the system properties map.
419     * <p>
420     * Returns {@code null} if the property cannot be read due to a {@link SecurityException}.
421     * </p>
422     *
423     * @return the current value from the system properties map.
424     */
425    public static String getJavaExtDirs() {
426        return getProperty(JAVA_EXT_DIRS);
427    }
428
429    /**
430     * Gets the current value from the system properties map.
431     * <p>
432     * Returns {@code null} if the property cannot be read due to a {@link SecurityException}.
433     * </p>
434     *
435     * @return the current value from the system properties map.
436     */
437    public static String getJavaHome() {
438        return getProperty(JAVA_HOME);
439    }
440
441    /**
442     * Gets the current value from the system properties map.
443     * <p>
444     * Returns {@code null} if the property cannot be read due to a {@link SecurityException}.
445     * </p>
446     *
447     * @return the current value from the system properties map.
448     */
449    public static String getJavaIoTmpdir() {
450        return getProperty(JAVA_IO_TMPDIR);
451    }
452
453    /**
454     * Gets the current value from the system properties map.
455     * <p>
456     * Returns {@code null} if the property cannot be read due to a {@link SecurityException}.
457     * </p>
458     *
459     * @return the current value from the system properties map.
460     */
461    public static String getJavaLibraryPath() {
462        return getProperty(JAVA_LIBRARY_PATH);
463    }
464
465    /**
466     * Gets the current value from the system properties map.
467     * <p>
468     * Returns {@code null} if the property cannot be read due to a {@link SecurityException}.
469     * </p>
470     * <p>
471     * Java 9 and above.
472     * </p>
473     * @return the current value from the system properties map.
474     */
475    public static String getJavaLocaleProviders() {
476        return getProperty(JAVA_LOCALE_PROVIDERS);
477    }
478
479    /**
480     * Gets the current value from the system properties map.
481     * <p>
482     * Returns {@code null} if the property cannot be read due to a {@link SecurityException}.
483     * </p>
484     *
485     * @return the current value from the system properties map.
486     */
487    public static String getJavaRuntimeName() {
488        return getProperty(JAVA_RUNTIME_NAME);
489    }
490
491    /**
492     * Gets the current value from the system properties map.
493     * <p>
494     * Returns {@code null} if the property cannot be read due to a {@link SecurityException}.
495     * </p>
496     *
497     * @return the current value from the system properties map.
498     */
499    public static String getJavaRuntimeVersion() {
500        return getProperty(JAVA_RUNTIME_VERSION);
501    }
502
503    /**
504     * Gets the current value from the system properties map.
505     * <p>
506     * Returns {@code null} if the property cannot be read due to a {@link SecurityException}.
507     * </p>
508     *
509     * @return the current value from the system properties map.
510     */
511    public static String getJavaSpecificationName() {
512        return getProperty(JAVA_SPECIFICATION_NAME);
513    }
514
515    /**
516     * Gets the current value from the system properties map.
517     * <p>
518     * Returns {@code null} if the property cannot be read due to a {@link SecurityException}.
519     * </p>
520     *
521     * @return the current value from the system properties map.
522     */
523    public static String getJavaSpecificationVendor() {
524        return getProperty(JAVA_SPECIFICATION_VENDOR);
525    }
526
527    /**
528     * Gets the current value from the system properties map.
529     * <p>
530     * Returns {@code null} if the property cannot be read due to a {@link SecurityException}.
531     * </p>
532     *
533     * @return the current value from the system properties map.
534     */
535    public static String getJavaSpecificationVersion() {
536        return getProperty(JAVA_SPECIFICATION_VERSION);
537    }
538
539    /**
540     * Gets the current value from the system properties map.
541     * <p>
542     * Returns {@code null} if the property cannot be read due to a {@link SecurityException}.
543     * </p>
544     *
545     * @return the current value from the system properties map.
546     */
547    public static String getJavaUtilPrefsPreferencesFactory() {
548        return getProperty(JAVA_UTIL_PREFS_PREFERENCES_FACTORY);
549    }
550
551    /**
552     * Gets the current value from the system properties map.
553     * <p>
554     * Returns {@code null} if the property cannot be read due to a {@link SecurityException}.
555     * </p>
556     *
557     * @return the current value from the system properties map.
558     */
559    public static String getJavaVendor() {
560        return getProperty(JAVA_VENDOR);
561    }
562
563    /**
564     * Gets the current value from the system properties map.
565     * <p>
566     * Returns {@code null} if the property cannot be read due to a {@link SecurityException}.
567     * </p>
568     *
569     * @return the current value from the system properties map.
570     */
571    public static String getJavaVendorUrl() {
572        return getProperty(JAVA_VENDOR_URL);
573    }
574
575    /**
576     * Gets the current value from the system properties map.
577     * <p>
578     * Returns {@code null} if the property cannot be read due to a {@link SecurityException}.
579     * </p>
580     *
581     * @return the current value from the system properties map.
582     */
583    public static String getJavaVersion() {
584        return getProperty(JAVA_VERSION);
585    }
586
587    /**
588     * Gets the current value from the system properties map.
589     * <p>
590     * Returns {@code null} if the property cannot be read due to a {@link SecurityException}.
591     * </p>
592     *
593     * @return the current value from the system properties map.
594     */
595    public static String getJavaVmInfo() {
596        return getProperty(JAVA_VM_INFO);
597    }
598
599    /**
600     * Gets the current value from the system properties map.
601     * <p>
602     * Returns {@code null} if the property cannot be read due to a {@link SecurityException}.
603     * </p>
604     *
605     * @return the current value from the system properties map.
606     */
607    public static String getJavaVmName() {
608        return getProperty(JAVA_VM_NAME);
609    }
610
611    /**
612     * Gets the current value from the system properties map.
613     * <p>
614     * Returns {@code null} if the property cannot be read due to a {@link SecurityException}.
615     * </p>
616     *
617     * @return the current value from the system properties map.
618     */
619    public static String getJavaVmSpecificationName() {
620        return getProperty(JAVA_VM_SPECIFICATION_NAME);
621    }
622
623    /**
624     * Gets the current value from the system properties map.
625     * <p>
626     * Returns {@code null} if the property cannot be read due to a {@link SecurityException}.
627     * </p>
628     *
629     * @return the current value from the system properties map.
630     */
631    public static String getJavaVmSpecificationVendor() {
632        return getProperty(JAVA_VM_SPECIFICATION_VENDOR);
633    }
634
635    /**
636     * Gets the current value from the system properties map.
637     * <p>
638     * Returns {@code null} if the property cannot be read due to a {@link SecurityException}.
639     * </p>
640     *
641     * @return the current value from the system properties map.
642     */
643    public static String getJavaVmSpecificationVersion() {
644        return getProperty(JAVA_VM_SPECIFICATION_VERSION);
645    }
646
647    /**
648     * Gets the current value from the system properties map.
649     * <p>
650     * Returns {@code null} if the property cannot be read due to a {@link SecurityException}.
651     * </p>
652     *
653     * @return the current value from the system properties map.
654     */
655    public static String getJavaVmVendor() {
656        return getProperty(JAVA_VM_VENDOR);
657    }
658
659    /**
660     * Gets the current value from the system properties map.
661     * <p>
662     * Returns {@code null} if the property cannot be read due to a {@link SecurityException}.
663     * </p>
664     *
665     * @return the current value from the system properties map.
666     */
667    public static String getJavaVmVersion() {
668        return getProperty(JAVA_VM_VERSION);
669    }
670
671    /**
672     * Gets the current value from the system properties map.
673     * <p>
674     * Returns {@code null} if the property cannot be read due to a {@link SecurityException}.
675     * </p>
676     *
677     * @return the current value from the system properties map.
678     */
679    public static String getLineSeparator() {
680        return getProperty(LINE_SEPARATOR);
681    }
682
683    /**
684     * Gets the current value for the property named {@code key} as a {@code long}.
685     *
686     * @param key
687     *            The key
688     * @param defaultIfAbsent
689     *            The default value
690     * @return a {@code long} or defaultIfAbsent
691     */
692    public static long getLong(final String key, final LongSupplier defaultIfAbsent) {
693        final String str = getProperty(key);
694        return str == null ? defaultIfAbsent != null ? defaultIfAbsent.getAsLong() : 0 : Long.parseLong(str);
695    }
696
697    /**
698     * Gets the current value from the system properties map.
699     * <p>
700     * Returns {@code null} if the property cannot be read due to a {@link SecurityException}.
701     * </p>
702     *
703     * @return the current value from the system properties map.
704     */
705    public static String getOsArch() {
706        return getProperty(OS_ARCH);
707    }
708
709    /**
710     * Gets the current value from the system properties map.
711     * <p>
712     * Returns {@code null} if the property cannot be read due to a {@link SecurityException}.
713     * </p>
714     *
715     * @return the current value from the system properties map.
716     */
717    public static String getOsName() {
718        return getProperty(OS_NAME);
719    }
720
721    /**
722     * Gets the current value from the system properties map.
723     * <p>
724     * Returns {@code null} if the property cannot be read due to a {@link SecurityException}.
725     * </p>
726     *
727     * @return the current value from the system properties map.
728     */
729    public static String getOsVersion() {
730        return getProperty(OS_VERSION);
731    }
732
733    /**
734     * Gets the current value from the system properties map.
735     * <p>
736     * Returns {@code null} if the property cannot be read due to a {@link SecurityException}.
737     * </p>
738     *
739     * @return the current value from the system properties map.
740     */
741    public static String getPathSeparator() {
742        return getProperty(PATH_SEPARATOR);
743    }
744
745    /**
746     * Gets a System property, defaulting to {@code null} if the property cannot be read.
747     * <p>
748     * If a {@link SecurityException} is caught, the return value is {@code null}.
749     * </p>
750     *
751     * @param property the system property name
752     * @return the system property value or {@code null} if a security problem occurs
753     */
754    public static String getProperty(final String property) {
755        return getProperty(property, Suppliers.nul());
756    }
757
758    /**
759     * Gets a System property, defaulting to {@code null} if the property cannot be read.
760     * <p>
761     * If a {@link SecurityException} is caught, the return value is {@code null}.
762     * </p>
763     *
764     * @param property        the system property name.
765     * @param defaultValue get this Supplier when the property is empty or throws SecurityException.
766     * @return the system property value or {@code null} if a security problem occurs
767     */
768    static String getProperty(final String property, final Supplier<String> defaultValue) {
769        try {
770            if (StringUtils.isEmpty(property)) {
771                return defaultValue.get();
772            }
773            final String value = System.getProperty(property);
774            return StringUtils.getIfEmpty(value, defaultValue);
775        } catch (final SecurityException ignore) {
776            // We are not allowed to look at this property.
777            //
778            // System.err.println("Caught a SecurityException reading the system property '" + property
779            // + "'; the SystemUtils property value will default to null.");
780            return defaultValue.get();
781        }
782    }
783
784    /**
785     * Gets the current value from the system properties map.
786     * <p>
787     * Returns {@code null} if the property cannot be read due to a {@link SecurityException}.
788     * </p>
789     *
790     * @return the current value from the system properties map.
791     */
792    public static String getUserCountry() {
793        return getProperty(USER_COUNTRY);
794    }
795
796    /**
797     * Gets the current value from the system properties map.
798     * <p>
799     * Returns {@code null} if the property cannot be read due to a {@link SecurityException}.
800     * </p>
801     *
802     * @return the current value from the system properties map.
803     */
804    public static String getUserDir() {
805        return getProperty(USER_DIR);
806    }
807
808    /**
809     * Gets the current value from the system properties map.
810     * <p>
811     * Returns {@code null} if the property cannot be read due to a {@link SecurityException}.
812     * </p>
813     *
814     * @return the current value from the system properties map.
815     */
816    public static String getUserHome() {
817        return getProperty(USER_HOME);
818    }
819
820    /**
821     * Gets the current value from the system properties map.
822     * <p>
823     * Returns {@code null} if the property cannot be read due to a {@link SecurityException}.
824     * </p>
825     *
826     * @return the current value from the system properties map.
827     */
828    public static String getUserLanguage() {
829        return getProperty(USER_LANGUAGE);
830    }
831
832    /**
833     * Gets the current value from the system properties map.
834     * <p>
835     * Returns {@code null} if the property cannot be read due to a {@link SecurityException}.
836     * </p>
837     *
838     * @return the current value from the system properties map.
839     */
840    public static String getUserName() {
841        return getProperty(USER_NAME);
842    }
843
844    /**
845     * Gets the current value from the system properties map.
846     * <p>
847     * Returns {@code null} if the property cannot be read due to a {@link SecurityException}.
848     * </p>
849     *
850     * @return the current value from the system properties map.
851     */
852    public static String getUserTimezone() {
853        return getProperty(USER_TIMEZONE);
854    }
855}