Skip to content

Commit 56d19ff

Browse files
authored
Merge pull request #557 from Systems-Modeling/ST6RI-762
ST6RI-762: %viz command causes ConcurrentModificationException
2 parents 84996a6 + 69bf624 commit 56d19ff

9 files changed

Lines changed: 40 additions & 17 deletions

File tree

org.omg.sysml.plantuml/src/org/omg/sysml/plantuml/InheritKey.java

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,6 @@
11
/*****************************************************************************
22
* SysML 2 Pilot Implementation, PlantUML Visualization
3-
* Copyright (c) 2022-2023 Mgnite Inc.
3+
* Copyright (c) 2022-2024 Mgnite 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

org.omg.sysml.plantuml/src/org/omg/sysml/plantuml/SysML2PlantUMLText.java

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,6 @@
11
/*****************************************************************************
22
* SysML 2 Pilot Implementation, PlantUML Visualization
3-
* Copyright (c) 2020-2023 Mgnite Inc.
3+
* Copyright (c) 2020-2024 Mgnite 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

org.omg.sysml.plantuml/src/org/omg/sysml/plantuml/VBehavior.java

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -128,7 +128,7 @@ public String caseSuccession(Succession su) {
128128
private boolean resolveReference(Feature f, ActionUsage au, boolean send) {
129129
if (!(f instanceof ReferenceUsage)) return false;
130130
boolean flag = true;
131-
for (Membership m: f.getOwnedMembership()) {
131+
for (Membership m: toOwnedMembershipArray(f)) {
132132
if (m instanceof FeatureValue) {
133133
FeatureValue fv = (FeatureValue) m;
134134
Expression e = fv.getValue();
@@ -235,7 +235,7 @@ private String convertToDescription(TransitionUsage tu) {
235235
String guardString = null;
236236
String effectString = null;
237237

238-
for (FeatureMembership fm: tu.getOwnedFeatureMembership()) {
238+
for (FeatureMembership fm: toOwnedFeatureMembershipArray(tu)) {
239239
if (!(fm instanceof TransitionFeatureMembership)) continue;
240240
TransitionFeatureMembership tfm = (TransitionFeatureMembership) fm;
241241
Step s = tfm.getTransitionFeature();

org.omg.sysml.plantuml/src/org/omg/sysml/plantuml/VCompartment.java

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,6 @@
11
/*****************************************************************************
22
* SysML 2 Pilot Implementation, PlantUML Visualization
3-
* Copyright (c) 2020-2023 Mgnite Inc.
3+
* Copyright (c) 2020-2024 Mgnite Inc.
44
* Copyright (c) 2021-2023 Model Driven Solutions, Inc.
55
*
66
* This program is free software: you can redistribute it and/or modify
@@ -203,7 +203,7 @@ private class CompTree {
203203
private final CompartmentEntry parent;
204204

205205
public void process(Feature f) {
206-
for (Membership m: f.getOwnedMembership()) {
206+
for (Membership m: toOwnedMembershipArray(f)) {
207207
Element e = m.getMemberElement();
208208
if (e instanceof Expression) {
209209
// Do not show it

org.omg.sysml.plantuml/src/org/omg/sysml/plantuml/VDefault.java

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,6 @@
11
/*****************************************************************************
22
* SysML 2 Pilot Implementation, PlantUML Visualization
3-
* Copyright (c) 2020-2023 Mgnite Inc.
3+
* Copyright (c) 2020-2024 Mgnite Inc.
44
* Copyright (c) 2020-2023 Model Driven Solutions, Inc.
55
*
66
* This program is free software: you can redistribute it and/or modify
@@ -263,7 +263,7 @@ public String caseDependency(Dependency dep) {
263263
}
264264

265265
protected static boolean isEmptyFeature(Feature f) {
266-
for (FeatureMembership fm: f.getOwnedFeatureMembership()) {
266+
for (FeatureMembership fm: toOwnedFeatureMembershipArray(f)) {
267267
if (fm.getOwnedMemberFeature() instanceof BindingConnector) continue;
268268
return false;
269269
}
@@ -272,7 +272,7 @@ protected static boolean isEmptyFeature(Feature f) {
272272

273273
protected Relationship findBindingLikeRel(Feature f) {
274274
Relationship ret = null;
275-
for (Relationship rel : f.getOwnedRelationship()) {
275+
for (Relationship rel : toOwnedRelationshipArray(f)) {
276276
if (rel instanceof FeatureValue) {
277277
// first priority
278278
return rel;

org.omg.sysml.plantuml/src/org/omg/sysml/plantuml/VPath.java

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,6 @@
11
/*****************************************************************************
22
* SysML 2 Pilot Implementation, PlantUML Visualization
3-
* Copyright (c) 2020-2023 Mgnite Inc.
3+
* Copyright (c) 2020-2024 Mgnite Inc.
44
* Copyright (c) 2022 Model Driven Solutions, Inc.
55
*
66
* This program is free software: you can redistribute it and/or modify
@@ -306,7 +306,7 @@ private InheritKey makeInheritKeyOfOwner(Feature f) {
306306
}
307307
*/
308308
private static Feature getIOTarget(ItemFlowEnd ife) {
309-
for (FeatureMembership fm: ife.getOwnedFeatureMembership()) {
309+
for (FeatureMembership fm: toOwnedFeatureMembershipArray(ife)) {
310310
Feature f = fm.getOwnedMemberFeature();
311311
for (Redefinition rd: f.getOwnedRedefinition()) {
312312
return rd.getRedefinedFeature();

org.omg.sysml.plantuml/src/org/omg/sysml/plantuml/VStructure.java

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,6 @@
11
/*****************************************************************************
22
* SysML 2 Pilot Implementation, PlantUML Visualization
3-
* Copyright (c) 2020-2023 Mgnite Inc.
3+
* Copyright (c) 2020-2024 Mgnite Inc.
44
* Copyright (c) 2021-2023 Model Driven Solutions, Inc.
55
*
66
* This program is free software: you can redistribute it and/or modify
@@ -140,7 +140,7 @@ protected boolean appendFeatureValue(FeatureValue fv) {
140140

141141
private boolean addFeatureMembershipText(Feature f) {
142142
boolean flag = false;
143-
for (Membership m: f.getOwnedMembership()) {
143+
for (Membership m: toOwnedMembershipArray(f)) {
144144
if (m instanceof FeatureValue) {
145145
return appendFeatureValue((FeatureValue) m);
146146
} else if (m instanceof ResultExpressionMembership) {

org.omg.sysml.plantuml/src/org/omg/sysml/plantuml/VTraverser.java

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,6 @@
11
/*****************************************************************************
22
* SysML 2 Pilot Implementation, PlantUML Visualization
3-
* Copyright (c) 2020-2023 Mgnite Inc.
3+
* Copyright (c) 2020-2024 Mgnite Inc.
44
* Copyright (c) 2022 Model Driven Solutions, Inc.
55
*
66
* This program is free software: you can redistribute it and/or modify
@@ -84,15 +84,15 @@ private static boolean isModelLibrary(Element e) {
8484
}
8585

8686
private void traverseInternal(Namespace n, Set<Element> covered) {
87-
for (Relationship r: n.getOwnedRelationship()) {
87+
for (Relationship r: toOwnedRelationshipArray(n)) {
8888
if (r instanceof Membership) {
8989
Membership ms = (Membership) r;
9090
setInherited(false);
9191
Element e = ms.getMemberElement();
9292
markRedefining(e, covered);
9393
this.currentMembership = ms;
9494
visit(ms);
95-
for (Relationship r2: ms.getOwnedRelationship()) {
95+
for (Relationship r2: toOwnedRelationshipArray(ms)) {
9696
setInherited(false);
9797
visit(r2);
9898
}

org.omg.sysml.plantuml/src/org/omg/sysml/plantuml/Visitor.java

Lines changed: 24 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,6 @@
11
/*****************************************************************************
22
* SysML 2 Pilot Implementation, PlantUML Visualization
3-
* Copyright (c) 2020-2023 Mgnite Inc.
3+
* Copyright (c) 2020-2024 Mgnite Inc.
44
* Copyright (c) 2023 Model Driven Solutions, Inc.
55
*
66
* This program is free software: you can redistribute it and/or modify
@@ -36,13 +36,15 @@
3636
import org.omg.sysml.lang.sysml.Element;
3737
import org.omg.sysml.lang.sysml.Feature;
3838
import org.omg.sysml.lang.sysml.FeatureChaining;
39+
import org.omg.sysml.lang.sysml.FeatureMembership;
3940
import org.omg.sysml.lang.sysml.FeatureTyping;
4041
import org.omg.sysml.lang.sysml.Membership;
4142
import org.omg.sysml.lang.sysml.Multiplicity;
4243
import org.omg.sysml.lang.sysml.MultiplicityRange;
4344
import org.omg.sysml.lang.sysml.Namespace;
4445
import org.omg.sysml.lang.sysml.Redefinition;
4546
import org.omg.sysml.lang.sysml.ReferenceSubsetting;
47+
import org.omg.sysml.lang.sysml.Relationship;
4648
import org.omg.sysml.lang.sysml.Subsetting;
4749
import org.omg.sysml.lang.sysml.Type;
4850
import org.omg.sysml.lang.sysml.util.SysMLSwitch;
@@ -748,4 +750,25 @@ public String visit(Element e) {
748750
s2p.countVisits();
749751
return doSwitch(e);
750752
}
753+
754+
// Accessing relationships may cause ConcurrentModificationException over iterators
755+
// because it may trigger "on-demand" transformation. So we introduce utility methods
756+
// to copy them into an array.
757+
public static Relationship[] toOwnedRelationshipArray(Element e) {
758+
List<Relationship> rels = e.getOwnedRelationship();
759+
Relationship[] array = new Relationship[rels.size()];
760+
return rels.toArray(array);
761+
}
762+
763+
public static Membership[] toOwnedMembershipArray(Namespace ns) {
764+
List<Membership> ms = ns.getOwnedMembership();
765+
Membership[] array = new Membership[ms.size()];
766+
return ms.toArray(array);
767+
}
768+
769+
public static FeatureMembership[] toOwnedFeatureMembershipArray(Feature f) {
770+
List<FeatureMembership> fms = f.getOwnedFeatureMembership();
771+
FeatureMembership[] array = new FeatureMembership[fms.size()];
772+
return fms.toArray(array);
773+
}
751774
}

0 commit comments

Comments
 (0)