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 char ARRAY_SUFFIX = ']';
41
42
43
44
45
46
47 private static final char[] ELEMENT_SEPARATOR = ", ".toCharArray();
48
49
50
51
52
53
54
55
56
57
58
59 final static Map<Class<?>, Object> unrenderableClasses = new WeakHashMap<>();
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 = Long.valueOf(System.currentTimeMillis());
88
89 System.err.println("Disabling exception throwing class " + objectClass.getName() + ", " + e.getMessage());
90
91 unrenderableClasses.put(objectClass, now);
92 }
93 }
94 String name = o.getClass().getName();
95 return name + "@" + Integer.toHexString(o.hashCode());
96 }
97
98
99
100
101
102
103
104
105
106
107
108 private static StringBuilder renderArray(Object o, Class<?> objectClass) {
109 Class<?> componentType = objectClass.getComponentType();
110 StringBuilder sb = new StringBuilder(ARRAY_PREFIX);
111
112 if (componentType.isPrimitive() == false) {
113 Object[] oa = (Object[]) o;
114 for (int i = 0; i < oa.length; i++) {
115 if (i > 0) {
116 sb.append(ELEMENT_SEPARATOR);
117 }
118 sb.append(render(oa[i]));
119 }
120 } else {
121 if (Boolean.TYPE.equals(componentType)) {
122 boolean[] ba = (boolean[]) o;
123 for (int i = 0; i < ba.length; i++) {
124 if (i > 0) {
125 sb.append(ELEMENT_SEPARATOR);
126 }
127 sb.append(ba[i]);
128 }
129 } else if (Integer.TYPE.equals(componentType)) {
130 int[] ia = (int[]) o;
131 for (int i = 0; i < ia.length; i++) {
132 if (i > 0) {
133 sb.append(ELEMENT_SEPARATOR);
134 }
135 sb.append(ia[i]);
136 }
137
138 } else if (Long.TYPE.equals(componentType)) {
139 long[] ia = (long[]) o;
140 for (int i = 0; i < ia.length; i++) {
141 if (i > 0) {
142 sb.append(ELEMENT_SEPARATOR);
143 }
144 sb.append(ia[i]);
145 }
146 } else if (Double.TYPE.equals(componentType)) {
147 double[] ia = (double[]) o;
148 for (int i = 0; i < ia.length; i++) {
149 if (i > 0) {
150 sb.append(ELEMENT_SEPARATOR);
151 }
152 sb.append(ia[i]);
153 }
154 } else if (Float.TYPE.equals(componentType)) {
155 float[] ia = (float[]) o;
156 for (int i = 0; i < ia.length; i++) {
157 if (i > 0) {
158 sb.append(ELEMENT_SEPARATOR);
159 }
160 sb.append(ia[i]);
161 }
162 } else if (Character.TYPE.equals(componentType)) {
163 char[] ia = (char[]) o;
164 for (int i = 0; i < ia.length; i++) {
165 if (i > 0) {
166 sb.append(ELEMENT_SEPARATOR);
167 }
168 sb.append(ia[i]);
169 }
170 } else if (Short.TYPE.equals(componentType)) {
171 short[] ia = (short[]) o;
172 for (int i = 0; i < ia.length; i++) {
173 if (i > 0) {
174 sb.append(ELEMENT_SEPARATOR);
175 }
176 sb.append(ia[i]);
177 }
178 } else if (Byte.TYPE.equals(componentType)) {
179 byte[] ia = (byte[]) o;
180 for (int i = 0; i < ia.length; i++) {
181 if (i > 0) {
182 sb.append(ELEMENT_SEPARATOR);
183 }
184 sb.append(ia[i]);
185 }
186 }
187 }
188 sb.append(ARRAY_SUFFIX);
189 return sb;
190 }
191 }