diff --git a/CHANGELOG.adoc b/CHANGELOG.adoc index 97eb88da9..42a85d572 100644 --- a/CHANGELOG.adoc +++ b/CHANGELOG.adoc @@ -31,6 +31,7 @@ This fix ensure that imported models containing, for example, a top-level `LibraryPackage` and a top-level `Comment` is correctly displayed under the _User libraries_ directory. - https://github.com/eclipse-syson/syson/issues/1751[#1751] [diagrams] Make `Interconnection` compartment growable. - https://github.com/eclipse-syson/syson/issues/1763[#1763] [diagrams] Fix an issue where, in the diagrams, the creation of an `Element` inside a `sub-Package` created two graphical nodes instead of one. +- https://github.com/eclipse-syson/syson/issues/1788[#1788] [services] New `Expose` elements now have `visibility` set to _protected_ and have `isImportAll` set to _true_, as required by the SysMLv2 specification, chapter `8.3.26.2 Expose`. === Improvements 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 e77e58e62..2585170ef 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 @@ -124,7 +124,8 @@ public Element viewNodeAs(Element element, String newViewDefinition, IEditingCon var newViewUsage = SysmlFactory.eINSTANCE.createViewUsage(); var newViewUsageMembership = this.metamodelMutationElementService.createMembership(viewUsageContainer); newViewUsageMembership.getOwnedRelatedElement().add(newViewUsage); - new ElementInitializerSwitch().doSwitch(newViewUsage); + var elementInitializerSwitch = new ElementInitializerSwitch(); + elementInitializerSwitch.doSwitch(newViewUsage); this.modelMutationElementService.setAsView(newViewUsage, newViewDefinition); // 2 - move the element and its children from the existingViewUsage to new newViewUsage @@ -139,12 +140,14 @@ public Element viewNodeAs(Element element, String newViewDefinition, IEditingCon var membershipExpose = SysmlFactory.eINSTANCE.createMembershipExpose(); membershipExpose.setImportedMembership(newViewUsage.getOwningMembership()); existingViewUsage.getOwnedRelationship().add(membershipExpose); + elementInitializerSwitch.doSwitch(membershipExpose); } // 4 - expose the element and its sub elements previously exposed in the existingViewUsage in the // newViewUsage var membershipExpose = SysmlFactory.eINSTANCE.createMembershipExpose(); membershipExpose.setImportedMembership(element.getOwningMembership()); newViewUsage.getOwnedRelationship().add(membershipExpose); + elementInitializerSwitch.doSwitch(membershipExpose); return newViewUsage; } diff --git a/backend/services/syson-diagram-services/src/main/java/org/eclipse/syson/diagram/services/DiagramMutationExposeService.java b/backend/services/syson-diagram-services/src/main/java/org/eclipse/syson/diagram/services/DiagramMutationExposeService.java index 8755d40a7..76a32fc33 100644 --- a/backend/services/syson-diagram-services/src/main/java/org/eclipse/syson/diagram/services/DiagramMutationExposeService.java +++ b/backend/services/syson-diagram-services/src/main/java/org/eclipse/syson/diagram/services/DiagramMutationExposeService.java @@ -31,6 +31,7 @@ import org.eclipse.sirius.components.diagrams.events.HideDiagramElementEvent; import org.eclipse.syson.model.services.ModelQueryElementService; import org.eclipse.syson.services.DeleteService; +import org.eclipse.syson.services.ElementInitializerSwitch; import org.eclipse.syson.services.NodeDescriptionService; import org.eclipse.syson.services.UtilService; import org.eclipse.syson.services.api.SiriusWebCoreServices; @@ -132,6 +133,7 @@ public Element expose(Element element, IEditingContext editingContext, DiagramCo var membershipExpose = SysmlFactory.eINSTANCE.createMembershipExpose(); membershipExpose.setImportedMembership(element.getOwningMembership()); viewUsage.getOwnedRelationship().add(membershipExpose); + new ElementInitializerSwitch().doSwitch(membershipExpose); // if it is the General View, we want to hide tree elements if a compartment containing the same // element is displayed or it is displayed as border node if (selectedNode != null && ViewDefinitionKind.isGeneralView(this.utilService.getViewDefinitionKind(element, List.of(), editingContext))) { @@ -180,6 +182,7 @@ public Element addToExposedElements(Element element, boolean recursive, IEditing var membershipExpose = SysmlFactory.eINSTANCE.createMembershipExpose(); membershipExpose.setImportedMembership(childElement.getOwningMembership()); viewUsage.getOwnedRelationship().add(membershipExpose); + new ElementInitializerSwitch().doSwitch(membershipExpose); if (recursive) { membershipExpose.setIsRecursive(true); } diff --git a/backend/services/syson-services/src/main/java/org/eclipse/syson/services/ElementInitializerSwitch.java b/backend/services/syson-services/src/main/java/org/eclipse/syson/services/ElementInitializerSwitch.java index 8c5e2f002..d9eb7f318 100644 --- a/backend/services/syson-services/src/main/java/org/eclipse/syson/services/ElementInitializerSwitch.java +++ b/backend/services/syson-services/src/main/java/org/eclipse/syson/services/ElementInitializerSwitch.java @@ -26,6 +26,7 @@ import org.eclipse.syson.sysml.Documentation; import org.eclipse.syson.sysml.Element; import org.eclipse.syson.sysml.EnumerationDefinition; +import org.eclipse.syson.sysml.Expose; import org.eclipse.syson.sysml.FeatureDirectionKind; import org.eclipse.syson.sysml.FeatureTyping; import org.eclipse.syson.sysml.FlowUsage; @@ -56,6 +57,7 @@ import org.eclipse.syson.sysml.UseCaseUsage; import org.eclipse.syson.sysml.ViewDefinition; import org.eclipse.syson.sysml.ViewUsage; +import org.eclipse.syson.sysml.VisibilityKind; import org.eclipse.syson.sysml.util.ElementUtil; import org.eclipse.syson.sysml.util.SysmlSwitch; import org.eclipse.syson.util.StandardDiagramsConstants; @@ -156,6 +158,13 @@ public Element caseFlowUsage(FlowUsage object) { return object; } + @Override + public Element caseExpose(Expose object) { + object.setVisibility(VisibilityKind.PROTECTED); + object.setIsImportAll(true); + return object; + } + @Override public Element casePackage(Package object) { var existingElements = this.existingElementsCount(object); diff --git a/backend/services/syson-services/src/test/java/org/eclipse/syson/services/ElementInitializerSwitchTest.java b/backend/services/syson-services/src/test/java/org/eclipse/syson/services/ElementInitializerSwitchTest.java index 0796dfcef..6bbcc442f 100644 --- a/backend/services/syson-services/src/test/java/org/eclipse/syson/services/ElementInitializerSwitchTest.java +++ b/backend/services/syson-services/src/test/java/org/eclipse/syson/services/ElementInitializerSwitchTest.java @@ -29,6 +29,7 @@ import org.eclipse.syson.sysml.SysmlPackage; import org.eclipse.syson.sysml.ViewDefinition; import org.eclipse.syson.sysml.ViewUsage; +import org.eclipse.syson.sysml.VisibilityKind; import org.eclipse.syson.sysml.util.ElementUtil; import org.eclipse.syson.util.StandardDiagramsConstants; import org.junit.jupiter.api.BeforeEach; @@ -98,6 +99,22 @@ public void testEnumerationDefinitionDefaultName() { assertThat(initializedED2.getDeclaredName()).isEqualTo("EnumerationDefinition2"); } + @DisplayName("GIVEN an Expose, WHEN it is initialized, THEN it's visibility is protected and isImportAll is true") + @Test + public void testExposeVisibility() { + var root = SysmlFactory.eINSTANCE.createPackage(); + this.resource.getContents().add(root); + root.setDeclaredName(ROOT); + var vu1 = SysmlFactory.eINSTANCE.createViewUsage(); + this.addInParent(vu1, root); + var e1 = SysmlFactory.eINSTANCE.createMembershipExpose(); + this.addInParent(e1, root); + this.elementInitializerSwitch.doSwitch(e1); + assertThat(e1.getVisibility()).isEqualTo(VisibilityKind.PROTECTED); + assertThat(e1.isIsImportAll()).isTrue(); + + } + @DisplayName("GIVEN a Package, WHEN it is initialized, THEN it's name contains the count of the same kind of elements") @Test public void testPackageDefaultName() { diff --git a/backend/views/syson-table-requirements-view/src/main/java/org/eclipse/syson/table/requirements/view/dto/CreateRequirementEventHandler.java b/backend/views/syson-table-requirements-view/src/main/java/org/eclipse/syson/table/requirements/view/dto/CreateRequirementEventHandler.java index 614d0b08b..b68504e7d 100644 --- a/backend/views/syson-table-requirements-view/src/main/java/org/eclipse/syson/table/requirements/view/dto/CreateRequirementEventHandler.java +++ b/backend/views/syson-table-requirements-view/src/main/java/org/eclipse/syson/table/requirements/view/dto/CreateRequirementEventHandler.java @@ -130,11 +130,13 @@ private boolean createRequirement(IEditingContext editingContext, ViewUsage view if (optMembershipEClass.isPresent()) { var newMembership = SysmlFactory.eINSTANCE.create(optMembershipEClass.get()); if (newMembership instanceof Membership membership) { + var elementInitializerSwitch = new ElementInitializerSwitch(); owningNamespace.getOwnedRelationship().add(membership); membership.getOwnedRelatedElement().add(newRequirementUsage); - new ElementInitializerSwitch().caseRequirementUsage(newRequirementUsage); + elementInitializerSwitch.doSwitch(newRequirementUsage); var membershipExpose = SysmlFactory.eINSTANCE.createMembershipExpose(); viewUsage.getOwnedRelationship().add(membershipExpose); + elementInitializerSwitch.doSwitch(membership); membershipExpose.setImportedMembership(membership); return true; } diff --git a/backend/views/syson-table-requirements-view/src/main/java/org/eclipse/syson/table/requirements/view/dto/ExposeRequirementsEventHandler.java b/backend/views/syson-table-requirements-view/src/main/java/org/eclipse/syson/table/requirements/view/dto/ExposeRequirementsEventHandler.java index bd319c401..9beca8d33 100644 --- a/backend/views/syson-table-requirements-view/src/main/java/org/eclipse/syson/table/requirements/view/dto/ExposeRequirementsEventHandler.java +++ b/backend/views/syson-table-requirements-view/src/main/java/org/eclipse/syson/table/requirements/view/dto/ExposeRequirementsEventHandler.java @@ -30,6 +30,7 @@ import org.eclipse.sirius.components.representations.Message; import org.eclipse.sirius.components.representations.MessageLevel; import org.eclipse.sirius.components.tables.Table; +import org.eclipse.syson.services.ElementInitializerSwitch; import org.eclipse.syson.sysml.RequirementUsage; import org.eclipse.syson.sysml.SysmlFactory; import org.eclipse.syson.sysml.ViewUsage; @@ -123,6 +124,7 @@ private void exposeRequirements(IEditingContext editingContext, ViewUsage viewUs if (!viewUsage.getExposedElement().contains(req)) { var membershipExpose = SysmlFactory.eINSTANCE.createMembershipExpose(); viewUsage.getOwnedRelationship().add(membershipExpose); + new ElementInitializerSwitch().doSwitch(membershipExpose); membershipExpose.setImportedMembership(req.getOwningMembership()); } }); diff --git a/doc/content/modules/user-manual/pages/release-notes/2026.1.0.adoc b/doc/content/modules/user-manual/pages/release-notes/2026.1.0.adoc index efab8ae2f..8021702be 100644 --- a/doc/content/modules/user-manual/pages/release-notes/2026.1.0.adoc +++ b/doc/content/modules/user-manual/pages/release-notes/2026.1.0.adoc @@ -53,6 +53,7 @@ requirement def R1 { - Fix an issue that displayed imported libraries at the root of the project if they contained `LibraryPackage` elements and non-`Namespace` elements. These models are now correctly displayed under the _User libraries_ directory. - Fix an issue where, in the diagrams, the creation of an `Element` inside a `sub-Package` created two graphical nodes instead of one. +- New `Expose` elements now have `visibility` set to _protected_ and have `isImportAll` set to _true_, as required by the SysMLv2 specification. == Improvements