X-Git-Url: https://git.argeo.org/?a=blobdiff_plain;f=security%2Fplugins%2Forg.argeo.security.ui%2Fsrc%2Fmain%2Fjava%2Forg%2Fargeo%2Fsecurity%2Fui%2Fviews%2FLogContentProvider.java;h=c365f9e6cbf1bc28c794447a612f70bca597811c;hb=72c5c4c7e5348ad96a451ef866a1e231db976dc7;hp=5e28228a11cf330d649597952d0634ea462e022f;hpb=0b7c4d15bef603eed5a7b770482e6cf684bbf381;p=lgpl%2Fargeo-commons.git diff --git a/security/plugins/org.argeo.security.ui/src/main/java/org/argeo/security/ui/views/LogContentProvider.java b/security/plugins/org.argeo.security.ui/src/main/java/org/argeo/security/ui/views/LogContentProvider.java index 5e28228a1..c365f9e6c 100644 --- a/security/plugins/org.argeo.security.ui/src/main/java/org/argeo/security/ui/views/LogContentProvider.java +++ b/security/plugins/org.argeo.security.ui/src/main/java/org/argeo/security/ui/views/LogContentProvider.java @@ -2,35 +2,53 @@ package org.argeo.security.ui.views; import java.text.DateFormat; import java.text.SimpleDateFormat; +import java.util.Arrays; import java.util.Date; +import java.util.LinkedList; import java.util.List; import org.argeo.ArgeoLogListener; import org.eclipse.jface.viewers.ILazyContentProvider; import org.eclipse.jface.viewers.TableViewer; import org.eclipse.jface.viewers.Viewer; +import org.eclipse.swt.widgets.Table; +import org.eclipse.swt.widgets.TableItem; -/** A content provider maintaing an array of lines */ +/** A content provider maintaining an array of lines */ class LogContentProvider implements ILazyContentProvider, ArgeoLogListener { private DateFormat dateFormat = new SimpleDateFormat("HH:mm:ss"); + private final Long start; + /** current - start = line number. first line is number '1' */ + private Long current; + + // TODO make it configurable + private final Integer maxLineBufferSize = 10 * 1000; + private final TableViewer viewer; - private List lines; + private LinkedList lines; public LogContentProvider(TableViewer viewer) { this.viewer = viewer; + start = System.currentTimeMillis(); + lines = new LinkedList(); + current = start; } public synchronized void dispose() { + lines.clear(); lines = null; } @SuppressWarnings("unchecked") public synchronized void inputChanged(Viewer viewer, Object oldInput, Object newInput) { - lines = (List) newInput; - if (lines == null) + List lin = (List) newInput; + if (lin == null) return; + for (String line : lin) { + addLine(line); + } this.viewer.setItemCount(lines.size()); } @@ -46,36 +64,109 @@ class LogContentProvider implements ILazyContentProvider, ArgeoLogListener { return; String message = msg.toString(); - StringBuffer buf = new StringBuffer(""); - buf.append(dateFormat.format(new Date(timestamp))).append(" "); - buf.append(level).append(" "); int count = 0; - String lastLine = null; + String prefix = prefix(username, timestamp, level, category, thread) + .toString(); + // String suffix = suffix(username, timestamp, level, category, thread); for (String line : message.split("\n")) { - if (count == 0) - lastLine = buf + line; - else - lastLine = line; - lines.add(lastLine); + addLine(count == 0 ? prefix + line : line); count++; } if (exception != null) { for (String ste : exception) { - lastLine = ste; - lines.add(lastLine); + addLine(ste); } } - final Object lastElement = lastLine; + viewer.getTable().getDisplay().asyncExec(new Runnable() { public void run() { + if (lines == null) + return; viewer.setItemCount(lines.size()); - if (lastElement != null) - viewer.reveal(lastElement); + // doesn't work with syncExec + scrollToLastLine(); } }); } - // private class LogLine { - // private String message; + + protected StringBuffer prefix(String username, Long timestamp, + String level, String category, String thread) { + StringBuffer buf = new StringBuffer(""); + buf.append(dateFormat.format(new Date(timestamp))).append(" "); + // buf.append(level).append(" "); + return buf; + } + + /** Normalize string to the given size */ + protected String norm(String str, Integer size) { + int length = str.length(); + if (length == size) + return str; + else if (length > size) + return str.substring(0, size); + else { + char[] arr = new char[size - length]; + Arrays.fill(arr, ' '); + return str + new String(arr); + } + } + + // protected String suffix(String username, Long timestamp, String level, + // String category, String thread) { + // return ""; // } + + /** Scroll to the last line */ + protected synchronized void scrollToLastLine() { + // we try to show last line with two methods + // viewer.reveal(lines.peekLast()); + + Table table = viewer.getTable(); + TableItem ti = table.getItem(table.getItemCount() - 1); + table.showItem(ti); + } + + protected synchronized LogLine addLine(String line) { + // check for maximal size and purge if necessary + while (lines.size() >= maxLineBufferSize) { + for (int i = 0; i < maxLineBufferSize / 10; i++) { + lines.poll(); + } + } + + current++; + LogLine logLine = new LogLine(current, line); + lines.add(logLine); + return logLine; + } + + private class LogLine { + private Long linenumber; + private String message; + + public LogLine(Long linenumber, String message) { + this.linenumber = linenumber; + this.message = message; + } + + @Override + public int hashCode() { + return linenumber.intValue(); + } + + @Override + public boolean equals(Object obj) { + if (obj instanceof LogLine) + return ((LogLine) obj).linenumber.equals(linenumber); + else + return false; + } + + @Override + public String toString() { + return message; + } + + } } \ No newline at end of file