1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17 package org.apache.log4j.chainsaw;
18
19 import java.util.StringTokenizer;
20 import org.apache.log4j.Level;
21 import org.xml.sax.Attributes;
22 import org.xml.sax.SAXException;
23 import org.xml.sax.helpers.DefaultHandler;
24
25
26
27
28
29
30
31
32 class XMLFileHandler
33 extends DefaultHandler
34 {
35
36 private static final String TAG_EVENT = "log4j:event";
37
38 private static final String TAG_MESSAGE = "log4j:message";
39
40 private static final String TAG_NDC = "log4j:NDC";
41
42 private static final String TAG_THROWABLE = "log4j:throwable";
43
44 private static final String TAG_LOCATION_INFO = "log4j:locationInfo";
45
46
47 private final MyTableModel mModel;
48
49 private int mNumEvents;
50
51
52 private long mTimeStamp;
53
54 private Level mLevel;
55
56 private String mCategoryName;
57
58 private String mNDC;
59
60 private String mThreadName;
61
62 private String mMessage;
63
64 private String[] mThrowableStrRep;
65
66 private String mLocationDetails;
67
68 private final StringBuffer mBuf = new StringBuffer();
69
70
71
72
73
74
75 XMLFileHandler(MyTableModel aModel) {
76 mModel = aModel;
77 }
78
79
80 public void startDocument()
81 throws SAXException
82 {
83 mNumEvents = 0;
84 }
85
86
87 public void characters(char[] aChars, int aStart, int aLength) {
88 mBuf.append(String.valueOf(aChars, aStart, aLength));
89 }
90
91
92 public void endElement(String aNamespaceURI,
93 String aLocalName,
94 String aQName)
95 {
96 if (TAG_EVENT.equals(aQName)) {
97 addEvent();
98 resetData();
99 } else if (TAG_NDC.equals(aQName)) {
100 mNDC = mBuf.toString();
101 } else if (TAG_MESSAGE.equals(aQName)) {
102 mMessage = mBuf.toString();
103 } else if (TAG_THROWABLE.equals(aQName)) {
104 final StringTokenizer st =
105 new StringTokenizer(mBuf.toString(), "\n\t");
106 mThrowableStrRep = new String[st.countTokens()];
107 if (mThrowableStrRep.length > 0) {
108 mThrowableStrRep[0] = st.nextToken();
109 for (int i = 1; i < mThrowableStrRep.length; i++) {
110 mThrowableStrRep[i] = "\t" + st.nextToken();
111 }
112 }
113 }
114 }
115
116
117 public void startElement(String aNamespaceURI,
118 String aLocalName,
119 String aQName,
120 Attributes aAtts)
121 {
122 mBuf.setLength(0);
123
124 if (TAG_EVENT.equals(aQName)) {
125 mThreadName = aAtts.getValue("thread");
126 mTimeStamp = Long.parseLong(aAtts.getValue("timestamp"));
127 mCategoryName = aAtts.getValue("logger");
128 mLevel = Level.toLevel(aAtts.getValue("level"));
129 } else if (TAG_LOCATION_INFO.equals(aQName)) {
130 mLocationDetails = aAtts.getValue("class") + "."
131 + aAtts.getValue("method")
132 + "(" + aAtts.getValue("file") + ":" + aAtts.getValue("line")
133 + ")";
134 }
135 }
136
137
138 int getNumEvents() {
139 return mNumEvents;
140 }
141
142
143
144
145
146
147 private void addEvent() {
148 mModel.addEvent(new EventDetails(mTimeStamp,
149 mLevel,
150 mCategoryName,
151 mNDC,
152 mThreadName,
153 mMessage,
154 mThrowableStrRep,
155 mLocationDetails));
156 mNumEvents++;
157 }
158
159
160 private void resetData() {
161 mTimeStamp = 0;
162 mLevel = null;
163 mCategoryName = null;
164 mNDC = null;
165 mThreadName = null;
166 mMessage = null;
167 mThrowableStrRep = null;
168 mLocationDetails = null;
169 }
170 }