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 @@ -40,6 +40,8 @@ In any case, it is strongly recommended to back up your data before proceeding w
- https://github.com/eclipse-syson/syson/issues/2370[#2370] [diagrams] Add support of `ItemUsage` inheritance in _items_ compartments of `PortUsage` and `PortDefinition` graphical nodes.
- https://github.com/eclipse-syson/syson/issues/2372[#2372] [diagrams] Add support of assume constraint inheritance in _assume constraints_ compartments of `RequirementUsage` and `RequirementDefinition` graphical nodes.
- https://github.com/eclipse-syson/syson/issues/2375[#2375] [diagrams] Add support of require constraints inheritance in _require constraints_ compartments of `RequirementUsage`, `RequirementDefinition` and subtypes graphical nodes.
- https://github.com/eclipse-syson/syson/issues/2382[#2382] [diagrams] Add support of stakeholder inheritance in _stakeholders_ compartments of `RequirementUsage` and `RequirementDefinition` graphical nodes.


== v2026.7.0

Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -693,6 +693,132 @@ public void checkConcernUsageRequireConstraintsInheritanceWithReferenceSubsettin
.run();
}

@DisplayName("GIVEN a base RequirementDefinition with a stakeholder, WHEN a RequirementDefinition is subclassifying the base RequirementDefinition, THEN the RequirementDefinition stakeholders are inherited from the base RequirementDefinition")
@Test
public void checkRequirementDefinitionStakeholdersInheritanceWithSubclassification() {
var eClass = SysmlPackage.eINSTANCE.getRequirementDefinition();
new ElementSpecializationInheritanceTestRunner()
.baseElementToInheritFromEClass(eClass)
.baseElementToInheritFromNodeId(GeneralViewWithTopNodesTestProjectData.GraphicalIds.REQUIREMENT_DEFINITION_ID)
.elementToInheritCreationToolName("New Stakeholder")
.withEdgeExpected()
.withSelectedElementId("")
.elementToInheritExpectedListItemLabelText("stakeholder1")
.compartmentName("stakeholders")
.elementThatInheritFromBaseElementCreationToolName("New Requirement Definition")
.elementThatInheritFromBaseElementEClass(eClass)
.specializationToolName("New Subclassification")
.run();
}

private ElementSpecializationInheritanceTestRunner getRequirementUsageStakeholdersInheritanceTestRunner() {
var eClass = SysmlPackage.eINSTANCE.getRequirementUsage();
return new ElementSpecializationInheritanceTestRunner()
.baseElementToInheritFromEClass(eClass)
.baseElementToInheritFromNodeId(GeneralViewWithTopNodesTestProjectData.GraphicalIds.REQUIREMENT_USAGE_ID)
.elementToInheritCreationToolName("New Stakeholder")
.withEdgeExpected()
.withSelectedElementId("")
.elementToInheritExpectedListItemLabelText("stakeholder1")
.compartmentName("stakeholders")
.elementThatInheritFromBaseElementCreationToolName("New Requirement")
.elementThatInheritFromBaseElementEClass(eClass);
}

@DisplayName("GIVEN a base RequirementUsage with a stakeholder, WHEN a RequirementUsage is subsetting the base RequirementUsage, THEN the RequirementUsage stakeholders are inherited from the base RequirementUsage")
@Test
public void checkRequirementUsageStakeholdersInheritanceWithSubsetting() {
this.getRequirementUsageStakeholdersInheritanceTestRunner()
.specializationToolName("New Subsetting")
.run();
}

@DisplayName("GIVEN a base RequirementUsage with a stakeholder, WHEN a RequirementUsage is subsetting by reference the base RequirementUsage, THEN the RequirementUsage stakeholders are inherited from the base RequirementUsage")
@Test
public void checkRequirementUsageStakeholdersInheritanceWithReferenceSubsetting() {
this.getRequirementUsageStakeholdersInheritanceTestRunner()
.specializationToolName("New Reference Subsetting")
.run();
}

