From 1340c98b37de9d65777081383f8672f18f18d6fa Mon Sep 17 00:00:00 2001 From: Michael Charfadi Date: Thu, 22 Jan 2026 15:47:21 +0100 Subject: [PATCH] [1860] Add preconditionExpression to some NodeDescriptionProvider MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Bug: https://github.com/eclipse-syson/syson/issues/1860 Signed-off-by: Michaƫl Charfadi Signed-off-by: Axel RICHARD --- CHANGELOG.adoc | 2 + .../compartments/ActionFlowTests.java | 96 +++++++------- .../view/GVIncludeUseCaseUsageTests.java | 5 +- ...tateDoActionWithReferencedActionTests.java | 12 +- .../GVSubNodeActionFlowCreationTests.java | 119 ++++++------------ ...GVSubNodeInterconnectionCreationTests.java | 2 +- ...GVSubNodeStateTransitionCreationTests.java | 24 ++-- .../view/GVSubNodeTemporalCreationTests.java | 11 +- ...ddNewFlowConnectionFromPartUsageTests.java | 6 +- .../IVAddNewInterfaceFromPartUsageTests.java | 8 +- .../services/aql/DiagramQueryAQLService.java | 16 +-- .../CompartmentItemPreconditionSwitch.java | 58 +++++++++ ...tionOwnedUsageEdgeDescriptionProvider.java | 22 ++-- ...ompartmentItemNodeDescriptionProvider.java | 2 + ...ompartmentItemNodeDescriptionProvider.java | 2 + ...irementCompartmentItemNodeDescription.java | 10 +- ...ompartmentItemNodeDescriptionProvider.java | 1 + .../view/SDVDiagramDescriptionProvider.java | 15 ++- ...nedActionUsageEdgeDescriptionProvider.java | 40 ------ ...ntationCompartmentItemNodeDescription.java | 8 ++ ...ompartmentItemNodeDescriptionProvider.java | 8 ++ .../pages/release-notes/2026.1.0.adoc | 2 - .../pages/release-notes/2026.3.0.adoc | 4 + scripts/check-coverage.jsh | 6 +- 24 files changed, 244 insertions(+), 235 deletions(-) create mode 100644 backend/services/syson-diagram-services/src/main/java/org/eclipse/syson/diagram/services/utils/CompartmentItemPreconditionSwitch.java delete mode 100644 backend/views/syson-standard-diagrams-view/src/main/java/org/eclipse/syson/standard/diagrams/view/edges/DefinitionOwnedActionUsageEdgeDescriptionProvider.java diff --git a/CHANGELOG.adoc b/CHANGELOG.adoc index 72a19cacc..26a654f08 100644 --- a/CHANGELOG.adoc +++ b/CHANGELOG.adoc @@ -34,6 +34,8 @@ The property `SysONTestsProperties#ELASTICSEARCH` has been removed, tests that r - https://github.com/eclipse-syson/syson/issues/1887[#1887] [export] Export fails to escape some names when using qualified name. - https://github.com/eclipse-syson/syson/issues/1953[#1953] [import] Fix an issue where `TransitionUsage` with `SendActionUsage` were not properly resolved. - https://github.com/eclipse-syson/syson/issues/1973[#1973] [import] Fix an error during textual import when resolving the name of an unnamed redefined `Feature`. +- https://github.com/eclipse-syson/syson/issues/1860[#1860] [diagrams] Add a precondition for compartment item node descriptions in order to filter out unwanted types. +For example `ViewUsage` elements are no longer rendered in _parts_ compartments. === Improvements diff --git a/backend/application/syson-application/src/test/java/org/eclipse/syson/application/controllers/diagrams/compartments/ActionFlowTests.java b/backend/application/syson-application/src/test/java/org/eclipse/syson/application/controllers/diagrams/compartments/ActionFlowTests.java index e2e3d1907..cb9ab7225 100644 --- a/backend/application/syson-application/src/test/java/org/eclipse/syson/application/controllers/diagrams/compartments/ActionFlowTests.java +++ b/backend/application/syson-application/src/test/java/org/eclipse/syson/application/controllers/diagrams/compartments/ActionFlowTests.java @@ -126,14 +126,15 @@ public void setUp() { public void createSuccesionBetweenNestedActions() { var flux = this.givenSubscriptionToDiagram(); - AtomicReference diagram = new AtomicReference<>(); - Consumer initialDiagramContentConsumer = assertRefreshedDiagramThat(diagram::set); - var diagramDescription = this.givenDiagramDescription.getDiagramDescription(ActionFlowCompartmentTestProjectData.EDITING_CONTEXT_ID, SysONRepresentationDescriptionIdentifiers.GENERAL_VIEW_DIAGRAM_DESCRIPTION_ID); var diagramDescriptionIdProvider = new DiagramDescriptionIdProvider(diagramDescription, this.diagramIdProvider); - String creationToolId = diagramDescriptionIdProvider.getEdgeCreationToolId(this.descriptionNameGenerator.getNodeName(SysmlPackage.eINSTANCE.getActionUsage()), "New Succession"); + var creationToolId = diagramDescriptionIdProvider.getEdgeCreationToolId(this.descriptionNameGenerator.getNodeName(SysmlPackage.eINSTANCE.getActionUsage()), "New Succession"); + + AtomicReference diagram = new AtomicReference<>(); + Consumer initialDiagramContentConsumer = assertRefreshedDiagramThat(diagram::set); + Runnable creationToolRunnable = () -> this.edgeCreationTester.runSingleClickOnTwoDiagramElementsTool(ActionFlowCompartmentTestProjectData.EDITING_CONTEXT_ID, diagram, ActionFlowCompartmentTestProjectData.GraphicalIds.ROOT_ACTION_USAGE, @@ -167,14 +168,15 @@ public void createSuccesionBetweenNestedActions() { public void createTransitionBetweenNestedActions() { var flux = this.givenSubscriptionToDiagram(); - AtomicReference diagram = new AtomicReference<>(); - Consumer initialDiagramContentConsumer = assertRefreshedDiagramThat(diagram::set); - var diagramDescription = this.givenDiagramDescription.getDiagramDescription(ActionFlowCompartmentTestProjectData.EDITING_CONTEXT_ID, SysONRepresentationDescriptionIdentifiers.GENERAL_VIEW_DIAGRAM_DESCRIPTION_ID); var diagramDescriptionIdProvider = new DiagramDescriptionIdProvider(diagramDescription, this.diagramIdProvider); - String creationToolId = diagramDescriptionIdProvider.getEdgeCreationToolId(this.descriptionNameGenerator.getNodeName(SysmlPackage.eINSTANCE.getActionUsage()), "New Transition"); + var creationToolId = diagramDescriptionIdProvider.getEdgeCreationToolId(this.descriptionNameGenerator.getNodeName(SysmlPackage.eINSTANCE.getActionUsage()), "New Transition"); + + AtomicReference diagram = new AtomicReference<>(); + Consumer initialDiagramContentConsumer = assertRefreshedDiagramThat(diagram::set); + Runnable creationToolRunnable = () -> this.edgeCreationTester.runSingleClickOnTwoDiagramElementsTool(ActionFlowCompartmentTestProjectData.EDITING_CONTEXT_ID, diagram, ActionFlowCompartmentTestProjectData.GraphicalIds.ROOT_ACTION_USAGE, @@ -208,34 +210,36 @@ public void createTransitionBetweenNestedActions() { public void createTransitionUsageBetweenSubActions() { var flux = this.givenSubscriptionToDiagram(); - AtomicReference diagram = new AtomicReference<>(); - Consumer initialDiagramContentConsumer = assertRefreshedDiagramThat(diagram::set); var diagramDescription = this.givenDiagramDescription.getDiagramDescription(ActionFlowCompartmentTestProjectData.EDITING_CONTEXT_ID, SysONRepresentationDescriptionIdentifiers.GENERAL_VIEW_DIAGRAM_DESCRIPTION_ID); var diagramDescriptionIdProvider = new DiagramDescriptionIdProvider(diagramDescription, this.diagramIdProvider); - String creationToolId = diagramDescriptionIdProvider.getEdgeCreationToolId(this.descriptionNameGenerator.getNodeName(SysmlPackage.eINSTANCE.getActionUsage()), "New Transition"); + var creationToolId = diagramDescriptionIdProvider.getEdgeCreationToolId(this.descriptionNameGenerator.getNodeName(SysmlPackage.eINSTANCE.getActionUsage()), "New Transition"); + + AtomicReference diagram = new AtomicReference<>(); + Consumer initialDiagramContentConsumer = assertRefreshedDiagramThat(diagram::set); + Runnable creationToolRunnable = () -> this.edgeCreationTester.createEdgeUsingNodeId(ActionFlowCompartmentTestProjectData.EDITING_CONTEXT_ID, diagram, ActionFlowCompartmentTestProjectData.GraphicalIds.SUB_ACTION1_ID, ActionFlowCompartmentTestProjectData.GraphicalIds.SUB_ACTION2_ID, creationToolId); - String[] newTransitionUsageId = new String[1]; + AtomicReference newTransitionUsageId = new AtomicReference<>(); Consumer diagramCheck = assertRefreshedDiagramThat(newDiagram -> { new CheckDiagramElementCount(this.diagramComparator) - .hasNewNodeCount(1) // The TransitionUsage is displayed in the Action compartment + .hasNewNodeCount(0) .hasNewEdgeCount(1) .check(diagram.get(), newDiagram); Edge newEdge = this.diagramComparator.newEdges(diagram.get(), newDiagram).get(0); - newTransitionUsageId[0] = newEdge.getTargetObjectId(); + newTransitionUsageId.set(newEdge.getTargetObjectId()); assertThat(newEdge).hasSourceId(ActionFlowCompartmentTestProjectData.GraphicalIds.SUB_ACTION1_ID); assertThat(newEdge).hasTargetId(ActionFlowCompartmentTestProjectData.GraphicalIds.SUB_ACTION2_ID); assertThat(newEdge.getStyle()).hasTargetArrow(ArrowStyle.InputArrow); }); - Runnable semanticCheck = this.semanticCheckerService.checkElement(TransitionUsage.class, () -> newTransitionUsageId[0], transitionUsage -> { + Runnable semanticCheck = this.semanticCheckerService.checkElement(TransitionUsage.class, () -> newTransitionUsageId.get(), transitionUsage -> { assertThat(this.identityService.getId(transitionUsage.getSource())).isEqualTo(ActionFlowCompartmentTestProjectData.SemanticIds.SUB_ACTION1_ID); assertThat(this.identityService.getId(transitionUsage.getTarget())).isEqualTo(ActionFlowCompartmentTestProjectData.SemanticIds.SUB_ACTION2_ID); }); @@ -375,33 +379,34 @@ public void reconnectTransitionUsageSource() { public void createSuccessionBetweenSubActions() { var flux = this.givenSubscriptionToDiagram(); - AtomicReference diagram = new AtomicReference<>(); - Consumer initialDiagramContentConsumer = assertRefreshedDiagramThat(diagram::set); - var diagramDescription = this.givenDiagramDescription.getDiagramDescription(ActionFlowCompartmentTestProjectData.EDITING_CONTEXT_ID, SysONRepresentationDescriptionIdentifiers.GENERAL_VIEW_DIAGRAM_DESCRIPTION_ID); var diagramDescriptionIdProvider = new DiagramDescriptionIdProvider(diagramDescription, this.diagramIdProvider); - String creationToolId = diagramDescriptionIdProvider.getEdgeCreationToolId(this.descriptionNameGenerator.getNodeName(SysmlPackage.eINSTANCE.getActionUsage()), "New Succession"); + var creationToolId = diagramDescriptionIdProvider.getEdgeCreationToolId(this.descriptionNameGenerator.getNodeName(SysmlPackage.eINSTANCE.getActionUsage()), "New Succession"); + + AtomicReference diagram = new AtomicReference<>(); + Consumer initialDiagramContentConsumer = assertRefreshedDiagramThat(diagram::set); + Runnable creationToolRunnable = () -> this.edgeCreationTester.createEdgeUsingNodeId(ActionFlowCompartmentTestProjectData.EDITING_CONTEXT_ID, diagram, ActionFlowCompartmentTestProjectData.GraphicalIds.SUB_ACTION1_ID, ActionFlowCompartmentTestProjectData.GraphicalIds.SUB_ACTION2_ID, creationToolId); - String[] newSuccessionId = new String[1]; + AtomicReference newSuccessionId = new AtomicReference<>(); Consumer diagramCheck = assertRefreshedDiagramThat(newDiagram -> { new CheckDiagramElementCount(this.diagramComparator) .hasNewEdgeCount(1) .check(diagram.get(), newDiagram); Edge newEdge = this.diagramComparator.newEdges(diagram.get(), newDiagram).get(0); - newSuccessionId[0] = newEdge.getTargetObjectId(); + newSuccessionId.set(newEdge.getTargetObjectId()); assertThat(newEdge).hasSourceId(ActionFlowCompartmentTestProjectData.GraphicalIds.SUB_ACTION1_ID); assertThat(newEdge).hasTargetId(ActionFlowCompartmentTestProjectData.GraphicalIds.SUB_ACTION2_ID); assertThat(newEdge.getStyle()).hasTargetArrow(ArrowStyle.InputArrow); }); - Runnable semanticCheck = this.semanticCheckerService.checkElement(SuccessionAsUsage.class, () -> newSuccessionId[0], successionAsUsage -> { + Runnable semanticCheck = this.semanticCheckerService.checkElement(SuccessionAsUsage.class, () -> newSuccessionId.get(), successionAsUsage -> { assertThat(this.identityService.getId(successionAsUsage.getSourceFeature())).isEqualTo(ActionFlowCompartmentTestProjectData.SemanticIds.SUB_ACTION1_ID); assertThat(successionAsUsage.getTargetFeature()).hasSize(1) .allMatch(targetFeature -> ActionFlowCompartmentTestProjectData.SemanticIds.SUB_ACTION2_ID.equals(this.identityService.getId(targetFeature))); @@ -464,34 +469,35 @@ public void reconnectSuccessionToDone() { public void createSuccessionFromStart() { var flux = this.givenSubscriptionToDiagram(); - AtomicReference diagram = new AtomicReference<>(); - Consumer initialDiagramContentConsumer = assertRefreshedDiagramThat(diagram::set); - var diagramDescription = this.givenDiagramDescription.getDiagramDescription(ActionFlowCompartmentTestProjectData.EDITING_CONTEXT_ID, SysONRepresentationDescriptionIdentifiers.GENERAL_VIEW_DIAGRAM_DESCRIPTION_ID); var diagramDescriptionIdProvider = new DiagramDescriptionIdProvider(diagramDescription, this.diagramIdProvider); - String creationToolId = diagramDescriptionIdProvider.getEdgeCreationToolId(this.descriptionNameGenerator.getNodeName(StartActionNodeDescriptionProvider.START_ACTION_NAME), + var creationToolId = diagramDescriptionIdProvider.getEdgeCreationToolId(this.descriptionNameGenerator.getNodeName(StartActionNodeDescriptionProvider.START_ACTION_NAME), "New Succession"); + + AtomicReference diagram = new AtomicReference<>(); + Consumer initialDiagramContentConsumer = assertRefreshedDiagramThat(diagram::set); + Runnable creationToolRunnable = () -> this.edgeCreationTester.createEdgeUsingNodeId(ActionFlowCompartmentTestProjectData.EDITING_CONTEXT_ID, diagram, ActionFlowCompartmentTestProjectData.GraphicalIds.START_ID, ActionFlowCompartmentTestProjectData.GraphicalIds.SUB_ACTION2_ID, creationToolId); - String[] newSuccessionId = new String[1]; + AtomicReference newSuccessionId = new AtomicReference<>(); Consumer diagramCheck = assertRefreshedDiagramThat(newDiagram -> { new CheckDiagramElementCount(this.diagramComparator) .hasNewEdgeCount(1) .check(diagram.get(), newDiagram); Edge newEdge = this.diagramComparator.newEdges(diagram.get(), newDiagram).get(0); - newSuccessionId[0] = newEdge.getTargetObjectId(); + newSuccessionId.set(newEdge.getTargetObjectId()); assertThat(newEdge).hasSourceId(ActionFlowCompartmentTestProjectData.GraphicalIds.START_ID); assertThat(newEdge).hasTargetId(ActionFlowCompartmentTestProjectData.GraphicalIds.SUB_ACTION2_ID); assertThat(newEdge.getStyle()).hasTargetArrow(ArrowStyle.InputArrow); }); - Runnable semanticCheck = this.semanticCheckerService.checkElement(SuccessionAsUsage.class, () -> newSuccessionId[0], successionAsUsage -> { + Runnable semanticCheck = this.semanticCheckerService.checkElement(SuccessionAsUsage.class, () -> newSuccessionId.get(), successionAsUsage -> { assertThat(successionAsUsage.getSourceFeature()).matches(sourceFeature -> new UtilService().isStandardStartAction(sourceFeature)); assertThat(successionAsUsage.getTargetFeature()).hasSize(1) .allMatch(targetFeature -> ActionFlowCompartmentTestProjectData.SemanticIds.SUB_ACTION2_ID.equals(this.identityService.getId(targetFeature))); @@ -512,34 +518,35 @@ public void createSuccessionFromStart() { public void createSuccessionFromStartToDone() { var flux = this.givenSubscriptionToDiagram(); - AtomicReference diagram = new AtomicReference<>(); - Consumer initialDiagramContentConsumer = assertRefreshedDiagramThat(diagram::set); - var diagramDescription = this.givenDiagramDescription.getDiagramDescription(ActionFlowCompartmentTestProjectData.EDITING_CONTEXT_ID, SysONRepresentationDescriptionIdentifiers.GENERAL_VIEW_DIAGRAM_DESCRIPTION_ID); var diagramDescriptionIdProvider = new DiagramDescriptionIdProvider(diagramDescription, this.diagramIdProvider); - String creationToolId = diagramDescriptionIdProvider.getEdgeCreationToolId(this.descriptionNameGenerator.getNodeName(StartActionNodeDescriptionProvider.START_ACTION_NAME), + var creationToolId = diagramDescriptionIdProvider.getEdgeCreationToolId(this.descriptionNameGenerator.getNodeName(StartActionNodeDescriptionProvider.START_ACTION_NAME), "New Succession"); + + AtomicReference diagram = new AtomicReference<>(); + Consumer initialDiagramContentConsumer = assertRefreshedDiagramThat(diagram::set); + Runnable creationToolRunnable = () -> this.edgeCreationTester.createEdgeUsingNodeId(ActionFlowCompartmentTestProjectData.EDITING_CONTEXT_ID, diagram, ActionFlowCompartmentTestProjectData.GraphicalIds.START_ID, ActionFlowCompartmentTestProjectData.GraphicalIds.DONE_ID, creationToolId); - String[] newSuccessionId = new String[1]; + AtomicReference newSuccessionId = new AtomicReference<>(); Consumer diagramCheck = assertRefreshedDiagramThat(newDiagram -> { new CheckDiagramElementCount(this.diagramComparator) .hasNewEdgeCount(1) .check(diagram.get(), newDiagram); Edge newEdge = this.diagramComparator.newEdges(diagram.get(), newDiagram).get(0); - newSuccessionId[0] = newEdge.getTargetObjectId(); + newSuccessionId.set(newEdge.getTargetObjectId()); assertThat(newEdge).hasSourceId(ActionFlowCompartmentTestProjectData.GraphicalIds.START_ID); assertThat(newEdge).hasTargetId(ActionFlowCompartmentTestProjectData.GraphicalIds.DONE_ID); assertThat(newEdge.getStyle()).hasTargetArrow(ArrowStyle.InputArrow); }); - Runnable semanticCheck = this.semanticCheckerService.checkElement(SuccessionAsUsage.class, () -> newSuccessionId[0], successionAsUsage -> { + Runnable semanticCheck = this.semanticCheckerService.checkElement(SuccessionAsUsage.class, () -> newSuccessionId.get(), successionAsUsage -> { assertThat(successionAsUsage.getSourceFeature()).matches(sourceFeature -> new UtilService().isStandardStartAction(sourceFeature)); assertThat(successionAsUsage.getTargetFeature()).hasSize(1) .allMatch(targetFeature -> new UtilService().isStandardDoneAction(targetFeature)); @@ -563,34 +570,35 @@ public void createSuccessionFromStartToDone() { public void createTransitionUsageToDone() { var flux = this.givenSubscriptionToDiagram(); - AtomicReference diagram = new AtomicReference<>(); - Consumer initialDiagramContentConsumer = assertRefreshedDiagramThat(diagram::set); - var diagramDescription = this.givenDiagramDescription.getDiagramDescription(ActionFlowCompartmentTestProjectData.EDITING_CONTEXT_ID, SysONRepresentationDescriptionIdentifiers.GENERAL_VIEW_DIAGRAM_DESCRIPTION_ID); var diagramDescriptionIdProvider = new DiagramDescriptionIdProvider(diagramDescription, this.diagramIdProvider); - String creationToolId = diagramDescriptionIdProvider.getEdgeCreationToolId(this.descriptionNameGenerator.getNodeName(SysmlPackage.eINSTANCE.getActionUsage()), "New Transition"); + var creationToolId = diagramDescriptionIdProvider.getEdgeCreationToolId(this.descriptionNameGenerator.getNodeName(SysmlPackage.eINSTANCE.getActionUsage()), "New Transition"); + + AtomicReference diagram = new AtomicReference<>(); + Consumer initialDiagramContentConsumer = assertRefreshedDiagramThat(diagram::set); + Runnable creationToolRunnable = () -> this.edgeCreationTester.createEdgeUsingNodeId(ActionFlowCompartmentTestProjectData.EDITING_CONTEXT_ID, diagram, ActionFlowCompartmentTestProjectData.GraphicalIds.SUB_ACTION1_ID, ActionFlowCompartmentTestProjectData.GraphicalIds.DONE_ID, creationToolId); - String[] newTransitionId = new String[1]; + AtomicReference newTransitionId = new AtomicReference<>(); Consumer diagramCheck = assertRefreshedDiagramThat(newDiagram -> { new CheckDiagramElementCount(this.diagramComparator) - .hasNewNodeCount(1) // TransitionUsage are also added to the previous compartment as node + .hasNewNodeCount(0) .hasNewEdgeCount(1) .check(diagram.get(), newDiagram); Edge newEdge = this.diagramComparator.newEdges(diagram.get(), newDiagram).get(0); - newTransitionId[0] = newEdge.getTargetObjectId(); + newTransitionId.set(newEdge.getTargetObjectId()); assertThat(newEdge).hasSourceId(ActionFlowCompartmentTestProjectData.GraphicalIds.SUB_ACTION1_ID); assertThat(newEdge).hasTargetId(ActionFlowCompartmentTestProjectData.GraphicalIds.DONE_ID); assertThat(newEdge.getStyle()).hasTargetArrow(ArrowStyle.InputArrow); }); - Runnable semanticCheck = this.semanticCheckerService.checkElement(TransitionUsage.class, () -> newTransitionId[0], transitionUsage -> { + Runnable semanticCheck = this.semanticCheckerService.checkElement(TransitionUsage.class, () -> newTransitionId.get(), transitionUsage -> { assertThat(transitionUsage.getSource().getName()).isEqualTo("subAction1"); assertThat(transitionUsage.getTarget()).matches(targetFeature -> new UtilService().isStandardDoneAction(targetFeature)); assertThat(transitionUsage.getOwningType().getName()).matches("RootAction"::equals); diff --git a/backend/application/syson-application/src/test/java/org/eclipse/syson/application/controllers/diagrams/general/view/GVIncludeUseCaseUsageTests.java b/backend/application/syson-application/src/test/java/org/eclipse/syson/application/controllers/diagrams/general/view/GVIncludeUseCaseUsageTests.java index 57748d069..4a62f617e 100644 --- a/backend/application/syson-application/src/test/java/org/eclipse/syson/application/controllers/diagrams/general/view/GVIncludeUseCaseUsageTests.java +++ b/backend/application/syson-application/src/test/java/org/eclipse/syson/application/controllers/diagrams/general/view/GVIncludeUseCaseUsageTests.java @@ -167,10 +167,9 @@ public void checkIncludeUsageActionCreation() { .verify(Duration.ofSeconds(10)); } - @Test @DisplayName("GIVEN an IncludeUseCaseUsage, WHEN reconnecting the target, THEN the new target of the IncludeUseCaseUsage is correct") @GivenSysONServer({ IncludeUseCaseUsageProjectData.SCRIPT_PATH }) - + @Test public void reconnectIncludeUsaceCaseUsageTarget() { var flux = this.givenSubscriptionToDiagram(); @@ -210,9 +209,9 @@ public void reconnectIncludeUsaceCaseUsageTarget() { .verify(Duration.ofSeconds(10)); } - @Test @DisplayName("GIVEN an IncludeUseCaseUsage, WHEN reconnecting the source, THEN the new source of the IncludeUseCaseUsage is correct") @GivenSysONServer({ IncludeUseCaseUsageProjectData.SCRIPT_PATH }) + @Test public void reconnectIncludeUseCaseUsageSource() { var flux = this.givenSubscriptionToDiagram(); diff --git a/backend/application/syson-application/src/test/java/org/eclipse/syson/application/controllers/diagrams/general/view/GVStateDoActionWithReferencedActionTests.java b/backend/application/syson-application/src/test/java/org/eclipse/syson/application/controllers/diagrams/general/view/GVStateDoActionWithReferencedActionTests.java index 8df1bc7ef..fbae8a905 100644 --- a/backend/application/syson-application/src/test/java/org/eclipse/syson/application/controllers/diagrams/general/view/GVStateDoActionWithReferencedActionTests.java +++ b/backend/application/syson-application/src/test/java/org/eclipse/syson/application/controllers/diagrams/general/view/GVStateDoActionWithReferencedActionTests.java @@ -34,6 +34,7 @@ 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.controllers.diagrams.testers.ToolTester; import org.eclipse.syson.application.data.GeneralViewEmptyTestProjectData; import org.eclipse.syson.services.diagrams.DiagramDescriptionIdProvider; @@ -48,8 +49,6 @@ import org.junit.jupiter.api.Test; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.boot.test.context.SpringBootTest; -import org.springframework.test.context.jdbc.Sql; -import org.springframework.test.context.jdbc.SqlConfig; import org.springframework.transaction.annotation.Transactional; import reactor.core.publisher.Flux; @@ -94,11 +93,9 @@ public void beforeEach() { this.givenInitialServerState.initialize(); } - @Test - @Sql(scripts = { GeneralViewEmptyTestProjectData.SCRIPT_PATH }, executionPhase = Sql.ExecutionPhase.BEFORE_TEST_METHOD, - config = @SqlConfig(transactionMode = SqlConfig.TransactionMode.ISOLATED)) - @Sql(scripts = { "/scripts/cleanup.sql" }, executionPhase = Sql.ExecutionPhase.AFTER_TEST_METHOD, config = @SqlConfig(transactionMode = SqlConfig.TransactionMode.ISOLATED)) @DisplayName("GIVEN a General View with a state and action, WHEN invoking do action with referenced action, THEN the PerformActionUsage is visible in the state") + @GivenSysONServer({ GeneralViewEmptyTestProjectData.SCRIPT_PATH }) + @Test public void checkPerformActionRevealInState() { var flux = this.givenSubscriptionToDiagram(); @@ -160,9 +157,8 @@ public void checkPerformActionRevealInState() { assertThat(diagram.getEdges()).isEmpty(); DiagramNavigator navigator = new DiagramNavigator(diagram); Collection visibleNodes = navigator.findAllNodes().stream().filter(node -> node.getState() == ViewModifier.Normal).toList(); - assertThat(visibleNodes.stream().filter(node -> node.getInsideLabel().getText().equals("actions"))).hasSize(1).allMatch(node -> node.getChildNodes().size() == 1); assertThat(visibleNodes.stream().filter(node -> node.getInsideLabel().getText().equals("perform actions"))).hasSize(1).allMatch(node -> node.getChildNodes().size() == 1); - assertThat(visibleNodes.stream().filter(node -> node.getInsideLabel().getText().equals("ref do ::> action1"))).hasSize(2); + assertThat(visibleNodes.stream().filter(node -> node.getInsideLabel().getText().equals("ref do ::> action1"))).hasSize(1); }, () -> fail("Missing diagram")); StepVerifier.create(flux) diff --git a/backend/application/syson-application/src/test/java/org/eclipse/syson/application/controllers/diagrams/general/view/GVSubNodeActionFlowCreationTests.java b/backend/application/syson-application/src/test/java/org/eclipse/syson/application/controllers/diagrams/general/view/GVSubNodeActionFlowCreationTests.java index b2665a6b9..1d34419d0 100644 --- a/backend/application/syson-application/src/test/java/org/eclipse/syson/application/controllers/diagrams/general/view/GVSubNodeActionFlowCreationTests.java +++ b/backend/application/syson-application/src/test/java/org/eclipse/syson/application/controllers/diagrams/general/view/GVSubNodeActionFlowCreationTests.java @@ -45,7 +45,6 @@ import org.eclipse.syson.application.controllers.diagrams.checkers.CheckBorderNode; import org.eclipse.syson.application.controllers.diagrams.checkers.CheckDiagramElementCount; import org.eclipse.syson.application.controllers.diagrams.checkers.CheckNodeInCompartment; -import org.eclipse.syson.application.controllers.diagrams.checkers.CheckNodeOnDiagram; import org.eclipse.syson.application.controllers.diagrams.checkers.DiagramCheckerService; import org.eclipse.syson.application.controllers.diagrams.testers.ToolTester; import org.eclipse.syson.application.controllers.utils.TestNameGenerator; @@ -170,18 +169,18 @@ private static Stream actionDefinitionBorderAndChildNodeParameters() .map(TestNameGenerator::namedArguments); } - private static Stream actionUsageListAndFreeFormNodeParameters() { + private static Stream actionUsageFreeFormNodeParameters() { return Stream.of( - Arguments.of(SysmlPackage.eINSTANCE.getDecisionNode(), ACTIONS_COMPARTMENT, SysmlPackage.eINSTANCE.getUsage_NestedAction(), 0), - Arguments.of(SysmlPackage.eINSTANCE.getForkNode(), ACTIONS_COMPARTMENT, SysmlPackage.eINSTANCE.getUsage_NestedAction(), 0), - Arguments.of(SysmlPackage.eINSTANCE.getJoinNode(), ACTIONS_COMPARTMENT, SysmlPackage.eINSTANCE.getUsage_NestedAction(), 0), - Arguments.of(SysmlPackage.eINSTANCE.getMergeNode(), ACTIONS_COMPARTMENT, SysmlPackage.eINSTANCE.getUsage_NestedAction(), 0)) + Arguments.of(SysmlPackage.eINSTANCE.getDecisionNode(), SysmlPackage.eINSTANCE.getUsage_NestedAction(), 0, 0, 0), + Arguments.of(SysmlPackage.eINSTANCE.getForkNode(), SysmlPackage.eINSTANCE.getUsage_NestedAction(), 0, 0, 0), + Arguments.of(SysmlPackage.eINSTANCE.getJoinNode(), SysmlPackage.eINSTANCE.getUsage_NestedAction(), 0, 0, 0), + Arguments.of(SysmlPackage.eINSTANCE.getMergeNode(), SysmlPackage.eINSTANCE.getUsage_NestedAction(), 0, 0, 0), + Arguments.of(SysmlPackage.eINSTANCE.getAcceptActionUsage(), SysmlPackage.eINSTANCE.getUsage_NestedAction(), 5, 2, 1)) .map(TestNameGenerator::namedArguments); } private static Stream actionUsageSiblingAndChildNodeParameters() { return Stream.of( - Arguments.of(SysmlPackage.eINSTANCE.getAcceptActionUsage(), ACTIONS_COMPARTMENT, SysmlPackage.eINSTANCE.getUsage_NestedAction(), 7, 1), Arguments.of(SysmlPackage.eINSTANCE.getActionUsage(), ACTIONS_COMPARTMENT, SysmlPackage.eINSTANCE.getUsage_NestedAction(), 17, 1), Arguments.of(SysmlPackage.eINSTANCE.getItemUsage(), "items", SysmlPackage.eINSTANCE.getUsage_NestedItem(), 6, 1)) .map(TestNameGenerator::namedArguments); @@ -193,18 +192,18 @@ private static Stream actionDefinitionSiblingNodeParameters() { .map(TestNameGenerator::namedArguments); } - private static Stream actionDefinitionListAndFreeFormNodeParameters() { + private static Stream actionDefinitionFreeFormNodeParameters() { return Stream.of( - Arguments.of(SysmlPackage.eINSTANCE.getDecisionNode(), ACTIONS_COMPARTMENT, SysmlPackage.eINSTANCE.getDefinition_OwnedAction(), 0), - Arguments.of(SysmlPackage.eINSTANCE.getForkNode(), ACTIONS_COMPARTMENT, SysmlPackage.eINSTANCE.getDefinition_OwnedAction(), 0), - Arguments.of(SysmlPackage.eINSTANCE.getJoinNode(), ACTIONS_COMPARTMENT, SysmlPackage.eINSTANCE.getDefinition_OwnedAction(), 0), - Arguments.of(SysmlPackage.eINSTANCE.getMergeNode(), ACTIONS_COMPARTMENT, SysmlPackage.eINSTANCE.getDefinition_OwnedAction(), 0)) + Arguments.of(SysmlPackage.eINSTANCE.getDecisionNode(), SysmlPackage.eINSTANCE.getDefinition_OwnedAction(), 0, 0, 0), + Arguments.of(SysmlPackage.eINSTANCE.getForkNode(), SysmlPackage.eINSTANCE.getDefinition_OwnedAction(), 0, 0, 0), + Arguments.of(SysmlPackage.eINSTANCE.getJoinNode(), SysmlPackage.eINSTANCE.getDefinition_OwnedAction(), 0, 0, 0), + Arguments.of(SysmlPackage.eINSTANCE.getMergeNode(), SysmlPackage.eINSTANCE.getDefinition_OwnedAction(), 0, 0, 0), + Arguments.of(SysmlPackage.eINSTANCE.getAcceptActionUsage(), SysmlPackage.eINSTANCE.getDefinition_OwnedAction(), 5, 2, 1)) .map(TestNameGenerator::namedArguments); } private static Stream actionDefinitionSiblingAndChildNodeParameters() { return Stream.of( - Arguments.of(SysmlPackage.eINSTANCE.getAcceptActionUsage(), ACTIONS_COMPARTMENT, SysmlPackage.eINSTANCE.getUsage_NestedAction(), 7, 1), Arguments.of(SysmlPackage.eINSTANCE.getActionUsage(), ACTIONS_COMPARTMENT, SysmlPackage.eINSTANCE.getUsage_NestedAction(), 17, 1)) .map(TestNameGenerator::namedArguments); } @@ -291,9 +290,6 @@ public void createAcceptActionUsagePayload(EClass eClass) { public void createAcceptActionUsageReceiver() { var flux = this.givenSubscriptionToDiagram(); - AtomicReference diagram = new AtomicReference<>(); - Consumer initialDiagramContentConsumer = assertRefreshedDiagramThat(diagram::set); - var diagramDescription = this.givenDiagramDescription.getDiagramDescription(GeneralViewWithTopNodesTestProjectData.EDITING_CONTEXT_ID, SysONRepresentationDescriptionIdentifiers.GENERAL_VIEW_DIAGRAM_DESCRIPTION_ID); var diagramDescriptionIdProvider = new DiagramDescriptionIdProvider(diagramDescription, this.diagramIdProvider); @@ -301,6 +297,10 @@ public void createAcceptActionUsageReceiver() { EClass parentEClass = SysmlPackage.eINSTANCE.getAcceptActionUsage(); String parentLabel = "acceptAction"; EClass eClass = SysmlPackage.eINSTANCE.getPortUsage(); + + AtomicReference diagram = new AtomicReference<>(); + Consumer initialDiagramContentConsumer = assertRefreshedDiagramThat(diagram::set); + Runnable createNodeRunnable = this.creationTestsService.createNode(diagramDescriptionIdProvider, diagram, parentEClass, parentLabel, this.descriptionNameGenerator.getCreationToolName("New {0} as Receiver", eClass)); @@ -363,33 +363,11 @@ public void createActionUsageSiblingNodes(EClass childEClass, EReference contain EClass parentEClass = SysmlPackage.eINSTANCE.getActionUsage(); String parentLabel = ACTION; + Runnable createNodeRunnable = this.creationTestsService.createNode(diagramDescriptionIdProvider, diagram, parentEClass, parentLabel, childEClass); - final Consumer diagramCheck; - if (SysmlPackage.eINSTANCE.getPartUsage().equals(childEClass)) { - diagramCheck = assertRefreshedDiagramThat(newDiagram -> { - var initialDiagram = diagram.get(); - int createdNodesExpectedCount = 2 + compartmentCount; - new CheckDiagramElementCount(this.diagramComparator) - .hasNewNodeCount(createdNodesExpectedCount) - .hasNewEdgeCount(1) - .check(initialDiagram, newDiagram); - - String newNodeDescriptionName = this.descriptionNameGenerator.getNodeName(childEClass); - new CheckNodeOnDiagram(diagramDescriptionIdProvider, this.diagramComparator) - .hasNodeDescriptionName(newNodeDescriptionName) - .hasCompartmentCount(compartmentCount) - .check(initialDiagram, newDiagram); - - String compartmentNodeDescriptionName = this.descriptionNameGenerator.getCompartmentItemName(parentEClass, SysmlPackage.eINSTANCE.getUsage_NestedItem()); - new CheckNodeInCompartment(diagramDescriptionIdProvider, this.diagramComparator) - .withParentLabel(parentLabel) - .withCompartmentName("items") - .hasNodeDescriptionName(compartmentNodeDescriptionName) - .check(initialDiagram, newDiagram); - }); - } else { - diagramCheck = this.diagramCheckerService.siblingNodeGraphicalChecker(diagram, diagramDescriptionIdProvider, childEClass, compartmentCount); - } + + Consumer diagramCheck = this.diagramCheckerService.siblingNodeGraphicalChecker(diagram, diagramDescriptionIdProvider, childEClass, compartmentCount); + Runnable semanticCheck = this.semanticCheckerService.checkEditingContext(this.semanticCheckerService.getElementInParentSemanticChecker(parentLabel, containmentReference, childEClass)); StepVerifier.create(flux) @@ -398,7 +376,7 @@ public void createActionUsageSiblingNodes(EClass childEClass, EReference contain .consumeNextWith(diagramCheck) .then(semanticCheck) .thenCancel() - .verify(Duration.ofSeconds(10)); + .verify(Duration.ofSeconds(100)); } @GivenSysONServer({ GeneralViewWithTopNodesTestProjectData.SCRIPT_PATH }) @@ -538,8 +516,8 @@ public void createActionDefinitionBorderAndChildNodes(EClass childEClass, String @GivenSysONServer({ GeneralViewWithTopNodesTestProjectData.SCRIPT_PATH }) @ParameterizedTest - @MethodSource("actionUsageListAndFreeFormNodeParameters") - public void createActionUsageListAndFreeFormChildNodes(EClass childEClass, String compartmentName, EReference containmentReference, int compartmentCount) { + @MethodSource("actionUsageFreeFormNodeParameters") + public void createActionUsageFreeFormChildNodes(EClass childEClass, EReference containmentReference, int compartmentCount, int compartmentCountInNewChild, int expectedEdgeCount) { var flux = this.givenSubscriptionToDiagram(); AtomicReference diagram = new AtomicReference<>(); @@ -560,16 +538,10 @@ public void createActionUsageListAndFreeFormChildNodes(EClass childEClass, Strin Runnable createNodeRunnable = this.creationTestsService.createNode(diagramDescriptionIdProvider, diagram, parentEClass, parentLabel, creationToolName); Consumer diagramCheck = assertRefreshedDiagramThat(newDiagram -> { var initialDiagram = diagram.get(); - int createdNodesExpectedCount = 2 + compartmentCount; + int createdNodesExpectedCount = 1 + compartmentCount; new CheckDiagramElementCount(this.diagramComparator) .hasNewNodeCount(createdNodesExpectedCount) - .check(initialDiagram, newDiagram); - String listNodeDescription = this.descriptionNameGenerator.getCompartmentItemName(parentEClass, containmentReference); - new CheckNodeInCompartment(diagramDescriptionIdProvider, this.diagramComparator) - .withParentLabel(parentLabel) - .withCompartmentName(compartmentName) - .hasNodeDescriptionName(listNodeDescription) - .hasCompartmentCount(0) + .hasNewEdgeCount(expectedEdgeCount) .check(initialDiagram, newDiagram); String nodeName = this.getActionFlowNodeName(childEClass); String freeFormNodeDescription = this.descriptionNameGenerator.getNodeName(nodeName); @@ -577,7 +549,7 @@ public void createActionUsageListAndFreeFormChildNodes(EClass childEClass, Strin .withParentLabel(parentLabel) .withCompartmentName("action flow") .hasNodeDescriptionName(freeFormNodeDescription) - .hasCompartmentCount(compartmentCount) + .hasCompartmentCount(compartmentCountInNewChild) .check(initialDiagram, newDiagram); }); @@ -660,19 +632,11 @@ public void createReferencingPerformActionUsageInActionUsage() { Consumer diagramCheck = assertRefreshedDiagramThat(newDiagram -> { var initialDiagram = diagram.get(); new CheckDiagramElementCount(this.diagramComparator) - .hasNewNodeCount(4) // 1 visible new PerformActionUsage node + 2 list items (in 'actions' and - // 'perform actions' compartments, now visible) + 1 node in 'action flow' - // compartment + .hasNewNodeCount(3) // 1 visible new PerformActionUsage node + 1 list items (in 'perform actions' + // compartments, now visible) + 1 node in 'action flow' compartment .hasNewEdgeCount(3) // 1 visible composition edge and 2 visible ReferenceSubsetting edge (one for // the top-level node, one for the node in "action flow" compartment .check(initialDiagram, newDiagram, true); - String listNodeDescription = this.descriptionNameGenerator.getCompartmentItemName(parentEClass, containmentReference); - new CheckNodeInCompartment(diagramDescriptionIdProvider, this.diagramComparator) - .withParentLabel(parentLabel) - .withCompartmentName(ACTIONS_COMPARTMENT) - .hasNodeDescriptionName(listNodeDescription) - .hasCompartmentCount(0) - .check(initialDiagram, newDiagram); String freeFormNodeDescription = this.descriptionNameGenerator.getNodeName(SysmlPackage.eINSTANCE.getPerformActionUsage()); new CheckNodeInCompartment(diagramDescriptionIdProvider, this.diagramComparator) .withParentLabel(parentLabel) @@ -713,18 +677,11 @@ public void createPerformActionUsageInActionUsage() { Runnable createNodeRunnable = this.creationTestsService.createNode(diagramDescriptionIdProvider, diagram, parentEClass, parentLabel, creationToolName); Consumer diagramCheck = assertRefreshedDiagramThat(newDiagram -> { var initialDiagram = diagram.get(); - int createdNodesExpectedCount = 14; + int createdNodesExpectedCount = 13; new CheckDiagramElementCount(this.diagramComparator) .hasNewNodeCount(createdNodesExpectedCount) .hasNewEdgeCount(1) .check(initialDiagram, newDiagram); - String listNodeDescription = this.descriptionNameGenerator.getCompartmentItemName(parentEClass, containmentReference); - new CheckNodeInCompartment(diagramDescriptionIdProvider, this.diagramComparator) - .withParentLabel(parentLabel) - .withCompartmentName(ACTIONS_COMPARTMENT) - .hasNodeDescriptionName(listNodeDescription) - .hasCompartmentCount(0) - .check(initialDiagram, newDiagram); String freeFormNodeDescription = this.descriptionNameGenerator.getNodeName(childEClass); new CheckNodeInCompartment(diagramDescriptionIdProvider, this.diagramComparator) .withParentLabel(parentLabel) @@ -774,8 +731,8 @@ public void createActionDefinitionSiblingNodes(EClass childEClass, EReference co @GivenSysONServer({ GeneralViewWithTopNodesTestProjectData.SCRIPT_PATH }) @ParameterizedTest - @MethodSource("actionDefinitionListAndFreeFormNodeParameters") - public void createActionDefinitionListAndFreeFormChildNodes(EClass childEClass, String compartmentName, EReference containmentReference, int compartmentCount) { + @MethodSource("actionDefinitionFreeFormNodeParameters") + public void createActionDefinitionFreeFormChildNodes(EClass childEClass, EReference containmentReference, int compartmentCount, int compartmentCountInNewChild, int expectedEdgeCount) { var flux = this.givenSubscriptionToDiagram(); AtomicReference diagram = new AtomicReference<>(); @@ -793,20 +750,14 @@ public void createActionDefinitionListAndFreeFormChildNodes(EClass childEClass, creationToolName = creationToolName.substring(0, creationToolName.length() - 5); } - Runnable createNodeRunnable = creationTestsService.createNode(diagramDescriptionIdProvider, diagram, parentEClass, parentLabel, creationToolName); + Runnable createNodeRunnable = this.creationTestsService.createNode(diagramDescriptionIdProvider, diagram, parentEClass, parentLabel, creationToolName); Consumer diagramCheck = assertRefreshedDiagramThat(newDiagram -> { var initialDiagram = diagram.get(); - int createdNodesExpectedCount = 2 + compartmentCount; + int createdNodesExpectedCount = 1 + compartmentCount; new CheckDiagramElementCount(this.diagramComparator) .hasNewNodeCount(createdNodesExpectedCount) - .check(initialDiagram, newDiagram); - String listNodeDescription = this.descriptionNameGenerator.getCompartmentItemName(parentEClass, containmentReference); - new CheckNodeInCompartment(diagramDescriptionIdProvider, this.diagramComparator) - .withParentLabel(parentLabel) - .withCompartmentName(compartmentName) - .hasNodeDescriptionName(listNodeDescription) - .hasCompartmentCount(0) + .hasNewEdgeCount(expectedEdgeCount) .check(initialDiagram, newDiagram); String nodeName = this.getActionFlowNodeName(childEClass); String freeFormNodeDescription = this.descriptionNameGenerator.getNodeName(nodeName); @@ -814,7 +765,7 @@ public void createActionDefinitionListAndFreeFormChildNodes(EClass childEClass, .withParentLabel(parentLabel) .withCompartmentName("action flow") .hasNodeDescriptionName(freeFormNodeDescription) - .hasCompartmentCount(compartmentCount) + .hasCompartmentCount(compartmentCountInNewChild) .check(initialDiagram, newDiagram); }); diff --git a/backend/application/syson-application/src/test/java/org/eclipse/syson/application/controllers/diagrams/general/view/GVSubNodeInterconnectionCreationTests.java b/backend/application/syson-application/src/test/java/org/eclipse/syson/application/controllers/diagrams/general/view/GVSubNodeInterconnectionCreationTests.java index 199dd8d06..2e77c8292 100644 --- a/backend/application/syson-application/src/test/java/org/eclipse/syson/application/controllers/diagrams/general/view/GVSubNodeInterconnectionCreationTests.java +++ b/backend/application/syson-application/src/test/java/org/eclipse/syson/application/controllers/diagrams/general/view/GVSubNodeInterconnectionCreationTests.java @@ -163,7 +163,7 @@ private static Stream interfaceDefinitionChildNodeParameters() { private static Stream interfaceDefinitionSiblingAndChildNodeParameters() { return Stream.of( - Arguments.of(SysmlPackage.eINSTANCE.getInterfaceUsage(), "interfaces", SysmlPackage.eINSTANCE.getDefinition_OwnedInterface(), 7, 1)) + Arguments.of(SysmlPackage.eINSTANCE.getInterfaceUsage(), "interfaces", SysmlPackage.eINSTANCE.getDefinition_OwnedInterface(), 6, 1)) .map(TestNameGenerator::namedArguments); } diff --git a/backend/application/syson-application/src/test/java/org/eclipse/syson/application/controllers/diagrams/general/view/GVSubNodeStateTransitionCreationTests.java b/backend/application/syson-application/src/test/java/org/eclipse/syson/application/controllers/diagrams/general/view/GVSubNodeStateTransitionCreationTests.java index 6548dba4b..9c18a16a9 100644 --- a/backend/application/syson-application/src/test/java/org/eclipse/syson/application/controllers/diagrams/general/view/GVSubNodeStateTransitionCreationTests.java +++ b/backend/application/syson-application/src/test/java/org/eclipse/syson/application/controllers/diagrams/general/view/GVSubNodeStateTransitionCreationTests.java @@ -133,24 +133,24 @@ private static Stream stateUsageChildNodeParameters() { * 8 new nodes = 1 compartment item node for new exhibit state + 1 rectangular child node and its 6 * compartments */ - Arguments.of(SysmlPackage.eINSTANCE.getExhibitStateUsage(), EXHIBIT_STATES_COMPARTMENT, SysmlPackage.eINSTANCE.getUsage_NestedState(), "New Exhibit State", 9, 1), + Arguments.of(SysmlPackage.eINSTANCE.getExhibitStateUsage(), EXHIBIT_STATES_COMPARTMENT, SysmlPackage.eINSTANCE.getUsage_NestedState(), "New Exhibit State", 8, 1), /* * 8 new nodes = 1 compartment item node for new exhibit state + 1 rectangular child node and its 6 * compartments */ - Arguments.of(SysmlPackage.eINSTANCE.getExhibitStateUsage(), EXHIBIT_STATES_COMPARTMENT, SysmlPackage.eINSTANCE.getUsage_NestedState(), "New Exhibit Parallel State", 9, 1), + Arguments.of(SysmlPackage.eINSTANCE.getExhibitStateUsage(), EXHIBIT_STATES_COMPARTMENT, SysmlPackage.eINSTANCE.getUsage_NestedState(), "New Exhibit Parallel State", 8, 1), /* * 15 new nodes = 1 compartment item node for new state + 1 rectangular node in the * "state transition compartment" and its 6 compartments + 1 rectangular child node and its 6 * compartments */ - Arguments.of(SysmlPackage.eINSTANCE.getStateUsage(), STATES_COMPARTMENT, SysmlPackage.eINSTANCE.getUsage_NestedState(), "New State", 16, 1), + Arguments.of(SysmlPackage.eINSTANCE.getStateUsage(), STATES_COMPARTMENT, SysmlPackage.eINSTANCE.getUsage_NestedState(), "New State", 15, 1), /* * 15 new nodes = 1 compartment item node for new state + 1 rectangular node in the * "state transition compartment" and its 6 compartments + 1 rectangular child node and its 6 * compartments */ - Arguments.of(SysmlPackage.eINSTANCE.getStateUsage(), STATES_COMPARTMENT, SysmlPackage.eINSTANCE.getUsage_NestedState(), "New Parallel State", 16, 1)) + Arguments.of(SysmlPackage.eINSTANCE.getStateUsage(), STATES_COMPARTMENT, SysmlPackage.eINSTANCE.getUsage_NestedState(), "New Parallel State", 15, 1)) .map(TestNameGenerator::namedArguments); } @@ -161,24 +161,24 @@ private static Stream stateDefinitionChildNodeParameters() { * 8 new nodes = 1 compartment item node for new exhibit state + 1 rectangular child node and its 6 * compartments */ - Arguments.of(SysmlPackage.eINSTANCE.getStateUsage(), EXHIBIT_STATES_COMPARTMENT, SysmlPackage.eINSTANCE.getDefinition_OwnedState(), "New Exhibit State", 9, 1), + Arguments.of(SysmlPackage.eINSTANCE.getStateUsage(), EXHIBIT_STATES_COMPARTMENT, SysmlPackage.eINSTANCE.getDefinition_OwnedState(), "New Exhibit State", 8, 1), /* * 8 new nodes = 1 compartment item node for new exhibit state + 1 rectangular child node and its 6 * compartments */ - Arguments.of(SysmlPackage.eINSTANCE.getStateUsage(), EXHIBIT_STATES_COMPARTMENT, SysmlPackage.eINSTANCE.getDefinition_OwnedState(), "New Exhibit Parallel State", 9, 1), + Arguments.of(SysmlPackage.eINSTANCE.getStateUsage(), EXHIBIT_STATES_COMPARTMENT, SysmlPackage.eINSTANCE.getDefinition_OwnedState(), "New Exhibit Parallel State", 8, 1), /* * 15 new nodes = 1 compartment item node for new state + 1 rectangular node in the * "state transition compartment" and its 6 compartments + 1 rectangular child node and its 6 * compartments */ - Arguments.of(SysmlPackage.eINSTANCE.getStateUsage(), STATES_COMPARTMENT, SysmlPackage.eINSTANCE.getDefinition_OwnedState(), "New State", 16, 1), + Arguments.of(SysmlPackage.eINSTANCE.getStateUsage(), STATES_COMPARTMENT, SysmlPackage.eINSTANCE.getDefinition_OwnedState(), "New State", 15, 1), /* * 15 new nodes = 1 compartment item node for new state + 1 rectangular node in the * "state transition compartment" and its 6 compartments + 1 rectangular child node and its 6 * compartments */ - Arguments.of(SysmlPackage.eINSTANCE.getStateUsage(), STATES_COMPARTMENT, SysmlPackage.eINSTANCE.getDefinition_OwnedState(), "New Parallel State", 16, 1)) + Arguments.of(SysmlPackage.eINSTANCE.getStateUsage(), STATES_COMPARTMENT, SysmlPackage.eINSTANCE.getDefinition_OwnedState(), "New Parallel State", 15, 1)) .map(TestNameGenerator::namedArguments); } @@ -249,8 +249,8 @@ private void createStateSubactionNode(StateSubactionKind kind, EClass parentECla Consumer diagramCheck = assertRefreshedDiagramThat(newDiagram -> { var initialDiagram = diagram.get(); new CheckDiagramElementCount(this.diagramComparator) - // the new subaction is created in two compartments (actions and perform actions) - .hasNewNodeCount(2) + // the new subaction is created in one compartment (actions or perform actions) + .hasNewNodeCount(1) .hasNewEdgeCount(0) .check(initialDiagram, newDiagram); var node = this.diagramComparator.newNodes(initialDiagram, newDiagram).get(0); @@ -292,8 +292,8 @@ private void createStateSubactionWithReferencedActionNode(StateSubactionKind kin Consumer diagramCheck = assertRefreshedDiagramThat(newDiagram -> { var initialDiagram = diagram.get(); new CheckDiagramElementCount(this.diagramComparator) - // the new subaction is created in two compartments (actions and perform actions) - .hasNewNodeCount(2) + // the new subaction is created in one compartment (perform actions) + .hasNewNodeCount(1) .hasNewEdgeCount(0) .check(initialDiagram, newDiagram); var node = this.diagramComparator.newNodes(initialDiagram, newDiagram).get(0); diff --git a/backend/application/syson-application/src/test/java/org/eclipse/syson/application/controllers/diagrams/general/view/GVSubNodeTemporalCreationTests.java b/backend/application/syson-application/src/test/java/org/eclipse/syson/application/controllers/diagrams/general/view/GVSubNodeTemporalCreationTests.java index 0364566f4..33783bc18 100644 --- a/backend/application/syson-application/src/test/java/org/eclipse/syson/application/controllers/diagrams/general/view/GVSubNodeTemporalCreationTests.java +++ b/backend/application/syson-application/src/test/java/org/eclipse/syson/application/controllers/diagrams/general/view/GVSubNodeTemporalCreationTests.java @@ -239,10 +239,10 @@ public void createOccurrenceDefinitionSiblingNodes(EClass childEClass, EReferenc final Consumer diagramCheck; if (SysmlPackage.eINSTANCE.getPartUsage().equals(childEClass)) { - // A PartUsage appears both as a sibling and in the "occurrences" compartment. + // A PartUsage appears as a sibling. diagramCheck = assertRefreshedDiagramThat(newDiagram -> { var initialDiagram = diagram.get(); - int createdNodesExpectedCount = 2 + compartmentCount; + int createdNodesExpectedCount = 1 + compartmentCount; new CheckDiagramElementCount(this.diagramComparator) .hasNewNodeCount(createdNodesExpectedCount) .hasNewEdgeCount(1) @@ -253,13 +253,6 @@ public void createOccurrenceDefinitionSiblingNodes(EClass childEClass, EReferenc .hasNodeDescriptionName(newNodeDescriptionName) .hasCompartmentCount(compartmentCount) .check(initialDiagram, newDiagram); - - String compartmentNodeDescriptionName = this.descriptionNameGenerator.getCompartmentItemName(parentEClass, SysmlPackage.eINSTANCE.getDefinition_OwnedOccurrence()); - new CheckNodeInCompartment(diagramDescriptionIdProvider, this.diagramComparator) - .withParentLabel(parentLabel) - .withCompartmentName("occurrences") - .hasNodeDescriptionName(compartmentNodeDescriptionName) - .check(initialDiagram, newDiagram); }); } else { diagramCheck = this.diagramCheckerService.siblingNodeGraphicalChecker(diagram, diagramDescriptionIdProvider, childEClass, compartmentCount); diff --git a/backend/application/syson-application/src/test/java/org/eclipse/syson/application/controllers/diagrams/interconnection/view/IVAddNewFlowConnectionFromPartUsageTests.java b/backend/application/syson-application/src/test/java/org/eclipse/syson/application/controllers/diagrams/interconnection/view/IVAddNewFlowConnectionFromPartUsageTests.java index e2e3318d2..e558bf98c 100644 --- a/backend/application/syson-application/src/test/java/org/eclipse/syson/application/controllers/diagrams/interconnection/view/IVAddNewFlowConnectionFromPartUsageTests.java +++ b/backend/application/syson-application/src/test/java/org/eclipse/syson/application/controllers/diagrams/interconnection/view/IVAddNewFlowConnectionFromPartUsageTests.java @@ -133,9 +133,8 @@ public void givenASysMLProjectWhenNewFlowConnectionToolOfFirstLevelElementIsRequ // - 1 more node for the new PartUsage, with all its compartments // - 2 more nodes for ports on each part usage // - 1 more node (list item) in the parent's "parts" compartment for the new part - // - 1 more node (list item) in the parent's "action" compartment for the new FlowUsage // - 1 more edge (the new interface edge) - .hasNewNodeCount(1 + PART_USAGE_COMPARTMENT_COUNT + 2 + 2) + .hasNewNodeCount(1 + PART_USAGE_COMPARTMENT_COUNT + 2 + 1) .hasNewEdgeCount(1) .hasNewBorderNodeCount(2) .check(initialDiagram, newDiagram); @@ -211,9 +210,8 @@ public void givenASysMLProjectWhenNewFlowConnectionToolOfNestedElementIsRequeste // - 1 more node for the new PartUsage, with all its compartments // - 2 more nodes for ports on each part usage // - 1 more node (list item) in the parent's "parts" compartment for the new part - // - 1 more node (list item) in the parent's "actions" compartment for the new FlowUsage // - 1 more edge (the new interface edge) - .hasNewNodeCount(1 + PART_USAGE_COMPARTMENT_COUNT + 2 + 2) + .hasNewNodeCount(1 + PART_USAGE_COMPARTMENT_COUNT + 2 + 1) .hasNewEdgeCount(1) .hasNewBorderNodeCount(2) .check(initialDiagram, newDiagram); diff --git a/backend/application/syson-application/src/test/java/org/eclipse/syson/application/controllers/diagrams/interconnection/view/IVAddNewInterfaceFromPartUsageTests.java b/backend/application/syson-application/src/test/java/org/eclipse/syson/application/controllers/diagrams/interconnection/view/IVAddNewInterfaceFromPartUsageTests.java index 4699cfc3c..5bae7beb1 100644 --- a/backend/application/syson-application/src/test/java/org/eclipse/syson/application/controllers/diagrams/interconnection/view/IVAddNewInterfaceFromPartUsageTests.java +++ b/backend/application/syson-application/src/test/java/org/eclipse/syson/application/controllers/diagrams/interconnection/view/IVAddNewInterfaceFromPartUsageTests.java @@ -132,9 +132,9 @@ public void givenASysMLProjectWhenNewInterfaceToolIsRequestedOnAPartUsageThenANe // We should have: // - 1 more node for the new PartUsage, with all its compartments // - 2 more nodes for ports on each part usage - // - 2 more node (list item) in the parent's "parts" compartment for the new part and the new InterfaceUsage + // - 1 more node (list item) in the parent's "parts" compartment for the new part // - 1 more edge (the new interface edge) - .hasNewNodeCount(1 + PART_USAGE_COMPARTMENT_COUNT + 2 + 2) + .hasNewNodeCount(1 + PART_USAGE_COMPARTMENT_COUNT + 2 + 1) .hasNewEdgeCount(1) .hasNewBorderNodeCount(2) .check(initialDiagram, newDiagram); @@ -209,9 +209,9 @@ public void givenASysMLProjectWhenNewInterfaceToolOfNestedElementIsRequestedOnAP // We should have: // - 1 more node for the new PartUsage, with all its compartments // - 2 more nodes for ports on each part usage - // - 2 more node (list item) in the parent's "parts" compartment for the new part and the new InterfaceUsage + // - 2 more node (list item) in the parent's "parts" compartment for the new part // - 1 more edge (the new interface edge) - .hasNewNodeCount(1 + PART_USAGE_COMPARTMENT_COUNT + 2 + 2) + .hasNewNodeCount(1 + PART_USAGE_COMPARTMENT_COUNT + 2 + 1) .hasNewEdgeCount(1) .hasNewBorderNodeCount(2) .check(initialDiagram, newDiagram); diff --git a/backend/services/syson-diagram-services/src/main/java/org/eclipse/syson/diagram/services/aql/DiagramQueryAQLService.java b/backend/services/syson-diagram-services/src/main/java/org/eclipse/syson/diagram/services/aql/DiagramQueryAQLService.java index b270ed7db..f1404fc36 100644 --- a/backend/services/syson-diagram-services/src/main/java/org/eclipse/syson/diagram/services/aql/DiagramQueryAQLService.java +++ b/backend/services/syson-diagram-services/src/main/java/org/eclipse/syson/diagram/services/aql/DiagramQueryAQLService.java @@ -47,14 +47,6 @@ public DiagramQueryAQLService(DiagramQueryElementService diagramQueryElementServ this.diagramQueryLabelService = Objects.requireNonNull(diagramQueryLabelService); } - /** - * {@link DiagramQueryElementService#infoMessage(Object, String)}. - */ - public Object infoMessage(Object self, String message) { - this.diagramQueryElementService.infoMessage(self, message); - return self; - } - /** * {@link DiagramQueryLabelService#getBorderNodeUsageLabel(Usage)}. */ @@ -152,6 +144,14 @@ public String getSatisfyLabel(SatisfyRequirementUsage satisfyRequirementUsage) { return this.diagramQueryLabelService.getSatisfyLabel(satisfyRequirementUsage); } + /** + * {@link DiagramQueryElementService#infoMessage(Object, String)}. + */ + public Object infoMessage(Object self, String message) { + this.diagramQueryElementService.infoMessage(self, message); + return self; + } + /** * {@link DiagramQueryElementService#isDiagramEmpty(editingContext, diagramContext, previousDiagram)}. */ diff --git a/backend/services/syson-diagram-services/src/main/java/org/eclipse/syson/diagram/services/utils/CompartmentItemPreconditionSwitch.java b/backend/services/syson-diagram-services/src/main/java/org/eclipse/syson/diagram/services/utils/CompartmentItemPreconditionSwitch.java new file mode 100644 index 000000000..cdf345002 --- /dev/null +++ b/backend/services/syson-diagram-services/src/main/java/org/eclipse/syson/diagram/services/utils/CompartmentItemPreconditionSwitch.java @@ -0,0 +1,58 @@ +/******************************************************************************* + * 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.diagram.services.utils; + +import java.util.Objects; + +import org.eclipse.emf.ecore.EClassifier; +import org.eclipse.emf.ecore.EObject; +import org.eclipse.emf.ecore.EReference; +import org.eclipse.syson.sysml.SysmlPackage; +import org.eclipse.syson.util.AQLConstants; +import org.eclipse.syson.util.SysMLMetamodelHelper; +import org.eclipse.syson.util.SysmlEClassSwitch; + +/** + * Switch returning a string to answer the precondition expression of compartment items. + * + * @author arichard + */ +public class CompartmentItemPreconditionSwitch extends SysmlEClassSwitch { + + private final EReference eReference; + + public CompartmentItemPreconditionSwitch(EReference eReference) { + this.eReference = Objects.requireNonNull(eReference); + } + + @Override + public String defaultCase(EObject object) { + EClassifier eType = this.eReference.getEType(); + var qualifiedName = SysMLMetamodelHelper.buildQualifiedName(eType); + String preconditionExpression = AQLConstants.AQL_SELF + ".oclIsTypeOf(" + qualifiedName + ")"; + boolean isAbstract = false; + if (Objects.equals(SysmlPackage.eINSTANCE.getUsage(), eType)) { + isAbstract = true; + } else if (Objects.equals(SysmlPackage.eINSTANCE.getDefinition(), eType)) { + isAbstract = true; + } else if (Objects.equals(SysmlPackage.eINSTANCE.getFeature(), eType)) { + isAbstract = true; + } else if (Objects.equals(SysmlPackage.eINSTANCE.getType(), eType)) { + isAbstract = true; + } + if (isAbstract) { + preconditionExpression = AQLConstants.AQL_SELF + ".oclIsKindOf(" + qualifiedName + ")"; + } + return preconditionExpression; + } +} diff --git a/backend/views/syson-diagram-common-view/src/main/java/org/eclipse/syson/diagram/common/view/edges/AbstractDefinitionOwnedUsageEdgeDescriptionProvider.java b/backend/views/syson-diagram-common-view/src/main/java/org/eclipse/syson/diagram/common/view/edges/AbstractDefinitionOwnedUsageEdgeDescriptionProvider.java index 8aecfda89..407ee0996 100644 --- a/backend/views/syson-diagram-common-view/src/main/java/org/eclipse/syson/diagram/common/view/edges/AbstractDefinitionOwnedUsageEdgeDescriptionProvider.java +++ b/backend/views/syson-diagram-common-view/src/main/java/org/eclipse/syson/diagram/common/view/edges/AbstractDefinitionOwnedUsageEdgeDescriptionProvider.java @@ -1,5 +1,5 @@ /******************************************************************************* - * Copyright (c) 2023, 2025 Obeo. + * Copyright (c) 2023, 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 @@ -89,17 +89,19 @@ public void link(DiagramDescription diagramDescription, IViewDiagramElementFinde var optEdgeDescription = cache.getEdgeDescription(this.descriptionNameGenerator.getEdgeName("Definition Owned " + this.eClass.getName())); var optUsageNodeDescription = cache.getNodeDescription(this.descriptionNameGenerator.getNodeName(this.eClass)); - var sourceNodes = new ArrayList(); - this.getEdgeSources().forEach(definition -> { - cache.getNodeDescription(this.descriptionNameGenerator.getNodeName(definition)).ifPresent(sourceNodes::add); - }); + if (optEdgeDescription.isPresent() && optUsageNodeDescription.isPresent()) { + var sourceNodes = new ArrayList(); + this.getEdgeSources().forEach(definition -> { + cache.getNodeDescription(this.descriptionNameGenerator.getNodeName(definition)).ifPresent(sourceNodes::add); + }); - EdgeDescription edgeDescription = optEdgeDescription.get(); - diagramDescription.getEdgeDescriptions().add(edgeDescription); - edgeDescription.getSourceDescriptions().addAll(sourceNodes); - edgeDescription.getTargetDescriptions().add(optUsageNodeDescription.get()); + EdgeDescription edgeDescription = optEdgeDescription.get(); + diagramDescription.getEdgeDescriptions().add(edgeDescription); + edgeDescription.getSourceDescriptions().addAll(sourceNodes); + edgeDescription.getTargetDescriptions().add(optUsageNodeDescription.get()); - edgeDescription.setPalette(this.createEdgePalette(cache)); + edgeDescription.setPalette(this.createEdgePalette(cache)); + } } @Override diff --git a/backend/views/syson-diagram-common-view/src/main/java/org/eclipse/syson/diagram/common/view/nodes/CompartmentItemNodeDescriptionProvider.java b/backend/views/syson-diagram-common-view/src/main/java/org/eclipse/syson/diagram/common/view/nodes/CompartmentItemNodeDescriptionProvider.java index 90dc3403f..c89e19f1c 100644 --- a/backend/views/syson-diagram-common-view/src/main/java/org/eclipse/syson/diagram/common/view/nodes/CompartmentItemNodeDescriptionProvider.java +++ b/backend/views/syson-diagram-common-view/src/main/java/org/eclipse/syson/diagram/common/view/nodes/CompartmentItemNodeDescriptionProvider.java @@ -31,6 +31,7 @@ import org.eclipse.syson.diagram.common.view.services.ViewLabelService; import org.eclipse.syson.diagram.services.aql.DiagramMutationAQLService; import org.eclipse.syson.diagram.services.aql.DiagramQueryAQLService; +import org.eclipse.syson.diagram.services.utils.CompartmentItemPreconditionSwitch; import org.eclipse.syson.services.DeleteService; import org.eclipse.syson.util.AQLConstants; import org.eclipse.syson.util.IDescriptionNameGenerator; @@ -66,6 +67,7 @@ public NodeDescription create() { .domainType(this.getDomainType()) .insideLabel(this.createInsideLabelDescription()) .name(this.getName()) + .preconditionExpression(new CompartmentItemPreconditionSwitch(this.eReference).doSwitch(this.eClass)) .semanticCandidatesExpression(this.getSemanticCandidateExpression()) .style(this.createCompartmentItemNodeStyle()) .userResizable(UserResizableDirection.NONE) diff --git a/backend/views/syson-diagram-common-view/src/main/java/org/eclipse/syson/diagram/common/view/nodes/InheritedCompartmentItemNodeDescriptionProvider.java b/backend/views/syson-diagram-common-view/src/main/java/org/eclipse/syson/diagram/common/view/nodes/InheritedCompartmentItemNodeDescriptionProvider.java index 90d0cf554..f2007edf9 100644 --- a/backend/views/syson-diagram-common-view/src/main/java/org/eclipse/syson/diagram/common/view/nodes/InheritedCompartmentItemNodeDescriptionProvider.java +++ b/backend/views/syson-diagram-common-view/src/main/java/org/eclipse/syson/diagram/common/view/nodes/InheritedCompartmentItemNodeDescriptionProvider.java @@ -30,6 +30,7 @@ import org.eclipse.sirius.components.view.diagram.UserResizableDirection; import org.eclipse.syson.diagram.common.view.services.ViewCreateService; import org.eclipse.syson.diagram.common.view.services.ViewLabelService; +import org.eclipse.syson.diagram.services.utils.CompartmentItemPreconditionSwitch; import org.eclipse.syson.util.AQLConstants; import org.eclipse.syson.util.AQLUtils; import org.eclipse.syson.util.IDescriptionNameGenerator; @@ -65,6 +66,7 @@ public NodeDescription create() { .domainType(SysMLMetamodelHelper.buildQualifiedName(this.eReference.getEType())) .insideLabel(this.createInsideLabelDescription()) .name(this.descriptionNameGenerator.getInheritedCompartmentItemName(this.eClass, this.eReference)) + .preconditionExpression(new CompartmentItemPreconditionSwitch(this.eReference).doSwitch(this.eClass)) .semanticCandidatesExpression(ServiceMethod.of1(ViewCreateService::getInheritedCompartmentItems).aqlSelf(AQLUtils.aqlString(this.eReference.getName()))) .style(this.createCompartmentItemNodeStyle()) .userResizable(UserResizableDirection.NONE) diff --git a/backend/views/syson-diagram-common-view/src/main/java/org/eclipse/syson/diagram/common/view/nodes/SatisfyRequirementCompartmentItemNodeDescription.java b/backend/views/syson-diagram-common-view/src/main/java/org/eclipse/syson/diagram/common/view/nodes/SatisfyRequirementCompartmentItemNodeDescription.java index 942f2bb81..80214412a 100644 --- a/backend/views/syson-diagram-common-view/src/main/java/org/eclipse/syson/diagram/common/view/nodes/SatisfyRequirementCompartmentItemNodeDescription.java +++ b/backend/views/syson-diagram-common-view/src/main/java/org/eclipse/syson/diagram/common/view/nodes/SatisfyRequirementCompartmentItemNodeDescription.java @@ -1,5 +1,5 @@ /******************************************************************************* - * Copyright (c) 2025 Obeo. + * Copyright (c) 2025, 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 @@ -15,6 +15,7 @@ import org.eclipse.emf.ecore.EClass; import org.eclipse.emf.ecore.EReference; import org.eclipse.sirius.components.view.builder.providers.IColorProvider; +import org.eclipse.sirius.components.view.diagram.NodeDescription; import org.eclipse.syson.sysml.SysmlPackage; import org.eclipse.syson.util.AQLConstants; import org.eclipse.syson.util.IDescriptionNameGenerator; @@ -37,6 +38,13 @@ public SatisfyRequirementCompartmentItemNodeDescription(EClass eClass, EReferenc super(eClass, eReference, colorProvider, nameGenerator); } + @Override + public NodeDescription create() { + NodeDescription nodeDescription = super.create(); + nodeDescription.setPreconditionExpression("true"); + return nodeDescription; + } + @Override protected String getDomainType() { return SysMLMetamodelHelper.buildQualifiedName(SysmlPackage.eINSTANCE.getSatisfyRequirementUsage()); diff --git a/backend/views/syson-diagram-common-view/src/main/java/org/eclipse/syson/diagram/common/view/nodes/StatesCompartmentItemNodeDescriptionProvider.java b/backend/views/syson-diagram-common-view/src/main/java/org/eclipse/syson/diagram/common/view/nodes/StatesCompartmentItemNodeDescriptionProvider.java index 85b3b648a..bdc445ad1 100644 --- a/backend/views/syson-diagram-common-view/src/main/java/org/eclipse/syson/diagram/common/view/nodes/StatesCompartmentItemNodeDescriptionProvider.java +++ b/backend/views/syson-diagram-common-view/src/main/java/org/eclipse/syson/diagram/common/view/nodes/StatesCompartmentItemNodeDescriptionProvider.java @@ -39,6 +39,7 @@ public StatesCompartmentItemNodeDescriptionProvider(EClass eClass, EReference eR public NodeDescription create() { NodeDescription nd = super.create(); if (this.showsExhibitOnly) { + nd.setPreconditionExpression("true"); nd.setName(this.getDescriptionNameGenerator().getCompartmentItemName(this.getEClass(), this.getEReference()) + StatesCompartmentNodeDescriptionProvider.EXHIBIT_STATES_NAME); } else { nd.setName(this.getDescriptionNameGenerator().getCompartmentItemName(this.getEClass(), this.getEReference()) + StatesCompartmentNodeDescriptionProvider.STATES_NAME); diff --git a/backend/views/syson-standard-diagrams-view/src/main/java/org/eclipse/syson/standard/diagrams/view/SDVDiagramDescriptionProvider.java b/backend/views/syson-standard-diagrams-view/src/main/java/org/eclipse/syson/standard/diagrams/view/SDVDiagramDescriptionProvider.java index 8ecb628c2..b93337718 100644 --- a/backend/views/syson-standard-diagrams-view/src/main/java/org/eclipse/syson/standard/diagrams/view/SDVDiagramDescriptionProvider.java +++ b/backend/views/syson-standard-diagrams-view/src/main/java/org/eclipse/syson/standard/diagrams/view/SDVDiagramDescriptionProvider.java @@ -69,7 +69,6 @@ import org.eclipse.syson.standard.diagrams.view.edges.AllocateEdgeDescriptionProvider; import org.eclipse.syson.standard.diagrams.view.edges.BindingConnectorAsUsageEdgeDescriptionProvider; import org.eclipse.syson.standard.diagrams.view.edges.ConnectionUsageEdgeDescriptionProvider; -import org.eclipse.syson.standard.diagrams.view.edges.DefinitionOwnedActionUsageEdgeDescriptionProvider; import org.eclipse.syson.standard.diagrams.view.edges.DefinitionOwnedUsageEdgeDescriptionProvider; import org.eclipse.syson.standard.diagrams.view.edges.DependencyEdgeDescriptionProvider; import org.eclipse.syson.standard.diagrams.view.edges.FeatureTypingEdgeDescriptionProvider; @@ -371,7 +370,6 @@ private List> createDiagramElementDescript diagramElementDescriptionProviders.add(new FakeNodeDescriptionProvider(colorProvider, this.getDescriptionNameGenerator())); diagramElementDescriptionProviders.add(new GeneralViewEmptyDiagramNodeDescriptionProvider(colorProvider)); - diagramElementDescriptionProviders.add(new DefinitionOwnedActionUsageEdgeDescriptionProvider(colorProvider, this.getDescriptionNameGenerator())); diagramElementDescriptionProviders.add(new PortUsageBorderNodeDescriptionProvider(SysmlPackage.eINSTANCE.getUsage_NestedPort(), colorProvider, this.getDescriptionNameGenerator())); diagramElementDescriptionProviders.add(new PortUsageBorderNodeDescriptionProvider(SysmlPackage.eINSTANCE.getDefinition_OwnedPort(), colorProvider, this.getDescriptionNameGenerator())); diagramElementDescriptionProviders.add(new InheritedPortUsageBorderNodeDescriptionProvider(SysmlPackage.eINSTANCE.getUsage_NestedPort(), colorProvider, this.getDescriptionNameGenerator())); @@ -502,6 +500,13 @@ private List> createCompartmentsForListIte compartmentNodeDescriptionProviders.add(new StatesCompartmentItemNodeDescriptionProvider(eClass, eReference, colorProvider, this.getDescriptionNameGenerator(), true)); compartmentNodeDescriptionProviders.add(new StatesCompartmentNodeDescriptionProvider(eClass, eReference, colorProvider, this.getDescriptionNameGenerator(), false)); compartmentNodeDescriptionProviders.add(new StatesCompartmentItemNodeDescriptionProvider(eClass, eReference, colorProvider, this.getDescriptionNameGenerator(), false)); + } else if ((SysmlPackage.eINSTANCE.getStateUsage().equals(eClass) && SysmlPackage.eINSTANCE.getUsage_NestedAction().equals(eReference)) + || (SysmlPackage.eINSTANCE.getStateDefinition().equals(eClass) && SysmlPackage.eINSTANCE.getDefinition_OwnedAction().equals(eReference))) { + compartmentNodeDescriptionProviders.add(new CompartmentItemNodeDescriptionProvider(eClass, eReference, colorProvider, this.getDescriptionNameGenerator())); + compartmentNodeDescriptionProviders.add(new CompartmentNodeDescriptionProvider(eClass, eReference, colorProvider)); + compartmentNodeDescriptionProviders.add(new InheritedCompartmentItemNodeDescriptionProvider(eClass, eReference, colorProvider, this.getDescriptionNameGenerator())); + compartmentNodeDescriptionProviders.add(new PerformActionsCompartmentItemNodeDescriptionProvider(eClass, eReference, colorProvider, this.getDescriptionNameGenerator())); + compartmentNodeDescriptionProviders.add(new PerformActionsCompartmentNodeDescriptionProvider(eClass, eReference, colorProvider, this.getDescriptionNameGenerator())); } else if ((SysmlPackage.eINSTANCE.getPartUsage().equals(eClass) && SysmlPackage.eINSTANCE.getUsage_NestedAction().equals(eReference)) || (SysmlPackage.eINSTANCE.getPartDefinition().equals(eClass) && SysmlPackage.eINSTANCE.getDefinition_OwnedAction().equals(eReference))) { compartmentNodeDescriptionProviders.add(new ActionItemNodeDescriptionProvider(eClass, eReference, colorProvider, this.getDescriptionNameGenerator())); @@ -764,6 +769,12 @@ private List> createAllEdgeDescriptionProv private List> createAllDefinitionOwnedUsageEdgeDescriptionProviders(IColorProvider colorProvider) { final var definitionOwnedUsageEdgeDescriptionProviders = new ArrayList>(); + definitionOwnedUsageEdgeDescriptionProviders + .add(new DefinitionOwnedUsageEdgeDescriptionProvider(SysmlPackage.eINSTANCE.getAcceptActionUsage(), SysmlPackage.eINSTANCE.getDefinition_OwnedAction(), + colorProvider, this.getDescriptionNameGenerator())); + definitionOwnedUsageEdgeDescriptionProviders + .add(new DefinitionOwnedUsageEdgeDescriptionProvider(SysmlPackage.eINSTANCE.getActionUsage(), SysmlPackage.eINSTANCE.getDefinition_OwnedAction(), + colorProvider, this.getDescriptionNameGenerator())); definitionOwnedUsageEdgeDescriptionProviders .add(new DefinitionOwnedUsageEdgeDescriptionProvider(SysmlPackage.eINSTANCE.getAllocationUsage(), SysmlPackage.eINSTANCE.getDefinition_OwnedAllocation(), colorProvider, this.getDescriptionNameGenerator())); diff --git a/backend/views/syson-standard-diagrams-view/src/main/java/org/eclipse/syson/standard/diagrams/view/edges/DefinitionOwnedActionUsageEdgeDescriptionProvider.java b/backend/views/syson-standard-diagrams-view/src/main/java/org/eclipse/syson/standard/diagrams/view/edges/DefinitionOwnedActionUsageEdgeDescriptionProvider.java deleted file mode 100644 index 86b192955..000000000 --- a/backend/views/syson-standard-diagrams-view/src/main/java/org/eclipse/syson/standard/diagrams/view/edges/DefinitionOwnedActionUsageEdgeDescriptionProvider.java +++ /dev/null @@ -1,40 +0,0 @@ -/******************************************************************************* - * Copyright (c) 2024, 2025 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.standard.diagrams.view.edges; - -import java.util.List; - -import org.eclipse.emf.ecore.EClass; -import org.eclipse.sirius.components.view.builder.providers.IColorProvider; -import org.eclipse.syson.diagram.common.view.edges.AbstractDefinitionOwnedUsageEdgeDescriptionProvider; -import org.eclipse.syson.standard.diagrams.view.SDVDiagramDescriptionProvider; -import org.eclipse.syson.sysml.SysmlPackage; -import org.eclipse.syson.util.IDescriptionNameGenerator; - -/** - * Used to create the edge description between definitions and their owned action usages in the General View diagram. - * - * @author Jerome Gout - */ -public class DefinitionOwnedActionUsageEdgeDescriptionProvider extends AbstractDefinitionOwnedUsageEdgeDescriptionProvider { - - public DefinitionOwnedActionUsageEdgeDescriptionProvider(IColorProvider colorProvider, IDescriptionNameGenerator nameGenerator) { - super(SysmlPackage.eINSTANCE.getActionUsage(), SysmlPackage.eINSTANCE.getDefinition_OwnedAction(), colorProvider, nameGenerator); - } - - @Override - protected List getEdgeSources() { - return SDVDiagramDescriptionProvider.DEFINITIONS; - } - -} diff --git a/backend/views/syson-standard-diagrams-view/src/main/java/org/eclipse/syson/standard/diagrams/view/nodes/ObjectiveDocumentationCompartmentItemNodeDescription.java b/backend/views/syson-standard-diagrams-view/src/main/java/org/eclipse/syson/standard/diagrams/view/nodes/ObjectiveDocumentationCompartmentItemNodeDescription.java index 388c8b7b6..913e7617e 100644 --- a/backend/views/syson-standard-diagrams-view/src/main/java/org/eclipse/syson/standard/diagrams/view/nodes/ObjectiveDocumentationCompartmentItemNodeDescription.java +++ b/backend/views/syson-standard-diagrams-view/src/main/java/org/eclipse/syson/standard/diagrams/view/nodes/ObjectiveDocumentationCompartmentItemNodeDescription.java @@ -15,6 +15,7 @@ import org.eclipse.emf.ecore.EClass; import org.eclipse.emf.ecore.EReference; import org.eclipse.sirius.components.view.builder.providers.IColorProvider; +import org.eclipse.sirius.components.view.diagram.NodeDescription; import org.eclipse.syson.diagram.common.view.nodes.CompartmentItemNodeDescriptionProvider; import org.eclipse.syson.sysml.SysmlPackage; import org.eclipse.syson.util.AQLConstants; @@ -33,6 +34,13 @@ public ObjectiveDocumentationCompartmentItemNodeDescription(EClass eClass, ERefe super(eClass, eReference, colorProvider, descriptionNameGenerator); } + @Override + public NodeDescription create() { + NodeDescription nodeDescription = super.create(); + nodeDescription.setPreconditionExpression("true"); + return nodeDescription; + } + @Override protected String getName() { return super.getName() + COMPARTMENT_ITEM_NAME; diff --git a/backend/views/syson-standard-diagrams-view/src/main/java/org/eclipse/syson/standard/diagrams/view/nodes/PerformActionsCompartmentItemNodeDescriptionProvider.java b/backend/views/syson-standard-diagrams-view/src/main/java/org/eclipse/syson/standard/diagrams/view/nodes/PerformActionsCompartmentItemNodeDescriptionProvider.java index 31ca992c6..2564cb83d 100644 --- a/backend/views/syson-standard-diagrams-view/src/main/java/org/eclipse/syson/standard/diagrams/view/nodes/PerformActionsCompartmentItemNodeDescriptionProvider.java +++ b/backend/views/syson-standard-diagrams-view/src/main/java/org/eclipse/syson/standard/diagrams/view/nodes/PerformActionsCompartmentItemNodeDescriptionProvider.java @@ -16,6 +16,7 @@ import org.eclipse.emf.ecore.EClass; import org.eclipse.emf.ecore.EReference; import org.eclipse.sirius.components.view.builder.providers.IColorProvider; +import org.eclipse.sirius.components.view.diagram.NodeDescription; import org.eclipse.syson.diagram.common.view.nodes.CompartmentItemNodeDescriptionProvider; import org.eclipse.syson.services.UtilService; import org.eclipse.syson.util.IDescriptionNameGenerator; @@ -32,6 +33,13 @@ public PerformActionsCompartmentItemNodeDescriptionProvider(EClass eClass, ERefe super(eClass, eReference, colorProvider, descriptionNameGenerator); } + @Override + public NodeDescription create() { + NodeDescription nodeDescription = super.create(); + nodeDescription.setPreconditionExpression("true"); + return nodeDescription; + } + @Override protected String getName() { return super.getName() + PerformActionsCompartmentNodeDescriptionProvider.PERFORM_ACTIONS_COMPARTMENT_NAME; diff --git a/doc/content/modules/user-manual/pages/release-notes/2026.1.0.adoc b/doc/content/modules/user-manual/pages/release-notes/2026.1.0.adoc index 18f88ea29..afee0f045 100644 --- a/doc/content/modules/user-manual/pages/release-notes/2026.1.0.adoc +++ b/doc/content/modules/user-manual/pages/release-notes/2026.1.0.adoc @@ -157,8 +157,6 @@ When a `Usage` is selected, the new subject created (i.e. a `ReferenceUsage`) wi When a `PartDefinition` is selected, the new actor created (i.e. a `PartUsage`) will be typed by the selected `PartDefinition`. + When a `PartUsage` is selected, the new actor created (i.e. a `PartUsage`) will subset the selected `PartUsage`. -+ -We are now auto importing the library automatically if we detect the use of a symbol from the _SI_ library. ** The default size of a _NamespaceImport_ graphical node is now the same as the one for a _Package_. + [cols="1,1"] diff --git a/doc/content/modules/user-manual/pages/release-notes/2026.3.0.adoc b/doc/content/modules/user-manual/pages/release-notes/2026.3.0.adoc index 77c22a3c7..853d5e063 100644 --- a/doc/content/modules/user-manual/pages/release-notes/2026.3.0.adoc +++ b/doc/content/modules/user-manual/pages/release-notes/2026.3.0.adoc @@ -15,6 +15,10 @@ It's not recommended for production use. == Bug fixes +* In diagrams: + +** Fix an issue where some type of `Elements` could appear in the wrong compartment if they shared a common type with said compartment, for example `ViewUsage` elements could appear in the _parts_ compartment since they extends `PartUsage`. + * In textual import/export: ** Fix the textual export of `OccurrenceUsage` to avoid duplication of the _abstract_ keyword. diff --git a/scripts/check-coverage.jsh b/scripts/check-coverage.jsh index fddf3bd45..f170f947f 100755 --- a/scripts/check-coverage.jsh +++ b/scripts/check-coverage.jsh @@ -38,16 +38,16 @@ var moduleCoverageData = List.of( new ModuleCoverage("syson-diagram-services", 82.0), new ModuleCoverage("syson-direct-edit-grammar", 67.0), new ModuleCoverage("syson-form-services", 100.0), - new ModuleCoverage("syson-model-services", 93.0), + new ModuleCoverage("syson-model-services", 94.0), new ModuleCoverage("syson-representation-services", 100.0), new ModuleCoverage("syson-services", 65.0), new ModuleCoverage("syson-siriusweb-customnodes-metamodel", 44.0), new ModuleCoverage("syson-siriusweb-customnodes-metamodel-edit", 0.0), - new ModuleCoverage("syson-standard-diagrams-view", 97.0), + new ModuleCoverage("syson-standard-diagrams-view", 98.0), new ModuleCoverage("syson-sysml-export", 69.0), new ModuleCoverage("syson-sysml-import", 85.0), new ModuleCoverage("syson-sysml-metamodel", 76.0), - new ModuleCoverage("syson-sysml-metamodel-edit", 18.0), + new ModuleCoverage("syson-sysml-metamodel-edit", 17.0), new ModuleCoverage("syson-sysml-metamodel-services", 95.0), new ModuleCoverage("syson-sysml-rest-api-services", 93.0), new ModuleCoverage("syson-sysml-validation", 99.0),