SpringModelService minor refactoring and flattening

This commit is contained in:
aboyko
2023-05-10 11:55:04 -04:00
parent 98a4c9b3e7
commit a3a83eb70a
9 changed files with 38 additions and 39 deletions

View File

@@ -97,8 +97,10 @@ import org.springframework.ide.vscode.commons.languageserver.reconcile.IProblemC
import org.springframework.ide.vscode.commons.languageserver.reconcile.IReconcileEngine; import org.springframework.ide.vscode.commons.languageserver.reconcile.IReconcileEngine;
import org.springframework.ide.vscode.commons.languageserver.reconcile.ReconcileProblem; import org.springframework.ide.vscode.commons.languageserver.reconcile.ReconcileProblem;
import org.springframework.ide.vscode.commons.protocol.STS4LanguageClient; import org.springframework.ide.vscode.commons.protocol.STS4LanguageClient;
import org.springframework.ide.vscode.commons.protocol.spring.SpringModelLanguageServer; import org.springframework.ide.vscode.commons.protocol.spring.Bean;
import org.springframework.ide.vscode.commons.protocol.spring.SpringModelService; import org.springframework.ide.vscode.commons.protocol.spring.BeansParams;
import org.springframework.ide.vscode.commons.protocol.spring.SpringIndex;
import org.springframework.ide.vscode.commons.protocol.spring.SpringIndexLanguageServer;
import org.springframework.ide.vscode.commons.util.Assert; import org.springframework.ide.vscode.commons.util.Assert;
import org.springframework.ide.vscode.commons.util.AsyncRunner; import org.springframework.ide.vscode.commons.util.AsyncRunner;
import org.springframework.ide.vscode.commons.util.BadLocationException; import org.springframework.ide.vscode.commons.util.BadLocationException;
@@ -121,7 +123,7 @@ import reactor.core.scheduler.Schedulers;
* with apis to register various callbacks so that language server implementor * with apis to register various callbacks so that language server implementor
* can attach their own 'handlers' for whatever the functionality they want to implement. * can attach their own 'handlers' for whatever the functionality they want to implement.
*/ */
public final class SimpleLanguageServer implements Sts4LanguageServer, SpringModelLanguageServer, LanguageClientAware, ServiceNotificationsClient, SimpleLanguageServerWrapper { public final class SimpleLanguageServer implements Sts4LanguageServer, SpringIndexLanguageServer, LanguageClientAware, ServiceNotificationsClient, SimpleLanguageServerWrapper {
private static Logger log = LoggerFactory.getLogger(SimpleLanguageServer.class); private static Logger log = LoggerFactory.getLogger(SimpleLanguageServer.class);
@@ -924,12 +926,14 @@ public final class SimpleLanguageServer implements Sts4LanguageServer, SpringMod
} }
@Override @Override
public SpringModelService getSpringModelService() { public CompletableFuture<List<Bean>> beans(BeansParams params) {
try { Map<String, SpringIndex> allSpringIndex = appContext.getBeansOfType(SpringIndex.class, false, false);
return (SpringModelService) appContext.getBean(SpringModelService.class); Assert.isLegal(allSpringIndex.size() <= 1, "One at most SpringModel bean is expected");
} catch (Throwable e) { if (!allSpringIndex.isEmpty()) {
return null; SpringIndex springIndex = allSpringIndex.values().iterator().next();
return springIndex.beans(params);
} }
return CompletableFuture.completedFuture(Collections.emptyList());
} }
} }

View File

