Skip to content

Commit 53edf2b

Browse files
committed
[cleanup] Move requirement table tools declaration to the backend
Signed-off-by: Florian ROUËNÉ <florian.rouene@obeosoft.com>
1 parent a2b3e62 commit 53edf2b

23 files changed

+267
-920
lines changed

backend/application/syson-application/src/test/java/org/eclipse/syson/application/controllers/diagrams/graphql/CreateRequirementMutationRunner.java

Lines changed: 0 additions & 61 deletions
This file was deleted.

backend/application/syson-application/src/test/java/org/eclipse/syson/application/controllers/diagrams/graphql/ExposeRequirementsMutationRunner.java

Lines changed: 0 additions & 61 deletions
This file was deleted.

backend/application/syson-application/src/test/java/org/eclipse/syson/application/controllers/tables/RequirementsTableControllerIntegrationTests.java

Lines changed: 28 additions & 24 deletions
Original file line numberDiff line numberDiff line change
@@ -27,20 +27,19 @@
2727
import org.eclipse.sirius.components.collaborative.dto.CreateRepresentationInput;
2828
import org.eclipse.sirius.components.collaborative.tables.TableEventInput;
2929
import org.eclipse.sirius.components.collaborative.tables.dto.InvokeRowContextMenuEntryInput;
30+
import org.eclipse.sirius.components.collaborative.tables.dto.InvokeToolMenuEntryInput;
3031
import org.eclipse.sirius.components.core.api.SuccessPayload;
3132
import org.eclipse.sirius.components.tables.TextareaCell;
3233
import org.eclipse.sirius.components.tables.TextfieldCell;
3334
import org.eclipse.sirius.components.tables.tests.graphql.InvokeRowContextMenuEntryMutationRunner;
35+
import org.eclipse.sirius.components.tables.tests.graphql.InvokeToolMenuEntryMutationRunner;
3436
import org.eclipse.sirius.components.tables.tests.graphql.RowContextMenuQueryRunner;
3537
import org.eclipse.sirius.components.tables.tests.graphql.TableEventSubscriptionRunner;
3638
import org.eclipse.sirius.web.tests.services.api.IGivenCreatedTableSubscription;
3739
import org.eclipse.sirius.web.tests.services.api.IGivenInitialServerState;
3840
import org.eclipse.syson.AbstractIntegrationTests;
39-
import org.eclipse.syson.application.controllers.diagrams.graphql.CreateRequirementMutationRunner;
40-
import org.eclipse.syson.application.controllers.diagrams.graphql.ExposeRequirementsMutationRunner;
4141
import org.eclipse.syson.application.data.RequirementsTableTestProjectData;
42-
import org.eclipse.syson.table.requirements.view.dto.CreateRequirementInput;
43-
import org.eclipse.syson.table.requirements.view.dto.ExposeRequirementsInput;
42+
import org.eclipse.syson.table.requirements.view.RTVTableToolMenuEntriesProvider;
4443
import org.eclipse.syson.util.SysONRepresentationDescriptionIdentifiers;
4544
import org.junit.jupiter.api.BeforeEach;
4645
import org.junit.jupiter.api.DisplayName;
@@ -71,10 +70,7 @@ public class RequirementsTableControllerIntegrationTests extends AbstractIntegra
7170
private IGivenCreatedTableSubscription givenCreatedTableSubscription;
7271

7372
@Autowired
74-
private CreateRequirementMutationRunner createRequirementMutationRunner;
75-
76-
@Autowired
77-
private ExposeRequirementsMutationRunner exposeRequirementsMutationRunner;
73+
private InvokeToolMenuEntryMutationRunner invokeToolMenuEntryMutationRunner;
7874

7975
@Autowired
8076
private RowContextMenuQueryRunner rowContextMenuQueryRunner;
@@ -182,13 +178,15 @@ public void testCreateRequirementTableAction() {
182178
});
183179

