1 package org
.argeo
.cms
.ui
.workbench
.useradmin
;
3 import java
.text
.DateFormat
;
4 import java
.text
.SimpleDateFormat
;
5 import java
.util
.Arrays
;
7 import java
.util
.LinkedList
;
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
;
17 /** A content provider maintaining an array of lines */
18 class LogContentProvider
implements ILazyContentProvider
, ArgeoLogListener
{
19 private static final long serialVersionUID
= -2084872367738339721L;
21 private DateFormat dateFormat
= new SimpleDateFormat("HH:mm:ss");
23 private final Long start
;
24 /** current - start = line number. first line is number '1' */
27 // TODO make it configurable
28 private final Integer maxLineBufferSize
= 10 * 1000;
30 private final TableViewer viewer
;
31 private LinkedList
<LogLine
> lines
;
33 public LogContentProvider(TableViewer viewer
) {
35 start
= System
.currentTimeMillis();
36 lines
= new LinkedList
<LogLine
>();
40 public synchronized void dispose() {
45 @SuppressWarnings("unchecked")
46 public synchronized void inputChanged(Viewer viewer
, Object oldInput
,
48 List
<String
> lin
= (List
<String
>) newInput
;
51 for (String line
: lin
) {
54 this.viewer
.setItemCount(lines
.size());
57 public void updateElement(int index
) {
58 viewer
.replace(lines
.get(index
), index
);
61 public synchronized void appendLog(String username
, Long timestamp
,
62 String level
, String category
, String thread
, Object msg
,
68 String message
= msg
.toString();
70 String prefix
= prefix(username
, timestamp
, level
, category
, thread
)
72 // String suffix = suffix(username, timestamp, level, category, thread);
73 for (String line
: message
.split("\n")) {
74 addLine(count
== 0 ? prefix
+ line
: line
);
78 if (exception
!= null) {
79 for (String ste
: exception
) {
84 viewer
.getTable().getDisplay().asyncExec(new Runnable() {
88 viewer
.setItemCount(lines
.size());
89 // doesn't work with syncExec
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(" ");
103 /** Normalize string to the given size */
104 protected String
norm(String str
, Integer size
) {
105 int length
= str
.length();
108 else if (length
> size
)
109 return str
.substring(0, size
);
111 char[] arr
= new char[size
- length
];
112 Arrays
.fill(arr
, ' ');
113 return str
+ new String(arr
);
117 // protected String suffix(String username, Long timestamp, String level,
118 // String category, String thread) {
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());
127 Table table
= viewer
.getTable();
128 TableItem ti
= table
.getItem(table
.getItemCount() - 1);
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
++) {
141 LogLine logLine
= new LogLine(current
, line
);
146 private class LogLine
{
147 private Long linenumber
;
148 private String message
;
150 public LogLine(Long linenumber
, String message
) {
151 this.linenumber
= linenumber
;
152 this.message
= message
;
156 public int hashCode() {
157 return linenumber
.intValue();
161 public boolean equals(Object obj
) {
162 if (obj
instanceof LogLine
)
163 return ((LogLine
) obj
).linenumber
.equals(linenumber
);
169 public String
toString() {