Improve logging
authorMathieu Baudier <mbaudier@argeo.org>
Tue, 21 Feb 2012 22:49:04 +0000 (22:49 +0000)
committerMathieu Baudier <mbaudier@argeo.org>
Tue, 21 Feb 2012 22:49:04 +0000 (22:49 +0000)
git-svn-id: https://svn.argeo.org/commons/trunk@5110 4cfe0d0a-d680-48aa-b62c-e0a02a3f76cc

demo/argeo_node_rcp.properties
security/plugins/org.argeo.security.ui/src/main/java/org/argeo/security/ui/views/LogContentProvider.java
security/plugins/org.argeo.security.ui/src/main/java/org/argeo/security/ui/views/LogView.java
server/plugins/org.argeo.jcr.ui.explorer/src/main/java/org/argeo/jcr/ui/explorer/JcrExplorerPerspective.java

index d9eaf77d22a98d1b761e2c90bf0272962316814b..2545106f70d8e696f61c3910c7a5412f916cb54d 100644 (file)
@@ -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
index 5e28228a11cf330d649597952d0634ea462e022f..08cca0d0a8195e67bf83ca715ac853cf2147b8c0 100644 (file)
@@ -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<String> lines;
+       private final LinkedList<LogLine> lines;
 
        public LogContentProvider(TableViewer viewer) {
                this.viewer = viewer;
+               start = System.currentTimeMillis();
+               lines = new LinkedList<LogLine>();
+               current = start;
        }
 
        public synchronized void dispose() {
-               lines = null;
+               lines.clear();
        }
 
        @SuppressWarnings("unchecked")
        public synchronized void inputChanged(Viewer viewer, Object oldInput,
                        Object newInput) {
-               lines = (List<String>) newInput;
-               if (lines == null)
+               List<String> lin = (List<String>) 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
index e49400757f6e8f94ab1c1e68aa73c885eefbff36..f432ad34863a4a10d26559db21cfbc68d411f6a8 100644 (file)
@@ -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<String>());
        }
 
index 9698a1933c5eea36a80b3a356ebcdf6fcd7eab75..5f45487e9a4975a0259f3682bfa86a10c4dd886d 100644 (file)
@@ -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);
        }
 
 }