Files
spring-tools/vscode-extensions/vscode-spring-boot/lib/explorer/structure-tree-manager.ts
Alex Boyko d886efd66a Index Elements serialization. Structure view initial work
* WIP

Signed-off-by: aboyko <alex.boyko@broadcom.com>

* `SpringIndexElement` serialization. Initial Structure view in VSCode

Signed-off-by: aboyko <alex.boyko@broadcom.com>

* Corrections

Signed-off-by: aboyko <alex.boyko@broadcom.com>

* Serialization polishing

Signed-off-by: aboyko <alex.boyko@broadcom.com>

* Don't include java.lang.Object in supertypes serialization

Signed-off-by: aboyko <alex.boyko@broadcom.com>

---------

Signed-off-by: aboyko <alex.boyko@broadcom.com>
2025-04-22 13:43:50 -04:00

124 lines
5.6 KiB
TypeScript

import { commands, EventEmitter, Event, Uri } from "vscode";
import { AotProcessorNode, BeanMethodContainerNode, BeanNode, BeanRegistrarNode, ConfigPropertyNode, DocumentNode, EventListenerNode, EventPublisherNode, ProjectNode, QueryMethodNode, RequestMappingNode, SpringNode, WebfluxRoutesNode } from "./nodes";
const SPRING_STRUCTURE_CMD = "sts/spring-boot/structure";
export class StructureManager {
private _rootElements: Thenable<SpringNode[]>
private _onDidChange: EventEmitter<SpringNode | undefined> = new EventEmitter<SpringNode | undefined>();
get rootElements(): Thenable<SpringNode[]> {
return this._rootElements;
}
refresh(): void {
this._rootElements = commands.executeCommand(SPRING_STRUCTURE_CMD).then(json => {
const nodes = this.parseArray(json);
this._onDidChange.fire(undefined);
return nodes;
});
}
private parseNode(json: any): SpringNode | undefined {
if (typeof (json._internal_node_type) === 'string') {
switch (json._internal_node_type) {
case "org.springframework.ide.vscode.commons.protocol.spring.ProjectElement":
return new ProjectNode(json.projectName as string, this.parseArray(json.children));
case "org.springframework.ide.vscode.commons.protocol.spring.DocumentElement":
return new DocumentNode(Uri.parse(json.docURI as string), this.parseArray(json.children));
case "org.springframework.ide.vscode.commons.protocol.spring.Bean":
return new BeanNode(
this.parseArray(json.children),
json.name,
json.type,
json.location,
json.injectionPoints,
json.supertypes,
json.annotations,
json.isConfiguration,
json.symbolLabel
);
case "org.springframework.ide.vscode.commons.protocol.spring.AotProcessorElement":
return new AotProcessorNode(
this.parseArray(json.children),
json.name,
Uri.parse(json.docUri)
);
case "org.springframework.ide.vscode.commons.protocol.spring.BeanMethodContainerElement":
return new BeanMethodContainerNode(
this.parseArray(json.children),
json.type,
json.location
);
case "org.springframework.ide.vscode.commons.protocol.spring.BeanRegistrarElement":
return new BeanRegistrarNode(
this.parseArray(json.children),
json.name,
json.type,
json.location
);
case "org.springframework.ide.vscode.boot.java.beans.ConfigPropertyIndexElement":
return new ConfigPropertyNode(
this.parseArray(json.children),
json.name,
json.type,
json.range
);
case "org.springframework.ide.vscode.boot.java.events.EventListenerIndexElement":
return new EventListenerNode(
this.parseArray(json.children),
json.eventType,
json.location,
json.containerBeanType,
json.annotations
);
case "org.springframework.ide.vscode.boot.java.events.EventPublisherIndexElement":
return new EventPublisherNode(
this.parseArray(json.children),
json.eventType,
json.location,
json.eventTypesFromHierarchy,
);
case "org.springframework.ide.vscode.boot.java.data.QueryMethodIndexElement":
return new QueryMethodNode(
this.parseArray(json.children),
json.methodName,
json.queryString,
json.range
);
case "org.springframework.ide.vscode.boot.java.requestmapping.RequestMappingIndexElement":
return new RequestMappingNode(
this.parseArray(json.children),
json.path,
json.httpMethods,
json.contentTypes,
json.acceptTypes,
json.symbolLabel,
json.range
);
case "org.springframework.ide.vscode.boot.java.requestmapping.WebfluxRouteElementRangesIndexElement":
return new WebfluxRoutesNode(
this.parseArray(json.children),
json.path,
json.httpMethods,
json.contentTypes,
json.acceptTypes,
json.symbolLabel,
json.range,
json.ranges
);
}
}
}
private parseArray(json: any): SpringNode[] {
return Array.isArray(json) ? (json as []).map(j => this.parseNode(j)).filter(e => !!e) : [];
}
public get onDidChange(): Event<SpringNode | undefined> {
return this._onDidChange.event;
}
}