Skip to content

Commit 14f1d77

Browse files
authored
Merge pull request #647 from Systems-Modeling/ST6RI-842
ST6RI-842: Support shorthand notations (PlantUML)
2 parents fff3626 + 949e4ff commit 14f1d77

8 files changed

Lines changed: 282 additions & 72 deletions

File tree

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

Lines changed: 81 additions & 33 deletions
Original file line numberDiff line numberDiff line change
@@ -37,6 +37,7 @@
3737
import org.omg.sysml.lang.sysml.AllocationUsage;
3838
import org.omg.sysml.lang.sysml.AnalysisCaseDefinition;
3939
import org.omg.sysml.lang.sysml.AnalysisCaseUsage;
40+
import org.omg.sysml.lang.sysml.AssertConstraintUsage;
4041
import org.omg.sysml.lang.sysml.Behavior;
4142
import org.omg.sysml.lang.sysml.BindingConnector;
4243
import org.omg.sysml.lang.sysml.Class;
@@ -52,11 +53,11 @@
5253
import org.omg.sysml.lang.sysml.FeatureMembership;
5354
import org.omg.sysml.lang.sysml.FeatureTyping;
5455
import org.omg.sysml.lang.sysml.FeatureValue;
56+
import org.omg.sysml.lang.sysml.Flow;
5557
import org.omg.sysml.lang.sysml.FlowUsage;
5658
import org.omg.sysml.lang.sysml.Import;
5759
import org.omg.sysml.lang.sysml.IncludeUseCaseUsage;
5860
import org.omg.sysml.lang.sysml.ItemDefinition;
59-
import org.omg.sysml.lang.sysml.Flow;
6061
import org.omg.sysml.lang.sysml.ItemUsage;
6162
import org.omg.sysml.lang.sysml.Membership;
6263
import org.omg.sysml.lang.sysml.MetadataFeature;
@@ -462,16 +463,6 @@ public String caseDependency(Dependency dep) {
462463
return " ..>> ";
463464
}
464465

