added sorting of projects for initial classpath update event to speed up initial experience

This commit is contained in:
Martin Lippert
2018-05-22 08:49:51 +02:00
parent 34f340a462
commit 069f2d93ac
6 changed files with 114 additions and 11 deletions

View File

@@ -42,8 +42,6 @@ import org.junit.After;
import org.junit.Rule;
import org.junit.Test;
import org.junit.rules.TemporaryFolder;
import org.springframework.tooling.jdt.ls.commons.Logger;
import org.springframework.tooling.jdt.ls.commons.Logger.DefaultLogger;
import org.springframework.tooling.jdt.ls.commons.Logger.TestLogger;
import org.springframework.tooling.jdt.ls.commons.classpath.Classpath;
import org.springframework.tooling.jdt.ls.commons.classpath.Classpath.CPE;

View File

@@ -10,6 +10,10 @@
*******************************************************************************/
package org.springframework.tooling.jdt.ls.commons.classpath;
import java.util.Arrays;
import java.util.Comparator;
import java.util.function.Supplier;
import org.eclipse.core.resources.IProject;
import org.eclipse.core.resources.ResourcesPlugin;
import org.eclipse.core.runtime.CoreException;
@@ -21,8 +25,6 @@ import org.eclipse.jdt.core.IJavaProject;
import org.eclipse.jdt.core.JavaCore;
import org.springframework.tooling.jdt.ls.commons.Logger;
import static org.springframework.tooling.jdt.ls.commons.Logger.*;
/**
* An instance of this class provides a means to register
* listeners that get notified when classpath for a IJavaProject
@@ -91,14 +93,20 @@ public class ClasspathListenerManager {
* This allows clients to become aware of all classpaths from the start and
* continually monitor them for changes from that point onward.
*/
public ClasspathListenerManager(Logger logger, ClasspathListener listener, boolean initialEvent) {
public ClasspathListenerManager(Logger logger, ClasspathListener listener, boolean initialEvent, Supplier<Comparator<IProject>> projectSorterFactory) {
this.logger = logger;
logger.log("Setting up ClasspathListenerManager");
this.listener = listener;
JavaCore.addElementChangedListener(myListener=new MyListener(), ElementChangedEvent.POST_CHANGE);
if (initialEvent) {
logger.log("Sending initial event for all projects ...");
for (IProject p : ResourcesPlugin.getWorkspace().getRoot().getProjects()) {
IProject[] projects = ResourcesPlugin.getWorkspace().getRoot().getProjects();
if (projectSorterFactory != null) {
Arrays.sort(projects, projectSorterFactory.get());
}
for (IProject p : projects) {
logger.log("project "+p.getName() +" ..." );
try {
if (p.isAccessible() && p.hasNature(JavaCore.NATURE_ID)) {
@@ -116,7 +124,7 @@ public class ClasspathListenerManager {
}
public ClasspathListenerManager(Logger logger, ClasspathListener listener) {
this(logger, listener, false);
this(logger, listener, false, null);
}
public void dispose() {

View File

@@ -12,9 +12,12 @@ package org.springframework.tooling.jdt.ls.commons.classpath;
import java.io.File;
import java.net.URI;
import java.util.Comparator;
import java.util.HashMap;
import java.util.Map;
import java.util.function.Supplier;
import org.eclipse.core.resources.IProject;
import org.eclipse.core.runtime.IProgressMonitor;
import org.eclipse.core.runtime.IStatus;
import org.eclipse.core.runtime.Status;
@@ -30,10 +33,16 @@ public class ReusableClasspathListenerHandler {
private final ClientCommandExecutor conn;
private final Logger logger;
private final Supplier<Comparator<IProject>> projectSorterFactory;
public ReusableClasspathListenerHandler(Logger logger, ClientCommandExecutor conn) {
this(logger, conn, null);
}
public ReusableClasspathListenerHandler(Logger logger, ClientCommandExecutor conn, Supplier<Comparator<IProject>> projectSorterFactory) {
this.conn = conn;
this.logger = logger;
this.projectSorterFactory = projectSorterFactory;
logger.log("Instantiating ReusableClasspathListenerHandler");
}
@@ -89,7 +98,7 @@ public class ReusableClasspathListenerHandler {
public void classpathChanged(IJavaProject jp) {
sendNotification(callbackCommandId, jp);
}
}, true));
}, true, projectSorterFactory));
logger.log("subsribers = " + subscribers.keySet());
}