Skip to content

Commit 59d0a16

Browse files
committed
GH-1629: prepare backend for group selection on the logical structure view
1 parent b90a476 commit 59d0a16

File tree

5 files changed

+83
-23
lines changed

5 files changed

+83
-23
lines changed

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

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -35,7 +35,7 @@ public JMoleculesStructureView(AbstractStereotypeCatalog catalog, SpringMetamode
3535
this.springIndex = springIndex;
3636
}
3737

38-
public Node createTree(IJavaProject project, IndexBasedStereotypeFactory factory) {
38+
public Node createTree(IJavaProject project, IndexBasedStereotypeFactory factory, List<String> selectedGroups) {
3939

4040
StereotypePackageElement mainApplicationPackage = StructureViewUtil.identifyMainApplicationPackage(project, springIndex);
4141

@@ -63,7 +63,7 @@ public Node createTree(IJavaProject project, IndexBasedStereotypeFactory factory
6363
var jsonTree = new ProjectTree<>(factory, catalog, jsonHandler)
6464
.withStructureProvider(structureProvider);
6565

66-
List<String[]> groupers = StructureViewUtil.identifyGroupers(catalog);
66+
List<String[]> groupers = StructureViewUtil.identifyGroupers(catalog, selectedGroups);
6767
for (String[] grouper : groupers) {
6868
jsonTree = jsonTree.withGrouper(grouper);
6969
}

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

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -35,7 +35,7 @@ public ModulithStructureView(AbstractStereotypeCatalog catalog, SpringMetamodelI
3535
this.modulithService = modulithService;
3636
}
3737

38-
public Node createTree(IJavaProject project, IndexBasedStereotypeFactory factory) {
38+
public Node createTree(IJavaProject project, IndexBasedStereotypeFactory factory, List<String> selectedGroups) {
3939

4040
var adapter = new ModulithStereotypeFactoryAdapter(factory);
4141

@@ -64,7 +64,7 @@ public Node createTree(IJavaProject project, IndexBasedStereotypeFactory factory
6464
var jsonTree = new ProjectTree<>(adapter, catalog, jsonHandler)
6565
.withStructureProvider(structureProvider);
6666

67-
List<String[]> groupers = StructureViewUtil.identifyGroupers(catalog);
67+
List<String[]> groupers = StructureViewUtil.identifyGroupers(catalog, selectedGroups);
6868
for (String[] grouper : groupers) {
6969
jsonTree = jsonTree.withGrouper(grouper);
7070
}

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

Lines changed: 67 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -10,9 +10,11 @@
1010
*******************************************************************************/
1111
package org.springframework.ide.vscode.boot.java.commands;
1212

13+
import java.util.List;
1314
import java.util.Objects;
1415
import java.util.stream.Collectors;
1516

17+
import org.eclipse.lsp4j.ExecuteCommandParams;
1618
import org.slf4j.Logger;
1719
import org.slf4j.LoggerFactory;
1820
import org.springframework.ide.vscode.boot.index.SpringMetamodelIndex;
@@ -24,37 +26,56 @@
2426
import org.springframework.ide.vscode.commons.languageserver.java.JavaProjectFinder;
2527
import org.springframework.ide.vscode.commons.languageserver.util.SimpleLanguageServer;
2628

29+
import com.google.gson.JsonArray;
30+
import com.google.gson.JsonElement;
31+
import com.google.gson.JsonObject;
2732
import com.google.gson.JsonPrimitive;
2833

2934
public class SpringIndexCommands {
3035

3136
private static final String SPRING_STRUCTURE_CMD = "sts/spring-boot/structure";
37+
private static final String SPRING_STRUCTURE_GROUPS_CMD = "sts/spring-boot/structure/groups";
38+
3239
private static final Logger log = LoggerFactory.getLogger(SpringIndexCommands.class);
3340

3441
private final SpringMetamodelIndex springIndex;
3542
private final ModulithService modulithService;
3643
private final StereotypeCatalogRegistry stereotypeCatalogRegistry;
3744

38-
public SpringIndexCommands(SimpleLanguageServer server, SpringMetamodelIndex springIndex, ModulithService modulithService, JavaProjectFinder projectFinder, StereotypeCatalogRegistry stereotypeCatalogRegistry) {
45+
public SpringIndexCommands(SimpleLanguageServer server, SpringMetamodelIndex springIndex, ModulithService modulithService,
46+
JavaProjectFinder projectFinder, StereotypeCatalogRegistry stereotypeCatalogRegistry) {
47+
3948
this.springIndex = springIndex;
4049
this.modulithService = modulithService;
4150
this.stereotypeCatalogRegistry = stereotypeCatalogRegistry;
4251

4352
server.onCommand(SPRING_STRUCTURE_CMD, params -> server.getAsync().invoke(() -> {
44-
boolean updateMetadata =
45-
params.getArguments() != null
46-
&& params.getArguments().size() == 1
47-
&& params.getArguments().get(0) instanceof JsonPrimitive
48-
? ((JsonPrimitive) params.getArguments().get(0)).getAsBoolean() : false;
53+
StructureCommandArgs args = StructureCommandArgs.parseFrom(params);
4954

5055
return projectFinder.all().stream()
51-
.map(project -> nodeFrom(project, updateMetadata))
56+
.map(project -> nodeFrom(project, args.updateMetadata, args.selectedGroups))
5257
.filter(Objects::nonNull)
5358
.collect(Collectors.toList());
5459
}));
60+
61+
server.onCommand(SPRING_STRUCTURE_GROUPS_CMD, params -> server.getAsync().invoke(() -> {
62+
return projectFinder.all().stream()
63+
.map(project -> getGroups(project))
64+
.toList();
65+
}));
66+
}
67+
68+
private Groups getGroups(IJavaProject project) {
69+
var catalog = stereotypeCatalogRegistry.getCatalogOf(project);
70+
71+
List<Group> groups = catalog.getGroups().stream()
72+
.map(group -> new Group(group.getIdentifier(), group.getDisplayName()))
73+
.toList();
74+
75+
return new Groups(project.getElementName(), groups);
5576
}
5677

57-
private Node nodeFrom(IJavaProject project, boolean updateMetadata) {
78+
private Node nodeFrom(IJavaProject project, boolean updateMetadata, List<String> selectedGroups) {
5879
log.info("create structural view tree information for project: " + project.getElementName());
5980

6081
if (updateMetadata) {
@@ -69,12 +90,48 @@ private Node nodeFrom(IJavaProject project, boolean updateMetadata) {
6990
factory.registerStereotypeDefinitions();
7091
}
7192

93+
if (selectedGroups == null) {
94+
selectedGroups = catalog.getGroups().stream().map(group -> group.getIdentifier()).toList();
95+
}
96+
7297
if (ModulithService.isModulithDependentProject(project) && System.getProperty("disable-modulith-structure-view") == null) {
73-
return new ModulithStructureView(catalog, springIndex, modulithService).createTree(project, factory);
98+
return new ModulithStructureView(catalog, springIndex, modulithService).createTree(project, factory, selectedGroups);
7499
}
75100
else {
76-
return new JMoleculesStructureView(catalog, springIndex).createTree(project, factory);
101+
return new JMoleculesStructureView(catalog, springIndex).createTree(project, factory, selectedGroups);
77102
}
78103
}
104+
105+
private static record StructureCommandArgs(boolean updateMetadata, List<String> selectedGroups) {
106+
107+
public static StructureCommandArgs parseFrom(ExecuteCommandParams params) {
108+
boolean updateMetadata = false;
109+
List<String> selectedGroups = null;
110+
111+
List<Object> arguments = params.getArguments();
112+
if (arguments != null && arguments.size() == 1) {
113+
Object object = arguments.get(0);
114+
if (object instanceof JsonObject) {
115+
JsonObject paramObject = (JsonObject) object;
116+
117+
JsonElement jsonElement = paramObject.get("updateMetadata");
118+
updateMetadata = jsonElement != null && jsonElement instanceof JsonPrimitive ? jsonElement.getAsBoolean() : false;
119+
120+
JsonElement groupsElement = paramObject.get("groups");
121+
if (groupsElement instanceof JsonArray && ((JsonArray) groupsElement).size() > 0) {
122+
JsonArray groupsArray = (JsonArray) groupsElement;
123+
selectedGroups = groupsArray.asList().stream()
124+
.map(groupEntry -> groupEntry.getAsString())
125+
.toList();
126+
}
127+
}
128+
}
129+
130+
return new StructureCommandArgs(updateMetadata, selectedGroups);
131+
}
132+
}
133+
134+
private static record Groups (String projectName, List<Group> groups) {}
135+
private static record Group (String identifier, String displayName) {}
79136

80137
}

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

Lines changed: 6 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -37,7 +37,7 @@
3737

3838
public class StructureViewUtil {
3939

40-
public static List<String[]> identifyGroupers(AbstractStereotypeCatalog catalog) {
40+
public static List<String[]> identifyGroupers(AbstractStereotypeCatalog catalog, List<String> selectedGroups) {
4141

4242
// List<String[]> allGroupsWithSpecificOrder = Arrays.asList(
4343
// new String[] {"architecture"},
@@ -47,24 +47,22 @@ public static List<String[]> identifyGroupers(AbstractStereotypeCatalog catalog)
4747
// return allGroupsWithSpecificOrder;
4848

4949

50-
// var yourList = List.of("foo");
51-
5250
StereotypeGroups groups = catalog.getGroups();
5351

5452
var architectureIds = groups.streamByType(StereotypeGroup.Type.ARCHITECTURE)
5553
.map(StereotypeGroup::getIdentifier)
56-
// .filter(yourList::contains)
54+
.filter(selectedGroups::contains)
5755
.toList();
5856

5957
var designIds = groups.streamByType(StereotypeGroup.Type.DESIGN)
60-
.map(StereotypeGroup::getIdentifier);
61-
// .filter(yourList::contains)
58+
.map(StereotypeGroup::getIdentifier)
59+
.filter(selectedGroups::contains);
6260

6361
var customIds = new ArrayList<String>().stream();
6462

6563
var technologyIds = groups.streamByType(StereotypeGroup.Type.TECHNOLOGY)
66-
.map(StereotypeGroup::getIdentifier);
67-
// .filter(yourList::contains)
64+
.map(StereotypeGroup::getIdentifier)
65+
.filter(selectedGroups::contains);
6866

6967
ArrayList<String[]> result = new ArrayList<String[]>();
7068
result.add(architectureIds.toArray(String[]::new));

vscode-extensions/vscode-spring-boot/lib/explorer/structure-tree-manager.ts

Lines changed: 6 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -13,7 +13,12 @@ export class StructureManager {
1313
}
1414

1515
refresh(updateMetadata: boolean): void {
16-
this._rootElements = commands.executeCommand(SPRING_STRUCTURE_CMD, updateMetadata).then(json => {
16+
this._rootElements = commands.executeCommand(SPRING_STRUCTURE_CMD,
17+
{
18+
"updateMetadata" : updateMetadata,
19+
"groups" : [
20+
]
21+
}).then(json => {
1722
const nodes = this.parseArray(json);
1823
this._onDidChange.fire(undefined);
1924
return nodes;

0 commit comments

Comments
 (0)