1010 *******************************************************************************/
1111package org .springframework .ide .vscode .boot .java .commands ;
1212
13+ import java .util .List ;
1314import java .util .Objects ;
1415import java .util .stream .Collectors ;
1516
17+ import org .eclipse .lsp4j .ExecuteCommandParams ;
1618import org .slf4j .Logger ;
1719import org .slf4j .LoggerFactory ;
1820import org .springframework .ide .vscode .boot .index .SpringMetamodelIndex ;
2426import org .springframework .ide .vscode .commons .languageserver .java .JavaProjectFinder ;
2527import 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 ;
2732import com .google .gson .JsonPrimitive ;
2833
2934public 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}
0 commit comments