renamed annotation indexer and changed to lazy init mode
This commit is contained in:
@@ -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) {
|
||||
|
||||
@@ -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;
|
||||
|
||||
@@ -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());
|
||||
}
|
||||
|
||||
|
||||
@@ -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();
|
||||
}
|
||||
|
||||
|
||||
@@ -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);
|
||||
}
|
||||
|
||||
@@ -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);
|
||||
|
||||
@@ -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);
|
||||
|
||||
Reference in New Issue
Block a user