From 46b4c1a9fc473cfc84b4b815a39974613fa4ecd5 Mon Sep 17 00:00:00 2001 From: Pierre-Charles David Date: Thu, 2 Apr 2026 11:21:50 +0200 Subject: [PATCH 1/4] [2105] Display textual representation of expressions in the Explorer Bug: https://github.com/eclipse-syson/syson/issues/2105 Signed-off-by: Pierre-Charles David --- CHANGELOG.adoc | 1 + .../explorer/view/SysONExplorerTests.java | 120 ++++++++++++------ .../ActionTransitionUsagesProjectData.java | 4 +- .../eclipse/syson/sysml/helper/EMFUtils.java | 1 - .../MetamodelQueryElementService.java | 24 +++- .../SysONDefaultExplorerServices.java | 29 +++++ .../images/explorer-expression-text.png | Bin 0 -> 78421 bytes .../pages/release-notes/2026.5.0.adoc | 6 + 8 files changed, 144 insertions(+), 41 deletions(-) create mode 100644 doc/content/modules/user-manual/assets/images/explorer-expression-text.png diff --git a/CHANGELOG.adoc b/CHANGELOG.adoc index 9d5cb97f3..81d28a642 100644 --- a/CHANGELOG.adoc +++ b/CHANGELOG.adoc @@ -46,6 +46,7 @@ Stakeholders are by default represented with a dedicated graphical node connecte - https://github.com/eclipse-syson/syson/issues/2111[#2111] [diagrams] Leverage the latest change of the selection dialog to allow creating a `Stakeholder` graphical node without specialization. - https://github.com/eclipse-syson/syson/issues/2122[#2122] [diagrams] Leverage the latest change of the selection dialog to allow creating a `Subject` graphical node without specialization. - https://github.com/eclipse-syson/syson/issues/2129[#2129] [diagrams] Leverage the latest change of the selection dialog to allow creating a `FlowUsage` from a `ConnectionUsage` without selection a `PayloadFeature` +- https://github.com/eclipse-syson/syson/issues/2105[#2105] [explorer] In the _Explorer_ view, `Expression` elements now display their full textual representation. === New features diff --git a/backend/application/syson-application/src/test/java/org/eclipse/syson/application/controller/explorer/view/SysONExplorerTests.java b/backend/application/syson-application/src/test/java/org/eclipse/syson/application/controller/explorer/view/SysONExplorerTests.java index 6b813fe08..a9a8a1177 100644 --- a/backend/application/syson-application/src/test/java/org/eclipse/syson/application/controller/explorer/view/SysONExplorerTests.java +++ b/backend/application/syson-application/src/test/java/org/eclipse/syson/application/controller/explorer/view/SysONExplorerTests.java @@ -46,9 +46,11 @@ import org.eclipse.sirius.web.tests.services.explorer.ExplorerEventSubscriptionRunner; import org.eclipse.sirius.web.tests.services.representation.RepresentationIdBuilder; import org.eclipse.syson.AbstractIntegrationTests; +import org.eclipse.syson.GivenSysONServer; import org.eclipse.syson.application.controller.explorer.testers.ExpandAllTreeItemTester; import org.eclipse.syson.application.controller.explorer.testers.TreeItemContextMenuTester; import org.eclipse.syson.application.controller.explorer.testers.TreePathTester; +import org.eclipse.syson.application.data.ActionTransitionUsagesProjectData; import org.eclipse.syson.application.data.GeneralViewEmptyTestProjectData; import org.eclipse.syson.application.data.ProjectWithLibraryDependencyContainingCommentAndLibraryPackageTestProjectData; import org.eclipse.syson.application.data.ProjectWithLibraryDependencyContainingLibraryPackageTestProjectData; @@ -67,8 +69,6 @@ import org.junit.jupiter.api.Test; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.boot.test.context.SpringBootTest; -import org.springframework.test.context.jdbc.Sql; -import org.springframework.test.context.jdbc.SqlConfig; import org.springframework.test.context.transaction.TestTransaction; import org.springframework.transaction.annotation.Transactional; @@ -135,8 +135,7 @@ public void beforeEach() { } @DisplayName("GIVEN an empty SysML Project, WHEN the available explorers are requested, THEN the SysON explorer is returned") - @Sql(scripts = { GeneralViewEmptyTestProjectData.SCRIPT_PATH }, executionPhase = Sql.ExecutionPhase.BEFORE_TEST_METHOD, config = @SqlConfig(transactionMode = SqlConfig.TransactionMode.ISOLATED)) - @Sql(scripts = { "/scripts/cleanup.sql" }, executionPhase = Sql.ExecutionPhase.AFTER_TEST_METHOD, config = @SqlConfig(transactionMode = SqlConfig.TransactionMode.ISOLATED)) + @GivenSysONServer({ GeneralViewEmptyTestProjectData.SCRIPT_PATH }) @Test public void getAvailableExplorersForSysMLv2Project() { Map explorerVariables = Map.of( @@ -150,8 +149,7 @@ public void getAvailableExplorersForSysMLv2Project() { } @DisplayName("GIVEN a SysON Studio Project, WHEN the available explorers are requested, THEN the Sirius Web explorer is returned") - @Sql(scripts = { SysonStudioTestProjectData.SCRIPT_PATH }, executionPhase = Sql.ExecutionPhase.BEFORE_TEST_METHOD, config = @SqlConfig(transactionMode = SqlConfig.TransactionMode.ISOLATED)) - @Sql(scripts = { "/scripts/cleanup.sql" }, executionPhase = Sql.ExecutionPhase.AFTER_TEST_METHOD, config = @SqlConfig(transactionMode = SqlConfig.TransactionMode.ISOLATED)) + @GivenSysONServer({ SysonStudioTestProjectData.SCRIPT_PATH }) @Test public void getAvailableExplorersForStudioProject() { TestTransaction.flagForCommit(); @@ -166,8 +164,7 @@ public void getAvailableExplorersForStudioProject() { } @DisplayName("GIVEN an empty SysML Project, WHEN the explorer is displayed, THEN the libraries are visible and the root namespace and memberships are not visible") - @Sql(scripts = { GeneralViewEmptyTestProjectData.SCRIPT_PATH }, executionPhase = Sql.ExecutionPhase.BEFORE_TEST_METHOD, config = @SqlConfig(transactionMode = SqlConfig.TransactionMode.ISOLATED)) - @Sql(scripts = { "/scripts/cleanup.sql" }, executionPhase = Sql.ExecutionPhase.AFTER_TEST_METHOD, config = @SqlConfig(transactionMode = SqlConfig.TransactionMode.ISOLATED)) + @GivenSysONServer({ GeneralViewEmptyTestProjectData.SCRIPT_PATH }) @Test public void getExplorerContentWithDefaultFilters() { var optionalEditingContext = this.editingContextSearchService.findById(GeneralViewEmptyTestProjectData.EDITING_CONTEXT); @@ -257,8 +254,7 @@ public void getExplorerContentWithDefaultFilters() { } @DisplayName("GIVEN an empty SysML Project, WHEN the explorer is displayed with KerML and SysML libraries expanded, THEN the library models are visible") - @Sql(scripts = { GeneralViewEmptyTestProjectData.SCRIPT_PATH }, executionPhase = Sql.ExecutionPhase.BEFORE_TEST_METHOD, config = @SqlConfig(transactionMode = SqlConfig.TransactionMode.ISOLATED)) - @Sql(scripts = { "/scripts/cleanup.sql" }, executionPhase = Sql.ExecutionPhase.AFTER_TEST_METHOD, config = @SqlConfig(transactionMode = SqlConfig.TransactionMode.ISOLATED)) + @GivenSysONServer({ GeneralViewEmptyTestProjectData.SCRIPT_PATH }) @Test public void getExplorerContentWithKerMLAndSysMLExpanded() { var optionalEditingContext = this.editingContextSearchService.findById(GeneralViewEmptyTestProjectData.EDITING_CONTEXT); @@ -319,8 +315,7 @@ public void getExplorerContentWithKerMLAndSysMLExpanded() { } @DisplayName("GIVEN an empty SysML Project, WHEN the explorer is displayed with its root model expanded and the hide memberships and hide KerML libraries filters, THEN the root model is visible and is expanded") - @Sql(scripts = { GeneralViewEmptyTestProjectData.SCRIPT_PATH }, executionPhase = Sql.ExecutionPhase.BEFORE_TEST_METHOD, config = @SqlConfig(transactionMode = SqlConfig.TransactionMode.ISOLATED)) - @Sql(scripts = { "/scripts/cleanup.sql" }, executionPhase = Sql.ExecutionPhase.AFTER_TEST_METHOD, config = @SqlConfig(transactionMode = SqlConfig.TransactionMode.ISOLATED)) + @GivenSysONServer({ GeneralViewEmptyTestProjectData.SCRIPT_PATH }) @Test public void getRootContentWithHideMembershipsAndHideKerMLStandardLibraries() { List filters = List.of(SysONTreeFilterConstants.HIDE_MEMBERSHIPS_TREE_ITEM_FILTER_ID, SysONTreeFilterConstants.HIDE_KERML_STANDARD_LIBRARIES_TREE_FILTER_ID); @@ -352,8 +347,7 @@ public void getRootContentWithHideMembershipsAndHideKerMLStandardLibraries() { } @DisplayName("GIVEN an empty SysML Project, WHEN context menu is queried, THEN the menu is returned") - @Sql(scripts = { GeneralViewEmptyTestProjectData.SCRIPT_PATH }, executionPhase = Sql.ExecutionPhase.BEFORE_TEST_METHOD, config = @SqlConfig(transactionMode = SqlConfig.TransactionMode.ISOLATED)) - @Sql(scripts = { "/scripts/cleanup.sql" }, executionPhase = Sql.ExecutionPhase.AFTER_TEST_METHOD, config = @SqlConfig(transactionMode = SqlConfig.TransactionMode.ISOLATED)) + @GivenSysONServer({ GeneralViewEmptyTestProjectData.SCRIPT_PATH }) @Test public void getContextMenuOfModelAndLibraryDirectories() { var optionalEditingContext = this.editingContextSearchService.findById(GeneralViewEmptyTestProjectData.EDITING_CONTEXT); @@ -422,8 +416,7 @@ public void getContextMenuOfModelAndLibraryDirectories() { } @DisplayName("GIVEN an empty SysML Project, WHEN the tree path is queried, THEN the returned tree path should take into accounts the Explorer filters.") - @Sql(scripts = { GeneralViewEmptyTestProjectData.SCRIPT_PATH }, executionPhase = Sql.ExecutionPhase.BEFORE_TEST_METHOD, config = @SqlConfig(transactionMode = SqlConfig.TransactionMode.ISOLATED)) - @Sql(scripts = { "/scripts/cleanup.sql" }, executionPhase = Sql.ExecutionPhase.AFTER_TEST_METHOD, config = @SqlConfig(transactionMode = SqlConfig.TransactionMode.ISOLATED)) + @GivenSysONServer({ GeneralViewEmptyTestProjectData.SCRIPT_PATH }) @Test public void treePathQueryApplyExplorerFilters() { List filters = List.of(SysONTreeFilterConstants.HIDE_MEMBERSHIPS_TREE_ITEM_FILTER_ID, SysONTreeFilterConstants.HIDE_ROOT_NAMESPACES_ID); @@ -472,8 +465,7 @@ public void treePathQueryApplyExplorerFilters() { *

