Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
1 change: 1 addition & 0 deletions CHANGELOG.adoc
Original file line number Diff line number Diff line change
Expand Up @@ -83,6 +83,7 @@ Now it has been fixed in Sirius Web 2025.8.4, `SysONUpdateLibraryExecutor` has b
- https://github.com/eclipse-syson/syson/issues/1522[#1522] [diagrams] To avoid edge blinking when refreshing the diagram, we need to set the properties `measured.height` and `measured.width` with the value of the node layout data when converting a custom node accordingly to the xyflow https://reactflow.dev/learn/advanced-use/ssr-ssg-configuration#node-dimensions[documentation].
- https://github.com/eclipse-syson/syson/issues/1545[#1545] [diagrams] Add _interconnection_ compartment to `PartDefinition` nodes in the standard diagrams.
- https://github.com/eclipse-syson/syson/issues/1546[#1546] [diagrams] Fix drag and drop of a graphical node from the diagram background into a _Package_ graphical node.
- https://github.com/eclipse-syson/syson/issues/1550[#1550] [diagrams] Fix an issue where the _action flow_ compartment was not revealed when the _New Start Action_ was executed.

=== Improvements

Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -154,7 +154,7 @@ public void tearDown() {
config = @SqlConfig(transactionMode = SqlConfig.TransactionMode.ISOLATED))
@Sql(scripts = { "/scripts/cleanup.sql" }, executionPhase = Sql.ExecutionPhase.AFTER_TEST_METHOD, config = @SqlConfig(transactionMode = SqlConfig.TransactionMode.ISOLATED))
@Test
public void creatSuccesionBetweenNestedActions() {
public void createSuccesionBetweenNestedActions() {
String creationToolId = this.diagramDescriptionIdProvider.getEdgeCreationToolId(this.descriptionNameGenerator.getNodeName(SysmlPackage.eINSTANCE.getActionUsage()), "New Succession");
this.verifier.then(() -> this.edgeCreationTester.runSingleClickOnTwoDiagramElementsTool(ActionFlowCompartmentTestProjectData.EDITING_CONTEXT_ID,
this.diagram,
Expand Down Expand Up @@ -182,7 +182,7 @@ public void creatSuccesionBetweenNestedActions() {
config = @SqlConfig(transactionMode = SqlConfig.TransactionMode.ISOLATED))
@Sql(scripts = { "/scripts/cleanup.sql" }, executionPhase = Sql.ExecutionPhase.AFTER_TEST_METHOD, config = @SqlConfig(transactionMode = SqlConfig.TransactionMode.ISOLATED))
@Test
public void creatTransitionBetweenNestedActions() {
public void createTransitionBetweenNestedActions() {
String creationToolId = this.diagramDescriptionIdProvider.getEdgeCreationToolId(this.descriptionNameGenerator.getNodeName(SysmlPackage.eINSTANCE.getActionUsage()), "New Transition");
this.verifier.then(() -> this.edgeCreationTester.runSingleClickOnTwoDiagramElementsTool(ActionFlowCompartmentTestProjectData.EDITING_CONTEXT_ID,
this.diagram,
Expand Down
Original file line number Diff line number Diff line change
@@ -0,0 +1,136 @@
/*******************************************************************************
* Copyright (c) 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.application.controllers.diagrams.compartments;

import static org.assertj.core.api.Assertions.assertThat;
import static org.eclipse.sirius.components.diagrams.tests.DiagramEventPayloadConsumer.assertRefreshedDiagramThat;

import java.time.Duration;
import java.util.UUID;
import java.util.concurrent.atomic.AtomicReference;
import java.util.function.Consumer;

import org.eclipse.sirius.components.collaborative.diagrams.dto.DiagramEventInput;
import org.eclipse.sirius.components.collaborative.diagrams.dto.DiagramRefreshedEventPayload;
import org.eclipse.sirius.components.diagrams.Diagram;
import org.eclipse.sirius.components.diagrams.ViewModifier;
import org.eclipse.sirius.components.diagrams.tests.navigation.DiagramNavigator;
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.application.controllers.diagrams.testers.ToolTester;
import org.eclipse.syson.application.data.GeneralViewWithTopNodesTestProjectData;
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.SysmlPackage;
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.test.context.jdbc.Sql;
import org.springframework.test.context.jdbc.SqlConfig;
import org.springframework.transaction.annotation.Transactional;

import reactor.core.publisher.Flux;
import reactor.test.StepVerifier;

/**
* Tests the Start Action inside the General View diagram.
*
* @author arichard
*/
@Transactional
@SpringBootTest(webEnvironment = SpringBootTest.WebEnvironment.RANDOM_PORT)
public class StartActionTests extends AbstractIntegrationTests {

public static final String START_ACTION_USAGE_ID = "9a0d2905-0f9c-5bb4-af74-9780d6db1817";

@Autowired
private IGivenInitialServerState givenInitialServerState;

@Autowired
private IGivenDiagramSubscription givenDiagramSubscription;

@Autowired
private IGivenDiagramDescription givenDiagramDescription;

@Autowired
private IDiagramIdProvider diagramIdProvider;

@Autowired
private ToolTester nodeCreationTester;

private final IDescriptionNameGenerator descriptionNameGenerator = new SDVDescriptionNameGenerator();

private Flux<DiagramRefreshedEventPayload> givenSubscriptionToDiagram() {
var diagramEventInput = new DiagramEventInput(UUID.randomUUID(),
GeneralViewWithTopNodesTestProjectData.EDITING_CONTEXT_ID,
GeneralViewWithTopNodesTestProjectData.GraphicalIds.DIAGRAM_ID);
var flux = this.givenDiagramSubscription.subscribe(diagramEventInput);
return flux;
}

@BeforeEach
public void beforeEach() {
this.givenInitialServerState.initialize();
}

@DisplayName("GIVEN an ActionUsage action1, WHEN using the 'New Start Action' tool is executed on action1, THEN the action flow compartment of action1 is revealed.")
@Sql(scripts = { GeneralViewWithTopNodesTestProjectData.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))
@Test
public void addStartNode() {
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 toolId = diagramDescriptionIdProvider.getNodeCreationToolId(this.descriptionNameGenerator.getNodeName(SysmlPackage.eINSTANCE.getActionUsage()),
"New Start Action");
assertThat(toolId).as("The tool 'New Start Action' should exist on ActionUsage").isNotNull();

var diagram = new AtomicReference<Diagram>();

Consumer<Object> initialDiagramContentConsumer = assertRefreshedDiagramThat(diag -> {
diagram.set(diag);
var actionFlowCompartmentNode = new DiagramNavigator(diag).nodeWithLabel("\u00ABref action\u00BB\naction").childNodeWithLabel("action flow").getNode();
assertThat(actionFlowCompartmentNode.getState()).isEqualTo(ViewModifier.Hidden);
});

Runnable invokeTool = () -> {
this.nodeCreationTester.invokeTool(GeneralViewWithTopNodesTestProjectData.EDITING_CONTEXT_ID, diagram, "action", toolId);
};

Consumer<Object> updatedDiagramConsumer = assertRefreshedDiagramThat(diag -> {
var actionFlowCompartmentNode = new DiagramNavigator(diag).nodeWithLabel("\u00ABref action\u00BB\naction").childNodeWithLabel("action flow").getNode();
assertThat(actionFlowCompartmentNode.getState()).isEqualTo(ViewModifier.Normal);
var startNode = new DiagramNavigator(diag).nodeWithLabel("\u00ABref action\u00BB\naction").childNodeWithLabel("action flow").childNodeWithTargetObjectId(START_ACTION_USAGE_ID).getNode();
assertThat(startNode).isNotNull();

});

StepVerifier.create(flux)
.consumeNextWith(initialDiagramContentConsumer)
.then(invokeTool)
.consumeNextWith(updatedDiagramConsumer)
.thenCancel()
.verify(Duration.ofSeconds(100));
}
}
Original file line number Diff line number Diff line change
Expand Up @@ -18,7 +18,7 @@
import java.util.Objects;
import java.util.stream.Stream;

import org.eclipse.sirius.components.collaborative.diagrams.api.IDiagramContext;
import org.eclipse.sirius.components.collaborative.diagrams.DiagramContext;
import org.eclipse.sirius.components.core.api.IEditingContext;
import org.eclipse.sirius.components.core.api.IObjectSearchService;
import org.eclipse.sirius.components.diagrams.description.NodeDescription;
Expand Down Expand Up @@ -60,7 +60,7 @@ public NodeDescriptionService(IObjectSearchService objectSearchService) {
* @return the child descriptions of {@code nodeDescriptions} that can render {@code element}
*/
public List<NodeDescription> getChildNodeDescriptionsForRendering(Element element, Object ownerObject, List<NodeDescription> nodeDescriptions,
Map<org.eclipse.sirius.components.view.diagram.NodeDescription, NodeDescription> convertedNodes, IEditingContext editingContext, IDiagramContext diagramContext) {
Map<org.eclipse.sirius.components.view.diagram.NodeDescription, NodeDescription> convertedNodes, IEditingContext editingContext, DiagramContext diagramContext) {
List<NodeDescription> candidates = new ArrayList<>();
for (NodeDescription node : nodeDescriptions) {
List<NodeDescription> allChildren = new ArrayList<>();
Expand Down Expand Up @@ -97,7 +97,7 @@ public List<NodeDescription> getChildNodeDescriptionsForRendering(Element elemen
* @return the list of node descriptions that can be used to render the given semantic element.
*/
public List<NodeDescription> getNodeDescriptionsForRenderingElementAsChild(Element element, Object ownerObject, List<NodeDescription> nodeDescriptions,
Map<org.eclipse.sirius.components.view.diagram.NodeDescription, NodeDescription> convertedNodes, IEditingContext editingContext, IDiagramContext diagramContext) {
Map<org.eclipse.sirius.components.view.diagram.NodeDescription, NodeDescription> convertedNodes, IEditingContext editingContext, DiagramContext diagramContext) {
List<NodeDescription> candidates = new ArrayList<>();
for (NodeDescription node : nodeDescriptions) {
List<NodeDescription> allChildNodeDescriptions = Stream.concat(
Expand Down Expand Up @@ -130,14 +130,14 @@ public List<NodeDescription> getNodeDescriptionsForRenderingElementAsChild(Eleme
* @return <code>true</code> if the given node description can be used to render the given semantic element and
* <code>false</code> otherwise.
*/
public boolean canNodeDescriptionRenderElement(NodeDescription nodeDescription, Element element, Object ownerObject, IEditingContext editingContext, IDiagramContext diagramContext) {
public boolean canNodeDescriptionRenderElement(NodeDescription nodeDescription, Element element, Object ownerObject, IEditingContext editingContext, DiagramContext diagramContext) {
boolean canNodeDescriptionRenderElement = false;
VariableManager semanticElementsProviderVariableManager = new VariableManager();
semanticElementsProviderVariableManager.put(VariableManager.SELF, ownerObject);
semanticElementsProviderVariableManager.put(IEditingContext.EDITING_CONTEXT, editingContext);
semanticElementsProviderVariableManager.put(IDiagramContext.DIAGRAM_CONTEXT, diagramContext);
semanticElementsProviderVariableManager.put(DiagramContext.DIAGRAM_CONTEXT, diagramContext);
var ancestors = new ArrayList<>();
this.objectSearchService.getObject(editingContext, diagramContext.getDiagram().getTargetObjectId())
this.objectSearchService.getObject(editingContext, diagramContext.diagram().getTargetObjectId())
.filter(ViewUsage.class::isInstance)
.map(ViewUsage.class::cast)
.ifPresent(ancestors::add);
Expand All @@ -149,7 +149,7 @@ public boolean canNodeDescriptionRenderElement(NodeDescription nodeDescription,
VariableManager shouldRenderPredicateVariableManager = new VariableManager();
shouldRenderPredicateVariableManager.put(VariableManager.SELF, element);
shouldRenderPredicateVariableManager.put(IEditingContext.EDITING_CONTEXT, editingContext);
shouldRenderPredicateVariableManager.put(IDiagramContext.DIAGRAM_CONTEXT, diagramContext);
shouldRenderPredicateVariableManager.put(DiagramContext.DIAGRAM_CONTEXT, diagramContext);
shouldRenderPredicateVariableManager.put(NodeDescription.ANCESTORS, null);
canNodeDescriptionRenderElement = nodeDescription.getShouldRenderPredicate().test(shouldRenderPredicateVariableManager);
}
Expand Down
Loading
Loading