View Javadoc

1   /**
2    * Logback: the generic, reliable, fast and flexible logging framework.
3    * 
4    * Copyright (C) 2000-2008, QOS.ch
5    * 
6    * This library is free software, you can redistribute it and/or modify it under
7    * the terms of the GNU Lesser General Public License as published by the Free
8    * Software Foundation.
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"); // orange
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 }