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: