Skip to content

Commit 945ab31

Browse files
gcoutableAxelRICHARD
authored andcommitted
[2231] Add the support for frames compartments
Bug: #2231 Signed-off-by: Guillaume Coutable <guillaume.coutable@obeo.fr>
1 parent 20b42ca commit 945ab31

14 files changed

Lines changed: 220 additions & 27 deletions

File tree

CHANGELOG.adoc

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -30,6 +30,7 @@
3030
Disabling the _Hide expression internals_ filter in the _Explorer_ view allows to display them if needed.
3131
- 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.
3232
- 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.
33+
- 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.
3334

3435
== v2026.5.0
3536

backend/application/syson-application/src/test/java/org/eclipse/syson/application/controllers/diagrams/general/view/GVAddExistingElementsTests.java

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -147,6 +147,7 @@ public void addExistingElementsOnDiagram() {
147147
.verify(Duration.ofSeconds(10));
148148
}
149149

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

451452
assertThat(optRequirementNode).isPresent();
452453
assertThat(optRequirementNode.get().getChildNodes())
453-
.as("Node RequirementUsage should contain 8 hidden compartment children").hasSize(8)
454+
.as("Node RequirementUsage should contain 9 hidden compartment children").hasSize(9)
454455
.allMatch(node -> node.getModifiers().contains(ViewModifier.Hidden));
455456
}
456457

backend/application/syson-application/src/test/java/org/eclipse/syson/application/controllers/diagrams/general/view/GVDropFromExplorerTests.java

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -237,12 +237,12 @@ public void dropFromExplorerShortNameOnlyOnEmptyDiagram() {
237237
new CheckDiagramElementCount(this.diagramComparator)
238238
.hasNewEdgeCount(0)
239239
// 1 node for the Requirement and 8 for its compartments and one for the documentation
240-
.hasNewNodeCount(10)
240+
.hasNewNodeCount(11)
241241
.check(diagram.get(), newDiagram);
242242
new CheckNodeOnDiagram(diagramDescriptionIdProvider, this.diagramComparator)
243243
.hasNodeDescriptionName(this.descriptionNameGenerator.getNodeName(SysmlPackage.eINSTANCE.getRequirementUsage()))
244244
.hasTargetObjectLabel("RequirementUsage")
245-
.hasTotalCompartmentCount(8)
245+
.hasTotalCompartmentCount(9)
246246
.check(diagram.get(), newDiagram);
247247
});
248248

backend/application/syson-application/src/test/java/org/eclipse/syson/application/controllers/diagrams/general/view/GVSubNodeRequirementCreationTests.java

Lines changed: 31 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -123,7 +123,7 @@ private static Stream<Arguments> concernUsageSiblingNodeParameters() {
123123
return Stream.of(
124124
Arguments.of(SysmlPackage.eINSTANCE.getItemUsage(), SysmlPackage.eINSTANCE.getUsage_NestedItem(), 4),
125125
Arguments.of(SysmlPackage.eINSTANCE.getPartUsage(), SysmlPackage.eINSTANCE.getUsage_NestedPart(), 11),
126-
Arguments.of(SysmlPackage.eINSTANCE.getRequirementUsage(), SysmlPackage.eINSTANCE.getUsage_NestedRequirement(), 8))
126+
Arguments.of(SysmlPackage.eINSTANCE.getRequirementUsage(), SysmlPackage.eINSTANCE.getUsage_NestedRequirement(), 9))
127127
.map(TestNameGenerator::namedArguments);
128128
}
129129

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

