Skip to content

Commit a7ce4d9

Browse files
committed
ST6RI-864 Implemented node succession specializations.
Satisfied in SuccessionAsUsageAdapter: - checkDecisionNodeOutgoingSuccessionSpecialization - checkMergeNodeIncomingSuccessionSpecialization
1 parent 33c9174 commit a7ce4d9

7 files changed

Lines changed: 80 additions & 5 deletions

File tree

org.omg.sysml.xpect.tests/src/org/omg/sysml/xpect/tests/simpletests/ControlNodeTest.sysml.xt

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -65,7 +65,12 @@ action def ControlNodeTest {
6565
action B1 {
6666
in b;
6767
}
68+
then M;
69+
6870
action B2 {
6971
in b;
7072
}
73+
then M;
74+
75+
merge M;
7176
}

org.omg.sysml.xpect.tests/src/org/omg/sysml/xpect/tests/simpletests/DecisionTest.sysml.xt

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -58,7 +58,7 @@ action def DecisionTest {
5858
if x > 1 then A2;
5959
else A3;
6060

61-
then decide;
61+
then decide D;
6262
if true then A1;
6363
if false then A2;
6464

org.omg.sysml/src/org/omg/sysml/adapter/SuccessionAsUsageAdapter.java

Lines changed: 41 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,6 @@
11
/*******************************************************************************
22
* SysML 2 Pilot Implementation
3-
* Copyright (c) 2024 Model Driven Solutions, Inc.
3+
* Copyright (c) 2024, 2025 Model Driven Solutions, Inc.
44
*
55
* This program is free software: you can redistribute it and/or modify
66
* it under the terms of the GNU Lesser General Public License as published by
@@ -21,10 +21,15 @@
2121

2222
package org.omg.sysml.adapter;
2323

24+
import org.omg.sysml.lang.sysml.DecisionNode;
25+
import org.omg.sysml.lang.sysml.Feature;
26+
import org.omg.sysml.lang.sysml.MergeNode;
2427
import org.omg.sysml.lang.sysml.Namespace;
2528
import org.omg.sysml.lang.sysml.SuccessionAsUsage;
2629
import org.omg.sysml.lang.sysml.TransitionUsage;
2730
import org.omg.sysml.util.ElementUtil;
31+
import org.omg.sysml.util.FeatureUtil;
32+
import org.omg.sysml.util.UsageUtil;
2833

2934
public class SuccessionAsUsageAdapter extends SuccessionAdapter {
3035

@@ -47,9 +52,42 @@ protected void addContextFeaturingType() {
4752
}
4853
}
4954

55+
@Override
56+
public void addDefaultGeneralType() {
57+
super.addDefaultGeneralType();
58+
addDecisionNodeOutgoingSuccessionSpecialization();
59+
addMergeNodeIncomingSuccessionSpecialization();
60+
}
61+
62+
/**
63+
* @satisfies checkDecisionNodeOutgoingSuccessionSpecialization
64+
*
65+
* TODO: Update checkDecisionNodeOutgoingSuccessionSpecialization
66+
*
67+
* OCL refers to MergePerformance::outgoingHBLink rather than DecisionPerformance::outgoingHBLink.
68+
* See SYSML21-306
69+
*/
70+
protected void addDecisionNodeOutgoingSuccessionSpecialization() {
71+
SuccessionAsUsage succession = getTarget();
72+
// Note: Use utility method to get source feature, to avoid infinite recursion.
73+
Feature sourceFeature = UsageUtil.getSourceOf(succession);
74+
if (sourceFeature instanceof DecisionNode) {
75+
addImplicitGeneralType(getSpecializationEClass(),
76+
FeatureUtil.chainFeatures(sourceFeature, (Feature)getLibraryType(getDefaultSupertype("decision"))));
77+
}
78+
}
79+
5080
/**
51-
* TODO: checkDecisionNodeOutgoingSuccessionSpecialization
52-
* TODO: checkMergeNodeIncomingSuccessionSpecialization
81+
* @satisfies checkMergeNodeIncomingSuccessionSpecialization
5382
*/
83+
protected void addMergeNodeIncomingSuccessionSpecialization() {
84+
SuccessionAsUsage succession = getTarget();
85+
// Note: Use utility method to get target feature, to avoid infinite recursion.
86+
Feature targetFeature = UsageUtil.getTargetOf(succession);
87+
if (targetFeature instanceof MergeNode) {
88+
addImplicitGeneralType(getSpecializationEClass(),
89+
FeatureUtil.chainFeatures(targetFeature, (Feature)getLibraryType(getDefaultSupertype("merge"))));
90+
}
91+
}
5492

5593
}

