Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

[1354] Fix rename FormDescriptionEditor from the project explorer #1355

Merged
merged 1 commit into from
Sep 13, 2022
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Jump to
Jump to file
Failed to load files.
Diff view
Diff view
1 change: 1 addition & 0 deletions CHANGELOG.adoc
Original file line number Diff line number Diff line change
Expand Up @@ -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

Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -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;
Expand Down Expand Up @@ -97,8 +99,14 @@ public IRepresentation getRepresentation() {

@Override
public void handle(One<IPayload> payloadSink, Many<ChangeDescription> 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<IFormDescriptionEditorEventHandler> optionalFormEventHandler = this.formDescriptionEditorEventHandlers.stream().filter(handler -> handler.canHandle(formDescriptionEditorInput))
.findFirst();
Expand Down
Original file line number Diff line number Diff line change
@@ -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);
}
}
Original file line number Diff line number Diff line change
@@ -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<IPayload> payloadSink, Many<ChangeDescription> 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);
}
}
Original file line number Diff line number Diff line change
@@ -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<ChangeDescription> changeDescriptionSink = Sinks.many().unicast().onBackpressureBuffer();
One<IPayload> 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);
}
}