1
2
3
4
5
6
7
8
9
10 package ch.qos.logback.core.status;
11
12 import static ch.qos.logback.core.CoreConstants.LINE_SEPARATOR;
13
14 import java.io.IOException;
15 import java.io.PrintWriter;
16 import java.io.StringWriter;
17 import java.text.SimpleDateFormat;
18 import java.util.List;
19
20 import javax.servlet.ServletException;
21 import javax.servlet.http.HttpServlet;
22 import javax.servlet.http.HttpServletRequest;
23 import javax.servlet.http.HttpServletResponse;
24
25 import ch.qos.logback.core.CoreConstants;
26 import ch.qos.logback.core.helpers.Transform;
27
28 abstract public class ViewStatusMessagesServletBase extends HttpServlet {
29
30 private static final long serialVersionUID = -3551928133801157219L;
31 private static SimpleDateFormat SDF = new SimpleDateFormat(
32 "yyyy-MM-dd HH:mm:ss");
33
34 protected abstract StatusManager getStatusManager(HttpServletRequest req, HttpServletResponse resp);
35
36 protected abstract String getPageTitle(HttpServletRequest req, HttpServletResponse resp);
37
38 int count;
39
40 protected void service(HttpServletRequest req, HttpServletResponse resp)
41 throws ServletException, IOException {
42
43 System.out.println("service called");
44 count = 0;
45 StatusManager sm = getStatusManager(req, resp);
46
47 resp.setContentType("text/html");
48 PrintWriter output = resp.getWriter();
49
50 output.append("<html>\r\n");
51 output.append("<head>\r\n");
52 printCSS(req.getContextPath(), output);
53 output.append("</head>\r\n");
54 output.append("<body>\r\n");
55 output.append(getPageTitle(req, resp));
56
57 output.append("<table>");
58 StringBuilder buf = new StringBuilder();
59 if(sm != null) {
60 printList(buf, sm);
61 } else {
62 output.append("Could not find status manager");
63 }
64 output.append(buf);
65 output.append("</table>");
66 output.append("</body>\r\n");
67 output.append("</html>\r\n");
68 output.flush();
69 output.close();
70 }
71
72 public void printCSS(String localRef, PrintWriter output) {
73 output.append(" <STYLE TYPE=\"text/css\">\r\n");
74 output.append(" .warn { font-weight: bold; color: #FF6600;} \r\n");
75 output.append(" .error { font-weight: bold; color: #CC0000;} \r\n");
76 output
77 .append(" table { margin-left: 2em; margin-right: 2em; border-left: 2px solid #AAA; }\r\n");
78 output.append(" tr.even { background: #FFFFFF; }\r\n");
79 output.append(" tr.odd { background: #EAEAEA; }\r\n");
80 output
81 .append(" td { padding-right: 1ex; padding-left: 1ex; border-right: 2px solid #AAA; }\r\n");
82 output
83 .append(" td.date { text-align: right; font-family: courier, monospace; font-size: smaller; }");
84 output.append(LINE_SEPARATOR);
85
86 output.append(" td.level { text-align: right; }");
87 output.append(LINE_SEPARATOR);
88 output
89 .append(" tr.header { background: #596ED5; color: #FFF; font-weight: bold; font-size: larger; }");
90 output.append(CoreConstants.LINE_SEPARATOR);
91
92 output
93 .append(" td.exception { background: #A2AEE8; white-space: pre; font-family: courier, monospace;}");
94 output.append(LINE_SEPARATOR);
95
96 output.append(" </STYLE>\r\n");
97
98 }
99
100 public void printList(StringBuilder buf, StatusManager sm) {
101 buf.append("<table>\r\n");
102 printHeader(buf);
103 List<Status> statusList = sm.getCopyOfStatusList();
104 for (Status s : statusList) {
105 count++;
106 printStatus(buf, s);
107 }
108 buf.append("</table>\r\n");
109 }
110
111 public void printHeader(StringBuilder buf) {
112 buf.append(" <tr class=\"header\">\r\n");
113 buf.append(" <th>Date </th>\r\n");
114 buf.append(" <th>Level</th>\r\n");
115 buf.append(" <th>Origin</th>\r\n");
116 buf.append(" <th>Message</th>\r\n");
117 buf.append(" </tr>\r\n");
118
119 }
120
121 String statusLevelAsString(Status s) {
122 switch (s.getEffectiveLevel()) {
123 case Status.INFO:
124 return "INFO";
125 case Status.WARN:
126 return "<span class=\"warn\">WARN</span>";
127 case Status.ERROR:
128 return "<span class=\"error\">ERROR</span>";
129 }
130 return null;
131 }
132
133 String abbreviatedOrigin(Status s) {
134 Object o = s.getOrigin();
135 if (o == null) {
136 return null;
137 }
138 String fqClassName = o.getClass().getName();
139 int lastIndex = fqClassName.lastIndexOf(CoreConstants.DOT);
140 if (lastIndex != -1) {
141 return fqClassName.substring(lastIndex + 1, fqClassName.length());
142 } else {
143 return fqClassName;
144 }
145 }
146
147 private void printStatus(StringBuilder buf, Status s) {
148 String trClass;
149 if (count % 2 == 0) {
150 trClass = "even";
151 } else {
152 trClass = "odd";
153 }
154 buf.append(" <tr class=\"").append(trClass).append("\">\r\n");
155 String dateStr = SDF.format(s.getDate());
156 buf.append(" <td class=\"date\">").append(dateStr).append("</td>\r\n");
157 buf.append(" <td class=\"level\">").append(statusLevelAsString(s))
158 .append("</td>\r\n");
159 buf.append(" <td>").append(abbreviatedOrigin(s)).append("</td>\r\n");
160 buf.append(" <td>").append(s.getMessage()).append("</td>\r\n");
161 buf.append(" </tr>\r\n");
162 if (s.getThrowable() != null) {
163 printThrowable(buf, s.getThrowable());
164 }
165 }
166
167 private void printThrowable(StringBuilder buf, Throwable t) {
168 buf.append(" <tr>\r\n");
169 buf.append(" <td colspan=\"4\" class=\"exception\"><pre>");
170 StringWriter sw = new StringWriter();
171 PrintWriter pw = new PrintWriter(sw);
172 t.printStackTrace(pw);
173 buf.append(Transform.escapeTags(sw.getBuffer()));
174 buf.append(" </pre></td>\r\n");
175 buf.append(" </tr>\r\n");
176
177 }
178 }