Skip to content

Commit 7e6c5ea

Browse files
committed
Merge pull request #749 from Systems-Modeling/ST6RI-925
ST6RI-925 Problem with deriveTypeFeatureMembership (KERML11-191)
2 parents f61a1df + 97a9854 commit 7e6c5ea

4 files changed

Lines changed: 63 additions & 12 deletions

File tree

org.omg.sysml.interactive.tests/src/org/omg/sysml/interactive/tests/DerivedPropertyAndOperationTest.java

Lines changed: 33 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -45,11 +45,13 @@
4545
import org.omg.sysml.lang.sysml.EnumerationUsage;
4646
import org.omg.sysml.lang.sysml.Expression;
4747
import org.omg.sysml.lang.sysml.Feature;
48+
import org.omg.sysml.lang.sysml.FeatureMembership;
4849
import org.omg.sysml.lang.sysml.ItemUsage;
4950
import org.omg.sysml.lang.sysml.Membership;
5051
import org.omg.sysml.lang.sysml.Namespace;
5152
import org.omg.sysml.lang.sysml.Relationship;
5253
import org.omg.sysml.lang.sysml.TriggerInvocationExpression;
54+
import org.omg.sysml.lang.sysml.Type;
5355
import org.omg.sysml.lang.sysml.Usage;
5456
import org.omg.sysml.lang.sysml.ViewUsage;
5557

@@ -384,4 +386,35 @@ public void testCrossFeature() throws Exception {
384386
assertEquals("end1 cross feature", end1.ownedCrossFeature(), end1.getCrossFeature());
385387
assertEquals("end2 cross feature", a_b, end2.getCrossFeature().getFeatureTarget());
386388
}
389+
390+
public final String featureMembershipTest =
391+
"package Test {\n"
392+
+ " part def A {\n"
393+
+ " attribute f;\n"
394+
+ " }\n"
395+
+ " part def B {\n"
396+
+ " public import A::*;\n"
397+
+ " feature g;\n"
398+
+ " }\n"
399+
+ " part def C :> B;"
400+
+ "}";
401+
402+
@Test
403+
public void testFeatureMembership() throws Exception {
404+
SysMLInteractive instance = getSysMLInteractiveInstance();
405+
SysMLInteractiveResult result = instance.process(featureMembershipTest);
406+
Element root = result.getRootElement();
407+
List<Element> elements = ((Namespace)root).getOwnedMember();
408+
List<Element> ownedMembers = ((Namespace)elements.get(0)).getOwnedMember();
409+
Definition A = (Definition)ownedMembers.get(0);
410+
Definition B = (Definition)ownedMembers.get(1);
411+
Definition C = (Definition)ownedMembers.get(2);
412+
assertTrue("A", testFeatureOwningTypes(A));
413+
assertTrue("B", testFeatureOwningTypes(B));
414+
assertTrue("C", testFeatureOwningTypes(C));
415+
}
416+
417+
private boolean testFeatureOwningTypes(Type type) {
418+
return type.getFeatureMembership().stream().map(FeatureMembership::getOwningType).allMatch(t->type.specializes(t));
419+
}
387420
}

org.omg.sysml/src/org/omg/sysml/adapter/TypeAdapter.java

Lines changed: 22 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -46,6 +46,7 @@
4646
import org.omg.sysml.lang.sysml.Element;
4747
import org.omg.sysml.lang.sysml.Expression;
4848
import org.omg.sysml.lang.sysml.Feature;
49+
import org.omg.sysml.lang.sysml.FeatureMembership;
4950
import org.omg.sysml.lang.sysml.Specialization;
5051
import org.omg.sysml.lang.sysml.Membership;
5152
import org.omg.sysml.lang.sysml.ResultExpressionMembership;
@@ -202,18 +203,38 @@ protected Collection<Feature> getFeaturesRedefinedByType() {
202203
}
203204
return redefinedFeatures;
204205
}
206+
207+
public EList<FeatureMembership> getFeatureMembership() {
208+
if (featureMembership == null) {
209+
Type target = getTarget();
210+
EList<FeatureMembership> featureMemberships = new NonNotifyingEObjectEList<FeatureMembership>(FeatureMembership.class, (InternalEObject) target, SysMLPackage.TYPE__FEATURE_MEMBERSHIP);
211+
featureMemberships.addAll(target.getOwnedFeatureMembership());
212+
// For improved performance, compute supertypes only once.
213+
List<Type> allSupertypes = target.allSupertypes();
214+
for (Membership membership: target.getInheritedMembership()) {
215+
if (membership instanceof FeatureMembership &&
216+
allSupertypes.contains(membership.getMembershipOwningNamespace())) {
217+
featureMemberships.add((FeatureMembership)membership);
218+
}
219+
}
220+
featureMembership = featureMemberships;
221+
}
222+
return featureMembership;
223+
}
205224