465-
@Override
466-
public String caseRequirementConstraintMembership(RequirementConstraintMembership requirementConstraintMembership) {
467-
return " ..> ";
468-
}
469-
470-
@Override
471-
public String caseSatisfyRequirementUsage(SatisfyRequirementUsage satisfyRequirementUsage) {
472-
return " ..> ";
473-
}
474-
475466
@Override
476467
public String caseBindingConnector(BindingConnector object) {
477468
return " -[thickness=5]- ";
@@ -506,41 +497,49 @@ public String caseObjectiveMembership(ObjectiveMembership vm) {
506497
public String caseImport(Import imp) {
507498
return " ..> ";
508499
}
509-
}
510500

511-
public static class StyleStereotypeDefaultSwitch extends StyleStereotypeSwitch {
512501
@Override
513-
public String caseClass(Class object) {
514-
if (SysMLPackage.Literals.CLASS.equals(object.eClass())) return " ";
515-
return null;
502+
public String caseRequirementConstraintMembership(RequirementConstraintMembership requirementConstraintMembership) {
503+
return " --> ";
516504
}
517505

518506
@Override
519-
public String caseExhibitStateUsage(ExhibitStateUsage esu) {
520-
if (VStructure.hasRefSubsettingWithoutDeclaredName(esu)) {
521-
return " exhibit>> ";
522-
} else {
523-
return " exhibit state>> ";
524-
}
507+
public String caseSatisfyRequirementUsage(SatisfyRequirementUsage satisfyRequirementUsage) {
508+
return " --> ";
525509
}
526510

527511
@Override
528-
public String caseSatisfyRequirementUsage(SatisfyRequirementUsage sru) {
529-
return "<<requirement>> ";
512+
public String caseAssertConstraintUsage(AssertConstraintUsage acu) {
513+
return " --> ";
530514
}
531515

532516
@Override
533-
public String caseIncludeUseCaseUsage(IncludeUseCaseUsage iucu) {
534-
return " include use case>> ";
517+
public String casePerformActionUsage(PerformActionUsage pau) {
518+
return " --> ";
535519
}
536520

521+
@Override
522+
public String caseExhibitStateUsage(ExhibitStateUsage esu) {
523+
return " --> ";
524+
}
525+
526+
@Override
527+
public String caseEventOccurrenceUsage(EventOccurrenceUsage eou) {
528+
return " --> ";
529+
}
530+
531+
@Override
532+
public String caseIncludeUseCaseUsage(IncludeUseCaseUsage iuc) {
533+
return " --> ";
534+
}
535+
536+
}
537+
538+
public static class StyleStereotypeDefaultSwitch extends StyleStereotypeSwitch {
537539
@Override
538-
public String casePerformActionUsage(PerformActionUsage pau) {
539-
if (VStructure.hasRefSubsettingWithoutDeclaredName(pau)) {
540-
return " perform>> ";
541-
} else {
542-
return " perform action>> ";
543-
}
540+
public String caseClass(Class object) {
541+
if (SysMLPackage.Literals.CLASS.equals(object.eClass())) return " ";
542+
return null;
544543
}
545544

546545
@Override
@@ -573,9 +572,58 @@ public String caseVerificationCaseDefinition(VerificationCaseDefinition acd) {
573572
return " verification def>> ";
574573
}
575574

575+
@Override
576+
public String caseExhibitStateUsage(ExhibitStateUsage esu) {
577+
if (Visitor.getSpecialReference(esu) != null) {
578+
return " exhibit>> ";
579+
} else {
580+
return " exhibit state>> ";
581+
}
582+
}
583+
584+
@Override
585+
public String caseSatisfyRequirementUsage(SatisfyRequirementUsage sru) {
586+
if (Visitor.getSpecialReference(sru) != null) {
587+
return " satisfy>> ";
588+
} else {
589+
return " satisfy requirement>> ";
590+
}
591+
}
592+
593+
@Override
594+
public String caseIncludeUseCaseUsage(IncludeUseCaseUsage iucu) {
595+
if (Visitor.getSpecialReference(iucu) != null) {
596+
return " include>> ";
597+
} else {
598+
return " include use case>> ";
599+
}
600+
}
601+
602+
@Override
603+
public String casePerformActionUsage(PerformActionUsage pau) {
604+
if (Visitor.getSpecialReference(pau) != null) {
605+
return " perform>> ";
606+
} else {
607+
return " perform action>> ";
608+
}
609+
}
610+
611+
@Override
612+
public String caseAssertConstraintUsage(AssertConstraintUsage acu) {
613+
if (Visitor.getSpecialReference(acu) != null) {
614+
return " assert>> ";
615+
} else {
616+
return " assert constraint>> ";
617+
}
618+
}
619+
576620
@Override
577621
public String caseEventOccurrenceUsage(EventOccurrenceUsage eou) {
578-
return " event occurrence>> ";
622+
if (Visitor.getSpecialReference(eou) != null) {
623+
return " event>> ";
624+
} else {
625+
return " event occurrence>> ";
626+
}
579627
}
580628
}
581629

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

Lines changed: 33 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -27,8 +27,10 @@
2727
import java.util.ArrayList;
2828
import java.util.Arrays;
2929
import java.util.HashMap;
30+
import java.util.HashSet;
3031
import java.util.List;
3132
import java.util.Map;
33+
import java.util.Set;
3234
import java.util.regex.Matcher;
3335
import java.util.regex.Pattern;
3436
import java.util.stream.Collectors;
@@ -472,6 +474,17 @@ private void addStyleHeader(StringBuilder sb) {
472474
sb.append('\n');
473475
}
474476

477+
private List<Element> topElements;
478+
479+
/* package */ boolean toBeRendered(EObject eObj) {
480+
while (eObj != null) {
481+
if (!(eObj instanceof Element)) return false;
482+
if (topElements.contains((Element) eObj)) return true;
483+
eObj = eObj.eContainer();
484+
}
485+
return false;
486+
}
487+
475488
public String sysML2PUML(List<? extends EObject> eObjs) {
476489
initStyle();
477490
this.vpath = new VPath();
@@ -485,9 +498,11 @@ public String sysML2PUML(List<? extends EObject> eObjs) {
485498
init();
486499

487500
numVisits = 0;
501+
this.topElements = new ArrayList<>(eObjs.size());
488502
for (EObject eObj : eObjs) {
489503
if (eObj instanceof Element) {
490504
Element e = (Element) eObj;
505+
topElements.add(e);
491506
vpath.visit(e);
492507
}
493508
}
@@ -595,14 +610,31 @@ void popIdMap(boolean keep) {
595610
idMap = idMap.pop(keep);
596611
}
597612

613+
private Set<Element> assigned = new HashSet<Element>();
614+
598615
Integer newId(Element e) {
599-
return idMap.newId(e);
616+
if (assigned.contains(e)) {
617+
assigned.remove(e);
618+
return idMap.getId(e);
619+
} else {
620+
return idMap.newId(e);
621+
}
600622
}
601623

602624
Integer getId(Element e) {
603625
return idMap.getId(e);
604626
}
605627

628+
private Integer assignId(Element e) {
629+
assigned.add(e);
630+
return idMap.getId(e);
631+
}
632+
633+
boolean isReferred(Element e) {
634+
int pid = assignId(e);
635+
return null != vpath.getPaths(pid);
636+
}
637+
606638
private boolean inherited;
607639
void setInherited(boolean flag) {
608640
this.inherited = flag;

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

Lines changed: 7 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -59,6 +59,7 @@
5959
import org.omg.sysml.lang.sysml.ReferenceUsage;
6060
import org.omg.sysml.lang.sysml.RequirementUsage;
6161
import org.omg.sysml.lang.sysml.ReturnParameterMembership;
62+
import org.omg.sysml.lang.sysml.SatisfyRequirementUsage;
6263
import org.omg.sysml.lang.sysml.StakeholderMembership;
6364
import org.omg.sysml.lang.sysml.StateDefinition;
6465
import org.omg.sysml.lang.sysml.StateUsage;
@@ -67,7 +68,6 @@
6768
import org.omg.sysml.lang.sysml.SuccessionFlow;
6869
import org.omg.sysml.lang.sysml.TransitionUsage;
6970
import org.omg.sysml.lang.sysml.Type;
70-
import org.omg.sysml.lang.sysml.Usage;
7171
import org.omg.sysml.lang.sysml.VariantMembership;
7272
import org.omg.sysml.util.ConnectorUtil;
7373
import org.omg.sysml.util.TypeUtil;
@@ -255,6 +255,11 @@ public String caseReferenceUsage(ReferenceUsage ru) {
255255
return null;
256256
}
257257

258+
@Override
259+
public String caseSatisfyRequirementUsage(SatisfyRequirementUsage sru) {
260+
return recCurrent(sru, true);
261+
}
262+
258263
@Override
259264
public String caseRequirementUsage(RequirementUsage ru) {
260265
return recCurrent(ru, true);
@@ -312,7 +317,7 @@ public String caseVariantMembership(VariantMembership vm) {
312317

313318
@Override
314319
public String caseObjectiveMembership(ObjectiveMembership om) {
315-
//rec(om, om, true);
320+
if (isEmptyObjective(om)) return "";
316321
recOrAddOwningMembership(om);
317322
return "";
318323
}
@@ -329,12 +334,6 @@ public String caseStakeholderMembership(StakeholderMembership sm) {
329334
return "";
330335
}
331336

332-
private boolean isEmptySubject(SubjectMembership sm) {
333-
Usage u = sm.getOwnedSubjectParameter();
334-
if (!"subj".equals(u.getName())) return false;
335-
return u.getOwnedRelationship().isEmpty();
336-
}
337-
338337
@Override
339338
public String caseSubjectMembership(SubjectMembership sm) {
340339
if (isEmptySubject(sm)) return "";

0 commit comments

Comments
 (0)