@@ -28,14 +28,14 @@ import org.springframework.ide.vscode.commons.protocol.java.JavaSearchParams;
import org.springframework.ide.vscode.commons.protocol.java.JavaTypeHierarchyParams; import org.springframework.ide.vscode.commons.protocol.java.JavaTypeHierarchyParams;
import org.springframework.ide.vscode.commons.protocol.java.TypeData; import org.springframework.ide.vscode.commons.protocol.java.TypeData;
import org.springframework.ide.vscode.commons.protocol.java.TypeDescriptorData; import org.springframework.ide.vscode.commons.protocol.java.TypeDescriptorData;
import org.springframework.ide.vscode.commons.protocol.spring.SpringModelLanguageClient; import org.springframework.ide.vscode.commons.protocol.spring.SpringIndexLanguageClient;
/** /**
* Some 'custom' extensions to standard LSP {@link LanguageClient}. * Some 'custom' extensions to standard LSP {@link LanguageClient}.
* *
* @author Kris De Volder * @author Kris De Volder
*/ */
public interface STS4LanguageClient extends LanguageClient, SpringModelLanguageClient { public interface STS4LanguageClient extends LanguageClient, SpringIndexLanguageClient {
@JsonNotification("sts/liveprocess/connected") @JsonNotification("sts/liveprocess/connected")
void liveProcessConnected(LiveProcessSummary processKey); void liveProcessConnected(LiveProcessSummary processKey);

View File

@@ -10,15 +10,11 @@
*******************************************************************************/ *******************************************************************************/
package org.springframework.ide.vscode.commons.protocol.spring; package org.springframework.ide.vscode.commons.protocol.spring;
import org.eclipse.lsp4j.jsonrpc.services.JsonDelegate; import java.util.List;
import org.eclipse.lsp4j.services.LanguageServer; import java.util.concurrent.CompletableFuture;
public interface SpringModelLanguageServer extends LanguageServer { public interface SpringIndex {
/** CompletableFuture<List<Bean>> beans(BeansParams params);
* Provides access to the spring model services.
*/
@JsonDelegate
SpringModelService getSpringModelService();
} }

View File

@@ -13,7 +13,7 @@ package org.springframework.ide.vscode.commons.protocol.spring;
import org.eclipse.lsp4j.jsonrpc.services.JsonNotification; import org.eclipse.lsp4j.jsonrpc.services.JsonNotification;
import org.eclipse.lsp4j.services.LanguageClient; import org.eclipse.lsp4j.services.LanguageClient;
public interface SpringModelLanguageClient extends LanguageClient { public interface SpringIndexLanguageClient extends LanguageClient {
@JsonNotification("spring/index/updated") @JsonNotification("spring/index/updated")
void indexUpdated(); void indexUpdated();

View File

@@ -14,12 +14,11 @@ import java.util.List;
import java.util.concurrent.CompletableFuture; import java.util.concurrent.CompletableFuture;
import org.eclipse.lsp4j.jsonrpc.services.JsonRequest; import org.eclipse.lsp4j.jsonrpc.services.JsonRequest;
import org.eclipse.lsp4j.jsonrpc.services.JsonSegment; import org.eclipse.lsp4j.services.LanguageServer;
@JsonSegment("spring/index") public interface SpringIndexLanguageServer extends LanguageServer {
public interface SpringModelService {
@JsonRequest("spring/index/beans")
@JsonRequest
default CompletableFuture<List<Bean>> beans(BeansParams params) { default CompletableFuture<List<Bean>> beans(BeansParams params) {
throw new UnsupportedOperationException(); throw new UnsupportedOperationException();
} }

View File

@@ -71,7 +71,7 @@ import org.springframework.ide.vscode.commons.languageserver.util.SimpleTextDocu
import org.springframework.ide.vscode.commons.languageserver.util.SimpleWorkspaceService; import org.springframework.ide.vscode.commons.languageserver.util.SimpleWorkspaceService;
import org.springframework.ide.vscode.commons.protocol.spring.Bean; import org.springframework.ide.vscode.commons.protocol.spring.Bean;
import org.springframework.ide.vscode.commons.protocol.spring.BeansParams; import org.springframework.ide.vscode.commons.protocol.spring.BeansParams;
import org.springframework.ide.vscode.commons.protocol.spring.SpringModelService; import org.springframework.ide.vscode.commons.protocol.spring.SpringIndex;
import org.springframework.ide.vscode.commons.util.Futures; import org.springframework.ide.vscode.commons.util.Futures;
import org.springframework.ide.vscode.commons.util.StringUtil; import org.springframework.ide.vscode.commons.util.StringUtil;
import org.springframework.ide.vscode.commons.util.UriUtil; import org.springframework.ide.vscode.commons.util.UriUtil;
@@ -84,7 +84,7 @@ import com.google.common.collect.ImmutableList;
* @author Martin Lippert * @author Martin Lippert
*/ */
@Component @Component
public class SpringSymbolIndex implements InitializingBean, SpringModelService { public class SpringSymbolIndex implements InitializingBean, SpringIndex {
@Autowired SimpleLanguageServer server; @Autowired SimpleLanguageServer server;
@Autowired BootJavaConfig config; @Autowired BootJavaConfig config;

View File

@@ -63,9 +63,8 @@ export interface ExtensionAPI {
* *
* Returns Spring Model object. * Returns Spring Model object.
*/ */
readonly getSpringModel: () => SpringModel; readonly getSpringIndex: () => SpringIndex;
readonly onSpringModelUpdated: Event<void>;
} }
interface LiveProcessDataQuery { interface LiveProcessDataQuery {
@@ -108,8 +107,9 @@ interface InjectionPoint {
readonly location: Location; readonly location: Location;
} }
interface SpringModel { interface SpringIndex {
readonly beans: (params: BeansParams) => Promise<Bean[]>; readonly beans: (params: BeansParams) => Promise<Bean[]>;
readonly onSpringIndexUpdated: Event<void>;
} }
interface BeansParams { interface BeansParams {

View File

@@ -1,6 +1,6 @@
import { commands, Uri } from "vscode"; import { commands, Uri } from "vscode";
import { Emitter, LanguageClient } from "vscode-languageclient/node"; import { Emitter, LanguageClient } from "vscode-languageclient/node";
import {Bean, BeansParams, ExtensionAPI, SpringModel} from "./api"; import {Bean, BeansParams, ExtensionAPI, SpringIndex} from "./api";
import { import {
LiveProcess, LiveProcess,
LiveProcessConnectedNotification, LiveProcessConnectedNotification,
@@ -8,7 +8,7 @@ import {
LiveProcessUpdatedNotification, LiveProcessUpdatedNotification,
LiveProcessGcPausesMetricsUpdatedNotification, LiveProcessGcPausesMetricsUpdatedNotification,
LiveProcessMemoryMetricsUpdatedNotification, LiveProcessMemoryMetricsUpdatedNotification,
SpringModelUpdatedNotification SpringIndexUpdatedNotification
} from "./notification"; } from "./notification";
import VSCode from "vscode"; import VSCode from "vscode";
import {RequestType} from "vscode-languageclient"; import {RequestType} from "vscode-languageclient";
@@ -20,7 +20,7 @@ export class ApiManager {
private onDidLiveProcessUpdateEmitter: Emitter<LiveProcess> = new Emitter<LiveProcess>(); private onDidLiveProcessUpdateEmitter: Emitter<LiveProcess> = new Emitter<LiveProcess>();
private onDidLiveProcessGcPausesMetricsUpdateEmitter: Emitter<LiveProcess> = new Emitter<LiveProcess>(); private onDidLiveProcessGcPausesMetricsUpdateEmitter: Emitter<LiveProcess> = new Emitter<LiveProcess>();
private onDidLiveProcessMemoryMetricsUpdateEmitter: Emitter<LiveProcess> = new Emitter<LiveProcess>(); private onDidLiveProcessMemoryMetricsUpdateEmitter: Emitter<LiveProcess> = new Emitter<LiveProcess>();
private onSpringModelUpdateEmitter: Emitter<void> = new Emitter<void>(); private onSpringIndexUpdateEmitter: Emitter<void> = new Emitter<void>();
public constructor(client: LanguageClient) { public constructor(client: LanguageClient) {
const onDidLiveProcessConnect = this.onDidLiveProcessConnectEmitter.event; const onDidLiveProcessConnect = this.onDidLiveProcessConnectEmitter.event;
@@ -28,7 +28,7 @@ export class ApiManager {
const onDidLiveProcessUpdate = this.onDidLiveProcessUpdateEmitter.event; const onDidLiveProcessUpdate = this.onDidLiveProcessUpdateEmitter.event;
const onDidLiveProcessGcPausesMetricsUpdate = this.onDidLiveProcessGcPausesMetricsUpdateEmitter.event; const onDidLiveProcessGcPausesMetricsUpdate = this.onDidLiveProcessGcPausesMetricsUpdateEmitter.event;
const onDidLiveProcessMemoryMetricsUpdate = this.onDidLiveProcessMemoryMetricsUpdateEmitter.event; const onDidLiveProcessMemoryMetricsUpdate = this.onDidLiveProcessMemoryMetricsUpdateEmitter.event;
const onSpringModelUpdated = this.onSpringModelUpdateEmitter.event; const onSpringIndexUpdated = this.onSpringIndexUpdateEmitter.event;
const COMMAND_LIVEDATA_GET = "sts/livedata/get"; const COMMAND_LIVEDATA_GET = "sts/livedata/get";
const getLiveProcessData = async (query) => { const getLiveProcessData = async (query) => {
@@ -61,14 +61,15 @@ export class ApiManager {
client.onNotification(LiveProcessGcPausesMetricsUpdatedNotification.type, (process: LiveProcess) => this.onDidLiveProcessGcPausesMetricsUpdateEmitter.fire(process)); client.onNotification(LiveProcessGcPausesMetricsUpdatedNotification.type, (process: LiveProcess) => this.onDidLiveProcessGcPausesMetricsUpdateEmitter.fire(process));
client.onNotification(LiveProcessMemoryMetricsUpdatedNotification.type, (process: LiveProcess) => this.onDidLiveProcessMemoryMetricsUpdateEmitter.fire(process)); client.onNotification(LiveProcessMemoryMetricsUpdatedNotification.type, (process: LiveProcess) => this.onDidLiveProcessMemoryMetricsUpdateEmitter.fire(process));
client.onNotification(SpringModelUpdatedNotification.type, () => this.onSpringModelUpdateEmitter.fire()); client.onNotification(SpringIndexUpdatedNotification.type, () => this.onSpringIndexUpdateEmitter.fire());
const beansRequestType = new RequestType<BeansParams, Bean[], void>('spring/index/beans'); const beansRequestType = new RequestType<BeansParams, Bean[], void>('spring/index/beans');
const beans = (params: BeansParams) => { const beans = (params: BeansParams) => {
return client.sendRequest(beansRequestType, params); return client.sendRequest(beansRequestType, params);
} }
const getSpringModel = () => ({ const getSpringIndex = () => ({
onSpringIndexUpdated,
beans beans
}) })
@@ -79,13 +80,12 @@ export class ApiManager {
onDidLiveProcessUpdate, onDidLiveProcessUpdate,
onDidLiveProcessMemoryMetricsUpdate, onDidLiveProcessMemoryMetricsUpdate,
onDidLiveProcessGcPausesMetricsUpdate, onDidLiveProcessGcPausesMetricsUpdate,
onSpringModelUpdated,
getLiveProcessData, getLiveProcessData,
refreshLiveProcessData, refreshLiveProcessData,
getLiveProcessMetricsData, getLiveProcessMetricsData,
refreshLiveProcessMetricsData, refreshLiveProcessMetricsData,
listConnectedProcesses, listConnectedProcesses,
getSpringModel getSpringIndex
}; };
} }
} }

View File

@@ -38,6 +38,6 @@ export namespace LiveProcessMemoryMetricsUpdatedNotification {
export const type = new NotificationType<LiveProcess>('sts/liveprocess/memory/metrics/updated'); export const type = new NotificationType<LiveProcess>('sts/liveprocess/memory/metrics/updated');
} }
export namespace SpringModelUpdatedNotification { export namespace SpringIndexUpdatedNotification {
export const type = new NotificationType<void>('spring/index/updated'); export const type = new NotificationType<void>('spring/index/updated');
} }