1 23 package com.sun.enterprise.diagnostics.report.html; 24 25 import java.io.ByteArrayOutputStream ; 26 import java.io.IOException ; 27 import java.util.HashMap ; 28 import java.util.Map ; 29 30 37 public class Escape { 38 39 40 public static final int UNDEFINED = -1; 41 42 43 private static Escape instance = null; 44 45 49 private boolean useHex = false; 50 51 56 private final Map <Character ,String > alwaysReplace = 57 new HashMap <Character ,String >(); 58 { 59 alwaysReplace.put(new Character ('&'), "amp"); 60 alwaysReplace.put(new Character ('<'), "lt"); 61 alwaysReplace.put(new Character ('>'), "gt"); 62 alwaysReplace.put(new Character ('"'), "quot"); 63 alwaysReplace.put(new Character ('\''), "#039"); 64 alwaysReplace.put(new Character ('\u00A0'), "nbsp"); 65 } 66 67 71 private final Map <String ,Character > entityToChar = 72 new HashMap <String ,Character >(); 73 74 86 private final Map <Character ,String > charToEntity = new HashMap <Character ,String >(); 87 { 88 92 93 setEntity("nbsp", (char) 160); 94 95 setEntity("iexcl", (char) 161); 96 97 setEntity("cent", (char) 162); 98 99 setEntity("pound", (char) 163); 100 101 setEntity("curren", (char) 164); 102 103 setEntity("yen", (char) 165); 104 105 setEntity("brvbar", (char) 166); 106 107 setEntity("sect", (char) 167); 108 109 setEntity("uml", (char) 168); 110 111 setEntity("copy", (char) 169); 112 113 setEntity("ordf", (char) 170); 114 115 setEntity("laquo", (char) 171); 116 117 setEntity("not", (char) 172); 118 119 setEntity("shy", (char) 173); 120 121 setEntity("reg", (char) 174); 122 123 setEntity("macr", (char) 175); 124 125 setEntity("deg", (char) 176); 126 127 setEntity("plusmn", (char) 177); 128 129 setEntity("sup2", (char) 178); 130 131 setEntity("sup3", (char) 179); 132 133 setEntity("acute", (char) 180); 134 135 setEntity("micro", (char) 181); 136 137 setEntity("para", (char) 182); 138 139 setEntity("middot", (char) 183); 140 141 setEntity("cedil", (char) 184); 142 143 setEntity("sup1", (char) 185); 144 145 setEntity("ordm", (char) 186); 146 147 setEntity("raquo", (char) 187); 148 149 setEntity("frac14", (char) 188); 150 151 setEntity("frac12", (char) 189); 152 153 setEntity("frac34", (char) 190); 154 155 setEntity("iquest", (char) 191); 156 157 setEntity("Agrave", (char) 192); 158 159 setEntity("Aacute", (char) 193); 160 161 setEntity("Acirc", (char) 194); 162 163 setEntity("Atilde", (char) 195); 164 165 setEntity("Auml", (char) 196); 166 167 setEntity("Aring", (char) 197); 168 169 setEntity("AElig", (char) 198); 170 171 setEntity("Ccedil", (char) 199); 172 173 setEntity("Egrave", (char) 200); 174 175 setEntity("Eacute", (char) 201); 176 177 setEntity("Ecirc", (char) 202); 178 179 setEntity("Euml", (char) 203); 180 181 setEntity("Igrave", (char) 204); 182 183 setEntity("Iacute", (char) 205); 184 185 setEntity("Icirc", (char) 206); 186 187 setEntity("Iuml", (char) 207); 188 189 setEntity("ETH", (char) 208); 190 191 setEntity("Ntilde", (char) 209); 192 193 setEntity("Ograve", (char) 210); 194 195 setEntity("Oacute", (char) 211); 196 197 setEntity("Ocirc", (char) 212); 198 199 setEntity("Otilde", (char) 213); 200 201 setEntity("Ouml", (char) 214); 202 203 setEntity("times", (char) 215); 204 205 setEntity("Oslash", (char) 216); 206 207 setEntity("Ugrave", (char) 217); 208 209 setEntity("Uacute", (char) 218); 210 211 setEntity("Ucirc", (char) 219); 212 213 setEntity("Uuml", (char) 220); 214 215 setEntity("Yacute", (char) 221); 216 217 setEntity("THORN", (char) 222); 218 219 setEntity("szlig", (char) 223); 220 221 setEntity("agrave", (char) 224); 222 223 setEntity("aacute", (char) 225); 224 225 setEntity("acirc", (char) 226); 226 227 setEntity("atilde", (char) 227); 228 229 setEntity("auml", (char) 228); 230 231 setEntity("aring", (char) 229); 232 233 setEntity("aelig", (char) 230); 234 235 setEntity("ccedil", (char) 231); 236 237 setEntity("egrave", (char) 232); 238 239 setEntity("eacute", (char) 233); 240 241 setEntity("ecirc", (char) 234); 242 243 setEntity("euml", (char) 235); 244 245 setEntity("igrave", (char) 236); 246 247 setEntity("iacute", (char) 237); 248 249 setEntity("icirc", (char) 238); 250 251 setEntity("iuml", (char) 239); 252 253 setEntity("eth", (char) 240); 254 255 setEntity("ntilde", (char) 241); 256 257 setEntity("ograve", (char) 242); 258 259 setEntity("oacute", (char) 243); 260 261 setEntity("ocirc", (char) 244); 262 263 setEntity("otilde", (char) 245); 264 265 setEntity("ouml", (char) 246); 266 267 setEntity("divide", (char) 247); 268 269 setEntity("oslash", (char) 248); 270 271 setEntity("ugrave", (char) 249); 272 273 setEntity("uacute", (char) 250); 274 275 setEntity("ucirc", (char) 251); 276 277 setEntity("uuml", (char) 252); 278 279 setEntity("yacute", (char) 253); 280 281 setEntity("thorn", (char) 254); 282 283 setEntity("yuml", (char) 255); 284 285 288 289 setEntity("fnof", (char) 402); 290 291 setEntity("Alpha", (char) 913); 292 293 setEntity("Beta", (char) 914); 294 295 setEntity("Gamma", (char) 915); 296 297 setEntity("Delta", (char) 916); 298 299 setEntity("Epsilon", (char) 917); 300 301 setEntity("Zeta", (char) 918); 302 303 setEntity("Eta", (char) 919); 304 305 setEntity("Theta", (char) 920); 306 307 setEntity("Iota", (char) 921); 308 309 setEntity("Kappa", (char) 922); 310 311 setEntity("Lambda", (char) 923); 312 313 setEntity("Mu", (char) 924); 314 315 setEntity("Nu", (char) 925); 316 317 setEntity("Xi", (char) 926); 318 319 setEntity("Omicron", (char) 927); 320 321 setEntity("Pi", (char) 928); 322 323 setEntity("Rho", (char) 929); 324 325 setEntity("Sigma", (char) 931); 326 327 setEntity("Tau", (char) 932); 328 329 setEntity("Upsilon", (char) 933); 330 331 setEntity("Phi", (char) 934); 332 333 setEntity("Chi", (char) 935); 334 335 setEntity("Psi", (char) 936); 336 337 setEntity("Omega", (char) 937); 338 339 setEntity("alpha", (char) 945); 340 341 setEntity("beta", (char) 946); 342 343 setEntity("gamma", (char) 947); 344 345 setEntity("delta", (char) 948); 346 347 setEntity("epsilon", (char) 949); 348 349 setEntity("zeta", (char) 950); 350 351 setEntity("eta", (char) 951); 352 353 setEntity("theta", (char) 952); 354 355 setEntity("iota", (char) 953); 356 357 setEntity("kappa", (char) 954); 358 359 setEntity("lambda", (char) 955); 360 361 setEntity("mu", (char) 956); 362 363 setEntity("nu", (char) 957); 364 365 setEntity("xi", (char) 958); 366 367 setEntity("omicron", (char) 959); 368 369 setEntity("pi", (char) 960); 370 371 setEntity("rho", (char) 961); 372 373 setEntity("sigmaf", (char) 962); 374 375 setEntity("sigma", (char) 963); 376 377 setEntity("tau", (char) 964); 378 379 setEntity("upsilon", (char) 965); 380 381 setEntity("phi", (char) 966); 382 383 setEntity("chi", (char) 967); 384 385 setEntity("psi", (char) 968); 386 387 setEntity("omega", (char) 969); 388 389 setEntity("thetasym", (char) 977); 390 391 setEntity("upsih", (char) 978); 392 393 setEntity("piv", (char) 982); 394 395 setEntity("bull", (char) 8226); 396 397 setEntity("hellip", (char) 8230); 398 399 setEntity("prime", (char) 8242); 400 401 setEntity("Prime", (char) 8243); 402 403 setEntity("oline", (char) 8254); 404 405 setEntity("frasl", (char) 8260); 406 407 setEntity("weierp", (char) 8472); 408 409 setEntity("image", (char) 8465); 410 411 setEntity("real", (char) 8476); 412 413 setEntity("trade", (char) 8482); 414 415 setEntity("alefsym", (char) 8501); 416 417 setEntity("larr", (char) 8592); 418 419 setEntity("uarr", (char) 8593); 420 421 setEntity("rarr", (char) 8594); 422 423 setEntity("darr", (char) 8595); 424 425 setEntity("harr", (char) 8596); 426 427 setEntity("crarr", (char) 8629); 428 429 setEntity("lArr", (char) 8656); 430 431 setEntity("uArr", (char) 8657); 432 433 setEntity("rArr", (char) 8658); 434 435 setEntity("dArr", (char) 8659); 436 437 setEntity("hArr", (char) 8660); 438 439 setEntity("forall", (char) 8704); 440 441 setEntity("part", (char) 8706); 442 443 setEntity("exist", (char) 8707); 444 445 setEntity("empty", (char) 8709); 446 447 setEntity("nabla", (char) 8711); 448 449 setEntity("isin", (char) 8712); 450 451 setEntity("notin", (char) 8713); 452 453 setEntity("ni", (char) 8715); 454 455 setEntity("prod", (char) 8719); 456 457 setEntity("sum", (char) 8721); 458 459 setEntity("minus", (char) 8722); 460 461 setEntity("lowast", (char) 8727); 462 463 setEntity("radic", (char) 8730); 464 465 setEntity("prop", (char) 8733); 466 467 setEntity("infin", (char) 8734); 468 469 setEntity("ang", (char) 8736); 470 471 setEntity("and", (char) 8743); 472 473 setEntity("or", (char) 8744); 474 475 setEntity("cap", (char) 8745); 476 477 setEntity("cup", (char) 8746); 478 479 setEntity("int", (char) 8747); 480 481 setEntity("there4", (char) 8756); 482 483 setEntity("sim", (char) 8764); 484 485 setEntity("cong", (char) 8773); 486 487 setEntity("asymp", (char) 8776); 488 489 setEntity("ne", (char) 8800); 490 491 setEntity("equiv", (char) 8801); 492 493 setEntity("le", (char) 8804); 494 495 setEntity("ge", (char) 8805); 496 497 setEntity("sub", (char) 8834); 498 499 setEntity("sup", (char) 8835); 500 501 setEntity("nsub", (char) 8836); 502 503 setEntity("sube", (char) 8838); 504 505 setEntity("supe", (char) 8839); 506 507 setEntity("oplus", (char) 8853); 508 509 setEntity("otimes", (char) 8855); 510 511 setEntity("perp", (char) 8869); 512 513 setEntity("sdot", (char) 8901); 514 515 setEntity("lceil", (char) 8968); 516 517 setEntity("rceil", (char) 8969); 518 519 setEntity("lfloor", (char) 8970); 520 521 setEntity("rfloor", (char) 8971); 522 523 setEntity("lang", (char) 9001); 524 525 setEntity("rang", (char) 9002); 526 527 setEntity("loz", (char) 9674); 528 529 setEntity("spades", (char) 9824); 530 531 setEntity("clubs", (char) 9827); 532 533 setEntity("hearts", (char) 9829); 534 535 setEntity("diams", (char) 9830); 536 537 541 542 setEntity("quot", (char) 34); 543 544 setEntity("amp", (char) 38); 545 546 setEntity("lt", (char) 60); 547 548 setEntity("gt", (char) 62); 549 550 setEntity("OElig", (char) 338); 551 552 setEntity("oelig", (char) 339); 553 554 setEntity("Scaron", (char) 352); 555 556 setEntity("scaron", (char) 353); 557 558 setEntity("Yuml", (char) 376); 559 560 setEntity("circ", (char) 710); 561 562 setEntity("tilde", (char) 732); 563 564 setEntity("ensp", (char) 8194); 565 566 setEntity("emsp", (char) 8195); 567 568 setEntity("thinsp", (char) 8201); 569 570 setEntity("zwnj", (char) 8204); 571 572 setEntity("zwj", (char) 8205); 573 574 setEntity("lrm", (char) 8206); 575 576 setEntity("rlm", (char) 8207); 577 578 setEntity("ndash", (char) 8211); 579 580 setEntity("mdash", (char) 8212); 581 582 setEntity("lsquo", (char) 8216); 583 584 setEntity("rsquo", (char) 8217); 585 586 setEntity("sbquo", (char) 8218); 587 588 setEntity("ldquo", (char) 8220); 589 590 setEntity("rdquo", (char) 8221); 591 592 setEntity("bdquo", (char) 8222); 593 594 setEntity("dagger", (char) 8224); 595 596 setEntity("Dagger", (char) 8225); 597 598 setEntity("permil", (char) 8240); 599 600 setEntity("lsaquo", (char) 8249); 601 602 setEntity("rsaquo", (char) 8250); 603 604 setEntity("euro", (char) 8364); 605 charToEntity.put(new Character (';'), "semi"); 606 charToEntity.put(new Character ('\u00A0'), "nbsp"); 607 } 608 609 610 614 private String preserve = "_-!.~#()*" + ",;:$&+=" + "?/[]@"; 615 616 617 623 protected Escape() { 624 super(); 625 } 626 627 628 633 public static final Escape getInstance() { 634 if (instance == null) { 635 instance = new Escape(); 636 } 637 return instance; 638 } 639 640 641 647 public static final Escape setInstance(Escape escape) { 648 if (escape == null) { 649 throw new NullPointerException ("Escape instance is null."); 650 } 651 instance = escape; 652 return instance; 653 } 654 655 656 663 public String encodeAsEntity(char ch) { 664 String replacement = charToEntity.get(new Character (ch)); 665 if (replacement == null) { 666 String value = "" + (int) ch; 667 for (int i = value.length(); i < 3; i++) { 668 value = "0" + value; 669 } return "&#" + value + ";"; 671 } else { 672 return "&" + replacement + ";"; 673 } 674 } 675 676 677 685 public String decodeAsEntity(String name) { 686 if (name == null) { 687 throw new NullPointerException ("Entity name is null."); 688 } 689 690 if (name.startsWith("&") && name.endsWith(";")) { 693 name = name.substring(1, name.length()-1); 694 } 695 696 if (name.startsWith("#")) { 702 try { 703 name = name.substring(1); 704 if (name.startsWith("X")) { 705 name = name.substring(1); 706 return "" + Integer.parseInt(name, 16); 707 } else { 708 return "" + Integer.parseInt(name); 709 } 710 } catch (NumberFormatException nfe) { 711 return "&" + name + ";"; 712 } 713 } 714 715 Character value = entityToChar.get(name); 717 if (value == null) { 718 return "&" + name + ";"; 719 } else { 720 return "" + value.charValue(); 721 } 722 } 723 724 725 745 public String encodeEntities(String cdata, String characters) { 746 if (cdata == null) { 747 throw new NullPointerException ("The character data to " + 748 "encode is null."); 749 } 750 if (characters == null) { 751 throw new NullPointerException ("The list of additional " + 752 "characters to encode is null."); 753 } 754 755 StringBuffer buf = new StringBuffer (); 759 for (char ch : cdata.toCharArray()) { 760 if (ch >= 128 || 761 alwaysReplace.containsKey(new Character (ch)) || 762 characters.indexOf(ch) >= 0) { 763 buf.append(encodeAsEntity(ch)); 764 } else { 765 buf.append(ch); 766 } 767 } 769 return buf.toString(); 771 } 772 773 774 783 public String decodeEntities(String cdata) { 784 if (cdata == null) { 785 throw new NullPointerException ("The character data to " + 786 "decode is null."); 787 } 788 789 StringBuffer buf = new StringBuffer (); 792 int i = 0; 793 while (cdata.length() > 0) { 794 i = cdata.indexOf('&'); 796 if (i < 0) { 797 buf.append(cdata); 798 cdata = ""; 799 continue; 800 } 801 802 buf.append(cdata.substring(0,i)); 804 cdata = cdata.substring(i); 805 806 i = cdata.indexOf(';'); 808 if (i < 0) { 809 buf.append(cdata); 810 cdata = ""; 811 continue; 812 } 813 814 String entity = cdata.substring(1,i); 816 cdata = cdata.substring(i+1); 817 818 String replace = decodeAsEntity(entity); 820 821 buf.append(replace); 823 } 825 return buf.toString(); 827 } 828 829 830 839 public Escape setUseHex(boolean flag) { 840 useHex = flag; 841 return this; 842 } 843 844 845 853 public Escape setEntity(String entity, char value) { 854 if (entity == null) { 855 throw new NullPointerException ("The entity name is null."); 856 } 857 if (entity.startsWith("&")) { 858 entity = entity.substring(1, entity.length()); 859 } 860 if (entity.endsWith(";")) { 861 entity = entity.substring(0, entity.length()-1); 862 } 863 charToEntity.put(new Character (value), entity); 864 entityToChar.put(entity, new Character (value)); 865 return this; 866 } 867 868 869 878 public String hexEncode(char ch) { 879 byte[] bytes = ("" + ch).getBytes(); 885 StringBuffer buf = new StringBuffer (); 886 for (byte bt : bytes) { 887 int ibt = (int) bt & 0xFF; 892 buf.append('%'); 893 String hex = Integer.toHexString(ibt); 894 if (hex.length() < 2) { 895 buf.append('0'); 896 } 897 buf.append(hex); 898 } 900 return buf.toString(); 902 } 903 904 905 913 public String hexEncode(String text, String characters) { 914 StringBuffer buf = new StringBuffer (); 916 for (char ch : text.toCharArray()) { 917 if (ch < 128 && 918 (Character.isLetterOrDigit(ch) || 919 characters.indexOf(ch) >= 0) || 920 preserve.indexOf(ch) >= 0) { 921 buf.append(ch); 922 } else { 923 buf.append(hexEncode(ch)); 924 } 925 } 927 return buf.toString(); 929 } 930 931 932 940 public String hexDecode(String text) { 941 if (text == null) { 942 throw new NullPointerException ("The text to hex decode is null."); 943 } 944 945 ByteArrayOutputStream baos = new ByteArrayOutputStream (); 948 int index = 0; 949 int length = text.length(); 950 while (index < length) { 951 char ch = text.charAt(index); 954 try { 955 if (ch == '%') { 956 if (length - index <= 2) { 958 baos.write("%".getBytes()); 960 index++; 961 continue; 962 } 963 964 String hex = text.substring(index+1, index+3); 966 try { 967 int value = Integer.parseInt(hex, 16); 968 baos.write((byte) value); 969 index += 3; 970 } catch (NumberFormatException exception) { 971 baos.write("%".getBytes()); 973 index++; 974 } 975 } else { 976 baos.write(("" + ch).getBytes()); 978 index++; 979 } 980 } catch (IOException exception) { 981 } 983 } 985 return baos.toString(); 987 } 988 } 989 | Popular Tags |