Skip to content
Open
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
2 changes: 2 additions & 0 deletions CHANGELOG.adoc
Original file line number Diff line number Diff line change
Expand Up @@ -29,6 +29,8 @@
- https://github.com/eclipse-syson/syson/issues/2116[#2116] [explorer] In the _Explorer_ view, the items corresponding to the internals of `Expression` elements (syntax tree) are now hidden by default.
Disabling the _Hide expression internals_ filter in the _Explorer_ view allows to display them if needed.
- https://github.com/eclipse-syson/syson/issues/2112[#2112] [diagrams] Add tools to create _Start_ and _Done_ `StateUsages`, available on `StateUsage` and `StateDefinition` graphical nodes.
- https://github.com/eclipse-syson/syson/issues/2231[#2231] [diagrams] Add a new tools to create a _frame_ `ConcernUsage` from `RequirementUsage` and `RequirementDefinition` graphical nodes.
- https://github.com/eclipse-syson/syson/issues/2231[#2231] [diagrams] Add the support for the _frames_ compartment graphical node in `RequirementUsage` and `RequirementDefinition` graphical nodes.

== v2026.5.0

Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -147,6 +147,7 @@ public void addExistingElementsOnDiagram() {
.verify(Duration.ofSeconds(10));
}

@DisplayName("GIVEN a GV diagram, WHEN adding existing element recursively, THEN expected nodes should have been added to the diagram")
@GivenSysONServer({ GeneralViewAddExistingElementsTestProjectData.SCRIPT_PATH })
@Test
public void addExistingElementsRecursiveOnDiagram() {
Expand Down Expand Up @@ -450,7 +451,7 @@ private void checkRequirementUsage(Diagram newDiagram) {

assertThat(optRequirementNode).isPresent();
assertThat(optRequirementNode.get().getChildNodes())
.as("Node RequirementUsage should contain 8 hidden compartment children").hasSize(8)
.as("Node RequirementUsage should contain 9 hidden compartment children").hasSize(9)
.allMatch(node -> node.getModifiers().contains(ViewModifier.Hidden));
}

Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -237,12 +237,12 @@ public void dropFromExplorerShortNameOnlyOnEmptyDiagram() {
new CheckDiagramElementCount(this.diagramComparator)
.hasNewEdgeCount(0)
// 1 node for the Requirement and 8 for its compartments and one for the documentation
.hasNewNodeCount(10)
.hasNewNodeCount(11)
.check(diagram.get(), newDiagram);
new CheckNodeOnDiagram(diagramDescriptionIdProvider, this.diagramComparator)
.hasNodeDescriptionName(this.descriptionNameGenerator.getNodeName(SysmlPackage.eINSTANCE.getRequirementUsage()))
.hasTargetObjectLabel("RequirementUsage")
.hasTotalCompartmentCount(8)
.hasTotalCompartmentCount(9)
.check(diagram.get(), newDiagram);
});

Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -130,7 +130,7 @@ private void createFramedConcernWithEdge(EClass parentEClass, String graphicalSo

var edgeCreationToolId = diagramDescriptionIdProvider.getEdgeCreationToolId(
this.descriptionNameGenerator.getNodeName(parentEClass),
"New framed Concern");
"New Framed Concern");

AtomicReference<Diagram> diagram = new AtomicReference<>();
Consumer<Object> initialDiagramContentConsumer = assertRefreshedDiagramThat(diagram::set);
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -123,7 +123,7 @@ private static Stream<Arguments> concernUsageSiblingNodeParameters() {
return Stream.of(
Arguments.of(SysmlPackage.eINSTANCE.getItemUsage(), SysmlPackage.eINSTANCE.getUsage_NestedItem(), 4),
Arguments.of(SysmlPackage.eINSTANCE.getPartUsage(), SysmlPackage.eINSTANCE.getUsage_NestedPart(), 11),
Arguments.of(SysmlPackage.eINSTANCE.getRequirementUsage(), SysmlPackage.eINSTANCE.getUsage_NestedRequirement(), 8))
Arguments.of(SysmlPackage.eINSTANCE.getRequirementUsage(), SysmlPackage.eINSTANCE.getUsage_NestedRequirement(), 9))
.map(TestNameGenerator::namedArguments);
}

