diff --git a/headless-services/spring-boot-language-server/src/main/java/org/springframework/ide/vscode/boot/java/utils/SpringIndexerXML.java b/headless-services/spring-boot-language-server/src/main/java/org/springframework/ide/vscode/boot/java/utils/SpringIndexerXML.java index 917255f20..d85982975 100644 --- a/headless-services/spring-boot-language-server/src/main/java/org/springframework/ide/vscode/boot/java/utils/SpringIndexerXML.java +++ b/headless-services/spring-boot-language-server/src/main/java/org/springframework/ide/vscode/boot/java/utils/SpringIndexerXML.java @@ -11,9 +11,14 @@ package org.springframework.ide.vscode.boot.java.utils; import java.io.File; +import java.io.IOException; import java.net.URI; +import java.nio.file.FileVisitResult; +import java.nio.file.FileVisitor; import java.nio.file.Files; +import java.nio.file.Path; import java.nio.file.Paths; +import java.nio.file.attribute.BasicFileAttributes; import java.util.ArrayList; import java.util.List; import java.util.Map; @@ -34,6 +39,8 @@ import org.springframework.ide.vscode.commons.java.IJavaProject; import org.springframework.ide.vscode.commons.util.UriUtil; import org.springframework.ide.vscode.commons.util.text.TextDocument; +import com.google.common.collect.ImmutableList; + /** * @author Martin Lippert */ @@ -181,11 +188,37 @@ public class SpringIndexerXML implements SpringIndexer { } private String[] getFiles(IJavaProject project) throws Exception { - return Files.walk(Paths.get(project.getLocationUri())) - .filter(path -> path.getFileName().toString().endsWith(".xml")) - .filter(Files::isRegularFile) - .map(path -> path.toAbsolutePath().toString()) - .toArray(String[]::new); + List outputFolders = IClasspathUtil.getOutputFolders(project.getClasspath()).map(f -> f.toPath()).collect(Collectors.toList()); + ImmutableList.Builder builder = ImmutableList.builder(); + Files.walkFileTree(Paths.get(project.getLocationUri()), new FileVisitor() { + + @Override + public FileVisitResult preVisitDirectory(Path dir, BasicFileAttributes attrs) throws IOException { + return outputFolders.contains(dir) ? FileVisitResult.SKIP_SUBTREE : FileVisitResult.CONTINUE; + } + + @Override + public FileVisitResult visitFile(Path file, BasicFileAttributes attrs) throws IOException { + String fileName = file.getFileName().toString(); + if (fileName.endsWith(".xml") && !"pom.xml".equals(fileName)) { + builder.add(file.toAbsolutePath().toString()); + } + return FileVisitResult.CONTINUE; + } + + @Override + public FileVisitResult visitFileFailed(Path file, IOException exc) throws IOException { + return FileVisitResult.CONTINUE; + } + + @Override + public FileVisitResult postVisitDirectory(Path dir, IOException exc) throws IOException { + return FileVisitResult.CONTINUE; + } + }); + + ImmutableList list = builder.build(); + return list.toArray(new String[list.size()]); } private SymbolCacheKey getCacheKey(IJavaProject project) { 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 13d0515b0..a1d80e415 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 @@ -70,13 +70,16 @@ public class SpringIndexerXMLProjectTest { public void testScanningSimpleSpringXMLConfig() throws Exception { List allSymbols = indexer.getAllSymbols(""); - assertEquals(4, allSymbols.size()); + assertEquals(5, allSymbols.size()); String docUri = directory.toPath().resolve("config/simple-spring-config.xml").toUri().toString(); assertTrue(containsSymbol(allSymbols, "@+ 'transactionManager' DataSourceTransactionManager", docUri, 6, 14, 6, 37)); assertTrue(containsSymbol(allSymbols, "@+ 'jdbcTemplate' JdbcTemplate", docUri, 8, 14, 8, 31)); assertTrue(containsSymbol(allSymbols, "@+ 'namedParameterJdbcTemplate' NamedParameterJdbcTemplate", docUri, 12, 14, 12, 45)); assertTrue(containsSymbol(allSymbols, "@+ 'persistenceExceptionTranslationPostProcessor' PersistenceExceptionTranslationPostProcessor", docUri, 18, 10, 18, 97)); + + String beansOnClasspathDocUri = directory.toPath().resolve("src/main/resources/beans.xml").toUri().toString(); + assertTrue(containsSymbol(allSymbols, "@+ 'sb' SimpleBean", beansOnClasspathDocUri, 6, 14, 6, 21)); } private boolean containsSymbol(List symbols, String name, String uri, int startLine, int startCHaracter, int endLine, int endCharacter) { diff --git a/headless-services/spring-boot-language-server/src/test/resources/test-projects/test-annotation-indexing-xml-project/src/main/java/org/test/SimpleBean.java b/headless-services/spring-boot-language-server/src/test/resources/test-projects/test-annotation-indexing-xml-project/src/main/java/org/test/SimpleBean.java new file mode 100644 index 000000000..b52669005 --- /dev/null +++ b/headless-services/spring-boot-language-server/src/test/resources/test-projects/test-annotation-indexing-xml-project/src/main/java/org/test/SimpleBean.java @@ -0,0 +1,5 @@ +package org.test; + +public class SimpleBean { + +} diff --git a/headless-services/spring-boot-language-server/src/test/resources/test-projects/test-annotation-indexing-xml-project/src/main/resources/beans.xml b/headless-services/spring-boot-language-server/src/test/resources/test-projects/test-annotation-indexing-xml-project/src/main/resources/beans.xml new file mode 100644 index 000000000..00213c918 --- /dev/null +++ b/headless-services/spring-boot-language-server/src/test/resources/test-projects/test-annotation-indexing-xml-project/src/main/resources/beans.xml @@ -0,0 +1,12 @@ + + + + + + + + +