From 81a7fb4d57299ebc1fbfcd0b3b38f1721acb5efb Mon Sep 17 00:00:00 2001 From: Jerome Gout Date: Wed, 5 Aug 2026 17:00:42 +0200 Subject: [PATCH] [2391] Add support of inheritance of actor in actors compartment Add support of inheritance of actor in actors compartment of CaseDefinition and CaseUsage graphical nodes The actors compartment is also visible in the following graphical nodes: - RequirementDefinition - RequireUsage - ConcernDefinition - ConcernUsage - SatisfyRequirementUsage Bug: https://github.com/eclipse-syson/syson/issues/2391 Signed-off-by: Jerome Gout --- CHANGELOG.adoc | 1 + .../GVCompartmentItemInheritanceTests.java | 80 ++++++++++++++++++- .../InheritedCompartmentItemFilterSwitch.java | 4 +- .../services/aql/ModelQueryAQLService.java | 8 ++ .../MetamodelQueryElementService.java | 35 ++++++++ .../view/SDVDiagramDescriptionProvider.java | 50 ++++++------ ...ompartmentItemNodeDescriptionProvider.java | 44 ++++++++++ .../pages/release-notes/2026.9.0.adoc | 8 ++ 8 files changed, 204 insertions(+), 26 deletions(-) create mode 100644 backend/views/syson-standard-diagrams-view/src/main/java/org/eclipse/syson/standard/diagrams/view/nodes/ActorsCompartmentItemNodeDescriptionProvider.java diff --git a/CHANGELOG.adoc b/CHANGELOG.adoc index 39f5155af..d65fcd7f3 100644 --- a/CHANGELOG.adoc +++ b/CHANGELOG.adoc @@ -57,6 +57,7 @@ This removes Rollup warnings about missing global names for externalized peer de - https://github.com/eclipse-syson/syson/issues/2380[#2380] [diagrams] Add support of `SatisfyRequirementUsage` inheritance in _satisfy requirements_ compartment of `PartUsage` and `PartDefinition` 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. - 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. == 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 74e99e990..101443f8e 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 @@ -946,6 +946,68 @@ public void checkObjectiveInheritanceWithSpecialization(String subclassifier, St .run(); } + private static Stream actorInheritanceParameters() { + return Stream.of( + Arguments.of("New Requirement Definition", "New Subclassification", SysmlPackage.eINSTANCE.getRequirementDefinition(), GeneralViewWithTopNodesTestProjectData.GraphicalIds.REQUIREMENT_DEFINITION_ID), + Arguments.of("New Case Definition", "New Subclassification", SysmlPackage.eINSTANCE.getCaseDefinition(), GeneralViewWithTopNodesTestProjectData.GraphicalIds.CASE_DEFINITION_ID), + Arguments.of("New Requirement", "New Redefinition", SysmlPackage.eINSTANCE.getRequirementUsage(), GeneralViewWithTopNodesTestProjectData.GraphicalIds.REQUIREMENT_USAGE_ID), + Arguments.of("New Case", "New Redefinition", SysmlPackage.eINSTANCE.getCaseUsage(), GeneralViewWithTopNodesTestProjectData.GraphicalIds.CASE_USAGE_ID), + Arguments.of("New Satisfy Requirement", "New Redefinition", SysmlPackage.eINSTANCE.getSatisfyRequirementUsage(), GeneralViewWithTopNodesTestProjectData.GraphicalIds.SATISFY_REQUIREMENT_USAGE_ID), + Arguments.of("New Requirement", "New Subsetting", SysmlPackage.eINSTANCE.getRequirementUsage(), GeneralViewWithTopNodesTestProjectData.GraphicalIds.REQUIREMENT_USAGE_ID), + Arguments.of("New Case", "New Subsetting", SysmlPackage.eINSTANCE.getCaseUsage(), GeneralViewWithTopNodesTestProjectData.GraphicalIds.CASE_USAGE_ID), + Arguments.of("New Satisfy Requirement", "New Subsetting", SysmlPackage.eINSTANCE.getSatisfyRequirementUsage(), GeneralViewWithTopNodesTestProjectData.GraphicalIds.SATISFY_REQUIREMENT_USAGE_ID), + Arguments.of("New Requirement", "New Reference Subsetting", SysmlPackage.eINSTANCE.getRequirementUsage(), GeneralViewWithTopNodesTestProjectData.GraphicalIds.REQUIREMENT_USAGE_ID), + Arguments.of("New Case", "New Reference Subsetting", SysmlPackage.eINSTANCE.getCaseUsage(), GeneralViewWithTopNodesTestProjectData.GraphicalIds.CASE_USAGE_ID), + Arguments.of("New Satisfy Requirement", "New Reference Subsetting", SysmlPackage.eINSTANCE.getSatisfyRequirementUsage(), GeneralViewWithTopNodesTestProjectData.GraphicalIds.SATISFY_REQUIREMENT_USAGE_ID) + ); + } + + @ParameterizedTest + @MethodSource("actorInheritanceParameters") + public void checkActorInheritanceWithSpecialization(String subclassifier, String specialization, EClass eClass, String baseElementNodeId) { + new ElementSpecializationInheritanceTestRunner() + .baseElementToInheritFromEClass(eClass) + .baseElementToInheritFromNodeId(baseElementNodeId) + .elementToInheritCreationToolName("New Actor") + .withEdgeExpected() + .withSelectedElementId("") + .elementToInheritExpectedListItemLabelText("actor1") + .compartmentName("actors") + .elementThatInheritFromBaseElementCreationToolName(subclassifier) + .elementThatInheritFromBaseElementEClass(eClass) + .specializationToolName(specialization) + .withSpecializationCreationExtraEdges(1) + .run(); + } + // when https://github.com/eclipse-syson/syson/issues/2393 will be fixed, ConcernXXX should be aligned with other elements. + // These arguments should be injected to actorInheritanceParameters + private static Stream actorInheritanceConcernParameters() { + return Stream.of( + 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) + ); + } + + // when https://github.com/eclipse-syson/syson/issues/2393 will be fixed, ConcernXXX should be aligned with other elements. + // This test could be removed since Concern tests will be covered by checkActorInheritanceWithSpecialization + @ParameterizedTest + @MethodSource("actorInheritanceConcernParameters") + public void checkActorInheritanceForConcernWithSpecialization(String subclassifier, String specialization, EClass eClass, String baseElementNodeId) { + new ElementSpecializationInheritanceTestRunner() + .baseElementToInheritFromEClass(eClass) + .baseElementToInheritFromNodeId(baseElementNodeId) + .elementToInheritCreationToolName("New Actor") + .withSelectedElementId("") + .elementToInheritExpectedListItemLabelText("actor1") + .compartmentName("actors") + .elementThatInheritFromBaseElementCreationToolName(subclassifier) + .elementThatInheritFromBaseElementEClass(eClass) + .specializationToolName(specialization) + .run(); + } + /** * This test runner verifies that creating a specializing relationship create inherited elements. * @@ -985,6 +1047,13 @@ private final class ElementSpecializationInheritanceTestRunner { */ private int withInnerBaseElementCreationExtraEdges; + /** + * Additional edges could be created when the specialization tool ({@code specializationToolName} is performed. + *

