From 50a318c56932dc09deb890b1d109027abb6933af Mon Sep 17 00:00:00 2001 From: Martin Lippert Date: Mon, 18 Sep 2017 15:02:36 +0200 Subject: [PATCH] renamed annotation indexer and changed to lazy init mode --- .../boot/java/BootJavaLanguageServer.java | 12 +++--- .../java/beans/ComponentSymbolProvider.java | 1 - .../BootJavaDocumentSymbolHandler.java | 15 ++----- .../BootJavaWorkspaceSymbolHandler.java | 15 ++----- ...otationIndexer.java => SpringIndexer.java} | 41 ++++++++++++++++++- ...sTest.java => SpringIndexerBeansTest.java} | 29 +++++++++++-- ...ndexerTest.java => SpringIndexerTest.java} | 36 +++++++++++++--- 7 files changed, 107 insertions(+), 42 deletions(-) rename headless-services/boot-java-language-server/src/main/java/org/springframework/ide/vscode/boot/java/utils/{AnnotationIndexer.java => SpringIndexer.java} (86%) rename headless-services/boot-java-language-server/src/test/java/org/springframework/ide/vscode/boot/java/utils/test/{AnnotationIndexerBeansTest.java => SpringIndexerBeansTest.java} (76%) rename headless-services/boot-java-language-server/src/test/java/org/springframework/ide/vscode/boot/java/utils/test/{AnnotationIndexerTest.java => SpringIndexerTest.java} (83%) diff --git a/headless-services/boot-java-language-server/src/main/java/org/springframework/ide/vscode/boot/java/BootJavaLanguageServer.java b/headless-services/boot-java-language-server/src/main/java/org/springframework/ide/vscode/boot/java/BootJavaLanguageServer.java index 434620d08..70b6fdd42 100644 --- a/headless-services/boot-java-language-server/src/main/java/org/springframework/ide/vscode/boot/java/BootJavaLanguageServer.java +++ b/headless-services/boot-java-language-server/src/main/java/org/springframework/ide/vscode/boot/java/BootJavaLanguageServer.java @@ -29,7 +29,7 @@ import org.springframework.ide.vscode.boot.java.handlers.SymbolProvider; import org.springframework.ide.vscode.boot.java.requestmapping.RequestMappingHoverProvider; import org.springframework.ide.vscode.boot.java.requestmapping.RequestMappingSymbolProvider; import org.springframework.ide.vscode.boot.java.scope.ScopeCompletionProcessor; -import org.springframework.ide.vscode.boot.java.utils.AnnotationIndexer; +import org.springframework.ide.vscode.boot.java.utils.SpringIndexer; import org.springframework.ide.vscode.boot.java.value.ValueCompletionProcessor; import org.springframework.ide.vscode.boot.java.value.ValueHoverProvider; import org.springframework.ide.vscode.boot.java.value.ValuePropertyReferencesProvider; @@ -90,9 +90,9 @@ public class BootJavaLanguageServer extends SimpleLanguageServer { ReferencesHandler referencesHandler = createReferenceHandler(this, javaProjectFinder); documents.onReferences(referencesHandler); - AnnotationIndexer indexer = createAnnotationIndexer(this, javaProjectFinder); - documents.onDocumentSymbol(new BootJavaDocumentSymbolHandler(this, indexer)); - workspaceService.onWorkspaceSymbol(new BootJavaWorkspaceSymbolHandler(this, indexer)); + SpringIndexer indexer = createAnnotationIndexer(this, javaProjectFinder); + documents.onDocumentSymbol(new BootJavaDocumentSymbolHandler(indexer)); + workspaceService.onWorkspaceSymbol(new BootJavaWorkspaceSymbolHandler(indexer)); BootJavaCodeLensEngine codeLensHandler = createCodeLensEngine(this, javaProjectFinder); documents.onCodeLens(codeLensHandler::createCodeLenses); @@ -125,7 +125,7 @@ public class BootJavaLanguageServer extends SimpleLanguageServer { return new BootJavaHoverProvider(this, javaProjectFinder, providers); } - protected AnnotationIndexer createAnnotationIndexer(SimpleLanguageServer server, JavaProjectFinder projectFinder) { + protected SpringIndexer createAnnotationIndexer(SimpleLanguageServer server, JavaProjectFinder projectFinder) { HashMap providers = new HashMap<>(); providers.put(org.springframework.ide.vscode.boot.java.requestmapping.Constants.SPRING_REQUEST_MAPPING, new RequestMappingSymbolProvider()); providers.put(org.springframework.ide.vscode.boot.java.requestmapping.Constants.SPRING_GET_MAPPING, new RequestMappingSymbolProvider()); @@ -137,7 +137,7 @@ public class BootJavaLanguageServer extends SimpleLanguageServer { providers.put(org.springframework.ide.vscode.boot.java.beans.Constants.SPRING_BEAN, new BeansSymbolProvider()); providers.put(org.springframework.ide.vscode.boot.java.beans.Constants.SPRING_COMPONENT, new ComponentSymbolProvider()); - return new AnnotationIndexer(projectFinder, providers); + return new SpringIndexer(this, projectFinder, providers); } protected ReferencesHandler createReferenceHandler(SimpleLanguageServer server, JavaProjectFinder projectFinder) { diff --git a/headless-services/boot-java-language-server/src/main/java/org/springframework/ide/vscode/boot/java/beans/ComponentSymbolProvider.java b/headless-services/boot-java-language-server/src/main/java/org/springframework/ide/vscode/boot/java/beans/ComponentSymbolProvider.java index 13f9bc6b0..f17880ad1 100644 --- a/headless-services/boot-java-language-server/src/main/java/org/springframework/ide/vscode/boot/java/beans/ComponentSymbolProvider.java +++ b/headless-services/boot-java-language-server/src/main/java/org/springframework/ide/vscode/boot/java/beans/ComponentSymbolProvider.java @@ -12,7 +12,6 @@ package org.springframework.ide.vscode.boot.java.beans; import org.eclipse.jdt.core.dom.ASTNode; import org.eclipse.jdt.core.dom.Annotation; -import org.eclipse.jdt.core.dom.MethodDeclaration; import org.eclipse.jdt.core.dom.TypeDeclaration; import org.eclipse.lsp4j.Location; import org.eclipse.lsp4j.SymbolInformation; diff --git a/headless-services/boot-java-language-server/src/main/java/org/springframework/ide/vscode/boot/java/handlers/BootJavaDocumentSymbolHandler.java b/headless-services/boot-java-language-server/src/main/java/org/springframework/ide/vscode/boot/java/handlers/BootJavaDocumentSymbolHandler.java index ce0cd5b8b..b92ca2b6c 100644 --- a/headless-services/boot-java-language-server/src/main/java/org/springframework/ide/vscode/boot/java/handlers/BootJavaDocumentSymbolHandler.java +++ b/headless-services/boot-java-language-server/src/main/java/org/springframework/ide/vscode/boot/java/handlers/BootJavaDocumentSymbolHandler.java @@ -10,35 +10,26 @@ *******************************************************************************/ package org.springframework.ide.vscode.boot.java.handlers; -import java.nio.file.Path; import java.util.List; import org.eclipse.lsp4j.DocumentSymbolParams; import org.eclipse.lsp4j.SymbolInformation; -import org.springframework.ide.vscode.boot.java.utils.AnnotationIndexer; +import org.springframework.ide.vscode.boot.java.utils.SpringIndexer; import org.springframework.ide.vscode.commons.languageserver.util.DocumentSymbolHandler; -import org.springframework.ide.vscode.commons.languageserver.util.SimpleLanguageServer; /** * @author Martin Lippert */ public class BootJavaDocumentSymbolHandler implements DocumentSymbolHandler { - private SimpleLanguageServer server; - private AnnotationIndexer indexer; + private SpringIndexer indexer; - public BootJavaDocumentSymbolHandler(SimpleLanguageServer server, AnnotationIndexer indexer) { - this.server = server; + public BootJavaDocumentSymbolHandler(SpringIndexer indexer) { this.indexer = indexer; } @Override public List handle(DocumentSymbolParams params) { - Path root = this.server.getWorkspaceRoot(); - - indexer.reset(); - indexer.scanFiles(root.toFile()); - return indexer.getSymbols(params.getTextDocument().getUri()); } diff --git a/headless-services/boot-java-language-server/src/main/java/org/springframework/ide/vscode/boot/java/handlers/BootJavaWorkspaceSymbolHandler.java b/headless-services/boot-java-language-server/src/main/java/org/springframework/ide/vscode/boot/java/handlers/BootJavaWorkspaceSymbolHandler.java index 0845d49fa..f1293f80b 100644 --- a/headless-services/boot-java-language-server/src/main/java/org/springframework/ide/vscode/boot/java/handlers/BootJavaWorkspaceSymbolHandler.java +++ b/headless-services/boot-java-language-server/src/main/java/org/springframework/ide/vscode/boot/java/handlers/BootJavaWorkspaceSymbolHandler.java @@ -10,13 +10,11 @@ *******************************************************************************/ package org.springframework.ide.vscode.boot.java.handlers; -import java.nio.file.Path; import java.util.List; import org.eclipse.lsp4j.SymbolInformation; import org.eclipse.lsp4j.WorkspaceSymbolParams; -import org.springframework.ide.vscode.boot.java.utils.AnnotationIndexer; -import org.springframework.ide.vscode.commons.languageserver.util.SimpleLanguageServer; +import org.springframework.ide.vscode.boot.java.utils.SpringIndexer; import org.springframework.ide.vscode.commons.languageserver.util.WorkspaceSymbolHandler; /** @@ -24,21 +22,14 @@ import org.springframework.ide.vscode.commons.languageserver.util.WorkspaceSymbo */ public class BootJavaWorkspaceSymbolHandler implements WorkspaceSymbolHandler { - private SimpleLanguageServer server; - private AnnotationIndexer indexer; + private SpringIndexer indexer; - public BootJavaWorkspaceSymbolHandler(SimpleLanguageServer server, AnnotationIndexer indexer) { - this.server = server; + public BootJavaWorkspaceSymbolHandler(SpringIndexer indexer) { this.indexer = indexer; } @Override public List handle(WorkspaceSymbolParams params) { - Path root = this.server.getWorkspaceRoot(); - - indexer.reset(); - indexer.scanFiles(root.toFile()); - return indexer.getAllSymbols(); } diff --git a/headless-services/boot-java-language-server/src/main/java/org/springframework/ide/vscode/boot/java/utils/AnnotationIndexer.java b/headless-services/boot-java-language-server/src/main/java/org/springframework/ide/vscode/boot/java/utils/SpringIndexer.java similarity index 86% rename from headless-services/boot-java-language-server/src/main/java/org/springframework/ide/vscode/boot/java/utils/AnnotationIndexer.java rename to headless-services/boot-java-language-server/src/main/java/org/springframework/ide/vscode/boot/java/utils/SpringIndexer.java index 53fcc4c29..59d68e966 100644 --- a/headless-services/boot-java-language-server/src/main/java/org/springframework/ide/vscode/boot/java/utils/AnnotationIndexer.java +++ b/headless-services/boot-java-language-server/src/main/java/org/springframework/ide/vscode/boot/java/utils/SpringIndexer.java @@ -18,8 +18,11 @@ import java.nio.file.Paths; import java.util.ArrayList; import java.util.List; import java.util.Map; +import java.util.concurrent.CompletableFuture; import java.util.concurrent.ConcurrentHashMap; import java.util.concurrent.ConcurrentMap; +import java.util.concurrent.ExecutionException; +import java.util.concurrent.FutureTask; import java.util.stream.Collectors; import java.util.stream.Stream; @@ -41,21 +44,26 @@ import org.springframework.ide.vscode.boot.java.handlers.SymbolProvider; import org.springframework.ide.vscode.commons.java.IClasspath; import org.springframework.ide.vscode.commons.java.IJavaProject; import org.springframework.ide.vscode.commons.languageserver.java.JavaProjectFinder; +import org.springframework.ide.vscode.commons.languageserver.util.SimpleLanguageServer; import org.springframework.ide.vscode.commons.util.text.LanguageId; import org.springframework.ide.vscode.commons.util.text.TextDocument; /** * @author Martin Lippert */ -public class AnnotationIndexer { +public class SpringIndexer { + private SimpleLanguageServer server; private JavaProjectFinder projectFinder; private Map symbolProviders; private List symbols; private ConcurrentMap> symbolsByDoc; - public AnnotationIndexer(JavaProjectFinder projectFinder, Map specificProviders) { + private CompletableFuture initializeTask; + + public SpringIndexer(SimpleLanguageServer server, JavaProjectFinder projectFinder, Map specificProviders) { + this.server = server; this.projectFinder = projectFinder; this.symbolProviders = specificProviders; @@ -63,16 +71,45 @@ public class AnnotationIndexer { this.symbolsByDoc = new ConcurrentHashMap<>(); } + public void initialize() { + synchronized(this) { + if (this.initializeTask == null) { + this.initializeTask = CompletableFuture.runAsync(new Runnable() { + @Override + public void run() { + System.out.println("start initial scan..."); + Path workspaceRoot = server.getWorkspaceRoot(); + reset(); + scanFiles(workspaceRoot.toFile()); + System.out.println("initial scan done...!!!"); + } + }); + } + } + + try { + this.initializeTask.get(); + } catch (Exception e) { + e.printStackTrace(); + } + } + public void reset() { this.symbols.clear(); this.symbolsByDoc.clear(); } + public void updateDocument(String docURI) { + // TODO: update information because of doc change + } + public List getAllSymbols() { + initialize(); return this.symbols; } public List getSymbols(String docURI) { + initialize(); return this.symbolsByDoc.get(docURI); } diff --git a/headless-services/boot-java-language-server/src/test/java/org/springframework/ide/vscode/boot/java/utils/test/AnnotationIndexerBeansTest.java b/headless-services/boot-java-language-server/src/test/java/org/springframework/ide/vscode/boot/java/utils/test/SpringIndexerBeansTest.java similarity index 76% rename from headless-services/boot-java-language-server/src/test/java/org/springframework/ide/vscode/boot/java/utils/test/AnnotationIndexerBeansTest.java rename to headless-services/boot-java-language-server/src/test/java/org/springframework/ide/vscode/boot/java/utils/test/SpringIndexerBeansTest.java index 155d4d7ee..f75038224 100644 --- a/headless-services/boot-java-language-server/src/test/java/org/springframework/ide/vscode/boot/java/utils/test/AnnotationIndexerBeansTest.java +++ b/headless-services/boot-java-language-server/src/test/java/org/springframework/ide/vscode/boot/java/utils/test/SpringIndexerBeansTest.java @@ -18,29 +18,35 @@ import java.util.HashMap; import java.util.Iterator; import java.util.List; import java.util.Map; +import java.util.concurrent.Callable; import org.eclipse.lsp4j.SymbolInformation; import org.junit.Before; import org.junit.Test; +import org.springframework.ide.vscode.boot.java.BootJavaLanguageServer; import org.springframework.ide.vscode.boot.java.beans.BeansSymbolProvider; import org.springframework.ide.vscode.boot.java.beans.ComponentSymbolProvider; import org.springframework.ide.vscode.boot.java.beans.Constants; import org.springframework.ide.vscode.boot.java.handlers.SymbolProvider; -import org.springframework.ide.vscode.boot.java.utils.AnnotationIndexer; +import org.springframework.ide.vscode.boot.java.utils.SpringIndexer; import org.springframework.ide.vscode.commons.languageserver.java.DefaultJavaProjectFinder; import org.springframework.ide.vscode.commons.languageserver.java.IJavaProjectFinderStrategy; import org.springframework.ide.vscode.commons.languageserver.java.JavaProjectFinder; import org.springframework.ide.vscode.commons.maven.MavenCore; import org.springframework.ide.vscode.commons.maven.MavenProjectFinderStrategy; +import org.springframework.ide.vscode.languageserver.testharness.LanguageServerHarness; import org.springframework.ide.vscode.project.harness.ProjectsHarness; +import org.springframework.ide.vscode.project.harness.PropertyIndexHarness; /** * @author Martin Lippert */ -public class AnnotationIndexerBeansTest { +public class SpringIndexerBeansTest { private Map symbolProviders; private JavaProjectFinder projectFinder; + private LanguageServerHarness harness; + private PropertyIndexHarness indexHarness; @Before public void setup() throws Exception { @@ -49,11 +55,26 @@ public class AnnotationIndexerBeansTest { symbolProviders.put(Constants.SPRING_COMPONENT, new ComponentSymbolProvider()); projectFinder = new DefaultJavaProjectFinder(new IJavaProjectFinderStrategy[] {new MavenProjectFinderStrategy(MavenCore.getDefault())}); + + indexHarness = new PropertyIndexHarness(); + harness = new LanguageServerHarness(new Callable() { + @Override + public BootJavaLanguageServer call() throws Exception { + BootJavaLanguageServer server = new BootJavaLanguageServer(projectFinder, indexHarness.getIndexProvider()); + return server; + } + }) { + @Override + protected String getFileExtension() { + return ".java"; + } + }; + harness.intialize(new File(ProjectsHarness.class.getResource("/test-projects/test-annotation-indexing-beans/").toURI())); } @Test public void testScanSimpleConfigurationClass() throws Exception { - AnnotationIndexer indexer = new AnnotationIndexer(projectFinder, symbolProviders); + SpringIndexer indexer = new SpringIndexer(harness.getServer(), projectFinder, symbolProviders); File directory = new File(ProjectsHarness.class.getResource("/test-projects/test-annotation-indexing-beans/").toURI()); indexer.scanFiles(directory); @@ -65,7 +86,7 @@ public class AnnotationIndexerBeansTest { @Test public void testScanSimpleComponentClass() throws Exception { - AnnotationIndexer indexer = new AnnotationIndexer(projectFinder, symbolProviders); + SpringIndexer indexer = new SpringIndexer(harness.getServer(), projectFinder, symbolProviders); File directory = new File(ProjectsHarness.class.getResource("/test-projects/test-annotation-indexing-beans/").toURI()); indexer.scanFiles(directory); diff --git a/headless-services/boot-java-language-server/src/test/java/org/springframework/ide/vscode/boot/java/utils/test/AnnotationIndexerTest.java b/headless-services/boot-java-language-server/src/test/java/org/springframework/ide/vscode/boot/java/utils/test/SpringIndexerTest.java similarity index 83% rename from headless-services/boot-java-language-server/src/test/java/org/springframework/ide/vscode/boot/java/utils/test/AnnotationIndexerTest.java rename to headless-services/boot-java-language-server/src/test/java/org/springframework/ide/vscode/boot/java/utils/test/SpringIndexerTest.java index 884428ad5..b838d2d5b 100644 --- a/headless-services/boot-java-language-server/src/test/java/org/springframework/ide/vscode/boot/java/utils/test/AnnotationIndexerTest.java +++ b/headless-services/boot-java-language-server/src/test/java/org/springframework/ide/vscode/boot/java/utils/test/SpringIndexerTest.java @@ -18,28 +18,34 @@ import java.util.HashMap; import java.util.Iterator; import java.util.List; import java.util.Map; +import java.util.concurrent.Callable; import org.eclipse.lsp4j.SymbolInformation; import org.junit.Before; import org.junit.Test; +import org.springframework.ide.vscode.boot.java.BootJavaLanguageServer; import org.springframework.ide.vscode.boot.java.handlers.SymbolProvider; import org.springframework.ide.vscode.boot.java.requestmapping.Constants; import org.springframework.ide.vscode.boot.java.requestmapping.RequestMappingSymbolProvider; -import org.springframework.ide.vscode.boot.java.utils.AnnotationIndexer; +import org.springframework.ide.vscode.boot.java.utils.SpringIndexer; import org.springframework.ide.vscode.commons.languageserver.java.DefaultJavaProjectFinder; import org.springframework.ide.vscode.commons.languageserver.java.IJavaProjectFinderStrategy; import org.springframework.ide.vscode.commons.languageserver.java.JavaProjectFinder; import org.springframework.ide.vscode.commons.maven.MavenCore; import org.springframework.ide.vscode.commons.maven.MavenProjectFinderStrategy; +import org.springframework.ide.vscode.languageserver.testharness.LanguageServerHarness; import org.springframework.ide.vscode.project.harness.ProjectsHarness; +import org.springframework.ide.vscode.project.harness.PropertyIndexHarness; /** * @author Martin Lippert */ -public class AnnotationIndexerTest { +public class SpringIndexerTest { private Map symbolProviders; private JavaProjectFinder projectFinder; + private LanguageServerHarness harness; + private PropertyIndexHarness indexHarness; @Before public void setup() throws Exception { @@ -47,11 +53,27 @@ public class AnnotationIndexerTest { symbolProviders.put(Constants.SPRING_REQUEST_MAPPING, new RequestMappingSymbolProvider()); projectFinder = new DefaultJavaProjectFinder(new IJavaProjectFinderStrategy[] {new MavenProjectFinderStrategy(MavenCore.getDefault())}); + + indexHarness = new PropertyIndexHarness(); + harness = new LanguageServerHarness(new Callable() { + @Override + public BootJavaLanguageServer call() throws Exception { + BootJavaLanguageServer server = new BootJavaLanguageServer(projectFinder, indexHarness.getIndexProvider()); + return server; + } + }) { + @Override + protected String getFileExtension() { + return ".java"; + } + }; } @Test public void testScanningAllAnnotationsSimpleProjectUpfront() throws Exception { - AnnotationIndexer indexer = new AnnotationIndexer(projectFinder, symbolProviders); + harness.intialize(new File(ProjectsHarness.class.getResource("/test-projects/test-annotation-indexing-parent/test-annotation-indexing/").toURI())); + + SpringIndexer indexer = new SpringIndexer(harness.getServer(), projectFinder, symbolProviders); File directory = new File(ProjectsHarness.class.getResource("/test-projects/test-annotation-indexing-parent/test-annotation-indexing/").toURI()); indexer.scanFiles(directory); @@ -73,7 +95,9 @@ public class AnnotationIndexerTest { @Test public void testRetrievingSymbolsPerDocument() throws Exception { - AnnotationIndexer indexer = new AnnotationIndexer(projectFinder, symbolProviders); + harness.intialize(new File(ProjectsHarness.class.getResource("/test-projects/test-annotation-indexing-parent/test-annotation-indexing/").toURI())); + + SpringIndexer indexer = new SpringIndexer(harness.getServer(), projectFinder, symbolProviders); File directory = new File(ProjectsHarness.class.getResource("/test-projects/test-annotation-indexing-parent/test-annotation-indexing/").toURI()); indexer.scanFiles(directory); @@ -98,7 +122,9 @@ public class AnnotationIndexerTest { @Test public void testScanningAllAnnotationsMultiModuleProjectUpfront() throws Exception { - AnnotationIndexer indexer = new AnnotationIndexer(projectFinder, symbolProviders); + harness.intialize(new File(ProjectsHarness.class.getResource("/test-projects/test-annotation-indexing-parent/").toURI())); + + SpringIndexer indexer = new SpringIndexer(harness.getServer(), projectFinder, symbolProviders); File directory = new File(ProjectsHarness.class.getResource("/test-projects/test-annotation-indexing-parent/").toURI()); indexer.scanFiles(directory);