diff --git a/CHANGELOG.adoc b/CHANGELOG.adoc index 8a04b2596..e76caa3a0 100644 --- a/CHANGELOG.adoc +++ b/CHANGELOG.adoc @@ -79,6 +79,7 @@ This removes Rollup warnings about missing global names for externalized peer de - https://github.com/eclipse-syson/syson/issues/2453[#2453] [diagrams] Add the Show/Hide section and associated tools to the group palette. - https://github.com/eclipse-syson/syson/issues/2463[#2463] [details] Export `ExpressionPropertySection`. This lets downstream applications with a custom extension registry display the _Expression value_ property section in the _Details_ view. +- https://github.com/eclipse-syson/syson/issues/2441[#2441] [services] Refactor `DiagramMutationElementService#createAllocateEdge` to extract semantic creation from diagram service. === New features diff --git a/backend/services/syson-diagram-services/src/main/java/org/eclipse/syson/diagram/services/DiagramMutationElementService.java b/backend/services/syson-diagram-services/src/main/java/org/eclipse/syson/diagram/services/DiagramMutationElementService.java index 053e7446a..46b107989 100644 --- a/backend/services/syson-diagram-services/src/main/java/org/eclipse/syson/diagram/services/DiagramMutationElementService.java +++ b/backend/services/syson-diagram-services/src/main/java/org/eclipse/syson/diagram/services/DiagramMutationElementService.java @@ -751,17 +751,12 @@ public IncludeUseCaseUsage createIncludeUseCaseUsage(UseCaseUsage source, UseCas * the current editing context * @param diagramService * the current diagram service - * @return the given source element + * @return the created {@link AllocationUsage} */ - public Element createAllocateEdge(Element source, Element target, Node sourceNode, IEditingContext editingContext, IDiagramService diagramService) { - var owner = source.getOwner(); - var ownerMembership = SysmlFactory.eINSTANCE.createOwningMembership(); - owner.getOwnedRelationship().add(ownerMembership); - var allocation = SysmlFactory.eINSTANCE.createAllocationUsage(); - ownerMembership.getOwnedRelatedElement().add(allocation); - this.addEndToAllocateEdge(allocation, source); - this.addEndToAllocateEdge(allocation, target); - return source; + public AllocationUsage createAllocateEdge(Element source, Element target, Node sourceNode, IEditingContext editingContext, IDiagramService diagramService) { + var allocateEdge = this.metamodelMutationElementService.createAllocateEdge(source, target); + this.metamodelMutationElementService.initialize(allocateEdge); + return allocateEdge; } /** @@ -838,18 +833,6 @@ public Element reconnectSourceAllocateEdge(AllocationUsage allocationUsage, Elem return allocationUsage; } - private void addEndToAllocateEdge(AllocationUsage edge, Element end) { - if (end instanceof Usage usage) { - var featureMembership = SysmlFactory.eINSTANCE.createEndFeatureMembership(); - edge.getOwnedRelationship().add(featureMembership); - var feature = SysmlFactory.eINSTANCE.createFeature(); - featureMembership.getOwnedRelatedElement().add(feature); - var reference = SysmlFactory.eINSTANCE.createReferenceSubsetting(); - feature.getOwnedRelationship().add(reference); - reference.setReferencedFeature(usage); - } - } - /** * Reconnects the target of an allocate edge. * diff --git a/backend/services/syson-sysml-metamodel-services/src/main/java/org/eclipse/syson/sysml/metamodel/services/MetamodelMutationElementService.java b/backend/services/syson-sysml-metamodel-services/src/main/java/org/eclipse/syson/sysml/metamodel/services/MetamodelMutationElementService.java index d099513a3..0f12085da 100644 --- a/backend/services/syson-sysml-metamodel-services/src/main/java/org/eclipse/syson/sysml/metamodel/services/MetamodelMutationElementService.java +++ b/backend/services/syson-sysml-metamodel-services/src/main/java/org/eclipse/syson/sysml/metamodel/services/MetamodelMutationElementService.java @@ -18,6 +18,7 @@ import org.eclipse.emf.ecore.EObject; import org.eclipse.emf.ecore.EReference; import org.eclipse.emf.ecore.EStructuralFeature; +import org.eclipse.syson.sysml.AllocationUsage; import org.eclipse.syson.sysml.BindingConnectorAsUsage; import org.eclipse.syson.sysml.ConnectionUsage; import org.eclipse.syson.sysml.Connector; @@ -48,6 +49,7 @@ import org.eclipse.syson.sysml.SysmlFactory; import org.eclipse.syson.sysml.SysmlPackage; import org.eclipse.syson.sysml.Type; +import org.eclipse.syson.sysml.Usage; /** * Element-related services doing mutations. This class should not depend on sirius-web services or other spring @@ -386,6 +388,38 @@ public Documentation createObjectiveDocumentation(Element element, String refere return null; } + /** + * Creates an allocate edge between the given source and target. + * + * @param source + * the source of the allocate edge + * @param target + * the target of the allocate edge + * @return the created {@link AllocationUsage} + */ + public AllocationUsage createAllocateEdge(Element source, Element target) { + var owner = source.getOwner(); + var ownerMembership = SysmlFactory.eINSTANCE.createOwningMembership(); + owner.getOwnedRelationship().add(ownerMembership); + var allocation = SysmlFactory.eINSTANCE.createAllocationUsage(); + ownerMembership.getOwnedRelatedElement().add(allocation); + this.addEndToAllocateEdge(allocation, source); + this.addEndToAllocateEdge(allocation, target); + return allocation; + } + + private void addEndToAllocateEdge(AllocationUsage edge, Element end) { + if (end instanceof Usage usage) { + var featureMembership = SysmlFactory.eINSTANCE.createEndFeatureMembership(); + edge.getOwnedRelationship().add(featureMembership); + var feature = SysmlFactory.eINSTANCE.createFeature(); + featureMembership.getOwnedRelatedElement().add(feature); + var reference = SysmlFactory.eINSTANCE.createReferenceSubsetting(); + feature.getOwnedRelationship().add(reference); + reference.setReferencedFeature(usage); + } + } + private Feature addConnectorEnd(Connector connector, Feature end, Element endContainer, Element connectorContainer, FeatureDirectionKind defaultDirection) { List sourceFeaturePath = List.of(); // This code will not work to connect inherited non redefined feature. diff --git a/backend/services/syson-sysml-metamodel-services/src/test/java/org/eclipse/syson/sysml/metamodel/services/MetamodelMutationElementServiceTest.java b/backend/services/syson-sysml-metamodel-services/src/test/java/org/eclipse/syson/sysml/metamodel/services/MetamodelMutationElementServiceTest.java index 8d576c497..35227b067 100644 --- a/backend/services/syson-sysml-metamodel-services/src/test/java/org/eclipse/syson/sysml/metamodel/services/MetamodelMutationElementServiceTest.java +++ b/backend/services/syson-sysml-metamodel-services/src/test/java/org/eclipse/syson/sysml/metamodel/services/MetamodelMutationElementServiceTest.java @@ -18,6 +18,7 @@ import java.util.List; import java.util.Objects; +import org.eclipse.syson.sysml.AllocationUsage; import org.eclipse.syson.sysml.ConnectionUsage; import org.eclipse.syson.sysml.Element; import org.eclipse.syson.sysml.FeatureDirectionKind; @@ -26,6 +27,7 @@ import org.eclipse.syson.sysml.MetadataUsage; import org.eclipse.syson.sysml.OwningMembership; import org.eclipse.syson.sysml.Package; +import org.eclipse.syson.sysml.PartUsage; import org.eclipse.syson.sysml.ReferenceUsage; import org.eclipse.syson.sysml.RequirementUsage; import org.eclipse.syson.sysml.SysmlFactory; @@ -188,6 +190,22 @@ public void createFlowUsageBetweenFeatureWithoutDirection() { assertThat(targetFlow).isEqualTo(target); } + @Test + @DisplayName("GIVEN two PartUsage, WHEN creating an allocate edge, then an AllocationUsage is created with the correct ends") + public void createAllocateEdge() { + Package parentPackage = SysmlFactory.eINSTANCE.createPackage(); + PartUsage partUsage1 = SysmlFactory.eINSTANCE.createPartUsage(); + this.mutationService.addChildInParent(parentPackage, partUsage1); + PartUsage partUsage2 = SysmlFactory.eINSTANCE.createPartUsage(); + this.mutationService.addChildInParent(parentPackage, partUsage2); + AllocationUsage allocationUsage = this.mutationService.createAllocateEdge(partUsage1, partUsage2); + assertThat(allocationUsage).isNotNull(); + assertThat(allocationUsage.getFeature()) + .hasSize(2) + .anySatisfy(feature -> assertThat(feature.getOwnedReferenceSubsetting().getReferencedFeature()).isEqualTo(partUsage1)) + .anySatisfy(feature -> assertThat(feature.getOwnedReferenceSubsetting().getReferencedFeature()).isEqualTo(partUsage2)); + } + private RequirementUsage createRequirement(String name) { RequirementUsage requirement = SysmlFactory.eINSTANCE.createRequirementUsage(); requirement.setDeclaredName(name);