1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17 package org.apache.logging.log4j.core.net.server;
18
19 import java.io.InputStream;
20 import java.nio.charset.Charset;
21
22 import org.apache.logging.log4j.core.LogEvent;
23 import org.apache.logging.log4j.core.jackson.Log4jJsonObjectMapper;
24
25
26
27
28 public class JsonInputStreamLogEventBridge extends InputStreamLogEventBridge {
29
30 private static final int[] END_PAIR = new int[] { END, END };
31 private static final char EVENT_END_MARKER = '}';
32 private static final char EVENT_START_MARKER = '{';
33 private static final char JSON_ESC = '\\';
34 private static final char JSON_STR_DELIM = '"';
35
36 public JsonInputStreamLogEventBridge() {
37 this(1024, Charset.defaultCharset());
38 }
39
40 public JsonInputStreamLogEventBridge(final int bufferSize, final Charset charset) {
41 super(new Log4jJsonObjectMapper(), bufferSize, charset, String.valueOf(EVENT_END_MARKER));
42 }
43
44 @Override
45 protected int[] getEventIndices(final String text, final int beginIndex) {
46
47 final int start = text.indexOf(EVENT_START_MARKER, beginIndex);
48 if (start == END) {
49 return END_PAIR;
50 }
51 final char[] charArray = text.toCharArray();
52 int stack = 0;
53 boolean inStr = false;
54 boolean inEsc = false;
55 for (int i = start; i < charArray.length; i++) {
56 final char c = charArray[i];
57 if (!inEsc) {
58 inEsc = false;
59 switch (c) {
60 case EVENT_START_MARKER:
61 if (!inStr) {
62 stack++;
63 }
64 break;
65 case EVENT_END_MARKER:
66 if (!inStr) {
67 stack--;
68 }
69 break;
70 case JSON_STR_DELIM:
71 inStr = !inStr;
72 break;
73 case JSON_ESC:
74 inEsc = true;
75 break;
76 }
77 if (stack == 0) {
78 return new int[] { start, i };
79 }
80 }
81 }
82 return END_PAIR;
83 }
84
85 }