Author: rombert
Date: Tue Feb 17 22:49:19 2015
New Revision: 1660526

URL: http://svn.apache.org/r1660526
Log:
SLING-4105 - Content Navigator should not read all the jcr_root when
initialized

Add performance tracing in call sites which can block the UI.

Modified:
    sling/trunk/tooling/ide/api/src/org/apache/sling/ide/log/Logger.java
    
sling/trunk/tooling/ide/eclipse-core/src/org/apache/sling/ide/eclipse/core/debug/impl/Tracer.java
    sling/trunk/tooling/ide/eclipse-ui/.options
    
sling/trunk/tooling/ide/eclipse-ui/src/org/apache/sling/ide/eclipse/ui/nav/JcrContentContentProvider.java
    
sling/trunk/tooling/ide/eclipse-ui/src/org/apache/sling/ide/eclipse/ui/nav/JcrContentLabelProvider.java
    
sling/trunk/tooling/ide/impl-vlt-test/src/test/java/org/apache/sling/ide/impl/vlt/Slf4jLogger.java

Modified: sling/trunk/tooling/ide/api/src/org/apache/sling/ide/log/Logger.java
URL: 
http://svn.apache.org/viewvc/sling/trunk/tooling/ide/api/src/org/apache/sling/ide/log/Logger.java?rev=1660526&r1=1660525&r2=1660526&view=diff
==============================================================================
--- sling/trunk/tooling/ide/api/src/org/apache/sling/ide/log/Logger.java 
(original)
+++ sling/trunk/tooling/ide/api/src/org/apache/sling/ide/log/Logger.java Tue 
Feb 17 22:49:19 2015
@@ -89,4 +89,17 @@ public interface Logger {
      * @param error the error that occured
      */
     void trace(String message, Throwable error);
+
+    /**
+     * Sends a performance trace message
+     * 
+     * <p>
+     * Note that implementations may choose to not display performance entries 
which take less than a predefined
+     * threshold
+     * 
+     * @param message A string message
+     * @param duration The operation's duration in milliseconds
+     * @param arguments an optional array of arguments
+     */
+    void tracePerformance(String message, long duration, Object... arguments);
 }

Modified: 
sling/trunk/tooling/ide/eclipse-core/src/org/apache/sling/ide/eclipse/core/debug/impl/Tracer.java
URL: 
http://svn.apache.org/viewvc/sling/trunk/tooling/ide/eclipse-core/src/org/apache/sling/ide/eclipse/core/debug/impl/Tracer.java?rev=1660526&r1=1660525&r2=1660526&view=diff
==============================================================================
--- 
sling/trunk/tooling/ide/eclipse-core/src/org/apache/sling/ide/eclipse/core/debug/impl/Tracer.java
 (original)
+++ 
sling/trunk/tooling/ide/eclipse-core/src/org/apache/sling/ide/eclipse/core/debug/impl/Tracer.java
 Tue Feb 17 22:49:19 2015
@@ -32,9 +32,12 @@ import org.eclipse.osgi.util.NLS;
  */
 public class Tracer implements DebugOptionsListener, Logger {
 
+    private static final long PERF_IGNORE_THRESHOLD = 50;
+
     private final Plugin plugin;
     private boolean debugEnabled;
     private boolean consoleEnabled;
+    private boolean performanceEnabled;
     private DebugTrace trace;
     
     public Tracer(Plugin plugin) {
@@ -48,6 +51,7 @@ public class Tracer implements DebugOpti
 
         debugEnabled = options.getBooleanOption(pluginId + "/debug", false);
         consoleEnabled = options.getBooleanOption(pluginId + "/debug/console", 
false) && debugEnabled;
+        performanceEnabled = options.getBooleanOption(pluginId + 
"/debug/performance", false) && debugEnabled;
         trace = options.newDebugTrace(pluginId, getClass());
     }
     
@@ -105,6 +109,26 @@ public class Tracer implements DebugOpti
         logInternal(IStatus.ERROR, message, cause);
     }
 
