|
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 { |
@@ -256,70 +255,58 @@ 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 | | - List<Feature> ps = s.getParameter(); |
267 | | - |
268 | | - // We render the first parameter only because the second parameter of |
269 | | - // AcceptActionUsage is receiver, which should not be rendered. |
270 | | - if (ps.isEmpty()) return ""; |
271 | | - v.visit(ps.get(0)); |
| 258 | + private String triggerToText(AcceptActionUsage aau) { |
| 259 | + StringBuilder sb = new StringBuilder(); |
272 | 260 |
|
273 | | - String str = v.getString(); |
274 | | - if (str.isEmpty()) { |
275 | | - return getText(s); |
| 261 | + Expression payload = aau.getPayloadArgument(); |
| 262 | + if (payload != null) { |
| 263 | + sb.append(getText(payload)); |
276 | 264 | } else { |
277 | | - return str; |
| 265 | + ReferenceUsage ru = aau.getPayloadParameter(); |
| 266 | + String name = ru.getDeclaredName(); |
| 267 | + if (name == null) { |
| 268 | + appendFeatureType(sb, "", ru); |
| 269 | + } else { |
| 270 | + appendNameAndType(sb, ru, ""); |
| 271 | + } |
278 | 272 | } |
| 273 | + |
| 274 | + Expression receiver = aau.getReceiverArgument(); |
| 275 | + if (receiver != null) { |
| 276 | + sb.append(" <b>via</b>"); |
| 277 | + sb.append(getText(receiver)); |
| 278 | + } |
| 279 | + |
| 280 | + return sb.toString(); |
279 | 281 | } |
280 | 282 |
|
281 | 283 | private String convertToDescription(TransitionUsage tu) { |
282 | | - String triggerString = null; |
283 | | - String guardString = null; |
284 | | - String effectString = null; |
285 | | - |
286 | | - for (FeatureMembership fm: toOwnedFeatureMembershipArray(tu)) { |
287 | | - if (!(fm instanceof TransitionFeatureMembership)) continue; |
288 | | - TransitionFeatureMembership tfm = (TransitionFeatureMembership) fm; |
289 | | - Step s = tfm.getTransitionFeature(); |
290 | | - if (s == null) continue; |
291 | | - switch (tfm.getKind()) { |
292 | | - case TRIGGER: |
293 | | - triggerString = triggerToText(s); |
294 | | - break; |
295 | | - case GUARD: |
296 | | - guardString = getText(s); |
297 | | - break; |
298 | | - case EFFECT: |
299 | | - effectString = getText(s); |
300 | | - break; |
301 | | - } |
302 | | - } |
303 | 284 |
|
304 | | - LineFoldStringBuilder ls = new LineFoldStringBuilder(); |
305 | | - if (triggerString != null) { |
306 | | - triggerString = triggerString.trim(); |
| 285 | + LineFoldStringBuilder ls = new LineFoldStringBuilder(); |
| 286 | + |
| 287 | + List<AcceptActionUsage> triggerActions = tu.getTriggerAction(); |
| 288 | + if (!triggerActions.isEmpty()) { |
| 289 | + String triggerString = triggerToText(triggerActions.get(0)).trim(); |
307 | 290 | if (!(triggerString.isEmpty())) { |
308 | 291 | ls.append(triggerString); |
309 | 292 | ls.append(' '); |
310 | 293 | } |
311 | 294 | } |
312 | | - if (guardString != null) { |
313 | | - guardString = guardString.trim(); |
| 295 | + |
| 296 | + List<Expression> guardExpressions = tu.getGuardExpression(); |
| 297 | + if (!guardExpressions.isEmpty()) { |
| 298 | + String guardString = getText(guardExpressions.get(0)).trim(); |
314 | 299 | if (!guardString.isEmpty()) { |
315 | 300 | ls.fold(); |
316 | 301 | ls.append('['); |
317 | 302 | ls.append(guardString); |
318 | 303 | ls.append(']'); |
319 | 304 | } |
320 | 305 | } |
321 | | - if (effectString != null) { |
322 | | - effectString = effectString.trim(); |
| 306 | + |
| 307 | + List<ActionUsage> effectActions = tu.getEffectAction(); |
| 308 | + if (!effectActions.isEmpty()) { |
| 309 | + String effectString = getText(effectActions.get(0)).trim(); |
323 | 310 | if (!effectString.isEmpty()) { |
324 | 311 | ls.fold(); |
325 | 312 | ls.append('/'); |
|
0 commit comments