@@ -44,7 +44,6 @@ import org.omg.sysml.lang.sysml.ConnectionUsage
4444import org.omg.sysml.lang.sysml.ConstraintUsage
4545import org.omg.sysml.lang.sysml.DataType
4646import org.omg.sysml.lang.sysml.Definition
47- import org.omg.sysml.lang.sysml.Element
4847import org.omg.sysml.lang.sysml.EnumerationDefinition
4948import org.omg.sysml.lang.sysml.EnumerationUsage
5049import org.omg.sysml.lang.sysml.Feature
@@ -135,6 +134,7 @@ import org.omg.sysml.lang.sysml.TriggerKind
135134import org.omg.sysml.util.TypeUtil
136135import org.omg.sysml.lang.sysml.FlowDefinition
137136import org.omg.sysml.lang.sysml.FlowUsage
137+ import org.omg.sysml.lang.sysml.Relationship
138138
139139/**
140140 * This class contains custom validation rules.
@@ -932,9 +932,9 @@ class SysMLValidator extends KerMLValidator {
932932
933933 protected def checkStateSubactions (Type type ) {
934934 val errorId = type instanceof Definition ? INVALID_STATE_DEFINITION_SUBACTION_KIND : INVALID_STATE_USAGE_SUBACTION_KIND
935- checkAtMostOneElement( UsageUtil . getStateSubactionMembershipsOf(type, StateSubactionKind . ENTRY ), INVALID_STATE_SUBACTION_KIND_ENTRY_MSG , errorId);
936- checkAtMostOneElement( UsageUtil . getStateSubactionMembershipsOf(type, StateSubactionKind . DO ), INVALID_STATE_SUBACTION_KIND_DO_MSG , errorId);
937- checkAtMostOneElement( UsageUtil . getStateSubactionMembershipsOf(type, StateSubactionKind . EXIT ), INVALID_STATE_SUBACTION_KIND_EXIT_MSG , errorId);
935+ checkAtMostOneRelationship(type, UsageUtil . getStateSubactionMembershipsOf(type, StateSubactionKind . ENTRY ), INVALID_STATE_SUBACTION_KIND_ENTRY_MSG , errorId);
936+ checkAtMostOneRelationship(type, UsageUtil . getStateSubactionMembershipsOf(type, StateSubactionKind . DO ), INVALID_STATE_SUBACTION_KIND_DO_MSG , errorId);
937+ checkAtMostOneRelationship(type, UsageUtil . getStateSubactionMembershipsOf(type, StateSubactionKind . EXIT ), INVALID_STATE_SUBACTION_KIND_EXIT_MSG , errorId);
938938 }
939939
940940 @Check
@@ -1079,7 +1079,7 @@ class SysMLValidator extends KerMLValidator {
10791079 checkAtMostOneFeature(defn, SubjectMembership , INVALID_REQUIREMENT_DEFINITION_ONLY_ONE_SUBJECT_MSG , INVALID_REQUIREMENT_DEFINITION_ONLY_ONE_SUBJECT )
10801080
10811081 // validateRequirementDefinitionSubjectParameterPosition
1082- checkSubjectParameter(defn, defn . subjectParameter, defn . input, INVALID_REQUIREMENT_DEFINITION_SUBJECT_PARAMETER_POSITION_MSG , INVALID_REQUIREMENT_DEFINITION_SUBJECT_PARAMETER_POSITION )
1082+ checkSubjectParameter(defn, INVALID_REQUIREMENT_DEFINITION_SUBJECT_PARAMETER_POSITION_MSG , INVALID_REQUIREMENT_DEFINITION_SUBJECT_PARAMETER_POSITION )
10831083 }
10841084
10851085 @Check
@@ -1091,7 +1091,7 @@ class SysMLValidator extends KerMLValidator {
10911091 checkAtMostOneFeature(usg, SubjectMembership , INVALID_REQUIREMENT_USAGE_ONLY_ONE_SUBJECT_MSG , INVALID_REQUIREMENT_USAGE_ONLY_ONE_SUBJECT )
10921092
10931093 // validateRequirementUsageSubjectParameterPosition
1094- checkSubjectParameter(usg, usg . subjectParameter, usg . input, INVALID_REQUIREMENT_USAGE_SUBJECT_PARAMETER_POSITION_MSG , INVALID_REQUIREMENT_USAGE_SUBJECT_PARAMETER_POSITION )
1094+ checkSubjectParameter(usg, INVALID_REQUIREMENT_USAGE_SUBJECT_PARAMETER_POSITION_MSG , INVALID_REQUIREMENT_USAGE_SUBJECT_PARAMETER_POSITION )
10951095 }
10961096
10971097 @Check
@@ -1129,7 +1129,7 @@ class SysMLValidator extends KerMLValidator {
11291129 checkAtMostOneFeature(defn, SubjectMembership , INVALID_CASE_DEFINITION_ONLY_ONE_SUBJECT_MSG , INVALID_CASE_DEFINITION_ONLY_ONE_SUBJECT )
11301130
11311131 // validateCaseDefinitionSubjectParameterPosition
1132- checkSubjectParameter(defn, defn . subjectParameter, defn . input, INVALID_CASE_DEFINITION_SUBJECT_PARAMETER_POSITION_MSG , INVALID_CASE_DEFINITION_SUBJECT_PARAMETER_POSITION )
1132+ checkSubjectParameter(defn, INVALID_CASE_DEFINITION_SUBJECT_PARAMETER_POSITION_MSG , INVALID_CASE_DEFINITION_SUBJECT_PARAMETER_POSITION )
11331133 }
11341134
11351135 @Check
@@ -1145,7 +1145,7 @@ class SysMLValidator extends KerMLValidator {
11451145 checkAtMostOneFeature(usg, SubjectMembership , INVALID_CASE_USAGE_ONLY_ONE_SUBJECT_MSG , INVALID_CASE_USAGE_ONLY_ONE_SUBJECT )
11461146
11471147 // validateCaseUsageSubjectParameterPosition
1148- checkSubjectParameter(usg, usg . subjectParameter, usg . input, INVALID_CASE_USAGE_SUBJECT_PARAMETER_POSITION_MSG , INVALID_CASE_USAGE_SUBJECT_PARAMETER_POSITION )
1148+ checkSubjectParameter(usg, INVALID_CASE_USAGE_SUBJECT_PARAMETER_POSITION_MSG , INVALID_CASE_USAGE_SUBJECT_PARAMETER_POSITION )
11491149 }
11501150
11511151 @Check
@@ -1321,17 +1321,26 @@ class SysMLValidator extends KerMLValidator {
13211321 return check
13221322 }
13231323
1324- protected def boolean checkAtMostOneFeature (Type owningType , Class<? extends FeatureMembership > kind , String msg , String eId ) {
1325- var mems = owningType . ownedFeatureMembership . filter[m | kind. isInstance(m)]
1326- checkAtMostOneElement( mems, msg, eId);
1324+ protected def boolean checkAtMostOneFeature (Type featuringType , Class<? extends FeatureMembership > kind , String msg , String eId ) {
1325+ var mems = featuringType . featureMembership . filter[m | kind. isInstance(m)]
1326+ checkAtMostOneRelationship(featuringType, mems, msg, eId)
13271327 }
13281328
1329- protected def boolean checkAtMostOneElement ( Iterable<? extends Element > elements , String msg , String eId ) {
1330- if (elements . size <= 1 ) {
1329+ protected def boolean checkAtMostOneRelationship ( Type type , Iterable<? extends Relationship > relationships , String msg , String eId ) {
1330+ if (relationships . size <= 1 ) {
13311331 return true ;
13321332 } else {
1333- for (var i = 1 ; i < elements. size; i++ ) {
1334- error(msg, elements. get(i), null , eId);
1333+ val ownedRelationships = relationships. filter[owningRelatedElement == = type]
1334+ if (ownedRelationships. empty) {
1335+ error(msg, type, null , eId);
1336+ } else if (ownedRelationships. size == relationships. size) {
1337+ for (var i = 1 ; i < ownedRelationships. size; i++ ) {
1338+ error(msg, ownedRelationships. get(i), null , eId);
1339+ }
1340+ } else {
1341+ for (mem: ownedRelationships) {
1342+ error(msg, mem, null , eId);
1343+ }
13351344 }
13361345 return false ;
13371346 }
@@ -1381,9 +1390,11 @@ class SysMLValidator extends KerMLValidator {
13811390 return true
13821391 }
13831392
1384- protected def boolean checkSubjectParameter (Type type , Feature subjectParameter , Iterable<Feature > inputs , String msg , String eId ) {
1385- if (subjectParameter !== null && (inputs. empty || inputs. get(0 ) !== subjectParameter)) {
1386- if (subjectParameter. owningType == = type) {
1393+ protected def boolean checkSubjectParameter (Type type , String msg , String eId ) {
1394+ val inputs = type. input
1395+ if (inputs. empty || ! UsageUtil . isSubjectParameter(inputs. get(0 ))) {
1396+ val subjectParameter = UsageUtil . getOwnedSubjectParameterOf(type)
1397+ if (subjectParameter !== null ) {
13871398 error(msg, subjectParameter, null , eId)
13881399 } else {
13891400 error(msg, type, null , eId)
0 commit comments