Skip to content
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.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
5 changes: 4 additions & 1 deletion CHANGELOG.adoc
Original file line number Diff line number Diff line change
Expand Up @@ -5,7 +5,10 @@
=== Shapes

=== Breaking changes


- [cleanup] The definition of the tools specific to the requirements table has been moved to the backend.
As a result, the following GraphQL mutations have been removed `exposeRequirements` and `createRequirement`.

=== Dependency update

=== Bug fixes
Expand Down

This file was deleted.

This file was deleted.

Original file line number Diff line number Diff line change
Expand Up @@ -27,20 +27,21 @@
import org.eclipse.sirius.components.collaborative.dto.CreateRepresentationInput;
import org.eclipse.sirius.components.collaborative.tables.TableEventInput;
import org.eclipse.sirius.components.collaborative.tables.dto.InvokeRowContextMenuEntryInput;
import org.eclipse.sirius.components.collaborative.tables.dto.InvokeToolMenuEntryInput;
import org.eclipse.sirius.components.core.api.SuccessPayload;
import org.eclipse.sirius.components.tables.TextareaCell;
import org.eclipse.sirius.components.tables.TextfieldCell;
import org.eclipse.sirius.components.tables.tests.graphql.InvokeRowContextMenuEntryMutationRunner;
import org.eclipse.sirius.components.tables.tests.graphql.InvokeToolMenuEntryMutationRunner;
import org.eclipse.sirius.components.tables.tests.graphql.RowContextMenuQueryRunner;
import org.eclipse.sirius.components.tables.tests.graphql.TableEventSubscriptionRunner;
import org.eclipse.sirius.components.tables.tests.graphql.ToolMenuEntriesQueryRunner;
import org.eclipse.sirius.web.tests.services.api.IGivenCreatedTableSubscription;
import org.eclipse.sirius.web.tests.services.api.IGivenInitialServerState;
import org.eclipse.syson.AbstractIntegrationTests;
import org.eclipse.syson.application.controllers.diagrams.graphql.CreateRequirementMutationRunner;
import org.eclipse.syson.application.controllers.diagrams.graphql.ExposeRequirementsMutationRunner;
import org.eclipse.syson.GivenSysONServer;
import org.eclipse.syson.application.data.RequirementsTableTestProjectData;
import org.eclipse.syson.table.requirements.view.dto.CreateRequirementInput;
import org.eclipse.syson.table.requirements.view.dto.ExposeRequirementsInput;
import org.eclipse.syson.table.requirements.view.RTVTableToolMenuEntriesProvider;
import org.eclipse.syson.util.SysONRepresentationDescriptionIdentifiers;
import org.junit.jupiter.api.BeforeEach;
import org.junit.jupiter.api.DisplayName;
Expand Down Expand Up @@ -71,10 +72,7 @@ public class RequirementsTableControllerIntegrationTests extends AbstractIntegra
private IGivenCreatedTableSubscription givenCreatedTableSubscription;

@Autowired
private CreateRequirementMutationRunner createRequirementMutationRunner;

@Autowired
private ExposeRequirementsMutationRunner exposeRequirementsMutationRunner;
private InvokeToolMenuEntryMutationRunner invokeToolMenuEntryMutationRunner;

@Autowired
private RowContextMenuQueryRunner rowContextMenuQueryRunner;
Expand All @@ -85,6 +83,9 @@ public class RequirementsTableControllerIntegrationTests extends AbstractIntegra
@Autowired
private TableEventSubscriptionRunner tableEventSubscriptionRunner;

@Autowired
private ToolMenuEntriesQueryRunner toolMenuEntriesQueryRunner;

@BeforeEach
public void beforeEach() {
this.givenInitialServerState.initialize();
Expand Down Expand Up @@ -182,13 +183,15 @@ public void testCreateRequirementTableAction() {
});

Runnable createRequirementTask = () -> {
var createRequirementInput = new CreateRequirementInput(
var invokeToolMenuEntryInput = new InvokeToolMenuEntryInput(
UUID.randomUUID(),
RequirementsTableTestProjectData.EDITING_CONTEXT_ID,
tableId.get());
tableId.get(),
tableId.get(),
RTVTableToolMenuEntriesProvider.ADD_REQUIREMENT_TABLE_TOOL_ENTRY);

var result = this.createRequirementMutationRunner.run(createRequirementInput);
String typename = JsonPath.read(result.data(), "$.data.createRequirement.__typename");
var result = this.invokeToolMenuEntryMutationRunner.run(invokeToolMenuEntryInput);
String typename = JsonPath.read(result.data(), "$.data.invokeToolMenuEntry.__typename");
assertThat(typename).isEqualTo(SuccessPayload.class.getSimpleName());
};