org.omg.sysml/src/org/omg/sysml/util/ImplicitGeneralizationMap.java

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -511,6 +511,10 @@ protected ImplicitGeneralizationMap() {
511511
put(SuccessionAsUsageImpl.class, "base", "Occurrences::happensBeforeLinks");
512512
//checkSuccessionSpecialization
513513
put(SuccessionAsUsageImpl.class, "binary", "Occurrences::happensBeforeLinks");
514+
//checkDecisionNodeOutgoingSuccessionSpecialization
515+
put(SuccessionAsUsageImpl.class, "decision", "ControlPerformances::DecisionPerformance::outgoingHBLink");
516+
//checkMergeNodeIncomingSuccessionSpecialization
517+
put(SuccessionAsUsageImpl.class, "merge", "ControlPerformances::MergePerformance::incomingHBLink");
514518

515519
//checkSuccessionFlowUsageSpecialization
516520
put(SuccessionFlowUsageImpl.class, "base", "Flows::successionFlows");

org.omg.sysml/src/org/omg/sysml/util/UsageUtil.java

Lines changed: 23 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -50,6 +50,7 @@
5050
import org.omg.sysml.lang.sysml.Namespace;
5151
import org.omg.sysml.lang.sysml.ObjectiveMembership;
5252
import org.omg.sysml.lang.sysml.ParameterMembership;
53+
import org.omg.sysml.lang.sysml.ReferenceSubsetting;
5354
import org.omg.sysml.lang.sysml.RenderingUsage;
5455
import org.omg.sysml.lang.sysml.RequirementConstraintKind;
5556
import org.omg.sysml.lang.sysml.RequirementConstraintMembership;
@@ -194,6 +195,17 @@ public static Expression getArgumentOf(ActionUsage action, int i) {
194195

195196
// SuccessionAsUsages
196197

198+
public static Feature getSourceOf(Feature succession) {
199+
List<Feature> ends = succession.getOwnedEndFeature();
200+
if (!ends.isEmpty()) {
201+
ReferenceSubsetting referenceSubsetting = ends.get(0).getOwnedReferenceSubsetting();
202+
if (referenceSubsetting != null) {
203+
return referenceSubsetting.getReferencedFeature();
204+
}
205+
}
206+
return getSourceFeature(succession);
207+
}
208+
197209
public static Feature getSourceFeature(Feature feature) {
198210
Namespace owningNamespace = feature.getOwningNamespace();
199211
if (owningNamespace instanceof TransitionUsage) {
@@ -205,6 +217,17 @@ public static Feature getSourceFeature(Feature feature) {
205217
return getPreviousFeature(feature);
206218
}
207219

220+
public static Feature getTargetOf(Feature succession) {
221+
List<Feature> ends = succession.getOwnedEndFeature();
222+
if (ends.size() > 1) {
223+
ReferenceSubsetting referenceSubsetting = ends.get(1).getOwnedReferenceSubsetting();
224+
if (referenceSubsetting != null) {
225+
return referenceSubsetting.getReferencedFeature();
226+
}
227+
}
228+
return getTargetFeature(succession);
229+
}
230+
208231
public static Feature getTargetFeature(Feature feature) {
209232
Type type = feature.getOwningType();
210233
if (type == null) {

sysml/src/examples/Simple Tests/ControlNodeTest.sysml

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -24,7 +24,12 @@ action def ControlNodeTest {
2424
action B1 {
2525
in b;
2626
}
27+
then M;
28+
2729
action B2 {
2830
in b;
2931
}
32+
then M;
33+
34+
merge M;
3035
}

sysml/src/examples/Simple Tests/DecisionTest.sysml

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -6,7 +6,7 @@ action def DecisionTest {
66
if x > 1 then A2;
77
else A3;
88

9-
then decide;
9+
then decide D;
1010
if true then A1;
1111
if false then A2;
1212

0 commit comments

Comments
 (0)