Skip to content

Commit 817658d

Browse files
committed
[982] Implement Membership#isDistinguishableFrom
Bug: #982 Signed-off-by: Axel RICHARD <axel.richard@obeo.fr>
1 parent 68b2f28 commit 817658d

File tree

4 files changed

+112
-3
lines changed

4 files changed

+112
-3
lines changed

CHANGELOG.adoc

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -36,6 +36,7 @@ The changes are:
3636
* New class TerminateActionUsage
3737
** with new derived reference `terminatedOccurrenceArgument : Expression`
3838
- https://github.com/eclipse-syson/syson/issues/946[#946] [libraries] All standard libraries have been updated to comply with the SysML Beta 2.3 specification.
39+
- https://github.com/eclipse-syson/syson/issues/982[#982] [metamodel] `Membership#isDistinguishableFrom` derived attribute has been implemented.
3940

4041
=== New features
4142

backend/metamodel/syson-sysml-metamodel/src/main/java/org/eclipse/syson/sysml/impl/MembershipImpl.java

Lines changed: 21 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -15,6 +15,7 @@
1515
import java.lang.reflect.InvocationTargetException;
1616
import java.util.Collection;
1717
import java.util.Iterator;
18+
import java.util.Objects;
1819

1920
import org.eclipse.emf.common.notify.Notification;
2021
import org.eclipse.emf.common.util.EList;
@@ -300,13 +301,31 @@ public void setVisibility(VisibilityKind newVisibility) {
300301
}
301302

302303
/**
303-
* <!-- begin-user-doc --> <!-- end-user-doc -->
304+
* <!-- begin-user-doc --> not (memberElement.oclKindOf(other.memberElement.oclType()) or
305+
* other.memberElement.oclKindOf(memberElement.oclType())) or (shortMemberName = null or (shortMemberName <>
306+
* other.shortMemberName and shortMemberName <> other.memberName)) and (memberName = null or (memberName <>
307+
* other.shortMemberName and memberName <> other.memberName)))<!-- end-user-doc -->
304308
*
305309
* @generated NOT
306310
*/
307311
@Override
308312
public boolean isDistinguishableFrom(Membership other) {
309-
return false;
313+
boolean isDistinguishableFrom = true;
314+
var member = this.getMemberElement();
315+
var otherMember = other.getMemberElement();
316+
if (member != null && otherMember != null) {
317+
var memberElementClass = member.eClass();
318+
var otherMemberElementClass = otherMember.eClass();
319+
var memberElementSuperClasses = memberElementClass.getEAllSuperTypes();
320+
var otherMemberElementSuperClasses = otherMemberElementClass.getEAllSuperTypes();
321+
boolean compatibleMembers = Objects.equals(memberElementClass, otherMemberElementClass) || memberElementSuperClasses.contains(otherMemberElementClass)
322+
|| otherMemberElementSuperClasses.contains(memberElementClass);
323+
boolean diffMemberShortName = this.getMemberShortName() == null
324+
|| (!this.getMemberShortName().equals(other.getMemberShortName()) && !this.getMemberShortName().equals(other.getMemberName()));
325+
boolean diffMemberName = this.getMemberName() == null || (!this.getMemberName().equals(other.getMemberShortName()) && !this.getMemberName().equals(other.getMemberName()));
326+
isDistinguishableFrom = !compatibleMembers || (diffMemberShortName && diffMemberName);
327+
}
328+
return isDistinguishableFrom;
310329
}
311330