+    @Override
+    public void tracePerformance(String message, long duration, Object... 
arguments) {
+        if (!performanceEnabled)
+            return;
+
+        if (duration < PERF_IGNORE_THRESHOLD) {
+            return;
+        }
+
+        if (arguments.length > 0)
+            message = NLS.bind(message, arguments);
+
+        String fullMessage = message + " took " + duration + " ms";
+
+        trace.trace("/debug/performance", fullMessage);
+
+        if (consoleEnabled)
+            writeToConsole(fullMessage, null);
+    }
+
     private void logInternal(int statusCode, String message, Throwable cause) {
         plugin.getLog().log(new Status(statusCode, 
plugin.getBundle().getSymbolicName(), message, cause));
     }

Modified: sling/trunk/tooling/ide/eclipse-ui/.options
URL: 
http://svn.apache.org/viewvc/sling/trunk/tooling/ide/eclipse-ui/.options?rev=1660526&r1=1660525&r2=1660526&view=diff
==============================================================================
--- sling/trunk/tooling/ide/eclipse-ui/.options (original)
+++ sling/trunk/tooling/ide/eclipse-ui/.options Tue Feb 17 22:49:19 2015
@@ -1,2 +1,3 @@
 org.apache.sling.ide.eclipse-ui/debug=false
-org.apache.sling.ide.eclipse-ui/debug/console=false
\ No newline at end of file
+org.apache.sling.ide.eclipse-ui/debug/console=false
+org.apache.sling.ide.eclipse-ui/debug/performance=false
\ No newline at end of file

Modified: 
sling/trunk/tooling/ide/eclipse-ui/src/org/apache/sling/ide/eclipse/ui/nav/JcrContentContentProvider.java
URL: 
http://svn.apache.org/viewvc/sling/trunk/tooling/ide/eclipse-ui/src/org/apache/sling/ide/eclipse/ui/nav/JcrContentContentProvider.java?rev=1660526&r1=1660525&r2=1660526&view=diff
==============================================================================
--- 
sling/trunk/tooling/ide/eclipse-ui/src/org/apache/sling/ide/eclipse/ui/nav/JcrContentContentProvider.java
 (original)
+++ 
sling/trunk/tooling/ide/eclipse-ui/src/org/apache/sling/ide/eclipse/ui/nav/JcrContentContentProvider.java
 Tue Feb 17 22:49:19 2015
@@ -17,13 +17,13 @@
 package org.apache.sling.ide.eclipse.ui.nav;
 
 import java.util.Arrays;
+import java.util.HashSet;
 import java.util.Iterator;
-import java.util.LinkedList;
-import java.util.List;
 import java.util.Set;
 
 import org.apache.sling.ide.eclipse.core.ProjectUtil;
 import org.apache.sling.ide.eclipse.core.internal.ProjectHelper;
+import org.apache.sling.ide.eclipse.ui.internal.Activator;
 import org.apache.sling.ide.eclipse.ui.nav.model.JcrNode;
 import org.apache.sling.ide.eclipse.ui.nav.model.SyncDir;
 import org.eclipse.core.resources.IContainer;
@@ -58,7 +58,7 @@ public class JcrContentContentProvider i
                return;
            }
                try {
-                       final List<IResource> toBeRefreshed = new 
LinkedList<IResource>();
+            final Set<IProject> toBeRefreshed = new HashSet<IProject>();
                        event.getDelta().accept(new IResourceDeltaVisitor() {
                                
                                @Override
@@ -75,17 +75,17 @@ public class JcrContentContentProvider i
                                        return true;
                                }
                        });
