Skip to content

Commit d07dcf5

Browse files
committed
[1850] Simplify the label for a type by considering shared ancestors and imports
Bug: #1850 Signed-off-by: Pierre-Charles David <pierre-charles.david@obeo.fr>
1 parent 7f8c412 commit d07dcf5

2 files changed

Lines changed: 79 additions & 1 deletion

File tree

backend/services/syson-diagram-services/src/main/java/org/eclipse/syson/diagram/services/DiagramQueryLabelService.java

Lines changed: 28 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -15,6 +15,7 @@
1515
import static java.util.stream.Collectors.joining;
1616

1717
import java.util.Objects;
18+
import java.util.Optional;
1819
import java.util.function.BinaryOperator;
1920

2021
import org.eclipse.emf.common.util.EList;
@@ -38,6 +39,7 @@
3839
import org.eclipse.syson.sysml.FeatureValue;
3940
import org.eclipse.syson.sysml.LiteralExpression;
4041
import org.eclipse.syson.sysml.MultiplicityRange;
42+
import org.eclipse.syson.sysml.Namespace;
4143
import org.eclipse.syson.sysml.OwningMembership;
4244
import org.eclipse.syson.sysml.Redefinition;
4345
import org.eclipse.syson.sysml.ReferenceSubsetting;
@@ -50,6 +52,7 @@
5052
import org.eclipse.syson.sysml.Type;
5153
import org.eclipse.syson.sysml.Usage;
5254
import org.eclipse.syson.sysml.VariantMembership;
55+
import org.eclipse.syson.sysml.helper.EMFUtils;
5356
import org.eclipse.syson.sysml.helper.LabelConstants;
5457
import org.eclipse.syson.sysml.textual.SysMLElementSerializer;
5558
import org.eclipse.syson.sysml.textual.utils.Appender;
@@ -202,13 +205,37 @@ public String getTypingLabel(Element element) {
202205
label.append(LabelConstants.SPACE);
203206
label.append(LabelConstants.COLON);
204207
label.append(LabelConstants.SPACE);
205-
label.append(this.getDeclaredNameLabel(type));
208+
label.append(this.buildImportContextRelativeQualifiedName(type, element));
206209
}
207210
}
208211
}
209212
return label.toString();
210213
}
211214