Expand Down Expand Up @@ -156,7 +156,7 @@ private static Stream<Arguments> concernDefinitionChildNodeParameters() {

private static Stream<Arguments> concernDefinitionSiblingAndChildNodeParameters() {
return Stream.of(
Arguments.of(SysmlPackage.eINSTANCE.getRequirementUsage(), "requirements", SysmlPackage.eINSTANCE.getDefinition_OwnedRequirement(), null, 10, 1),
Arguments.of(SysmlPackage.eINSTANCE.getRequirementUsage(), "requirements", SysmlPackage.eINSTANCE.getDefinition_OwnedRequirement(), null, 11, 1),
Arguments.of(SysmlPackage.eINSTANCE.getConstraintUsage(), "assume constraints", SysmlPackage.eINSTANCE.getRequirementDefinition_AssumedConstraint(), "New Assume constraint", 6, 1),
Arguments.of(SysmlPackage.eINSTANCE.getConstraintUsage(), "require constraints", SysmlPackage.eINSTANCE.getRequirementDefinition_RequiredConstraint(), "New Require constraint", 6, 1))
.map(TestNameGenerator::namedArguments);
Expand Down Expand Up @@ -210,7 +210,7 @@ private static Stream<Arguments> requirementUsageSiblingNodeParameters() {
return Stream.of(
Arguments.of(SysmlPackage.eINSTANCE.getItemUsage(), SysmlPackage.eINSTANCE.getUsage_NestedItem(), 4),
Arguments.of(SysmlPackage.eINSTANCE.getPartUsage(), SysmlPackage.eINSTANCE.getUsage_NestedPart(), 11),
Arguments.of(SysmlPackage.eINSTANCE.getRequirementUsage(), SysmlPackage.eINSTANCE.getUsage_NestedRequirement(), 8))
Arguments.of(SysmlPackage.eINSTANCE.getRequirementUsage(), SysmlPackage.eINSTANCE.getUsage_NestedRequirement(), 9))
.map(TestNameGenerator::namedArguments);
}

Expand Down Expand Up @@ -797,6 +797,34 @@ public void createRequirementUsageSiblingNodes(EClass childEClass, EReference co
Consumer<Object> diagramCheck = this.diagramCheckerService.siblingNodeGraphicalChecker(diagram, diagramDescriptionIdProvider, childEClass, compartmentCount);
Runnable semanticCheck = this.semanticCheckerService.checkEditingContext(this.semanticCheckerService.getElementInParentSemanticChecker("requirement", containmentReference, childEClass));

StepVerifier.create(flux)
.consumeNextWith(initialDiagramContentConsumer)
.then(createNodeRunnable)
.consumeNextWith(diagramCheck)
.then(semanticCheck)
.thenCancel()
.verify(Duration.ofMinutes(10));
}

@DisplayName("GIVEN a Requirement Usage, WHEN creating a new Framed concern, THEN a new Framed concern is created")
@GivenSysONServer({ GeneralViewWithTopNodesTestProjectData.SCRIPT_PATH })
@Test
public void createRequirementUsageFramedConcern() {
var flux = this.givenSubscriptionToDiagram();

AtomicReference<Diagram> diagram = new AtomicReference<>();
Consumer<Object> 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);

EClass parentEClass = SysmlPackage.eINSTANCE.getRequirementUsage();
String targetObjectId = GeneralViewWithTopNodesTestProjectData.SemanticIds.REQUIREMENT_USAGE_ID;
Runnable createNodeRunnable = this.creationTestsService.createNode(diagramDescriptionIdProvider, diagram, parentEClass, targetObjectId, "New Framed concern");
Consumer<Object> diagramCheck = this.diagramCheckerService.siblingNodeGraphicalChecker(diagram, diagramDescriptionIdProvider, SysmlPackage.eINSTANCE.getConcernUsage(), 8, 2);
Runnable semanticCheck = this.semanticCheckerService.checkEditingContext(this.semanticCheckerService.getElementInParentSemanticChecker("requirement", SysmlPackage.eINSTANCE.getRequirementUsage_FramedConcern(), SysmlPackage.eINSTANCE.getConcernUsage()));

StepVerifier.create(flux)
.consumeNextWith(initialDiagramContentConsumer)
.then(createNodeRunnable)
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -221,8 +221,8 @@ private static Stream<Arguments> packageChildNodeParameters() {
Arguments.of(SysmlPackage.eINSTANCE.getPartUsage(), ownedMember, 11, 0, 0),
Arguments.of(SysmlPackage.eINSTANCE.getPortDefinition(), ownedMember, 5, 0, 0),
Arguments.of(SysmlPackage.eINSTANCE.getPortUsage(), ownedMember, 5, 0, 0),
Arguments.of(SysmlPackage.eINSTANCE.getRequirementDefinition(), ownedMember, 8, 0, 0),
Arguments.of(SysmlPackage.eINSTANCE.getRequirementUsage(), ownedMember, 8, 0, 0),
Arguments.of(SysmlPackage.eINSTANCE.getRequirementDefinition(), ownedMember, 9, 0, 0),
Arguments.of(SysmlPackage.eINSTANCE.getRequirementUsage(), ownedMember, 9, 0, 0),
Arguments.of(SysmlPackage.eINSTANCE.getUseCaseDefinition(), ownedMember, 5, 0, 0),
Arguments.of(SysmlPackage.eINSTANCE.getUseCaseUsage(), ownedMember, 7, 0, 0),
Arguments.of(SysmlPackage.eINSTANCE.getSatisfyRequirementUsage(), ownedMember, 8, 0, 0),
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -177,8 +177,8 @@ private static Stream<Arguments> topNodeParameters() {
Arguments.of(SysmlPackage.eINSTANCE.getPortDefinition(), 5, 0, 0, 0, ViewConstants.DEFAULT_DEFINITION_NODE_HEIGHT, ViewConstants.DEFAULT_DEFINITION_NODE_WIDTH, false),
Arguments.of(SysmlPackage.eINSTANCE.getPortUsage(), 5, 0, 0, 0, ViewConstants.DEFAULT_USAGE_NODE_HEIGHT, ViewConstants.DEFAULT_USAGE_NODE_WIDTH, false),
Arguments.of(SysmlPackage.eINSTANCE.getReferenceUsage(), 0, 0, 0, 0, ViewConstants.DEFAULT_USAGE_NODE_HEIGHT, ViewConstants.DEFAULT_USAGE_NODE_WIDTH, false),
Arguments.of(SysmlPackage.eINSTANCE.getRequirementDefinition(), 8, 0, 0, 0, ViewConstants.DEFAULT_DEFINITION_NODE_HEIGHT, ViewConstants.DEFAULT_DEFINITION_NODE_WIDTH, false),
Arguments.of(SysmlPackage.eINSTANCE.getRequirementUsage(), 8, 0, 0, 0, ViewConstants.DEFAULT_USAGE_NODE_HEIGHT, ViewConstants.DEFAULT_USAGE_NODE_WIDTH, false),
Arguments.of(SysmlPackage.eINSTANCE.getRequirementDefinition(), 9, 0, 0, 0, ViewConstants.DEFAULT_DEFINITION_NODE_HEIGHT, ViewConstants.DEFAULT_DEFINITION_NODE_WIDTH, false),
Arguments.of(SysmlPackage.eINSTANCE.getRequirementUsage(), 9, 0, 0, 0, ViewConstants.DEFAULT_USAGE_NODE_HEIGHT, ViewConstants.DEFAULT_USAGE_NODE_WIDTH, false),
Arguments.of(SysmlPackage.eINSTANCE.getUseCaseDefinition(), 5, 0, 0, 0, ViewConstants.DEFAULT_DEFINITION_NODE_HEIGHT, ViewConstants.DEFAULT_DEFINITION_NODE_WIDTH, false),
Arguments.of(SysmlPackage.eINSTANCE.getUseCaseUsage(), 7, 0, 0, 0, ViewConstants.DEFAULT_USAGE_NODE_HEIGHT, ViewConstants.DEFAULT_USAGE_NODE_WIDTH, false),
Arguments.of(SysmlPackage.eINSTANCE.getSatisfyRequirementUsage(), 8, 0, 0, 0, ViewConstants.DEFAULT_USAGE_NODE_HEIGHT, ViewConstants.DEFAULT_USAGE_NODE_WIDTH, false),
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -156,8 +156,8 @@ private static Stream<Arguments> childNodeParameters() {
Arguments.of(SysmlPackage.eINSTANCE.getPartUsage(), 11, 0, 0, false),
Arguments.of(SysmlPackage.eINSTANCE.getPortDefinition(), 5, 0, 0, false),
Arguments.of(SysmlPackage.eINSTANCE.getPortUsage(), 5, 0, 0, false),
Arguments.of(SysmlPackage.eINSTANCE.getRequirementDefinition(), 8, 0, 0, false),
Arguments.of(SysmlPackage.eINSTANCE.getRequirementUsage(), 8, 0, 0, false),
Arguments.of(SysmlPackage.eINSTANCE.getRequirementDefinition(), 9, 0, 0, false),
Arguments.of(SysmlPackage.eINSTANCE.getRequirementUsage(), 9, 0, 0, false),
Arguments.of(SysmlPackage.eINSTANCE.getUseCaseDefinition(), 5, 0, 0, false),
Arguments.of(SysmlPackage.eINSTANCE.getUseCaseUsage(), 7, 0, 0, false),
Arguments.of(SysmlPackage.eINSTANCE.getSatisfyRequirementUsage(), 8, 0, 0, false),
Expand Down
Original file line number Diff line number Diff line change
@@ -0,0 +1,54 @@
/*******************************************************************************
* 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.common.view.nodes;

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.IDescriptionNameGenerator;
import org.eclipse.syson.util.SysMLMetamodelHelper;

/**
* Used to create a {@link org.eclipse.syson.sysml.ConcernUsage} compartment item node description.
* <p>
* {@link org.eclipse.syson.sysml.ConcernUsage} compartment items have to be contained in a {@link org.eclipse.syson.sysml.FramedConcernMembership}.
* </p>
* @author gcoutable
*/
public class FramedConcernCompartmentItemNodeDescription extends CompartmentItemNodeDescriptionProvider {

public static final String COMPARTMENT_ITEM_NAME = " frame Concern";

public FramedConcernCompartmentItemNodeDescription(EClass eClass, EReference eReference, IColorProvider colorProvider, IDescriptionNameGenerator descriptionNameGenerator) {
super(eClass, eReference, colorProvider, descriptionNameGenerator);
}

@Override
public NodeDescription create() {
NodeDescription nodeDescription = super.create();
nodeDescription.setPreconditionExpression("true");
return nodeDescription;
}

@Override
protected String getDomainType() {
return SysMLMetamodelHelper.buildQualifiedName(SysmlPackage.eINSTANCE.getElement());
}

@Override
protected String getName() {
return super.getName() + COMPARTMENT_ITEM_NAME;
}
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,61 @@
/*******************************************************************************
* 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.common.view.nodes;

import java.util.List;

import org.eclipse.emf.ecore.EClass;
import org.eclipse.emf.ecore.EReference;
import org.eclipse.sirius.components.view.builder.IViewDiagramElementFinder;
import org.eclipse.sirius.components.view.builder.providers.IColorProvider;
import org.eclipse.sirius.components.view.diagram.DiagramDescription;
import org.eclipse.sirius.components.view.diagram.NodeDescription;
import org.eclipse.syson.util.IDescriptionNameGenerator;

/**
* Compartment node allowing to display {@link org.eclipse.syson.sysml.ConcernUsage} owned by a {@link org.eclipse.syson.sysml.FramedConcernMembership}.
*
* @author gcoutable
*/
public class FramedConcernCompartmentNodeDescription extends AbstractCompartmentNodeDescriptionProvider {

public static final String COMPARTMENT_NAME = " frames";

public FramedConcernCompartmentNodeDescription(EClass eClass, EReference eReference, IColorProvider colorProvider, IDescriptionNameGenerator descriptionNameGenerator) {
super(eClass, eReference, colorProvider, descriptionNameGenerator);
}

@Override
protected String getCompartmentName() {
return this.getDescriptionNameGenerator().getCompartmentName(this.eClass, this.eReference) + COMPARTMENT_NAME;
}

@Override
protected String getCustomCompartmentLabel() {
return "frames";
}

@Override
public void link(DiagramDescription diagramDescription, IViewDiagramElementFinder cache) {
cache.getNodeDescription(this.getDescriptionNameGenerator().getCompartmentName(this.eClass, this.eReference) + COMPARTMENT_NAME).ifPresent(nodeDescription -> {
cache.getNodeDescription(this.getDescriptionNameGenerator().getCompartmentItemName(this.eClass, this.eReference) + FramedConcernCompartmentItemNodeDescription.COMPARTMENT_ITEM_NAME)
.ifPresent(itemNodeDescription -> nodeDescription.getChildrenDescriptions().add(itemNodeDescription));
nodeDescription.setPalette(this.createCompartmentPalette(cache));
});
}

@Override
protected List<NodeDescription> getDroppableNodes(IViewDiagramElementFinder cache) {
return List.of();
}
}
Original file line number Diff line number Diff line change
Expand Up @@ -213,6 +213,8 @@ private Membership createAppropriateMembership(EStructuralFeature feature) {
((RequirementConstraintMembership) result).setKind(RequirementConstraintKind.REQUIREMENT);
} else if (feature.equals(SysmlPackage.eINSTANCE.getElement_Documentation())) {
result = SysmlFactory.eINSTANCE.createOwningMembership();
} else if (feature.equals(SysmlPackage.eINSTANCE.getRequirementUsage_FramedConcern()) || feature.equals(SysmlPackage.eINSTANCE.getRequirementDefinition_FramedConcern())) {
result = SysmlFactory.eINSTANCE.createFramedConcernMembership();
}
return result;
}
Expand Down
Original file line number Diff line number Diff line change
@@ -1,5 +1,5 @@
/*******************************************************************************
* Copyright (c) 2024, 2025 Obeo.
* Copyright (c) 2024, 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
Expand Down Expand Up @@ -42,6 +42,9 @@ public String getCreationToolName(EReference eReference) {
} else if (SysmlPackage.eINSTANCE.getRequirementUsage_RequiredConstraint().equals(eReference)
|| SysmlPackage.eINSTANCE.getRequirementDefinition_RequiredConstraint().equals(eReference)) {
name = "New Require constraint";
} else if (SysmlPackage.eINSTANCE.getRequirementUsage_FramedConcern().equals(eReference)
|| SysmlPackage.eINSTANCE.getRequirementDefinition_FramedConcern().equals(eReference)) {
name = "New Framed concern";
}
return name;
}
Expand Down
Loading
Loading