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