215+
private String buildImportContextRelativeQualifiedName(Element element, Element from) {
216+
String qualifiedName = Optional.ofNullable(element.getQualifiedName()).orElse("");
217+
Element commonAncestor = EMFUtils.getLeastCommonContainer(Element.class, element, from);
218+
if (commonAncestor != null) {
219+
String prefix = commonAncestor.getQualifiedName() + "::";
220+
if (qualifiedName.startsWith(prefix)) {
221+
qualifiedName = qualifiedName.substring(prefix.length());
222+
}
223+
}
224+
var namespaces = EMFUtils.getAncestors(Namespace.class, from, null);
225+
if (namespaces.stream().anyMatch(ns -> this.nsImports(ns, element))) {
226+
qualifiedName = Optional.ofNullable(element.getDeclaredName()).orElse("");
227+
}
228+
return qualifiedName;
229+
}
230+
231+
private boolean nsImports(Namespace ns, Element element) {
232+
return ns.getImportedMembership().stream()
233+
.filter(OwningMembership.class::isInstance)
234+
.map(OwningMembership.class::cast)
235+
.map(OwningMembership::getMemberElement)
236+
.anyMatch(importedMemeber -> importedMemeber == element);
237+
}
238+
212239
@Override
213240
public String getValueLabel(Usage usage) {
214241
return this.getValueStringRepresentation(usage, false);

backend/services/syson-diagram-services/src/test/java/org/eclipse/syson/diagram/services/DiagramQueryLabelServiceTest.java

Lines changed: 51 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -19,19 +19,25 @@
1919

2020
import org.eclipse.syson.sysml.AttributeUsage;
2121
import org.eclipse.syson.sysml.ConstraintUsage;
22+
import org.eclipse.syson.sysml.DataType;
2223
import org.eclipse.syson.sysml.Dependency;
24+
import org.eclipse.syson.sysml.Element;
2325
import org.eclipse.syson.sysml.Feature;
2426
import org.eclipse.syson.sysml.FeatureChainExpression;
2527
import org.eclipse.syson.sysml.FeatureChaining;
2628
import org.eclipse.syson.sysml.FeatureDirectionKind;
2729
import org.eclipse.syson.sysml.FeatureReferenceExpression;
30+
import org.eclipse.syson.sysml.FeatureTyping;
2831
import org.eclipse.syson.sysml.FeatureValue;
2932
import org.eclipse.syson.sysml.InterfaceUsage;
3033
import org.eclipse.syson.sysml.LiteralInteger;
3134
import org.eclipse.syson.sysml.Membership;
35+
import org.eclipse.syson.sysml.NamespaceImport;
3236
import org.eclipse.syson.sysml.OperatorExpression;
3337
import org.eclipse.syson.sysml.OwningMembership;
38+
import org.eclipse.syson.sysml.Package;
3439
import org.eclipse.syson.sysml.ParameterMembership;
40+
import org.eclipse.syson.sysml.PartDefinition;
3541
import org.eclipse.syson.sysml.ReferenceUsage;
3642
import org.eclipse.syson.sysml.RequirementConstraintMembership;
3743
import org.eclipse.syson.sysml.ResultExpressionMembership;
@@ -426,6 +432,51 @@ public void testGetEdgeLabelOfInterfaceWithNameAndShortName() {
426432
assertThat(this.labelService.getEdgeLabel(interfaceUsage)).isEqualTo(SHORT_NAME_LABEL + " interface");
427433
}
428434

435+
@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")
436+
@Test
437+
public void testAttributeTypeShortenedIfNamespaceImported() {
438+
String customTypeName = "CustomType";
439+
440+
Package parentPackage = SysmlFactory.eINSTANCE.createPackage();
441+
parentPackage.setDeclaredName("Parent");
442+
443+
Package definition = SysmlFactory.eINSTANCE.createPackage();
444+
definition.setDeclaredName("TypeDefinition");
445+
this.addOwnedMember(parentPackage, definition);
446+
447+
DataType customDataType = SysmlFactory.eINSTANCE.createDataType();
448+
customDataType.setDeclaredName(customTypeName);
449+
this.addOwnedMember(definition, customDataType);
450+
451+
Package usage = SysmlFactory.eINSTANCE.createPackage();
452+
usage.setDeclaredName("TypeUsage");
453+
this.addOwnedMember(parentPackage, usage);
454+
455+
NamespaceImport nsImport = SysmlFactory.eINSTANCE.createNamespaceImport();
456+
nsImport.setImportedNamespace(definition);
457+
this.addOwnedMember(usage, nsImport);
458+
459+
PartDefinition partDef = SysmlFactory.eINSTANCE.createPartDefinition();
460+
partDef.setDeclaredName("PartDef1");
461+
this.addOwnedMember(usage, partDef);
462+
463+
AttributeUsage attribute = SysmlFactory.eINSTANCE.createAttributeUsage();
464+
attribute.setDeclaredName("x1");
465+
this.addOwnedMember(partDef, attribute);
466+
467+
FeatureTyping typing = SysmlFactory.eINSTANCE.createFeatureTyping();
468+
typing.setType(customDataType);
469+
attribute.getOwnedRelationship().add(typing);
470+
471+
assertThat(this.labelService.getCompartmentItemLabel(attribute)).isEqualTo("x1 : CustomType");
472+
}
473+
474+
private void addOwnedMember(Element parent, Element child) {
475+
OwningMembership owningMembership = SysmlFactory.eINSTANCE.createOwningMembership();
476+
owningMembership.getOwnedRelatedElement().add(child);
477+
parent.getOwnedRelationship().add(owningMembership);
478+
}
479+
429480
/**
430481
* Creates an {@link OperatorExpression} in the given {@code constraintUsage}.
431482
* <p>

0 commit comments

Comments
 (0)