Skip to content

Commit 0c91e52

Browse files
authored
Merge pull request #443 from Systems-Modeling/ST6RI-637
ST6RI-637: FeatureChains starting with subsetting or redefining features are not properly rendered (PlantUML)
2 parents 6fefc19 + 96609d1 commit 0c91e52

11 files changed

Lines changed: 69 additions & 64 deletions

File tree

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

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -91,7 +91,7 @@ public String getTitle() {
9191
return "values";
9292
}
9393
if (om instanceof SubjectMembership) {
94-
return "subjects";
94+
return "subject";
9595
}
9696
if (om instanceof ActorMembership) {
9797
return "actors";

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

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -35,8 +35,13 @@
3535
import org.omg.sysml.lang.sysml.Redefinition;
3636
import org.omg.sysml.lang.sysml.Type;
3737

38+
39+
/* InheritKey identifies a feature or a membership with the context of inheriting.
40+
* The target feature to be identified must be "connectors" owning ends
41+
* or "types" owning features referring to others. */
3842
class InheritKey {
3943
public final Type[] keys;
44+
/* If isDirect, the last key directly owns the target feature. */
4045
private final boolean isDirect;
4146

4247
private static boolean containsWithRedefined(List<Feature> fs, Feature ft) {

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

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -111,7 +111,7 @@ public PRelation(InheritKey ik, Element src, Element dest, Element rel, String d
111111
this.description = description;
112112
}
113113

114-
public PRelation(Object src, Object dest, Element rel, String description) {
114+
public PRelation(InheritKey ik, Object src, Object dest, Element rel, String description) {
115115
this.ik = null;
116116
this.src = src;
117117
this.dest = dest;

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

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -111,6 +111,10 @@ public String caseConnector(Connector object) {
111111
public String caseBindingConnector(BindingConnector object) {
112112
return " -[thickness=5,#red]- ";
113113
}
114+
@Override
115+
public String caseFeatureValue(FeatureValue fv) {
116+
return " -[thickness=5,#red]- ";
117+
}
114118
}, null),
115119
"decoratedRedefined", "true");
116120
addp("PLANTUML",

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

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -67,7 +67,7 @@ protected VTree newVTree(Namespace namespace, Membership membership) {
6767
}
6868

6969
private String addCase(Type typ) {
70-
String name = getNameAnyway(typ);
70+
String name = extractTitleName(typ);
7171
int id = addRecLine(name, typ, true);
7272
addSpecializations(id, typ);
7373

@@ -99,7 +99,7 @@ public String caseObjectiveMembership(ObjectiveMembership om) {
9999

100100
@Override
101101
public String caseSubjectMembership(SubjectMembership sm) {
102-
addSubjectMembership(sm, true);
102+
addSubjectMembership(sm, false);
103103
return "";
104104
}
105105

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

Lines changed: 1 addition & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -496,9 +496,6 @@ private void addCompartmentEntries(List<CompartmentEntry> es, int level) {
496496
append(' ');
497497
}
498498
append(ce.getParameterPrefix());
499-
if (ce.isInherited) {
500-
append('^');
501-
}
502499
if (ce.prefix != null) {
503500
append(ce.prefix);
504501
}
@@ -543,7 +540,7 @@ private void addDocumentations() {
543540
if (documentations == null) return;
544541

545542
boolean flag = false;
546-
append("##//documentations//##\n");
543+
append("##//doc//##\n");
547544
for (Documentation doc: documentations) {
548545
String name = doc.getName();
549546
if (name != null && !name.isEmpty()) {

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

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -73,6 +73,7 @@ public String caseUsage(Usage f) {
7373
String featureText = getFeatureText(f);
7474
if (featureText.isEmpty()) return "";
7575
int id = addPUMLLine(f, "rec usage ", featureText);
76+
addFeatureValueBindings(f);
7677

7778
VComposite vc = new VComposite(this);
7879
vc.traverse(f);

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

Lines changed: 17 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -48,8 +48,8 @@
4848
import org.omg.sysml.lang.sysml.Import;
4949
import org.omg.sysml.lang.sysml.ItemFlow;
5050
import org.omg.sysml.lang.sysml.ItemFlowEnd;
51-
import org.omg.sysml.lang.sysml.Membership;
5251
import org.omg.sysml.lang.sysml.MetadataFeature;
52+
import org.omg.sysml.lang.sysml.Namespace;
5353
import org.omg.sysml.lang.sysml.OwningMembership;
5454
import org.omg.sysml.lang.sysml.Relationship;
5555
import org.omg.sysml.lang.sysml.Specialization;
@@ -108,24 +108,35 @@ Use getName() instead. */
108108
}
109109

110110
protected void addFeatureValueBindings(Type typ) {
111-
for (Membership m: typ.getOwnedMembership()) {
112-
if (m instanceof FeatureValue) {
113-
FeatureValue fv = (FeatureValue) m;
111+
// To properly process inheritings, use VTraverser.
112+
VTraverser vt = new VTraverser(this) {
113+
@Override
114+
public String caseFeatureValue(FeatureValue fv) {
114115
Expression v = fv.getValue();
115116
Element tgt = resolveReference(v);
116117
if (tgt != null) {
117118
addPRelation(typ, tgt, fv, "=");
118119
}
120+
return "";
119121
}
120-
}
122+
@Override
123+
public String caseNamespace(Namespace ns) {
124+
return "";
125+
}
126+
};
127+
vt.traverse(typ);
121128
}
122129

123130
protected void addSpecializations(int typId, Type typ) {
124131
if (typId < 0) return;
132+
InheritKey ik = null;
125133
for (Specialization s: typ.getOwnedSpecialization()) {
126134
Type gt = s.getGeneral();
127135
if (gt == null) continue;
128-
PRelation pr = new PRelation(typId, gt, s, null);
136+
if (ik != null && typ instanceof Feature) {
137+
ik = makeInheritKey((Feature) typ);
138+
}
139+
PRelation pr = new PRelation(ik, typId, gt, s, null);
129140
addPRelation(pr);
130141
}
131142
}

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

Lines changed: 15 additions & 36 deletions
Original file line numberDiff line numberDiff line change
@@ -284,6 +284,18 @@ public PCTerminal(PC prev) {
284284
}
285285
}
286286

287+
/* It makes an inherit key of the feature owning feature
288+
(such as connector and subsetting feature) */
289+
private InheritKey makeInheritKeyOfOwner(Feature f) {
290+
Type owningType = f.getOwningType();
291+
if (owningType instanceof Feature) {
292+
return makeInheritKey((Feature) owningType);
293+
} else {
294+
/* non-feature types cannot be inherited and it returns null */
295+
return null;
296+
}
297+
}
298+
287299
/*
288300
ife : ItemFlowEnd :> baseTarget (e.g. action) {
289301
// ReferenceUsage
@@ -305,7 +317,7 @@ public RefPC makeRefPCItemFlowEnd(ItemFlowEnd ife) {
305317
if (pc == null) return null;
306318
Feature ioTarget = getIOTarget(ife);
307319
pc = new PCItemFlowEnd(ife, pc, ioTarget);
308-
InheritKey ik = getInheritKey(ife);
320+
InheritKey ik = makeInheritKeyOfOwner(ife);
309321
return new RefPC(pc, ik);
310322
}
311323

@@ -444,25 +456,6 @@ private void putPathIdMap(Integer id, InheritKey ik, Element pt) {
444456

445457
private List<RefPC> current = new ArrayList<RefPC>();
446458

447-
private InheritKey getInheritKey(List<FeatureChaining> fcs) {
448-
FeatureChaining fc = fcs.get(0);
449-
Feature ref = fc.getChainingFeature();
450-
return makeInheritKey(ref);
451-
}
452-
453-
private InheritKey getInheritKey(Feature f) {
454-
for (Subsetting ss: f.getOwnedSubsetting()) {
455-
Feature sf = ss.getSubsettedFeature();
456-
List<FeatureChaining> fcs = sf.getOwnedFeatureChaining();
457-
if (fcs.isEmpty()) {
458-
return makeInheritKey(sf);
459-
} else {
460-
return getInheritKey(fcs);
461-
}
462-
}
463-
return null;
464-
}
465-
466459
private PC makeSubsettedFeaturePC(Feature f) {
467460
for (Subsetting ss: f.getOwnedSubsetting()) {
468461
Feature sf = ss.getSubsettedFeature();
@@ -478,7 +471,7 @@ private PC makeSubsettedFeaturePC(Feature f) {
478471

479472
private RefPC makeRefPC(Feature f, PC pc) {
480473
if (pc == null) return null;
481-
InheritKey ik = getInheritKey(f);
474+
InheritKey ik = makeInheritKeyOfOwner(f);
482475
return new RefPC(pc, ik);
483476
}
484477

@@ -511,22 +504,8 @@ private String addContext(ItemFlowEnd ife) {
511504
return "";
512505
}
513506

514-
private static Feature head(FeatureChainExpression fce) {
515-
List<Expression> ops = fce.getOperand();
516-
if (ops.isEmpty()) {
517-
return null;
518-
} else {
519-
Expression ex = ops.get(0);
520-
if (!(ex instanceof FeatureReferenceExpression)) return null;
521-
FeatureReferenceExpression fre = (FeatureReferenceExpression) ex;
522-
return fre.getReferent();
523-
}
524-
}
525-
526507
private String addContext(FeatureChainExpression fce) {
527-
Feature ref = head(fce);
528-
if (ref == null) return null;
529-
InheritKey ik = getInheritKey(ref);
508+
InheritKey ik = makeInheritKey(fce);
530509
PC pc = new PCFeatureChainExpression(fce);
531510
RefPC rpc = new RefPC(pc, ik);
532511
addRefPC(rpc);

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

Lines changed: 1 addition & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -163,7 +163,7 @@ private Feature getRedefinedFeature(Feature f) {
163163
private String redefinedFeatureText(Feature f) {
164164
Feature rf = getRedefinedFeature(f);
165165
if (rf == null) return null;
166-
return getNameWithNamespace(rf);
166+
return getRefName(rf);
167167
}
168168

169169
private boolean addRedefinedFeatureText(Feature f) {
@@ -177,9 +177,6 @@ private boolean addRedefinedFeatureText(Feature f) {
177177
}
178178

179179
private void addFeatureTextInternal(Feature f, String name, boolean isInherited) {
180-
if (isInherited) {
181-
append('^');
182-
}
183180
append(name);
184181
addFeatureTypeAndSubsettedText(f);
185182
addFeatureMembershipText(f);

0 commit comments

Comments
 (0)