Expand Down Expand Up @@ -222,13 +225,15 @@ public void testExposeRequirementsTableAction() {
});

Runnable exposeRequirementsTask = () -> {
var createRequirementInput = new ExposeRequirementsInput(
var invokeToolMenuEntryInput = new InvokeToolMenuEntryInput(
UUID.randomUUID(),
RequirementsTableTestProjectData.EDITING_CONTEXT_ID,
tableId.get());
tableId.get(),
tableId.get(),
RTVTableToolMenuEntriesProvider.IMPORT_EXISTING_REQUIREMENTS_TABLE_TOOL_ENTRY);

var result = this.exposeRequirementsMutationRunner.run(createRequirementInput);
String typename = JsonPath.read(result.data(), "$.data.exposeRequirements.__typename");
var result = this.invokeToolMenuEntryMutationRunner.run(invokeToolMenuEntryInput);
String typename = JsonPath.read(result.data(), "$.data.invokeToolMenuEntry.__typename");
assertThat(typename).isEqualTo(SuccessPayload.class.getSimpleName());
};

Expand Down Expand Up @@ -269,13 +274,15 @@ public void testDeleteFromTable() {
});

Runnable exposeRequirementsTask = () -> {
var createRequirementInput = new ExposeRequirementsInput(
var invokeToolMenuEntryInput = new InvokeToolMenuEntryInput(
UUID.randomUUID(),
RequirementsTableTestProjectData.EDITING_CONTEXT_ID,
tableId.get());
tableId.get(),
tableId.get(),
RTVTableToolMenuEntriesProvider.IMPORT_EXISTING_REQUIREMENTS_TABLE_TOOL_ENTRY);

var result = this.exposeRequirementsMutationRunner.run(createRequirementInput);
String typename = JsonPath.read(result.data(), "$.data.exposeRequirements.__typename");
var result = this.invokeToolMenuEntryMutationRunner.run(invokeToolMenuEntryInput);
String typename = JsonPath.read(result.data(), "$.data.invokeToolMenuEntry.__typename");
assertThat(typename).isEqualTo(SuccessPayload.class.getSimpleName());
};

Expand Down Expand Up @@ -354,13 +361,15 @@ public void testDeleteFromModel() {
});

Runnable exposeRequirementsTask = () -> {
var createRequirementInput = new ExposeRequirementsInput(
var invokeToolMenuEntryInput = new InvokeToolMenuEntryInput(
UUID.randomUUID(),
RequirementsTableTestProjectData.EDITING_CONTEXT_ID,
tableId.get());
tableId.get(),
tableId.get(),
RTVTableToolMenuEntriesProvider.IMPORT_EXISTING_REQUIREMENTS_TABLE_TOOL_ENTRY);

var result = this.exposeRequirementsMutationRunner.run(createRequirementInput);
String typename = JsonPath.read(result.data(), "$.data.exposeRequirements.__typename");
var result = this.invokeToolMenuEntryMutationRunner.run(invokeToolMenuEntryInput);
String typename = JsonPath.read(result.data(), "$.data.invokeToolMenuEntry.__typename");
assertThat(typename).isEqualTo(SuccessPayload.class.getSimpleName());
};

Expand Down Expand Up @@ -419,4 +428,20 @@ public void testDeleteFromModel() {
.thenCancel()
.verify(Duration.ofSeconds(10));
}