206225
// Caching
207226

208227
private EList<Membership> inheritedMembership = null;
209228
private EList<Membership> nonPrivateMembership = null;
210-
private Collection<Feature> redefinedFeatures = null;
229+
private Collection<Feature> redefinedFeatures = null;
230+
private EList<FeatureMembership> featureMembership = null;
211231

212232
public void clearCaches() {
213233
super.clearCaches();
214234
inheritedMembership = null;
215235
nonPrivateMembership = null;
216236
redefinedFeatures = null;
237+
featureMembership = null;
217238
}
218239

219240
// Implicit Elements

org.omg.sysml/src/org/omg/sysml/delegate/setting/Type_featureMembership_SettingDelegate.java

Lines changed: 3 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,7 @@
11
/*******************************************************************************
22
* SysML 2 Pilot Implementation
33
* Copyright (c) 2022 Siemens AG
4-
* Copyright (c) 2022 Model Driven Solutions, Inc.
4+
* Copyright (c) 2022, 2026 Model Driven Solutions, Inc.
55
*
66
* This program is free software: you can redistribute it and/or modify
77
* it under the terms of the GNU Lesser General Public License as published by
@@ -25,9 +25,8 @@
2525
import org.eclipse.emf.common.util.EList;
2626
import org.eclipse.emf.ecore.EStructuralFeature;
2727
import org.eclipse.emf.ecore.InternalEObject;
28-
import org.omg.sysml.lang.sysml.FeatureMembership;
2928
import org.omg.sysml.lang.sysml.Type;
30-
import org.omg.sysml.util.NonNotifyingEObjectEList;
29+
import org.omg.sysml.util.TypeUtil;
3130

3231
public class Type_featureMembership_SettingDelegate extends BasicDerivedListSettingDelegate {
3332

@@ -37,13 +36,7 @@ public Type_featureMembership_SettingDelegate(EStructuralFeature eStructuralFeat
3736

3837
@Override
3938
protected EList<?> basicGet(InternalEObject owner) {
40-
EList<FeatureMembership> featureMemberships = new NonNotifyingEObjectEList<>(FeatureMembership.class, owner, eStructuralFeature.getFeatureID());
41-
featureMemberships.addAll(((Type)owner).getOwnedFeatureMembership());
42-
((Type)owner).getInheritedMembership().stream().
43-
filter(FeatureMembership.class::isInstance).
44-
map(FeatureMembership.class::cast).
45-
forEachOrdered(featureMemberships::add);
46-
return featureMemberships;
39+
return TypeUtil.getFeatureMembershipOf((Type)owner);
4740
}
4841

4942
}

org.omg.sysml/src/org/omg/sysml/util/TypeUtil.java

Lines changed: 5 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,6 @@
11
/*******************************************************************************
22
* SysML 2 Pilot Implementation
3-
* Copyright (c) 2021-2022, 2024-2025 Model Driven Solutions, Inc.
3+
* Copyright (c) 2021-2022, 2024-2026 Model Driven Solutions, Inc.
44
*
55
* This program is free software: you can redistribute it and/or modify
66
* it under the terms of the GNU Lesser General Public License as published by
@@ -104,6 +104,10 @@ public static List<Feature> getFeaturesRedefinedBy(Type type, Feature skip) {
104104
flatMap(feature->FeatureUtil.getRedefinedFeaturesWithComputedOf(feature).stream()).
105105
toList();
106106
}
107+
108+
public static EList<FeatureMembership> getFeatureMembershipOf(Type type) {
109+
return getTypeAdapter(type).getFeatureMembership();
110+
}
107111

108112
// Supertypes
109113

0 commit comments

Comments
 (0)