Skip to content

Commit 96c0d1d

Browse files
committed
identify main package of spring boot application as the root for creating the structure tree
1 parent 1191178 commit 96c0d1d

File tree

2 files changed

+44
-2
lines changed

2 files changed

+44
-2
lines changed

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

Lines changed: 35 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -13,6 +13,7 @@
1313
import java.util.Collection;
1414
import java.util.List;
1515
import java.util.Objects;
16+
import java.util.Optional;
1617
import java.util.function.BiConsumer;
1718
import java.util.stream.Collectors;
1819

@@ -21,12 +22,14 @@
2122
import org.jmolecules.stereotype.tooling.SimpleLabelProvider;
2223
import org.jmolecules.stereotype.tooling.StructureProvider.SimpleStructureProvider;
2324
import org.springframework.ide.vscode.boot.index.SpringMetamodelIndex;
25+
import org.springframework.ide.vscode.boot.java.Annotations;
2426
import org.springframework.ide.vscode.boot.java.commands.ToolsJsonNodeHandler.Node;
2527
import org.springframework.ide.vscode.boot.java.stereotypes.IndexBasedStereotypeFactory;
2628
import org.springframework.ide.vscode.boot.java.stereotypes.StereotypeCatalogRegistry;
2729
import org.springframework.ide.vscode.boot.java.stereotypes.StereotypeClassElement;
2830
import org.springframework.ide.vscode.boot.java.stereotypes.StereotypeMethodElement;
2931
import org.springframework.ide.vscode.boot.java.stereotypes.StereotypePackageElement;
32+
import org.springframework.ide.vscode.boot.modulith.ModulithService;
3033
import org.springframework.ide.vscode.commons.java.IJavaProject;
3134
import org.springframework.ide.vscode.commons.languageserver.java.JavaProjectFinder;
3235
import org.springframework.ide.vscode.commons.languageserver.util.SimpleLanguageServer;
@@ -85,9 +88,40 @@ public Collection<StereotypeClassElement> extractTypes(StereotypePackageElement
8588
.withGrouper("org.jmolecules.architecture")
8689
.withGrouper("org.jmolecules.ddd", "org.jmolecules.event", "spring", "jpa", "java");
8790

88-
jsonTree.process(new StereotypePackageElement(project.getElementName(), null));
91+
jsonTree.process(identifyMainApplicationPackage(project, springIndex));
8992

9093
return jsonHandler.getRoot();
9194
}
9295

96+
public StereotypePackageElement identifyMainApplicationPackage(IJavaProject project, SpringMetamodelIndex springIndex) {
97+
List<StereotypeClassElement> classNodes = springIndex.getNodesOfType(project.getElementName(), StereotypeClassElement.class);
98+
99+
StereotypePackageElement packageElement = classNodes.stream()
100+
.filter(node -> node.getAnnotationTypes().contains(Annotations.BOOT_APP))
101+
.map(node -> getPackage(node.getType()))
102+
.map(packageName -> findPackageNode(packageName, project, springIndex))
103+
.findFirst().get();
104+
105+
return packageElement;
106+
}
107+
108+
private String getPackage(String fullyQualifiedClassName) {
109+
return ModulithService.getPackageNameFromTypeFQName(fullyQualifiedClassName);
110+
}
111+
112+
private StereotypePackageElement findPackageNode(String packageName, IJavaProject project, SpringMetamodelIndex springIndex) {
113+
List<StereotypePackageElement> packageNodes = springIndex.getNodesOfType(project.getElementName(), StereotypePackageElement.class);
114+
115+
Optional<StereotypePackageElement> found = packageNodes.stream()
116+
.filter(packageNode -> packageNode.getPackageName().equals(packageName))
117+
.findAny();
118+
119+
if (found.isPresent()) {
120+
return found.get();
121+
}
122+
else {
123+
return new StereotypePackageElement(packageName, null);
124+
}
125+
}
126+
93127
}

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

Lines changed: 9 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -41,6 +41,7 @@
4141
import org.springframework.ide.vscode.boot.bootiful.BootLanguageServerTest;
4242
import org.springframework.ide.vscode.boot.bootiful.SymbolProviderTestConf;
4343
import org.springframework.ide.vscode.boot.index.SpringMetamodelIndex;
44+
import org.springframework.ide.vscode.boot.java.commands.SpringIndexCommands;
4445
import org.springframework.ide.vscode.boot.java.commands.ToolsJsonNodeHandler;
4546
import org.springframework.ide.vscode.boot.java.commands.ToolsJsonNodeHandler.Node;
4647
import org.springframework.ide.vscode.commons.java.IJavaProject;
@@ -62,6 +63,7 @@ public class StereotypesIndexerTest {
6263
@Autowired private SpringSymbolIndex indexer;
6364
@Autowired private SpringMetamodelIndex springIndex;
6465
@Autowired private StereotypeCatalogRegistry stereotypeCatalogRegistry;
66+
@Autowired private SpringIndexCommands indexCommands;
6567

6668
private File directory;
6769
private IJavaProject project;
@@ -80,7 +82,7 @@ public void setup() throws Exception {
8082
}
8183

8284
@Test
83-
void testStuff() throws Exception {
85+
void testOverallExistenceOfTypeElements() throws Exception {
8486
List<StereotypeClassElement> stereotypeNodes = springIndex.getNodesOfType(StereotypeClassElement.class);
8587
assertFalse(stereotypeNodes.isEmpty());
8688
}
@@ -110,6 +112,12 @@ void testLocationInformationForTypeElement() throws Exception {
110112
assertEquals(7, location.getRange().getEnd().getLine());
111113
}
112114

115+
@Test
116+
void testIdentifyMainApplicationPackage() throws Exception {
117+
StereotypePackageElement mainPackage = indexCommands.identifyMainApplicationPackage(project, springIndex);
118+
assertEquals("example.application", mainPackage.getPackageName());
119+
}
120+
113121
@Test
114122
void testFromPackageIndexBasedFactory() {
115123

0 commit comments

Comments
 (0)