1 package org.slf4j.instrumentation;
2
3 import java.util.Map;
4 import java.util.WeakHashMap;
5
6 public class ToStringHelper {
7
8
9
10
11 private static final String ARRAY_PREFIX = "[";
12
13
14
15
16 private static final String ARRAY_SUFFIX = "]";
17
18
19
20
21
22
23 private static final String ELEMENT_SEPARATOR = ", ";
24
25
26
27
28
29
30
31
32
33
34
35 final static Map<Class<?>, Object> unrenderableClasses = new WeakHashMap<Class<?>, Object>();
36
37
38
39
40
41
42
43
44
45
46
47
48
49 public static String render(Object o) {
50 if (o == null) {
51 return String.valueOf(o);
52 }
53 Class<?> objectClass = o.getClass();
54
55 if (unrenderableClasses.containsKey(objectClass) == false) {
56 try {
57 if (objectClass.isArray()) {
58 return renderArray(o, objectClass).toString();
59 } else {
60 return o.toString();
61 }
62 } catch (Exception e) {
63 Long now = new Long(System.currentTimeMillis());
64
65 System.err.println("Disabling exception throwing class "
66 + objectClass.getName() + ", " + e.getMessage());
67
68 unrenderableClasses.put(objectClass, now);
69 }
70 }
71 String name = o.getClass().getName();
72 return name + "@" + Integer.toHexString(o.hashCode());
73 }
74
75
76
77
78
79
80
81
82
83
84
85 private static StringBuffer renderArray(Object o, Class<?> objectClass) {
86 Class<?> componentType = objectClass.getComponentType();
87 StringBuffer sb = new StringBuffer(ARRAY_PREFIX);
88
89 if (componentType.isPrimitive() == false) {
90 Object[] oa = (Object[]) o;
91 for (int i = 0; i < oa.length; i++) {
92 if (i > 0) {
93 sb.append(ELEMENT_SEPARATOR);
94 }
95 sb.append(render(oa[i]));
96 }
97 } else {
98 if (Boolean.TYPE.equals(componentType)) {
99 boolean[] ba = (boolean[]) o;
100 for (int i = 0; i < ba.length; i++) {
101 if (i > 0) {
102 sb.append(ELEMENT_SEPARATOR);
103 }
104 sb.append(ba[i]);
105 }
106 } else if (Integer.TYPE.equals(componentType)) {
107 int[] ia = (int[]) o;
108 for (int i = 0; i < ia.length; i++) {
109 if (i > 0) {
110 sb.append(ELEMENT_SEPARATOR);
111 }
112 sb.append(ia[i]);
113 }
114
115 } else if (Long.TYPE.equals(componentType)) {
116 long[] ia = (long[]) o;
117 for (int i = 0; i < ia.length; i++) {
118 if (i > 0) {
119 sb.append(ELEMENT_SEPARATOR);
120 }
121 sb.append(ia[i]);
122 }
123 } else if (Double.TYPE.equals(componentType)) {
124 double[] ia = (double[]) o;
125 for (int i = 0; i < ia.length; i++) {
126 if (i > 0) {
127 sb.append(ELEMENT_SEPARATOR);
128 }
129 sb.append(ia[i]);
130 }
131 } else if (Float.TYPE.equals(componentType)) {
132 float[] ia = (float[]) o;
133 for (int i = 0; i < ia.length; i++) {
134 if (i > 0) {
135 sb.append(ELEMENT_SEPARATOR);
136 }
137 sb.append(ia[i]);
138 }
139 } else if (Character.TYPE.equals(componentType)) {
140 char[] ia = (char[]) o;
141 for (int i = 0; i < ia.length; i++) {
142 if (i > 0) {
143 sb.append(ELEMENT_SEPARATOR);
144 }
145 sb.append(ia[i]);
146 }
147 } else if (Short.TYPE.equals(componentType)) {
148 short[] ia = (short[]) o;
149 for (int i = 0; i < ia.length; i++) {
150 if (i > 0) {
151 sb.append(ELEMENT_SEPARATOR);
152 }
153 sb.append(ia[i]);
154 }
155 } else if (Byte.TYPE.equals(componentType)) {
156 byte[] ia = (byte[]) o;
157 for (int i = 0; i < ia.length; i++) {
158 if (i > 0) {
159 sb.append(ELEMENT_SEPARATOR);
160 }
161 sb.append(ia[i]);
162 }
163 }
164 }
165 sb.append(ARRAY_SUFFIX);
166 return sb;
167 }
168 }