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