Skip to content

Commit bbefa91

Browse files
committed
SYSML2_-89 Updated implied specialization conditions for TransitionUsage
- Also implemented check for validateTransitionUsageTriggerActions.
1 parent b9f3388 commit bbefa91

3 files changed

Lines changed: 37 additions & 5 deletions

File tree

org.omg.sysml.xpect.tests/src/org/omg/sysml/xpect/tests/validation/invalid/TransitionUsage_invalid.sysml.xt

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -46,8 +46,14 @@ package TransitionUsage_invalid {
4646
then S1_2;
4747
state S1_2;
4848
}
49+
50+
item def A;
4951

5052
state def S2 {
53+
entry action init;
54+
// XPECT errors ---> "A transition with an accepter must have a state as its source." at "accept A"
55+
transition init accept A then S2_1;
56+
5157
state S2_1;
5258
transition
5359
first S2_1

org.omg.sysml.xtext/src/org/omg/sysml/xtext/validation/SysMLValidator.xtend

Lines changed: 19 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -334,6 +334,8 @@ class SysMLValidator extends KerMLValidator {
334334
public static val INVALID_TRANSITION_USAGE_PARAMETERS_MSG_2 = "Must have two input parameters."
335335
public static val INVALID_TRANSITION_USAGE_SUCCESSION = "validateTransitionUsageSuccession"
336336
public static val INVALID_TRANSITION_USAGE_SUCCESSION_MSG = "A transition must own a succession to its target."
337+
public static val INVALID_TRANSITION_USAGE_TRIGGER_ACTIONS = "validateTransitionUsageTriggerActions"
338+
public static val INVALID_TRANSITION_USAGE_TRIGGER_ACTIONS_MSG = "A transition with an accepter must have a state as its source."
337339

338340
public static val INVALID_CALCULATION_USAGE_TYPE = "validateCalculationUsageType_"
339341
public static val INVALID_CALCULATION_USAGE_TYPE_MSG = "A calculation must be typed by one calculation definition."
@@ -954,6 +956,14 @@ class SysMLValidator extends KerMLValidator {
954956
if (!(mem.transitionFeature instanceof AcceptActionUsage)) {
955957
error(INVALID_TRANSITION_FEATURE_MEMBERSHIP_TRIGGER_ACTION_MSG, mem, null, INVALID_TRANSITION_FEATURE_MEMBERSHIP_TRIGGER_ACTION)
956958
}
959+
// // validateTransitionUsageTriggerActions
960+
// val owningType = mem.owningType
961+
// if (owningType instanceof TransitionUsage) {
962+
// val source = owningType.source
963+
// if (source !== null && !(source instanceof StateUsage) && !owningType.triggerAction.empty) {
964+
// error(INVALID_TRANSITION_USAGE_TRIGGER_ACTIONS_MSG, mem, null, INVALID_TRANSITION_USAGE_TRIGGER_ACTIONS)
965+
// }
966+
// }
957967
}
958968

959969
// validateTransitionFeatureMembershipOwningType
@@ -976,7 +986,8 @@ class SysMLValidator extends KerMLValidator {
976986

977987
// validateTransitionUsageParameters
978988
val n = usg.inputParameters.size
979-
if (usg.triggerAction.isEmpty) {
989+
val triggerAction = usg.triggerAction
990+
if (triggerAction.isEmpty) {
980991
if (n < 1) {
981992
error(INVALID_TRANSITION_USAGE_PARAMETERS_MSG_1, usg, null, INVALID_TRANSITION_USAGE_PARAMETERS)
982993
}
@@ -991,6 +1002,13 @@ class SysMLValidator extends KerMLValidator {
9911002
if (successions.empty || !(successions.get(0) as Succession).targetFeature.forall[f | FeatureUtil.getBasicFeatureOf(f) instanceof ActionUsage]) {
9921003
error(INVALID_TRANSITION_USAGE_SUCCESSION_MSG, usg, null, INVALID_TRANSITION_USAGE_SUCCESSION)
9931004
}
1005+
1006+
// validateTransitionUsageTriggerActions
1007+
val source = usg.source
1008+
val mem = usg.ownedMembership.filter(TransitionFeatureMembership).filter[kind == TransitionFeatureKind.TRIGGER].head
1009+
if (source !== null && !(source instanceof StateUsage) && mem !== null) {
1010+
error(INVALID_TRANSITION_USAGE_TRIGGER_ACTIONS_MSG, mem, null, INVALID_TRANSITION_USAGE_TRIGGER_ACTIONS)
1011+
}
9941012
}
9951013

9961014
@Check

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

Lines changed: 12 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,6 @@
11
/*******************************************************************************
22
* SysML 2 Pilot Implementation
3-
* Copyright (c) 2021, 2023, 2024 Model Driven Solutions, Inc.
3+
* Copyright (c) 2021, 2023-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
@@ -57,18 +57,23 @@ protected String getDefaultSupertype() {
5757
getDefaultSupertype("base");
5858
}
5959

60+
61+
// checkTransitionUsageActionSpecialization
6062
protected boolean isActionTransition() {
6163
TransitionUsage target = getTarget();
6264
Type owningType = target.getOwningType();
6365
return target.isComposite() &&
64-
(owningType instanceof ActionDefinition || owningType instanceof ActionUsage);
66+
(owningType instanceof ActionDefinition || owningType instanceof ActionUsage) &&
67+
!(target.getSource() instanceof StateUsage);
6568
}
6669

70+
// checkTransitionUsageStateSpecialization
6771
protected boolean isStateTransition() {
6872
TransitionUsage target = getTarget();
6973
Type owningType = target.getOwningType();
7074
return target.isComposite() &&
71-
(owningType instanceof StateDefinition || owningType instanceof StateUsage);
75+
(owningType instanceof StateDefinition || owningType instanceof StateUsage) &&
76+
target.getSource() instanceof StateUsage;
7277
}
7378

7479
// Transformation
@@ -88,10 +93,13 @@ protected Feature computeTransitionLinkConnectors() {
8893
TransitionUsage transition = getTarget();
8994
Feature transitionLinkFeature = UsageUtil.getTransitionLinkFeatureOf(transition);
9095
if (transitionLinkFeature == null) {
96+
// checkTransitionUsageSuccessionBindingConnector
9197
transitionLinkFeature = SysMLFactory.eINSTANCE.createReferenceUsage();
9298
TypeUtil.addOwnedFeatureTo(transition, transitionLinkFeature);
9399
Succession succession = transition.getSuccession();
94-
addBindingConnector(succession, transitionLinkFeature);
100+
addBindingConnector(succession, transitionLinkFeature);
101+
102+
// checkTransitionUsageSourceBindingConnector
95103
List<Feature> parameters = TypeUtil.getOwnedParametersOf(transition);
96104
if (!parameters.isEmpty()) {
97105
Feature source = transition.getSource();

0 commit comments

Comments
 (0)