diff --git a/CHANGELOG.adoc b/CHANGELOG.adoc index d65fcd7f3..120e8ab6c 100644 --- a/CHANGELOG.adoc +++ b/CHANGELOG.adoc @@ -58,6 +58,7 @@ This removes Rollup warnings about missing global names for externalized peer de - https://github.com/eclipse-syson/syson/issues/2382[#2382] [diagrams] Add support of stakeholder inheritance in _stakeholders_ compartments of `RequirementUsage` and `RequirementDefinition` graphical nodes. - https://github.com/eclipse-syson/syson/issues/2387[#2387] [diagrams] Add support of objective requirement inheritance in _objective_ compartments of `CaseUsage` and `CaseDefinition` graphical nodes. - https://github.com/eclipse-syson/syson/issues/2391[#2391] [diagrams] Add support of actor inheritance in _actors_ compartment of `CaseDefinition` and `CaseUsage` graphical nodes. +- https://github.com/eclipse-syson/syson/issues/2389[#2389] [diagrams] Add support of inheritance of subject in _subject_ compartment of `CaseDefinition` and `CaseUsage` (and more) graphical nodes. == v2026.7.0 diff --git a/backend/application/syson-application/src/test/java/org/eclipse/syson/application/controllers/diagrams/general/view/GVCompartmentItemInheritanceTests.java b/backend/application/syson-application/src/test/java/org/eclipse/syson/application/controllers/diagrams/general/view/GVCompartmentItemInheritanceTests.java index 101443f8e..b4569d834 100644 --- a/backend/application/syson-application/src/test/java/org/eclipse/syson/application/controllers/diagrams/general/view/GVCompartmentItemInheritanceTests.java +++ b/backend/application/syson-application/src/test/java/org/eclipse/syson/application/controllers/diagrams/general/view/GVCompartmentItemInheritanceTests.java @@ -1008,6 +1008,42 @@ public void checkActorInheritanceForConcernWithSpecialization(String subclassifi .run(); } + private static Stream subjectInheritanceParameters() { + return Stream.of( + Arguments.of("New Requirement Definition", "New Subclassification", SysmlPackage.eINSTANCE.getRequirementDefinition(), GeneralViewWithTopNodesTestProjectData.GraphicalIds.REQUIREMENT_DEFINITION_ID), + Arguments.of("New Requirement", "New Redefinition", SysmlPackage.eINSTANCE.getRequirementUsage(), GeneralViewWithTopNodesTestProjectData.GraphicalIds.REQUIREMENT_USAGE_ID), + Arguments.of("New Requirement", "New Subsetting", SysmlPackage.eINSTANCE.getRequirementUsage(), GeneralViewWithTopNodesTestProjectData.GraphicalIds.REQUIREMENT_USAGE_ID), + Arguments.of("New Requirement", "New Reference Subsetting", SysmlPackage.eINSTANCE.getRequirementUsage(), GeneralViewWithTopNodesTestProjectData.GraphicalIds.REQUIREMENT_USAGE_ID), + Arguments.of("New Satisfy Requirement", "New Redefinition", SysmlPackage.eINSTANCE.getSatisfyRequirementUsage(), GeneralViewWithTopNodesTestProjectData.GraphicalIds.SATISFY_REQUIREMENT_USAGE_ID), + Arguments.of("New Satisfy Requirement", "New Subsetting", SysmlPackage.eINSTANCE.getSatisfyRequirementUsage(), GeneralViewWithTopNodesTestProjectData.GraphicalIds.SATISFY_REQUIREMENT_USAGE_ID), + Arguments.of("New Satisfy Requirement", "New Reference Subsetting", SysmlPackage.eINSTANCE.getSatisfyRequirementUsage(), GeneralViewWithTopNodesTestProjectData.GraphicalIds.SATISFY_REQUIREMENT_USAGE_ID), + Arguments.of("New Concern Definition", "New Subclassification", SysmlPackage.eINSTANCE.getConcernDefinition(), GeneralViewWithTopNodesTestProjectData.GraphicalIds.CONCERN_DEFINITION_ID), + Arguments.of("New Concern", "New Redefinition", SysmlPackage.eINSTANCE.getConcernUsage(), GeneralViewWithTopNodesTestProjectData.GraphicalIds.CONCERN_USAGE_ID), + Arguments.of("New Concern", "New Subsetting", SysmlPackage.eINSTANCE.getConcernUsage(), GeneralViewWithTopNodesTestProjectData.GraphicalIds.CONCERN_USAGE_ID), + Arguments.of("New Concern", "New Reference Subsetting", SysmlPackage.eINSTANCE.getConcernUsage(), GeneralViewWithTopNodesTestProjectData.GraphicalIds.CONCERN_USAGE_ID), + Arguments.of("New Case Definition", "New Subclassification", SysmlPackage.eINSTANCE.getCaseDefinition(), GeneralViewWithTopNodesTestProjectData.GraphicalIds.CASE_DEFINITION_ID), + Arguments.of("New Case", "New Redefinition", SysmlPackage.eINSTANCE.getCaseUsage(), GeneralViewWithTopNodesTestProjectData.GraphicalIds.CASE_USAGE_ID), + Arguments.of("New Case", "New Subsetting", SysmlPackage.eINSTANCE.getCaseUsage(), GeneralViewWithTopNodesTestProjectData.GraphicalIds.CASE_USAGE_ID), + Arguments.of("New Case", "New Reference Subsetting", SysmlPackage.eINSTANCE.getCaseUsage(), GeneralViewWithTopNodesTestProjectData.GraphicalIds.CASE_USAGE_ID) + ); + } + + @ParameterizedTest + @MethodSource("subjectInheritanceParameters") + public void checkSubjectInheritanceWithSubclassification(String subclassifier, String specialization, EClass eClass, String baseElementNodeId) { + new ElementSpecializationInheritanceTestRunner() + .baseElementToInheritFromEClass(eClass) + .baseElementToInheritFromNodeId(baseElementNodeId) + .elementToInheritCreationToolName("New Subject") + .withSelectedElementId("") + .elementToInheritExpectedListItemLabelText("ref subject") + .compartmentName("subject") + .elementThatInheritFromBaseElementCreationToolName(subclassifier) + .elementThatInheritFromBaseElementEClass(eClass) + .specializationToolName(specialization) + .run(); + } + /** * This test runner verifies that creating a specializing relationship create inherited elements. * diff --git a/backend/services/syson-diagram-services/src/main/java/org/eclipse/syson/diagram/services/InheritedCompartmentItemFilterSwitch.java b/backend/services/syson-diagram-services/src/main/java/org/eclipse/syson/diagram/services/InheritedCompartmentItemFilterSwitch.java index 2a504897f..aa38e2076 100644 --- a/backend/services/syson-diagram-services/src/main/java/org/eclipse/syson/diagram/services/InheritedCompartmentItemFilterSwitch.java +++ b/backend/services/syson-diagram-services/src/main/java/org/eclipse/syson/diagram/services/InheritedCompartmentItemFilterSwitch.java @@ -39,6 +39,7 @@ import org.eclipse.syson.sysml.StakeholderMembership; import org.eclipse.syson.sysml.StateUsage; import org.eclipse.syson.sysml.Step; +import org.eclipse.syson.sysml.SubjectMembership; import org.eclipse.syson.sysml.SysmlPackage; import org.eclipse.syson.sysml.Type; import org.eclipse.syson.sysml.Usage; @@ -156,6 +157,10 @@ public Boolean casePartUsage(PartUsage object) { // We are dealing with an Actor // so the part usage is an actor if and only if, it is contained by a ActorMembership result = object.getOwningMembership() instanceof ActorMembership; + } else if (this.isSubjectReference()) { + // We are dealing with a subject + // so the reference usage is a subject if and only if, it is contained by a SubjectMembership + result = object.getOwningMembership() instanceof SubjectMembership; } else { EClassifier eType = this.eReference.getEType(); EClass eClass = object.eClass(); @@ -218,13 +223,26 @@ public Boolean casePortUsage(PortUsage object) { */ @Override public Boolean caseReferenceUsage(ReferenceUsage object) { + final boolean result; if (this.shouldConsiderParameter(object)) { - return this.isInheritedParameter(object); + result = this.isInheritedParameter(object); + } else if (this.isSubjectReference()) { + // We are dealing with a subject + // so the reference usage is a subject if and only if, it is contained by a SubjectMembership + result = object.getOwningMembership() instanceof SubjectMembership; + } else { + EClassifier eType = this.eReference.getEType(); + EClass eClass = object.eClass(); + result = eType.equals(eClass) || (eType instanceof EClass eTypeEClass && eTypeEClass.isSuperTypeOf(eClass)); } + return result; + } - EClassifier eType = this.eReference.getEType(); - EClass eClass = object.eClass(); - return eType.equals(eClass) || (eType instanceof EClass eTypeEClass && eTypeEClass.isSuperTypeOf(eClass)); + private boolean isSubjectReference() { + return this.eReference.equals(SysmlPackage.eINSTANCE.getRequirementUsage_SubjectParameter()) + || this.eReference.equals(SysmlPackage.eINSTANCE.getRequirementDefinition_SubjectParameter()) + || this.eReference.equals(SysmlPackage.eINSTANCE.getCaseDefinition_SubjectParameter()) + || this.eReference.equals(SysmlPackage.eINSTANCE.getCaseUsage_SubjectParameter()); } @Override @@ -234,6 +252,10 @@ public Boolean caseRequirementUsage(RequirementUsage object) { // We are dealing with an objective // so the part usage is an objective if and only if, it is contained by an ObjectiveMembership result = object.getOwningMembership() instanceof ObjectiveMembership; + } else if (this.isSubjectReference()) { + // We are dealing with a subject + // so the reference usage is a subject if and only if, it is contained by a SubjectMembership + result = object.getOwningMembership() instanceof SubjectMembership; } else { EClassifier eType = this.eReference.getEType(); EClass eClass = object.eClass(); diff --git a/backend/views/syson-standard-diagrams-view/src/main/java/org/eclipse/syson/standard/diagrams/view/SDVDiagramDescriptionProvider.java b/backend/views/syson-standard-diagrams-view/src/main/java/org/eclipse/syson/standard/diagrams/view/SDVDiagramDescriptionProvider.java index 39d85471a..494b06f11 100644 --- a/backend/views/syson-standard-diagrams-view/src/main/java/org/eclipse/syson/standard/diagrams/view/SDVDiagramDescriptionProvider.java +++ b/backend/views/syson-standard-diagrams-view/src/main/java/org/eclipse/syson/standard/diagrams/view/SDVDiagramDescriptionProvider.java @@ -889,6 +889,14 @@ private List> createCompartmentsForSubject compartmentNodeDescriptionProviders.add(new RequirementUsageSubjectCompartmentNodeDescriptionProvider(colorProvider, this.getDescriptionNameGenerator())); compartmentNodeDescriptionProviders.add(new CompartmentItemNodeDescriptionProvider(SysmlPackage.eINSTANCE.getRequirementUsage(), SysmlPackage.eINSTANCE.getRequirementUsage_SubjectParameter(), colorProvider, this.getDescriptionNameGenerator())); + compartmentNodeDescriptionProviders.add(new InheritedCompartmentItemNodeDescriptionProvider(SysmlPackage.eINSTANCE.getCaseDefinition(), SysmlPackage.eINSTANCE.getCaseDefinition_SubjectParameter(), colorProvider, this.getDescriptionNameGenerator())); + compartmentNodeDescriptionProviders.add(new InheritedCompartmentItemNodeDescriptionProvider(SysmlPackage.eINSTANCE.getCaseUsage(), SysmlPackage.eINSTANCE.getCaseUsage_SubjectParameter(), colorProvider, this.getDescriptionNameGenerator())); + compartmentNodeDescriptionProviders.add(new InheritedCompartmentItemNodeDescriptionProvider(SysmlPackage.eINSTANCE.getConcernDefinition(), SysmlPackage.eINSTANCE.getRequirementDefinition_SubjectParameter(), colorProvider, this.getDescriptionNameGenerator())); + compartmentNodeDescriptionProviders.add(new InheritedCompartmentItemNodeDescriptionProvider(SysmlPackage.eINSTANCE.getConcernUsage(), SysmlPackage.eINSTANCE.getRequirementUsage_SubjectParameter(), colorProvider, this.getDescriptionNameGenerator())); + compartmentNodeDescriptionProviders.add(new InheritedCompartmentItemNodeDescriptionProvider(SysmlPackage.eINSTANCE.getRequirementDefinition(), SysmlPackage.eINSTANCE.getRequirementDefinition_SubjectParameter(), colorProvider, this.getDescriptionNameGenerator())); + compartmentNodeDescriptionProviders.add(new InheritedCompartmentItemNodeDescriptionProvider(SysmlPackage.eINSTANCE.getRequirementUsage(), SysmlPackage.eINSTANCE.getRequirementUsage_SubjectParameter(), colorProvider, this.getDescriptionNameGenerator())); + compartmentNodeDescriptionProviders.add(new InheritedCompartmentItemNodeDescriptionProvider(SysmlPackage.eINSTANCE.getSatisfyRequirementUsage(), SysmlPackage.eINSTANCE.getRequirementUsage_SubjectParameter(), colorProvider, this.getDescriptionNameGenerator())); + return compartmentNodeDescriptionProviders; } diff --git a/doc/content/modules/user-manual/pages/release-notes/2026.9.0.adoc b/doc/content/modules/user-manual/pages/release-notes/2026.9.0.adoc index 90be68c5f..bdff86b33 100644 --- a/doc/content/modules/user-manual/pages/release-notes/2026.9.0.adoc +++ b/doc/content/modules/user-manual/pages/release-notes/2026.9.0.adoc @@ -17,6 +17,14 @@ ** Add support of actor inheritance in _actors_ compartment of `CaseDefinition` and `CaseUsage` graphical nodes. The actor inheritance in _actors_ compartment is also visible in the following graphical nodes: +*** `RequirementDefinition` +*** `RequireUsage` +*** `ConcernDefinition` +*** `ConcernUsage` +*** `SatisfyRequirementUsage` +** Add support of subject inheritance in _subject_ compartment of `CaseDefinition` and `CaseUsage` graphical nodes. +The subject inheritance in _subject_ compartment is also visible in the following graphical nodes: + *** `RequirementDefinition` *** `RequireUsage` *** `ConcernDefinition`