184180
Runnable createRequirementTask = () -> {
185-
var createRequirementInput = new CreateRequirementInput(
181+
var invokeToolMenuEntryInput = new InvokeToolMenuEntryInput(
186182
UUID.randomUUID(),
187183
RequirementsTableTestProjectData.EDITING_CONTEXT_ID,
188-
tableId.get());
184+
tableId.get(),
185+
tableId.get(),
186+
RTVTableToolMenuEntriesProvider.ADD_REQUIREMENT_TABLE_TOOL_ENTRY);
189187

190-
var result = this.createRequirementMutationRunner.run(createRequirementInput);
191-
String typename = JsonPath.read(result.data(), "$.data.createRequirement.__typename");
188+
var result = this.invokeToolMenuEntryMutationRunner.run(invokeToolMenuEntryInput);
189+
String typename = JsonPath.read(result.data(), "$.data.invokeToolMenuEntry.__typename");
192190
assertThat(typename).isEqualTo(SuccessPayload.class.getSimpleName());
193191
};
194192

@@ -222,13 +220,15 @@ public void testExposeRequirementsTableAction() {
222220
});
223221

224222
Runnable exposeRequirementsTask = () -> {
225-
var createRequirementInput = new ExposeRequirementsInput(
223+
var invokeToolMenuEntryInput = new InvokeToolMenuEntryInput(
226224
UUID.randomUUID(),
227225
RequirementsTableTestProjectData.EDITING_CONTEXT_ID,
228-
tableId.get());
226+
tableId.get(),
227+
tableId.get(),
228+
RTVTableToolMenuEntriesProvider.IMPORT_EXISTING_REQUIREMENTS_TABLE_TOOL_ENTRY);
229229

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

@@ -269,13 +269,15 @@ public void testDeleteFromTable() {
269269
});
270270

271271
Runnable exposeRequirementsTask = () -> {
272-
var createRequirementInput = new ExposeRequirementsInput(
272+
var invokeToolMenuEntryInput = new InvokeToolMenuEntryInput(
273273
UUID.randomUUID(),
274274
RequirementsTableTestProjectData.EDITING_CONTEXT_ID,
275-
tableId.get());
275+
tableId.get(),
276+
tableId.get(),
277+
RTVTableToolMenuEntriesProvider.IMPORT_EXISTING_REQUIREMENTS_TABLE_TOOL_ENTRY);
276278

277-
var result = this.exposeRequirementsMutationRunner.run(createRequirementInput);
278-
String typename = JsonPath.read(result.data(), "$.data.exposeRequirements.__typename");
279+
var result = this.invokeToolMenuEntryMutationRunner.run(invokeToolMenuEntryInput);
280+
String typename = JsonPath.read(result.data(), "$.data.invokeToolMenuEntry.__typename");
279281
assertThat(typename).isEqualTo(SuccessPayload.class.getSimpleName());
280282
};
281283

@@ -354,13 +356,15 @@ public void testDeleteFromModel() {
354356
});
355357

356358
Runnable exposeRequirementsTask = () -> {
357-
var createRequirementInput = new ExposeRequirementsInput(
359+
var invokeToolMenuEntryInput = new InvokeToolMenuEntryInput(
358360
UUID.randomUUID(),
359361
RequirementsTableTestProjectData.EDITING_CONTEXT_ID,
360-
tableId.get());
362+
tableId.get(),
363+
tableId.get(),
364+
RTVTableToolMenuEntriesProvider.IMPORT_EXISTING_REQUIREMENTS_TABLE_TOOL_ENTRY);
361365

362-
var result = this.exposeRequirementsMutationRunner.run(createRequirementInput);
363-
String typename = JsonPath.read(result.data(), "$.data.exposeRequirements.__typename");
366+
var result = this.invokeToolMenuEntryMutationRunner.run(invokeToolMenuEntryInput);
367+
String typename = JsonPath.read(result.data(), "$.data.invokeToolMenuEntry.__typename");
364368
assertThat(typename).isEqualTo(SuccessPayload.class.getSimpleName());
365369
};
366370

