]> git.argeo.org Git - lgpl/argeo-commons.git/blob - security/plugins/org.argeo.security.ui/src/main/java/org/argeo/security/ui/views/LogContentProvider.java
08cca0d0a8195e67bf83ca715ac853cf2147b8c0
[lgpl/argeo-commons.git] / security / plugins / org.argeo.security.ui / src / main / java / org / argeo / security / ui / views / LogContentProvider.java
1 package org.argeo.security.ui.views;
2
3 import java.text.DateFormat;
4 import java.text.SimpleDateFormat;
5 import java.util.Date;
6 import java.util.LinkedList;
7 import java.util.List;
8
9 import org.argeo.ArgeoLogListener;
10 import org.eclipse.jface.viewers.ILazyContentProvider;
11 import org.eclipse.jface.viewers.TableViewer;
12 import org.eclipse.jface.viewers.Viewer;
13 import org.eclipse.swt.widgets.Table;
14 import org.eclipse.swt.widgets.TableItem;
15
16 /** A content provider maintaining an array of lines */
17 class LogContentProvider implements ILazyContentProvider, ArgeoLogListener {
18 private DateFormat dateFormat = new SimpleDateFormat("HH:mm:ss");
19
20 private final Long start;
21 /** current - start = line number. first line is number '1' */
22 private Long current;
23
24 // TODO make it configurable
25 private final Integer maxLineBufferSize = 10 * 1000;
26
27 private final TableViewer viewer;
28 private final LinkedList<LogLine> lines;
29
30 public LogContentProvider(TableViewer viewer) {
31 this.viewer = viewer;
32 start = System.currentTimeMillis();
33 lines = new LinkedList<LogLine>();
34 current = start;
35 }
36
37 public synchronized void dispose() {
38 lines.clear();
39 }
40
41 @SuppressWarnings("unchecked")
42 public synchronized void inputChanged(Viewer viewer, Object oldInput,
43 Object newInput) {
44 List<String> lin = (List<String>) newInput;
45 if (lin == null)
46 return;
47 for (String line : lin) {
48 addLine(line);
49 }
50 this.viewer.setItemCount(lines.size());
51 }
52
53 public void updateElement(int index) {
54 viewer.replace(lines.get(index), index);
55 }
56
57 public synchronized void appendLog(String username, Long timestamp,
58 String level, String category, String thread, Object msg,
59 String[] exception) {
60 // check if valid
61 if (lines == null)
62 return;
63
64 String message = msg.toString();
65 StringBuffer buf = new StringBuffer("");
66 buf.append(dateFormat.format(new Date(timestamp))).append(" ");
67 buf.append(level).append(" ");
68 int count = 0;
69 for (String line : message.split("\n")) {
70 addLine(count == 0 ? buf + line : line);
71 count++;
72 }
73
74 if (exception != null) {
75 for (String ste : exception) {
76 addLine(ste);
77 }
78 }
79 viewer.getTable().getDisplay().syncExec(new Runnable() {
80 public void run() {
81 viewer.setItemCount(lines.size());
82 // viewer.reveal(lines.peekLast());
83 Table table = viewer.getTable();
84 // table.setTopIndex(lines.size()-1);
85 System.out.println("topIndex=" + table.getTopIndex()
86 + ", tableSize=" + lines.size());
87 // table.select(lines.size() - 1);
88 // table.showSelection();
89 TableItem ti = table.getItem(lines.size() - 1);
90 if (ti == null)
91 System.out.println("tableItem is null");
92 table.showItem(ti);
93 }
94 });
95 }
96
97 protected synchronized LogLine addLine(String line) {
98 // check for maximal size and purge if necessary
99 while (lines.size() >= maxLineBufferSize) {
100 for (int i = 0; i < maxLineBufferSize / 10; i++) {
101 lines.poll();
102 }
103 }
104
105 current++;
106 LogLine logLine = new LogLine(current, line);
107 lines.add(logLine);
108 return logLine;
109 }
110
111 private class LogLine {
112 private Long linenumber;
113 private String message;
114
115 public LogLine(Long linenumber, String message) {
116 this.linenumber = linenumber;
117 this.message = message;
118 }
119
120 @Override
121 public int hashCode() {
122 return linenumber.intValue();
123 }
124
125 @Override
126 public boolean equals(Object obj) {
127 if (obj instanceof LogLine)
128 return ((LogLine) obj).linenumber.equals(linenumber);
129 else
130 return false;
131 }
132
133 @Override
134 public String toString() {
135 return message;
136 }
137
138 }
139 }