Skip to content

Commit

Permalink
eclipse-glsp#123 Centralize configuration in the server (eclipse-glsp#87
Browse files Browse the repository at this point in the history
)

* eclipse-glsp#123 Centralize configuration in the server

- Add ConfigureServerHandlersAction

refs eclipse-glsp/glsp/issues/123

Signed-off-by: Camille Letavernier <[email protected]>
Signed-off-by: Philip Langer <[email protected]>
Co-authored-by: Philip Langer <[email protected]>
  • Loading branch information
2 people authored and holkerveen committed Dec 21, 2024
1 parent 4c00b8d commit 1b2c44e
Show file tree
Hide file tree
Showing 3 changed files with 51 additions and 61 deletions.
40 changes: 38 additions & 2 deletions packages/client/src/base/actions/protocol-actions.ts
Original file line number Diff line number Diff line change
Expand Up @@ -13,8 +13,8 @@
*
* SPDX-License-Identifier: EPL-2.0 OR GPL-2.0 WITH Classpath-exception-2.0
********************************************************************************/
import { injectable } from "inversify";
import { Action } from "sprotty";
import { inject, injectable } from "inversify";
import { Action, ActionHandlerRegistry, IActionHandler, ModelSource, TYPES } from "sprotty";

/**
* Initializes the graphical representation (diagram) for a specific client session.
Expand Down Expand Up @@ -49,3 +49,39 @@ export class DisposeClientSessionAction implements Action {
export function isDisposeClientSessionAction(action: Action): action is DisposeClientSessionAction {
return action.kind === DisposeClientSessionAction.KIND;
}

/**
* Sent by the server after ClientSessionInitialization, to indicate
* all the action kinds that the server can handle.
*/
@injectable()
export class ConfigureServerHandlersAction implements Action {
static readonly KIND = "configureServerHandlers";
readonly kind = ConfigureServerHandlersAction.KIND;

constructor(readonly actionKinds: string[]) { }
}

export function isConfigureServerHandlersAction(action: Action): action is ConfigureServerHandlersAction {
return action.kind === ConfigureServerHandlersAction.KIND;
}

@injectable()
export class ConfigureServerHandlersActionHandler implements IActionHandler {

@inject(TYPES.ModelSource)
protected diagramServer: ModelSource;

@inject(TYPES.ActionHandlerRegistryProvider)
actionHandlerRegistryProvider: () => Promise<ActionHandlerRegistry>;

handle(action: Action): void {
if (isConfigureServerHandlersAction(action)) {
this.actionHandlerRegistryProvider().then(registry => {
for (const actionKind of action.actionKinds) {
registry.register(actionKind, this.diagramServer);
}
});
}
}
}
4 changes: 4 additions & 0 deletions packages/client/src/base/di.config.ts
Original file line number Diff line number Diff line change
Expand Up @@ -20,6 +20,7 @@ import { configureActionHandler, configureCommand, SetModelCommand, TYPES } from

