From 495442220e5204a8f1d6aba0ff92d06a17793405 Mon Sep 17 00:00:00 2001 From: Axel RICHARD Date: Mon, 12 Sep 2022 18:28:53 +0200 Subject: [PATCH] [1354] Fix rename FormDescriptionEditor from the project explorer Bug: https://github.com/eclipse-sirius/sirius-components/issues/1354 Signed-off-by: Axel RICHARD --- CHANGELOG.adoc | 1 + .../FormDescriptionEditorEventProcessor.java | 12 ++- .../dto/RenameFormDescriptionEditorInput.java | 70 ++++++++++++++ ...nameFormDescriptionEditorEventHandler.java | 92 +++++++++++++++++++ ...ormDescriptionEditorEventHandlerTests.java | 92 +++++++++++++++++++ 5 files changed, 265 insertions(+), 2 deletions(-) create mode 100644 packages/formdescriptioneditors/backend/sirius-components-collaborative-formdescriptioneditors/src/main/java/org/eclipse/sirius/components/collaborative/formdescriptioneditors/dto/RenameFormDescriptionEditorInput.java create mode 100644 packages/formdescriptioneditors/backend/sirius-components-collaborative-formdescriptioneditors/src/main/java/org/eclipse/sirius/components/collaborative/formdescriptioneditors/handlers/RenameFormDescriptionEditorEventHandler.java create mode 100644 packages/formdescriptioneditors/backend/sirius-components-collaborative-formdescriptioneditors/src/test/java/org/eclipse/sirius/components/collaborative/formdescriptioneditors/handlers/RenameFormDescriptionEditorEventHandlerTests.java diff --git a/CHANGELOG.adoc b/CHANGELOG.adoc index f493cc0416..9baa43744e 100644 --- a/CHANGELOG.adoc +++ b/CHANGELOG.adoc @@ -49,6 +49,7 @@ The `label` value is displayed before the widget to be consistent with other pro - https://github.com/eclipse-sirius/sirius-components/issues/1349[#1349] [form] Fix Form Representation scrolling on Y axis - https://github.com/eclipse-sirius/sirius-components/issues/1351[#1351] [form] Fix Style/ConditionalStyle not applied to List Widget - https://github.com/eclipse-sirius/sirius-components/issues/457[#457] [form] Fix rename Form representation from the project explorer +- https://github.com/eclipse-sirius/sirius-components/issues/1354[#1354] [form] Fix rename FormDescriptionEditor representation from the project explorer === Improvements diff --git a/packages/formdescriptioneditors/backend/sirius-components-collaborative-formdescriptioneditors/src/main/java/org/eclipse/sirius/components/collaborative/formdescriptioneditors/FormDescriptionEditorEventProcessor.java b/packages/formdescriptioneditors/backend/sirius-components-collaborative-formdescriptioneditors/src/main/java/org/eclipse/sirius/components/collaborative/formdescriptioneditors/FormDescriptionEditorEventProcessor.java index 14c6db3441..c7c11591b4 100644 --- a/packages/formdescriptioneditors/backend/sirius-components-collaborative-formdescriptioneditors/src/main/java/org/eclipse/sirius/components/collaborative/formdescriptioneditors/FormDescriptionEditorEventProcessor.java +++ b/packages/formdescriptioneditors/backend/sirius-components-collaborative-formdescriptioneditors/src/main/java/org/eclipse/sirius/components/collaborative/formdescriptioneditors/FormDescriptionEditorEventProcessor.java @@ -21,11 +21,13 @@ import org.eclipse.sirius.components.collaborative.api.IRepresentationRefreshPolicy; import org.eclipse.sirius.components.collaborative.api.IRepresentationRefreshPolicyRegistry; import org.eclipse.sirius.components.collaborative.api.ISubscriptionManager; +import org.eclipse.sirius.components.collaborative.dto.RenameRepresentationInput; import org.eclipse.sirius.components.collaborative.formdescriptioneditors.api.IFormDescriptionEditorContext; import org.eclipse.sirius.components.collaborative.formdescriptioneditors.api.IFormDescriptionEditorCreationService; import org.eclipse.sirius.components.collaborative.formdescriptioneditors.api.IFormDescriptionEditorEventHandler; import org.eclipse.sirius.components.collaborative.formdescriptioneditors.api.IFormDescriptionEditorEventProcessor; import org.eclipse.sirius.components.collaborative.formdescriptioneditors.api.IFormDescriptionEditorInput; +import org.eclipse.sirius.components.collaborative.formdescriptioneditors.dto.RenameFormDescriptionEditorInput; import org.eclipse.sirius.components.core.api.IEditingContext; import org.eclipse.sirius.components.core.api.IInput; import org.eclipse.sirius.components.core.api.IPayload; @@ -97,8 +99,14 @@ public IRepresentation getRepresentation() { @Override public void handle(One payloadSink, Many changeDescriptionSink, IRepresentationInput representationInput) { - if (representationInput instanceof IFormDescriptionEditorInput) { - IFormDescriptionEditorInput formDescriptionEditorInput = (IFormDescriptionEditorInput) representationInput; + IRepresentationInput effectiveInput = representationInput; + if (representationInput instanceof RenameRepresentationInput) { + RenameRepresentationInput renameRepresentationInput = (RenameRepresentationInput) representationInput; + effectiveInput = new RenameFormDescriptionEditorInput(renameRepresentationInput.getId(), renameRepresentationInput.getEditingContextId(), renameRepresentationInput.getRepresentationId(), + renameRepresentationInput.getNewLabel()); + } + if (effectiveInput instanceof IFormDescriptionEditorInput) { + IFormDescriptionEditorInput formDescriptionEditorInput = (IFormDescriptionEditorInput) effectiveInput; Optional optionalFormEventHandler = this.formDescriptionEditorEventHandlers.stream().filter(handler -> handler.canHandle(formDescriptionEditorInput)) .findFirst(); diff --git a/packages/formdescriptioneditors/backend/sirius-components-collaborative-formdescriptioneditors/src/main/java/org/eclipse/sirius/components/collaborative/formdescriptioneditors/dto/RenameFormDescriptionEditorInput.java b/packages/formdescriptioneditors/backend/sirius-components-collaborative-formdescriptioneditors/src/main/java/org/eclipse/sirius/components/collaborative/formdescriptioneditors/dto/RenameFormDescriptionEditorInput.java new file mode 100644 index 0000000000..0c268de387 --- /dev/null +++ b/packages/formdescriptioneditors/backend/sirius-components-collaborative-formdescriptioneditors/src/main/java/org/eclipse/sirius/components/collaborative/formdescriptioneditors/dto/RenameFormDescriptionEditorInput.java @@ -0,0 +1,70 @@ +/******************************************************************************* + * Copyright (c) 2022 Obeo. + * This program and the accompanying materials + * are made available under the terms of the Eclipse Public License v2.0 + * which accompanies this distribution, and is available at + * https://www.eclipse.org/legal/epl-2.0/ + * + * SPDX-License-Identifier: EPL-2.0 + * + * Contributors: + * Obeo - initial API and implementation + *******************************************************************************/ +package org.eclipse.sirius.components.collaborative.formdescriptioneditors.dto; + +import java.text.MessageFormat; +import java.util.Objects; +import java.util.UUID; + +import org.eclipse.sirius.components.collaborative.formdescriptioneditors.api.IFormDescriptionEditorInput; + +/** + * The input of the rename diagram mutation. + * + * @author arichard + */ +public final class RenameFormDescriptionEditorInput implements IFormDescriptionEditorInput { + + private UUID id; + + private String editingContextId; + + private String formDescriptionEditorId; + + private String newLabel; + + public RenameFormDescriptionEditorInput() { + // Used by Jackson + } + + public RenameFormDescriptionEditorInput(UUID id, String editingContextId, String formDescriptionEditorId, String newLabel) { + this.id = Objects.requireNonNull(id); + this.editingContextId = Objects.requireNonNull(editingContextId); + this.formDescriptionEditorId = Objects.requireNonNull(formDescriptionEditorId); + this.newLabel = Objects.requireNonNull(newLabel); + } + + @Override + public UUID getId() { + return this.id; + } + + public String getEditingContextId() { + return this.editingContextId; + } + + @Override + public String getRepresentationId() { + return this.formDescriptionEditorId; + } + + public String getNewLabel() { + return this.newLabel; + } + + @Override + public String toString() { + String pattern = "{0} '{'id: {1}, editingContextId: {2}, formDescriptionEditorId: {3}, newLabel: {4}'}'"; //$NON-NLS-1$ + return MessageFormat.format(pattern, this.getClass().getSimpleName(), this.id, this.editingContextId, this.formDescriptionEditorId, this.newLabel); + } +} diff --git a/packages/formdescriptioneditors/backend/sirius-components-collaborative-formdescriptioneditors/src/main/java/org/eclipse/sirius/components/collaborative/formdescriptioneditors/handlers/RenameFormDescriptionEditorEventHandler.java b/packages/formdescriptioneditors/backend/sirius-components-collaborative-formdescriptioneditors/src/main/java/org/eclipse/sirius/components/collaborative/formdescriptioneditors/handlers/RenameFormDescriptionEditorEventHandler.java new file mode 100644 index 0000000000..e456be6295 --- /dev/null +++ b/packages/formdescriptioneditors/backend/sirius-components-collaborative-formdescriptioneditors/src/main/java/org/eclipse/sirius/components/collaborative/formdescriptioneditors/handlers/RenameFormDescriptionEditorEventHandler.java @@ -0,0 +1,92 @@ +/******************************************************************************* + * Copyright (c) 2022 Obeo. + * This program and the accompanying materials + * are made available under the terms of the Eclipse Public License v2.0 + * which accompanies this distribution, and is available at + * https://www.eclipse.org/legal/epl-2.0/ + * + * SPDX-License-Identifier: EPL-2.0 + * + * Contributors: + * Obeo - initial API and implementation + *******************************************************************************/ +package org.eclipse.sirius.components.collaborative.formdescriptioneditors.handlers; + +import java.util.Objects; + +import org.eclipse.sirius.components.collaborative.api.ChangeDescription; +import org.eclipse.sirius.components.collaborative.api.ChangeKind; +import org.eclipse.sirius.components.collaborative.api.IRepresentationPersistenceService; +import org.eclipse.sirius.components.collaborative.api.Monitoring; +import org.eclipse.sirius.components.collaborative.dto.RenameRepresentationSuccessPayload; +import org.eclipse.sirius.components.collaborative.formdescriptioneditors.api.IFormDescriptionEditorContext; +import org.eclipse.sirius.components.collaborative.formdescriptioneditors.api.IFormDescriptionEditorEventHandler; +import org.eclipse.sirius.components.collaborative.formdescriptioneditors.api.IFormDescriptionEditorInput; +import org.eclipse.sirius.components.collaborative.formdescriptioneditors.dto.RenameFormDescriptionEditorInput; +import org.eclipse.sirius.components.collaborative.formdescriptioneditors.messages.ICollaborativeFormDescriptionEditorMessageService; +import org.eclipse.sirius.components.core.api.ErrorPayload; +import org.eclipse.sirius.components.core.api.IEditingContext; +import org.eclipse.sirius.components.core.api.IPayload; +import org.eclipse.sirius.components.formdescriptioneditors.FormDescriptionEditor; +import org.springframework.stereotype.Service; + +import io.micrometer.core.instrument.Counter; +import io.micrometer.core.instrument.MeterRegistry; +import reactor.core.publisher.Sinks.Many; +import reactor.core.publisher.Sinks.One; + +/** + * Handler used to rename a form. + * + * @author arichard + */ +@Service +public class RenameFormDescriptionEditorEventHandler implements IFormDescriptionEditorEventHandler { + + private final IRepresentationPersistenceService representationPersistenceService; + + private final ICollaborativeFormDescriptionEditorMessageService messageService; + + private final Counter counter; + + public RenameFormDescriptionEditorEventHandler(IRepresentationPersistenceService representationPersistenceService, ICollaborativeFormDescriptionEditorMessageService messageService, + MeterRegistry meterRegistry) { + this.representationPersistenceService = Objects.requireNonNull(representationPersistenceService); + this.messageService = Objects.requireNonNull(messageService); + + // @formatter:off + this.counter = Counter.builder(Monitoring.EVENT_HANDLER) + .tag(Monitoring.NAME, this.getClass().getSimpleName()) + .register(meterRegistry); + // @formatter:on + } + + @Override + public boolean canHandle(IFormDescriptionEditorInput formDescriptionEditorInput) { + return formDescriptionEditorInput instanceof RenameFormDescriptionEditorInput; + } + + @Override + public void handle(One payloadSink, Many changeDescriptionSink, IEditingContext editingContext, IFormDescriptionEditorContext formDescriptionEditorContext, + IFormDescriptionEditorInput formDescriptionEditorInput) { + this.counter.increment(); + + String message = this.messageService.invalidInput(formDescriptionEditorInput.getClass().getSimpleName(), RenameFormDescriptionEditorInput.class.getSimpleName()); + IPayload payload = new ErrorPayload(formDescriptionEditorInput.getId(), message); + ChangeDescription changeDescription = new ChangeDescription(ChangeKind.NOTHING, formDescriptionEditorInput.getRepresentationId(), formDescriptionEditorInput); + + if (formDescriptionEditorInput instanceof RenameFormDescriptionEditorInput) { + RenameFormDescriptionEditorInput renameRepresentationInput = (RenameFormDescriptionEditorInput) formDescriptionEditorInput; + String newLabel = renameRepresentationInput.getNewLabel(); + + FormDescriptionEditor renamedFormDescriptionEditor = FormDescriptionEditor.newFormDescriptionEditor(formDescriptionEditorContext.getFormDescriptionEditor()).label(newLabel).build(); + this.representationPersistenceService.save(editingContext, renamedFormDescriptionEditor); + + payload = new RenameRepresentationSuccessPayload(formDescriptionEditorInput.getId(), renamedFormDescriptionEditor); + changeDescription = new ChangeDescription(ChangeKind.REPRESENTATION_RENAMING, renameRepresentationInput.getRepresentationId(), formDescriptionEditorInput); + } + + payloadSink.tryEmitValue(payload); + changeDescriptionSink.tryEmitNext(changeDescription); + } +} diff --git a/packages/formdescriptioneditors/backend/sirius-components-collaborative-formdescriptioneditors/src/test/java/org/eclipse/sirius/components/collaborative/formdescriptioneditors/handlers/RenameFormDescriptionEditorEventHandlerTests.java b/packages/formdescriptioneditors/backend/sirius-components-collaborative-formdescriptioneditors/src/test/java/org/eclipse/sirius/components/collaborative/formdescriptioneditors/handlers/RenameFormDescriptionEditorEventHandlerTests.java new file mode 100644 index 0000000000..7e9f02fe9d --- /dev/null +++ b/packages/formdescriptioneditors/backend/sirius-components-collaborative-formdescriptioneditors/src/test/java/org/eclipse/sirius/components/collaborative/formdescriptioneditors/handlers/RenameFormDescriptionEditorEventHandlerTests.java @@ -0,0 +1,92 @@ +/******************************************************************************* + * Copyright (c) 2022 Obeo. + * This program and the accompanying materials + * are made available under the terms of the Eclipse Public License v2.0 + * which accompanies this distribution, and is available at + * https://www.eclipse.org/legal/epl-2.0/ + * + * SPDX-License-Identifier: EPL-2.0 + * + * Contributors: + * Obeo - initial API and implementation + *******************************************************************************/ +package org.eclipse.sirius.components.collaborative.formdescriptioneditors.handlers; + +import static org.assertj.core.api.Assertions.assertThat; + +import java.util.List; +import java.util.UUID; + +import org.eclipse.sirius.components.collaborative.api.ChangeDescription; +import org.eclipse.sirius.components.collaborative.api.ChangeKind; +import org.eclipse.sirius.components.collaborative.api.IRepresentationPersistenceService; +import org.eclipse.sirius.components.collaborative.dto.RenameRepresentationSuccessPayload; +import org.eclipse.sirius.components.collaborative.formdescriptioneditors.api.IFormDescriptionEditorContext; +import org.eclipse.sirius.components.collaborative.formdescriptioneditors.dto.RenameFormDescriptionEditorInput; +import org.eclipse.sirius.components.collaborative.formdescriptioneditors.messages.ICollaborativeFormDescriptionEditorMessageService; +import org.eclipse.sirius.components.core.api.IEditingContext; +import org.eclipse.sirius.components.core.api.IPayload; +import org.eclipse.sirius.components.formdescriptioneditors.FormDescriptionEditor; +import org.junit.jupiter.api.Test; + +import io.micrometer.core.instrument.simple.SimpleMeterRegistry; +import reactor.core.publisher.Sinks; +import reactor.core.publisher.Sinks.Many; +import reactor.core.publisher.Sinks.One; + +/** + * Unit tests of the rename representation event handler. + * + * @author arichard + */ +public class RenameFormDescriptionEditorEventHandlerTests { + private static final String OLD_LABEL = "oldLabel"; //$NON-NLS-1$ + + private static final String NEW_LABEL = "newLabel"; //$NON-NLS-1$ + + @Test + public void testRenameRepresentation() { + String projectId = UUID.randomUUID().toString(); + String formDescriptionEditorDescriptionId = UUID.randomUUID().toString(); + String representationId = UUID.randomUUID().toString(); + UUID targetObjectId = UUID.randomUUID(); + + // @formatter:off + FormDescriptionEditor formDescriptionEditor = FormDescriptionEditor.newFormDescriptionEditor(representationId) + .label(OLD_LABEL) + .descriptionId(formDescriptionEditorDescriptionId) + .targetObjectId(targetObjectId.toString()) + .widgets(List.of()) + .build(); + // @formatter:on + + RenameFormDescriptionEditorEventHandler handler = new RenameFormDescriptionEditorEventHandler(new IRepresentationPersistenceService.NoOp(), + new ICollaborativeFormDescriptionEditorMessageService.NoOp(), new SimpleMeterRegistry()); + + var input = new RenameFormDescriptionEditorInput(UUID.randomUUID(), projectId, representationId, NEW_LABEL); + assertThat(handler.canHandle(input)).isTrue(); + + Many changeDescriptionSink = Sinks.many().unicast().onBackpressureBuffer(); + One payloadSink = Sinks.one(); + + IFormDescriptionEditorContext formDescriptionEditorContext = new IFormDescriptionEditorContext() { + + @Override + public void update(FormDescriptionEditor updatedFormDescriptionEditor) { + } + + @Override + public FormDescriptionEditor getFormDescriptionEditor() { + return formDescriptionEditor; + } + }; + handler.handle(payloadSink, changeDescriptionSink, new IEditingContext.NoOp(), formDescriptionEditorContext, input); + + ChangeDescription changeDescription = changeDescriptionSink.asFlux().blockFirst(); + assertThat(changeDescription.getKind()).isEqualTo(ChangeKind.REPRESENTATION_RENAMING); + + IPayload payload = payloadSink.asMono().block(); + assertThat(payload).isInstanceOf(RenameRepresentationSuccessPayload.class); + assertThat(((RenameRepresentationSuccessPayload) payload).getRepresentation().getLabel()).isEqualTo(NEW_LABEL); + } +}