Skip to content

Commit c4c3ef4

Browse files
authored
Merge pull request #723 from Systems-Modeling/ST6RI-899
ST6RI-899 getEnumeratedValue and getVariant broken on EnumerationDefinition
2 parents 5d05f70 + 176974c commit c4c3ef4

4 files changed

Lines changed: 105 additions & 22 deletions

File tree

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

Lines changed: 84 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,6 @@
11
/*******************************************************************************
22
* SysML 2 Pilot Implementation
3-
* Copyright (c) 2021-2022 Model Driven Solutions, Inc.
3+
* Copyright (c) 2021-2022, 2025 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
@@ -36,6 +36,8 @@
3636
import org.omg.sysml.lang.sysml.AttributeUsage;
3737
import org.omg.sysml.lang.sysml.Definition;
3838
import org.omg.sysml.lang.sysml.Element;
39+
import org.omg.sysml.lang.sysml.EnumerationDefinition;
40+
import org.omg.sysml.lang.sysml.EnumerationUsage;
3941
import org.omg.sysml.lang.sysml.Expression;
4042
import org.omg.sysml.lang.sysml.Feature;
4143
import org.omg.sysml.lang.sysml.ItemUsage;
@@ -173,7 +175,7 @@ public void testPathOperation() throws Exception {
173175
assertEquals("TopLevel/3/1/1/1", TopLevel_3_1_1.getOwnedRelatedElement().get(0).path());
174176
}
175177

176-
public final String directedUsageTest =
178+
public final String directedUsageTest1 =
177179
"package Test {\n"
178180
+ " item def I {\n"
179181
+ " in x;\n"
@@ -190,9 +192,9 @@ public void testPathOperation() throws Exception {
190192
+ "}";
191193

192194
@Test
193-
public void testDirectedUsage() throws Exception {
195+
public void testDirectedUsage1() throws Exception {
194196
SysMLInteractive instance = getSysMLInteractiveInstance();
195-
SysMLInteractiveResult result = instance.process(directedUsageTest);
197+
SysMLInteractiveResult result = instance.process(directedUsageTest1);
196198
Element root = result.getRootElement();
197199
List<Element> elements = ((Namespace)root).getOwnedMember();
198200
List<Element> ownedMembers = ((Namespace)elements.get(0)).getOwnedMember();
@@ -220,5 +222,83 @@ public void testDirectedUsage() throws Exception {
220222
assertEquals("constraint def (directedUsages.size)", 2, directedUsages.size());
221223
assertEquals("constraint def (directedUsages)", directedFeatures.subList(0, 2), directedUsages);
222224
}
225+
public final String directedUsageTest2 =
226+
"package Test {\n"
227+
+ " item I {\n"
228+
+ " in x;\n"
229+
+ " in y;\n"
230+
+ " }"
231+
+ " action A {\n"
232+
+ " in x;\n"
233+
+ " in y;\n"
234+
+ " }"
235+
+ " constraint C {\n"
236+
+ " in x;\n"
237+
+ " in y;\n"
238+
+ " }"
239+
+ "}";
240+
241+
@Test
242+
public void testDirectedUsage2() throws Exception {
243+
SysMLInteractive instance = getSysMLInteractiveInstance();
244+
SysMLInteractiveResult result = instance.process(directedUsageTest2);
245+
Element root = result.getRootElement();
246+
List<Element> elements = ((Namespace)root).getOwnedMember();
247+
List<Element> ownedMembers = ((Namespace)elements.get(0)).getOwnedMember();
248+
List<Feature> directedFeatures = ((Usage)ownedMembers.get(0)).getDirectedFeature();
249+
List<Usage> directedUsages = ((Usage)ownedMembers.get(0)).getDirectedUsage();
250+
assertEquals("item (directedFeatures.size)", 2, directedFeatures.size());
251+
assertEquals("item (directedUsages.size)", 2, directedUsages.size());
252+
assertEquals("item (directedUsages)", directedFeatures, directedUsages);
253+
254+
// Check that getting directedFeatures and directedUsages work for ActionUsages and
255+
// ConstraintUsages, even though they are kinds of Steps, and Step redefines
256+
// directedFeature as parameter.
257+
258+
directedFeatures = ((Usage)ownedMembers.get(1)).getDirectedFeature();
259+
directedUsages = ((Usage)ownedMembers.get(1)).getDirectedUsage();
260+
assertEquals("action (directedFeatures.size)", 2, directedFeatures.size());
261+
assertEquals("action (directedUsages.size)", 2, directedUsages.size());
262+
assertEquals("action (directedUsages)", directedFeatures, directedUsages);
263+
264+
// The ConstraintUsage "C" has three directedFeatures, including its return parameter,
265+
// but only the first two are Usages.
266+
directedFeatures = ((Usage)ownedMembers.get(2)).getDirectedFeature();
267+
directedUsages = ((Usage)ownedMembers.get(2)).getDirectedUsage();
268+
assertEquals("constraint (directedFeatures.size)", 3, directedFeatures.size());
269+
assertEquals("constraint (directedUsages.size)", 2, directedUsages.size());
270+
assertEquals("constraint (directedUsages)", directedFeatures.subList(0, 2), directedUsages);
271+
}
272+
273+
public final String enumeratedValueTest =
274+
"package Test {\n"
275+
+ " variation item def I {\n"
276+
+ " variant item i1;\n"
277+
+ " variant item i2;\n"
278+
+ " }"
279+
+ " enum def A {\n"
280+
+ " enum a1;\n"
281+
+ " enum a2;\n"
282+
+ " }"
283+
+ "}";
223284

285+
@Test
286+
public void testEnumeratedValue() throws Exception {
287+
SysMLInteractive instance = getSysMLInteractiveInstance();
288+
SysMLInteractiveResult result = instance.process(enumeratedValueTest);
289+
Element root = result.getRootElement();
290+
List<Element> elements = ((Namespace)root).getOwnedMember();
291+
List<Element> ownedMembers = ((Namespace)elements.get(0)).getOwnedMember();
292+
List<Usage> variants = ((Definition)ownedMembers.get(0)).getVariant();
293+
assertEquals("item def (variants.size)", 2, variants.size());
294+
295+
// Check that getting variant and enumeratedValue work for EnumerationDefinitions,
296+
// even though EnumerationDefinition::enumeratedValue redefines Definition::variant.
297+
298+
variants = ((Definition)ownedMembers.get(1)).getVariant();
299+
List<EnumerationUsage> enumeratedValues = ((EnumerationDefinition)ownedMembers.get(1)).getEnumeratedValue();
300+
assertEquals("enum def (variants.size)", 2, variants.size());
301+
assertEquals("enuim def (enumeratedValues.size)", 2, enumeratedValues.size());
302+
assertEquals("enum def (enumeratedValues)", variants, enumeratedValues);
303+
}
224304
}

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

Lines changed: 8 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -24,24 +24,22 @@
2424
import org.eclipse.emf.common.util.EList;
2525
import org.eclipse.emf.ecore.EStructuralFeature;
2626
import org.eclipse.emf.ecore.InternalEObject;
27-
import org.eclipse.uml2.common.util.DerivedEObjectEList;
28-
import org.omg.sysml.lang.sysml.ActionDefinition;
29-
import org.omg.sysml.lang.sysml.ConstraintDefinition;
30-
import org.omg.sysml.lang.sysml.SysMLPackage;
3127
import org.omg.sysml.lang.sysml.Usage;
28+
import org.omg.sysml.util.NonNotifyingEObjectEList;
3229

33-
public class Definition_directedUsage_SettingDelegate extends DefaultDerivedPropertySettingDelegate {
30+
public class Definition_directedUsage_SettingDelegate extends Type_directedFeature_SettingDelegate {
3431

3532
public Definition_directedUsage_SettingDelegate(EStructuralFeature eStructuralFeature) {
3633
super(eStructuralFeature);
3734
}
3835

3936
@Override
4037
protected EList<?> basicGet(InternalEObject owner) {
41-
return owner instanceof ActionDefinition?
42-
new DerivedEObjectEList<>(Usage.class, owner, eStructuralFeature.getFeatureID(), new int[] {SysMLPackage.ACTION_DEFINITION__PARAMETER}):
43-
owner instanceof ConstraintDefinition?
44-
new DerivedEObjectEList<>(Usage.class, owner, eStructuralFeature.getFeatureID(), new int[] {SysMLPackage.CONSTRAINT_DEFINITION__PARAMETER}):
45-
super.basicGet(owner);
38+
EList<Usage> directedUsages = new NonNotifyingEObjectEList<>(Usage.class, owner, eStructuralFeature.getFeatureID());
39+
super.basicGet(owner).stream().
40+
filter(Usage.class::isInstance).
41+
map(Usage.class::cast).
42+
forEachOrdered(directedUsages::add);
43+
return directedUsages;
4644
}
4745
}

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

Lines changed: 9 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,6 @@
11
/*******************************************************************************
22
* SysML 2 Pilot Implementation
3-
* Copyright (c) 2022 Siemens AG
3+
* Copyright (c) 2022, 2025 Siemens AG
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
@@ -24,19 +24,23 @@
2424
import org.eclipse.emf.common.util.EList;
2525
import org.eclipse.emf.ecore.EStructuralFeature;
2626
import org.eclipse.emf.ecore.InternalEObject;
27-
import org.eclipse.uml2.common.util.DerivedEObjectEList;
2827
import org.omg.sysml.lang.sysml.EnumerationUsage;
29-
import org.omg.sysml.lang.sysml.SysMLPackage;
28+
import org.omg.sysml.util.NonNotifyingEObjectEList;
3029

31-
public class EnumerationDefinition_enumeratedValue_SettingDelegate extends BasicDerivedListSettingDelegate {
30+
public class EnumerationDefinition_enumeratedValue_SettingDelegate extends Definition_variant_SettingDelegate {
3231

3332
public EnumerationDefinition_enumeratedValue_SettingDelegate(EStructuralFeature eStructuralFeature) {
3433
super(eStructuralFeature);
3534
}
3635

3736
@Override
3837
protected EList<?> basicGet(InternalEObject owner) {
39-
return new DerivedEObjectEList<>(EnumerationUsage.class, owner, SysMLPackage.ENUMERATION_DEFINITION__ENUMERATED_VALUE, new int[] {SysMLPackage.DEFINITION__VARIANT});
38+
EList<EnumerationUsage> enumeratedValues = new NonNotifyingEObjectEList<>(EnumerationUsage.class, owner, eStructuralFeature.getFeatureID());
39+
super.basicGet(owner).stream().
40+
filter(EnumerationUsage.class::isInstance).
41+
map(EnumerationUsage.class::cast).
42+
forEachOrdered(enumeratedValues::add);
43+
return enumeratedValues;
4044
}
4145

4246
}

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

Lines changed: 4 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -28,7 +28,7 @@
2828
import org.omg.sysml.lang.sysml.Usage;
2929
import org.omg.sysml.util.NonNotifyingEObjectEList;
3030

31-
public class Usage_directedUsage_SettingDelegate extends BasicDerivedListSettingDelegate {
31+
public class Usage_directedUsage_SettingDelegate extends Type_directedFeature_SettingDelegate {
3232

3333
public Usage_directedUsage_SettingDelegate(EStructuralFeature eStructuralFeature) {
3434
super(eStructuralFeature);
@@ -37,8 +37,9 @@ public Usage_directedUsage_SettingDelegate(EStructuralFeature eStructuralFeature
3737
@Override
3838
protected EList<?> basicGet(InternalEObject owner) {
3939
EList<Usage> directedUsages = new NonNotifyingEObjectEList<>(Usage.class, owner, eStructuralFeature.getFeatureID());
40-
((Usage)owner).getUsage().stream().
41-
filter(usage->usage.getDirection() != null).
40+
super.basicGet(owner).stream().
41+
filter(Usage.class::isInstance).
42+
map(Usage.class::cast).
4243
forEachOrdered(directedUsages::add);
4344
return directedUsages;
4445
}

0 commit comments

Comments
 (0)