1 // © 2016 and later: Unicode, Inc. and others. 2 // License & terms of use: http://www.unicode.org/copyright.html#License 3 /** 4 ******************************************************************************* 5 * Copyright (C) 2001-2010, International Business Machines Corporation and * 6 * others. All Rights Reserved. * 7 ******************************************************************************* 8 */ 9 package com.ibm.icu.impl; 10 11 import com.ibm.icu.util.VersionInfo; 12 13 public final class ICUDebug { 14 private static String params; 15 static { 16 try { 17 params = System.getProperty("ICUDebug"); 18 } 19 catch (SecurityException e) { 20 } 21 } 22 private static boolean debug = params != null; 23 private static boolean help = debug && (params.equals("") || params.indexOf("help") != -1); 24 25 static { 26 if (debug) { 27 System.out.println("\nICUDebug=" + params); 28 } 29 } 30 31 public static final String javaVersionString = System.getProperty("java.version", "0"); 32 public static final boolean isJDK14OrHigher; 33 public static final VersionInfo javaVersion; 34 getInstanceLenient(String s)35 public static VersionInfo getInstanceLenient(String s) { 36 // Extracting ASCII numbers up to 4 delimited by 37 // any non digit characters 38 int[] ver = new int[4]; 39 boolean numeric = false; 40 int i = 0, vidx = 0; 41 while (i < s.length()) { 42 char c = s.charAt(i++); 43 if (c < '0' || c > '9') { 44 if (numeric) { 45 if (vidx == 3) { 46 // up to 4 numbers 47 break; 48 } 49 numeric = false; 50 vidx++; 51 } 52 } else { 53 if (numeric) { 54 ver[vidx] = ver[vidx] * 10 + (c - '0'); 55 if (ver[vidx] > 255) { 56 // VersionInfo does not support numbers 57 // greater than 255. In such case, we 58 // ignore the number and the rest 59 ver[vidx] = 0; 60 break; 61 } 62 } else { 63 numeric = true; 64 ver[vidx] = c - '0'; 65 } 66 } 67 } 68 69 return VersionInfo.getInstance(ver[0], ver[1], ver[2], ver[3]); 70 } 71 72 static { 73 javaVersion = getInstanceLenient(javaVersionString); 74 75 VersionInfo java14Version = VersionInfo.getInstance("1.4.0"); 76 77 isJDK14OrHigher = javaVersion.compareTo(java14Version) >= 0; 78 } 79 enabled()80 public static boolean enabled() { 81 return debug; 82 } 83 enabled(String arg)84 public static boolean enabled(String arg) { 85 if (debug) { 86 boolean result = params.indexOf(arg) != -1; 87 if (help) System.out.println("\nICUDebug.enabled(" + arg + ") = " + result); 88 return result; 89 } 90 return false; 91 } 92 value(String arg)93 public static String value(String arg) { 94 String result = "false"; 95 if (debug) { 96 int index = params.indexOf(arg); 97 if (index != -1) { 98 index += arg.length(); 99 if (params.length() > index && params.charAt(index) == '=') { 100 index += 1; 101 int limit = params.indexOf(",", index); 102 result = params.substring(index, limit == -1 ? params.length() : limit); 103 } else { 104 result = "true"; 105 } 106 } 107 108 if (help) System.out.println("\nICUDebug.value(" + arg + ") = " + result); 109 } 110 return result; 111 } 112 113 // static public void main(String[] args) { 114 // // test 115 // String[] tests = { 116 // "1.3.0", 117 // "1.3.0_02", 118 // "1.3.1ea", 119 // "1.4.1b43", 120 // "___41___5", 121 // "x1.4.51xx89ea.7f", 122 // "1.6_2009", 123 // "10-100-1000-10000", 124 // "beta", 125 // "0", 126 // }; 127 // for (int i = 0; i < tests.length; ++i) { 128 // System.out.println(tests[i] + " => " + getInstanceLenient(tests[i])); 129 // } 130 // } 131 } 132