|
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