-                       if (toBeRefreshed.size()==0) {
-                               return;
-                       }
-                       for (Iterator<IResource> it = toBeRefreshed.iterator(); 
it
-                                       .hasNext();) {
-                               final IResource iResource = it.next();
+
+            for (final IProject project : toBeRefreshed) {
                                viewer.getTree().getDisplay().asyncExec(new 
Runnable() {
 
                                        @Override
                                        public void run() {
-                                               
viewer.refresh(iResource.getProject(), true);
+                        long start = System.currentTimeMillis();
+                        viewer.refresh(project, true);
+                        long end = System.currentTimeMillis();
+                        Activator.getDefault().getPluginLogger()
+                                .tracePerformance("viewer.refresh({0},true)", 
(end - start), project);
                                        }
                                });
                        }
@@ -116,8 +116,13 @@ public class JcrContentContentProvider i
                if (parentElement instanceof IProject) {
                        return projectGetChildren((IProject)parentElement);
                } else if (parentElement instanceof JcrNode) {
+            long start = System.currentTimeMillis();
                        JcrNode node = (JcrNode)parentElement;
-                       return node.getChildren(true);
+            Object[] children = node.getChildren(true);
+            long end = System.currentTimeMillis();
+            Activator.getDefault().getPluginLogger()
+                    .tracePerformance("node.getChildren for node at {0}", (end 
- start), node.getJcrPath());
+            return children;
                } else {
                        return null;
                }

Modified: 
sling/trunk/tooling/ide/eclipse-ui/src/org/apache/sling/ide/eclipse/ui/nav/JcrContentLabelProvider.java
URL: 
http://svn.apache.org/viewvc/sling/trunk/tooling/ide/eclipse-ui/src/org/apache/sling/ide/eclipse/ui/nav/JcrContentLabelProvider.java?rev=1660526&r1=1660525&r2=1660526&view=diff
==============================================================================
--- 
sling/trunk/tooling/ide/eclipse-ui/src/org/apache/sling/ide/eclipse/ui/nav/JcrContentLabelProvider.java
 (original)
+++ 
sling/trunk/tooling/ide/eclipse-ui/src/org/apache/sling/ide/eclipse/ui/nav/JcrContentLabelProvider.java
 Tue Feb 17 22:49:19 2015
@@ -16,6 +16,7 @@
  */
 package org.apache.sling.ide.eclipse.ui.nav;
 
+import org.apache.sling.ide.eclipse.ui.internal.Activator;
 import org.apache.sling.ide.eclipse.ui.nav.model.JcrNode;
 import org.eclipse.jface.viewers.ILabelProvider;
 import org.eclipse.jface.viewers.ILabelProviderListener;
@@ -53,7 +54,12 @@ public class JcrContentLabelProvider imp
        public Image getImage(Object element) {
                if (element instanceof JcrNode) {
                        JcrNode jcrNode = (JcrNode)element;
-                       return jcrNode.getImage();
+                       long start = System.currentTimeMillis();
+                       Image image = jcrNode.getImage();
+                       long end = System.currentTimeMillis();
+            Activator.getDefault().getPluginLogger()
+                    .tracePerformance("getImage for node at {0}", (end - 
start), jcrNode.getJcrPath());
+            return image;
                } else {
                        // fallback to default
                        return null;

Modified: 
sling/trunk/tooling/ide/impl-vlt-test/src/test/java/org/apache/sling/ide/impl/vlt/Slf4jLogger.java
URL: 
http://svn.apache.org/viewvc/sling/trunk/tooling/ide/impl-vlt-test/src/test/java/org/apache/sling/ide/impl/vlt/Slf4jLogger.java?rev=1660526&r1=1660525&r2=1660526&view=diff
==============================================================================
--- 
sling/trunk/tooling/ide/impl-vlt-test/src/test/java/org/apache/sling/ide/impl/vlt/Slf4jLogger.java
 (original)
+++ 
sling/trunk/tooling/ide/impl-vlt-test/src/test/java/org/apache/sling/ide/impl/vlt/Slf4jLogger.java
 Tue Feb 17 22:49:19 2015
@@ -29,6 +29,8 @@ import org.slf4j.LoggerFactory;
  */
 class Slf4jLogger implements Logger {
 
+    private static final long PERF_IGNORE_THRESHOLD = 50;
+
     private final org.slf4j.Logger wrapped = 
LoggerFactory.getLogger(Slf4jLogger.class);
 
     @Override
@@ -66,4 +68,12 @@ class Slf4jLogger implements Logger {
     public void error(String message) {
         wrapped.error(message);
     }
+
+    @Override
+    public void tracePerformance(String message, long duration, Object... 
arguments) {
+        if (duration < PERF_IGNORE_THRESHOLD) {
+            return;
+        }
+        trace(message + " took " + duration + " ms", arguments);
+    }
 }
\ No newline at end of file


Reply via email to