| 1 25 26 27 package org.nemesis.forum.util; 28 29 import java.security.MessageDigest ; 30 import java.security.NoSuchAlgorithmException ; 31 import java.util.ArrayList ; 32 import java.util.HashMap ; 33 import java.util.Map ; 34 import java.util.Random ; 35 import java.util.StringTokenizer ; 36 37 import org.apache.commons.logging.Log; 38 import org.apache.commons.logging.LogFactory; 39 42 public class StringUtils { 43 static protected Log log = LogFactory.getLog(StringUtils.class); 44 48 private static Object initLock = new Object (); 49 50 59 public static final String replace( String line, String oldString, String newString ) 60 { 61 if (line == null) { 62 return null; 63 } 64 int i=0; 65 if ( ( i=line.indexOf( oldString, i ) ) >= 0 ) { 66 char [] line2 = line.toCharArray(); 67 char [] newString2 = newString.toCharArray(); 68 int oLength = oldString.length(); 69 StringBuffer buf = new StringBuffer (line2.length); 70 buf.append(line2, 0, i).append(newString2); 71 i += oLength; 72 int j = i; 73 while( ( i=line.indexOf( oldString, i ) ) > 0 ) { 74 buf.append(line2, j, i-j).append(newString2); 75 i += oLength; 76 j = i; 77 } 78 buf.append(line2, j, line2.length - j); 79 return buf.toString(); 80 } 81 return line; 82 } 83 84 94 public static final String replaceIgnoreCase(String line, String oldString, 95 String newString) 96 { 97 if (line == null) { 98 return null; 99 } 100 String lcLine = line.toLowerCase(); 101 String lcOldString = oldString.toLowerCase(); 102 int i=0; 103 if ( ( i=lcLine.indexOf( lcOldString, i ) ) >= 0 ) { 104 char [] line2 = line.toCharArray(); 105 char [] newString2 = newString.toCharArray(); 106 int oLength = oldString.length(); 107 StringBuffer buf = new StringBuffer (line2.length); 108 buf.append(line2, 0, i).append(newString2); 109 i += oLength; 110 int j = i; 111 while( ( i=lcLine.indexOf( lcOldString, i ) ) > 0 ) { 112 buf.append(line2, j, i-j).append(newString2); 113 i += oLength; 114 j = i; 115 } 116 buf.append(line2, j, line2.length - j); 117 return buf.toString(); 118 } 119 return line; 120 } 121 122 132 public static final String replace( String line, String oldString, 133 String newString, int[] count) 134 { 135 if (line == null) { 136 return null; 137 } 138 int i=0; 139 if ( ( i=line.indexOf( oldString, i ) ) >= 0 ) { 140 int counter = 0; 141 counter++; 142 char [] line2 = line.toCharArray(); 143 char [] newString2 = newString.toCharArray(); 144 int oLength = oldString.length(); 145 StringBuffer buf = new StringBuffer (line2.length); 146 buf.append(line2, 0, i).append(newString2); 147 i += oLength; 148 int j = i; 149 while( ( i=line.indexOf( oldString, i ) ) > 0 ) { 150 counter++; 151 buf.append(line2, j, i-j).append(newString2); 152 i += oLength; 153 j = i; 154 } 155 buf.append(line2, j, line2.length - j); 156 count[0] = counter; 157 return buf.toString(); 158 } 159 return line; 160 } 161 162 171 public static final String escapeHTMLTags( String input ) { 172 if( input == null || input.length() == 0 ) { 175 return input; 176 } 177 StringBuffer buf = new StringBuffer (input.length()); 180 char ch = ' '; 181 for( int i=0; i<input.length(); i++ ) { 182 ch = input.charAt(i); 183 if( ch == '<' ) { 184 buf.append("<"); 185 } 186 else if( ch == '>' ) { 187 buf.append(">"); 188 } 189 else { 190 buf.append( ch ); 191 } 192 } 193 return buf.toString(); 194 } 195 196 199 private static MessageDigest digest = null; 200 201 225 public synchronized static final String hash(String data) { 226 if (digest == null) { 227 try { 228 digest = MessageDigest.getInstance("MD5"); 229 } 230 catch (NoSuchAlgorithmException nsae) { 231 log.error("Failed to load the MD5 MessageDigest. " + 232 "will be unable to function normally.",nsae); 233 234 } 235 } 236 digest.update(data.getBytes()); 238 return toHex(digest.digest()); 239 } 240 241 252 public static final String toHex (byte hash[]) { 253 StringBuffer buf = new StringBuffer (hash.length * 2); 254 int i; 255 256 for (i = 0; i < hash.length; i++) { 257 if (((int) hash[i] & 0xff) < 0x10) { 258 buf.append("0"); 259 } 260 buf.append(Long.toString((int) hash[i] & 0xff, 16)); 261 } 262 return buf.toString(); 263 } 264 265 275 public static final String [] toLowerCaseWordArray(String text) { 276 if (text == null || text.length() == 0) { 277 return new String [0]; 278 } 279 StringTokenizer tokens = new StringTokenizer (text, " ,\r\n.:/\\+"); 280 String [] words = new String [tokens.countTokens()]; 281 for (int i=0; i<words.length; i++) { 282 words[i] = tokens.nextToken().toLowerCase(); 283 } 284 return words; 285 } 286 287 292 private static final String [] commonWords = new String [] { 293 "a", "and", "as", "at", "be", "do", "i", "if", "in", "is", "it", "so", 294 "the", "to" 295 }; 296 private static Map commonWordsMap = null; 297 298 303 public static final String [] removeCommonWords(String [] words) { 304 if (commonWordsMap == null) { 308 synchronized(initLock) { 309 if (commonWordsMap == null) { 310 commonWordsMap = new HashMap (); 311 for (int i=0; i<commonWords.length; i++) { 312 commonWordsMap.put(commonWords[i], commonWords[i]); 313 } 314 } 315 } 316 } 317 ArrayList results = new ArrayList (words.length); 319 for (int i=0; i<words.length; i++) { 320 if (!commonWordsMap.containsKey(words[i])) { 321 results.add(words[i]); 322 } 323 } 324 return (String [])results.toArray(new String [results.size()]); 325 } 326 327 332 private static Random randGen = null; 333 334 340 private static char[] numbersAndLetters = null; 341 342 359 public static final String randomString(int length) { 360 if (length < 1) { 361 return null; 362 } 363 if (randGen == null) { 365 synchronized (initLock) { 366 if (randGen == null) { 367 randGen = new Random (); 368 numbersAndLetters = ("0123456789abcdefghijklmnopqrstuvwxyz" + 370 "0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZ").toCharArray(); 371 } 372 } 373 } 374 char [] randBuffer = new char[length]; 376 for (int i=0; i<randBuffer.length; i++) { 377 randBuffer[i] = numbersAndLetters[randGen.nextInt(71)]; 378 } 379 return new String (randBuffer); 380 } 381 382 399 public static final String chopAtWord(String string, int length) { 400 if (string == null) { 401 return string; 402 } 403 404 char [] charArray = string.toCharArray(); 405 int sLength = string.length(); 406 if (length < sLength) { 407 sLength = length; 408 } 409 410 for (int i=0; i<sLength-1; i++) { 413 if (charArray[i] == '\r' && charArray[i+1] == '\n') { 415 return string.substring(0, i); 416 } 417 else if (charArray[i] == '\n') { 419 return string.substring(0, i); 420 } 421 } 422 if (charArray[sLength-1] == '\n') { 424 return string.substring(0, sLength-1); 425 } 426 427 if (string.length() < length) { 430 return string; 431 } 432 433 for (int i = length-1; i > 0; i--) { 435 if (charArray[i] == ' ') { 436 return string.substring(0, i).trim(); 437 } 438 } 439 440 return string.substring(0, length); 443 } 444 445 456 public static final String highlightWords(String string, String [] words, 457 String startHighlight, String endHighlight) 458 { 459 if (string == null || words == null || 460 startHighlight == null || endHighlight == null) 461 { 462 return null; 463 } 464 465 for (int x=0; x<words.length; x++) { 467 String lcString = string.toLowerCase(); 469 char [] string2 = string.toCharArray(); 471 String word = words[x].toLowerCase(); 472 473 int i=0; 475 if ( ( i=lcString.indexOf( word, i ) ) >= 0 ) { 476 int oLength = word.length(); 477 StringBuffer buf = new StringBuffer (string2.length); 478 479 boolean startSpace = false; 483 char startChar = ' '; 484 if (i-1 > 0) { 485 startChar = string2[i-1]; 486 if (!Character.isLetter(startChar)) { 487 startSpace = true; 488 } 489 } 490 boolean endSpace = false; 491 char endChar = ' '; 492 if (i+oLength<string2.length) { 493 endChar = string2[i+oLength]; 494 if (!Character.isLetter(endChar)) { 495 endSpace = true; 496 } 497 } 498 if ((startSpace && endSpace) || (i==0 && endSpace)) { 499 buf.append(string2, 0, i); 500 if (startSpace && startChar==' ') { buf.append(startChar); } 501 buf.append(startHighlight); 502 buf.append(string2, i, oLength).append(endHighlight); 503 if (endSpace && endChar==' ') { buf.append(endChar); } 504 } 505 else { 506 buf.append(string2, 0, i); 507 buf.append(string2, i, oLength); 508 } 509 510 i += oLength; 511 int j = i; 512 while( ( i=lcString.indexOf( word, i ) ) > 0 ) { 513 startSpace = false; 514 startChar = string2[i-1]; 515 if (!Character.isLetter(startChar)) { 516 startSpace = true; 517 } 518 519 endSpace = false; 520 if (i+oLength<string2.length) { 521 endChar = string2[i+oLength]; 522 if (!Character.isLetter(endChar)) { 523 endSpace = true; 524 } 525 } 526 if ((startSpace && endSpace) || i+oLength==string2.length) { 527 buf.append(string2, j, i-j); 528 if (startSpace && startChar==' ') { buf.append(startChar); } 529 buf.append(startHighlight); 530 buf.append(string2, i, oLength).append(endHighlight); 531 if (endSpace && endChar==' ') { buf.append(endChar); } 532 } 533 else { 534 buf.append(string2, j, i-j); 535 buf.append(string2, i, oLength); 536 } 537 i += oLength; 538 j = i; 539 } 540 buf.append(string2, j, string2.length - j); 541 string = buf.toString(); 542 } 543 } 544 return string; 545 } 546 547 554 public static final String escapeForXML(String string) { 555 if (string == null || string.length() == 0 ) { 558 return string; 559 } 560 char [] sArray = string.toCharArray(); 561 StringBuffer buf = new StringBuffer (sArray.length); 562 char ch; 563 for (int i=0; i<sArray.length; i++) { 564 ch = sArray[i]; 565 if(ch == '<') { 566 buf.append("<"); 567 } 568 else if (ch == '&') { 569 buf.append("&"); 570 } 571 else if (ch == '"') { 572 buf.append("""); 573 } 574 else { 575 buf.append(ch); 576 } 577 } 578 return buf.toString(); 579 } 580 581 } 582 | Popular Tags |