312331
/**

backend/metamodel/syson-sysml-metamodel/src/test/java/org/eclipse/syson/sysml/impl/MembershipImplTest.java

Lines changed: 87 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,5 @@
11
/*******************************************************************************
2-
* Copyright (c) 2024 Obeo.
2+
* Copyright (c) 2024, 2025 Obeo.
33
* This program and the accompanying materials
44
* are made available under the terms of the Eclipse Public License v2.0
55
* which accompanies this distribution, and is available at
@@ -24,8 +24,14 @@
2424
import org.eclipse.syson.sysml.Element;
2525
import org.eclipse.syson.sysml.Membership;
2626
import org.eclipse.syson.sysml.Namespace;
27+
import org.eclipse.syson.sysml.Package;
28+
import org.eclipse.syson.sysml.PartDefinition;
29+
import org.eclipse.syson.sysml.PartUsage;
2730
import org.eclipse.syson.sysml.SysmlFactory;
2831
import org.eclipse.syson.sysml.SysmlPackage;
32+
import org.eclipse.syson.sysml.util.ModelBuilder;
33+
import org.junit.jupiter.api.BeforeEach;
34+
import org.junit.jupiter.api.DisplayName;
2935
import org.junit.jupiter.api.Test;
3036

3137
/**
@@ -35,6 +41,47 @@
3541
*/
3642
public class MembershipImplTest {
3743

44+
private ModelBuilder builder;
45+
46+
private PartUsage p1;
47+
48+
private PartUsage p2;
49+
50+
private PartUsage p3;
51+
52+
private PartUsage p4;
53+
54+
/**
55+
* <pre>
56+
* .
57+
* package Pkg1 {
58+
* part def Def1 {
59+
* part p1 : Def1;
60+
* part p2 : Def1;
61+
* part p1 : Def2;
62+
* part p1 : Def1;
63+
* }
64+
*
65+
* part def Def2;
66+
* }
67+
* </pre>
68+
*/
69+
@BeforeEach
70+
public void setUp() {
71+
this.builder = new ModelBuilder();
72+
Package pkg1 = this.builder.createWithName(Package.class, "Pkg1");
73+
PartDefinition def1 = this.builder.createInWithName(PartDefinition.class, pkg1, "Def1");
74+
PartDefinition def2 = this.builder.createInWithName(PartDefinition.class, pkg1, "Def2");
75+
this.p1 = this.builder.createInWithName(PartUsage.class, def1, "p1");
76+
this.builder.setType(this.p1, def1);
77+
this.p2 = this.builder.createInWithName(PartUsage.class, def1, "p2");
78+
this.builder.setType(this.p2, def1);
79+
this.p3 = this.builder.createInWithName(PartUsage.class, def1, "p1");
80+
this.builder.setType(this.p3, def2);
81+
this.p4 = this.builder.createInWithName(PartUsage.class, def1, "p1");
82+
this.builder.setType(this.p4, def1);
83+
}
84+
3885
@Test
3986
public void testSource() {
4087
Namespace namespace = SysmlFactory.eINSTANCE.createNamespace();
@@ -61,4 +108,43 @@ public void testTarget() {
61108
assertFalse(membership.getTarget().isEmpty());
62109
assertNotNull(membership.getMemberElement());
63110
}
111+
112+
@DisplayName("Given two memberships containg different name and different type, when isDistinguishableFrom is called, then the result is true")
113+
@Test
114+
public void isDistinguishableFromTest1() {
115+
var lhs = this.p1.getOwningMembership();
116+
var rhs = this.p2.getOwningMembership();
117+
assertTrue(lhs.isDistinguishableFrom(rhs));
118+
}
119+
120+
@DisplayName("Given two memberships containg different name but same type, when isDistinguishableFrom is called, then the result is true")
121+
@Test
122+
public void isDistinguishableFromTest2() {
123+
var lhs = this.p1.getOwningMembership();
124+
var rhs = this.p2.getOwningMembership();
125+
assertTrue(lhs.isDistinguishableFrom(rhs));
126+
}
127+
128+
@DisplayName("Given two memberships containg same name but different type, when isDistinguishableFrom is called, then the result is false")
129+
@Test
130+
public void isDistinguishableFromTest3() {
131+
var lhs = this.p1.getOwningMembership();
132+
var rhs = this.p3.getOwningMembership();
133+
assertFalse(lhs.isDistinguishableFrom(rhs));
134+
}
135+
136+
@DisplayName("Given two memberships containg same name and same type, when isDistinguishableFrom is called, then the result is false")
137+
@Test
138+
public void isDistinguishableFromTest4() {
139+
var lhs = this.p1.getOwningMembership();
140+
var rhs = this.p4.getOwningMembership();
141+
assertFalse(lhs.isDistinguishableFrom(rhs));
142+
}
143+
144+
@DisplayName("Given same memberships, when isDistinguishableFrom is called, then the result is false")
145+
@Test
146+
public void isDistinguishableFromTest5() {
147+
var lhs = this.p1.getOwningMembership();
148+
assertFalse(lhs.isDistinguishableFrom(lhs));
149+
}
64150
}

doc/content/modules/user-manual/pages/release-notes/2025.2.0.adoc

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -88,6 +88,9 @@ The changes are:
8888

8989
image::release-notes-diagrams-export-as-png.png[Export diagram as PNG, width=50%,height=50%]
9090

91+
- `Membership#isDistinguishableFrom` derived attribute has been implemented in the metamodel.
92+
93+
9194
== Dependency update
9295

9396
- Switch to Sirius Web 2025.1.3

0 commit comments

Comments
 (0)