Bug 550964 - call get with timeout instead of join to avoid UI freeze when operation takes too long

Change-Id: I3db1527d59841d81fe8c51b56acf855042d3fea6
Signed-off-by: Martin Lippert <mlippert@gmail.com>
diff --git a/org.eclipse.lsp4e/src/org/eclipse/lsp4e/operations/symbols/WorkspaceSymbolsQuickAccessProvider.java b/org.eclipse.lsp4e/src/org/eclipse/lsp4e/operations/symbols/WorkspaceSymbolsQuickAccessProvider.java
index ee1f189..b848b3f 100644
--- a/org.eclipse.lsp4e/src/org/eclipse/lsp4e/operations/symbols/WorkspaceSymbolsQuickAccessProvider.java
+++ b/org.eclipse.lsp4e/src/org/eclipse/lsp4e/operations/symbols/WorkspaceSymbolsQuickAccessProvider.java
@@ -15,10 +15,14 @@
 import java.util.Collections;
 import java.util.List;
 import java.util.concurrent.CompletableFuture;
+import java.util.concurrent.ExecutionException;
+import java.util.concurrent.TimeUnit;
+import java.util.concurrent.TimeoutException;
 import java.util.stream.Collectors;
 
 import org.eclipse.core.runtime.IProgressMonitor;
 import org.eclipse.jdt.annotation.NonNull;
+import org.eclipse.lsp4e.LanguageServerPlugin;
 import org.eclipse.lsp4e.LanguageServiceAccessor;
 import org.eclipse.lsp4j.WorkspaceSymbolParams;
 import org.eclipse.lsp4j.services.LanguageServer;
@@ -53,10 +57,17 @@
 		}
 		WorkspaceSymbolParams params = new WorkspaceSymbolParams(query);
 		List<QuickAccessElement> res = Collections.synchronizedList(new ArrayList<>());
-		CompletableFuture.allOf(usedLanguageServers.stream().map(ls ->
-			ls.getWorkspaceService().symbol(params).thenAcceptAsync(symbols ->
-				res.addAll(symbols.stream().map(WorkspaceSymbolQuickAccessElement::new).collect(Collectors.toList()))
-		)).toArray(CompletableFuture[]::new)).join();
+
+		try {
+			CompletableFuture.allOf(usedLanguageServers.stream().map(ls ->
+				ls.getWorkspaceService().symbol(params).thenAcceptAsync(symbols ->
+					res.addAll(symbols.stream().map(WorkspaceSymbolQuickAccessElement::new).collect(Collectors.toList()))
+			)).toArray(CompletableFuture[]::new)).get(1000, TimeUnit.MILLISECONDS);
+		}
+		catch (ExecutionException | TimeoutException | InterruptedException e) {
+			LanguageServerPlugin.logError(e);
+		}
+
 		return res.toArray(new QuickAccessElement[res.size()]);
 	}