diff --git a/backend/services/syson-diagram-services/src/main/java/org/eclipse/syson/diagram/services/DiagramQueryLabelService.java b/backend/services/syson-diagram-services/src/main/java/org/eclipse/syson/diagram/services/DiagramQueryLabelService.java index 52dceaf5f..235021c89 100644 --- a/backend/services/syson-diagram-services/src/main/java/org/eclipse/syson/diagram/services/DiagramQueryLabelService.java +++ b/backend/services/syson-diagram-services/src/main/java/org/eclipse/syson/diagram/services/DiagramQueryLabelService.java @@ -15,6 +15,7 @@ import static java.util.stream.Collectors.joining; import java.util.Objects; +import java.util.Optional; import java.util.function.BinaryOperator; import org.eclipse.emf.common.util.EList; @@ -38,6 +39,7 @@ import org.eclipse.syson.sysml.FeatureValue; import org.eclipse.syson.sysml.LiteralExpression; import org.eclipse.syson.sysml.MultiplicityRange; +import org.eclipse.syson.sysml.Namespace; import org.eclipse.syson.sysml.OwningMembership; import org.eclipse.syson.sysml.Redefinition; import org.eclipse.syson.sysml.ReferenceSubsetting; @@ -50,6 +52,7 @@ import org.eclipse.syson.sysml.Type; import org.eclipse.syson.sysml.Usage; import org.eclipse.syson.sysml.VariantMembership; +import org.eclipse.syson.sysml.helper.EMFUtils; import org.eclipse.syson.sysml.helper.LabelConstants; import org.eclipse.syson.sysml.textual.SysMLElementSerializer; import org.eclipse.syson.sysml.textual.utils.Appender; @@ -202,13 +205,37 @@ public String getTypingLabel(Element element) { label.append(LabelConstants.SPACE); label.append(LabelConstants.COLON); label.append(LabelConstants.SPACE); - label.append(this.getDeclaredNameLabel(type)); + label.append(this.buildImportContextRelativeQualifiedName(type, element)); } } } return label.toString(); } + private String buildImportContextRelativeQualifiedName(Element element, Element from) { + String qualifiedName = Optional.ofNullable(element.getQualifiedName()).orElse(""); + Element commonAncestor = EMFUtils.getLeastCommonContainer(Element.class, element, from); + if (commonAncestor != null) { + String prefix = commonAncestor.getQualifiedName() + "::"; + if (qualifiedName.startsWith(prefix)) { + qualifiedName = qualifiedName.substring(prefix.length()); + } + } + var namespaces = EMFUtils.getAncestors(Namespace.class, from, null); + if (namespaces.stream().anyMatch(ns -> this.nsImports(ns, element))) { + qualifiedName = Optional.ofNullable(element.getDeclaredName()).orElse(""); + } + return qualifiedName; + } + + private boolean nsImports(Namespace ns, Element element) { + return ns.getImportedMembership().stream() + .filter(OwningMembership.class::isInstance) + .map(OwningMembership.class::cast) + .map(OwningMembership::getMemberElement) + .anyMatch(importedMemeber -> importedMemeber == element); + } + @Override public String getValueLabel(Usage usage) { return this.getValueStringRepresentation(usage, false); diff --git a/backend/services/syson-diagram-services/src/test/java/org/eclipse/syson/diagram/services/DiagramQueryLabelServiceTest.java b/backend/services/syson-diagram-services/src/test/java/org/eclipse/syson/diagram/services/DiagramQueryLabelServiceTest.java index 19cf66027..3ec5393e2 100644 --- a/backend/services/syson-diagram-services/src/test/java/org/eclipse/syson/diagram/services/DiagramQueryLabelServiceTest.java +++ b/backend/services/syson-diagram-services/src/test/java/org/eclipse/syson/diagram/services/DiagramQueryLabelServiceTest.java @@ -19,19 +19,25 @@ import org.eclipse.syson.sysml.AttributeUsage; import org.eclipse.syson.sysml.ConstraintUsage; +import org.eclipse.syson.sysml.DataType; import org.eclipse.syson.sysml.Dependency; +import org.eclipse.syson.sysml.Element; import org.eclipse.syson.sysml.Feature; import org.eclipse.syson.sysml.FeatureChainExpression; import org.eclipse.syson.sysml.FeatureChaining; import org.eclipse.syson.sysml.FeatureDirectionKind; import org.eclipse.syson.sysml.FeatureReferenceExpression; +import org.eclipse.syson.sysml.FeatureTyping; import org.eclipse.syson.sysml.FeatureValue; import org.eclipse.syson.sysml.InterfaceUsage; import org.eclipse.syson.sysml.LiteralInteger; import org.eclipse.syson.sysml.Membership; +import org.eclipse.syson.sysml.NamespaceImport; import org.eclipse.syson.sysml.OperatorExpression; import org.eclipse.syson.sysml.OwningMembership; +import org.eclipse.syson.sysml.Package; import org.eclipse.syson.sysml.ParameterMembership; +import org.eclipse.syson.sysml.PartDefinition; import org.eclipse.syson.sysml.ReferenceUsage; import org.eclipse.syson.sysml.RequirementConstraintMembership; import org.eclipse.syson.sysml.ResultExpressionMembership; @@ -426,6 +432,51 @@ public void testGetEdgeLabelOfInterfaceWithNameAndShortName() { assertThat(this.labelService.getEdgeLabel(interfaceUsage)).isEqualTo(SHORT_NAME_LABEL + " interface"); } + @DisplayName("GIVEN a namespace imported, WHEN the label of an attribute whose type is from the imported namespace, THEN the attribute's type should be shortened in its label") + @Test + public void testAttributeTypeShortenedIfNamespaceImported() { + String customTypeName = "CustomType"; + + Package parentPackage = SysmlFactory.eINSTANCE.createPackage(); + parentPackage.setDeclaredName("Parent"); + + Package definition = SysmlFactory.eINSTANCE.createPackage(); + definition.setDeclaredName("TypeDefinition"); + this.addOwnedMember(parentPackage, definition); + + DataType customDataType = SysmlFactory.eINSTANCE.createDataType(); + customDataType.setDeclaredName(customTypeName); + this.addOwnedMember(definition, customDataType); + + Package usage = SysmlFactory.eINSTANCE.createPackage(); + usage.setDeclaredName("TypeUsage"); + this.addOwnedMember(parentPackage, usage); + + NamespaceImport nsImport = SysmlFactory.eINSTANCE.createNamespaceImport(); + nsImport.setImportedNamespace(definition); + this.addOwnedMember(usage, nsImport); + + PartDefinition partDef = SysmlFactory.eINSTANCE.createPartDefinition(); + partDef.setDeclaredName("PartDef1"); + this.addOwnedMember(usage, partDef); + + AttributeUsage attribute = SysmlFactory.eINSTANCE.createAttributeUsage(); + attribute.setDeclaredName("x1"); + this.addOwnedMember(partDef, attribute); + + FeatureTyping typing = SysmlFactory.eINSTANCE.createFeatureTyping(); + typing.setType(customDataType); + attribute.getOwnedRelationship().add(typing); + + assertThat(this.labelService.getCompartmentItemLabel(attribute)).isEqualTo("x1 : CustomType"); + } + + private void addOwnedMember(Element parent, Element child) { + OwningMembership owningMembership = SysmlFactory.eINSTANCE.createOwningMembership(); + owningMembership.getOwnedRelatedElement().add(child); + parent.getOwnedRelationship().add(owningMembership); + } + /** * Creates an {@link OperatorExpression} in the given {@code constraintUsage}. *