Original file line numberDiff line numberDiff line change
@@ -0,0 +1,101 @@
1+
/*******************************************************************************
2+
* Copyright (c) 2026 Obeo.
3+
* This program and the accompanying materials
4+
* are made available under the terms of the Eclipse Public License v2.0
5+
* which accompanies this distribution, and is available at
6+
* https://www.eclipse.org/legal/epl-2.0/
7+
*
8+
* SPDX-License-Identifier: EPL-2.0
9+
*
10+
* Contributors:
11+
* Obeo - initial API and implementation
12+
*******************************************************************************/
13+
package org.eclipse.syson.table.requirements.view;
14+
15+
import java.util.Map;
16+
import java.util.Objects;
17+
import java.util.Optional;
18+
19+
import org.eclipse.emf.ecore.EClass;
20+
import org.eclipse.sirius.components.collaborative.api.ChangeKind;
21+
import org.eclipse.sirius.components.collaborative.tables.api.IToolMenuEntryExecutor;
22+
import org.eclipse.sirius.components.core.api.IEditingContext;
23+
import org.eclipse.sirius.components.core.api.IObjectSearchService;
24+
import org.eclipse.sirius.components.representations.Failure;
25+
import org.eclipse.sirius.components.representations.IStatus;
26+
import org.eclipse.sirius.components.representations.Success;
27+
import org.eclipse.sirius.components.tables.Table;
28+
import org.eclipse.sirius.components.tables.descriptions.TableDescription;
29+
import org.eclipse.syson.sysml.Membership;
30+
import org.eclipse.syson.sysml.RequirementUsage;
31+
import org.eclipse.syson.sysml.SysmlFactory;
32+
import org.eclipse.syson.sysml.ViewUsage;
33+
import org.eclipse.syson.sysml.metamodel.services.ElementInitializerSwitch;
34+
import org.eclipse.syson.util.GetIntermediateContainerCreationSwitch;
35+
import org.springframework.stereotype.Service;
36+
37+
/**
38+
* Executor for 'add-requirement' tool entry.
39+
*
40+
* @author frouene
41+
*/
42+
@Service
43+
public class RTVTableCreateRequirementToolExecutor implements IToolMenuEntryExecutor {
44+
45+
private final IObjectSearchService objectSearchService;
46+
47+
public RTVTableCreateRequirementToolExecutor(IObjectSearchService objectSearchService) {
48+
this.objectSearchService = Objects.requireNonNull(objectSearchService);
49+
}
50+
51+
@Override
52+
public boolean canExecute(IEditingContext editingContext, TableDescription tableDescription, Table table, String menuEntryId) {
53+
return menuEntryId.equals(RTVTableToolMenuEntriesProvider.ADD_REQUIREMENT_TABLE_TOOL_ENTRY);
54+
}
55+
56+
@Override
57+
public IStatus execute(IEditingContext editingContext, TableDescription tableDescription, Table table, String menuEntryId) {
58+
59+
var viewUsage = this.getViewUsage(editingContext, table);
60+
if (viewUsage != null) {
61+
boolean success = this.createRequirement(editingContext, viewUsage);
62+
if (success) {
63+
return new Success(ChangeKind.SEMANTIC_CHANGE, Map.of());
64+
}
65+
}
66+
return new Failure("Unable to create a RequirementUsage");
67+
}
68+
69+
private ViewUsage getViewUsage(IEditingContext editingContext, Table table) {
70+
var objectId = table.getTargetObjectId();
71+
var parentObject = this.objectSearchService.getObject(editingContext, objectId);
72+
if (parentObject.isPresent()) {
73+
var object = parentObject.get();
74+
if (object instanceof ViewUsage viewUsage) {
75+
return viewUsage;
76+
}
77+
}
78+
return null;
79+
}
80+
81+
private boolean createRequirement(IEditingContext editingContext, ViewUsage viewUsage) {
82+
var owningNamespace = viewUsage.getOwningNamespace();
83+
RequirementUsage newRequirementUsage = SysmlFactory.eINSTANCE.createRequirementUsage();
84+
Optional<EClass> optMembershipEClass = new GetIntermediateContainerCreationSwitch(owningNamespace).doSwitch(newRequirementUsage.eClass());
85+
if (optMembershipEClass.isPresent()) {
86+
var newMembership = SysmlFactory.eINSTANCE.create(optMembershipEClass.get());
87+
if (newMembership instanceof Membership membership) {
88+
var elementInitializerSwitch = new ElementInitializerSwitch();
89+
owningNamespace.getOwnedRelationship().add(membership);
90+
membership.getOwnedRelatedElement().add(newRequirementUsage);
91+
elementInitializerSwitch.doSwitch(newRequirementUsage);
92+
var membershipExpose = SysmlFactory.eINSTANCE.createMembershipExpose();
93+
viewUsage.getOwnedRelationship().add(membershipExpose);
94+
elementInitializerSwitch.doSwitch(membership);
95+
membershipExpose.setImportedMembership(membership);
96+
return true;
97+
}
98+
}
99+
return false;
100+
}
101+
}

0 commit comments

Comments
 (0)