From d0f014f6340208f0e4b211fc3518c4da11105d91 Mon Sep 17 00:00:00 2001 From: Jerome Gout Date: Fri, 7 Aug 2026 09:56:06 +0200 Subject: [PATCH] [2389] Add support of inheritance of subject in subject compartment Add support of inheritance of subject in subject compartment of CaseDefinition and CaseUsage graphical nodes. The subject compartment is also visible in the following graphical nodes: - RequirementDefinition - RequireUsage - ConcernDefinition - ConcernUsage - SatisfyRequirementUsage Bug: https://github.com/eclipse-syson/syson/issues/2389 Signed-off-by: Jerome Gout --- CHANGELOG.adoc | 1 + .../GVCompartmentItemInheritanceTests.java | 36 +++++++++++++++++++ .../InheritedCompartmentItemFilterSwitch.java | 30 +++++++++++++--- .../view/SDVDiagramDescriptionProvider.java | 8 +++++ .../pages/release-notes/2026.9.0.adoc | 8 +++++ 5 files changed, 79 insertions(+), 4 deletions(-) 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`