Skip to content

Commit 9b71760

Browse files
committed
refactored and unified json handler for structural view
1 parent 38bb45e commit 9b71760

File tree

7 files changed

+42
-186
lines changed

7 files changed

+42
-186
lines changed

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

Lines changed: 3 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -18,6 +18,7 @@
1818
import org.jmolecules.stereotype.tooling.ProjectTree;
1919
import org.jmolecules.stereotype.tooling.SimpleLabelProvider;
2020
import org.springframework.ide.vscode.boot.index.SpringMetamodelIndex;
21+
import org.springframework.ide.vscode.boot.java.commands.JsonNodeHandler.Node;
2122
import org.springframework.ide.vscode.boot.java.stereotypes.IndexBasedStereotypeFactory;
2223
import org.springframework.ide.vscode.boot.java.stereotypes.StereotypeClassElement;
2324
import org.springframework.ide.vscode.boot.java.stereotypes.StereotypeMethodElement;
@@ -53,11 +54,11 @@ public Node createTree(IJavaProject project) {
5354
// json output
5455
BiConsumer<Node, Object> consumer = (node, c) -> {
5556
node.withAttribute(HierarchicalNodeHandler.TEXT, labelProvider.getCustomLabel(c))
56-
.withAttribute(ToolsJsonNodeHandler.ICON, "fa-named-interface");
57+
.withAttribute(JsonNodeHandler.ICON, "fa-named-interface");
5758
};
5859

5960
// create json nodes to display the structure in a nice way
60-
var jsonHandler = new ToolsJsonNodeHandler(labelProvider, consumer);
61+
var jsonHandler = new JsonNodeHandler<StereotypePackageElement, Object>(labelProvider, consumer);
6162

6263
// create the project tree and apply all the groupers from the project
6364
// TODO: in the future, we need to trim this grouper arrays down to what is selected on the UI
Lines changed: 32 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -16,6 +16,10 @@
1616

1717
package org.springframework.ide.vscode.boot.java.commands;
1818

19+
import java.util.ArrayList;
20+
import java.util.LinkedHashMap;
21+
import java.util.List;
22+
import java.util.Map;
1923
import java.util.function.BiConsumer;
2024
import java.util.function.Consumer;
2125

@@ -35,18 +39,19 @@
3539
* @author Oliver Drotbohm
3640
* @author Martin Lippert
3741
*/
38-
public class ApplicationModulesJsonNodeHandler implements NodeHandler<ApplicationModules, StereotypePackageElement, StereotypeClassElement, StereotypeMethodElement, NamedInterfaceNode> {
42+
public class JsonNodeHandler<A, C> implements NodeHandler<A, StereotypePackageElement, StereotypeClassElement, StereotypeMethodElement, C> {
3943

4044
private static final String LOCATION = "location";
41-
static final String ICON = "icon";
42-
static final String TEXT = "text";
45+
46+
public static final String ICON = "icon";
47+
public static final String TEXT = "text";
4348

4449
private final Node root;
45-
private final LabelProvider<ApplicationModules, StereotypePackageElement, StereotypeClassElement, StereotypeMethodElement, NamedInterfaceNode> labels;
46-
private final BiConsumer<Node, NamedInterfaceNode> customHandler;
50+
private final LabelProvider<A, StereotypePackageElement, StereotypeClassElement, StereotypeMethodElement, C> labels;
51+
private final BiConsumer<Node, C> customHandler;
4752
private Node current;
4853

49-
public ApplicationModulesJsonNodeHandler(LabelProvider<ApplicationModules, StereotypePackageElement, StereotypeClassElement, StereotypeMethodElement, NamedInterfaceNode> labels, BiConsumer<Node, NamedInterfaceNode> customHandler) {
54+
public JsonNodeHandler(LabelProvider<A, StereotypePackageElement, StereotypeClassElement, StereotypeMethodElement, C> labels, BiConsumer<Node, C> customHandler) {
5055
this.labels = labels;
5156
this.root = new Node(null);
5257
this.customHandler = customHandler;
@@ -62,7 +67,7 @@ public void handleStereotype(Stereotype stereotype, NodeContext context) {
6267
}
6368

6469
@Override
65-
public void handleApplication(ApplicationModules application) {
70+
public void handleApplication(A application) {
6671
this.root
6772
.withAttribute(TEXT, labels.getApplicationLabel(application))
6873
.withAttribute(ICON, StereotypeIcons.getIcon(StereotypeIcons.APPLICATION_KEY))
@@ -97,7 +102,7 @@ public void handleMethod(StereotypeMethodElement method, MethodNodeContext<Stere
97102
}
98103

99104
@Override
100-
public void handleCustom(NamedInterfaceNode custom, NodeContext context) {
105+
public void handleCustom(C custom, NodeContext context) {
101106
addChild(node -> customHandler.accept(node, custom));
102107
}
103108

@@ -133,5 +138,24 @@ public String toString() {
133138
Node getRoot() {
134139
return root;
135140
}
141+
142+
public static class Node {
143+
144+
transient final Node parent;
145+
final Map<String, Object> attributes;
146+
final List<Node> children;
147+
148+
Node(Node parent) {
149+
this.parent = parent;
150+
this.attributes = new LinkedHashMap<>();
151+
this.children = new ArrayList<>();
152+
}
153+
154+
public Node withAttribute(String key, Object value) {
155+
this.attributes.put(key, value);
156+
return this;
157+
}
158+
}
159+
136160

137161
}

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

Lines changed: 3 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -17,6 +17,7 @@
1717
import org.jmolecules.stereotype.tooling.HierarchicalNodeHandler;
1818
import org.jmolecules.stereotype.tooling.ProjectTree;
1919
import org.springframework.ide.vscode.boot.index.SpringMetamodelIndex;
20+
import org.springframework.ide.vscode.boot.java.commands.JsonNodeHandler.Node;
2021
import org.springframework.ide.vscode.boot.java.stereotypes.IndexBasedStereotypeFactory;
2122
import org.springframework.ide.vscode.boot.modulith.AppModules;
2223
import org.springframework.ide.vscode.boot.modulith.ModulithService;
@@ -54,11 +55,11 @@ public Node createTree(IJavaProject project) {
5455
// json output
5556
BiConsumer<Node, NamedInterfaceNode> consumer = (node, c) -> {
5657
node.withAttribute(HierarchicalNodeHandler.TEXT, labelProvider.getCustomLabel(c))
57-
.withAttribute(ToolsJsonNodeHandler.ICON, "fa-named-interface");
58+
.withAttribute(JsonNodeHandler.ICON, "fa-named-interface");
5859
};
5960

6061
// create json nodes to display the structure in a nice way
61-
var jsonHandler = new ApplicationModulesJsonNodeHandler(labelProvider, consumer);
62+
var jsonHandler = new JsonNodeHandler<ApplicationModules, NamedInterfaceNode>(labelProvider, consumer);
6263

6364
// create the project tree and apply all the groupers from the project
6465
// TODO: in the future, we need to trim this grouper arrays down to what is selected on the UI

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

Lines changed: 0 additions & 34 deletions
This file was deleted.

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

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -16,6 +16,7 @@
1616
import org.slf4j.Logger;
1717
import org.slf4j.LoggerFactory;
1818
import org.springframework.ide.vscode.boot.index.SpringMetamodelIndex;
19+
import org.springframework.ide.vscode.boot.java.commands.JsonNodeHandler.Node;
1920
import org.springframework.ide.vscode.boot.java.stereotypes.StereotypeCatalogRegistry;
2021
import org.springframework.ide.vscode.boot.modulith.ModulithService;
2122
import org.springframework.ide.vscode.commons.java.IJavaProject;

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

Lines changed: 0 additions & 137 deletions
This file was deleted.

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

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -43,9 +43,9 @@
4343
import org.springframework.ide.vscode.boot.bootiful.SymbolProviderTestConf;
4444
import org.springframework.ide.vscode.boot.index.SpringMetamodelIndex;
4545
import org.springframework.ide.vscode.boot.java.Annotations;
46-
import org.springframework.ide.vscode.boot.java.commands.Node;
46+
import org.springframework.ide.vscode.boot.java.commands.JsonNodeHandler;
47+
import org.springframework.ide.vscode.boot.java.commands.JsonNodeHandler.Node;
4748
import org.springframework.ide.vscode.boot.java.commands.StructureViewUtil;
48-
import org.springframework.ide.vscode.boot.java.commands.ToolsJsonNodeHandler;
4949
import org.springframework.ide.vscode.commons.java.IJavaProject;
5050
import org.springframework.ide.vscode.commons.languageserver.java.JavaProjectFinder;
5151
import org.springframework.ide.vscode.project.harness.BootLanguageServerHarness;
@@ -359,7 +359,7 @@ public Collection<StereotypeClassElement> extractTypes(StereotypePackageElement
359359
.withAttribute("icon", "fa-named-interface");
360360
};
361361

362-
var jsonHandler = new ToolsJsonNodeHandler(labels, consumer);
362+
var jsonHandler = new JsonNodeHandler<StereotypePackageElement, Object>(labels, consumer);
363363

364364
var jsonTree = new ProjectTree<>(factory, catalog, jsonHandler)
365365
.withStructureProvider(structureProvider)

0 commit comments

Comments
 (0)