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.RequestMappingHoverProvider;
import org.springframework.ide.vscode.boot.java.requestmapping.RequestMappingSymbolProvider; 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.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.ValueCompletionProcessor;
import org.springframework.ide.vscode.boot.java.value.ValueHoverProvider; import org.springframework.ide.vscode.boot.java.value.ValueHoverProvider;
import org.springframework.ide.vscode.boot.java.value.ValuePropertyReferencesProvider; import org.springframework.ide.vscode.boot.java.value.ValuePropertyReferencesProvider;
@@ -90,9 +90,9 @@ public class BootJavaLanguageServer extends SimpleLanguageServer {
ReferencesHandler referencesHandler = createReferenceHandler(this, javaProjectFinder); ReferencesHandler referencesHandler = createReferenceHandler(this, javaProjectFinder);
documents.onReferences(referencesHandler); documents.onReferences(referencesHandler);
AnnotationIndexer indexer = createAnnotationIndexer(this, javaProjectFinder); SpringIndexer indexer = createAnnotationIndexer(this, javaProjectFinder);
documents.onDocumentSymbol(new BootJavaDocumentSymbolHandler(this, indexer)); documents.onDocumentSymbol(new BootJavaDocumentSymbolHandler(indexer));
workspaceService.onWorkspaceSymbol(new BootJavaWorkspaceSymbolHandler(this, indexer)); workspaceService.onWorkspaceSymbol(new BootJavaWorkspaceSymbolHandler(indexer));
BootJavaCodeLensEngine codeLensHandler = createCodeLensEngine(this, javaProjectFinder); BootJavaCodeLensEngine codeLensHandler = createCodeLensEngine(this, javaProjectFinder);
documents.onCodeLens(codeLensHandler::createCodeLenses); documents.onCodeLens(codeLensHandler::createCodeLenses);
@@ -125,7 +125,7 @@ public class BootJavaLanguageServer extends SimpleLanguageServer {
return new BootJavaHoverProvider(this, javaProjectFinder, providers); 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<>(); 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_REQUEST_MAPPING, new RequestMappingSymbolProvider());
providers.put(org.springframework.ide.vscode.boot.java.requestmapping.Constants.SPRING_GET_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_BEAN, new BeansSymbolProvider());
providers.put(org.springframework.ide.vscode.boot.java.beans.Constants.SPRING_COMPONENT, new ComponentSymbolProvider()); 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) { 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.ASTNode;
import org.eclipse.jdt.core.dom.Annotation; import org.eclipse.jdt.core.dom.Annotation;
import org.eclipse.jdt.core.dom.MethodDeclaration;
import org.eclipse.jdt.core.dom.TypeDeclaration; import org.eclipse.jdt.core.dom.TypeDeclaration;
import org.eclipse.lsp4j.Location; import org.eclipse.lsp4j.Location;
import org.eclipse.lsp4j.SymbolInformation; import org.eclipse.lsp4j.SymbolInformation;

View File

@@ -10,35 +10,26 @@
*******************************************************************************/ *******************************************************************************/
package org.springframework.ide.vscode.boot.java.handlers; package org.springframework.ide.vscode.boot.java.handlers;
import java.nio.file.Path;
import java.util.List; import java.util.List;
import org.eclipse.lsp4j.DocumentSymbolParams; import org.eclipse.lsp4j.DocumentSymbolParams;
import org.eclipse.lsp4j.SymbolInformation; 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.DocumentSymbolHandler;
import org.springframework.ide.vscode.commons.languageserver.util.SimpleLanguageServer;
/** /**
* @author Martin Lippert * @author Martin Lippert
*/ */
public class BootJavaDocumentSymbolHandler implements DocumentSymbolHandler { public class BootJavaDocumentSymbolHandler implements DocumentSymbolHandler {
private SimpleLanguageServer server; private SpringIndexer indexer;
private AnnotationIndexer indexer;
public BootJavaDocumentSymbolHandler(SimpleLanguageServer server, AnnotationIndexer indexer) { public BootJavaDocumentSymbolHandler(SpringIndexer indexer) {
this.server = server;
this.indexer = indexer; this.indexer = indexer;
} }
@Override @Override
public List<? extends SymbolInformation> handle(DocumentSymbolParams params) { public List<? extends SymbolInformation> handle(DocumentSymbolParams params) {
Path root = this.server.getWorkspaceRoot();
indexer.reset();
indexer.scanFiles(root.toFile());
return indexer.getSymbols(params.getTextDocument().getUri()); return indexer.getSymbols(params.getTextDocument().getUri());
} }

View File

@@ -10,13 +10,11 @@
*******************************************************************************/ *******************************************************************************/
package org.springframework.ide.vscode.boot.java.handlers; package org.springframework.ide.vscode.boot.java.handlers;
import java.nio.file.Path;
import java.util.List; import java.util.List;
import org.eclipse.lsp4j.SymbolInformation; import org.eclipse.lsp4j.SymbolInformation;
import org.eclipse.lsp4j.WorkspaceSymbolParams; import org.eclipse.lsp4j.WorkspaceSymbolParams;
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.SimpleLanguageServer;
import org.springframework.ide.vscode.commons.languageserver.util.WorkspaceSymbolHandler; 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 { public class BootJavaWorkspaceSymbolHandler implements WorkspaceSymbolHandler {
private SimpleLanguageServer server; private SpringIndexer indexer;
private AnnotationIndexer indexer;
public BootJavaWorkspaceSymbolHandler(SimpleLanguageServer server, AnnotationIndexer indexer) { public BootJavaWorkspaceSymbolHandler(SpringIndexer indexer) {
this.server = server;
this.indexer = indexer; this.indexer = indexer;
} }
@Override @Override
public List<? extends SymbolInformation> handle(WorkspaceSymbolParams params) { public List<? extends SymbolInformation> handle(WorkspaceSymbolParams params) {
Path root = this.server.getWorkspaceRoot();
indexer.reset();
indexer.scanFiles(root.toFile());
return indexer.getAllSymbols(); return indexer.getAllSymbols();
} }

View File

@@ -18,8 +18,11 @@ import java.nio.file.Paths;
import java.util.ArrayList; import java.util.ArrayList;
import java.util.List; import java.util.List;
import java.util.Map; import java.util.Map;
import java.util.concurrent.CompletableFuture;
import java.util.concurrent.ConcurrentHashMap; import java.util.concurrent.ConcurrentHashMap;
import java.util.concurrent.ConcurrentMap; import java.util.concurrent.ConcurrentMap;
import java.util.concurrent.ExecutionException;
import java.util.concurrent.FutureTask;
import java.util.stream.Collectors; import java.util.stream.Collectors;
import java.util.stream.Stream; 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.IClasspath;
import org.springframework.ide.vscode.commons.java.IJavaProject; import org.springframework.ide.vscode.commons.java.IJavaProject;
import org.springframework.ide.vscode.commons.languageserver.java.JavaProjectFinder; 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.LanguageId;
import org.springframework.ide.vscode.commons.util.text.TextDocument; import org.springframework.ide.vscode.commons.util.text.TextDocument;
/** /**
* @author Martin Lippert * @author Martin Lippert
*/ */
public class AnnotationIndexer { public class SpringIndexer {
private SimpleLanguageServer server;
private JavaProjectFinder projectFinder; private JavaProjectFinder projectFinder;
private Map<String, SymbolProvider> symbolProviders; private Map<String, SymbolProvider> symbolProviders;
private List<SymbolInformation> symbols; private List<SymbolInformation> symbols;
private ConcurrentMap<String, List<SymbolInformation>> symbolsByDoc; 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.projectFinder = projectFinder;
this.symbolProviders = specificProviders; this.symbolProviders = specificProviders;
@@ -63,16 +71,45 @@ public class AnnotationIndexer {
this.symbolsByDoc = new ConcurrentHashMap<>(); 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() { public void reset() {
this.symbols.clear(); this.symbols.clear();
this.symbolsByDoc.clear(); this.symbolsByDoc.clear();
} }
public void updateDocument(String docURI) {
// TODO: update information because of doc change
}
public List<? extends SymbolInformation> getAllSymbols() { public List<? extends SymbolInformation> getAllSymbols() {
initialize();
return this.symbols; return this.symbols;
} }
public List<? extends SymbolInformation> getSymbols(String docURI) { public List<? extends SymbolInformation> getSymbols(String docURI) {
initialize();
return this.symbolsByDoc.get(docURI); return this.symbolsByDoc.get(docURI);
} }

View File

@@ -18,29 +18,35 @@ import java.util.HashMap;
import java.util.Iterator; import java.util.Iterator;
import java.util.List; import java.util.List;
import java.util.Map; import java.util.Map;
import java.util.concurrent.Callable;
import org.eclipse.lsp4j.SymbolInformation; import org.eclipse.lsp4j.SymbolInformation;
import org.junit.Before; import org.junit.Before;
import org.junit.Test; 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.BeansSymbolProvider;
import org.springframework.ide.vscode.boot.java.beans.ComponentSymbolProvider; 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.beans.Constants;
import org.springframework.ide.vscode.boot.java.handlers.SymbolProvider; 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.DefaultJavaProjectFinder;
import org.springframework.ide.vscode.commons.languageserver.java.IJavaProjectFinderStrategy; import org.springframework.ide.vscode.commons.languageserver.java.IJavaProjectFinderStrategy;
import org.springframework.ide.vscode.commons.languageserver.java.JavaProjectFinder; import org.springframework.ide.vscode.commons.languageserver.java.JavaProjectFinder;
import org.springframework.ide.vscode.commons.maven.MavenCore; import org.springframework.ide.vscode.commons.maven.MavenCore;
import org.springframework.ide.vscode.commons.maven.MavenProjectFinderStrategy; 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.ProjectsHarness;
import org.springframework.ide.vscode.project.harness.PropertyIndexHarness;
/** /**
* @author Martin Lippert * @author Martin Lippert
*/ */
public class AnnotationIndexerBeansTest { public class SpringIndexerBeansTest {
private Map<String, SymbolProvider> symbolProviders; private Map<String, SymbolProvider> symbolProviders;
private JavaProjectFinder projectFinder; private JavaProjectFinder projectFinder;
private LanguageServerHarness<BootJavaLanguageServer> harness;
private PropertyIndexHarness indexHarness;
@Before @Before
public void setup() throws Exception { public void setup() throws Exception {
@@ -49,11 +55,26 @@ public class AnnotationIndexerBeansTest {
symbolProviders.put(Constants.SPRING_COMPONENT, new ComponentSymbolProvider()); symbolProviders.put(Constants.SPRING_COMPONENT, new ComponentSymbolProvider());
projectFinder = new DefaultJavaProjectFinder(new IJavaProjectFinderStrategy[] {new MavenProjectFinderStrategy(MavenCore.getDefault())}); 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 @Test
public void testScanSimpleConfigurationClass() throws Exception { 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()); File directory = new File(ProjectsHarness.class.getResource("/test-projects/test-annotation-indexing-beans/").toURI());
indexer.scanFiles(directory); indexer.scanFiles(directory);
@@ -65,7 +86,7 @@ public class AnnotationIndexerBeansTest {
@Test @Test
public void testScanSimpleComponentClass() throws Exception { 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()); File directory = new File(ProjectsHarness.class.getResource("/test-projects/test-annotation-indexing-beans/").toURI());
indexer.scanFiles(directory); indexer.scanFiles(directory);

View File

@@ -18,28 +18,34 @@ import java.util.HashMap;
import java.util.Iterator; import java.util.Iterator;
import java.util.List; import java.util.List;
import java.util.Map; import java.util.Map;
import java.util.concurrent.Callable;
import org.eclipse.lsp4j.SymbolInformation; import org.eclipse.lsp4j.SymbolInformation;
import org.junit.Before; import org.junit.Before;
import org.junit.Test; 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.handlers.SymbolProvider;
import org.springframework.ide.vscode.boot.java.requestmapping.Constants; 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.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.DefaultJavaProjectFinder;
import org.springframework.ide.vscode.commons.languageserver.java.IJavaProjectFinderStrategy; import org.springframework.ide.vscode.commons.languageserver.java.IJavaProjectFinderStrategy;
import org.springframework.ide.vscode.commons.languageserver.java.JavaProjectFinder; import org.springframework.ide.vscode.commons.languageserver.java.JavaProjectFinder;
import org.springframework.ide.vscode.commons.maven.MavenCore; import org.springframework.ide.vscode.commons.maven.MavenCore;
import org.springframework.ide.vscode.commons.maven.MavenProjectFinderStrategy; 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.ProjectsHarness;
import org.springframework.ide.vscode.project.harness.PropertyIndexHarness;
/** /**
* @author Martin Lippert * @author Martin Lippert
*/ */
public class AnnotationIndexerTest { public class SpringIndexerTest {
private Map<String, SymbolProvider> symbolProviders; private Map<String, SymbolProvider> symbolProviders;
private JavaProjectFinder projectFinder; private JavaProjectFinder projectFinder;
private LanguageServerHarness<BootJavaLanguageServer> harness;
private PropertyIndexHarness indexHarness;
@Before @Before
public void setup() throws Exception { public void setup() throws Exception {
@@ -47,11 +53,27 @@ public class AnnotationIndexerTest {
symbolProviders.put(Constants.SPRING_REQUEST_MAPPING, new RequestMappingSymbolProvider()); symbolProviders.put(Constants.SPRING_REQUEST_MAPPING, new RequestMappingSymbolProvider());
projectFinder = new DefaultJavaProjectFinder(new IJavaProjectFinderStrategy[] {new MavenProjectFinderStrategy(MavenCore.getDefault())}); 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 @Test
public void testScanningAllAnnotationsSimpleProjectUpfront() throws Exception { 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()); File directory = new File(ProjectsHarness.class.getResource("/test-projects/test-annotation-indexing-parent/test-annotation-indexing/").toURI());
indexer.scanFiles(directory); indexer.scanFiles(directory);
@@ -73,7 +95,9 @@ public class AnnotationIndexerTest {
@Test @Test
public void testRetrievingSymbolsPerDocument() throws Exception { 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()); File directory = new File(ProjectsHarness.class.getResource("/test-projects/test-annotation-indexing-parent/test-annotation-indexing/").toURI());
indexer.scanFiles(directory); indexer.scanFiles(directory);
@@ -98,7 +122,9 @@ public class AnnotationIndexerTest {
@Test @Test
public void testScanningAllAnnotationsMultiModuleProjectUpfront() throws Exception { 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()); File directory = new File(ProjectsHarness.class.getResource("/test-projects/test-annotation-indexing-parent/").toURI());
indexer.scanFiles(directory); indexer.scanFiles(directory);