@Test
@GivenSysONServer({ RequirementsTableTestProjectData.SCRIPT_PATH })
@DisplayName("Given a requirements view table, when tool menu entries query is triggered, then all related tools are returned")
public void testToolMenuEntriesQuery() {

Map<String, Object> variables = Map.of(
"editingContextId", RequirementsTableTestProjectData.EDITING_CONTEXT_ID,
"representationId", RequirementsTableTestProjectData.GraphicalIds.TABLE_ID,
"tableId", RequirementsTableTestProjectData.GraphicalIds.TABLE_ID
);
var result = this.toolMenuEntriesQueryRunner.run(variables);

List<String> toolMenuEntriesId = JsonPath.read(result.data(), "$.data.viewer.editingContext.representation.description.toolMenuEntries[*].id");
assertThat(toolMenuEntriesId).containsExactlyInAnyOrder("add-requirement-table-tool-entry", "import-existing-requirements-table-tool-entry");
}
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,101 @@
/*******************************************************************************
* Copyright (c) 2026 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.syson.table.requirements.view;

import java.util.Map;
import java.util.Objects;
import java.util.Optional;

import org.eclipse.emf.ecore.EClass;
import org.eclipse.sirius.components.collaborative.api.ChangeKind;
import org.eclipse.sirius.components.collaborative.tables.api.IToolMenuEntryExecutor;
import org.eclipse.sirius.components.core.api.IEditingContext;
import org.eclipse.sirius.components.core.api.IObjectSearchService;
import org.eclipse.sirius.components.representations.Failure;
import org.eclipse.sirius.components.representations.IStatus;
import org.eclipse.sirius.components.representations.Success;
import org.eclipse.sirius.components.tables.Table;
import org.eclipse.sirius.components.tables.descriptions.TableDescription;
import org.eclipse.syson.sysml.Membership;
import org.eclipse.syson.sysml.RequirementUsage;
import org.eclipse.syson.sysml.SysmlFactory;
import org.eclipse.syson.sysml.ViewUsage;
import org.eclipse.syson.sysml.metamodel.services.ElementInitializerSwitch;
import org.eclipse.syson.util.GetIntermediateContainerCreationSwitch;
import org.springframework.stereotype.Service;

/**
* Executor for 'add-requirement' tool entry.
*
* @author frouene
*/
@Service
public class RTVTableCreateRequirementToolExecutor implements IToolMenuEntryExecutor {

private final IObjectSearchService objectSearchService;

public RTVTableCreateRequirementToolExecutor(IObjectSearchService objectSearchService) {
this.objectSearchService = Objects.requireNonNull(objectSearchService);
}

@Override
public boolean canExecute(IEditingContext editingContext, TableDescription tableDescription, Table table, String menuEntryId) {
return menuEntryId.equals(RTVTableToolMenuEntriesProvider.ADD_REQUIREMENT_TABLE_TOOL_ENTRY);
}

@Override
public IStatus execute(IEditingContext editingContext, TableDescription tableDescription, Table table, String menuEntryId) {

var viewUsage = this.getViewUsage(editingContext, table);
if (viewUsage != null) {
boolean success = this.createRequirement(editingContext, viewUsage);
if (success) {
return new Success(ChangeKind.SEMANTIC_CHANGE, Map.of());
}
}
return new Failure("Unable to create a RequirementUsage");
}

private ViewUsage getViewUsage(IEditingContext editingContext, Table table) {
var objectId = table.getTargetObjectId();
var parentObject = this.objectSearchService.getObject(editingContext, objectId);
if (parentObject.isPresent()) {
var object = parentObject.get();
if (object instanceof ViewUsage viewUsage) {
return viewUsage;
}
}
return null;
}

private boolean createRequirement(IEditingContext editingContext, ViewUsage viewUsage) {
var owningNamespace = viewUsage.getOwningNamespace();
RequirementUsage newRequirementUsage = SysmlFactory.eINSTANCE.createRequirementUsage();
Optional<EClass> optMembershipEClass = new GetIntermediateContainerCreationSwitch(owningNamespace).doSwitch(newRequirementUsage.eClass());
if (optMembershipEClass.isPresent()) {
var newMembership = SysmlFactory.eINSTANCE.create(optMembershipEClass.get());
if (newMembership instanceof Membership membership) {
var elementInitializerSwitch = new ElementInitializerSwitch();
owningNamespace.getOwnedRelationship().add(membership);
membership.getOwnedRelatedElement().add(newRequirementUsage);
elementInitializerSwitch.doSwitch(newRequirementUsage);
var membershipExpose = SysmlFactory.eINSTANCE.createMembershipExpose();
viewUsage.getOwnedRelationship().add(membershipExpose);
elementInitializerSwitch.doSwitch(membership);
membershipExpose.setImportedMembership(membership);
return true;
}
}
return false;
}
}
Loading
Loading