*/ @DisplayName("GIVEN an empty SysML Project, WHEN the tree path is queried in the Sirius Web default Explorer, THEN the returned tree path should not take into accounts the Explorer filters.") - @Sql(scripts = { GeneralViewEmptyTestProjectData.SCRIPT_PATH }, executionPhase = Sql.ExecutionPhase.BEFORE_TEST_METHOD, config = @SqlConfig(transactionMode = SqlConfig.TransactionMode.ISOLATED)) - @Sql(scripts = { "/scripts/cleanup.sql" }, executionPhase = Sql.ExecutionPhase.AFTER_TEST_METHOD, config = @SqlConfig(transactionMode = SqlConfig.TransactionMode.ISOLATED)) + @GivenSysONServer({ GeneralViewEmptyTestProjectData.SCRIPT_PATH }) @Test public void treePathQueryInSiriusWebDefaultExplorerDoesNotApplyExplorerFilters() { List filters = List.of(SysONTreeFilterConstants.HIDE_MEMBERSHIPS_TREE_ITEM_FILTER_ID, SysONTreeFilterConstants.HIDE_ROOT_NAMESPACES_ID); @@ -543,9 +535,7 @@ public void treePathQueryInSiriusWebDefaultExplorerDoesNotApplyExplorerFilters() } @DisplayName("GIVEN a SysML Project with a dependency to a library containing one Package, WHEN the explorer is displayed, THEN the library model is visible at the root of the explorer") - @Sql(scripts = { ProjectWithUsedBatmobileLibraryDependencyTestProjectData.SCRIPT_PATH }, executionPhase = Sql.ExecutionPhase.BEFORE_TEST_METHOD, - config = @SqlConfig(transactionMode = SqlConfig.TransactionMode.ISOLATED)) - @Sql(scripts = { "/scripts/cleanup.sql" }, executionPhase = Sql.ExecutionPhase.AFTER_TEST_METHOD, config = @SqlConfig(transactionMode = SqlConfig.TransactionMode.ISOLATED)) + @GivenSysONServer({ ProjectWithUsedBatmobileLibraryDependencyTestProjectData.SCRIPT_PATH }) @Test public void getExplorerContentWithImportedLibraryContainingOnePackage() { List filters = List.of(SysONTreeFilterConstants.HIDE_MEMBERSHIPS_TREE_ITEM_FILTER_ID); @@ -573,9 +563,7 @@ public void getExplorerContentWithImportedLibraryContainingOnePackage() { } @DisplayName("GIVEN a SysML Project with a dependency to a library containing one Package and one LibraryPackage, WHEN the explorer is displayed, THEN the library model is visible at the root of the explorer") - @Sql(scripts = { ProjectWithLibraryDependencyContainingPackageAndLibraryPackageTestProjectData.SCRIPT_PATH }, executionPhase = Sql.ExecutionPhase.BEFORE_TEST_METHOD, - config = @SqlConfig(transactionMode = SqlConfig.TransactionMode.ISOLATED)) - @Sql(scripts = { "/scripts/cleanup.sql" }, executionPhase = Sql.ExecutionPhase.AFTER_TEST_METHOD, config = @SqlConfig(transactionMode = SqlConfig.TransactionMode.ISOLATED)) + @GivenSysONServer({ ProjectWithLibraryDependencyContainingPackageAndLibraryPackageTestProjectData.SCRIPT_PATH }) @Test public void getExplorerContentWithImportedLibraryContainingPackageAndLibraryPackage() { List filters = List.of(SysONTreeFilterConstants.HIDE_MEMBERSHIPS_TREE_ITEM_FILTER_ID); @@ -603,9 +591,7 @@ public void getExplorerContentWithImportedLibraryContainingPackageAndLibraryPack } @DisplayName("GIVEN a SysML Project with a dependency to a library containing one LibraryPackage, WHEN the explorer is displayed, THEN the library model is visible under the user libraries directory of the explorer") - @Sql(scripts = { ProjectWithLibraryDependencyContainingLibraryPackageTestProjectData.SCRIPT_PATH }, executionPhase = Sql.ExecutionPhase.BEFORE_TEST_METHOD, - config = @SqlConfig(transactionMode = SqlConfig.TransactionMode.ISOLATED)) - @Sql(scripts = { "/scripts/cleanup.sql" }, executionPhase = Sql.ExecutionPhase.AFTER_TEST_METHOD, config = @SqlConfig(transactionMode = SqlConfig.TransactionMode.ISOLATED)) + @GivenSysONServer({ ProjectWithLibraryDependencyContainingLibraryPackageTestProjectData.SCRIPT_PATH }) @Test public void getExplorerContentWithImportedLibraryContainingLibraryPackage() { List filters = List.of(SysONTreeFilterConstants.HIDE_MEMBERSHIPS_TREE_ITEM_FILTER_ID); @@ -658,9 +644,7 @@ public void getExplorerContentWithImportedLibraryContainingLibraryPackage() { } @DisplayName("GIVEN a SysML Project with a dependency to a library containing a Comment and a LibraryPackage, WHEN the explorer is displayed, THEN the library model is visible under the user libraries directory of the explorer") - @Sql(scripts = { ProjectWithLibraryDependencyContainingCommentAndLibraryPackageTestProjectData.SCRIPT_PATH }, executionPhase = Sql.ExecutionPhase.BEFORE_TEST_METHOD, - config = @SqlConfig(transactionMode = SqlConfig.TransactionMode.ISOLATED)) - @Sql(scripts = { "/scripts/cleanup.sql" }, executionPhase = Sql.ExecutionPhase.AFTER_TEST_METHOD, config = @SqlConfig(transactionMode = SqlConfig.TransactionMode.ISOLATED)) + @GivenSysONServer({ ProjectWithLibraryDependencyContainingCommentAndLibraryPackageTestProjectData.SCRIPT_PATH }) @Test public void getExplorerContentWithImportedLibraryContainingCommentAndLibraryPackage() { List filters = List.of(SysONTreeFilterConstants.HIDE_MEMBERSHIPS_TREE_ITEM_FILTER_ID); @@ -713,9 +697,7 @@ public void getExplorerContentWithImportedLibraryContainingCommentAndLibraryPack } @DisplayName("GIVEN a SysML library containing a LibraryPackage, WHEN the explorer is displayed on the library's semantic data, THEN the library model is visible at the root of the explorer") - @Sql(scripts = { ProjectWithLibraryDependencyContainingLibraryPackageTestProjectData.SCRIPT_PATH }, executionPhase = Sql.ExecutionPhase.BEFORE_TEST_METHOD, - config = @SqlConfig(transactionMode = SqlConfig.TransactionMode.ISOLATED)) - @Sql(scripts = { "/scripts/cleanup.sql" }, executionPhase = Sql.ExecutionPhase.AFTER_TEST_METHOD, config = @SqlConfig(transactionMode = SqlConfig.TransactionMode.ISOLATED)) + @GivenSysONServer({ ProjectWithLibraryDependencyContainingLibraryPackageTestProjectData.SCRIPT_PATH }) @Test public void getExplorerContentOnLibrarySemanticDataWithLibraryPackage() { List filters = List.of(SysONTreeFilterConstants.HIDE_MEMBERSHIPS_TREE_ITEM_FILTER_ID); @@ -742,9 +724,7 @@ public void getExplorerContentOnLibrarySemanticDataWithLibraryPackage() { } @DisplayName("GIVEN a SysML library containing a Package and a LibraryPackage, WHEN the explorer is displayed on the library's semantic data, THEN the library model is visible at the root of the explorer") - @Sql(scripts = { ProjectWithLibraryDependencyContainingPackageAndLibraryPackageTestProjectData.SCRIPT_PATH }, executionPhase = Sql.ExecutionPhase.BEFORE_TEST_METHOD, - config = @SqlConfig(transactionMode = SqlConfig.TransactionMode.ISOLATED)) - @Sql(scripts = { "/scripts/cleanup.sql" }, executionPhase = Sql.ExecutionPhase.AFTER_TEST_METHOD, config = @SqlConfig(transactionMode = SqlConfig.TransactionMode.ISOLATED)) + @GivenSysONServer({ ProjectWithLibraryDependencyContainingPackageAndLibraryPackageTestProjectData.SCRIPT_PATH }) @Test public void getExplorerContentOnLibrarySemanticDataWithPackage() { List filters = List.of(SysONTreeFilterConstants.HIDE_MEMBERSHIPS_TREE_ITEM_FILTER_ID); @@ -771,8 +751,7 @@ public void getExplorerContentOnLibrarySemanticDataWithPackage() { } @DisplayName("GIVEN the SysON Explorer, WHEN tree item context menu is requested, THEN the returned tree items are the appropriate one.") - @Sql(scripts = { GeneralViewEmptyTestProjectData.SCRIPT_PATH }, executionPhase = Sql.ExecutionPhase.BEFORE_TEST_METHOD, config = @SqlConfig(transactionMode = SqlConfig.TransactionMode.ISOLATED)) - @Sql(scripts = { "/scripts/cleanup.sql" }, executionPhase = Sql.ExecutionPhase.AFTER_TEST_METHOD, config = @SqlConfig(transactionMode = SqlConfig.TransactionMode.ISOLATED)) + @GivenSysONServer({ GeneralViewEmptyTestProjectData.SCRIPT_PATH }) @Test public void sysONExplorerTreeItemContextMenuEntriesTest() { var expandedItemIds = List.of( @@ -871,4 +850,69 @@ public void sysONExplorerTreeItemContextMenuEntriesTest() { .verify(Duration.ofSeconds(10)); } + + @DisplayName("GIVEN the SysON Explorer, WHEN displaying an Expression item, THEN the item's label shows the textual representation of the expression") + @GivenSysONServer({ ActionTransitionUsagesProjectData.SCRIPT_PATH }) + @Test + public void sysONExplorerTreeExpressionLabelTest() { + + var optionalEditingContext = this.editingContextSearchService.findById(ActionTransitionUsagesProjectData.EDITING_CONTEXT_ID); + TreeDescription treeDescription = optionalEditingContext + .flatMap(editingContext -> this.representationDescriptionSearchService.findById(editingContext, this.sysONExplorerTreeDescriptionId)) + .filter(TreeDescription.class::isInstance) + .map(TreeDescription.class::cast) + .orElse(null); + List defaultFilters = this.sysonTreeFilterProvider.get(null, treeDescription).stream() + .filter(TreeFilter::defaultState) + .map(TreeFilter::id) + .toList(); + + var expandedItemIds = List.of( + ActionTransitionUsagesProjectData.SemanticIds.DOCUMENT_ID, + ActionTransitionUsagesProjectData.SemanticIds.PACKAGE_1_ID, + ActionTransitionUsagesProjectData.SemanticIds.A0_ID, + ActionTransitionUsagesProjectData.SemanticIds.S1_ID, + ActionTransitionUsagesProjectData.SemanticIds.S2_ID); + + var explorerRepresentationId = this.representationIdBuilder.buildExplorerRepresentationId(this.sysONExplorerTreeDescriptionId, expandedItemIds, defaultFilters); + var input = new ExplorerEventInput(UUID.randomUUID(), ActionTransitionUsagesProjectData.EDITING_CONTEXT_ID, explorerRepresentationId); + var flux = this.explorerEventSubscriptionRunner.run(input).flux(); + TestTransaction.flagForCommit(); + TestTransaction.end(); + + var treeId = new AtomicReference(); + Consumer initialTreeContentConsumer = assertRefreshedTreeThat(tree -> { + assertThat(tree).isNotNull(); + treeId.set(tree.getId()); + assertThat(tree.getChildren()).hasSize(2); + var documentItem = tree.getChildren().get(0); + assertThat(documentItem.getChildren()).hasSize(1); + assertThat(documentItem.getLabel().toString()).isEqualTo("ActionTransitionUsage.sysml"); + var packageItem = documentItem.getChildren().get(0); + assertThat(packageItem.getLabel().toString()).isEqualTo("Package 1"); + assertThat(packageItem.getChildren()).hasSize(3); + var a0Item = packageItem.getChildren().get(0); + assertThat(a0Item.getLabel().toString()).isEqualTo("a0"); + assertThat(a0Item.getChildren()).hasSize(7); + var s1Item = a0Item.getChildren().get(5); + assertThat(s1Item.getLabel().toString()).isEqualTo("S1"); + assertThat(s1Item.getChildren()).hasSize(3); + var expr1Item = s1Item.getChildren().get(0); + assertThat(expr1Item.getKind()).isEqualTo("siriusComponents://semantic?domain=sysml&entity=OperatorExpression"); + assertThat(expr1Item.getLabel().toString()).isEqualTo("attr1 < 1"); + + var s2Item = a0Item.getChildren().get(6); + assertThat(s2Item.getLabel().toString()).isEqualTo("S2"); + assertThat(s2Item.getChildren()).hasSize(3); + var expr2Item = s2Item.getChildren().get(0); + assertThat(expr2Item.getKind()).isEqualTo("siriusComponents://semantic?domain=sysml&entity=OperatorExpression"); + assertThat(expr2Item.getLabel().toString()).isEqualTo("attr1 < 0"); + + }); + + StepVerifier.create(flux) + .consumeNextWith(initialTreeContentConsumer) + .thenCancel() + .verify(Duration.ofSeconds(10)); + } } diff --git a/backend/application/syson-application/src/test/java/org/eclipse/syson/application/data/ActionTransitionUsagesProjectData.java b/backend/application/syson-application/src/test/java/org/eclipse/syson/application/data/ActionTransitionUsagesProjectData.java index 7b79a3338..ef794b9d4 100644 --- a/backend/application/syson-application/src/test/java/org/eclipse/syson/application/data/ActionTransitionUsagesProjectData.java +++ b/backend/application/syson-application/src/test/java/org/eclipse/syson/application/data/ActionTransitionUsagesProjectData.java @@ -1,5 +1,5 @@ /******************************************************************************* - * Copyright (c) 2025 Obeo. + * Copyright (c) 2025, 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 @@ -42,6 +42,8 @@ public static final class GraphicalIds { */ public static final class SemanticIds { + public static final String DOCUMENT_ID = "26a78eef-bfa1-4de0-9d0a-c1f86a1b97d5"; + public static final String PACKAGE_1_ID = "2264f62c-b223-4b9b-ae41-96dc2ba0070e"; public static final String A0_ID = "82a2fa10-e736-4c3e-b27a-e94f76d7456d"; diff --git a/backend/metamodel/syson-sysml-metamodel/src/main/java/org/eclipse/syson/sysml/helper/EMFUtils.java b/backend/metamodel/syson-sysml-metamodel/src/main/java/org/eclipse/syson/sysml/helper/EMFUtils.java index 121a73629..0abfb9328 100644 --- a/backend/metamodel/syson-sysml-metamodel/src/main/java/org/eclipse/syson/sysml/helper/EMFUtils.java +++ b/backend/metamodel/syson-sysml-metamodel/src/main/java/org/eclipse/syson/sysml/helper/EMFUtils.java @@ -282,7 +282,6 @@ public static List getAncestors(Class type, EObject ob */ public static Optional getFirstAncestor(Class type, EObject object, Predicate ancestorPredicate) { var current = object; - List results = new ArrayList<>(); while (current != null) { if (type.isInstance(current) && (ancestorPredicate == null || ancestorPredicate.test(current))) { return Optional.of((T) current); 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 60ee50ff3..2ba2e8928 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 @@ -21,13 +21,16 @@ import org.eclipse.syson.sysml.ActorMembership; import org.eclipse.syson.sysml.Connector; import org.eclipse.syson.sysml.Element; +import org.eclipse.syson.sysml.ElementFilterMembership; import org.eclipse.syson.sysml.Expression; import org.eclipse.syson.sysml.Feature; import org.eclipse.syson.sysml.FeatureValue; import org.eclipse.syson.sysml.PartUsage; import org.eclipse.syson.sysml.ReferenceUsage; import org.eclipse.syson.sysml.StakeholderMembership; +import org.eclipse.syson.sysml.ResultExpressionMembership; import org.eclipse.syson.sysml.SubjectMembership; +import org.eclipse.syson.sysml.Usage; /** * Element-related services doing queries. This class should not depend on sirius-web services or other spring services. @@ -78,6 +81,25 @@ public boolean isStakeholder(Element element) { return element instanceof PartUsage && element.getOwningMembership() instanceof StakeholderMembership; } + /** + * Check if a given {@code element} is an {@link Expression} definition. We can not simply rely on whether the + * element is an instance of {@link Expression} as many types in SysMLv2 inherit from this type without being + * themselves an actual expressions. + * + * @param element + * the element to test. + * @return true if the element is an actual expression definition. + */ + public boolean isExpressionDefinition(Element element) { + if (element instanceof Expression && !(element instanceof Usage)) { + var owningRelationship = element.getOwningRelationship(); + return owningRelationship instanceof FeatureValue || owningRelationship instanceof ElementFilterMembership + || owningRelationship instanceof ResultExpressionMembership; + } else { + return false; + } + } + /** * Get the source of a {@link Connector}. * @@ -144,7 +166,7 @@ public Optional getCommonOwnerAncestor(Element e1, Elemen * Gets the value expression of a feature (Value of the FeatureValue owned by this feature). * * @param feature - * a non null feature + * a non null feature * @return an optional expression */ public Optional getValueExpression(Feature feature) { diff --git a/backend/services/syson-tree-services/src/main/java/org/eclipse/syson/tree/explorer/services/SysONDefaultExplorerServices.java b/backend/services/syson-tree-services/src/main/java/org/eclipse/syson/tree/explorer/services/SysONDefaultExplorerServices.java index 5b9157880..906e39d7b 100644 --- a/backend/services/syson-tree-services/src/main/java/org/eclipse/syson/tree/explorer/services/SysONDefaultExplorerServices.java +++ b/backend/services/syson-tree-services/src/main/java/org/eclipse/syson/tree/explorer/services/SysONDefaultExplorerServices.java @@ -38,8 +38,13 @@ import org.eclipse.sirius.web.domain.boundedcontexts.representationdata.RepresentationMetadata; import org.eclipse.sirius.web.domain.boundedcontexts.representationdata.services.api.IRepresentationMetadataSearchService; import org.eclipse.syson.sysml.Element; +import org.eclipse.syson.sysml.Expression; import org.eclipse.syson.sysml.Type; import org.eclipse.syson.sysml.ViewUsage; +import org.eclipse.syson.sysml.metamodel.services.MetamodelQueryElementService; +import org.eclipse.syson.sysml.textual.SysMLElementSerializer; +import org.eclipse.syson.sysml.textual.SysMLSerializingOptions; +import org.eclipse.syson.sysml.textual.utils.FileNameDeresolver; import org.eclipse.syson.sysml.util.ElementUtil; import org.eclipse.syson.tree.explorer.fragments.KerMLStandardLibraryDirectory; import org.eclipse.syson.tree.explorer.fragments.LibrariesDirectory; @@ -74,6 +79,8 @@ public class SysONDefaultExplorerServices implements ISysONDefaultExplorerServic private final IReadOnlyObjectPredicate readOnlyObjectPredicate; + private final MetamodelQueryElementService metamodelQueryElementService; + public SysONDefaultExplorerServices(IIdentityService identityService, IContentService contentService, IRepresentationMetadataSearchService representationMetadataSearchService, IExplorerServices explorerServices, ILabelService labelService, ISysONExplorerFilterService filterService, final IReadOnlyObjectPredicate readOnlyObjectPredicate) { this.identityService = Objects.requireNonNull(identityService); @@ -83,6 +90,7 @@ public SysONDefaultExplorerServices(IIdentityService identityService, IContentSe this.labelService = Objects.requireNonNull(labelService); this.filterService = Objects.requireNonNull(filterService); this.readOnlyObjectPredicate = Objects.requireNonNull(readOnlyObjectPredicate); + this.metamodelQueryElementService = new MetamodelQueryElementService(); } @Override @@ -148,6 +156,8 @@ public String getLabel(Object self) { String label = ""; if (self instanceof ISysONExplorerFragment fragment) { label = fragment.getLabel(); + } else if (self instanceof Expression expression && this.metamodelQueryElementService.isExpressionDefinition(expression)) { + label = this.getValueExpressionTextualRepresentation(expression); } else if (self instanceof Type type) { String name = type.getName(); if (name != null) { @@ -159,6 +169,25 @@ public String getLabel(Object self) { return label; } + private String getValueExpressionTextualRepresentation(Expression value) { + String result = ""; + if (value != null) { + SysMLSerializingOptions options = new SysMLSerializingOptions.Builder() + .lineSeparator("\n") + .nameDeresolver(new FileNameDeresolver()) + .indentation("\t") + .needEscapeCharacter(false) + .build(); + String textualFormat = new SysMLElementSerializer(options, s -> { + // Do nothing for now + }).doSwitch(value); + if (textualFormat != null) { + result = textualFormat; + } + } + return result; + } + private String getFallbackLabel(Object self) { StyledString styledLabel = this.labelService.getStyledLabel(self); if (styledLabel != null) { diff --git a/doc/content/modules/user-manual/assets/images/explorer-expression-text.png b/doc/content/modules/user-manual/assets/images/explorer-expression-text.png new file mode 100644 index 0000000000000000000000000000000000000000..14e3c1ef5b8948d19336f7e378421ac72644a940 GIT binary patch literal 78421 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 literal 0 HcmV?d00001 diff --git a/doc/content/modules/user-manual/pages/release-notes/2026.5.0.adoc b/doc/content/modules/user-manual/pages/release-notes/2026.5.0.adoc index 40cf0b46b..33ea8e61a 100644 --- a/doc/content/modules/user-manual/pages/release-notes/2026.5.0.adoc +++ b/doc/content/modules/user-manual/pages/release-notes/2026.5.0.adoc @@ -37,6 +37,12 @@ image::release-notes-stakeholder-node.png[Default representation of Stakeholder ** Improve the tool to create a `Subject` graphical node by making specialization selection optional. ** Improve the tool to create a `FlowUsage` from a `ConnectionUsage` by making the payload selection optional. +* In the _Explorer_ view: + +** `Expression` elements now display their full textual representation: ++ +image::explorer-expression-text.png[Expression textual representation] + == Technical details * For technical details on this {product} release (including breaking changes), please refer to https://github.com/eclipse-syson/syson/blob/main/CHANGELOG.adoc[changelog]. From b83d682b2f88b5f3001e4ffaa0f40edad0752084 Mon Sep 17 00:00:00 2001 From: Pierre-Charles David Date: Tue, 7 Apr 2026 10:51:02 +0200 Subject: [PATCH 2/4] [cleanup] Fix typo in file name Signed-off-by: Pierre-Charles David --- .../src/extensions/useInsertTextualSysMLv2.ts | 4 ++-- ...xtualSysML.v2types.ts => useInsertTextualSysMLv2.types.ts} | 2 +- 2 files changed, 3 insertions(+), 3 deletions(-) rename frontend/syson-components/src/extensions/{useInsertTextualSysML.v2types.ts => useInsertTextualSysMLv2.types.ts} (97%) diff --git a/frontend/syson-components/src/extensions/useInsertTextualSysMLv2.ts b/frontend/syson-components/src/extensions/useInsertTextualSysMLv2.ts index 73393e3c0..9f8fcdc66 100644 --- a/frontend/syson-components/src/extensions/useInsertTextualSysMLv2.ts +++ b/frontend/syson-components/src/extensions/useInsertTextualSysMLv2.ts @@ -1,5 +1,5 @@ /******************************************************************************* - * Copyright (c) 2025 Obeo. + * Copyright (c) 2025, 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 @@ -19,7 +19,7 @@ import { GQLInsertTextualSysMLv2MutationData, GQLInsertTextualSysMLv2Payload, UseInsertTextualSysMLv2Value, -} from './useInsertTextualSysML.v2types'; +} from './useInsertTextualSysMLv2.types'; const insertTextualSysMLv2Mutation = gql` mutation insertTextualSysMLv2($input: InsertTextualSysMLv2Input!) { diff --git a/frontend/syson-components/src/extensions/useInsertTextualSysML.v2types.ts b/frontend/syson-components/src/extensions/useInsertTextualSysMLv2.types.ts similarity index 97% rename from frontend/syson-components/src/extensions/useInsertTextualSysML.v2types.ts rename to frontend/syson-components/src/extensions/useInsertTextualSysMLv2.types.ts index 0aa533c60..50dd6ad58 100644 --- a/frontend/syson-components/src/extensions/useInsertTextualSysML.v2types.ts +++ b/frontend/syson-components/src/extensions/useInsertTextualSysMLv2.types.ts @@ -1,5 +1,5 @@ /******************************************************************************* - * Copyright (c) 2024, 2025 Obeo. + * Copyright (c) 2024, 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 From fc6e90338073e66d15b02d83b8388e62b4b3a92e Mon Sep 17 00:00:00 2001 From: Pierre-Charles David Date: Fri, 10 Apr 2026 11:14:49 +0200 Subject: [PATCH 3/4] [cleanup] Fix data-testid in InsertTextualSysMLv2Modal Signed-off-by: Pierre-Charles David --- .../services/MetamodelQueryElementService.java | 10 +--------- .../src/extensions/InsertTextualSysMLv2Modal.tsx | 3 +-- 2 files changed, 2 insertions(+), 11 deletions(-) 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 2ba2e8928..2f3bc0086 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 @@ -21,14 +21,12 @@ import org.eclipse.syson.sysml.ActorMembership; import org.eclipse.syson.sysml.Connector; import org.eclipse.syson.sysml.Element; -import org.eclipse.syson.sysml.ElementFilterMembership; import org.eclipse.syson.sysml.Expression; import org.eclipse.syson.sysml.Feature; import org.eclipse.syson.sysml.FeatureValue; import org.eclipse.syson.sysml.PartUsage; import org.eclipse.syson.sysml.ReferenceUsage; import org.eclipse.syson.sysml.StakeholderMembership; -import org.eclipse.syson.sysml.ResultExpressionMembership; import org.eclipse.syson.sysml.SubjectMembership; import org.eclipse.syson.sysml.Usage; @@ -91,13 +89,7 @@ public boolean isStakeholder(Element element) { * @return true if the element is an actual expression definition. */ public boolean isExpressionDefinition(Element element) { - if (element instanceof Expression && !(element instanceof Usage)) { - var owningRelationship = element.getOwningRelationship(); - return owningRelationship instanceof FeatureValue || owningRelationship instanceof ElementFilterMembership - || owningRelationship instanceof ResultExpressionMembership; - } else { - return false; - } + return element instanceof Expression && !(element instanceof Usage); } /** diff --git a/frontend/syson-components/src/extensions/InsertTextualSysMLv2Modal.tsx b/frontend/syson-components/src/extensions/InsertTextualSysMLv2Modal.tsx index 648c165c1..24d6638bc 100644 --- a/frontend/syson-components/src/extensions/InsertTextualSysMLv2Modal.tsx +++ b/frontend/syson-components/src/extensions/InsertTextualSysMLv2Modal.tsx @@ -22,7 +22,6 @@ import { Theme } from '@mui/material/styles'; import TextField from '@mui/material/TextField'; import { useEffect, useState } from 'react'; import { makeStyles } from 'tss-react/mui'; - import { InsertTextualSysMLv2ModalProps, InsertTextualSysMLv2ModalState } from './InsertTextualSysMLv2Modal.types'; import { NewObjectAsTextReport } from './NewObjectAsTextDocumentReport'; import { useInsertTextualSysMLv2 } from './useInsertTextualSysMLv2'; @@ -106,7 +105,7 @@ export const InsertTextualSysMLv2Modal = ({ editingContextId, item, onClose }: I onClick={(event) => onInsertTextualSysMLv2(event)} startIcon={ state.insertInProgress ? ( - + ) : ( ) From 9db87ec8e5ff94b30634cdc85be9a0d5a2f99236 Mon Sep 17 00:00:00 2001 From: Axel RICHARD Date: Tue, 14 Apr 2026 16:58:49 +0200 Subject: [PATCH 4/4] [releng] Update coverage percentages Signed-off-by: Axel RICHARD --- scripts/check-coverage.jsh | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/scripts/check-coverage.jsh b/scripts/check-coverage.jsh index f1003f2a3..5594a0f97 100755 --- a/scripts/check-coverage.jsh +++ b/scripts/check-coverage.jsh @@ -40,18 +40,18 @@ var moduleCoverageData = List.of( new ModuleCoverage("syson-form-services", 100.0), new ModuleCoverage("syson-model-services", 94.0), new ModuleCoverage("syson-representation-services", 100.0), - new ModuleCoverage("syson-services", 64.0), + new ModuleCoverage("syson-services", 65.0), new ModuleCoverage("syson-siriusweb-customnodes-metamodel", 41.0), new ModuleCoverage("syson-siriusweb-customnodes-metamodel-edit", 0.0), new ModuleCoverage("syson-standard-diagrams-view", 97.0), new ModuleCoverage("syson-sysml-export", 71.0), new ModuleCoverage("syson-sysml-import", 85.0), - new ModuleCoverage("syson-sysml-metamodel", 76.0), + new ModuleCoverage("syson-sysml-metamodel", 77.0), new ModuleCoverage("syson-sysml-metamodel-edit", 17.0), new ModuleCoverage("syson-sysml-metamodel-services", 92.0), new ModuleCoverage("syson-sysml-rest-api-services", 93.0), new ModuleCoverage("syson-sysml-validation", 97.0), - new ModuleCoverage("syson-table-requirements-view", 72.0), + new ModuleCoverage("syson-table-requirements-view", 73.0), new ModuleCoverage("syson-table-services", 100.0), new ModuleCoverage("syson-tree-explorer-view", 88.0), new ModuleCoverage("syson-tree-services", 80.0)