1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20 package org.waarp.common.utility;
21
22 import org.waarp.common.exception.InvalidArgumentException;
23 import org.waarp.common.logging.SysErrLogger;
24
25 import java.io.PrintStream;
26 import java.lang.reflect.Field;
27 import java.nio.charset.Charset;
28 import java.util.Properties;
29
30 import static org.waarp.common.digest.WaarpBC.*;
31
32
33
34
35
36 public final class SystemPropertyUtil {
37
38
39 private static final String USING_THE_DEFAULT_VALUE2 =
40 "using the default value: ";
41 private static final String FIND_0_9 = "-?[0-9]+";
42 private static final String USING_THE_DEFAULT_VALUE =
43 USING_THE_DEFAULT_VALUE2;
44 public static final String FILE_ENCODING = "file.encoding";
45
46
47
48
49 public static final String WAARP_DATABASE_CONNECTION_MAX =
50 "waarp.database.connection.max";
51 private static final String IO_NETTY_ALLOCATOR_TYPE =
52 "io.netty.allocator.type";
53 private static final String IO_POOLED = "pooled";
54 private static final String IO_NETTY_NOPREFERDIRECT =
55 "io.netty.noPreferDirect";
56
57
58
59
60
61
62
63
64
65
66 private static final String IO_NETTY_MAXDIRECTMEMORY =
67 "io.netty.maxDirectMemory";
68
69 private static final Properties PROPS = new Properties();
70 private static final String INVALID_PROPERTY = "Invalid property ";
71 public static final String JAVAX_XML_TRANSFORM_TRANSFORMER_FACTORY =
72 "javax.xml.transform.TransformerFactory";
73 public static final String NET_SF_SAXON_TRANSFORMER_FACTORY_IMPL =
74 "net.sf.saxon.TransformerFactoryImpl";
75 private static Platform mOs;
76
77
78
79
80
81 static {
82 refresh();
83 initializedTlsContext();
84 }
85
86
87
88
89
90 public static void refresh() {
91 Properties newProps;
92 try {
93 newProps = System.getProperties();
94 } catch (final SecurityException e) {
95 SysErrLogger.FAKE_LOGGER.ignoreLog(e);
96 SysErrLogger.FAKE_LOGGER.syserr(
97 "Unable to retrieve the system properties; default values will be used: " +
98 e.getMessage());
99 newProps = new Properties();
100 }
101
102 synchronized (PROPS) {
103 PROPS.clear();
104 PROPS.putAll(newProps);
105 }
106
107 if (!contains(IO_NETTY_ALLOCATOR_TYPE) ||
108 ParametersChecker.isEmpty(get(IO_NETTY_ALLOCATOR_TYPE))) {
109 try {
110 System.setProperty(IO_NETTY_ALLOCATOR_TYPE, IO_POOLED);
111 synchronized (PROPS) {
112 PROPS.clear();
113 PROPS.putAll(newProps);
114 }
115 SysErrLogger.FAKE_LOGGER.sysout(IO_NETTY_ALLOCATOR_TYPE + ":" +
116 io.netty.util.internal.SystemPropertyUtil.get(
117 IO_NETTY_ALLOCATOR_TYPE));
118 } catch (final Throwable ignored) {
119 SysErrLogger.FAKE_LOGGER.ignoreLog(ignored);
120 }
121 }
122
123 if (!contains(IO_NETTY_NOPREFERDIRECT) ||
124 ParametersChecker.isEmpty(get(IO_NETTY_NOPREFERDIRECT))) {
125 try {
126 System.setProperty(IO_NETTY_NOPREFERDIRECT, "true");
127 synchronized (PROPS) {
128 PROPS.clear();
129 PROPS.putAll(newProps);
130 }
131 SysErrLogger.FAKE_LOGGER.sysout(IO_NETTY_NOPREFERDIRECT + ":" +
132 io.netty.util.internal.SystemPropertyUtil.get(
133 IO_NETTY_NOPREFERDIRECT));
134 } catch (final Throwable ignored) {
135 SysErrLogger.FAKE_LOGGER.ignoreLog(ignored);
136 }
137 }
138
139 if (!contains(IO_NETTY_MAXDIRECTMEMORY) ||
140 ParametersChecker.isEmpty(get(IO_NETTY_MAXDIRECTMEMORY))) {
141 try {
142 System.setProperty(IO_NETTY_MAXDIRECTMEMORY, "0");
143 synchronized (PROPS) {
144 PROPS.clear();
145 PROPS.putAll(newProps);
146 }
147 SysErrLogger.FAKE_LOGGER.sysout(IO_NETTY_MAXDIRECTMEMORY + ":" +
148 io.netty.util.internal.SystemPropertyUtil.get(
149 IO_NETTY_MAXDIRECTMEMORY));
150 } catch (final Throwable ignored) {
151 SysErrLogger.FAKE_LOGGER.ignoreLog(ignored);
152 }
153 }
154 if (!contains(JAVAX_XML_TRANSFORM_TRANSFORMER_FACTORY) ||
155 ParametersChecker.isEmpty(
156 get(JAVAX_XML_TRANSFORM_TRANSFORMER_FACTORY))) {
157 try {
158 System.setProperty(JAVAX_XML_TRANSFORM_TRANSFORMER_FACTORY,
159 NET_SF_SAXON_TRANSFORMER_FACTORY_IMPL);
160 synchronized (PROPS) {
161 PROPS.clear();
162 PROPS.putAll(newProps);
163 }
164 } catch (final Throwable ignored) {
165 SysErrLogger.FAKE_LOGGER.ignoreLog(ignored);
166 }
167 }
168 if (!contains(FILE_ENCODING) ||
169 !WaarpStringUtils.UTF_8.equalsIgnoreCase(get(FILE_ENCODING))) {
170 try {
171 System.setProperty(FILE_ENCODING, WaarpStringUtils.UTF_8);
172 try {
173 final Field charset =
174 Charset.class.getDeclaredField("defaultCharset");
175 charset.setAccessible(true);
176 charset.set(null, null);
177 } catch (final Throwable e) {
178 SysErrLogger.FAKE_LOGGER.ignoreLog(e);
179 }
180 synchronized (PROPS) {
181 PROPS.clear();
182 PROPS.putAll(newProps);
183 }
184 } catch (final Throwable e1) {
185
186 SysErrLogger.FAKE_LOGGER.ignoreLog(e1);
187 SysErrLogger.FAKE_LOGGER.syserr(
188 "Issue while trying to set UTF-8 as default file encoding: use -Dfile.encoding=UTF-8 as java command argument: " +
189 e1.getMessage());
190 SysErrLogger.FAKE_LOGGER.syserr(
191 "Currently file.encoding is: " + get(FILE_ENCODING));
192 }
193 }
194 }
195
196
197
198
199 public static boolean isFileEncodingCorrect() {
200 return contains(FILE_ENCODING) &&
201 WaarpStringUtils.UTF_8.equalsIgnoreCase(get(FILE_ENCODING));
202 }
203
204
205
206
207
208
209 public static boolean contains(final String key) {
210 ParametersChecker.checkParameter("Key", key);
211 return PROPS.containsKey(key);
212 }
213
214
215
216
217
218
219
220
221 public static String get(final String key) {
222 return get(key, null);
223 }
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239 public static String get(final String key, final String def) {
240 ParametersChecker.checkParameter("Key", key);
241 String value = PROPS.getProperty(key);
242 if (value == null) {
243 return def;
244 }
245
246 try {
247 value = ParametersChecker.checkSanityString(value);
248 } catch (final InvalidArgumentException e) {
249 SysErrLogger.FAKE_LOGGER.syserr(INVALID_PROPERTY + key, e);
250 return def;
251 }
252
253 return value;
254 }
255
256
257
258
259
260
261
262
263
264
265
266
267
268
269
270 public static boolean get(final String key, final boolean def) {
271 ParametersChecker.checkParameter("Key", key);
272 String value = PROPS.getProperty(key);
273 if (value == null) {
274 return def;
275 }
276
277 value = value.trim().toLowerCase();
278 if (value.isEmpty()) {
279 return true;
280 }
281
282 if ("true".equals(value) || "yes".equals(value) || "1".equals(value)) {
283 return true;
284 }
285
286 if ("false".equals(value) || "no".equals(value) || "0".equals(value)) {
287 return false;
288 }
289 try {
290 ParametersChecker.checkSanityString(value);
291 } catch (final InvalidArgumentException e) {
292 SysErrLogger.FAKE_LOGGER.syserr(INVALID_PROPERTY + key, e);
293 return def;
294 }
295 SysErrLogger.FAKE_LOGGER.syserr(
296 "Unable to parse the boolean system property '" + key + "':" + value +
297 " - " + USING_THE_DEFAULT_VALUE + def);
298
299 return def;
300 }
301
302
303
304
305
306
307
308
309
310
311
312
313
314
315
316 public static int get(final String key, final int def) {
317 ParametersChecker.checkParameter("Key", key);
318 String value = PROPS.getProperty(key);
319 if (value == null) {
320 return def;
321 }
322
323 value = value.trim().toLowerCase();
324 if (value.matches(FIND_0_9)) {
325 try {
326 return Integer.parseInt(value);
327 } catch (final Exception ignored) {
328
329
330 SysErrLogger.FAKE_LOGGER.ignoreLog(ignored);
331 }
332 }
333 try {
334 ParametersChecker.checkSanityString(value);
335 } catch (final InvalidArgumentException e) {
336 SysErrLogger.FAKE_LOGGER.syserr(INVALID_PROPERTY + key, e);
337 return def;
338 }
339 SysErrLogger.FAKE_LOGGER.syserr(
340 "Unable to parse the integer system property '" + key + "':" + value +
341 " - " + USING_THE_DEFAULT_VALUE + def);
342
343 return def;
344 }
345
346
347
348
349
350
351
352
353
354
355
356
357
358
359
360 public static long get(final String key, final long def) {
361 ParametersChecker.checkParameter("Key", key);
362 String value = PROPS.getProperty(key);
363 if (value == null) {
364 return def;
365 }
366
367 value = value.trim().toLowerCase();
368 if (value.matches(FIND_0_9)) {
369 try {
370 return Long.parseLong(value);
371 } catch (final Exception ignored) {
372
373
374 SysErrLogger.FAKE_LOGGER.ignoreLog(ignored);
375 }
376 }
377 try {
378 ParametersChecker.checkSanityString(value);
379 } catch (final InvalidArgumentException e) {
380 SysErrLogger.FAKE_LOGGER.syserr(INVALID_PROPERTY + key, e);
381 return def;
382 }
383
384 SysErrLogger.FAKE_LOGGER.syserr(
385 "Unable to parse the long integer system property '" + key + "':" +
386 value + " - " + USING_THE_DEFAULT_VALUE + def);
387
388 return def;
389 }
390
391
392
393
394
395
396
397
398
399
400 public static boolean getBoolean(final String key, final boolean def) {
401 ParametersChecker.checkParameter("Key", key);
402
403 String value = PROPS.getProperty(key);
404 if (value == null) {
405 return def;
406 }
407
408 value = value.trim().toLowerCase();
409 if (value.isEmpty()) {
410 return true;
411 }
412
413 if ("true".equals(value) || "yes".equals(value) || "1".equals(value)) {
414 return true;
415 }
416
417 if ("false".equals(value) || "no".equals(value) || "0".equals(value)) {
418 return false;
419 }
420
421 SysErrLogger.FAKE_LOGGER.syserr(
422 "Unable to parse the boolean system property '" + key + "':" + value +
423 " - " + USING_THE_DEFAULT_VALUE2 + def);
424
425 return def;
426 }
427
428
429
430
431
432
433
434
435
436
437 public static int getInt(final String key, final int def) {
438 ParametersChecker.checkParameter("Key", key);
439
440 String value = PROPS.getProperty(key);
441 if (value == null) {
442 return def;
443 }
444
445 value = value.trim().toLowerCase();
446 if (value.matches(FIND_0_9)) {
447 try {
448 return Integer.parseInt(value);
449 } catch (final Exception e) {
450
451 }
452 }
453
454 SysErrLogger.FAKE_LOGGER.syserr(
455 "Unable to parse the integer system property '" + key + "':" + value +
456 " - " + USING_THE_DEFAULT_VALUE2 + def);
457
458 return def;
459 }
460
461
462
463
464
465
466
467
468
469
470 public static long getLong(final String key, final long def) {
471 ParametersChecker.checkParameter("Key", key);
472
473 String value = PROPS.getProperty(key);
474 if (value == null) {
475 return def;
476 }
477
478 value = value.trim().toLowerCase();
479 if (value.matches(FIND_0_9)) {
480 try {
481 return Long.parseLong(value);
482 } catch (final Exception e) {
483
484 }
485 }
486
487 SysErrLogger.FAKE_LOGGER.syserr(
488 "Unable to parse the long integer system property '" + key + "':" +
489 value + " - " + USING_THE_DEFAULT_VALUE2 + def);
490
491 return def;
492 }
493
494
495
496
497
498
499
500
501
502
503
504
505
506
507
508 public static String getAndSet(final String key, final String def) {
509 ParametersChecker.checkParameter("Key", key);
510 if (def == null) {
511 throw new IllegalArgumentException("Def cannot be null");
512 }
513 if (!PROPS.containsKey(key)) {
514 System.setProperty(key, def);
515 refresh();
516 return def;
517 }
518 return PROPS.getProperty(key);
519 }
520
521
522
523
524
525
526
527
528
529
530
531
532
533
534
535 public static boolean getAndSet(final String key, final boolean def) {
536 ParametersChecker.checkParameter("Key", key);
537 if (!PROPS.containsKey(key)) {
538 System.setProperty(key, Boolean.toString(def));
539 refresh();
540 return def;
541 }
542 return get(key, def);
543 }
544
545
546
547
548
549
550
551
552
553
554
555
556
557
558
559 public static int getAndSet(final String key, final int def) {
560 ParametersChecker.checkParameter("Key", key);
561 if (!PROPS.containsKey(key)) {
562 System.setProperty(key, Integer.toString(def));
563 refresh();
564 return def;
565 }
566 return get(key, def);
567 }
568
569
570
571
572
573
574
575
576
577
578
579
580
581
582
583 public static long getAndSet(final String key, final long def) {
584 ParametersChecker.checkParameter("Key", key);
585 if (!PROPS.containsKey(key)) {
586 System.setProperty(key, Long.toString(def));
587 refresh();
588 return def;
589 }
590 return get(key, def);
591 }
592
593
594
595
596
597
598
599
600
601
602
603
604 public static String set(final String key, final String def) {
605 ParametersChecker.checkParameter("Key", key);
606 if (def == null) {
607 throw new IllegalArgumentException("Def cannot be null");
608 }
609 String old = null;
610 if (PROPS.containsKey(key)) {
611 old = PROPS.getProperty(key);
612 }
613 System.setProperty(key, def);
614 refresh();
615 return old;
616 }
617
618
619
620
621
622
623
624
625
626
627
628
629 public static boolean set(final String key, final boolean def) {
630 ParametersChecker.checkParameter("Key", key);
631 boolean old = false;
632 if (PROPS.containsKey(key)) {
633 old = get(key, def);
634 }
635 System.setProperty(key, Boolean.toString(def));
636 refresh();
637 return old;
638 }
639
640
641
642
643
644
645
646
647
648
649
650
651 public static int set(final String key, final int def) {
652 ParametersChecker.checkParameter("Key", key);
653 int old = 0;
654 if (PROPS.containsKey(key)) {
655 old = get(key, def);
656 }
657 System.setProperty(key, Integer.toString(def));
658 refresh();
659 return old;
660 }
661
662
663
664
665
666
667
668
669
670
671
672
673 public static long set(final String key, final long def) {
674 ParametersChecker.checkParameter("Key", key);
675 long old = 0;
676 if (PROPS.containsKey(key)) {
677 old = get(key, def);
678 }
679 System.setProperty(key, Long.toString(def));
680 refresh();
681 return old;
682 }
683
684
685
686
687
688
689
690
691
692 public static void clear(final String key) {
693 ParametersChecker.checkParameter("Key", key);
694 PROPS.remove(key);
695 System.clearProperty(key);
696 refresh();
697 }
698
699
700
701
702
703
704
705
706 public static void debug(final PrintStream out) {
707 ParametersChecker.checkParameter("Out", out);
708 PROPS.list(out);
709 }
710
711
712
713
714
715 public enum Platform {
716
717
718
719 WINDOWS,
720
721
722
723 MAC,
724
725
726
727 UNIX,
728
729
730
731 SOLARIS,
732
733
734
735 UNSUPPORTED
736 }
737
738
739
740
741 public static Platform getOS() {
742 if (mOs == null) {
743 mOs = Platform.UNSUPPORTED;
744 String os = "";
745 try {
746 os = System.getProperty("os.name").toLowerCase();
747 } catch (final Exception ignored) {
748
749 SysErrLogger.FAKE_LOGGER.ignoreLog(ignored);
750 }
751 if (os.contains("win")) {
752 mOs = Platform.WINDOWS;
753
754 }
755 if (os.contains("mac")) {
756 mOs = Platform.MAC;
757
758 }
759 if (os.contains("nux")) {
760 mOs = Platform.UNIX;
761
762 }
763 if (os.contains("nix")) {
764 mOs = Platform.UNIX;
765
766 }
767 if (os.contains("sunos")) {
768 mOs = Platform.SOLARIS;
769
770 }
771 }
772 return mOs;
773 }
774
775
776
777
778 public static boolean isWindows() {
779 return getOS() == Platform.WINDOWS;
780 }
781
782
783
784
785 public static boolean isMac() {
786 return getOS() == Platform.MAC;
787 }
788
789
790
791
792 public static boolean isUnix() {
793 return getOS() == Platform.UNIX;
794 }
795
796
797
798
799 public static boolean isSolaris() {
800 return getOS() == Platform.SOLARIS;
801 }
802
803 public static void debug() {
804 PROPS.list(System.out);
805 }
806
807 private SystemPropertyUtil() {
808
809 }
810 }