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.util.HashMap;
28 import java.util.Map;
29
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 final public class MessageFormatter {
85 static final char DELIM_START = '{';
86 static final char DELIM_STOP = '}';
87 static final String DELIM_STR = "{}";
88 private static final char ESCAPE_CHAR = '\\';
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110 final public static String format(String messagePattern, Object arg) {
111 return arrayFormat(messagePattern, new Object[] { arg });
112 }
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137 final public static String format(final String messagePattern, Object arg1, Object arg2) {
138 return arrayFormat(messagePattern, new Object[] { arg1, arg2 });
139 }
140
141
142
143
144
145
146
147
148
149
150
151
152
153 final public static String arrayFormat(final String messagePattern,
154 final Object[] argArray) {
155 if (messagePattern == null) {
156 return null;
157 }
158 if (argArray == null) {
159 return messagePattern;
160 }
161 int i = 0;
162 int j;
163 StringBuffer sbuf = new StringBuffer(messagePattern.length() + 50);
164
165 for (int L = 0; L < argArray.length; L++) {
166
167 j = messagePattern.indexOf(DELIM_STR, i);
168
169 if (j == -1) {
170
171 if (i == 0) {
172 return messagePattern;
173 } else {
174
175 sbuf.append(messagePattern.substring(i, messagePattern.length()));
176 return sbuf.toString();
177 }
178 } else {
179 if (isEscapedDelimeter(messagePattern, j)) {
180 if (!isDoubleEscaped(messagePattern, j)) {
181 L--;
182 sbuf.append(messagePattern.substring(i, j - 1));
183 sbuf.append(DELIM_START);
184 i = j + 1;
185 } else {
186
187
188
189 sbuf.append(messagePattern.substring(i, j - 1));
190 deeplyAppendParameter(sbuf, argArray[L], new HashMap());
191 i = j + 2;
192 }
193 } else {
194
195 sbuf.append(messagePattern.substring(i, j));
196 deeplyAppendParameter(sbuf, argArray[L], new HashMap());
197 i = j + 2;
198 }
199 }
200 }
201
202 sbuf.append(messagePattern.substring(i, messagePattern.length()));
203 return sbuf.toString();
204 }
205
206 final static boolean isEscapedDelimeter(String messagePattern,
207 int delimeterStartIndex) {
208
209 if (delimeterStartIndex == 0) {
210 return false;
211 }
212 char potentialEscape = messagePattern.charAt(delimeterStartIndex - 1);
213 if (potentialEscape == ESCAPE_CHAR) {
214 return true;
215 } else {
216 return false;
217 }
218 }
219
220 final static boolean isDoubleEscaped(String messagePattern, int delimeterStartIndex) {
221 if (delimeterStartIndex >= 2
222 && messagePattern.charAt(delimeterStartIndex - 2) == ESCAPE_CHAR) {
223 return true;
224 } else {
225 return false;
226 }
227 }
228
229
230 private static void deeplyAppendParameter(StringBuffer sbuf, Object o,
231 Map seenMap) {
232 if (o == null) {
233 sbuf.append("null");
234 return;
235 }
236 if (!o.getClass().isArray()) {
237 sbuf.append(o);
238 } else {
239
240
241 if (o instanceof boolean[]) {
242 booleanArrayAppend(sbuf, (boolean[]) o);
243 } else if (o instanceof byte[]) {
244 byteArrayAppend(sbuf, (byte[]) o);
245 } else if (o instanceof char[]) {
246 charArrayAppend(sbuf, (char[]) o);
247 } else if (o instanceof short[]) {
248 shortArrayAppend(sbuf, (short[]) o);
249 } else if (o instanceof int[]) {
250 intArrayAppend(sbuf, (int[]) o);
251 } else if (o instanceof long[]) {
252 longArrayAppend(sbuf, (long[]) o);
253 } else if (o instanceof float[]) {
254 floatArrayAppend(sbuf, (float[]) o);
255 } else if (o instanceof double[]) {
256 doubleArrayAppend(sbuf, (double[]) o);
257 } else {
258 objectArrayAppend(sbuf, (Object[]) o, seenMap);
259 }
260 }
261 }
262
263 private static void objectArrayAppend(StringBuffer sbuf, Object[] a,
264 Map seenMap) {
265 sbuf.append('[');
266 if (!seenMap.containsKey(a)) {
267 seenMap.put(a, null);
268 final int len = a.length;
269 for (int i = 0; i < len; i++) {
270 deeplyAppendParameter(sbuf, a[i], seenMap);
271 if (i != len - 1)
272 sbuf.append(", ");
273 }
274
275 seenMap.remove(a);
276 } else {
277 sbuf.append("...");
278 }
279 sbuf.append(']');
280 }
281
282 private static void booleanArrayAppend(StringBuffer sbuf, boolean[] a) {
283 sbuf.append('[');
284 final int len = a.length;
285 for (int i = 0; i < len; i++) {
286 sbuf.append(a[i]);
287 if (i != len - 1)
288 sbuf.append(", ");
289 }
290 sbuf.append(']');
291 }
292
293 private static void byteArrayAppend(StringBuffer sbuf, byte[] a) {
294 sbuf.append('[');
295 final int len = a.length;
296 for (int i = 0; i < len; i++) {
297 sbuf.append(a[i]);
298 if (i != len - 1)
299 sbuf.append(", ");
300 }
301 sbuf.append(']');
302 }
303
304 private static void charArrayAppend(StringBuffer sbuf, char[] a) {
305 sbuf.append('[');
306 final int len = a.length;
307 for (int i = 0; i < len; i++) {
308 sbuf.append(a[i]);
309 if (i != len - 1)
310 sbuf.append(", ");
311 }
312 sbuf.append(']');
313 }
314
315 private static void shortArrayAppend(StringBuffer sbuf, short[] a) {
316 sbuf.append('[');
317 final int len = a.length;
318 for (int i = 0; i < len; i++) {
319 sbuf.append(a[i]);
320 if (i != len - 1)
321 sbuf.append(", ");
322 }
323 sbuf.append(']');
324 }
325
326 private static void intArrayAppend(StringBuffer sbuf, int[] a) {
327 sbuf.append('[');
328 final int len = a.length;
329 for (int i = 0; i < len; i++) {
330 sbuf.append(a[i]);
331 if (i != len - 1)
332 sbuf.append(", ");
333 }
334 sbuf.append(']');
335 }
336
337 private static void longArrayAppend(StringBuffer sbuf, long[] a) {
338 sbuf.append('[');
339 final int len = a.length;
340 for (int i = 0; i < len; i++) {
341 sbuf.append(a[i]);
342 if (i != len - 1)
343 sbuf.append(", ");
344 }
345 sbuf.append(']');
346 }
347
348 private static void floatArrayAppend(StringBuffer sbuf, float[] a) {
349 sbuf.append('[');
350 final int len = a.length;
351 for (int i = 0; i < len; i++) {
352 sbuf.append(a[i]);
353 if (i != len - 1)
354 sbuf.append(", ");
355 }
356 sbuf.append(']');
357 }
358
359 private static void doubleArrayAppend(StringBuffer sbuf, double[] a) {
360 sbuf.append('[');
361 final int len = a.length;
362 for (int i = 0; i < len; i++) {
363 sbuf.append(a[i]);
364 if (i != len - 1)
365 sbuf.append(", ");
366 }
367 sbuf.append(']');
368 }
369 }