renamed annotation indexer and changed to lazy init mode

This commit is contained in:
Martin Lippert
2017-09-18 15:02:36 +02:00
parent 399d496b57
commit 50a318c569
7 changed files with 107 additions and 42 deletions

View File

@@ -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<String, SymbolProvider> 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) {

View File

@@ -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;

View File

@@ -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<? extends SymbolInformation> handle(DocumentSymbolParams params) {
Path root = this.server.getWorkspaceRoot();
indexer.reset();
indexer.scanFiles(root.toFile());
return indexer.getSymbols(params.getTextDocument().getUri());
}

View File

@@ -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<? extends SymbolInformation> handle(WorkspaceSymbolParams params) {
Path root = this.server.getWorkspaceRoot();
indexer.reset();
indexer.scanFiles(root.toFile());
return indexer.getAllSymbols();
}

View File

@@ -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<String, SymbolProvider> symbolProviders;
private List<SymbolInformation> symbols;
private ConcurrentMap<String, List<SymbolInformation>> symbolsByDoc;
public AnnotationIndexer(JavaProjectFinder projectFinder, Map<String, SymbolProvider> specificProviders) {
private CompletableFuture<Void> initializeTask;
public SpringIndexer(SimpleLanguageServer server, JavaProjectFinder projectFinder, Map<String, SymbolProvider> 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<? extends SymbolInformation> getAllSymbols() {
initialize();
return this.symbols;
}
public List<? extends SymbolInformation> getSymbols(String docURI) {
initialize();
return this.symbolsByDoc.get(docURI);
}

View File

@@ -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<String, SymbolProvider> symbolProviders;
private JavaProjectFinder projectFinder;
private LanguageServerHarness<BootJavaLanguageServer> 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<BootJavaLanguageServer>(new Callable<BootJavaLanguageServer>() {
@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);

View File

@@ -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<String, SymbolProvider> symbolProviders;
private JavaProjectFinder projectFinder;
private LanguageServerHarness<BootJavaLanguageServer> 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<BootJavaLanguageServer>(new Callable<BootJavaLanguageServer>() {
@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);