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.helpers;
26
27 import java.text.MessageFormat;
28 import java.util.HashMap;
29 import java.util.Map;
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94 final public class MessageFormatter {
95 static final char DELIM_START = '{';
96 static final char DELIM_STOP = '}';
97 static final String DELIM_STR = "{}";
98 private static final char ESCAPE_CHAR = '\\';
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119 final public static String format(String messagePattern, Object arg) {
120 return arrayFormat(messagePattern, new Object[] { arg });
121 }
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146 final public static String format(final String messagePattern, Object arg1,
147 Object arg2) {
148 return arrayFormat(messagePattern, new Object[] { arg1, arg2 });
149 }
150
151
152
153
154
155
156
157
158
159
160
161
162
163 final public static String arrayFormat(final String messagePattern,
164 final Object[] argArray) {
165 if (messagePattern == null) {
166 return null;
167 }
168 if (argArray == null) {
169 return messagePattern;
170 }
171 int i = 0;
172 int j;
173 StringBuffer sbuf = new StringBuffer(messagePattern.length() + 50);
174
175 for (int L = 0; L < argArray.length; L++) {
176
177 j = messagePattern.indexOf(DELIM_STR, i);
178
179 if (j == -1) {
180
181 if (i == 0) {
182 return messagePattern;
183 } else {
184
185 sbuf.append(messagePattern.substring(i, messagePattern.length()));
186 return sbuf.toString();
187 }
188 } else {
189 if (isEscapedDelimeter(messagePattern, j)) {
190 if (!isDoubleEscaped(messagePattern, j)) {
191 L--;
192 sbuf.append(messagePattern.substring(i, j - 1));
193 sbuf.append(DELIM_START);
194 i = j + 1;
195 } else {
196
197
198
199 sbuf.append(messagePattern.substring(i, j - 1));
200 deeplyAppendParameter(sbuf, argArray[L], new HashMap());
201 i = j + 2;
202 }
203 } else {
204
205 sbuf.append(messagePattern.substring(i, j));
206 deeplyAppendParameter(sbuf, argArray[L], new HashMap());
207 i = j + 2;
208 }
209 }
210 }
211
212 sbuf.append(messagePattern.substring(i, messagePattern.length()));
213 return sbuf.toString();
214 }
215
216 final static boolean isEscapedDelimeter(String messagePattern,
217 int delimeterStartIndex) {
218
219 if (delimeterStartIndex == 0) {
220 return false;
221 }
222 char potentialEscape = messagePattern.charAt(delimeterStartIndex - 1);
223 if (potentialEscape == ESCAPE_CHAR) {
224 return true;
225 } else {
226 return false;
227 }
228 }
229
230 final static boolean isDoubleEscaped(String messagePattern,
231 int delimeterStartIndex) {
232 if (delimeterStartIndex >= 2
233 && messagePattern.charAt(delimeterStartIndex - 2) == ESCAPE_CHAR) {
234 return true;
235 } else {
236 return false;
237 }
238 }
239
240
241 private static void deeplyAppendParameter(StringBuffer sbuf, Object o,
242 Map seenMap) {
243 if (o == null) {
244 sbuf.append("null");
245 return;
246 }
247 if (!o.getClass().isArray()) {
248 safeObjectAppend(sbuf, o);
249 } else {
250
251
252 if (o instanceof boolean[]) {
253 booleanArrayAppend(sbuf, (boolean[]) o);
254 } else if (o instanceof byte[]) {
255 byteArrayAppend(sbuf, (byte[]) o);
256 } else if (o instanceof char[]) {
257 charArrayAppend(sbuf, (char[]) o);
258 } else if (o instanceof short[]) {
259 shortArrayAppend(sbuf, (short[]) o);
260 } else if (o instanceof int[]) {
261 intArrayAppend(sbuf, (int[]) o);
262 } else if (o instanceof long[]) {
263 longArrayAppend(sbuf, (long[]) o);
264 } else if (o instanceof float[]) {
265 floatArrayAppend(sbuf, (float[]) o);
266 } else if (o instanceof double[]) {
267 doubleArrayAppend(sbuf, (double[]) o);
268 } else {
269 objectArrayAppend(sbuf, (Object[]) o, seenMap);
270 }
271 }
272 }
273
274 private static void safeObjectAppend(StringBuffer sbuf, Object o) {
275 try {
276 String oAsString = o.toString();
277 sbuf.append(oAsString);
278 } catch (Throwable t) {
279 System.err
280 .println("SLF4J: Failed toString() invocation on an object of type ["
281 + o.getClass().getName() + "]");
282 t.printStackTrace();
283 sbuf.append("[FAILED toString()]");
284 }
285
286 }
287
288 private static void objectArrayAppend(StringBuffer sbuf, Object[] a,
289 Map seenMap) {
290 sbuf.append('[');
291 if (!seenMap.containsKey(a)) {
292 seenMap.put(a, null);
293 final int len = a.length;
294 for (int i = 0; i < len; i++) {
295 deeplyAppendParameter(sbuf, a[i], seenMap);
296 if (i != len - 1)
297 sbuf.append(", ");
298 }
299
300 seenMap.remove(a);
301 } else {
302 sbuf.append("...");
303 }
304 sbuf.append(']');
305 }
306
307 private static void booleanArrayAppend(StringBuffer sbuf, boolean[] a) {
308 sbuf.append('[');
309 final int len = a.length;
310 for (int i = 0; i < len; i++) {
311 sbuf.append(a[i]);
312 if (i != len - 1)
313 sbuf.append(", ");
314 }
315 sbuf.append(']');
316 }
317
318 private static void byteArrayAppend(StringBuffer sbuf, byte[] a) {
319 sbuf.append('[');
320 final int len = a.length;
321 for (int i = 0; i < len; i++) {
322 sbuf.append(a[i]);
323 if (i != len - 1)
324 sbuf.append(", ");
325 }
326 sbuf.append(']');
327 }
328
329 private static void charArrayAppend(StringBuffer sbuf, char[] a) {
330 sbuf.append('[');
331 final int len = a.length;
332 for (int i = 0; i < len; i++) {
333 sbuf.append(a[i]);
334 if (i != len - 1)
335 sbuf.append(", ");
336 }
337 sbuf.append(']');
338 }
339
340 private static void shortArrayAppend(StringBuffer sbuf, short[] a) {
341 sbuf.append('[');
342 final int len = a.length;
343 for (int i = 0; i < len; i++) {
344 sbuf.append(a[i]);
345 if (i != len - 1)
346 sbuf.append(", ");
347 }
348 sbuf.append(']');
349 }
350
351 private static void intArrayAppend(StringBuffer sbuf, int[] a) {
352 sbuf.append('[');
353 final int len = a.length;
354 for (int i = 0; i < len; i++) {
355 sbuf.append(a[i]);
356 if (i != len - 1)
357 sbuf.append(", ");
358 }
359 sbuf.append(']');
360 }
361
362 private static void longArrayAppend(StringBuffer sbuf, long[] a) {
363 sbuf.append('[');
364 final int len = a.length;
365 for (int i = 0; i < len; i++) {
366 sbuf.append(a[i]);
367 if (i != len - 1)
368 sbuf.append(", ");
369 }
370 sbuf.append(']');
371 }
372
373 private static void floatArrayAppend(StringBuffer sbuf, float[] a) {
374 sbuf.append('[');
375 final int len = a.length;
376 for (int i = 0; i < len; i++) {
377 sbuf.append(a[i]);
378 if (i != len - 1)
379 sbuf.append(", ");
380 }
381 sbuf.append(']');
382 }
383
384 private static void doubleArrayAppend(StringBuffer sbuf, double[] a) {
385 sbuf.append('[');
386 final int len = a.length;
387 for (int i = 0; i < len; i++) {
388 sbuf.append(a[i]);
389 if (i != len - 1)
390 sbuf.append(", ");
391 }
392 sbuf.append(']');
393 }
394 }