From d4c2363c4c8dfdf3bc2031e61cbf8d1730a13cf9 Mon Sep 17 00:00:00 2001 From: Mathieu Baudier Date: Tue, 21 Feb 2012 22:49:04 +0000 Subject: [PATCH] Improve logging git-svn-id: https://svn.argeo.org/commons/trunk@5110 4cfe0d0a-d680-48aa-b62c-e0a02a3f76cc --- demo/argeo_node_rcp.properties | 4 +- .../security/ui/views/LogContentProvider.java | 98 +++++++++++++++---- .../org/argeo/security/ui/views/LogView.java | 7 +- .../ui/explorer/JcrExplorerPerspective.java | 6 ++ 4 files changed, 91 insertions(+), 24 deletions(-) diff --git a/demo/argeo_node_rcp.properties b/demo/argeo_node_rcp.properties index d9eaf77d2..2545106f7 100644 --- a/demo/argeo_node_rcp.properties +++ b/demo/argeo_node_rcp.properties @@ -6,7 +6,9 @@ org.argeo.security.dao.os,\ org.argeo.security.equinox,\ #org.argeo.security.ui.initialPerspective=org.argeo.osgi.ui.explorer.perspective -org.argeo.security.ui.initialPerspective==org.argeo.security.ui.userHomePerspective +#org.argeo.security.ui.initialPerspective==org.argeo.security.ui.userHomePerspective +org.argeo.security.ui.initialPerspective=org.argeo.jcr.ui.explorer.perspective + #argeo.node.repo.uri=http://localhost:7070/org.argeo.jcr.webapp/remoting/node log4j.configuration=file:../../log4j.properties 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..08cca0d0a 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 @@ -3,34 +3,50 @@ package org.argeo.security.ui.views; import java.text.DateFormat; import java.text.SimpleDateFormat; 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 final LinkedList lines; public LogContentProvider(TableViewer viewer) { this.viewer = viewer; + start = System.currentTimeMillis(); + lines = new LinkedList(); + current = start; } public synchronized void dispose() { - lines = null; + lines.clear(); } @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()); } @@ -50,32 +66,74 @@ class LogContentProvider implements ILazyContentProvider, ArgeoLogListener { buf.append(dateFormat.format(new Date(timestamp))).append(" "); buf.append(level).append(" "); int count = 0; - String lastLine = null; for (String line : message.split("\n")) { - if (count == 0) - lastLine = buf + line; - else - lastLine = line; - lines.add(lastLine); + addLine(count == 0 ? buf + 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() { + viewer.getTable().getDisplay().syncExec(new Runnable() { public void run() { viewer.setItemCount(lines.size()); - if (lastElement != null) - viewer.reveal(lastElement); + // viewer.reveal(lines.peekLast()); + Table table = viewer.getTable(); + // table.setTopIndex(lines.size()-1); + System.out.println("topIndex=" + table.getTopIndex() + + ", tableSize=" + lines.size()); + // table.select(lines.size() - 1); + // table.showSelection(); + TableItem ti = table.getItem(lines.size() - 1); + if (ti == null) + System.out.println("tableItem is null"); + table.showItem(ti); } }); } - // private class LogLine { - // private String message; - // } + + 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 diff --git a/security/plugins/org.argeo.security.ui/src/main/java/org/argeo/security/ui/views/LogView.java b/security/plugins/org.argeo.security.ui/src/main/java/org/argeo/security/ui/views/LogView.java index e49400757..f432ad348 100644 --- a/security/plugins/org.argeo.security.ui/src/main/java/org/argeo/security/ui/views/LogView.java +++ b/security/plugins/org.argeo.security.ui/src/main/java/org/argeo/security/ui/views/LogView.java @@ -18,7 +18,7 @@ import org.osgi.framework.ServiceRegistration; */ public class LogView extends ViewPart { public static String ID = SecurityUiPlugin.PLUGIN_ID + ".logView"; - + private TableViewer viewer; private LogContentProvider logContentProvider; @@ -27,13 +27,14 @@ public class LogView extends ViewPart { @Override public void createPartControl(Composite parent) { - viewer = new TableViewer(parent, SWT.VIRTUAL); + viewer = new TableViewer(parent, SWT.VIRTUAL | SWT.MULTI | SWT.H_SCROLL + | SWT.V_SCROLL | SWT.FULL_SELECTION | SWT.BORDER); viewer.setLabelProvider(new LabelProvider()); logContentProvider = new LogContentProvider(viewer); serviceRegistration = getBundleContext().registerService( ArgeoLogListener.class.getName(), logContentProvider, null); viewer.setContentProvider(logContentProvider); - viewer.setUseHashlookup(true); + //viewer.setUseHashlookup(true); viewer.setInput(new ArrayList()); } diff --git a/server/plugins/org.argeo.jcr.ui.explorer/src/main/java/org/argeo/jcr/ui/explorer/JcrExplorerPerspective.java b/server/plugins/org.argeo.jcr.ui.explorer/src/main/java/org/argeo/jcr/ui/explorer/JcrExplorerPerspective.java index 9698a1933..5f45487e9 100644 --- a/server/plugins/org.argeo.jcr.ui.explorer/src/main/java/org/argeo/jcr/ui/explorer/JcrExplorerPerspective.java +++ b/server/plugins/org.argeo.jcr.ui.explorer/src/main/java/org/argeo/jcr/ui/explorer/JcrExplorerPerspective.java @@ -15,6 +15,12 @@ public class JcrExplorerPerspective implements IPerspectiveFactory { IFolderLayout upperLeft = layout.createFolder(JcrExplorerPlugin.ID + ".upperLeft", IPageLayout.LEFT, 0.4f, layout.getEditorArea()); upperLeft.addView(BROWSER_VIEW_ID); + +// String editorArea = layout.getEditorArea(); +// String logViewId = "org.argeo.security.ui.logView"; +// IFolderLayout bottom = layout.createFolder("bottom", +// IPageLayout.BOTTOM, 0.50f, editorArea); +// bottom.addView(logViewId); } } -- 2.30.2