]> git.argeo.org Git - gpl/argeo-slc.git/blob - legacy/argeo-commons/org.argeo.cms.ui.workbench/src/org/argeo/cms/ui/workbench/useradmin/LogContentProvider.java
84884c65e5da86073a2550a276db05a862f0975f
[gpl/argeo-slc.git] / legacy / argeo-commons / org.argeo.cms.ui.workbench / src / org / argeo / cms / ui / workbench / useradmin / LogContentProvider.java
1 package org.argeo.cms.ui.workbench.useradmin;
2
3 import java.text.DateFormat;
4 import java.text.SimpleDateFormat;
5 import java.util.Arrays;
6 import java.util.Date;
7 import java.util.LinkedList;
8 import java.util.List;
9
10 import org.argeo.cms.ArgeoLogListener;
11 import org.eclipse.jface.viewers.ILazyContentProvider;
12 import org.eclipse.jface.viewers.TableViewer;
13 import org.eclipse.jface.viewers.Viewer;
14 import org.eclipse.swt.widgets.Table;
15 import org.eclipse.swt.widgets.TableItem;
16
17 /** A content provider maintaining an array of lines */
18 class LogContentProvider implements ILazyContentProvider, ArgeoLogListener {
19 private static final long serialVersionUID = -2084872367738339721L;
20
21 private DateFormat dateFormat = new SimpleDateFormat("HH:mm:ss");
22
23 private final Long start;
24 /** current - start = line number. first line is number '1' */
25 private Long current;
26
27 // TODO make it configurable
28 private final Integer maxLineBufferSize = 10 * 1000;
29
30 private final TableViewer viewer;
31 private LinkedList<LogLine> lines;
32
33 public LogContentProvider(TableViewer viewer) {
34 this.viewer = viewer;
35 start = System.currentTimeMillis();
36 lines = new LinkedList<LogLine>();
37 current = start;
38 }
39
40 public synchronized void dispose() {
41 lines.clear();
42 lines = null;
43 }
44
45 @SuppressWarnings("unchecked")
46 public synchronized void inputChanged(Viewer viewer, Object oldInput,
47 Object newInput) {
48 List<String> lin = (List<String>) newInput;
49 if (lin == null)
50 return;
51 for (String line : lin) {
52 addLine(line);
53 }
54 this.viewer.setItemCount(lines.size());
55 }
56
57 public void updateElement(int index) {
58 viewer.replace(lines.get(index), index);
59 }
60
61 public synchronized void appendLog(String username, Long timestamp,
62 String level, String category, String thread, Object msg,
63 String[] exception) {
64 // check if valid
65 if (lines == null)
66 return;
67
68 String message = msg.toString();
69 int count = 0;
70 String prefix = prefix(username, timestamp, level, category, thread)
71 .toString();
72 // String suffix = suffix(username, timestamp, level, category, thread);
73 for (String line : message.split("\n")) {
74 addLine(count == 0 ? prefix + line : line);
75 count++;
76 }
77
78 if (exception != null) {
79 for (String ste : exception) {
80 addLine(ste);
81 }
82 }
83
84 viewer.getTable().getDisplay().asyncExec(new Runnable() {
85 public void run() {
86 if (lines == null)
87 return;
88 viewer.setItemCount(lines.size());
89 // doesn't work with syncExec
90 scrollToLastLine();
91 }
92 });
93 }
94
95 protected StringBuffer prefix(String username, Long timestamp,
96 String level, String category, String thread) {
97 StringBuffer buf = new StringBuffer("");
98 buf.append(dateFormat.format(new Date(timestamp))).append(" ");
99 // buf.append(level).append(" ");
100 return buf;
101 }
102
103 /** Normalize string to the given size */
104 protected String norm(String str, Integer size) {
105 int length = str.length();
106 if (length == size)
107 return str;
108 else if (length > size)
109 return str.substring(0, size);
110 else {
111 char[] arr = new char[size - length];
112 Arrays.fill(arr, ' ');
113 return str + new String(arr);
114 }
115 }
116
117 // protected String suffix(String username, Long timestamp, String level,
118 // String category, String thread) {
119 // return "";
120 // }
121
122 /** Scroll to the last line */
123 protected synchronized void scrollToLastLine() {
124 // we try to show last line with two methods
125 // viewer.reveal(lines.peekLast());
126
127 Table table = viewer.getTable();
128 TableItem ti = table.getItem(table.getItemCount() - 1);
129 table.showItem(ti);
130 }
131
132 protected synchronized LogLine addLine(String line) {
133 // check for maximal size and purge if necessary
134 while (lines.size() >= maxLineBufferSize) {
135 for (int i = 0; i < maxLineBufferSize / 10; i++) {
136 lines.poll();
137 }
138 }
139
140 current++;
141 LogLine logLine = new LogLine(current, line);
142 lines.add(logLine);
143 return logLine;
144 }
145
146 private class LogLine {
147 private Long linenumber;
148 private String message;
149
150 public LogLine(Long linenumber, String message) {
151 this.linenumber = linenumber;
152 this.message = message;
153 }
154
155 @Override
156 public int hashCode() {
157 return linenumber.intValue();
158 }
159
160 @Override
161 public boolean equals(Object obj) {
162 if (obj instanceof LogLine)
163 return ((LogLine) obj).linenumber.equals(linenumber);
164 else
165 return false;
166 }
167
168 @Override
169 public String toString() {
170 return message;
171 }
172 }
173 }