Skip to content

Commit 23eff6d

Browse files
committed
GH-1425: refactored indexer mechanics to mostly work on indexer model elements instead of concrete bean objects
1 parent 1863a16 commit 23eff6d

File tree

10 files changed

+45
-47
lines changed

10 files changed

+45
-47
lines changed

headless-services/commons/commons-lsp-extensions/src/main/java/org/springframework/ide/vscode/commons/protocol/spring/SpringIndexElement.java

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -15,5 +15,8 @@
1515
public interface SpringIndexElement {
1616

1717
List<SpringIndexElement> getChildren();
18+
19+
void addChild(SpringIndexElement child);
20+
void removeChild(SpringIndexElement doc);
1821

1922
}

headless-services/spring-boot-language-server/src/main/java/org/springframework/ide/vscode/boot/app/SpringSymbolIndex.java

Lines changed: 13 additions & 18 deletions
Original file line numberDiff line numberDiff line change
@@ -25,6 +25,7 @@
2525
import java.util.Iterator;
2626
import java.util.List;
2727
import java.util.Map;
28+
import java.util.Map.Entry;
2829
import java.util.Optional;
2930
import java.util.Set;
3031
import java.util.concurrent.CompletableFuture;
@@ -83,6 +84,7 @@
8384
import org.springframework.ide.vscode.commons.protocol.spring.BeansParams;
8485
import org.springframework.ide.vscode.commons.protocol.spring.MatchingBeansParams;
8586
import org.springframework.ide.vscode.commons.protocol.spring.SpringIndex;
87+
import org.springframework.ide.vscode.commons.protocol.spring.SpringIndexElement;
8688
import org.springframework.ide.vscode.commons.util.Futures;
8789
import org.springframework.ide.vscode.commons.util.StringUtil;
8890
import org.springframework.ide.vscode.commons.util.UriUtil;
@@ -166,15 +168,15 @@ public void afterPropertiesSet() throws Exception {
166168

167169
SymbolHandler handler = new SymbolHandler() {
168170
@Override
169-
public void addSymbols(IJavaProject project, String docURI, EnhancedSymbolInformation[] enhancedSymbols, Bean[] beanDefinitions,
171+
public void addSymbols(IJavaProject project, String docURI, EnhancedSymbolInformation[] enhancedSymbols, List<SpringIndexElement> beanDefinitions,
170172
List<Diagnostic> diagnostics) {
171173

172174
if (enhancedSymbols != null) {
173175
SpringSymbolIndex.this.addSymbolsByDoc(project, docURI, enhancedSymbols);
174176
}
175177

176178
if (beanDefinitions != null) {
177-
springIndex.updateBeans(project.getElementName(), docURI, beanDefinitions);
179+
springIndex.updateElements(project.getElementName(), docURI, beanDefinitions.toArray(SpringIndexElement[]::new));
178180
}
179181

180182
if (diagnostics != null) {
@@ -185,7 +187,7 @@ public void addSymbols(IJavaProject project, String docURI, EnhancedSymbolInform
185187

186188
@Override
187189
public void addSymbols(IJavaProject project, EnhancedSymbolInformation[] enhancedSymbols,
188-
Bean[] beanDefinitions, Map<String, List<Diagnostic>> diagnosticsPerDoc) {
190+
Map<String, List<SpringIndexElement>> beanDefinitionsByDoc, Map<String, List<Diagnostic>> diagnosticsPerDoc) {
189191

190192
if (enhancedSymbols != null) {
191193

@@ -207,21 +209,14 @@ public void addSymbols(IJavaProject project, EnhancedSymbolInformation[] enhance
207209
}
208210
}
209211

210-
if (beanDefinitions != null) {
212+
if (beanDefinitionsByDoc != null) {
211213

212-
// organize beans per doc URI
213-
Map<String, List<Bean>> beansPerDoc = new HashMap<>();
214-
for (Bean bean : beanDefinitions) {
215-
String docURI = bean.getLocation().getUri();
216-
beansPerDoc.computeIfAbsent(docURI, k -> new ArrayList<>()).add(bean);
217-
}
218-
219214
// add beans per doc URI
220-
for (Map.Entry<String, List<Bean>> entry : beansPerDoc.entrySet()) {
215+
for (Entry<String, List<SpringIndexElement>> entry : beanDefinitionsByDoc.entrySet()) {
221216
String docURI = entry.getKey();
222-
List<Bean> beans = entry.getValue();
217+
List<SpringIndexElement> elements = entry.getValue();
223218

224-
springIndex.updateBeans(project.getElementName(), docURI, (Bean[]) beans.toArray(new Bean[beans.size()]));
219+
springIndex.updateElements(project.getElementName(), docURI, elements.toArray(SpringIndexElement[]::new));
225220
}
226221
}
227222

@@ -236,7 +231,7 @@ public void addSymbols(IJavaProject project, EnhancedSymbolInformation[] enhance
236231
@Override
237232
public void removeSymbols(IJavaProject project, String docURI) {
238233
SpringSymbolIndex.this.removeSymbolsByDoc(project, docURI);
239-
springIndex.removeBeans(project.getElementName(), docURI);
234+
springIndex.removeElements(project.getElementName(), docURI);
240235

241236
// TODO remove diagnostics ?!? maybe, maybe not
242237

@@ -394,7 +389,7 @@ private CompletableFuture<Void> _initializeProject(IJavaProject project, boolean
394389
// clean future
395390
futures[0] = CompletableFuture.runAsync(() -> {
396391
removeSymbolsByProject(project);
397-
springIndex.removeBeans(project.getElementName());
392+
springIndex.removeProject(project.getElementName());
398393
}, this.updateQueue);
399394

400395
// index futures
@@ -920,7 +915,7 @@ public void run() {
920915
try {
921916
for (String doc : this.docURIs) {
922917
removeSymbolsByDoc(project, doc);
923-
springIndex.removeBeans(project.getElementName(), doc);
918+
springIndex.removeElements(project.getElementName(), doc);
924919
}
925920

926921
for (SpringIndexer index : this.indexer) {
@@ -952,7 +947,7 @@ public void run() {
952947
for (SpringIndexer index : this.indexer) {
953948
index.removeProject(project);
954949
}
955-
springIndex.removeBeans(project.getElementName());
950+
springIndex.removeProject(project.getElementName());
956951
server.getClient().indexUpdated();
957952

958953
log.debug("{} completed", this);

headless-services/spring-boot-language-server/src/main/java/org/springframework/ide/vscode/boot/index/SpringMetamodelIndex.java

Lines changed: 4 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -56,23 +56,23 @@ public void updateBeans(String projectName, Bean[] beanDefinitions) {
5656
projectRootElements.put(projectName, projectRoot);
5757
}
5858

59-
public void updateBeans(String projectName, String docURI, Bean[] beanDefinitions) {
59+
public void updateElements(String projectName, String docURI, SpringIndexElement[] beanDefinitions) {
6060
ProjectElement project = this.projectRootElements.computeIfAbsent(projectName, name -> new ProjectElement(name));
6161
project.removeDocument(docURI);
6262

6363
DocumentElement document = new DocumentElement(docURI);
64-
for (Bean bean : beanDefinitions) {
64+
for (SpringIndexElement bean : beanDefinitions) {
6565
document.addChild(bean);
6666
}
6767

6868
project.addChild(document);
6969
}
7070

71-
public void removeBeans(String projectName) {
71+
public void removeProject(String projectName) {
7272
projectRootElements.remove(projectName);
7373
}
7474

75-
public void removeBeans(String projectName, String docURI) {
75+
public void removeElements(String projectName, String docURI) {
7676
ProjectElement project = projectRootElements.get(projectName);
7777
if (project != null) {
7878
project.removeDocument(docURI);
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,5 @@
11
/*******************************************************************************
2-
* Copyright (c) 2023 VMware, Inc.
2+
* Copyright (c) 2023, 2025 VMware, Inc.
33
* All rights reserved. This program and the accompanying materials
44
* are made available under the terms of the Eclipse Public License v1.0
55
* which accompanies this distribution, and is available at
@@ -11,19 +11,19 @@
1111
package org.springframework.ide.vscode.boot.java.beans;
1212

1313
import org.springframework.ide.vscode.boot.index.cache.AbstractIndexCacheable;
14-
import org.springframework.ide.vscode.commons.protocol.spring.Bean;
14+
import org.springframework.ide.vscode.commons.protocol.spring.SpringIndexElement;
1515

1616
public class CachedBean extends AbstractIndexCacheable {
1717

18-
private final Bean bean;
18+
private final SpringIndexElement element;
1919

20-
public CachedBean(String docURI, Bean bean) {
20+
public CachedBean(String docURI, SpringIndexElement bean) {
2121
super(docURI);
22-
this.bean = bean;
22+
this.element = bean;
2323
}
2424

25-
public Bean getBean() {
26-
return this.bean;
25+
public SpringIndexElement getBean() {
26+
return this.element;
2727
}
2828

2929
}

headless-services/spring-boot-language-server/src/main/java/org/springframework/ide/vscode/boot/java/utils/SpringIndexerJava.java

Lines changed: 4 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -72,7 +72,7 @@
7272
import org.springframework.ide.vscode.commons.languageserver.reconcile.IProblemCollector;
7373
import org.springframework.ide.vscode.commons.languageserver.reconcile.ReconcileProblem;
7474
import org.springframework.ide.vscode.commons.protocol.java.Classpath;
75-
import org.springframework.ide.vscode.commons.protocol.spring.Bean;
75+
import org.springframework.ide.vscode.commons.protocol.spring.SpringIndexElement;
7676
import org.springframework.ide.vscode.commons.util.UriUtil;
7777
import org.springframework.ide.vscode.commons.util.text.TextDocument;
7878

@@ -320,7 +320,7 @@ public void accept(String docURI, Diagnostic diagnostic) {
320320
// dependencyTracker.dump();
321321

322322
EnhancedSymbolInformation[] symbols = generatedSymbols.stream().map(cachedSymbol -> cachedSymbol.getEnhancedSymbol()).toArray(EnhancedSymbolInformation[]::new);
323-
Bean[] beans = generatedBeans.stream().filter(cachedBean -> cachedBean.getBean() != null).map(cachedBean -> cachedBean.getBean()).toArray(Bean[]::new);
323+
List<SpringIndexElement> beans = generatedBeans.stream().filter(cachedBean -> cachedBean.getBean() != null).map(cachedBean -> cachedBean.getBean()).toList();
324324
List<Diagnostic> diagnostics = generatedDiagnostics.stream().filter(cachedDiagnostics -> cachedDiagnostics.getDiagnostic() != null).map(cachedDiagnostic -> cachedDiagnostic.getDiagnostic()).collect(Collectors.toList());
325325

326326
symbolHandler.addSymbols(project, docURI, symbols, beans, diagnostics);
@@ -436,7 +436,7 @@ public void acceptAST(String sourceFilePath, CompilationUnit cu) {
436436
}
437437

438438
EnhancedSymbolInformation[] symbols = generatedSymbols.stream().map(cachedSymbol -> cachedSymbol.getEnhancedSymbol()).toArray(EnhancedSymbolInformation[]::new);
439-
Bean[] beans = generatedBeans.stream().filter(cachedBean -> cachedBean.getBean() != null).map(cachedBean -> cachedBean.getBean()).toArray(Bean[]::new);
439+
Map<String, List<SpringIndexElement>> beans = generatedBeans.stream().filter(cachedBean -> cachedBean.getBean() != null).collect(Collectors.groupingBy(CachedBean::getDocURI, Collectors.mapping(CachedBean::getBean, Collectors.toList())));
440440
Map<String, List<Diagnostic>> diagnosticsByDoc = generatedDiagnostics.stream().filter(cachedDiagnostic -> cachedDiagnostic.getDiagnostic() != null).collect(Collectors.groupingBy(CachedDiagnostics::getDocURI, Collectors.mapping(CachedDiagnostics::getDiagnostic, Collectors.toList())));
441441
addEmptyDiagnostics(diagnosticsByDoc, javaFiles);
442442
symbolHandler.addSymbols(project, symbols, beans, diagnosticsByDoc);
@@ -548,7 +548,7 @@ public void accept(String docURI, Diagnostic diagnostic) {
548548

549549
if (symbols != null && beans != null) {
550550
EnhancedSymbolInformation[] enhancedSymbols = Arrays.stream(symbols).map(cachedSymbol -> cachedSymbol.getEnhancedSymbol()).toArray(EnhancedSymbolInformation[]::new);
551-
Bean[] allBeans = Arrays.stream(beans).filter(cachedBean -> cachedBean.getBean() != null).map(cachedBean -> cachedBean.getBean()).toArray(Bean[]::new);
551+
Map<String, List<SpringIndexElement>> allBeans = Arrays.stream(beans).filter(cachedBean -> cachedBean.getBean() != null).collect(Collectors.groupingBy(CachedBean::getDocURI, Collectors.mapping(CachedBean::getBean, Collectors.toList())));
552552
Map<String, List<Diagnostic>> diagnosticsByDoc = Arrays.stream(diagnostics).filter(cachedDiagnostic -> cachedDiagnostic.getDiagnostic() != null).collect(Collectors.groupingBy(CachedDiagnostics::getDocURI, Collectors.mapping(CachedDiagnostics::getDiagnostic, Collectors.toList())));
553553
addEmptyDiagnostics(diagnosticsByDoc, javaFiles);
554554
symbolHandler.addSymbols(project, enhancedSymbols, allBeans, diagnosticsByDoc);

headless-services/spring-boot-language-server/src/main/java/org/springframework/ide/vscode/boot/java/utils/SpringIndexerXML.java

Lines changed: 4 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -41,7 +41,7 @@
4141
import org.springframework.ide.vscode.commons.java.IClasspathUtil;
4242
import org.springframework.ide.vscode.commons.java.IJavaProject;
4343
import org.springframework.ide.vscode.commons.languageserver.java.JavaProjectFinder;
44-
import org.springframework.ide.vscode.commons.protocol.spring.Bean;
44+
import org.springframework.ide.vscode.commons.protocol.spring.SpringIndexElement;
4545
import org.springframework.ide.vscode.commons.util.UriUtil;
4646
import org.springframework.ide.vscode.commons.util.text.TextDocument;
4747

@@ -142,7 +142,7 @@ public void initializeProject(IJavaProject project, boolean clean) throws Except
142142

143143
if (symbols != null && beans != null) {
144144
EnhancedSymbolInformation[] enhancedSymbols = Arrays.stream(symbols).map(cachedSymbol -> cachedSymbol.getEnhancedSymbol()).toArray(EnhancedSymbolInformation[]::new);
145-
Bean[] allBeans = Arrays.stream(beans).filter(cachedBean -> cachedBean.getBean() != null).map(cachedBean -> cachedBean.getBean()).toArray(Bean[]::new);
145+
Map<String, List<SpringIndexElement>> allBeans = Arrays.stream(beans).filter(cachedBean -> cachedBean.getBean() != null).collect(Collectors.groupingBy(CachedBean::getDocURI, Collectors.mapping(CachedBean::getBean, Collectors.toList())));
146146
symbolHandler.addSymbols(project, enhancedSymbols, allBeans, null);
147147
}
148148

@@ -180,7 +180,7 @@ public void updateFile(IJavaProject project, DocumentDescriptor updatedDoc, Stri
180180
this.cache.update(beansCacheKey, file, updatedDoc.getLastModified(), generatedBeans, null, CachedBean.class);
181181

182182
EnhancedSymbolInformation[] symbols = generatedSymbols.stream().map(cachedSymbol -> cachedSymbol.getEnhancedSymbol()).toArray(EnhancedSymbolInformation[]::new);
183-
Bean[] beans = generatedBeans.stream().filter(cachedBean -> cachedBean.getBean() != null).map(cachedBean -> cachedBean.getBean()).toArray(Bean[]::new);
183+
List<SpringIndexElement> beans = generatedBeans.stream().filter(cachedBean -> cachedBean.getBean() != null).map(cachedBean -> cachedBean.getBean()).toList();
184184
symbolHandler.addSymbols(project, docURI, symbols, beans, null);
185185
}
186186

@@ -207,7 +207,7 @@ public void updateFiles(IJavaProject project, DocumentDescriptor[] updatedDocs)
207207
this.cache.update(beansCacheKey, file, updatedDoc.getLastModified(), generatedBeans, null, CachedBean.class);
208208

209209
EnhancedSymbolInformation[] symbols = generatedSymbols.stream().map(cachedSymbol -> cachedSymbol.getEnhancedSymbol()).toArray(EnhancedSymbolInformation[]::new);
210-
Bean[] beans = generatedBeans.stream().filter(cachedBean -> cachedBean.getBean() != null).map(cachedBean -> cachedBean.getBean()).toArray(Bean[]::new);
210+
List<SpringIndexElement> beans = generatedBeans.stream().filter(cachedBean -> cachedBean.getBean() != null).map(cachedBean -> cachedBean.getBean()).toList();
211211
symbolHandler.addSymbols(project, docURI, symbols, beans, null);
212212
}
213213
}

headless-services/spring-boot-language-server/src/main/java/org/springframework/ide/vscode/boot/java/utils/SymbolHandler.java

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -16,15 +16,15 @@
1616
import org.eclipse.lsp4j.Diagnostic;
1717
import org.springframework.ide.vscode.boot.java.handlers.EnhancedSymbolInformation;
1818
import org.springframework.ide.vscode.commons.java.IJavaProject;
19-
import org.springframework.ide.vscode.commons.protocol.spring.Bean;
19+
import org.springframework.ide.vscode.commons.protocol.spring.SpringIndexElement;
2020

2121
/**
2222
* @author Martin Lippert
2323
*/
2424
public interface SymbolHandler {
2525

26-
void addSymbols(IJavaProject project, String docURI, EnhancedSymbolInformation[] enhancedSymbols, Bean[] beanDefinitions, List<Diagnostic> diagnostics);
27-
void addSymbols(IJavaProject project, EnhancedSymbolInformation[] enhancedSymbols, Bean[] beanDefinitions, Map<String, List<Diagnostic>> diagnosticsByDoc);
26+
void addSymbols(IJavaProject project, String docURI, EnhancedSymbolInformation[] enhancedSymbols, List<SpringIndexElement> beanDefinitions, List<Diagnostic> diagnostics);
27+
void addSymbols(IJavaProject project, EnhancedSymbolInformation[] enhancedSymbols, Map<String, List<SpringIndexElement>> beanDefinitionsByDoc, Map<String, List<Diagnostic>> diagnosticsByDoc);
2828

2929
void removeSymbols(IJavaProject project, String docURI);
3030

headless-services/spring-boot-language-server/src/test/java/org/springframework/ide/vscode/boot/index/test/SpringMetamodelIndexTest.java

Lines changed: 5 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -136,13 +136,13 @@ void testUpdateBeansForSpecificDoc() {
136136
Bean bean2 = new Bean("beanName2", "beanType", locationForDoc1, emptyInjectionPoints, emptySupertypes, emptyAnnotations, false);
137137
Bean bean3 = new Bean("beanName3", "beanType", locationForDoc2, emptyInjectionPoints, emptySupertypes, emptyAnnotations, false);
138138

139-
index.updateBeans("someProject", locationForDoc1.getUri(), new Bean[] {bean1, bean2});
140-
index.updateBeans("someProject", locationForDoc2.getUri(), new Bean[] {bean3});
139+
index.updateElements("someProject", locationForDoc1.getUri(), new Bean[] {bean1, bean2});
140+
index.updateElements("someProject", locationForDoc2.getUri(), new Bean[] {bean3});
141141

142142
Bean updatedBean1 = new Bean("updated1", "beanType", locationForDoc1, emptyInjectionPoints, emptySupertypes, emptyAnnotations, false);
143143
Bean updatedBean2 = new Bean("updated2", "beanType", locationForDoc1, emptyInjectionPoints, emptySupertypes, emptyAnnotations, false);
144144

145-
index.updateBeans("someProject", locationForDoc1.getUri(), new Bean[] {updatedBean1, updatedBean2});
145+
index.updateElements("someProject", locationForDoc1.getUri(), new Bean[] {updatedBean1, updatedBean2});
146146

147147
Bean[] beans = index.getBeansOfProject("someProject");
148148
assertNotNull(beans);
@@ -192,7 +192,7 @@ void testRemoveAllBeansForSpecificProject() {
192192
index.updateBeans("someProject1", new Bean[] {bean1, bean2});
193193
index.updateBeans("someProject2", new Bean[] {bean3});
194194

195-
index.removeBeans("someProject1");
195+
index.removeProject("someProject1");
196196

197197
Bean[] beans = index.getBeansOfProject("someProject2");
198198
assertNotNull(beans);
@@ -214,7 +214,7 @@ void testRemoveAllBeansForSpecificDocument() {
214214
Bean bean3 = new Bean("beanName3", "beanType", locationForDoc2, emptyInjectionPoints, emptySupertypes, emptyAnnotations, false);
215215

216216
index.updateBeans("someProject", new Bean[] {bean1, bean2, bean3});
217-
index.removeBeans("someProject", locationForDoc1.getUri());
217+
index.removeElements("someProject", locationForDoc1.getUri());
218218

219219
Bean[] beans = index.getBeansOfProject("someProject");
220220
assertNotNull(beans);

headless-services/spring-boot-language-server/src/test/java/org/springframework/ide/vscode/boot/java/beans/test/DependsOnDefinitionProviderTest.java

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -143,7 +143,7 @@ public class TestDependsOnClass {
143143

144144
List<Bean> beansOfDoc = new ArrayList<>(List.of(springIndex.getBeansOfDocument(expectedDefinitionUri)));
145145
beansOfDoc.add(new Bean("bean1", "type", new Location(expectedDefinitionUri, new Range(new Position(20, 1), new Position(20, 10))), null, null, null, false));
146-
springIndex.updateBeans(project.getElementName(), expectedDefinitionUri, beansOfDoc.toArray(new Bean[0]));
146+
springIndex.updateElements(project.getElementName(), expectedDefinitionUri, beansOfDoc.toArray(new Bean[0]));
147147

148148
Bean[] beans = springIndex.getBeansWithName(project.getElementName(), "bean1");
149149
assertEquals(2, beans.length);

headless-services/spring-boot-language-server/src/test/java/org/springframework/ide/vscode/boot/java/beans/test/ResourceDefinitionProviderTest.java

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -116,7 +116,7 @@ public class TestDependsOnClass {
116116

117117
List<Bean> beansOfDoc = new ArrayList<>(List.of(springIndex.getBeansOfDocument(expectedDefinitionUri)));
118118
beansOfDoc.add(new Bean("bean1", "type", new Location(expectedDefinitionUri, new Range(new Position(20, 1), new Position(20, 10))), null, null, null, false));
119-
springIndex.updateBeans(project.getElementName(), expectedDefinitionUri, beansOfDoc.toArray(new Bean[0]));
119+
springIndex.updateElements(project.getElementName(), expectedDefinitionUri, beansOfDoc.toArray(new Bean[0]));
120120

121121
Bean[] beans = springIndex.getBeansWithName(project.getElementName(), "bean1");
122122
assertEquals(2, beans.length);

0 commit comments

Comments
 (0)