157157
private static Stream<Arguments> concernDefinitionSiblingAndChildNodeParameters() {
158158
return Stream.of(
159-
Arguments.of(SysmlPackage.eINSTANCE.getRequirementUsage(), "requirements", SysmlPackage.eINSTANCE.getDefinition_OwnedRequirement(), null, 10, 1),
159+
Arguments.of(SysmlPackage.eINSTANCE.getRequirementUsage(), "requirements", SysmlPackage.eINSTANCE.getDefinition_OwnedRequirement(), null, 11, 1),
160160
Arguments.of(SysmlPackage.eINSTANCE.getConstraintUsage(), "assume constraints", SysmlPackage.eINSTANCE.getRequirementDefinition_AssumedConstraint(), "New Assume constraint", 6, 1),
161161
Arguments.of(SysmlPackage.eINSTANCE.getConstraintUsage(), "require constraints", SysmlPackage.eINSTANCE.getRequirementDefinition_RequiredConstraint(), "New Require constraint", 6, 1))
162162
.map(TestNameGenerator::namedArguments);
@@ -210,7 +210,7 @@ private static Stream<Arguments> requirementUsageSiblingNodeParameters() {
210210
return Stream.of(
211211
Arguments.of(SysmlPackage.eINSTANCE.getItemUsage(), SysmlPackage.eINSTANCE.getUsage_NestedItem(), 4),
212212
Arguments.of(SysmlPackage.eINSTANCE.getPartUsage(), SysmlPackage.eINSTANCE.getUsage_NestedPart(), 11),
213-
Arguments.of(SysmlPackage.eINSTANCE.getRequirementUsage(), SysmlPackage.eINSTANCE.getUsage_NestedRequirement(), 8))
213+
Arguments.of(SysmlPackage.eINSTANCE.getRequirementUsage(), SysmlPackage.eINSTANCE.getUsage_NestedRequirement(), 9))
214214
.map(TestNameGenerator::namedArguments);
215215
}
216216

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

