|
1 | 1 | /*****************************************************************************
|
2 | 2 | * SysML 2 Pilot Implementation, PlantUML Visualization
|
3 |
| - * Copyright (c) 2020-2024 Mgnite Inc. |
| 3 | + * Copyright (c) 2020-2025 Mgnite Inc. |
| 4 | + * Copyright (c) 2025 Model Driven Solutions, Inc. |
4 | 5 | *
|
5 | 6 | * This program is free software: you can redistribute it and/or modify
|
6 | 7 | * it under the terms of the GNU Lesser General Public License as published by
|
|
19 | 20 | *
|
20 | 21 | * Contributors:
|
21 | 22 | * Hisashi Miyashita, Mgnite Inc.
|
| 23 | + * Ed Seidewitz, MDS |
22 | 24 | *
|
23 | 25 | *****************************************************************************/
|
24 | 26 |
|
|
32 | 34 | import org.omg.sysml.lang.sysml.Element;
|
33 | 35 | import org.omg.sysml.lang.sysml.Expression;
|
34 | 36 | import org.omg.sysml.lang.sysml.Feature;
|
35 |
| -import org.omg.sysml.lang.sysml.FeatureMembership; |
36 | 37 | import org.omg.sysml.lang.sysml.Membership;
|
37 | 38 | import org.omg.sysml.lang.sysml.ReferenceUsage;
|
38 | 39 | import org.omg.sysml.lang.sysml.SendActionUsage;
|
39 | 40 | import org.omg.sysml.lang.sysml.StateSubactionKind;
|
40 | 41 | import org.omg.sysml.lang.sysml.StateSubactionMembership;
|
41 |
| -import org.omg.sysml.lang.sysml.Step; |
42 | 42 | import org.omg.sysml.lang.sysml.Succession;
|
43 |
| -import org.omg.sysml.lang.sysml.TransitionFeatureMembership; |
44 | 43 | import org.omg.sysml.lang.sysml.TransitionUsage;
|
45 | 44 |
|
46 | 45 | public abstract class VBehavior extends VDefault {
|
@@ -135,14 +134,14 @@ private static boolean appendNameAndType(StringBuilder sb, Feature f, String def
|
135 | 134 | if (f == null) return false;
|
136 | 135 | String name = getName(f);
|
137 | 136 |
|
138 |
| - boolean flag = false; |
139 | 137 | if (name != null) {
|
140 | 138 | if (defaultName == null || !name.equals(defaultName)) {
|
141 | 139 | sb.append(name);
|
142 |
| - flag = true; |
| 140 | + appendFeatureType(sb, ": ", f); |
| 141 | + return true; |
143 | 142 | }
|
144 | 143 | }
|
145 |
| - return appendFeatureType(sb, ": ", f) || flag; |
| 144 | + return appendFeatureType(sb, "", f); |
146 | 145 | }
|
147 | 146 |
|
148 | 147 | private boolean addSendActionUsage(SendActionUsage sau) {
|
@@ -256,66 +255,53 @@ public String toString() {
|
256 | 255 | }
|
257 | 256 | }
|
258 | 257 |
|
259 |
| - private String triggerToText(Step s) { |
260 |
| - Visitor v = new Visitor(this) { |
261 |
| - public String caseFeature(Feature f) { |
262 |
| - addFeatureTypeText("", f); |
263 |
| - return ""; |
264 |
| - } |
265 |
| - }; |
266 |
| - for (Feature f: s.getParameter()) { |
267 |
| - v.visit(f); |
268 |
| - } |
269 |
| - String str = v.getString(); |
270 |
| - if (str.isEmpty()) { |
271 |
| - return getText(s); |
| 258 | + private String triggerToText(AcceptActionUsage aau) { |
| 259 | + StringBuilder sb = new StringBuilder(); |
| 260 | + |
| 261 | + Expression payload = aau.getPayloadArgument(); |
| 262 | + if (payload != null) { |
| 263 | + sb.append(getText(payload)); |
272 | 264 | } else {
|
273 |
| - return str; |
| 265 | + ReferenceUsage ru = aau.getPayloadParameter(); |
| 266 | + appendNameAndType(sb, ru, "payload"); |
274 | 267 | }
|
| 268 | + |
| 269 | + Expression receiver = aau.getReceiverArgument(); |
| 270 | + if (receiver != null) { |
| 271 | + sb.append(" <b>via</b>"); |
| 272 | + sb.append(getText(receiver)); |
| 273 | + } |
| 274 | + |
| 275 | + return sb.toString(); |
275 | 276 | }
|
276 | 277 |
|
277 | 278 | private String convertToDescription(TransitionUsage tu) {
|
278 |
| - String triggerString = null; |
279 |
| - String guardString = null; |
280 |
| - String effectString = null; |
281 |
| - |
282 |
| - for (FeatureMembership fm: toOwnedFeatureMembershipArray(tu)) { |
283 |
| - if (!(fm instanceof TransitionFeatureMembership)) continue; |
284 |
| - TransitionFeatureMembership tfm = (TransitionFeatureMembership) fm; |
285 |
| - Step s = tfm.getTransitionFeature(); |
286 |
| - if (s == null) continue; |
287 |
| - switch (tfm.getKind()) { |
288 |
| - case TRIGGER: |
289 |
| - triggerString = triggerToText(s); |
290 |
| - break; |
291 |
| - case GUARD: |
292 |
| - guardString = getText(s); |
293 |
| - break; |
294 |
| - case EFFECT: |
295 |
| - effectString = getText(s); |
296 |
| - break; |
297 |
| - } |
298 |
| - } |
299 | 279 |
|
300 |
| - LineFoldStringBuilder ls = new LineFoldStringBuilder(); |
301 |
| - if (triggerString != null) { |
302 |
| - triggerString = triggerString.trim(); |
| 280 | + LineFoldStringBuilder ls = new LineFoldStringBuilder(); |
| 281 | + |
| 282 | + List<AcceptActionUsage> triggerActions = tu.getTriggerAction(); |
| 283 | + if (!triggerActions.isEmpty()) { |
| 284 | + String triggerString = triggerToText(triggerActions.get(0)).trim(); |
303 | 285 | if (!(triggerString.isEmpty())) {
|
304 | 286 | ls.append(triggerString);
|
305 | 287 | ls.append(' ');
|
306 | 288 | }
|
307 | 289 | }
|
308 |
| - if (guardString != null) { |
309 |
| - guardString = guardString.trim(); |
| 290 | + |
| 291 | + List<Expression> guardExpressions = tu.getGuardExpression(); |
| 292 | + if (!guardExpressions.isEmpty()) { |
| 293 | + String guardString = getText(guardExpressions.get(0)).trim(); |
310 | 294 | if (!guardString.isEmpty()) {
|
311 | 295 | ls.fold();
|
312 | 296 | ls.append('[');
|
313 | 297 | ls.append(guardString);
|
314 | 298 | ls.append(']');
|
315 | 299 | }
|
316 | 300 | }
|
317 |
| - if (effectString != null) { |
318 |
| - effectString = effectString.trim(); |
| 301 | + |
| 302 | + List<ActionUsage> effectActions = tu.getEffectAction(); |
| 303 | + if (!effectActions.isEmpty()) { |
| 304 | + String effectString = getText(effectActions.get(0)).trim(); |
319 | 305 | if (!effectString.isEmpty()) {
|
320 | 306 | ls.fold();
|
321 | 307 | ls.append('/');
|
|
0 commit comments