private ElementSpecializationInheritanceTestRunner getSatisfyRequirementUsageStakeholdersInheritanceTestRunner() {
var eClass = SysmlPackage.eINSTANCE.getSatisfyRequirementUsage();
return new ElementSpecializationInheritanceTestRunner()
.baseElementToInheritFromEClass(eClass)
.baseElementToInheritFromNodeId(GeneralViewWithTopNodesTestProjectData.GraphicalIds.SATISFY_REQUIREMENT_USAGE_ID)
.elementToInheritCreationToolName("New Stakeholder")
.withEdgeExpected()
.withSelectedElementId("")
.elementToInheritExpectedListItemLabelText("stakeholder1")
.compartmentName("stakeholders")
.elementThatInheritFromBaseElementCreationToolName("New Satisfy Requirement")
.elementThatInheritFromBaseElementEClass(eClass);
}

@DisplayName("GIVEN a base SatisfyRequirementUsage with a stakeholder, WHEN a SatisfyRequirementUsage is subsetting the base SatisfyRequirementUsage, THEN the SatisfyRequirementUsage stakeholders are inherited from the base SatisfyRequirementUsage")
@Test
public void checkSatisfyRequirementUsageStakeholdersInheritanceWithSubsetting() {
this.getSatisfyRequirementUsageStakeholdersInheritanceTestRunner()
.specializationToolName("New Subsetting")
.run();
}

@DisplayName("GIVEN a base SatisfyRequirementUsage with a stakeholder, WHEN a SatisfyRequirementUsage is subsetting by reference the base SatisfyRequirementUsage, THEN the SatisfyRequirementUsage stakeholders are inherited from the base SatisfyRequirementUsage")
@Test
public void checkSatisfyRequirementUsageStakeholdersInheritanceWithReferenceSubsetting() {
this.getSatisfyRequirementUsageStakeholdersInheritanceTestRunner()
.specializationToolName("New Reference Subsetting")
.run();
}

@DisplayName("GIVEN a base ConcernDefinition with a stakeholder, WHEN a ConcernDefinition is subclassifying the base ConcernDefinition, THEN the ConcernDefinition assume constraints are inherited from the base ConcernDefinition")
@Test
public void checkConcernDefinitionStakeholdersInheritanceWithSubclassification() {
var eClass = SysmlPackage.eINSTANCE.getConcernDefinition();
new ElementSpecializationInheritanceTestRunner()
.baseElementToInheritFromEClass(eClass)
.baseElementToInheritFromNodeId(GeneralViewWithTopNodesTestProjectData.GraphicalIds.CONCERN_DEFINITION_ID)
.elementToInheritCreationToolName("New Stakeholder")
.withEdgeExpected()
.withSelectedElementId("")
.elementToInheritExpectedListItemLabelText("stakeholder1")
.compartmentName("stakeholders")
.elementThatInheritFromBaseElementCreationToolName("New Concern Definition")
.elementThatInheritFromBaseElementEClass(eClass)
.specializationToolName("New Subclassification")
.run();
}

private ElementSpecializationInheritanceTestRunner getConcernUsageStakeholdersInheritanceTestRunner() {
var eClass = SysmlPackage.eINSTANCE.getConcernUsage();
return new ElementSpecializationInheritanceTestRunner()
.baseElementToInheritFromEClass(eClass)
.baseElementToInheritFromNodeId(GeneralViewWithTopNodesTestProjectData.GraphicalIds.CONCERN_USAGE_ID)
.elementToInheritCreationToolName("New Stakeholder")
.withEdgeExpected()
.withSelectedElementId("")
.elementToInheritExpectedListItemLabelText("stakeholder1")
.compartmentName("stakeholders")
.elementThatInheritFromBaseElementCreationToolName("New Concern")
.elementThatInheritFromBaseElementEClass(eClass);
}

@DisplayName("GIVEN a base ConcernUsage with a stakeholder, WHEN a ConcernUsage is subsetting the base ConcernUsage, THEN the ConcernUsage assume constraints are inherited from the base ConcernUsage")
@Test
public void checkConcernUsageStakeholdersInheritanceWithSubsetting() {
this.getConcernUsageStakeholdersInheritanceTestRunner()
.specializationToolName("New Subsetting")
.run();
}

@DisplayName("GIVEN a base ConcernUsage with a stakeholder, WHEN a ConcernUsage is subsetting by reference the base ConcernUsage, THEN the ConcernUsage assume constraints are inherited from the base ConcernUsage")
@Test
public void checkConcernUsageStakeholdersInheritanceWithReferenceSubsetting() {
this.getConcernUsageStakeholdersInheritanceTestRunner()
.specializationToolName("New Reference Subsetting")
.run();
}

