Skip to content

Commit 05b4193

Browse files
authored
Merge pull request #729 from Systems-Modeling/ST6RI-909
ST6RI-909 Circular recursive import causes infinite recursion in getImportedMembership
2 parents 505c9e2 + 4efa06e commit 05b4193

2 files changed

Lines changed: 31 additions & 2 deletions

File tree

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

Lines changed: 30 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -21,6 +21,7 @@
2121

2222
package org.omg.sysml.interactive.tests;
2323

24+
import static org.junit.Assert.assertArrayEquals;
2425
import static org.junit.Assert.assertEquals;
2526
import static org.junit.Assert.assertFalse;
2627
import static org.junit.Assert.assertNull;
@@ -41,6 +42,7 @@
4142
import org.omg.sysml.lang.sysml.Expression;
4243
import org.omg.sysml.lang.sysml.Feature;
4344
import org.omg.sysml.lang.sysml.ItemUsage;
45+
import org.omg.sysml.lang.sysml.Membership;
4446
import org.omg.sysml.lang.sysml.Namespace;
4547
import org.omg.sysml.lang.sysml.Relationship;
4648
import org.omg.sysml.lang.sysml.TriggerInvocationExpression;
@@ -298,7 +300,34 @@ public void testEnumeratedValue() throws Exception {
298300
variants = ((Definition)ownedMembers.get(1)).getVariant();
299301
List<EnumerationUsage> enumeratedValues = ((EnumerationDefinition)ownedMembers.get(1)).getEnumeratedValue();
300302
assertEquals("enum def (variants.size)", 2, variants.size());
301-
assertEquals("enuim def (enumeratedValues.size)", 2, enumeratedValues.size());
303+
assertEquals("enum def (enumeratedValues.size)", 2, enumeratedValues.size());
302304
assertEquals("enum def (enumeratedValues)", variants, enumeratedValues);
303305
}
306+
307+
public final String circularRecursiveImportTest =
308+
"package Test {\n"
309+
+ " package P1 {\n"
310+
+ " public import Test::**;\n"
311+
+ " item def X;"
312+
+ " }\n"
313+
+ " package P2 {\n"
314+
+ " public import Test::*::**;\n"
315+
+ " item def Y;"
316+
+ " }\n"
317+
+ "}";
318+
319+
@Test
320+
public void testCircularRecursiveImport() throws Exception {
321+
SysMLInteractive instance = getSysMLInteractiveInstance();
322+
SysMLInteractiveResult result = instance.process(circularRecursiveImportTest);
323+
Element root = result.getRootElement();
324+
List<Element> elements = ((Namespace)root).getOwnedMember();
325+
List<Element> ownedMembers = ((Namespace)elements.get(0)).getOwnedMember();
326+
List<Membership> importedMemberships = ((Namespace)ownedMembers.get(0)).getImportedMembership();
327+
assertArrayEquals("P1.importedMembers", new String[] {"Test", "P1", "P2", "X", "Y"},
328+
importedMemberships.stream().map(Membership::getMemberElement).map(Element::getName).toArray());
329+
importedMemberships = ((Namespace)ownedMembers.get(1)).getImportedMembership();
330+
assertArrayEquals("P2.importedMembers", new String[] {"P1", "P2", "X", "Test", "Y"},
331+
importedMemberships.stream().map(Membership::getMemberElement).map(Element::getName).toArray());
332+
}
304333
}

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

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -49,7 +49,7 @@ public void importMemberships(EList<Membership> importedMemberships, Set<Namespa
4949
importedMemberships.add(importedMembership);
5050
if (target.isRecursive()) {
5151
Element importedElement = importedMembership.getMemberElement();
52-
if (importedElement instanceof Namespace) {
52+
if (importedElement instanceof Namespace && !excluded.contains(importedElement)) {
5353
Collection<Membership> namespaceMembership =
5454
NamespaceUtil.getVisibleMembershipsFor((Namespace)importedElement, excluded, true, target.isImportAll());
5555
importedMemberships.addAll(namespaceMembership);

0 commit comments

Comments
 (0)