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
4 changes: 4 additions & 0 deletions CHANGELOG.adoc
Original file line number Diff line number Diff line change
Expand Up @@ -14,6 +14,8 @@

=== Bug fixes

- https://github.com/eclipse-syson/syson/issues/2237[#2237] [diagrams] Fix the item label inside `frames`, `require constraints`, and `assume constraints` compartments.

=== Improvements

- https://github.com/eclipse-syson/syson/issues/2198[#2198] [diagrams] Improve diagram-to-diagram drag and drop to support dropping multiple graphical nodes at once, leveraging Sirius Web's `droppedNodes` and `droppedElements` variables.
Expand All @@ -24,6 +26,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 @@ -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
Expand Up @@ -96,11 +96,16 @@ public class DiagramQueryLabelService implements IDiagramLabelService {
@Override
public String getIdentificationLabel(Element element) {
StringBuilder label = new StringBuilder();
var shortNameLabel = this.getShortNameLabel(element);
String declaredName = element.getDeclaredName();

if (element instanceof ActionUsage && element.eContainer() instanceof StateSubactionMembership ssm) {
label.append(ssm.getKind()).append(LabelConstants.SPACE);
label.append(ssm.getKind());
if (!shortNameLabel.isBlank() || declaredName != null) {
label.append(LabelConstants.SPACE);
}
}
label.append(this.getShortNameLabel(element));
String declaredName = element.getDeclaredName();
label.append(shortNameLabel);
if (declaredName != null) {
label.append(declaredName);
}
Expand All @@ -119,6 +124,7 @@ public String getReferenceSubsettingLabel(Element element) {
if (!referenceSubsetting.isIsImplied()) {
var referencedFeature = referenceSubsetting.getReferencedFeature();
if (referencedFeature != null) {
label.append(LabelConstants.SPACE);
label.append(LabelConstants.REFERENCES);
label.append(LabelConstants.SPACE);
label.append(this.getDeclaredNameLabel(referencedFeature));
Expand Down Expand Up @@ -549,11 +555,11 @@ public String getDependencyLabel(Dependency dependency) {
}

/**
* Returns the label for the given {@code dependency}.
* Returns the label for the given {@link SatisfyRequirementUsage}.
*
* @param dependency
* the dependency to get the edge label from
* @return the edge label
* @param satisfyRequirementUsage
* The given {@link SatisfyRequirementUsage}
* @return the label for the given {@link SatisfyRequirementUsage}
*/
public String getSatisfyLabel(SatisfyRequirementUsage satisfyRequirementUsage) {
StringBuilder label = new StringBuilder();
Expand All @@ -577,8 +583,19 @@ private String getCompartmentItemLabel(ConstraintUsage constraintUsage, boolean
} else if (!constraintUsage.getOwnedMember().isEmpty() && constraintUsage.getOwnedMember().get(0) instanceof Expression expression) {
label.append(this.getSysmlTextualRepresentation(expression, directEditInput));
} else {
// The constraint doesn't have an expression, we use its name as default label.
label.append(this.getIdentificationLabel(constraintUsage));
var identificationLabel = this.getIdentificationLabel(constraintUsage);
if (identificationLabel.isBlank()) {
// The constraint doesn't have an expression and does not have a name, we use the referenced feature name if the referenced feature exists
var ownedReferenceSubsetting = constraintUsage.getOwnedReferenceSubsetting();
if (ownedReferenceSubsetting != null) {
label.append(this.getIdentificationLabel(ownedReferenceSubsetting.getReferencedFeature()));
}
} else {
// The constraint doesn't have an expression and has a name, we use its name and the referenced feature name
label.append(this.getIdentificationLabel(constraintUsage));
label.append(this.getReferenceSubsettingLabel(constraintUsage));
}

}
return label.toString();
}
Expand Down Expand Up @@ -648,7 +665,7 @@ public String getInitialDirectEditListItemLabel(Documentation documentation) {
* Get the value to display when a direct edit has been called on the given {@link Comment}.
*
* @param comment
* the given {@link comment}.
* the given {@link Comment}.
* @return the value to display.
*/
public String getInitialDirectEditListItemLabel(Comment comment) {
Expand Down
Loading
Loading