1 package org
.argeo
.security
.ui
.views
;
3 import java
.text
.DateFormat
;
4 import java
.text
.SimpleDateFormat
;
6 import java
.util
.LinkedList
;
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
;
16 /** A content provider maintaining an array of lines */
17 class LogContentProvider
implements ILazyContentProvider
, ArgeoLogListener
{
18 private DateFormat dateFormat
= new SimpleDateFormat("HH:mm:ss");
20 private final Long start
;
21 /** current - start = line number. first line is number '1' */
24 // TODO make it configurable
25 private final Integer maxLineBufferSize
= 10 * 1000;
27 private final TableViewer viewer
;
28 private final LinkedList
<LogLine
> lines
;
30 public LogContentProvider(TableViewer viewer
) {
32 start
= System
.currentTimeMillis();
33 lines
= new LinkedList
<LogLine
>();
37 public synchronized void dispose() {
41 @SuppressWarnings("unchecked")
42 public synchronized void inputChanged(Viewer viewer
, Object oldInput
,
44 List
<String
> lin
= (List
<String
>) newInput
;
47 for (String line
: lin
) {
50 this.viewer
.setItemCount(lines
.size());
53 public void updateElement(int index
) {
54 viewer
.replace(lines
.get(index
), index
);
57 public synchronized void appendLog(String username
, Long timestamp
,
58 String level
, String category
, String thread
, Object msg
,
64 String message
= msg
.toString();
65 StringBuffer buf
= new StringBuffer("");
66 buf
.append(dateFormat
.format(new Date(timestamp
))).append(" ");
67 buf
.append(level
).append(" ");
69 for (String line
: message
.split("\n")) {
70 addLine(count
== 0 ? buf
+ line
: line
);
74 if (exception
!= null) {
75 for (String ste
: exception
) {
79 viewer
.getTable().getDisplay().syncExec(new Runnable() {
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);
91 System
.out
.println("tableItem is null");
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
++) {
106 LogLine logLine
= new LogLine(current
, line
);
111 private class LogLine
{
112 private Long linenumber
;
113 private String message
;
115 public LogLine(Long linenumber
, String message
) {
116 this.linenumber
= linenumber
;
117 this.message
= message
;
121 public int hashCode() {
122 return linenumber
.intValue();
126 public boolean equals(Object obj
) {
127 if (obj
instanceof LogLine
)
128 return ((LogLine
) obj
).linenumber
.equals(linenumber
);
134 public String
toString() {