/**
* This test runner verifies that creating a specializing relationship create inherited elements.
*
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -75,7 +75,6 @@ public static class GraphicalIds {
public static final String PORT_DEFINITION_ID = "bad8fa43-eb03-35dd-a025-34fd2e71d5a3";

public static final String SATISFY_REQUIREMENT_USAGE_ID = "450a4e50-c67b-3c40-8801-64aa0cd85bd6";

}

/**
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -20,6 +20,7 @@
import org.eclipse.emf.ecore.EObject;
import org.eclipse.emf.ecore.EReference;
import org.eclipse.syson.sysml.ActionUsage;
import org.eclipse.syson.sysml.ActorMembership;
import org.eclipse.syson.sysml.Behavior;
import org.eclipse.syson.sysml.ConstraintUsage;
import org.eclipse.syson.sysml.Definition;
Expand All @@ -31,6 +32,7 @@
import org.eclipse.syson.sysml.ReferenceUsage;
import org.eclipse.syson.sysml.RequirementConstraintKind;
import org.eclipse.syson.sysml.RequirementConstraintMembership;
import org.eclipse.syson.sysml.StakeholderMembership;
import org.eclipse.syson.sysml.StateUsage;
import org.eclipse.syson.sysml.Step;
import org.eclipse.syson.sysml.SysmlPackage;
Expand Down Expand Up @@ -139,12 +141,35 @@ public Boolean caseFeature(Feature object) {
*/
@Override
public Boolean casePartUsage(PartUsage object) {
boolean result;
if (this.shouldConsiderParameter(object)) {
return this.isInheritedParameter(object);
result = this.isInheritedParameter(object);
} else if (this.isStakeholderReference()) {
// We are dealing with a stakeholder
var membership = object.getOwningMembership();
// so the part usage is a stakeholder if and only if, it is contained by a StakeholderMembership
result = membership instanceof StakeholderMembership;
} if (this.isActorReference()) {
// We are dealing with an Actor?
var membership = object.getOwningMembership();
// so the part usage is an actor if and only if, it is contained by a ActorMembership
result = membership instanceof ActorMembership;
} else {
EClassifier eType = this.eReference.getEType();
EClass eClass = object.eClass();
result = eType.equals(eClass) || (eType instanceof EClass eTypeEClass && eTypeEClass.isSuperTypeOf(eClass));
}
EClassifier eType = this.eReference.getEType();
EClass eClass = object.eClass();
return eType.equals(eClass) || (eType instanceof EClass eTypeEClass && eTypeEClass.isSuperTypeOf(eClass));
return result;
}

private boolean isStakeholderReference() {
return this.eReference.equals(SysmlPackage.eINSTANCE.getRequirementUsage_StakeholderParameter())
|| this.eReference.equals(SysmlPackage.eINSTANCE.getRequirementDefinition_StakeholderParameter());
}

private boolean isActorReference() {
return this.eReference.equals(SysmlPackage.eINSTANCE.getRequirementUsage_ActorParameter())
|| this.eReference.equals(SysmlPackage.eINSTANCE.getRequirementDefinition_ActorParameter());
}

