From c0542eadfdab5ec4ece51b2737354dd60ed596a4 Mon Sep 17 00:00:00 2001 From: Guillaume Coutable Date: Mon, 8 Jun 2026 17:50:44 +0200 Subject: [PATCH] [2260] Add edge tools to create 'assume' and 'require' relations Bug: https://github.com/eclipse-syson/syson/issues/2260 Signed-off-by: Guillaume Coutable --- CHANGELOG.adoc | 1 + ...VRequirementConstraintMembershipTests.java | 203 ++++++++++++++++++ ...eneralViewWithTopNodesTestProjectData.java | 2 + .../view/services/ViewEdgeToolService.java | 53 +++++ .../view/services/ViewEdgeToolSwitch.java | 4 + ...se-notes-assume-and-require-edge-tools.png | Bin 0 -> 43713 bytes .../pages/release-notes/2026.7.0.adoc | 7 +- 7 files changed, 269 insertions(+), 1 deletion(-) create mode 100644 backend/application/syson-application/src/test/java/org/eclipse/syson/application/controllers/diagrams/general/view/GVRequirementConstraintMembershipTests.java create mode 100644 doc/content/modules/user-manual/assets/images/release-notes-assume-and-require-edge-tools.png diff --git a/CHANGELOG.adoc b/CHANGELOG.adoc index 8690d0498..d2cfd32a2 100644 --- a/CHANGELOG.adoc +++ b/CHANGELOG.adoc @@ -55,6 +55,7 @@ This is currently supported on `Features` (e.g. `Attribute`), `Constraints` and It leverages the selection dialog to either create an _occurrence timeslice/snapshot_, or the _usage timeslice/snapshot_ matching the `OccurrenceDefinition` on which the tool is applied. - https://github.com/eclipse-syson/syson/issues/2250[#2250] [diagrams] Leverage the selection dialog to improve the graphical node tools creating a _require_ `ConstraintUsage`, or an _assume_ `ConstraintUsage`, from `RequirementUsage` and `RequirementDefinition` graphical nodes. - https://github.com/eclipse-syson/syson/issues/2254[#2254] [diagrams] Add the support for _assume_ and _require_ graphical edges. +- https://github.com/eclipse-syson/syson/issues/2260[#2260] [diagrams] Add the _New Assume Constraint_ or _New Require Constraint_ edge tools to create _assume_ and _require_ graphical edges. == v2026.5.0 diff --git a/backend/application/syson-application/src/test/java/org/eclipse/syson/application/controllers/diagrams/general/view/GVRequirementConstraintMembershipTests.java b/backend/application/syson-application/src/test/java/org/eclipse/syson/application/controllers/diagrams/general/view/GVRequirementConstraintMembershipTests.java new file mode 100644 index 000000000..c383e0eeb --- /dev/null +++ b/backend/application/syson-application/src/test/java/org/eclipse/syson/application/controllers/diagrams/general/view/GVRequirementConstraintMembershipTests.java @@ -0,0 +1,203 @@ +/******************************************************************************* + * 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.application.controllers.diagrams.general.view; + +import static org.assertj.core.api.Assertions.assertThat; +import static org.assertj.core.api.InstanceOfAssertFactories.type; +import static org.eclipse.sirius.components.diagrams.tests.DiagramEventPayloadConsumer.assertRefreshedDiagramThat; +import static org.eclipse.sirius.components.diagrams.tests.assertions.DiagramInstanceOfAssertFactories.EDGE; +import static org.eclipse.sirius.components.diagrams.tests.assertions.DiagramInstanceOfAssertFactories.EDGE_STYLE; + +import java.time.Duration; +import java.util.List; +import java.util.UUID; +import java.util.concurrent.atomic.AtomicReference; +import java.util.function.Consumer; + +import org.eclipse.emf.ecore.EClass; +import org.eclipse.sirius.components.collaborative.diagrams.dto.DiagramEventInput; +import org.eclipse.sirius.components.collaborative.diagrams.dto.DiagramRefreshedEventPayload; +import org.eclipse.sirius.components.core.api.IObjectSearchService; +import org.eclipse.sirius.components.diagrams.ArrowStyle; +import org.eclipse.sirius.components.diagrams.Diagram; +import org.eclipse.sirius.components.diagrams.Edge; +import org.eclipse.sirius.components.diagrams.Label; +import org.eclipse.sirius.components.diagrams.ViewModifier; +import org.eclipse.sirius.components.view.emf.diagram.IDiagramIdProvider; +import org.eclipse.sirius.web.tests.services.api.IGivenInitialServerState; +import org.eclipse.syson.AbstractIntegrationTests; +import org.eclipse.syson.GivenSysONServer; +import org.eclipse.syson.application.controller.editingcontext.checkers.SemanticCheckerService; +import org.eclipse.syson.application.controllers.diagrams.testers.EdgeCreationTester; +import org.eclipse.syson.application.data.GeneralViewWithTopNodesTestProjectData; +import org.eclipse.syson.services.SemanticRunnableFactory; +import org.eclipse.syson.services.diagrams.DiagramComparator; +import org.eclipse.syson.services.diagrams.DiagramDescriptionIdProvider; +import org.eclipse.syson.services.diagrams.api.IGivenDiagramDescription; +import org.eclipse.syson.services.diagrams.api.IGivenDiagramSubscription; +import org.eclipse.syson.standard.diagrams.view.SDVDescriptionNameGenerator; +import org.eclipse.syson.sysml.RequirementConstraintMembership; +import org.eclipse.syson.sysml.SysmlPackage; +import org.eclipse.syson.sysml.metamodel.helper.LabelConstants; +import org.eclipse.syson.util.IDescriptionNameGenerator; +import org.eclipse.syson.util.SysONRepresentationDescriptionIdentifiers; +import org.junit.jupiter.api.BeforeEach; +import org.junit.jupiter.api.DisplayName; +import org.junit.jupiter.api.Test; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.boot.test.context.SpringBootTest; +import org.springframework.transaction.annotation.Transactional; + +import reactor.core.publisher.Flux; +import reactor.test.StepVerifier; + +/** + * {@link org.eclipse.syson.sysml.RequirementConstraintMembership} related test in General View. + * + * @author gcoutable + */ +@Transactional +@GivenSysONServer({ GeneralViewWithTopNodesTestProjectData.SCRIPT_PATH }) +@SuppressWarnings("checkstyle:MultipleStringLiterals") +@SpringBootTest(webEnvironment = SpringBootTest.WebEnvironment.RANDOM_PORT) +public class GVRequirementConstraintMembershipTests extends AbstractIntegrationTests { + + @Autowired + private IGivenInitialServerState givenInitialServerState; + + @Autowired + private IGivenDiagramSubscription givenDiagramSubscription; + + @Autowired + private IGivenDiagramDescription givenDiagramDescription; + + @Autowired + private IDiagramIdProvider diagramIdProvider; + + @Autowired + private DiagramComparator diagramComparator; + + @Autowired + private SemanticRunnableFactory semanticRunnableFactory; + + @Autowired + private IObjectSearchService objectSearchService; + + @Autowired + private EdgeCreationTester edgeCreationTester; + + private final IDescriptionNameGenerator descriptionNameGenerator = new SDVDescriptionNameGenerator(); + + private SemanticCheckerService semanticCheckerService; + + private Flux givenSubscriptionToDiagram() { + var diagramEventInput = new DiagramEventInput(UUID.randomUUID(), GeneralViewWithTopNodesTestProjectData.EDITING_CONTEXT_ID, GeneralViewWithTopNodesTestProjectData.GraphicalIds.DIAGRAM_ID); + return this.givenDiagramSubscription.subscribe(diagramEventInput); + } + + @BeforeEach + public void setUp() { + this.givenInitialServerState.initialize(); + this.semanticCheckerService = new SemanticCheckerService(this.semanticRunnableFactory, this.objectSearchService, GeneralViewWithTopNodesTestProjectData.EDITING_CONTEXT_ID, + GeneralViewWithTopNodesTestProjectData.SemanticIds.PACKAGE_1_ID); + } + + @DisplayName("GIVEN the general view diagram, WHEN the assume edge tool between a RequirementUsage graphical node and a ConstraintUsage graphical node is used, THEN it creates an assume edge between both elements") + @Test + public void testCreateAssumeConstraintWithEdgeToolBetweenRequirementUsageAndConstraintUsage() { + this.createRequirementConstraintMembershipWithEdgeTool(SysmlPackage.eINSTANCE.getRequirementUsage(), "New Assume Constraint", GeneralViewWithTopNodesTestProjectData.GraphicalIds.REQUIREMENT_USAGE_ID, LabelConstants.OPEN_QUOTE + LabelConstants.ASSUME + LabelConstants.CLOSE_QUOTE, "requirement"); + } + + @DisplayName("GIVEN the general view diagram, WHEN the assume edge tool between a RequirementDefinition graphical node and a ConstraintUsage graphical node is used, THEN it creates an assume edge between both elements") + @Test + public void testCreateAssumeConstraintWithEdgeToolBetweenRequirementDefinitionAndConstraintUsage() { + this.createRequirementConstraintMembershipWithEdgeTool(SysmlPackage.eINSTANCE.getRequirementDefinition(), "New Assume Constraint", GeneralViewWithTopNodesTestProjectData.GraphicalIds.REQUIREMENT_DEFINITION_ID, LabelConstants.OPEN_QUOTE + LabelConstants.ASSUME + LabelConstants.CLOSE_QUOTE, "RequirementDefinition"); + } + + @DisplayName("GIVEN the general view diagram, WHEN the require edge tool between a RequirementUsage graphical node and a ConstraintUsage graphical node is used, THEN it creates a require edge between both elements") + @Test + public void testCreateRequireConstraintWithEdgeToolBetweenRequirementUsageAndConstraintUsage() { + this.createRequirementConstraintMembershipWithEdgeTool(SysmlPackage.eINSTANCE.getRequirementUsage(), "New Require Constraint", GeneralViewWithTopNodesTestProjectData.GraphicalIds.REQUIREMENT_USAGE_ID, LabelConstants.OPEN_QUOTE + LabelConstants.REQUIRE + LabelConstants.CLOSE_QUOTE, "requirement"); + } + + @DisplayName("GIVEN the general view diagram, WHEN the require edge tool between a RequirementDefinition graphical node and a ConstraintUsage graphical node is used, THEN it creates a require edge between both elements") + @Test + public void testCreateRequireConstraintWithEdgeToolBetweenRequirementDefinitionAndConstraintUsage() { + this.createRequirementConstraintMembershipWithEdgeTool(SysmlPackage.eINSTANCE.getRequirementDefinition(), "New Require Constraint", GeneralViewWithTopNodesTestProjectData.GraphicalIds.REQUIREMENT_DEFINITION_ID, LabelConstants.OPEN_QUOTE + LabelConstants.REQUIRE + LabelConstants.CLOSE_QUOTE, "RequirementDefinition"); + } + + private void createRequirementConstraintMembershipWithEdgeTool(EClass parentEClass, String toolName, String graphicalSourceNodeId, String expectedEdgeLabel, String parentLabel) { + var flux = this.givenSubscriptionToDiagram(); + + var diagramDescription = this.givenDiagramDescription.getDiagramDescription(GeneralViewWithTopNodesTestProjectData.EDITING_CONTEXT_ID, + SysONRepresentationDescriptionIdentifiers.GENERAL_VIEW_DIAGRAM_DESCRIPTION_ID); + var diagramDescriptionIdProvider = new DiagramDescriptionIdProvider(diagramDescription, this.diagramIdProvider); + + var edgeCreationToolId = diagramDescriptionIdProvider.getEdgeCreationToolId( + this.descriptionNameGenerator.getNodeName(parentEClass), + toolName); + + AtomicReference diagram = new AtomicReference<>(); + Consumer initialDiagramContentConsumer = assertRefreshedDiagramThat(diagram::set); + + Runnable createEdgeRunnable = () -> this.edgeCreationTester.createEdgeUsingNodeId(GeneralViewWithTopNodesTestProjectData.EDITING_CONTEXT_ID, + diagram, + graphicalSourceNodeId, + GeneralViewWithTopNodesTestProjectData.GraphicalIds.CONSTRAINT_USAGE_ID, + edgeCreationToolId); + + Consumer diagramContentConsumerAfterNewEdge = assertRefreshedDiagramThat(newDiagram -> { + var newEdges = this.diagramComparator.newEdges(diagram.get(), newDiagram); + var newVisibleEdges = newEdges.stream().filter(edge -> edge.getState() != ViewModifier.Hidden).toList(); + + assertThat(newVisibleEdges).hasSize(1).first(EDGE) + .hasSourceId(graphicalSourceNodeId) + .hasTargetId(GeneralViewWithTopNodesTestProjectData.GraphicalIds.CONSTRAINT_USAGE_ID) + .extracting(Edge::getCenterLabel) + .extracting(Label::text) + .hasToString(expectedEdgeLabel); + + assertThat(newVisibleEdges).hasSize(1).first(EDGE) + .extracting(Edge::getStyle, EDGE_STYLE) + .hasSourceArrow(ArrowStyle.None) + .hasTargetArrow(ArrowStyle.InputArrow); + }); + + Consumer additionalCheck = object -> { + assertThat(object).isInstanceOf(List.class) + .asInstanceOf(type(List.class)) + .satisfies(requirementConstraintMemberships -> { + assertThat((List) requirementConstraintMemberships).size().isEqualTo(1); + assertThat(requirementConstraintMemberships.getFirst()) + .isInstanceOf(RequirementConstraintMembership.class) + .asInstanceOf(type(RequirementConstraintMembership.class)) + .satisfies(requirementConstraintMembership -> { + var ownedConstraint = requirementConstraintMembership.getOwnedConstraint(); + var ownedSubsetting = ownedConstraint.getOwnedSubsetting(); + assertThat(ownedSubsetting).isNotEmpty(); + assertThat(ownedSubsetting.getFirst().getSubsettedFeature()).isEqualTo(requirementConstraintMembership.getReferencedConstraint()); + }); + }); + }; + + Runnable semanticCheck = this.semanticCheckerService.checkEditingContext(this.semanticCheckerService.getElementInParentSemanticChecker(parentLabel, SysmlPackage.eINSTANCE.getElement_OwnedRelationship(), SysmlPackage.eINSTANCE.getRequirementConstraintMembership(), additionalCheck)); + + StepVerifier.create(flux) + .consumeNextWith(initialDiagramContentConsumer) + .then(createEdgeRunnable) + .consumeNextWith(diagramContentConsumerAfterNewEdge) + .then(semanticCheck) + .thenCancel() + .verify(Duration.ofSeconds(10)); + } +} diff --git a/backend/application/syson-application/src/test/java/org/eclipse/syson/application/data/GeneralViewWithTopNodesTestProjectData.java b/backend/application/syson-application/src/test/java/org/eclipse/syson/application/data/GeneralViewWithTopNodesTestProjectData.java index efebbc237..b0a24bc44 100644 --- a/backend/application/syson-application/src/test/java/org/eclipse/syson/application/data/GeneralViewWithTopNodesTestProjectData.java +++ b/backend/application/syson-application/src/test/java/org/eclipse/syson/application/data/GeneralViewWithTopNodesTestProjectData.java @@ -38,6 +38,8 @@ public static class GraphicalIds { public static final String CONCERN_USAGE_ID = "0999b8c3-d37c-3644-a1d6-b9777a499d11"; + public static final String CONSTRAINT_USAGE_ID = "22da3b61-32f6-346e-9deb-7dd1f64bfd69"; + public static final String DIAGRAM_ID = "fa8c8a8d-2813-404c-876f-c04e8b297134"; public static final String ITEM_DEFINITION_ID = "df3542d9-6314-3da5-993c-a296f4042674"; diff --git a/backend/views/syson-diagram-common-view/src/main/java/org/eclipse/syson/diagram/common/view/services/ViewEdgeToolService.java b/backend/views/syson-diagram-common-view/src/main/java/org/eclipse/syson/diagram/common/view/services/ViewEdgeToolService.java index 23872290c..c8ccc8ad1 100644 --- a/backend/views/syson-diagram-common-view/src/main/java/org/eclipse/syson/diagram/common/view/services/ViewEdgeToolService.java +++ b/backend/views/syson-diagram-common-view/src/main/java/org/eclipse/syson/diagram/common/view/services/ViewEdgeToolService.java @@ -31,6 +31,7 @@ import org.eclipse.syson.diagram.services.aql.DiagramMutationAQLService; import org.eclipse.syson.diagram.services.aql.DiagramQueryAQLService; import org.eclipse.syson.model.services.aql.ModelMutationAQLService; +import org.eclipse.syson.sysml.RequirementConstraintKind; import org.eclipse.syson.sysml.SysmlPackage; import org.eclipse.syson.sysml.Usage; import org.eclipse.syson.util.AQLConstants; @@ -682,4 +683,56 @@ public EdgeTool createFramedConcernEdgeTool() { .targetElementDescriptions(targetNodeDescriptions.toArray(NodeDescription[]::new)) .build(); } + + public EdgeTool createAssumeConstraintEdgeTool() { + var builder = this.diagramBuilderHelper.newEdgeTool(); + var body = this.viewBuilderHelper.newChangeContext() + .expression(ServiceMethod.of2(ModelMutationAQLService::createConstraint).aql(EdgeDescription.SEMANTIC_EDGE_SOURCE, EdgeDescription.SEMANTIC_EDGE_TARGET, "assumptionConstraint")); + + var targetNodeDescriptions = new ArrayList(); + var constraintUsageNodeDescriptionName = this.nameGenerator.getNodeName(SysmlPackage.eINSTANCE.getConstraintUsage()); + this.allNodeDescriptions.stream() + .filter(nd -> constraintUsageNodeDescriptionName.equals(nd.getName())) + .findFirst() + .ifPresent(targetNodeDescriptions::add); + + String requirementConstraintKindType = SysMLMetamodelHelper.buildQualifiedName(SysmlPackage.eINSTANCE.getRequirementConstraintKind()); + var letRequirementConstraintLiteral = this.viewBuilderHelper.newLet() + .variableName("assumptionConstraint") + .valueExpression(AQLConstants.AQL + requirementConstraintKindType + ".getEEnumLiteral('" + RequirementConstraintKind.ASSUMPTION.getLiteral() + "').instance") + .children(body.build()); + + return builder + .name(this.nameGenerator.getCreationToolName("New Assume ", SysmlPackage.eINSTANCE.getConstraintUsage())) + .iconURLsExpression(METAMODEL_ICONS_PATH + SysmlPackage.eINSTANCE.getRequirementConstraintMembership().getName() + SVG) + .body(letRequirementConstraintLiteral.build()) + .targetElementDescriptions(targetNodeDescriptions.toArray(NodeDescription[]::new)) + .build(); + } + + public EdgeTool createRequireConstraintEdgeTool() { + var builder = this.diagramBuilderHelper.newEdgeTool(); + var body = this.viewBuilderHelper.newChangeContext() + .expression(ServiceMethod.of2(ModelMutationAQLService::createConstraint).aql(EdgeDescription.SEMANTIC_EDGE_SOURCE, EdgeDescription.SEMANTIC_EDGE_TARGET, "requirementConstraint")); + + var targetNodeDescriptions = new ArrayList(); + var constraintUsageNodeDescriptionName = this.nameGenerator.getNodeName(SysmlPackage.eINSTANCE.getConstraintUsage()); + this.allNodeDescriptions.stream() + .filter(nd -> constraintUsageNodeDescriptionName.equals(nd.getName())) + .findFirst() + .ifPresent(targetNodeDescriptions::add); + + String requirementConstraintKindType = SysMLMetamodelHelper.buildQualifiedName(SysmlPackage.eINSTANCE.getRequirementConstraintKind()); + var letRequirementConstraintLiteral = this.viewBuilderHelper.newLet() + .variableName("requirementConstraint") + .valueExpression(AQLConstants.AQL + requirementConstraintKindType + ".getEEnumLiteral('" + RequirementConstraintKind.REQUIREMENT.getLiteral() + "').instance") + .children(body.build()); + + return builder + .name(this.nameGenerator.getCreationToolName("New Require ", SysmlPackage.eINSTANCE.getConstraintUsage())) + .iconURLsExpression(METAMODEL_ICONS_PATH + SysmlPackage.eINSTANCE.getRequirementConstraintMembership().getName() + SVG) + .body(letRequirementConstraintLiteral.build()) + .targetElementDescriptions(targetNodeDescriptions.toArray(NodeDescription[]::new)) + .build(); + } } diff --git a/backend/views/syson-diagram-common-view/src/main/java/org/eclipse/syson/diagram/common/view/services/ViewEdgeToolSwitch.java b/backend/views/syson-diagram-common-view/src/main/java/org/eclipse/syson/diagram/common/view/services/ViewEdgeToolSwitch.java index 2cd07e9cf..aeedf97be 100644 --- a/backend/views/syson-diagram-common-view/src/main/java/org/eclipse/syson/diagram/common/view/services/ViewEdgeToolSwitch.java +++ b/backend/views/syson-diagram-common-view/src/main/java/org/eclipse/syson/diagram/common/view/services/ViewEdgeToolSwitch.java @@ -258,6 +258,8 @@ public List casePortUsage(PortUsage object) { public List caseRequirementDefinition(RequirementDefinition object) { var edgeTools = new ArrayList(); edgeTools.add(this.edgeToolService.createFramedConcernEdgeTool()); + edgeTools.add(this.edgeToolService.createAssumeConstraintEdgeTool()); + edgeTools.add(this.edgeToolService.createRequireConstraintEdgeTool()); edgeTools.addAll(this.caseDefinition(object)); return edgeTools; } @@ -277,6 +279,8 @@ public List caseRequirementUsage(RequirementUsage object) { .toList(); edgeTools.add(this.edgeToolService.createBecomeObjectiveRequirementEdgeTool(objectiveTargets)); edgeTools.add(this.edgeToolService.createFramedConcernEdgeTool()); + edgeTools.add(this.edgeToolService.createAssumeConstraintEdgeTool()); + edgeTools.add(this.edgeToolService.createRequireConstraintEdgeTool()); edgeTools.addAll(this.caseUsage(object)); return edgeTools; } diff --git a/doc/content/modules/user-manual/assets/images/release-notes-assume-and-require-edge-tools.png b/doc/content/modules/user-manual/assets/images/release-notes-assume-and-require-edge-tools.png new file mode 100644 index 0000000000000000000000000000000000000000..e21a91a548f545d4cf53d74468d9e50e9758af98 GIT binary patch literal 43713 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 HW)=K@&y>*p literal 0 HcmV?d00001 diff --git a/doc/content/modules/user-manual/pages/release-notes/2026.7.0.adoc b/doc/content/modules/user-manual/pages/release-notes/2026.7.0.adoc index 10636ca24..34fdeac1a 100644 --- a/doc/content/modules/user-manual/pages/release-notes/2026.7.0.adoc +++ b/doc/content/modules/user-manual/pages/release-notes/2026.7.0.adoc @@ -34,10 +34,15 @@ image::release-notes-frames-compartment.png[frames compartment displaying concer It leverages the selection dialog to either create an _occurrence timeslice/snapshot_, or the _usage timeslice/snapshot_ matching the `OccurrenceDefinition` on which the tool is applied. ** Add the support for _assume_ and _require_ graphical edges. -These edges are displayed using the tool to create a _require_ `ConstraintUsage`, or an _assume_ `ConstraintUsage`, from `RequirementUsage` and `RequirementDefinition` graphical nodes, when another `ConstraintUsage` is selected. +These graphical edges are displayed using the tool to create a _require_ `ConstraintUsage`, or an _assume_ `ConstraintUsage`, from `RequirementUsage` and `RequirementDefinition` graphical nodes, when another `ConstraintUsage` is selected. +These graphical edges can also be created using the _New Assume Constraint_ or _New Require Constraint_ graphical edge tools. + image::release-notes-assume-and-require-edges.png[assume and require edge between a RequirementDefinition and two different ConstraintUsage, width=60%,height=60%] +** Add the _New Assume Constraint_ or _New Require Constraint_ edge tools to create _assume_ and _require_ graphical edges. ++ +image::release-notes-assume-and-require-edge-tools.png[list available edge tools containing the two new tools, between a RequirementUsage and a ConstraintUsage, width=60%,height=60%] + * In the _Explorer_ view: ** The tree items corresponding to the internals of `Expression` elements (syntax tree) are now hidden by default.