1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24 package org.archive.io;
25
26 import java.io.StringWriter;
27 import java.util.Date;
28 import java.util.logging.Level;
29 import java.util.logging.LogRecord;
30
31 import org.archive.crawler.framework.ToeThread;
32
33 /***
34 * Version of LogRecord used by SinkHandler.
35 * Adds being able to mark the LogRecord as already-read and timestamping time
36 * of creation. Also adds a different {@link #toString()} implementation.
37 * Delegates all other calls to the passed LogRecord.
38 * @author stack
39 * @version $Date: 2006-08-15 04:39:00 +0000 (Tue, 15 Aug 2006) $ $Version$
40 */
41 public class SinkHandlerLogRecord extends LogRecord {
42 private static final long serialVersionUID = -7782942650334713560L;
43 boolean read = false;
44 private final LogRecord delegatee;
45 private final Date creationTime = new Date();
46 private static final int SHORT_MSG_LENGTH = 80;
47
48 protected SinkHandlerLogRecord() {
49 this(null);
50 }
51
52 public SinkHandlerLogRecord(final LogRecord record) {
53 super(record.getLevel(), record.getMessage());
54
55
56
57 if(Thread.currentThread() instanceof ToeThread) {
58 String newMessage = this.getMessage();
59 ToeThread tt = (ToeThread) Thread.currentThread();
60 newMessage = newMessage + " (in thread '"+tt.getName()+"'";
61 if(tt.getCurrentProcessorName().length()>0) {
62 newMessage = newMessage + "; in processor '"
63 +tt.getCurrentProcessorName() + "'";
64 }
65 newMessage = newMessage + ")";
66 this.setMessage(newMessage);
67 }
68 this.delegatee = record;
69 }
70
71 public boolean equals(final long id) {
72 return id == getSequenceNumber();
73 }
74
75 public boolean equals(final SinkHandlerLogRecord compare) {
76 return equals(compare.getSequenceNumber());
77 }
78
79 public boolean isRead() {
80 return this.read;
81 }
82
83 /***
84 * Mark alert as seen (That is, isNew() no longer returns true).
85 */
86 public void setRead() {
87 this.read = true;
88 }
89
90 /***
91 * @return Time of creation
92 */
93 public Date getCreationTime() {
94 return this.creationTime;
95 }
96
97 public Level getLevel() {
98 return this.delegatee.getLevel();
99 }
100
101 public String getLoggerName() {
102 return this.delegatee.getLoggerName();
103 }
104
105 public String getShortMessage() {
106 String msg = getMessage();
107 return msg == null || msg.length() < SHORT_MSG_LENGTH?
108 msg: msg.substring(0, SHORT_MSG_LENGTH) + "...";
109 }
110
111 public Throwable getThrown() {
112 return this.delegatee.getThrown();
113 }
114
115 public String getThrownToString() {
116 StringWriter sw = new StringWriter();
117 Throwable t = getThrown();
118 if (t == null) {
119 sw.write("No associated exception.");
120 } else {
121 String tStr = t.toString();
122 sw.write(tStr);
123 if (t.getMessage() != null && t.getMessage().length() > 0 &&
124 !tStr.endsWith(t.getMessage())) {
125 sw.write("\nMessage: ");
126 sw.write(t.getMessage());
127 }
128 if (t.getCause() != null) {
129 sw.write("\nCause: ");
130 t.getCause().printStackTrace(new java.io.PrintWriter(sw));
131 }
132 sw.write("\nStacktrace: ");
133 t.printStackTrace(new java.io.PrintWriter(sw));
134 }
135 return sw.toString();
136 }
137
138 public String toString() {
139 StringWriter sw = new StringWriter();
140 sw.write(getLevel().toString());
141 sw.write(" ");
142 sw.write(getMessage());
143 sw.write(getThrownToString());
144 return sw.toString();
145 }
146 }