1 32 33 package com.knowgate.misc; 34 35 import java.lang.StringBuffer ; 36 import java.lang.System ; 37 38 import java.util.Random ; 39 import java.util.Date ; 40 import java.util.StringTokenizer ; 41 import java.util.Collection ; 42 import java.util.LinkedList ; 43 import java.util.Iterator ; 44 import java.util.Vector ; 45 import java.util.ArrayList ; 46 import java.util.Currency ; 47 import java.util.Locale ; 48 49 import java.math.BigDecimal ; 50 51 import java.text.DecimalFormat ; 52 import java.text.FieldPosition ; 53 import java.text.NumberFormat ; 54 55 import java.net.InetAddress ; 56 import java.net.UnknownHostException ; 57 58 import org.apache.oro.text.regex.*; 59 60 import com.knowgate.debug.DebugFile; 61 62 67 public final class Gadgets { 68 69 private static int iSequence = 1048576; 70 71 private static DecimalFormat oFmt2 = null; 72 private static FieldPosition oFrac = null; 73 private static Currency oCurr = null; 74 private static String sCurr = null; 75 76 private static PatternMatcher oMatcher = null; 77 private static PatternCompiler oCompiler = null; 78 79 public Gadgets() { } 80 81 private static String [] byteToStr = { 82 "00","01","02","03","04","05","06","07","08","09","0a","0b","0c","0d","0e","0f", 83 "10","11","12","13","14","15","16","17","18","19","1a","1b","1c","1d","1e","1f", 84 "20","21","22","23","24","25","26","27","28","29","2a","2b","2c","2d","2e","2f", 85 "30","31","32","33","34","35","36","37","38","39","3a","3b","3c","3d","3e","3f", 86 "40","41","42","43","44","45","46","47","48","49","4a","4b","4c","4d","4e","4f", 87 "50","51","52","53","54","55","56","57","58","59","5a","5b","5c","5d","5e","5f", 88 "60","61","62","63","64","65","66","67","68","69","6a","6b","6c","6d","6e","6f", 89 "70","71","72","73","74","75","76","77","78","79","7a","7b","7c","7d","7e","7f", 90 "80","81","82","83","84","85","86","87","88","89","8a","8b","8c","8d","8e","8f", 91 "90","91","92","93","94","95","96","97","98","99","9a","9b","9c","9d","9e","9f", 92 "a0","a1","a2","a3","a4","a5","a6","a7","a8","a9","aa","ab","ac","ad","ae","af", 93 "b0","b1","b2","b3","b4","b5","b6","b7","b8","b9","ba","bb","bc","bd","be","bf", 94 "c0","c1","c2","c3","c4","c5","c6","c7","c8","c9","ca","cb","cc","cd","ce","cf", 95 "d0","d1","d2","d3","d4","d5","d6","d7","d8","d9","da","db","dc","dd","de","df", 96 "e0","e1","e2","e3","e4","e5","e6","e7","e8","e9","ea","eb","ec","ed","ee","ef", 97 "f0","f1","f2","f3","f4","f5","f6","f7","f8","f9","fa","fb","fc","fd","fe","ff" }; 98 99 101 107 public static String generateUUID() { 108 109 int iRnd; 110 long lSeed = new Date ().getTime(); 111 Random oRnd = new Random (lSeed); 112 String sHex; 113 StringBuffer sUUID = new StringBuffer (32); 114 byte[] localIPAddr = new byte[4]; 115 116 try { 117 118 localIPAddr = InetAddress.getLocalHost().getAddress(); 120 121 sUUID.append(byteToStr[((int) localIPAddr[0]) & 255]); 122 sUUID.append(byteToStr[((int) localIPAddr[1]) & 255]); 123 sUUID.append(byteToStr[((int) localIPAddr[2]) & 255]); 124 sUUID.append(byteToStr[((int) localIPAddr[3]) & 255]); 125 } 126 catch (UnknownHostException e) { 127 sUUID.append("7F000000"); 129 } 130 131 sUUID.append(Long.toHexString(lSeed)); 133 134 sUUID.append(Integer.toHexString(iSequence++)); 136 137 if (iSequence>16777000) iSequence=1048576; 138 139 do { 140 iRnd = oRnd.nextInt(); 141 if (iRnd>0) iRnd = -iRnd; 142 sHex = Integer.toHexString(iRnd); 143 } while (0==iRnd); 144 145 sUUID.append(sHex); 147 148 return sUUID.substring(0, 32); 149 } 151 153 159 public static String XHTMLEncode(String text) { 160 char c; 161 int len = text.length(); 162 StringBuffer results = new StringBuffer (len*2); 163 164 for (int i = 0; i < len; ++i) { 165 c = text.charAt(i); 166 if (c>=32 && c<=127) 167 results.append(c); 168 else 169 results.append("&#"+String.valueOf((int)c)+";"); 170 } 171 return results.toString(); 172 } 173 174 176 182 public static String HTMLEncode(String text) { 183 if (text == null) return ""; 184 185 char c; 186 int len = text.length(); 187 StringBuffer results = new StringBuffer (len); 188 189 for (int i = 0; i < len; ++i) { 190 c = text.charAt(i); 191 switch (c) { 192 case '&': 193 results.append("&"); 194 break; 195 case '<': 196 results.append("<"); 197 break; 198 case '>': 199 results.append(">"); 200 break; 201 case 39: 202 results.append("'"); 203 break; 204 case '"': 205 results.append("""); 206 break; 207 case '¡': 208 results.append("¡"); 209 break; 210 case '¤': 211 results.append("¤"); 212 break; 213 case '¥': 214 results.append("¥"); 215 break; 216 case '|': 217 results.append("¦"); 218 break; 219 case '§': 220 results.append("§"); 221 break; 222 case '¨': 223 results.append("¨"); 224 break; 225 case '©': 226 results.append("©"); 227 break; 228 case 'ª': 229 results.append("ª"); 230 break; 231 case '«': 232 results.append("«"); 233 break; 234 case '»': 235 results.append("»"); 236 break; 237 case '€': 238 results.append("€"); 239 break; 240 case '£': 241 results.append("£"); 242 break; 243 case '': 244 results.append("­"); 245 break; 246 case '®': 247 results.append("®"); 248 break; 249 case '¯': 250 results.append("¯"); 251 break; 252 case '°': 253 results.append("°"); 254 break; 255 case '±': 256 results.append("±"); 257 break; 258 case '¹': 259 results.append("¹"); 260 break; 261 case '²': 262 results.append("²"); 263 break; 264 case '³': 265 results.append("³"); 266 break; 267 case '´': 268 results.append("´"); 269 break; 270 case 'µ': 271 results.append("µ"); 272 break; 273 case '¶': 274 results.append("¶"); 275 break; 276 case '·': 277 results.append("·"); 278 break; 279 case '¸': 280 results.append("¸"); 281 break; 282 case 'º': 283 results.append("º"); 284 break; 285 case '¿': 286 results.append("¿"); 287 break; 288 case 'ñ': 289 results.append("ñ"); 290 break; 291 case 'Ñ': 292 results.append("Ñ"); 293 break; 294 case 'á': 295 results.append("á"); 296 break; 297 case 'é': 298 results.append("é"); 299 break; 300 case 'í': 301 results.append("í"); 302 break; 303 case 'ó': 304 results.append("ó"); 305 break; 306 case 'ú': 307 results.append("ú"); 308 break; 309 case 'ü': 310 results.append("ü"); 311 break; 312 case 'Á': 313 results.append("Á"); 314 break; 315 case 'À': 316 results.append("À"); 317 break; 318 case 'Ä': 319 results.append("Ä"); 320 break; 321 case 'Â': 322 results.append("Â"); 323 break; 324 case 'Å': 325 results.append("Å"); 326 break; 327 case 'É': 328 results.append("É"); 329 break; 330 case 'È': 331 results.append("È"); 332 break; 333 case 'Ë': 334 results.append("Ë"); 335 break; 336 case 'Ê': 337 results.append("Ê"); 338 break; 339 case 'Í': 340 results.append("Í"); 341 break; 342 case 'Ì': 343 results.append("Ì"); 344 break; 345 case 'Ï': 346 results.append("Ï"); 347 break; 348 case 'Î': 349 results.append("Î"); 350 break; 351 case 'Ó': 352 results.append("Ó"); 353 break; 354 case 'Ò': 355 results.append("Ò"); 356 break; 357 case 'Ö': 358 results.append("Ö"); 359 break; 360 case 'Ô': 361 results.append("Ô"); 362 break; 363 case 'Ú': 364 results.append("Ú"); 365 break; 366 case 'Ù': 367 results.append("Ù"); 368 break; 369 case 'Ü': 370 results.append("Ü"); 371 break; 372 case 'Û': 373 results.append("Û"); 374 break; 375 case '½': 376 results.append("½"); 377 break; 378 case '¾': 379 results.append("¾"); 380 break; 381 case '¼': 382 results.append("¼"); 383 break; 384 case 'Ç': 385 results.append("Ç"); 386 break; 387 case 'ç': 388 results.append("ç"); 389 break; 390 case 'ð': 391 results.append("ð"); 392 break; 393 case '¢': 394 results.append("¢"); 395 break; 396 case 'Þ': 397 results.append("Þ"); 398 break; 399 case 'þ': 400 results.append("þ"); 401 break; 402 case 'Ð': 403 results.append("Ð"); 404 break; 405 case '×': 406 results.append("×"); 407 break; 408 case '÷': 409 results.append("÷"); 410 break; 411 case 'Æ': 412 results.append("Æ"); 413 break; 414 415 597 default: 598 if (c<256) 599 results.append(c); 600 else 601 results.append("&#"+String.valueOf(c)+";"); 602 } } 605 return results.toString(); 606 } 608 610 public static String HTMLDencode(String text) { 611 if (text == null) return ""; 612 613 char c,d; 614 int len = text.length(); 615 StringBuffer results = new StringBuffer (len); 616 617 final String [] aEnts = {"amp;", "lt;", "gt;", "quot;", "iexcl;", "curren;", "yen;", "brvbar;", "sect;", 618 "uml;", "copy;", "ordf;", "laquo;", "raquo;", "euro;", "pound;", "shy;", "reg;", 619 "macr;", "deg;", "plusmn;", "sup1;", "sup2;", "sup3;", "acute;", "micro;", "para;", 620 "middot;", "cedil;", "ordm;", "iquest;", "ntilde;", "Ntilde;", "aacute;", "eacute;", "iacute;", 621 "oacute;", "uacute;", "uuml;", "Aacute;", "Agrave;", "Auml;", "Acirc;", "Aring;", "Eacute;", 622 "Egrave;", "Euml;", "Ecirc;", "Iacute;", "Igrave;", "Iuml;", "Icirc;", "Oacute;", "Ograve;", 623 "Ouml;", "Ocirc;", "Uacute;", "Ugrave;", "Uuml;", "Ucirc;", "frac12;", "frac34;", "frac14;", 624 "Ccedil;", "ccedil;", "eth;", "cent;", "THORN;", "thorn;", "ETH;", "times;", "divide;", 625 "AElig;" 626 }; 627 628 final String [] aChars= {"&", "<", ">", "\"", "¡", "¤", "¥", "|", "§", 629 "¨", "©", "ª", "«" , "»", "€", "£", "", "®", 630 "¯", "°", "±", "¹" , "²", "³", "´", "µ", "¶", 631 "·", "¸", "º", "¿" , "ñ", "Ñ", "á", "é", "í", 632 "ó", "ú", "ü", "Á" , "À", "Ä", "Â", "Å", "É", 633 "È", "Ë", "Ê", "Í" , "Ì", "Ï", "Î", "Ó", "Ò", 634 "Ö", "Ô", "Ú", "Ù" , "Ü", "Û", "½", "¾", "¼", 635 "Ç", "ç", "ð", "¢" , "Þ", "þ", "Ð", "×", "÷", 636 "Æ" 637 }; 638 639 final int iEnts = aEnts.length; 640 641 for (int i = 0; i < len; ++i) { 642 c = text.charAt(i); 643 if (c=='&' && i<len-3) { 644 try { 645 if (text.charAt(i+1)=='#') { 646 int semicolon = text.indexOf(59, i+1); 647 if (semicolon>0) { 648 results.append( (char) Integer.parseInt(text.substring(i + 2, semicolon))); 649 i = semicolon+1; 650 } 651 else { 652 results.append(c); 653 } 654 } 655 else { 656 for (int e=0; e<iEnts; e++) { 657 if (text.substring(i+1, i+aEnts[e].length()).equals(aEnts[e])) 658 results.append(aChars[e]); 659 } 660 } 661 } catch (StringIndexOutOfBoundsException siob) { 662 return results.toString(); 663 } 664 } 665 else { 666 results.append(c); 667 } 668 } 670 return results.toString(); 671 } 673 675 681 public static String URLEncode (String sStr) { 682 if (sStr==null) return null; 683 684 int iLen = sStr.length(); 685 StringBuffer sEscaped = new StringBuffer (iLen+100); 686 char c; 687 for (int p=0; p<iLen; p++) { 688 c = sStr.charAt(p); 689 switch (c) { 690 case ' ': 691 sEscaped.append("%20"); 692 break; 693 case '"': 694 sEscaped.append("%22"); 695 break; 696 case '#': 697 sEscaped.append("%23"); 698 break; 699 case '%': 700 sEscaped.append("%25"); 701 break; 702 case '&': 703 sEscaped.append("%26"); 704 break; 705 case (char)39: 706 sEscaped.append("%27"); 707 break; 708 case ',': 709 sEscaped.append("%2C"); 710 break; 711 case '=': 712 sEscaped.append("%3D"); 713 break; 714 case '?': 715 sEscaped.append("%3F"); 716 break; 717 case 'á': 718 sEscaped.append("%E1"); 719 break; 720 case 'é': 721 sEscaped.append("%E9"); 722 break; 723 case 'í': 724 sEscaped.append("%ED"); 725 break; 726 case 'ó': 727 sEscaped.append("%F3"); 728 break; 729 case 'ú': 730 sEscaped.append("%FA"); 731 break; 732 case 'Á': 733 sEscaped.append("%C1"); 734 break; 735 case 'É': 736 sEscaped.append("%C9"); 737 break; 738 case 'Í': 739 sEscaped.append("%CD"); 740 break; 741 case 'Ó': 742 sEscaped.append("%D3"); 743 break; 744 case 'Ú': 745 sEscaped.append("%DA"); 746 break; 747 case 'à': 748 sEscaped.append("%E0"); 749 break; 750 case 'è': 751 sEscaped.append("%E8"); 752 break; 753 case 'ì': 754 sEscaped.append("%EC"); 755 break; 756 case 'ò': 757 sEscaped.append("%F2"); 758 break; 759 case 'ù': 760 sEscaped.append("%F9"); 761 break; 762 case 'À': 763 sEscaped.append("%C0"); 764 break; 765 case 'È': 766 sEscaped.append("%C8"); 767 break; 768 case 'Ì': 769 sEscaped.append("%CC"); 770 break; 771 case 'Ò': 772 sEscaped.append("%D2"); 773 break; 774 case 'Ù': 775 sEscaped.append("%D9"); 776 break; 777 case 'ñ': 778 sEscaped.append("%F1"); 779 break; 780 case 'Ñ': 781 sEscaped.append("%D1"); 782 break; 783 case 'ç': 784 sEscaped.append("%E7"); 785 break; 786 case 'Ç': 787 sEscaped.append("%C7"); 788 break; 789 case 'ô': 790 sEscaped.append("%F4"); 791 break; 792 case 'Ô': 793 sEscaped.append("%D4"); 794 break; 795 case 'ö': 796 sEscaped.append("%F6"); 797 break; 798 case 'Ö': 799 sEscaped.append("%D6"); 800 break; 801 default: 802 sEscaped.append(c); 803 break; 804 } 805 } 807 return sEscaped.toString(); 808 } 810 812 815 public static String ASCIIEncode (String sStrIn) { 816 if (sStrIn==null) return null; 817 818 int iLen = sStrIn.length(); 819 820 if (iLen==0) return sStrIn; 821 822 StringBuffer sStrBuff = new StringBuffer (iLen); 823 String sStr = sStrIn.toUpperCase(); 824 825 for (int c=0; c<iLen; c++) { 826 switch (sStr.charAt(c)) { 827 case 'Á': 828 case 'À': 829 case 'Ä': 830 case 'Â': 831 case 'Å': 832 sStrBuff.append('A'); 833 break; 834 case 'É': 835 case 'È': 836 case 'Ë': 837 case 'Ê': 838 sStrBuff.append('E'); 839 break; 840 case 'Í': 841 case 'Ì': 842 case 'Ï': 843 case 'Î': 844 sStrBuff.append('I'); 845 break; 846 case 'Ó': 847 case 'Ò': 848 case 'Ö': 849 case 'Ô': 850 case 'Ø': 851 sStrBuff.append('O'); 852 break; 853 case 'Ú': 854 case 'Ù': 855 case 'Ü': 856 case 'Û': 857 sStrBuff.append('U'); 858 break; 859 case 'Æ': 860 sStrBuff.append('E'); 861 break; 862 case 'Ñ': 863 sStrBuff.append('N'); 864 break; 865 case 'Ç': 866 sStrBuff.append('C'); 867 break; 868 case '°': 869 sStrBuff.append('o'); 870 break; 871 case '\\': 872 case '.': 873 case '/': 874 sStrBuff.append('_'); 875 break; 876 case '&': 877 sStrBuff.append('A'); 878 break; 879 case ':': 880 sStrBuff.append(';'); 881 break; 882 case '<': 883 sStrBuff.append('L'); 884 break; 885 case '>': 886 sStrBuff.append('G'); 887 break; 888 case '"': 889 sStrBuff.append((char)39); 890 break; 891 case '|': 892 sStrBuff.append('P'); 893 break; 894 case '¡': 895 sStrBuff.append('E'); 896 break; 897 case '¿': 898 case '?': 899 sStrBuff.append('Q'); 900 break; 901 case '*': 902 sStrBuff.append('W'); 903 break; 904 case '%': 905 sStrBuff.append('P'); 906 break; 907 case 'ß': 908 sStrBuff.append('B'); 909 break; 910 case '¥': 911 sStrBuff.append('Y'); 912 break; 913 case (char)255: 914 sStrBuff.append('_'); 915 break; 916 default: 917 sStrBuff.append(sStr.charAt(c)); 918 } } return sStrBuff.toString(); 921 } 923 925 940 public static String [] split2(String sInputStr, char cDelimiter) 941 throws NullPointerException { 942 943 int iDelim = sInputStr.indexOf(cDelimiter); 944 945 if (iDelim<0) 946 return new String []{sInputStr}; 947 else if (iDelim==0) 948 return new String []{"", sInputStr.substring(iDelim+1)}; 949 else if (iDelim==sInputStr.length()-1) 950 return new String []{sInputStr.substring(0, iDelim), ""}; 951 else 952 return new String []{sInputStr.substring(0, iDelim), sInputStr.substring(iDelim+1)}; 953 } 955 957 971 public static String [] split2(String sInputStr, String sDelimiter) 972 throws NullPointerException { 973 974 int iDelim = sInputStr.indexOf(sDelimiter); 975 976 if (iDelim<0) 977 return new String []{sInputStr}; 978 else if (iDelim==0) 979 return new String []{"", sInputStr.substring(iDelim+sDelimiter.length())}; 980 else if (iDelim==sInputStr.length()-sDelimiter.length()) 981 return new String []{sInputStr.substring(0, iDelim), ""}; 982 else 983 return new String []{sInputStr.substring(0, iDelim), sInputStr.substring(iDelim+sDelimiter.length())}; 984 } 986 988 998 public static String [] split(String sInputStr, char cDelimiter) 999 throws NullPointerException { 1000 int iStrLen = sInputStr.length(); 1001 int iTokCount = 0; 1002 1003 if (DebugFile.trace) { 1004 DebugFile.writeln("Begin Gadgets.split(\"" + sInputStr + "\",'" + cDelimiter+ "')"); 1005 DebugFile.incIdent(); 1006 } 1007 1008 if (0==iStrLen) { 1009 if (DebugFile.trace) { 1010 DebugFile.decIdent(); 1011 DebugFile.writeln("End Gadgets.split() : 0"); 1012 } 1013 return null; 1014 } 1015 1016 for (int p=0; p<iStrLen; p++) 1017 if (sInputStr.charAt(p)==cDelimiter) iTokCount++; 1018 1019 if (DebugFile.trace) DebugFile.writeln(String.valueOf(iTokCount+1) + " tokens found"); 1020 1021 String Tokens[] = new String [iTokCount+1]; 1022 1023 int iToken = 0; 1024 int iLast = 0; 1025 for (int iNext=0; iNext<iStrLen; iNext++) { 1026 if (sInputStr.charAt(iNext)==cDelimiter) { 1027 if (iLast==iNext) 1028 Tokens[iToken] = ""; 1029 else 1030 Tokens[iToken] = sInputStr.substring(iLast, iNext); 1031 iLast = iNext + 1; 1032 iToken++; 1033 } } 1036 if (iLast>=iStrLen) 1037 Tokens[iToken] = ""; 1038 else 1039 Tokens[iToken] = sInputStr.substring(iLast, iStrLen); 1040 1041 if (DebugFile.trace) { 1042 DebugFile.decIdent(); 1043 DebugFile.writeln("End Gadgets.split()"); 1044 } 1045 return Tokens; 1046 } 1048 1050 1056 public static String [] split(String sInputStr, char[] aDelimiter) 1057 throws NullPointerException { 1058 int iStrLen = sInputStr.length(); 1059 int iTokCount = 0; 1060 int iDelimCount = aDelimiter.length; 1061 int d; 1062 boolean b; 1063 1064 if (DebugFile.trace) { 1065 DebugFile.writeln("Begin Gadgets.split(\"" + sInputStr + "\",char[])"); 1066 DebugFile.incIdent(); 1067 } 1068 1069 if (0==iStrLen) { 1070 if (DebugFile.trace) { 1071 DebugFile.decIdent(); 1072 DebugFile.writeln("End Gadgets.split() : 0"); 1073 } 1074 return null; 1075 } 1076 1077 for (int p=0; p<iStrLen; p++) { 1078 for (d=0,b=false; d<iDelimCount && !b; d++) b=(sInputStr.charAt(p)==aDelimiter[d]); 1079 if (b) iTokCount++; 1080 } 1081 1082 if (DebugFile.trace) DebugFile.writeln(String.valueOf(iTokCount+1) + " tokens found"); 1083 1084 String Tokens[] = new String [iTokCount+1]; 1085 1086 int iToken = 0; 1087 int iLast = 0; 1088 for (int iNext=0; iNext<iStrLen; iNext++) { 1089 for (d=0,b=false; d<iDelimCount && !b; d++) b=(sInputStr.charAt(iNext)==aDelimiter[d]); 1090 if (b) { 1091 if (iLast==iNext) 1092 Tokens[iToken] = ""; 1093 else 1094 Tokens[iToken] = sInputStr.substring(iLast, iNext); 1095 iLast = iNext + 1; 1096 iToken++; 1097 } } 1100 if (iLast>=iStrLen) 1101 Tokens[iToken] = ""; 1102 else 1103 Tokens[iToken] = sInputStr.substring(iLast, iStrLen); 1104 1105 if (DebugFile.trace) { 1106 DebugFile.decIdent(); 1107 DebugFile.writeln("End Gadgets.split()"); 1108 } 1109 return Tokens; 1110 } 1112 1114 1124 public static String [] split(String sInputStr, String sDelimiter) 1125 throws NullPointerException { 1126 1127 if (DebugFile.trace) { 1128 DebugFile.writeln("Begin Gadgets.split(\"" + sInputStr + "\",\"" + sDelimiter+ "\")"); 1129 DebugFile.incIdent(); 1130 } 1131 1132 StringTokenizer oTokenizer = new StringTokenizer (sInputStr, sDelimiter); 1134 int iTokCount = oTokenizer.countTokens(); 1135 int iTok = 0; 1136 String Tokens[] = null; 1137 1138 if (DebugFile.trace) DebugFile.writeln(String.valueOf(iTokCount) + " tokens found"); 1139 1140 if(iTokCount>0) { 1141 Tokens = new String [iTokCount]; 1142 while (oTokenizer.hasMoreTokens()) { 1143 Tokens[iTok] = oTokenizer.nextToken(); 1144 if (DebugFile.trace) DebugFile.writeln("Token " + String.valueOf(iTok) + "=" + Tokens[iTok]); 1145 iTok++; 1146 } } 1148 1149 if (DebugFile.trace) { 1150 DebugFile.decIdent(); 1151 DebugFile.writeln("End Gadgets.split()"); 1152 } 1153 1154 return Tokens; 1155 } 1157 1159 1165 public String join (Collection oList, String sDelimiter) { 1166 StringBuffer oBuff = new StringBuffer (oList.size()*(32+sDelimiter.length())+1); 1168 Iterator oIter = oList.iterator(); 1169 1170 while (oIter.hasNext()) { 1171 oBuff.append(oIter.next()); 1172 oBuff.append(sDelimiter); 1173 } 1175 oIter = null; 1176 1177 if (oBuff.length()>0) 1178 return oBuff.substring(0, oBuff.length()-sDelimiter.length()-1); 1179 else 1180 return ""; 1181 } 1183 1185 1192 1193 public String join (String [] aList, String sDelimiter) { 1194 if (null==aList) return null; 1195 final int iCount = aList.length; 1196 if (iCount==0) return ""; 1197 if (null==sDelimiter) sDelimiter=""; 1198 1199 StringBuffer oBuff = new StringBuffer (iCount*(32+sDelimiter.length())+1); 1201 oBuff.append(aList[0]); 1202 for (int s=1; s<iCount; s++) { 1203 oBuff.append(sDelimiter); 1204 oBuff.append(aList[0]); 1205 } 1206 return oBuff.toString(); 1207 } 1209 1211 1219 1220 public static Collection splitAsCollection(String sInputStr, char cDelimiter) 1221 throws NullPointerException { 1222 int iStrLen = sInputStr.length(); 1223 int iTokCount = 0; 1224 1225 if (DebugFile.trace) { 1226 DebugFile.writeln("Begin Gadgets.splitAsCollection(\"" + sInputStr + "\",'" + cDelimiter+ "')"); 1227 DebugFile.incIdent(); 1228 } 1229 1230 LinkedList oTokens = new LinkedList (); 1231 1232 int iLast = 0; 1233 for (int iNext=0; iNext<iStrLen; iNext++) { 1234 if (sInputStr.charAt(iNext)==cDelimiter) { 1235 if (iLast==iNext) 1236 oTokens.add(""); 1237 else 1238 oTokens.add(sInputStr.substring(iLast, iNext)); 1239 iLast = iNext + 1; 1240 } } 1243 if (iLast>=iStrLen) 1244 oTokens.add(""); 1245 else 1246 oTokens.add(sInputStr.substring(iLast, iStrLen)); 1247 1248 if (DebugFile.trace) { 1249 DebugFile.decIdent(); 1250 DebugFile.writeln("End Gadgets.splitAsCollection() : " + String.valueOf(oTokens.size())); 1251 } 1252 return oTokens; 1253 } 1255 1257 1264 1265 public static int indexOfIgnoreCase(String sSource, String sSought, int iStartAt) { 1266 if ((sSource==null) || (sSought==null)) return -1; 1267 1268 final int iSrcLen = sSource.length(); 1269 final int iSghLen = sSought.length(); 1270 1271 if (iSrcLen<iSghLen) return -1; 1272 1273 if (iSrcLen==iSghLen) return (sSource.equalsIgnoreCase(sSought) ? 0 : -1); 1274 1275 final int iReducedLen = iSrcLen-iSghLen; 1276 1277 if (iStartAt+iSghLen>iSrcLen) return -1; 1278 1279 for (int p=iStartAt; p<iReducedLen; p++) { 1280 if (sSource.substring(p, p+iSghLen).equalsIgnoreCase(sSought)) 1281 return p; 1282 } 1283 return -1; 1284 } 1285 1286 1288 1294 public static int indexOfIgnoreCase(String sSource, String sSought) { 1295 if ((sSource==null) || (sSought==null)) return -1; 1296 1297 final int iSrcLen = sSource.length(); 1298 final int iSghLen = sSought.length(); 1299 1300 if (iSrcLen<iSghLen) return -1; 1301 1302 if (iSrcLen==iSghLen) return (sSource.equalsIgnoreCase(sSought) ? 0 : -1); 1303 1304 final int iReducedLen = iSrcLen-iSghLen; 1305 1306 for (int p=0; p<iReducedLen; p++) { 1307 if (sSource.substring(p, p+iSghLen).equalsIgnoreCase(sSought)) 1308 return p; 1309 } 1310 return -1; 1311 } 1313 1315 1322 public static String fill(char c, int len) throws IndexOutOfBoundsException { 1323 if (len<0) 1325 throw new IndexOutOfBoundsException ("Gadgets.fill() numbers of characters must be greater than or equal to zero"); 1326 else if (len==0) 1327 return ""; 1328 else { 1329 StringBuffer oStrBuff = new StringBuffer (len); 1330 for (int i=0; i<len; i++) oStrBuff.append(c); 1331 return oStrBuff.toString(); 1332 } 1333 } 1335 1337 1346 public static boolean matches (String sSource, String sRegExp) throws MalformedPatternException { 1347 if (null==oMatcher) oMatcher = new Perl5Matcher(); 1348 if (null==oCompiler) oCompiler = new Perl5Compiler(); 1349 1350 if (sSource==null || sRegExp==null) 1351 return false; 1352 else 1353 return oMatcher.matches(sSource, oCompiler.compile(sRegExp)); 1354 } 1356 1358 1367 public static boolean contains (String sSource, String sRegExp) throws MalformedPatternException { 1368 if (null==oMatcher) oMatcher = new Perl5Matcher(); 1369 if (null==oCompiler) oCompiler = new Perl5Compiler(); 1370 1371 if (sSource==null || sRegExp==null) 1372 return false; 1373 else 1374 return oMatcher.contains(sSource, oCompiler.compile(sRegExp)); 1375 } 1377 1379 1388 public static String getFirstMatchSubStr (String sSource, String sRegExp) throws MalformedPatternException { 1389 String sRetStr; 1390 if (sSource==null || sRegExp==null) 1391 sRetStr=null; 1392 else { 1393 if (null==oMatcher) oMatcher = new Perl5Matcher(); 1394 if (null==oCompiler) oCompiler = new Perl5Compiler(); 1395 if (oMatcher.contains(sSource, oCompiler.compile(sRegExp))) { 1396 sRetStr=oMatcher.getMatch().group(0); 1397 } else { 1398 sRetStr=null; 1399 } 1400 } 1401 return sRetStr; 1402 } 1404 1406 1414 public static String replace(String sSource, String sRegExp, String sNewVal) throws MalformedPatternException { 1415 Pattern oPattern; 1416 if (null==oMatcher) oMatcher = new Perl5Matcher(); 1417 if (null==oCompiler) oCompiler = new Perl5Compiler(); 1418 1419 oPattern = oCompiler.compile(sRegExp); 1420 1421 return Util.substitute(oMatcher, oPattern, 1422 new Perl5Substitution(sNewVal, Perl5Substitution.INTERPOLATE_ALL), 1423 sSource, Util.SUBSTITUTE_ALL); 1424 } 1426 1445 public static String replace(String sSource, String sRegExp, String sNewVal, int iOptions) throws MalformedPatternException { 1446 Pattern oPattern; 1447 if (null==oMatcher) oMatcher = new Perl5Matcher(); 1448 if (null==oCompiler) oCompiler = new Perl5Compiler(); 1449 1450 oPattern = oCompiler.compile(sRegExp, iOptions); 1451 1452 return Util.substitute(oMatcher, oPattern, 1453 new Perl5Substitution(sNewVal, Perl5Substitution.INTERPOLATE_ALL), 1454 sSource, Util.SUBSTITUTE_ALL); 1455 } 1457 1459 1468 public static int countOccurrences(String sSource, String sSubStr, int iOptions) throws MalformedPatternException { 1469 if (null==sSource || null==sSubStr) return 0; 1470 if (sSource.length()==0 || sSubStr.length()==0) return 0; 1471 1472 int lSource = sSource.length(); 1473 int lSubStr = sSubStr.length(); 1474 int iOccurrences = 0; 1475 int iCurPos; 1476 if ((org.apache.oro.text.regex.Perl5Compiler.CASE_INSENSITIVE_MASK&iOptions)==0) { 1477 iCurPos = sSource.indexOf(sSubStr); 1478 while (iCurPos!=-1 && iCurPos+lSubStr<=lSource) { 1479 iOccurrences++; 1480 iCurPos = sSource.indexOf(sSubStr, iCurPos+1); 1481 } 1482 } else { 1483 iCurPos = Gadgets.indexOfIgnoreCase(sSource, sSubStr); 1484 while (iCurPos!=-1 && iCurPos+lSubStr<=lSource) { 1485 iOccurrences++; 1486 iCurPos = Gadgets.indexOfIgnoreCase(sSource, sSubStr, iCurPos+1); 1487 } 1488 } 1489 return iOccurrences; 1490 } 1492 1494 1503 public static String left(String sSource, int nChars) { 1504 int iLen; 1505 1506 if (null==sSource) return null; 1507 1508 iLen = sSource.length(); 1509 1510 if (iLen>nChars) 1511 return sSource.substring(0, nChars); 1512 else 1513 return sSource; 1514 } 1516 1518 1525 public static String leftPad(String sSource, char cPad, int nChars) { 1526 if (null==sSource) return null; 1527 1528 int iPadLen = nChars - sSource.length(); 1529 1530 if (iPadLen<=0) return sSource; 1531 1532 char aPad[] = new char[iPadLen]; 1533 1534 for (int c=0; c<iPadLen; c++) aPad[c] = cPad; 1535 1536 return new String (aPad) + sSource; 1537 } 1539 1541 1548 public static String chomp(String sSource, char cEndsWith) { 1549 1550 if (null==sSource) 1551 return null; 1552 else if (sSource.length()==0) 1553 return ""; 1554 else if (sSource.charAt(sSource.length()-1)==cEndsWith) 1555 return sSource; 1556 else 1557 return sSource + String.valueOf(cEndsWith); 1558 } 1560 1562 1569 public static String chomp(String sSource, String sEndsWith) { 1570 1571 if (null==sSource) 1572 return null; 1573 else if (sSource.length()==0) 1574 return ""; 1575 else if (sSource.endsWith(sEndsWith)) 1576 return sSource; 1577 else 1578 return sSource + sEndsWith; 1579 } 1581 1583 1590 public static String dechomp(String sSource, String sEndsWith) { 1591 1592 if (null==sSource) 1593 return null; 1594 else if (sEndsWith==null) 1595 return sSource; 1596 else if (sSource.length()<sEndsWith.length()) 1597 return sSource; 1598 else if (sSource.endsWith(sEndsWith)) 1599 return sSource.substring(0, sSource.length()-sEndsWith.length()); 1600 else 1601 return sSource; 1602 } 1604 1606 1613 public static String dechomp(String sSource, char cEndsWith) { 1614 1615 if (null==sSource) 1616 return null; 1617 else if (sSource.length()<1) 1618 return sSource; 1619 else if (sSource.charAt(sSource.length()-1)==cEndsWith) 1620 return sSource.substring(0, sSource.length()-1); 1621 else 1622 return sSource; 1623 } 1625 1627 1635 public static String [] tokenizeCmdLine(String sSource) 1636 throws StringIndexOutOfBoundsException { 1637 String [] aTokens; 1638 1639 if (DebugFile.trace) { 1640 DebugFile.writeln("Begin Gadgets.tokenizeCmdLine("+sSource+")"); 1641 DebugFile.incIdent(); 1642 } 1643 1644 if (null==sSource) { 1645 aTokens=null; 1646 } else if (sSource.length()==0) { 1647 aTokens=new String []{null}; 1648 } else { 1649 final int iLen = sSource.length(); 1650 ArrayList oTokens = new ArrayList (); 1651 char cTextQualifier = (char) 0; 1652 char cCurrentChar; 1653 StringBuffer oCurrentToken = new StringBuffer (256); 1654 for (int p=0; p<iLen; p++) { 1655 cCurrentChar = sSource.charAt(p); 1656 switch (cCurrentChar) { 1657 case ' ': 1658 if (0!=cTextQualifier) { 1659 oCurrentToken.append(cCurrentChar); 1660 } else if (oCurrentToken.length()>0) { 1661 oTokens.add(oCurrentToken.toString()); 1662 oCurrentToken.setLength(0); 1663 } 1664 break; 1665 case '\\': 1666 if (p==iLen-1) throw new StringIndexOutOfBoundsException ("Input string terminated with a single backslash character"); 1667 switch (sSource.charAt(++p)) { 1668 case 'n': 1669 oCurrentToken.append('\n'); 1670 break; 1671 case 't': 1672 oCurrentToken.append('\t'); 1673 break; 1674 case '\\': 1675 oCurrentToken.append('\\'); 1676 break; 1677 case '"': 1678 oCurrentToken.append('"'); 1679 break; 1680 default: 1681 throw new StringIndexOutOfBoundsException ("Unrecognized escape sequence \\"+sSource.charAt(p)); 1682 } break; 1684 case '"': 1685 if (0==cTextQualifier) { 1686 cTextQualifier='"'; 1687 } else if ('"'==cTextQualifier) { 1688 cTextQualifier=(char)0; 1689 } 1690 break; 1691 case '\'': 1692 if (0==cTextQualifier) { 1693 cTextQualifier='\''; 1694 } else if ('\''==cTextQualifier) { 1695 cTextQualifier=(char)0; 1696 } 1697 break; 1698 case ',': 1699 case ';': 1700 case '(': 1701 case ')': 1702 case '[': 1703 case ']': 1704 case '{': 1705 case '}': 1706 case '-': 1707 case '+': 1708 case '/': 1709 case '*': 1710 case '=': 1711 case '&': 1712 case '!': 1713 case '?': 1714 if (0!=cTextQualifier) { 1715 oCurrentToken.append(cCurrentChar); 1716 } 1717 else { 1718 if (oCurrentToken.length()>0) { 1719 oTokens.add(oCurrentToken.toString()); 1720 oCurrentToken.setLength(0); 1721 } 1722 oTokens.add(new String (new char[]{cCurrentChar})); 1723 } 1724 break; 1725 default: 1726 oCurrentToken.append(cCurrentChar); 1727 } 1728 } if (oCurrentToken.length()>0) { 1730 oTokens.add(oCurrentToken.toString()); 1731 } 1732 aTokens=new String [oTokens.size()]; 1733 System.arraycopy(oTokens.toArray(),0,aTokens,0,aTokens.length); 1734 } 1735 1736 if (DebugFile.trace) { 1737 StringBuffer oOutput = new StringBuffer (); 1738 if (aTokens!=null) 1739 for (int t=0; t<aTokens.length; t++) 1740 oOutput.append(aTokens[t]+(t<aTokens.length-1 ? "¶" :"")); 1741 DebugFile.decIdent(); 1742 DebugFile.writeln("End Gadgets.tokenizeCmdLine() : " + oOutput.toString()); 1743 } 1744 1745 return aTokens; 1746 } 1748 1750 1755 public static boolean checkEMail(String sEMailAddr) { 1756 final String nu = "1234567890"; 1757 final String ok = "1234567890qwertyuiop[]asdfghjklzxcvbnm.@-_QWERTYUIOPASDFGHJKLZXCVBNM"; 1758 int iAt, iDot; 1759 1760 if (sEMailAddr==null) return false; 1761 1762 if (sEMailAddr.trim().length()==0) return false; 1763 1764 iAt = sEMailAddr.indexOf("@"); 1765 iDot = sEMailAddr.lastIndexOf("."); 1766 1767 if (iDot<=0) return false; 1769 1770 if (iAt<=0 || iAt==sEMailAddr.length()-1) return false; 1771 1772 if (ok.indexOf(sEMailAddr.substring(iAt-1, iAt))<0 || 1774 ok.indexOf(sEMailAddr.substring(iAt+1, iAt+2))<0) return false; 1775 1776 if (nu.indexOf(sEMailAddr.substring(iAt+1, iAt+2))>=0) return false; 1778 1779 if (iDot<sEMailAddr.length()-5) return false; 1781 1782 if (iDot>sEMailAddr.length()-3) return false; 1784 1785 return true; 1786 } 1788 1790 public static final char[] HEX_DIGITS = { '0', '1', '2', '3', '4', '5', '6', '7', '8', '9', 'A', 'B', 'C', 'D', 'E', 'F' }; 1791 1792 public static void toHexChars( int val, char dst[], int dstIndex, int size ) { 1793 while( size > 0 ) { 1794 dst[dstIndex + size - 1] = HEX_DIGITS[val & 0x000F]; 1795 if( val != 0 ) { 1796 val >>>= 4; 1797 } 1798 size--; 1799 } 1800 } 1801 1802 1804 public static String toHexString( int val, int size ) { 1805 char[] c = new char[size]; 1806 toHexChars( val, c, 0, size ); 1807 return new String ( c ); 1808 } 1809 1810 1812 1819 public static String toHexString( byte[] src, int srcIndex, int size ) { 1820 if (null==src) return null; 1821 1822 char[] c = new char[size]; 1823 size = ( size % 2 == 0 ) ? size / 2 : size / 2 + 1; 1824 for( int i = 0, j = 0; i < size; i++ ) { 1825 c[j++] = HEX_DIGITS[(src[i] >> 4 ) & 0x0F]; 1826 if( j == c.length ) { 1827 break; 1828 } 1829 c[j++] = HEX_DIGITS[src[i] & 0x0F]; 1830 } 1831 return new String ( c ); 1832 } 1833 1834 1836 1841 public static String toHexString( byte[] src) { 1842 if (null==src) return null; 1843 1844 return toHexString(src, 0, src.length); 1845 } 1846 1847 1849 1855 public static String removeChar(String sInput, char cRemove) { 1856 if (null==sInput) return null; 1857 if (sInput.length()==0) return sInput; 1858 1859 final int iLen = sInput.length(); 1860 StringBuffer oOutput = new StringBuffer (iLen); 1861 1862 for (int i=0; i<iLen; i++) { 1863 char c = sInput.charAt(i); 1864 if (cRemove!=c) 1865 oOutput.append(c); 1866 } 1868 return oOutput.toString(); 1869 } 1871 1873 1879 public static String removeChars(String sInput, String sRemove) { 1880 if (null==sInput) return null; 1881 if (null==sRemove) return sInput; 1882 if (sInput.length()==0) return sInput; 1883 if (sRemove.length()==0) return sInput; 1884 1885 final int iLen = sInput.length(); 1886 StringBuffer oOutput = new StringBuffer (iLen); 1887 1888 for (int i=0; i<iLen; i++) { 1889 char c = sInput.charAt(i); 1890 if (sRemove.indexOf(c)<0) 1891 oOutput.append(c); 1892 } 1894 return oOutput.toString(); 1895 } 1897 1899 1904 public static BigDecimal round2 (BigDecimal oDec) { 1905 if (null==oDec) return null; 1906 StringBuffer oBuffer = new StringBuffer (); 1907 if (null==oFmt2) { 1908 oFmt2 = new DecimalFormat ("#0.00"); 1909 oFrac = new FieldPosition (java.text.NumberFormat.FRACTION_FIELD); 1910 } 1911 oFmt2.format(oDec.doubleValue(), oBuffer, oFrac); 1912 return new BigDecimal (oBuffer.toString()); 1913 } 1914 1915 1917 1929 public static String formatCurrency (BigDecimal oDec, String sCurrency, 1930 String sLanguage, String sCountry) { 1931 if (null==oDec) return null; 1932 1933 Locale oLoc; 1934 if (null!=sLanguage && null!=sCountry) 1935 oLoc = new Locale (sLanguage,sCountry); 1936 else if (null!=sLanguage) 1937 oLoc = new Locale (sLanguage); 1938 else 1939 oLoc = Locale.getDefault(); 1940 if (null==sCurrency) { 1941 oCurr = Currency.getInstance(oLoc); 1942 } 1943 else if (!sCurrency.equals(sCurr)) { 1944 oCurr = Currency.getInstance(sCurrency); 1945 } 1946 NumberFormat oFmtC = NumberFormat.getCurrencyInstance(oLoc); 1947 oFmtC.setCurrency(oCurr); 1948 return oFmtC.format(oDec.doubleValue()); 1949 } 1950 1951 1953 1962 public static String formatCurrency (BigDecimal oDec, String sCurrency, 1963 String sLanguage) { 1964 if (null==oDec) return null; 1965 1966 Locale oLoc = (sLanguage==null ? Locale.getDefault() : new Locale (sLanguage)); 1967 if (null==sCurrency) { 1968 oCurr = Currency.getInstance(oLoc); 1969 } 1970 else if (!sCurrency.equals(sCurr)) { 1971 oCurr = Currency.getInstance(sCurrency); 1972 } 1973 NumberFormat oFmtC = NumberFormat.getCurrencyInstance(oLoc); 1974 oFmtC.setCurrency(oCurr); 1975 return oFmtC.format(oDec.doubleValue()); 1976 } 1977 1978 1987 public static String formatCurrency (BigDecimal oDec, String sCurrency, Locale oLocale) { 1988 NumberFormat oFmtC; 1989 if (null==oDec) return null; 1990 1991 if (null==sCurrency) { 1992 oCurr = Currency.getInstance(oLocale==null ? Locale.getDefault() : oLocale); 1993 } 1994 else if (!sCurrency.equals(sCurr)) { 1995 oCurr = Currency.getInstance(sCurrency); 1996 } 1997 if (null==oLocale) 1998 oFmtC = NumberFormat.getCurrencyInstance(Locale.getDefault()); 1999 else 2000 oFmtC = NumberFormat.getCurrencyInstance(oLocale); 2001 oFmtC.setCurrency(oCurr); 2002 return oFmtC.format(oDec.doubleValue()); 2003 } 2004 2005 2007 public static void main(String [] argv) { 2008 if (argv.length>0) { 2009 if (argv[0].equalsIgnoreCase("uuidgen")) { 2010 System.out.println(Gadgets.generateUUID()); 2011 } } 2013 } 2014 2015} | Popular Tags |