diff --git a/headless-services/spring-boot-language-server/src/main/java/org/springframework/ide/vscode/boot/app/SpringSymbolIndex.java b/headless-services/spring-boot-language-server/src/main/java/org/springframework/ide/vscode/boot/app/SpringSymbolIndex.java index af2e36fa6..43a69bb93 100644 --- a/headless-services/spring-boot-language-server/src/main/java/org/springframework/ide/vscode/boot/app/SpringSymbolIndex.java +++ b/headless-services/spring-boot-language-server/src/main/java/org/springframework/ide/vscode/boot/app/SpringSymbolIndex.java @@ -175,13 +175,16 @@ public class SpringSymbolIndex implements InitializingBean { this.updateDocument(docURI, content, "didSave event"); } }); - config.addListener(evt -> { - this.configureIndexer(SymbolIndexConfig.builder() - .scanXml(config.isSpringXMLSupportEnabled()) - .xmlScanFoldersGlobs(config.xmlBeansFoldersToScan()) - .scanTestJavaSources(config.isScanJavaTestSourcesEnabled()) - .build()); - }); + config.addListener(evt -> + server.getAsync().execute(() -> + configureIndexer(SymbolIndexConfig.builder() + .scanXml(config.isSpringXMLSupportEnabled()) + .xmlScanFoldersGlobs(config.xmlBeansFoldersToScan()) + .scanTestJavaSources(config.isScanJavaTestSourcesEnabled()) + .build() + ) + ) + ); server.doOnInitialized(this::serverInitialized); server.onShutdown(this::shutdown); } @@ -200,44 +203,40 @@ public class SpringSymbolIndex implements InitializingBean { }); } - public CompletableFuture configureIndexer(SymbolIndexConfig config) { - List> futuresList = new ArrayList<>(); + public void configureIndexer(SymbolIndexConfig config) { synchronized (this) { if (config.isScanXml() && !(Arrays.asList(this.indexers).contains(springIndexerXML))) { - this.indexers = new SpringIndexer[] {springIndexerJava, springIndexerXML}; - futuresList.add(server.getAsync().execute(() -> { - springIndexerXML.setScanFolderGlobs(config.getXmlScanFoldersGlobs()); - List globPattern = Arrays.asList(springIndexerXML.getFileWatchPatterns()); - watchXMLDeleteRegistration = getWorkspaceService().getFileObserver().onFileDeleted(globPattern, (file) -> { - deleteDocument(new TextDocumentIdentifier(file).getUri()); - }); - watchXMLCreatedRegistration = getWorkspaceService().getFileObserver().onFileCreated(globPattern, (file) -> { - createDocument(new TextDocumentIdentifier(file).getUri()); - }); - watchXMLChangedRegistration = getWorkspaceService().getFileObserver().onFileChanged(globPattern, (file) -> { - updateDocument(new TextDocumentIdentifier(file).getUri(), null, "xml changed"); - }); - })); - } - else if (!config.isScanXml() && Arrays.asList(this.indexers).contains(springIndexerXML)) { - this.indexers = new SpringIndexer[] {springIndexerJava}; - futuresList.add(server.getAsync().execute(() -> { - springIndexerXML.setScanFolderGlobs(new String[0]); + this.indexers = new SpringIndexer[] { springIndexerJava, springIndexerXML }; + springIndexerXML.setScanFolderGlobs(config.getXmlScanFoldersGlobs()); + List globPattern = Arrays.asList(springIndexerXML.getFileWatchPatterns()); + watchXMLDeleteRegistration = getWorkspaceService().getFileObserver().onFileDeleted(globPattern, + (file) -> { + deleteDocument(new TextDocumentIdentifier(file).getUri()); + }); + watchXMLCreatedRegistration = getWorkspaceService().getFileObserver().onFileCreated(globPattern, + (file) -> { + createDocument(new TextDocumentIdentifier(file).getUri()); + }); + watchXMLChangedRegistration = getWorkspaceService().getFileObserver().onFileChanged(globPattern, + (file) -> { + updateDocument(new TextDocumentIdentifier(file).getUri(), null, "xml changed"); + }); + } else if (!config.isScanXml() && Arrays.asList(this.indexers).contains(springIndexerXML)) { + this.indexers = new SpringIndexer[] { springIndexerJava }; + springIndexerXML.setScanFolderGlobs(new String[0]); - getWorkspaceService().getFileObserver().unsubscribe(watchXMLChangedRegistration); - getWorkspaceService().getFileObserver().unsubscribe(watchXMLCreatedRegistration); - getWorkspaceService().getFileObserver().unsubscribe(watchXMLDeleteRegistration); + getWorkspaceService().getFileObserver().unsubscribe(watchXMLChangedRegistration); + getWorkspaceService().getFileObserver().unsubscribe(watchXMLCreatedRegistration); + getWorkspaceService().getFileObserver().unsubscribe(watchXMLDeleteRegistration); - watchXMLChangedRegistration = null; - watchXMLCreatedRegistration = null; - watchXMLDeleteRegistration = null; - })); + watchXMLChangedRegistration = null; + watchXMLCreatedRegistration = null; + watchXMLDeleteRegistration = null; } else if (config.isScanXml()) { - futuresList.add(CompletableFuture.runAsync(() -> springIndexerXML.setScanFolderGlobs(config.getXmlScanFoldersGlobs()))); + springIndexerXML.setScanFolderGlobs(config.getXmlScanFoldersGlobs()); } - futuresList.add(server.getAsync().execute(() -> springIndexerJava.setScanTestJavaSources(config.isScanTestJavaSources()))); + springIndexerJava.setScanTestJavaSources(config.isScanTestJavaSources()); } - return CompletableFuture.allOf(futuresList.toArray(new CompletableFuture[futuresList.size()])); } public void shutdown() { diff --git a/headless-services/spring-boot-language-server/src/test/java/org/springframework/ide/vscode/boot/java/utils/test/SpringIndexerMultiProjectTest.java b/headless-services/spring-boot-language-server/src/test/java/org/springframework/ide/vscode/boot/java/utils/test/SpringIndexerMultiProjectTest.java index 56044b0b3..0271f5bba 100644 --- a/headless-services/spring-boot-language-server/src/test/java/org/springframework/ide/vscode/boot/java/utils/test/SpringIndexerMultiProjectTest.java +++ b/headless-services/spring-boot-language-server/src/test/java/org/springframework/ide/vscode/boot/java/utils/test/SpringIndexerMultiProjectTest.java @@ -53,7 +53,7 @@ public class SpringIndexerMultiProjectTest { @Before public void setup() throws Exception { harness.intialize(null); - indexer.configureIndexer(SymbolIndexConfig.builder().scanXml(false).build()).get(5, TimeUnit.SECONDS); + indexer.configureIndexer(SymbolIndexConfig.builder().scanXml(false).build()); projectUri1 = UriUtil.toUri(new File(ProjectsHarness.class.getResource("/test-projects/test-annotation-indexing-large-multiproject-1/").toURI())).toString(); projectFinder.find(new TextDocumentIdentifier(projectUri1)).get(); diff --git a/headless-services/spring-boot-language-server/src/test/java/org/springframework/ide/vscode/boot/java/utils/test/SpringIndexerTest.java b/headless-services/spring-boot-language-server/src/test/java/org/springframework/ide/vscode/boot/java/utils/test/SpringIndexerTest.java index 1e7442148..9ecf79d58 100644 --- a/headless-services/spring-boot-language-server/src/test/java/org/springframework/ide/vscode/boot/java/utils/test/SpringIndexerTest.java +++ b/headless-services/spring-boot-language-server/src/test/java/org/springframework/ide/vscode/boot/java/utils/test/SpringIndexerTest.java @@ -60,7 +60,7 @@ public class SpringIndexerTest { @Before public void setup() throws Exception { harness.intialize(null); - indexer.configureIndexer(SymbolIndexConfig.builder().scanXml(false).build()).get(5, TimeUnit.SECONDS);; + indexer.configureIndexer(SymbolIndexConfig.builder().scanXml(false).build()); directory = new File(ProjectsHarness.class.getResource("/test-projects/test-annotation-indexing-parent/test-annotation-indexing/").toURI()); projectDir = directory.toURI().toString(); @@ -96,14 +96,14 @@ public class SpringIndexerTest { @Test public void testScanTestJavaSources() throws Exception { - indexer.configureIndexer(SymbolIndexConfig.builder().scanTestJavaSources(true).build()).get(1, TimeUnit.SECONDS); + indexer.configureIndexer(SymbolIndexConfig.builder().scanTestJavaSources(true).build()); List allSymbols = indexer.getAllSymbols(""); assertEquals(8, allSymbols.size()); String docUri = directory.toPath().resolve("src/test/java/demo/ApplicationTests.java").toUri().toString(); assertTrue(containsSymbol(allSymbols, "@SpringBootTest", docUri, 8, 0, 8, 15)); - indexer.configureIndexer(SymbolIndexConfig.builder().scanTestJavaSources(false).build()).get(1, TimeUnit.SECONDS); + indexer.configureIndexer(SymbolIndexConfig.builder().scanTestJavaSources(false).build()); allSymbols = indexer.getAllSymbols(""); assertEquals(7, allSymbols.size()); assertFalse(containsSymbol(allSymbols, "@SpringBootTest", docUri, 8, 0, 8, 15)); diff --git a/headless-services/spring-boot-language-server/src/test/java/org/springframework/ide/vscode/boot/java/utils/test/SpringIndexerXMLProjectTest.java b/headless-services/spring-boot-language-server/src/test/java/org/springframework/ide/vscode/boot/java/utils/test/SpringIndexerXMLProjectTest.java index d1d30fd88..c7f4f247d 100644 --- a/headless-services/spring-boot-language-server/src/test/java/org/springframework/ide/vscode/boot/java/utils/test/SpringIndexerXMLProjectTest.java +++ b/headless-services/spring-boot-language-server/src/test/java/org/springframework/ide/vscode/boot/java/utils/test/SpringIndexerXMLProjectTest.java @@ -59,8 +59,7 @@ public class SpringIndexerXMLProjectTest { indexer.configureIndexer(SymbolIndexConfig.builder() .scanXml(true) .xmlScanFoldersGlobs(new String[] { "**/src/main/**", "**/config" }) - .build()) - .get(5, TimeUnit.SECONDS);; + .build()); project = projects.mavenProject("test-annotation-indexing-xml-project"); harness.useProject(project); @@ -124,40 +123,35 @@ public class SpringIndexerXMLProjectTest { indexer.configureIndexer(SymbolIndexConfig.builder() .scanXml(true) - .build()) - .get(2, TimeUnit.SECONDS);; + .build()); allSymbols = indexer.getAllSymbols(""); assertEquals(0, allSymbols.size()); indexer.configureIndexer(SymbolIndexConfig.builder() .scanXml(true) .xmlScanFoldersGlobs(new String[] { "**/src/main/**" }) - .build()) - .get(2, TimeUnit.SECONDS); + .build()); allSymbols = indexer.getAllSymbols(""); assertEquals(1, allSymbols.size()); indexer.configureIndexer(SymbolIndexConfig.builder() .scanXml(true) .xmlScanFoldersGlobs(new String[] { "**/config", "**/src/main/**" }) - .build()) - .get(2, TimeUnit.SECONDS); + .build()); allSymbols = indexer.getAllSymbols(""); assertEquals(5, allSymbols.size()); indexer.configureIndexer(SymbolIndexConfig.builder() .scanXml(true) .xmlScanFoldersGlobs(new String[] { "**/config" }) - .build()) - .get(2, TimeUnit.SECONDS); + .build()); allSymbols = indexer.getAllSymbols(""); assertEquals(4, allSymbols.size()); indexer.configureIndexer(SymbolIndexConfig.builder() .scanXml(false) .xmlScanFoldersGlobs(new String[] { "**/config", "**/src/main/**" }) - .build()) - .get(2, TimeUnit.SECONDS); + .build()); allSymbols = indexer.getAllSymbols(""); assertEquals(0, allSymbols.size()); }