import { GLSPActionDispatcher } from "./action-dispatcher";
import { SetEditModeAction } from "./actions/edit-mode-action";
import { ConfigureServerHandlersAction, ConfigureServerHandlersActionHandler } from "./actions/protocol-actions";
import { GLSPCommandStack } from "./command-stack";
import { EditorContextService } from "./editor-context";
import { DefaultModelInitializationConstraint, ModelInitializationConstraint } from "./model-initialization-constraint";
Expand Down Expand Up @@ -49,6 +50,9 @@ const defaultGLSPModule = new ContainerModule((bind, _unbind, isBound, rebind) =
configureCommand(context, FeedbackAwareUpdateModelCommand);
configureActionHandler(context, SetModelCommand.KIND, SetModelActionHandler);

// Dynamically register all server-side action/operation handlers
configureActionHandler(context, ConfigureServerHandlersAction.KIND, ConfigureServerHandlersActionHandler);

bind(TYPES.MouseListener).to(SelectionClearingMouseListener);

rebind(TYPES.ICommandStack).to(GLSPCommandStack);
Expand Down
68 changes: 9 additions & 59 deletions packages/client/src/model-source/glsp-diagram-server.ts
Original file line number Diff line number Diff line change
Expand Up @@ -19,46 +19,19 @@ import {
Action,
ActionHandlerRegistry,
ActionMessage,
ApplyLabelEditAction,
ComputedBoundsAction,
DiagramServer,
ExportSvgAction,
ICommand,
LayoutAction,
RequestBoundsCommand,
RequestModelAction,
RequestPopupModelAction,
ServerStatusAction,
SwitchEditModeCommand
} from "sprotty";

import { RequestContextActions } from "../base/actions/context-actions";
import { isSetEditModeAction, SetEditModeAction } from "../base/actions/edit-mode-action";
import { RequestEditValidationAction } from "../base/actions/edit-validation-actions";
import { DisposeClientSessionAction, InitializeClientSessionAction } from "../base/actions/protocol-actions";
import {
ChangeBoundsOperation,
ChangeRoutingPointsOperation,
CompoundOperation,
CreateEdgeOperation,
CreateNodeOperation,
DeleteElementOperation,
ReconnectEdgeOperation
} from "../base/operations/operation";
import { InitializeClientSessionAction } from "../base/actions/protocol-actions";
import { SourceUriAware } from "../base/source-uri-aware";
import {
CutOperationAction,
PasteOperationAction,
RequestClipboardDataAction
} from "../features/copy-paste/copy-paste-actions";
import { ValidateLabelEditAction } from "../features/edit-label/edit-label-validator";
import { ExecuteServerCommandAction } from "../features/execute/execute-command";
import { RequestTypeHintsAction } from "../features/hints/request-type-hints-action";
import { RequestNavigationTargetsAction } from "../features/navigation/navigation-action-handler";
import { ResolveNavigationTargetAction } from "../features/navigation/navigation-target-resolver";
import { SaveModelAction } from "../features/save/save";
import { GlspRedoAction, GlspUndoAction } from "../features/undo-redo/model";
import { RequestMarkersAction } from "../features/validation/validate";
import { isServerMessageAction, ServerMessageAction } from "./glsp-server-status";

const receivedFromServerProperty = '__receivedFromServer';
Expand Down Expand Up @@ -132,42 +105,19 @@ export function isReceivedFromServer(action: Action) {
}

export function registerDefaultGLSPServerActions(registry: ActionHandlerRegistry, diagramServer: DiagramServer) {
registry.register(SaveModelAction.KIND, diagramServer);
registry.register(GlspUndoAction.KIND, diagramServer);
registry.register(GlspRedoAction.KIND, diagramServer);
registry.register(CreateEdgeOperation.KIND, diagramServer);
registry.register(ReconnectEdgeOperation.KIND, diagramServer);
registry.register(ChangeRoutingPointsOperation.KIND, diagramServer);
registry.register(CreateNodeOperation.KIND, diagramServer);
registry.register(ChangeBoundsOperation.KIND, diagramServer);
registry.register(DeleteElementOperation.KIND, diagramServer);
registry.register(ExecuteServerCommandAction.KIND, diagramServer);
// Register the InitializeClientSessionAction as a server action. Then, the server will
// notify us about all actions it handles (Via ConfigureServerHandlersAction/Handler)
registry.register(InitializeClientSessionAction.KIND, diagramServer);

// Register some additional early actions, that will happen before the server can tell us
// which actions it handles
registry.register(RequestTypeHintsAction.KIND, diagramServer);
registry.register(ComputedBoundsAction.KIND, diagramServer);
registry.register(RequestBoundsCommand.KIND, diagramServer);
registry.register(RequestPopupModelAction.KIND, diagramServer);
registry.register(ServerStatusAction.KIND, diagramServer);
registry.register(RequestModelAction.KIND, diagramServer);
registry.register(ExportSvgAction.KIND, diagramServer);
registry.register(RequestContextActions.KIND, diagramServer);
registry.register(ValidateLabelEditAction.KIND, diagramServer);
registry.register(RequestMarkersAction.KIND, diagramServer);
registry.register(LayoutAction.KIND, diagramServer);
registry.register(ApplyLabelEditAction.KIND, diagramServer);
registry.register(RequestClipboardDataAction.KIND, diagramServer);
registry.register(PasteOperationAction.KIND, diagramServer);
registry.register(CutOperationAction.KIND, diagramServer);
registry.register(RequestEditValidationAction.KIND, diagramServer);
registry.register(RequestNavigationTargetsAction.KIND, diagramServer);
registry.register(ResolveNavigationTargetAction.KIND, diagramServer);
registry.register(CompoundOperation.KIND, diagramServer);
registry.register(SetEditModeAction.KIND, diagramServer);
registry.register(DisposeClientSessionAction.KIND, diagramServer);
registry.register(ServerMessageAction.KIND, diagramServer);

registry.register(ServerStatusAction.KIND, diagramServer);

// Register an empty handler for SwitchEditMode, to avoid runtime exceptions.
// We don't want to support SwitchEditMode, but sprotty still sends some corresponding
// actions.
// We don't support SwitchEditMode, but Sprotty still sends those actions, so ignore them.
registry.register(SwitchEditModeCommand.KIND, { handle: action => undefined });
}

0 comments on commit 1b2c44e

Please sign in to comment.