/**
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -928,31 +928,41 @@ private List<IDiagramElementDescriptionProvider<?>> createCompartmentsForStakeho
SysmlPackage.eINSTANCE.getRequirementDefinition_StakeholderParameter(), colorProvider, this.getDescriptionNameGenerator()));
compartmentNodeDescriptionProviders.add(new CompartmentItemNodeDescriptionProvider(SysmlPackage.eINSTANCE.getRequirementDefinition(),
SysmlPackage.eINSTANCE.getRequirementDefinition_StakeholderParameter(), colorProvider, this.getDescriptionNameGenerator()));
compartmentNodeDescriptionProviders.add(new InheritedCompartmentItemNodeDescriptionProvider(SysmlPackage.eINSTANCE.getRequirementDefinition(),
SysmlPackage.eINSTANCE.getRequirementDefinition_StakeholderParameter(), colorProvider, this.getDescriptionNameGenerator()));

// RequirementUsage: stakeholder compartment & items
compartmentNodeDescriptionProviders.add(new RequirementUsageStakeholdersCompartmentNodeDescriptionProvider(SysmlPackage.eINSTANCE.getRequirementUsage(),
SysmlPackage.eINSTANCE.getRequirementUsage_StakeholderParameter(), colorProvider, this.getDescriptionNameGenerator()));
compartmentNodeDescriptionProviders
.add(new CompartmentItemNodeDescriptionProvider(SysmlPackage.eINSTANCE.getRequirementUsage(), SysmlPackage.eINSTANCE.getRequirementUsage_StakeholderParameter(),
colorProvider, this.getDescriptionNameGenerator()));
compartmentNodeDescriptionProviders.add(new InheritedCompartmentItemNodeDescriptionProvider(SysmlPackage.eINSTANCE.getRequirementUsage(),
SysmlPackage.eINSTANCE.getRequirementUsage_StakeholderParameter(), colorProvider, this.getDescriptionNameGenerator()));

// ConcernDefinition: stakeholder compartment & items
compartmentNodeDescriptionProviders.add(new RequirementDefinitionStakeholdersCompartmentNodeDescriptionProvider(SysmlPackage.eINSTANCE.getConcernDefinition(),
SysmlPackage.eINSTANCE.getRequirementDefinition_StakeholderParameter(), colorProvider, this.getDescriptionNameGenerator()));
compartmentNodeDescriptionProviders.add(new CompartmentItemNodeDescriptionProvider(SysmlPackage.eINSTANCE.getConcernDefinition(),
SysmlPackage.eINSTANCE.getRequirementDefinition_StakeholderParameter(), colorProvider, this.getDescriptionNameGenerator()));
compartmentNodeDescriptionProviders.add(new InheritedCompartmentItemNodeDescriptionProvider(SysmlPackage.eINSTANCE.getConcernDefinition(),
SysmlPackage.eINSTANCE.getRequirementDefinition_StakeholderParameter(), colorProvider, this.getDescriptionNameGenerator()));

// ConcernUsage: stakeholder compartment & items
compartmentNodeDescriptionProviders.add(new RequirementUsageStakeholdersCompartmentNodeDescriptionProvider(SysmlPackage.eINSTANCE.getConcernUsage(),
SysmlPackage.eINSTANCE.getRequirementUsage_StakeholderParameter(), colorProvider, this.getDescriptionNameGenerator()));
compartmentNodeDescriptionProviders.add(new CompartmentItemNodeDescriptionProvider(SysmlPackage.eINSTANCE.getConcernUsage(),
SysmlPackage.eINSTANCE.getRequirementUsage_StakeholderParameter(), colorProvider, this.getDescriptionNameGenerator()));
compartmentNodeDescriptionProviders.add(new InheritedCompartmentItemNodeDescriptionProvider(SysmlPackage.eINSTANCE.getConcernUsage(),
SysmlPackage.eINSTANCE.getRequirementUsage_StakeholderParameter(), colorProvider, this.getDescriptionNameGenerator()));

// SatisfyRequirementUsage: stakeholder compartment & items
compartmentNodeDescriptionProviders.add(new RequirementUsageStakeholdersCompartmentNodeDescriptionProvider(SysmlPackage.eINSTANCE.getSatisfyRequirementUsage(),
SysmlPackage.eINSTANCE.getRequirementUsage_StakeholderParameter(), colorProvider, this.getDescriptionNameGenerator()));
compartmentNodeDescriptionProviders.add(new CompartmentItemNodeDescriptionProvider(SysmlPackage.eINSTANCE.getSatisfyRequirementUsage(),
SysmlPackage.eINSTANCE.getRequirementUsage_StakeholderParameter(), colorProvider, this.getDescriptionNameGenerator()));
compartmentNodeDescriptionProviders.add(new InheritedCompartmentItemNodeDescriptionProvider(SysmlPackage.eINSTANCE.getSatisfyRequirementUsage(),
SysmlPackage.eINSTANCE.getRequirementUsage_StakeholderParameter(), colorProvider, this.getDescriptionNameGenerator()));

return compartmentNodeDescriptionProviders;
}
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -9,6 +9,8 @@
** Add support for list item inheritance in _perform actions_ compartments.

** Add support of `ItemUsage` inheritance in _items_ compartments of `PortUsage` and `PortDefinition` graphical nodes.
** Add support of stakeholder inheritance in _stakeholders_ compartments of `RequirementUsage` and `RequirementDefinition` graphical nodes.


** Add support of assume constraint inheritance in _assume constraints_ compartments of `RequirementUsage` and `RequirementDefinition` graphical nodes.
** Add support of require constraints inheritance in _require constraints_ compartments of `RequirementUsage`, `RequirementDefinition` and subtypes graphical nodes.
Expand Down
Loading