+ * For instance, when subclassification is created on a RequirementDefinition containing an actor an extra + *

+ */ + private int withSpecializationCreationExtraEdges; /** * The selected element required for the creation tool applied on the base element. */ @@ -1045,6 +1114,11 @@ public ElementSpecializationInheritanceTestRunner withInnerBaseElementCreationEx return this; } + public ElementSpecializationInheritanceTestRunner withSpecializationCreationExtraEdges(int extraEdgesExpected) { + this.withSpecializationCreationExtraEdges = extraEdgesExpected; + return this; + } + public ElementSpecializationInheritanceTestRunner withSelectedElementId(String selectedElementId) { this.selectedElementId = Optional.of(selectedElementId); return this; @@ -1171,10 +1245,14 @@ public void run() { // Check new created element inherits from the base element, and thus, contains a list item with '^' in its label Consumer createFeatureTypeDiagramConsumer = assertRefreshedDiagramThat(newDiagram -> { + var expectedNewEdgesCount = 1; // The specialization edge + if (this.withSpecializationCreationExtraEdges > 0) { + expectedNewEdgesCount += this.withSpecializationCreationExtraEdges; + } new CheckDiagramElementCount(GVCompartmentItemInheritanceTests.this.diagramComparator) .hasNewBorderNodeCount(0) .hasNewNodeCount(1) // The list item inherited from the base element - .hasNewEdgeCount(1) // The specialization edge + .hasNewEdgeCount(expectedNewEdgesCount) .check(diagram.get(), newDiagram); var parameterCompartment = new DiagramNavigator(newDiagram) 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 2e8de2346..2a504897f 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 @@ -151,11 +151,11 @@ public Boolean casePartUsage(PartUsage object) { } else if (this.isStakeholderReference()) { // We are dealing with a stakeholder // so the part usage is a stakeholder if and only if, it is contained by a StakeholderMembership - result = object.getOwningMembership() instanceof StakeholderMembership; + result = object.getOwningMembership() instanceof StakeholderMembership; } else if (this.isActorReference()) { // 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; + result = object.getOwningMembership() instanceof ActorMembership; } else { EClassifier eType = this.eReference.getEType(); EClass eClass = object.eClass(); diff --git a/backend/services/syson-model-services/src/main/java/org/eclipse/syson/model/services/aql/ModelQueryAQLService.java b/backend/services/syson-model-services/src/main/java/org/eclipse/syson/model/services/aql/ModelQueryAQLService.java index e98ceaad4..82ee2e9d8 100644 --- a/backend/services/syson-model-services/src/main/java/org/eclipse/syson/model/services/aql/ModelQueryAQLService.java +++ b/backend/services/syson-model-services/src/main/java/org/eclipse/syson/model/services/aql/ModelQueryAQLService.java @@ -28,6 +28,7 @@ import org.eclipse.syson.sysml.InterfaceDefinition; import org.eclipse.syson.sysml.Namespace; import org.eclipse.syson.sysml.PortUsage; +import org.eclipse.syson.sysml.PartUsage; import org.eclipse.syson.sysml.RequirementConstraintMembership; import org.eclipse.syson.sysml.TransitionUsage; import org.eclipse.syson.sysml.metamodel.services.MetamodelQueryElementService; @@ -160,4 +161,11 @@ public List getFramedConcerns(Namespace namespace) { public List getInterfaceEnds(InterfaceDefinition interfaceDefinition) { return this.metamodelQueryElementService.getInterfaceEnds(interfaceDefinition); } + + /** + * {@link MetamodelQueryElementService#getActors(Namespace)}. + */ + public List getActors(Namespace namespace) { + return this.metamodelQueryElementService.getActors(namespace); + } } diff --git a/backend/services/syson-sysml-metamodel-services/src/main/java/org/eclipse/syson/sysml/metamodel/services/MetamodelQueryElementService.java b/backend/services/syson-sysml-metamodel-services/src/main/java/org/eclipse/syson/sysml/metamodel/services/MetamodelQueryElementService.java index 88ff30b5a..c6858a2fa 100644 --- a/backend/services/syson-sysml-metamodel-services/src/main/java/org/eclipse/syson/sysml/metamodel/services/MetamodelQueryElementService.java +++ b/backend/services/syson-sysml-metamodel-services/src/main/java/org/eclipse/syson/sysml/metamodel/services/MetamodelQueryElementService.java @@ -23,6 +23,8 @@ import org.eclipse.syson.sysml.ActorMembership; import org.eclipse.syson.sysml.AllocationUsage; import org.eclipse.syson.sysml.BooleanExpression; +import org.eclipse.syson.sysml.CaseDefinition; +import org.eclipse.syson.sysml.CaseUsage; import org.eclipse.syson.sysml.ConcernUsage; import org.eclipse.syson.sysml.Connector; import org.eclipse.syson.sysml.ConstraintUsage; @@ -541,4 +543,37 @@ public List getInterfaceEnds(InterfaceDefinition interfaceDefinition) .forEach(interfaceEnds::add); return interfaceEnds; } + + /** + * Retrieves actors of the given element. + *

+ * The {@link CaseDefinition#getActorParameter()}, {@link CaseUsage#getActorParameter()}, + * {@link RequirementDefinition#getActorParameter()} and {@link RequirementUsage#getActorParameter()} + * * are not suitable because they collect inherited actors as well as owned ones. + * * We are only looking for directly owned actors of the given element. + *

+ * + * @param namespace + * an element that could own an actor. + * It could be {@link CaseDefinition}, {@link CaseUsage}, {@link RequirementDefinition} or {@link RequirementUsage}. + * @return the list of actor owned by the given element. + */ + public List getActors(Namespace namespace) { + List actors = new ArrayList<>(); + if (this.canContainActor(namespace)) { + namespace.getOwnedRelationship().stream() + .filter(ActorMembership.class::isInstance) + .map(ActorMembership.class::cast) + .map(ActorMembership::getOwnedActorParameter) + .forEach(actors::add); + } + return actors; + } + + private boolean canContainActor(Namespace namespace) { + return namespace instanceof CaseDefinition || + namespace instanceof CaseUsage || + namespace instanceof RequirementDefinition || + namespace instanceof RequirementUsage; + } } 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 01f9409da..39d85471a 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 @@ -114,6 +114,7 @@ import org.eclipse.syson.standard.diagrams.view.nodes.ActionItemNodeDescriptionProvider; import org.eclipse.syson.standard.diagrams.view.nodes.ActionUsageParametersCompartmentNodeDescriptionProvider; import org.eclipse.syson.standard.diagrams.view.nodes.ActorNodeDescriptionProvider; +import org.eclipse.syson.standard.diagrams.view.nodes.ActorsCompartmentItemNodeDescriptionProvider; import org.eclipse.syson.standard.diagrams.view.nodes.AllocationDefinitionEndsCompartmentItemNodeDescriptionProvider; import org.eclipse.syson.standard.diagrams.view.nodes.AllocationDefinitionEndsCompartmentNodeDescriptionProvider; import org.eclipse.syson.standard.diagrams.view.nodes.CaseDefinitionActorsCompartmentNodeDescriptionProvider; @@ -245,8 +246,8 @@ public class SDVDiagramDescriptionProvider implements IRepresentationDescription Map.entry(SysmlPackage.eINSTANCE.getPerformActionUsage(), List.of(SysmlPackage.eINSTANCE.getElement_Documentation(), SysmlPackage.eINSTANCE.getUsage_NestedItem(), SysmlPackage.eINSTANCE.getUsage_NestedAction())), Map.entry(SysmlPackage.eINSTANCE.getPortDefinition(), List.of(SysmlPackage.eINSTANCE.getElement_Documentation(), SysmlPackage.eINSTANCE.getDefinition_OwnedAttribute(), SysmlPackage.eINSTANCE.getDefinition_OwnedPort(), SysmlPackage.eINSTANCE.getDefinition_OwnedReference(), SysmlPackage.eINSTANCE.getDefinition_OwnedItem())), Map.entry(SysmlPackage.eINSTANCE.getPortUsage(), List.of(SysmlPackage.eINSTANCE.getElement_Documentation(), SysmlPackage.eINSTANCE.getUsage_NestedAttribute(), SysmlPackage.eINSTANCE.getUsage_NestedReference(), SysmlPackage.eINSTANCE.getUsage_NestedPort(), SysmlPackage.eINSTANCE.getUsage_NestedItem())), - Map.entry(SysmlPackage.eINSTANCE.getRequirementDefinition(), List.of(SysmlPackage.eINSTANCE.getElement_Documentation(), SysmlPackage.eINSTANCE.getDefinition_OwnedAttribute(), SysmlPackage.eINSTANCE.getRequirementUsage_ActorParameter(), SysmlPackage.eINSTANCE.getDefinition_OwnedRequirement())), - Map.entry(SysmlPackage.eINSTANCE.getRequirementUsage(), List.of(SysmlPackage.eINSTANCE.getElement_Documentation(), SysmlPackage.eINSTANCE.getUsage_NestedAttribute(), SysmlPackage.eINSTANCE.getRequirementUsage_ActorParameter(), SysmlPackage.eINSTANCE.getUsage_NestedPort())), + Map.entry(SysmlPackage.eINSTANCE.getRequirementDefinition(), List.of(SysmlPackage.eINSTANCE.getElement_Documentation(), SysmlPackage.eINSTANCE.getDefinition_OwnedAttribute(), SysmlPackage.eINSTANCE.getDefinition_OwnedRequirement())), + Map.entry(SysmlPackage.eINSTANCE.getRequirementUsage(), List.of(SysmlPackage.eINSTANCE.getElement_Documentation(), SysmlPackage.eINSTANCE.getUsage_NestedAttribute(), SysmlPackage.eINSTANCE.getUsage_NestedPort())), Map.entry(SysmlPackage.eINSTANCE.getSatisfyRequirementUsage(), List.of(SysmlPackage.eINSTANCE.getElement_Documentation(), SysmlPackage.eINSTANCE.getUsage_NestedAttribute(), SysmlPackage.eINSTANCE.getRequirementUsage_AssumedConstraint(), SysmlPackage.eINSTANCE.getRequirementUsage_RequiredConstraint(), SysmlPackage.eINSTANCE.getUsage_NestedPort())), Map.entry(SysmlPackage.eINSTANCE.getStateDefinition(), List.of(SysmlPackage.eINSTANCE.getElement_Documentation(), SysmlPackage.eINSTANCE.getDefinition_OwnedAction(), SysmlPackage.eINSTANCE.getDefinition_OwnedState())), Map.entry(SysmlPackage.eINSTANCE.getStateUsage(), List.of(SysmlPackage.eINSTANCE.getElement_Documentation(), SysmlPackage.eINSTANCE.getUsage_NestedAction(), SysmlPackage.eINSTANCE.getUsage_NestedState())), @@ -895,31 +896,34 @@ private List> createCompartmentsForSubject private List> createCompartmentsForActorParameter(IColorProvider colorProvider) { final List> compartmentNodeDescriptionProviders = new ArrayList<>(); + // CaseDefinition compartmentNodeDescriptionProviders.add(new CaseDefinitionActorsCompartmentNodeDescriptionProvider(colorProvider, this.getDescriptionNameGenerator())); - compartmentNodeDescriptionProviders - .add(new CompartmentItemNodeDescriptionProvider(SysmlPackage.eINSTANCE.getCaseDefinition(), SysmlPackage.eINSTANCE.getCaseDefinition_ActorParameter(), colorProvider, - this.getDescriptionNameGenerator())); + compartmentNodeDescriptionProviders.add(new ActorsCompartmentItemNodeDescriptionProvider(SysmlPackage.eINSTANCE.getCaseDefinition(), SysmlPackage.eINSTANCE.getCaseDefinition_ActorParameter(), colorProvider, this.getDescriptionNameGenerator())); + compartmentNodeDescriptionProviders.add(new InheritedCompartmentItemNodeDescriptionProvider(SysmlPackage.eINSTANCE.getCaseDefinition(), SysmlPackage.eINSTANCE.getCaseDefinition_ActorParameter(), colorProvider, this.getDescriptionNameGenerator())); + // CaseUsage compartmentNodeDescriptionProviders.add(new CaseUsageActorsCompartmentNodeDescriptionProvider(colorProvider, this.getDescriptionNameGenerator())); - compartmentNodeDescriptionProviders.add(new CompartmentItemNodeDescriptionProvider(SysmlPackage.eINSTANCE.getCaseUsage(), SysmlPackage.eINSTANCE.getCaseUsage_ActorParameter(), colorProvider, - this.getDescriptionNameGenerator())); - compartmentNodeDescriptionProviders.add(new RequirementDefinitionActorsCompartmentNodeDescriptionProvider(SysmlPackage.eINSTANCE.getConcernDefinition(), - SysmlPackage.eINSTANCE.getRequirementDefinition_ActorParameter(), colorProvider, this.getDescriptionNameGenerator())); - compartmentNodeDescriptionProviders.add(new CompartmentItemNodeDescriptionProvider(SysmlPackage.eINSTANCE.getConcernDefinition(), - SysmlPackage.eINSTANCE.getRequirementDefinition_ActorParameter(), colorProvider, this.getDescriptionNameGenerator())); - compartmentNodeDescriptionProviders.add(new RequirementUsageActorsCompartmentNodeDescriptionProvider(SysmlPackage.eINSTANCE.getConcernUsage(), - SysmlPackage.eINSTANCE.getRequirementUsage_ActorParameter(), colorProvider, this.getDescriptionNameGenerator())); - compartmentNodeDescriptionProviders.add(new RequirementUsageActorsCompartmentNodeDescriptionProvider(SysmlPackage.eINSTANCE.getSatisfyRequirementUsage(), - SysmlPackage.eINSTANCE.getRequirementUsage_ActorParameter(), colorProvider, this.getDescriptionNameGenerator())); - compartmentNodeDescriptionProviders.add(new CompartmentItemNodeDescriptionProvider(SysmlPackage.eINSTANCE.getConcernUsage(), - SysmlPackage.eINSTANCE.getRequirementUsage_ActorParameter(), colorProvider, this.getDescriptionNameGenerator())); - compartmentNodeDescriptionProviders.add(new CompartmentItemNodeDescriptionProvider(SysmlPackage.eINSTANCE.getSatisfyRequirementUsage(), - SysmlPackage.eINSTANCE.getRequirementUsage_ActorParameter(), colorProvider, this.getDescriptionNameGenerator())); + compartmentNodeDescriptionProviders.add(new ActorsCompartmentItemNodeDescriptionProvider(SysmlPackage.eINSTANCE.getCaseUsage(), SysmlPackage.eINSTANCE.getCaseUsage_ActorParameter(), colorProvider, this.getDescriptionNameGenerator())); + compartmentNodeDescriptionProviders.add(new InheritedCompartmentItemNodeDescriptionProvider(SysmlPackage.eINSTANCE.getCaseUsage(), SysmlPackage.eINSTANCE.getCaseUsage_ActorParameter(), colorProvider, this.getDescriptionNameGenerator())); + // ConcernDefinition + compartmentNodeDescriptionProviders.add(new RequirementDefinitionActorsCompartmentNodeDescriptionProvider(SysmlPackage.eINSTANCE.getConcernDefinition(), SysmlPackage.eINSTANCE.getRequirementDefinition_ActorParameter(), colorProvider, this.getDescriptionNameGenerator())); + compartmentNodeDescriptionProviders.add(new ActorsCompartmentItemNodeDescriptionProvider(SysmlPackage.eINSTANCE.getConcernDefinition(), SysmlPackage.eINSTANCE.getRequirementDefinition_ActorParameter(), colorProvider, this.getDescriptionNameGenerator())); + compartmentNodeDescriptionProviders.add(new InheritedCompartmentItemNodeDescriptionProvider(SysmlPackage.eINSTANCE.getConcernDefinition(), SysmlPackage.eINSTANCE.getRequirementDefinition_ActorParameter(), colorProvider, this.getDescriptionNameGenerator())); + // ConcernUsage + compartmentNodeDescriptionProviders.add(new RequirementUsageActorsCompartmentNodeDescriptionProvider(SysmlPackage.eINSTANCE.getConcernUsage(), SysmlPackage.eINSTANCE.getRequirementUsage_ActorParameter(), colorProvider, this.getDescriptionNameGenerator())); + compartmentNodeDescriptionProviders.add(new ActorsCompartmentItemNodeDescriptionProvider(SysmlPackage.eINSTANCE.getConcernUsage(), SysmlPackage.eINSTANCE.getRequirementUsage_ActorParameter(), colorProvider, this.getDescriptionNameGenerator())); + compartmentNodeDescriptionProviders.add(new InheritedCompartmentItemNodeDescriptionProvider(SysmlPackage.eINSTANCE.getConcernUsage(), SysmlPackage.eINSTANCE.getRequirementUsage_ActorParameter(), colorProvider, this.getDescriptionNameGenerator())); + // SatisfyRequirementUsage + compartmentNodeDescriptionProviders.add(new RequirementUsageActorsCompartmentNodeDescriptionProvider(SysmlPackage.eINSTANCE.getSatisfyRequirementUsage(), SysmlPackage.eINSTANCE.getRequirementUsage_ActorParameter(), colorProvider, this.getDescriptionNameGenerator())); + compartmentNodeDescriptionProviders.add(new ActorsCompartmentItemNodeDescriptionProvider(SysmlPackage.eINSTANCE.getSatisfyRequirementUsage(), SysmlPackage.eINSTANCE.getRequirementUsage_ActorParameter(), colorProvider, this.getDescriptionNameGenerator())); + compartmentNodeDescriptionProviders.add(new InheritedCompartmentItemNodeDescriptionProvider(SysmlPackage.eINSTANCE.getSatisfyRequirementUsage(), SysmlPackage.eINSTANCE.getRequirementUsage_ActorParameter(), colorProvider, this.getDescriptionNameGenerator())); + // RequirementDefinition compartmentNodeDescriptionProviders.add(new RequirementDefinitionActorsCompartmentNodeDescriptionProvider(colorProvider, this.getDescriptionNameGenerator())); - compartmentNodeDescriptionProviders.add(new CompartmentItemNodeDescriptionProvider(SysmlPackage.eINSTANCE.getRequirementDefinition(), - SysmlPackage.eINSTANCE.getRequirementDefinition_ActorParameter(), colorProvider, this.getDescriptionNameGenerator())); + compartmentNodeDescriptionProviders.add(new ActorsCompartmentItemNodeDescriptionProvider(SysmlPackage.eINSTANCE.getRequirementDefinition(), SysmlPackage.eINSTANCE.getRequirementDefinition_ActorParameter(), colorProvider, this.getDescriptionNameGenerator())); + compartmentNodeDescriptionProviders.add(new InheritedCompartmentItemNodeDescriptionProvider(SysmlPackage.eINSTANCE.getRequirementDefinition(), SysmlPackage.eINSTANCE.getRequirementDefinition_ActorParameter(), colorProvider, this.getDescriptionNameGenerator())); + // RequirementUsage compartmentNodeDescriptionProviders.add(new RequirementUsageActorsCompartmentNodeDescriptionProvider(colorProvider, this.getDescriptionNameGenerator())); - compartmentNodeDescriptionProviders.add(new CompartmentItemNodeDescriptionProvider(SysmlPackage.eINSTANCE.getRequirementUsage(), SysmlPackage.eINSTANCE.getRequirementUsage_ActorParameter(), - colorProvider, this.getDescriptionNameGenerator())); + compartmentNodeDescriptionProviders.add(new ActorsCompartmentItemNodeDescriptionProvider(SysmlPackage.eINSTANCE.getRequirementUsage(), SysmlPackage.eINSTANCE.getRequirementUsage_ActorParameter(), colorProvider, this.getDescriptionNameGenerator())); + compartmentNodeDescriptionProviders.add(new InheritedCompartmentItemNodeDescriptionProvider(SysmlPackage.eINSTANCE.getRequirementUsage(), SysmlPackage.eINSTANCE.getRequirementUsage_ActorParameter(), colorProvider, this.getDescriptionNameGenerator())); return compartmentNodeDescriptionProviders; } diff --git a/backend/views/syson-standard-diagrams-view/src/main/java/org/eclipse/syson/standard/diagrams/view/nodes/ActorsCompartmentItemNodeDescriptionProvider.java b/backend/views/syson-standard-diagrams-view/src/main/java/org/eclipse/syson/standard/diagrams/view/nodes/ActorsCompartmentItemNodeDescriptionProvider.java new file mode 100644 index 000000000..dc45ef748 --- /dev/null +++ b/backend/views/syson-standard-diagrams-view/src/main/java/org/eclipse/syson/standard/diagrams/view/nodes/ActorsCompartmentItemNodeDescriptionProvider.java @@ -0,0 +1,44 @@ +/******************************************************************************* + * Copyright (c) 2026 Obeo. + * This program and the accompanying materials + * are made available under the terms of the Eclipse Public License v2.0 + * which accompanies this distribution, and is available at + * https://www.eclipse.org/legal/epl-2.0/ + * + * SPDX-License-Identifier: EPL-2.0 + * + * Contributors: + * Obeo - initial API and implementation + *******************************************************************************/ + +package org.eclipse.syson.standard.diagrams.view.nodes; + +import org.eclipse.emf.ecore.EClass; +import org.eclipse.emf.ecore.EReference; +import org.eclipse.sirius.components.view.builder.providers.IColorProvider; +import org.eclipse.syson.diagram.common.view.nodes.CompartmentItemNodeDescriptionProvider; +import org.eclipse.syson.model.services.aql.ModelQueryAQLService; +import org.eclipse.syson.util.IDescriptionNameGenerator; +import org.eclipse.syson.util.ServiceMethod; + +/** + * Used to create the actors compartment item node description. + *

+ * Generic {@link CompartmentItemNodeDescriptionProvider} cannot be used for those compartments due to implementation of actors getters + * (the references of kind {@code SysmlPackage.eINSTANCE.getXXX_ActorParameter()}). These getters collect owned actors *and* inherited ones + * which is not suitable since we want to handle them separately. + *

+ * @author Jerome Gout + */ +public class ActorsCompartmentItemNodeDescriptionProvider extends CompartmentItemNodeDescriptionProvider { + + public ActorsCompartmentItemNodeDescriptionProvider(EClass eClass, EReference eReference, + IColorProvider colorProvider, IDescriptionNameGenerator descriptionNameGenerator) { + super(eClass, eReference, colorProvider, descriptionNameGenerator); + } + + @Override + protected String getSemanticCandidateExpression() { + return ServiceMethod.of0(ModelQueryAQLService::getActors).aqlSelf(); + } +} 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 4592f3b1e..90be68c5f 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 @@ -14,6 +14,14 @@ ** Add support of stakeholder inheritance in _stakeholders_ compartments of `RequirementUsage` and `RequirementDefinition` graphical nodes. ** Add support of `SatisfyRequirementUsage` inheritance in _satisfy requirements_ compartment of `PartUsage` and `PartDefinition` graphical nodes. ** Add support of objective requirement inheritance in _objective_ compartments of `CaseUsage` and `CaseDefinition` graphical nodes. +** 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` * In textual import/export: