| 1 16 package org.apache.commons.lang.builder; 17 18 import java.io.Serializable ; 19 import java.lang.reflect.Array ; 20 import java.util.Collection ; 21 import java.util.Map ; 22 23 import org.apache.commons.lang.ClassUtils; 24 import org.apache.commons.lang.ObjectUtils; 25 import org.apache.commons.lang.SystemUtils; 26 27 68 public abstract class ToStringStyle implements Serializable { 69 70 73 public static final ToStringStyle DEFAULT_STYLE = new DefaultToStringStyle(); 74 75 78 public static final ToStringStyle MULTI_LINE_STYLE = new MultiLineToStringStyle(); 79 80 83 public static final ToStringStyle NO_FIELD_NAMES_STYLE = new NoFieldNameToStringStyle(); 84 85 89 public static final ToStringStyle SHORT_PREFIX_STYLE = new ShortPrefixToStringStyle(); 90 91 94 public static final ToStringStyle SIMPLE_STYLE = new SimpleToStringStyle(); 95 96 99 private boolean useFieldNames = true; 100 101 104 private boolean useClassName = true; 105 106 109 private boolean useShortClassName = false; 110 111 114 private boolean useIdentityHashCode = true; 115 116 119 private String contentStart = "["; 120 121 124 private String contentEnd = "]"; 125 126 129 private String fieldNameValueSeparator = "="; 130 131 134 private boolean fieldSeparatorAtStart = false; 135 136 139 private boolean fieldSeparatorAtEnd = false; 140 141 144 private String fieldSeparator = ","; 145 146 149 private String arrayStart = "{"; 150 151 154 private String arraySeparator = ","; 155 156 159 private boolean arrayContentDetail = true; 160 161 164 private String arrayEnd = "}"; 165 166 170 private boolean defaultFullDetail = true; 171 172 175 private String nullText = "<null>"; 176 177 180 private String sizeStartText = "<size="; 181 182 185 private String sizeEndText = ">"; 186 187 190 private String summaryObjectStartText = "<"; 191 192 195 private String summaryObjectEndText = ">"; 196 197 199 202 protected ToStringStyle() { 203 super(); 204 } 205 206 208 217 public void appendSuper(StringBuffer buffer, String superToString) { 218 appendToString(buffer, superToString); 219 } 220 221 230 public void appendToString(StringBuffer buffer, String toString) { 231 if (toString != null) { 232 int pos1 = toString.indexOf(contentStart) + contentStart.length(); 233 int pos2 = toString.lastIndexOf(contentEnd); 234 if (pos1 != pos2 && pos1 >= 0 && pos2 >= 0) { 235 String data = toString.substring(pos1, pos2); 236 if (fieldSeparatorAtStart) { 237 removeLastFieldSeparator(buffer); 238 } 239 buffer.append(data); 240 appendFieldSeparator(buffer); 241 } 242 } 243 } 244 245 251 public void appendStart(StringBuffer buffer, Object object) { 252 if (object != null) { 253 appendClassName(buffer, object); 254 appendIdentityHashCode(buffer, object); 255 appendContentStart(buffer); 256 if (fieldSeparatorAtStart) { 257 appendFieldSeparator(buffer); 258 } 259 } 260 } 261 262 269 public void appendEnd(StringBuffer buffer, Object object) { 270 if (this.fieldSeparatorAtEnd == false) { 271 removeLastFieldSeparator(buffer); 272 } 273 appendContentEnd(buffer); 274 } 275 276 282 protected void removeLastFieldSeparator(StringBuffer buffer) { 283 int len = buffer.length(); 284 int sepLen = fieldSeparator.length(); 285 if (len > 0 && sepLen > 0 && len >= sepLen) { 286 boolean match = true; 287 for (int i = 0; i < sepLen; i++) { 288 if (buffer.charAt(len - 1 - i) != fieldSeparator.charAt(sepLen - 1 - i)) { 289 match = false; 290 break; 291 } 292 } 293 if (match) { 294 buffer.setLength(len - sepLen); 295 } 296 } 297 } 298 299 301 312 public void append(StringBuffer buffer, String fieldName, Object value, Boolean fullDetail) { 313 appendFieldStart(buffer, fieldName); 314 315 if (value == null) { 316 appendNullText(buffer, fieldName); 317 318 } else { 319 appendInternal(buffer, fieldName, value, isFullDetail(fullDetail)); 320 } 321 322 appendFieldEnd(buffer, fieldName); 323 } 324 325 344 protected void appendInternal(StringBuffer buffer, String fieldName, Object value, boolean detail) { 345 if (ReflectionToStringBuilder.isRegistered(value) 346 && !(value instanceof Number || value instanceof Boolean || value instanceof Character )) { 347 ObjectUtils.appendIdentityToString(buffer, value); 348 349 } else if (value instanceof Collection ) { 350 if (detail) { 351 appendDetail(buffer, fieldName, (Collection ) value); 352 } else { 353 appendSummarySize(buffer, fieldName, ((Collection ) value).size()); 354 } 355 356 } else if (value instanceof Map ) { 357 if (detail) { 358 appendDetail(buffer, fieldName, (Map ) value); 359 } else { 360 appendSummarySize(buffer, fieldName, ((Map ) value).size()); 361 } 362 363 } else if (value instanceof long[]) { 364 if (detail) { 365 appendDetail(buffer, fieldName, (long[]) value); 366 } else { 367 appendSummary(buffer, fieldName, (long[]) value); 368 } 369 370 } else if (value instanceof int[]) { 371 if (detail) { 372 appendDetail(buffer, fieldName, (int[]) value); 373 } else { 374 appendSummary(buffer, fieldName, (int[]) value); 375 } 376 377 } else if (value instanceof short[]) { 378 if (detail) { 379 appendDetail(buffer, fieldName, (short[]) value); 380 } else { 381 appendSummary(buffer, fieldName, (short[]) value); 382 } 383 384 } else if (value instanceof byte[]) { 385 if (detail) { 386 appendDetail(buffer, fieldName, (byte[]) value); 387 } else { 388 appendSummary(buffer, fieldName, (byte[]) value); 389 } 390 391 } else if (value instanceof char[]) { 392 if (detail) { 393 appendDetail(buffer, fieldName, (char[]) value); 394 } else { 395 appendSummary(buffer, fieldName, (char[]) value); 396 } 397 398 } else if (value instanceof double[]) { 399 if (detail) { 400 appendDetail(buffer, fieldName, (double[]) value); 401 } else { 402 appendSummary(buffer, fieldName, (double[]) value); 403 } 404 405 } else if (value instanceof float[]) { 406 if (detail) { 407 appendDetail(buffer, fieldName, (float[]) value); 408 } else { 409 appendSummary(buffer, fieldName, (float[]) value); 410 } 411 412 } else if (value instanceof boolean[]) { 413 if (detail) { 414 appendDetail(buffer, fieldName, (boolean[]) value); 415 } else { 416 appendSummary(buffer, fieldName, (boolean[]) value); 417 } 418 419 } else if (value.getClass().isArray()) { 420 if (detail) { 421 appendDetail(buffer, fieldName, (Object []) value); 422 } else { 423 appendSummary(buffer, fieldName, (Object []) value); 424 } 425 426 } else { 427 if (detail) { 428 appendDetail(buffer, fieldName, value); 429 } else { 430 appendSummary(buffer, fieldName, value); 431 } 432 } 433 } 434 435 444 protected void appendDetail(StringBuffer buffer, String fieldName, Object value) { 445 buffer.append(value); 446 } 447 448 456 protected void appendDetail(StringBuffer buffer, String fieldName, Collection coll) { 457 buffer.append(coll); 458 } 459 460 468 protected void appendDetail(StringBuffer buffer, String fieldName, Map map) { 469 buffer.append(map); 470 } 471 472 481 protected void appendSummary(StringBuffer buffer, String fieldName, Object value) { 482 buffer.append(summaryObjectStartText); 483 buffer.append(getShortClassName(value.getClass())); 484 buffer.append(summaryObjectEndText); 485 } 486 487 489 497 public void append(StringBuffer buffer, String fieldName, long value) { 498 appendFieldStart(buffer, fieldName); 499 appendDetail(buffer, fieldName, value); 500 appendFieldEnd(buffer, fieldName); 501 } 502 503 511 protected void appendDetail(StringBuffer buffer, String fieldName, long value) { 512 buffer.append(value); 513 } 514 515 517 525 public void append(StringBuffer buffer, String fieldName, int value) { 526 appendFieldStart(buffer, fieldName); 527 appendDetail(buffer, fieldName, value); 528 appendFieldEnd(buffer, fieldName); 529 } 530 531 539 protected void appendDetail(StringBuffer buffer, String fieldName, int value) { 540 buffer.append(value); 541 } 542 543 545 553 public void append(StringBuffer buffer, String fieldName, short value) { 554 appendFieldStart(buffer, fieldName); 555 appendDetail(buffer, fieldName, value); 556 appendFieldEnd(buffer, fieldName); 557 } 558 559 567 protected void appendDetail(StringBuffer buffer, String fieldName, short value) { 568 buffer.append(value); 569 } 570 571 573 581 public void append(StringBuffer buffer, String fieldName, byte value) { 582 appendFieldStart(buffer, fieldName); 583 appendDetail(buffer, fieldName, value); 584 appendFieldEnd(buffer, fieldName); 585 } 586 587 595 protected void appendDetail(StringBuffer buffer, String fieldName, byte value) { 596 buffer.append(value); 597 } 598 599 601 609 public void append(StringBuffer buffer, String fieldName, char value) { 610 appendFieldStart(buffer, fieldName); 611 appendDetail(buffer, fieldName, value); 612 appendFieldEnd(buffer, fieldName); 613 } 614 615 623 protected void appendDetail(StringBuffer buffer, String fieldName, char value) { 624 buffer.append(value); 625 } 626 627 629 637 public void append(StringBuffer buffer, String fieldName, double value) { 638 appendFieldStart(buffer, fieldName); 639 appendDetail(buffer, fieldName, value); 640 appendFieldEnd(buffer, fieldName); 641 } 642 643 651 protected void appendDetail(StringBuffer buffer, String fieldName, double value) { 652 buffer.append(value); 653 } 654 655 657 665 public void append(StringBuffer buffer, String fieldName, float value) { 666 appendFieldStart(buffer, fieldName); 667 appendDetail(buffer, fieldName, value); 668 appendFieldEnd(buffer, fieldName); 669 } 670 671 679 protected void appendDetail(StringBuffer buffer, String fieldName, float value) { 680 buffer.append(value); 681 } 682 683 685 693 public void append(StringBuffer buffer, String fieldName, boolean value) { 694 appendFieldStart(buffer, fieldName); 695 appendDetail(buffer, fieldName, value); 696 appendFieldEnd(buffer, fieldName); 697 } 698 699 707 protected void appendDetail(StringBuffer buffer, String fieldName, boolean value) { 708 buffer.append(value); 709 } 710 711 721 public void append(StringBuffer buffer, String fieldName, Object [] array, Boolean fullDetail) { 722 appendFieldStart(buffer, fieldName); 723 724 if (array == null) { 725 appendNullText(buffer, fieldName); 726 727 } else if (isFullDetail(fullDetail)) { 728 appendDetail(buffer, fieldName, array); 729 730 } else { 731 appendSummary(buffer, fieldName, array); 732 } 733 734 appendFieldEnd(buffer, fieldName); 735 } 736 737 739 748 protected void appendDetail(StringBuffer buffer, String fieldName, Object [] array) { 749 buffer.append(arrayStart); 750 for (int i = 0; i < array.length; i++) { 751 Object item = array[i]; 752 if (i > 0) { 753 buffer.append(arraySeparator); 754 } 755 if (item == null) { 756 appendNullText(buffer, fieldName); 757 758 } else { 759 appendInternal(buffer, fieldName, item, arrayContentDetail); 760 } 761 } 762 buffer.append(arrayEnd); 763 } 764 765 774 protected void reflectionAppendArrayDetail(StringBuffer buffer, String fieldName, Object array) { 775 buffer.append(arrayStart); 776 int length = Array.getLength(array); 777 for (int i = 0; i < length; i++) { 778 Object item = Array.get(array, i); 779 if (i > 0) { 780 buffer.append(arraySeparator); 781 } 782 if (item == null) { 783 appendNullText(buffer, fieldName); 784 785 } else { 786 appendInternal(buffer, fieldName, item, arrayContentDetail); 787 } 788 } 789 buffer.append(arrayEnd); 790 } 791 792 801 protected void appendSummary(StringBuffer buffer, String fieldName, Object [] array) { 802 appendSummarySize(buffer, fieldName, array.length); 803 } 804 805 807 817 public void append(StringBuffer buffer, String fieldName, long[] array, Boolean fullDetail) { 818 appendFieldStart(buffer, fieldName); 819 820 if (array == null) { 821 appendNullText(buffer, fieldName); 822 823 } else if (isFullDetail(fullDetail)) { 824 appendDetail(buffer, fieldName, array); 825 826 } else { 827 appendSummary(buffer, fieldName, array); 828 } 829 830 appendFieldEnd(buffer, fieldName); 831 } 832 833 842 protected void appendDetail(StringBuffer buffer, String fieldName, long[] array) { 843 buffer.append(arrayStart); 844 for (int i = 0; i < array.length; i++) { 845 if (i > 0) { 846 buffer.append(arraySeparator); 847 } 848 appendDetail(buffer, fieldName, array[i]); 849 } 850 buffer.append(arrayEnd); 851 } 852 853 862 protected void appendSummary(StringBuffer buffer, String fieldName, long[] array) { 863 appendSummarySize(buffer, fieldName, array.length); 864 } 865 866 868 878 public void append(StringBuffer
|