800+
StepVerifier.create(flux)
801+
.consumeNextWith(initialDiagramContentConsumer)
802+
.then(createNodeRunnable)
803+
.consumeNextWith(diagramCheck)
804+
.then(semanticCheck)
805+
.thenCancel()
806+
.verify(Duration.ofMinutes(10));
807+
}
808+
809+
@DisplayName("GIVEN a Requirement Usage, WHEN creating a new Framed concern, THEN a new Framed concern is created")
810+
@GivenSysONServer({ GeneralViewWithTopNodesTestProjectData.SCRIPT_PATH })
811+
@Test
812+
public void createRequirementUsageFramedConcern() {
813+
var flux = this.givenSubscriptionToDiagram();
814+
815+
AtomicReference<Diagram> diagram = new AtomicReference<>();
816+
Consumer<Object> initialDiagramContentConsumer = assertRefreshedDiagramThat(diagram::set);
817+
818+
var diagramDescription = this.givenDiagramDescription.getDiagramDescription(GeneralViewWithTopNodesTestProjectData.EDITING_CONTEXT_ID,
819+
SysONRepresentationDescriptionIdentifiers.GENERAL_VIEW_DIAGRAM_DESCRIPTION_ID);
820+
var diagramDescriptionIdProvider = new DiagramDescriptionIdProvider(diagramDescription, this.diagramIdProvider);
821+
822+
EClass parentEClass = SysmlPackage.eINSTANCE.getRequirementUsage();
823+
String targetObjectId = GeneralViewWithTopNodesTestProjectData.SemanticIds.REQUIREMENT_USAGE_ID;
824+
Runnable createNodeRunnable = this.creationTestsService.createNode(diagramDescriptionIdProvider, diagram, parentEClass, targetObjectId, "New Framed concern");
825+
Consumer<Object> diagramCheck = this.diagramCheckerService.siblingNodeGraphicalChecker(diagram, diagramDescriptionIdProvider, SysmlPackage.eINSTANCE.getConcernUsage(), 8, 2);
826+
Runnable semanticCheck = this.semanticCheckerService.checkEditingContext(this.semanticCheckerService.getElementInParentSemanticChecker("requirement", SysmlPackage.eINSTANCE.getRequirementUsage_FramedConcern(), SysmlPackage.eINSTANCE.getConcernUsage()));
827+
800828
StepVerifier.create(flux)
801829
.consumeNextWith(initialDiagramContentConsumer)
802830
.then(createNodeRunnable)

backend/application/syson-application/src/test/java/org/eclipse/syson/application/controllers/diagrams/general/view/GVSubNodeStructureCreationTests.java

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -221,8 +221,8 @@ private static Stream<Arguments> packageChildNodeParameters() {
221221
Arguments.of(SysmlPackage.eINSTANCE.getPartUsage(), ownedMember, 11, 0, 0),
222222
Arguments.of(SysmlPackage.eINSTANCE.getPortDefinition(), ownedMember, 5, 0, 0),
223223
Arguments.of(SysmlPackage.eINSTANCE.getPortUsage(), ownedMember, 5, 0, 0),
224-
Arguments.of(SysmlPackage.eINSTANCE.getRequirementDefinition(), ownedMember, 8, 0, 0),
225-
Arguments.of(SysmlPackage.eINSTANCE.getRequirementUsage(), ownedMember, 8, 0, 0),
224+
Arguments.of(SysmlPackage.eINSTANCE.getRequirementDefinition(), ownedMember, 9, 0, 0),
225+
Arguments.of(SysmlPackage.eINSTANCE.getRequirementUsage(), ownedMember, 9, 0, 0),
226226
Arguments.of(SysmlPackage.eINSTANCE.getUseCaseDefinition(), ownedMember, 5, 0, 0),
227227
Arguments.of(SysmlPackage.eINSTANCE.getUseCaseUsage(), ownedMember, 7, 0, 0),
228228
Arguments.of(SysmlPackage.eINSTANCE.getSatisfyRequirementUsage(), ownedMember, 8, 0, 0),

backend/application/syson-application/src/test/java/org/eclipse/syson/application/controllers/diagrams/general/view/GVTopNodeCreationTests.java

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -177,8 +177,8 @@ private static Stream<Arguments> topNodeParameters() {
177177
Arguments.of(SysmlPackage.eINSTANCE.getPortDefinition(), 5, 0, 0, 0, ViewConstants.DEFAULT_DEFINITION_NODE_HEIGHT, ViewConstants.DEFAULT_DEFINITION_NODE_WIDTH, false),
178178
Arguments.of(SysmlPackage.eINSTANCE.getPortUsage(), 5, 0, 0, 0, ViewConstants.DEFAULT_USAGE_NODE_HEIGHT, ViewConstants.DEFAULT_USAGE_NODE_WIDTH, false),
179179
Arguments.of(SysmlPackage.eINSTANCE.getReferenceUsage(), 0, 0, 0, 0, ViewConstants.DEFAULT_USAGE_NODE_HEIGHT, ViewConstants.DEFAULT_USAGE_NODE_WIDTH, false),
180-
Arguments.of(SysmlPackage.eINSTANCE.getRequirementDefinition(), 8, 0, 0, 0, ViewConstants.DEFAULT_DEFINITION_NODE_HEIGHT, ViewConstants.DEFAULT_DEFINITION_NODE_WIDTH, false),
181-
Arguments.of(SysmlPackage.eINSTANCE.getRequirementUsage(), 8, 0, 0, 0, ViewConstants.DEFAULT_USAGE_NODE_HEIGHT, ViewConstants.DEFAULT_USAGE_NODE_WIDTH, false),
180+
Arguments.of(SysmlPackage.eINSTANCE.getRequirementDefinition(), 9, 0, 0, 0, ViewConstants.DEFAULT_DEFINITION_NODE_HEIGHT, ViewConstants.DEFAULT_DEFINITION_NODE_WIDTH, false),
181+
Arguments.of(SysmlPackage.eINSTANCE.getRequirementUsage(), 9, 0, 0, 0, ViewConstants.DEFAULT_USAGE_NODE_HEIGHT, ViewConstants.DEFAULT_USAGE_NODE_WIDTH, false),
182182
Arguments.of(SysmlPackage.eINSTANCE.getUseCaseDefinition(), 5, 0, 0, 0, ViewConstants.DEFAULT_DEFINITION_NODE_HEIGHT, ViewConstants.DEFAULT_DEFINITION_NODE_WIDTH, false),
183183
Arguments.of(SysmlPackage.eINSTANCE.getUseCaseUsage(), 7, 0, 0, 0, ViewConstants.DEFAULT_USAGE_NODE_HEIGHT, ViewConstants.DEFAULT_USAGE_NODE_WIDTH, false),
184184
Arguments.of(SysmlPackage.eINSTANCE.getSatisfyRequirementUsage(), 8, 0, 0, 0, ViewConstants.DEFAULT_USAGE_NODE_HEIGHT, ViewConstants.DEFAULT_USAGE_NODE_WIDTH, false),

backend/application/syson-application/src/test/java/org/eclipse/syson/application/controllers/diagrams/general/view/GVViewUsageTests.java

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -156,8 +156,8 @@ private static Stream<Arguments> childNodeParameters() {
156156
Arguments.of(SysmlPackage.eINSTANCE.getPartUsage(), 11, 0, 0, false),
157157
Arguments.of(SysmlPackage.eINSTANCE.getPortDefinition(), 5, 0, 0, false),
158158
Arguments.of(SysmlPackage.eINSTANCE.getPortUsage(), 5, 0, 0, false),
159-
Arguments.of(SysmlPackage.eINSTANCE.getRequirementDefinition(), 8, 0, 0, false),
160-
Arguments.of(SysmlPackage.eINSTANCE.getRequirementUsage(), 8, 0, 0, false),
159+
Arguments.of(SysmlPackage.eINSTANCE.getRequirementDefinition(), 9, 0, 0, false),
160+
Arguments.of(SysmlPackage.eINSTANCE.getRequirementUsage(), 9, 0, 0, false),
161161
Arguments.of(SysmlPackage.eINSTANCE.getUseCaseDefinition(), 5, 0, 0, false),
162162
Arguments.of(SysmlPackage.eINSTANCE.getUseCaseUsage(), 7, 0, 0, false),
163163
Arguments.of(SysmlPackage.eINSTANCE.getSatisfyRequirementUsage(), 8, 0, 0, false),
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,54 @@
1+
/*******************************************************************************
2+
* Copyright (c) 2026 Obeo.
3+
* This program and the accompanying materials
4+
* are made available under the terms of the Eclipse Public License v2.0
5+
* which accompanies this distribution, and is available at
6+
* https://www.eclipse.org/legal/epl-2.0/
7+
*
8+
* SPDX-License-Identifier: EPL-2.0
9+
*
10+
* Contributors:
11+
* Obeo - initial API and implementation
12+
*******************************************************************************/
13+
package org.eclipse.syson.diagram.common.view.nodes;
14+
15+
import org.eclipse.emf.ecore.EClass;
16+
import org.eclipse.emf.ecore.EReference;
17+
import org.eclipse.sirius.components.view.builder.providers.IColorProvider;
18+
import org.eclipse.sirius.components.view.diagram.NodeDescription;
19+
import org.eclipse.syson.sysml.SysmlPackage;
20+
import org.eclipse.syson.util.IDescriptionNameGenerator;
21+
import org.eclipse.syson.util.SysMLMetamodelHelper;
22+
23+
/**
24+
* Used to create a {@link org.eclipse.syson.sysml.ConcernUsage} compartment item node description.
25+
* <p>
26+
* {@link org.eclipse.syson.sysml.ConcernUsage} compartment items have to be contained in a {@link org.eclipse.syson.sysml.FramedConcernMembership}.
27+
* </p>
28+
* @author gcoutable
29+
*/
30+
public class FramedConcernCompartmentItemNodeDescription extends CompartmentItemNodeDescriptionProvider {
31+
32+
public static final String COMPARTMENT_ITEM_NAME = " frame Concern";
33+
34+
public FramedConcernCompartmentItemNodeDescription(EClass eClass, EReference eReference, IColorProvider colorProvider, IDescriptionNameGenerator descriptionNameGenerator) {
35+
super(eClass, eReference, colorProvider, descriptionNameGenerator);
36+
}
37+
38+
@Override
39+
public NodeDescription create() {
40+
NodeDescription nodeDescription = super.create();
41+
nodeDescription.setPreconditionExpression("true");
42+
return nodeDescription;
43+
}
44+
45+
@Override
46+
protected String getDomainType() {
47+
return SysMLMetamodelHelper.buildQualifiedName(SysmlPackage.eINSTANCE.getElement());
48+
}
49+
50+
@Override
51+
protected String getName() {
52+
return super.getName() + COMPARTMENT_ITEM_NAME;
53+
}
54+
}
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,61 @@
1+
/*******************************************************************************
2+
* Copyright (c) 2026 Obeo.
3+
* This program and the accompanying materials
4+
* are made available under the terms of the Eclipse Public License v2.0
5+
* which accompanies this distribution, and is available at
6+
* https://www.eclipse.org/legal/epl-2.0/
7+
*
8+
* SPDX-License-Identifier: EPL-2.0
9+
*
10+
* Contributors:
11+
* Obeo - initial API and implementation
12+
*******************************************************************************/
13+
package org.eclipse.syson.diagram.common.view.nodes;
14+
15+
import java.util.List;
16+
17+
import org.eclipse.emf.ecore.EClass;
18+
import org.eclipse.emf.ecore.EReference;
19+
import org.eclipse.sirius.components.view.builder.IViewDiagramElementFinder;
20+
import org.eclipse.sirius.components.view.builder.providers.IColorProvider;
21+
import org.eclipse.sirius.components.view.diagram.DiagramDescription;
22+
import org.eclipse.sirius.components.view.diagram.NodeDescription;
23+
import org.eclipse.syson.util.IDescriptionNameGenerator;
24+
25+
/**
26+
* Compartment node allowing to display {@link org.eclipse.syson.sysml.ConcernUsage} owned by a {@link org.eclipse.syson.sysml.FramedConcernMembership}.
27+
*
28+
* @author gcoutable
29+
*/
30+
public class FramedConcernCompartmentNodeDescription extends AbstractCompartmentNodeDescriptionProvider {
31+
32+
public static final String COMPARTMENT_NAME = " frames";
33+
34+
public FramedConcernCompartmentNodeDescription(EClass eClass, EReference eReference, IColorProvider colorProvider, IDescriptionNameGenerator descriptionNameGenerator) {
35+
super(eClass, eReference, colorProvider, descriptionNameGenerator);
36+
}
37+
38+
@Override
39+
protected String getCompartmentName() {
40+
return this.getDescriptionNameGenerator().getCompartmentName(this.eClass, this.eReference) + COMPARTMENT_NAME;
41+
}
42+
43+
@Override
44+
protected String getCustomCompartmentLabel() {
45+
return "frames";
46+
}
47+
48+
@Override
49+
public void link(DiagramDescription diagramDescription, IViewDiagramElementFinder cache) {
50+
cache.getNodeDescription(this.getDescriptionNameGenerator().getCompartmentName(this.eClass, this.eReference) + COMPARTMENT_NAME).ifPresent(nodeDescription -> {
51+
cache.getNodeDescription(this.getDescriptionNameGenerator().getCompartmentItemName(this.eClass, this.eReference) + FramedConcernCompartmentItemNodeDescription.COMPARTMENT_ITEM_NAME)
52+
.ifPresent(itemNodeDescription -> nodeDescription.getChildrenDescriptions().add(itemNodeDescription));
53+
nodeDescription.setPalette(this.createCompartmentPalette(cache));
54+
});
55+
}
56+
57+
@Override
58+
protected List<NodeDescription> getDroppableNodes(IViewDiagramElementFinder cache) {
59+
return List.of();
60+
}
61+
}

backend/views/syson-standard-diagrams-view/src/main/java/org/eclipse/syson/standard/diagrams/view/SDVDescriptionNameGenerator.java

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -44,7 +44,7 @@ public String getCreationToolName(EReference eReference) {
4444
name = "New Require constraint";
4545
} else if (SysmlPackage.eINSTANCE.getRequirementUsage_FramedConcern().equals(eReference)
4646
|| SysmlPackage.eINSTANCE.getRequirementDefinition_FramedConcern().equals(eReference)) {
47-
name = "New framed concern";
47+
name = "New framed Concern";
4848
}
4949
return name;
5050
}

0 commit comments

Comments
 (0)