From c5ddf59df9ca518d2360270fc4232ba3d8b3794a Mon Sep 17 00:00:00 2001 From: Ed Seidewitz Date: Sat, 12 Sep 2026 16:52:27 -0400 Subject: [PATCH 1/3] ST6RI-974 Added Xpect tests on connection/flow ends as usages. Test succeeds when validation detects invalid ends with appropriate error message. - New tests fail. --- .../ConnectionUsage_End_Invalid.sysml.xt | 35 +++++++++++++++++++ .../invalid/ConnectionUsage_Invalid.sysml.xt | 4 ++- .../invalid/FlowUsage_End_Invalid.sysml.xt | 35 +++++++++++++++++++ ...id.sysml.xt => FlowUsage_Invalid.sysml.xt} | 2 +- 4 files changed, 74 insertions(+), 2 deletions(-) create mode 100644 org.omg.sysml.xpect.tests/src/org/omg/sysml/xpect/tests/validation/invalid/ConnectionUsage_End_Invalid.sysml.xt create mode 100644 org.omg.sysml.xpect.tests/src/org/omg/sysml/xpect/tests/validation/invalid/FlowUsage_End_Invalid.sysml.xt rename org.omg.sysml.xpect.tests/src/org/omg/sysml/xpect/tests/validation/invalid/{FlowConnectionUsage_Invalid.sysml.xt => FlowUsage_Invalid.sysml.xt} (99%) diff --git a/org.omg.sysml.xpect.tests/src/org/omg/sysml/xpect/tests/validation/invalid/ConnectionUsage_End_Invalid.sysml.xt b/org.omg.sysml.xpect.tests/src/org/omg/sysml/xpect/tests/validation/invalid/ConnectionUsage_End_Invalid.sysml.xt new file mode 100644 index 0000000000..0d2b14a78c --- /dev/null +++ b/org.omg.sysml.xpect.tests/src/org/omg/sysml/xpect/tests/validation/invalid/ConnectionUsage_End_Invalid.sysml.xt @@ -0,0 +1,35 @@ +//* +XPECT_SETUP org.omg.sysml.xpect.tests.validation.invalid.SysMLTests + ResourceSet { + ThisFile {} + File {from ="/library.kernel/Base.kerml"} + File {from ="/library.kernel/Links.kerml"} + File {from ="/library.kernel/Occurrences.kerml"} + File {from ="/library.kernel/Objects.kerml"} + File {from ="/library.systems/Items.sysml"} + File {from ="/library.systems/Parts.sysml"} + File {from ="/library.systems/Ports.sysml"} + File {from ="/library.systems/Connections.sysml"} + } + Workspace { + JavaProject { + SrcFolder { + ThisFile {} + File {from ="/library.kernel/Base.kerml"} + File {from ="/library.kernel/Links.kerml"} + File {from ="/library.kernel/Occurrences.kerml"} + File {from ="/library.kernel/Objects.kerml"} + File {from ="/library.systems/Items.sysml"} + File {from ="/library.systems/Parts.sysml"} + File {from ="/library.systems/Ports.sysml"} + File {from ="/library.systems/Connections.sysml"} + } + } + } +END_SETUP +*/ +package ConnectionUsage_End_Invalid { + // XPECT errors --> "A connection definition end must be a usage." at "abstract connection def B :> Links::BinaryLink;" + abstract connection def B :> Links::BinaryLink; +} + diff --git a/org.omg.sysml.xpect.tests/src/org/omg/sysml/xpect/tests/validation/invalid/ConnectionUsage_Invalid.sysml.xt b/org.omg.sysml.xpect.tests/src/org/omg/sysml/xpect/tests/validation/invalid/ConnectionUsage_Invalid.sysml.xt index 1178c2aa2b..621f6559bf 100644 --- a/org.omg.sysml.xpect.tests/src/org/omg/sysml/xpect/tests/validation/invalid/ConnectionUsage_Invalid.sysml.xt +++ b/org.omg.sysml.xpect.tests/src/org/omg/sysml/xpect/tests/validation/invalid/ConnectionUsage_Invalid.sysml.xt @@ -3,6 +3,7 @@ XPECT_SETUP org.omg.sysml.xpect.tests.validation.invalid.SysMLTests ResourceSet { ThisFile {} File {from ="/library.kernel/Base.kerml"} + File {from ="/library.kernel/Links.kerml"} File {from ="/library.kernel/Occurrences.kerml"} File {from ="/library.kernel/Objects.kerml"} File {from ="/library.kernel/Performances.kerml"} @@ -17,6 +18,7 @@ XPECT_SETUP org.omg.sysml.xpect.tests.validation.invalid.SysMLTests SrcFolder { ThisFile {} File {from ="/library.kernel/Base.kerml"} + File {from ="/library.kernel/Links.kerml"} File {from ="/library.kernel/Occurrences.kerml"} File {from ="/library.kernel/Objects.kerml"} File {from ="/library.kernel/Performances.kerml"} @@ -30,7 +32,7 @@ XPECT_SETUP org.omg.sysml.xpect.tests.validation.invalid.SysMLTests } END_SETUP */ -package P { +package ConnectionUsage_Invalid { part def A; part def B; part def C; diff --git a/org.omg.sysml.xpect.tests/src/org/omg/sysml/xpect/tests/validation/invalid/FlowUsage_End_Invalid.sysml.xt b/org.omg.sysml.xpect.tests/src/org/omg/sysml/xpect/tests/validation/invalid/FlowUsage_End_Invalid.sysml.xt new file mode 100644 index 0000000000..d7f8165fec --- /dev/null +++ b/org.omg.sysml.xpect.tests/src/org/omg/sysml/xpect/tests/validation/invalid/FlowUsage_End_Invalid.sysml.xt @@ -0,0 +1,35 @@ +//* +XPECT_SETUP org.omg.sysml.xpect.tests.validation.invalid.SysMLTests + ResourceSet { + ThisFile {} + File {from ="/library.kernel/Base.kerml"} + File {from ="/library.kernel/Links.kerml"} + File {from ="/library.kernel/Occurrences.kerml"} + File {from ="/library.kernel/Objects.kerml"} + File {from ="/library.systems/Items.sysml"} + File {from ="/library.systems/Parts.sysml"} + File {from ="/library.systems/Ports.sysml"} + File {from ="/library.systems/Flows.sysml"} + } + Workspace { + JavaProject { + SrcFolder { + ThisFile {} + File {from ="/library.kernel/Base.kerml"} + File {from ="/library.kernel/Links.kerml"} + File {from ="/library.kernel/Occurrences.kerml"} + File {from ="/library.kernel/Objects.kerml"} + File {from ="/library.systems/Items.sysml"} + File {from ="/library.systems/Parts.sysml"} + File {from ="/library.systems/Ports.sysml"} + File {from ="/library.systems/Flows.sysml"} + } + } + } +END_SETUP +*/ +package Flow_End_Invalid { + // XPECT errors --> "A flow definition end must be a usage." at "abstract flow def B :> Links::BinaryLink;" + abstract flow def B :> Links::BinaryLink; +} + diff --git a/org.omg.sysml.xpect.tests/src/org/omg/sysml/xpect/tests/validation/invalid/FlowConnectionUsage_Invalid.sysml.xt b/org.omg.sysml.xpect.tests/src/org/omg/sysml/xpect/tests/validation/invalid/FlowUsage_Invalid.sysml.xt similarity index 99% rename from org.omg.sysml.xpect.tests/src/org/omg/sysml/xpect/tests/validation/invalid/FlowConnectionUsage_Invalid.sysml.xt rename to org.omg.sysml.xpect.tests/src/org/omg/sysml/xpect/tests/validation/invalid/FlowUsage_Invalid.sysml.xt index 2bb5dd478d..785bd98315 100644 --- a/org.omg.sysml.xpect.tests/src/org/omg/sysml/xpect/tests/validation/invalid/FlowConnectionUsage_Invalid.sysml.xt +++ b/org.omg.sysml.xpect.tests/src/org/omg/sysml/xpect/tests/validation/invalid/FlowUsage_Invalid.sysml.xt @@ -36,7 +36,7 @@ XPECT_SETUP org.omg.sysml.xpect.tests.validation.invalid.SysMLTests } END_SETUP */ -package P { +package FlowUsage_Invalid { part def A; abstract flow def F; From b6abb9305f62cca4ae842a732b9716555cac104e Mon Sep 17 00:00:00 2001 From: Ed Seidewitz Date: Thu, 24 Sep 2026 16:13:36 -0400 Subject: [PATCH 2/3] ST6RI-974 Added checks for connection and flow def ends being usages. - Check for flow def fails on library base flow def Flows::Message. - Xpect tests pass. --- .../invalid/FlowUsage_Invalid.sysml.xt | 8 +-- .../xtext/validation/SysMLValidator.xtend | 55 ++++++++++++++----- 2 files changed, 46 insertions(+), 17 deletions(-) diff --git a/org.omg.sysml.xpect.tests/src/org/omg/sysml/xpect/tests/validation/invalid/FlowUsage_Invalid.sysml.xt b/org.omg.sysml.xpect.tests/src/org/omg/sysml/xpect/tests/validation/invalid/FlowUsage_Invalid.sysml.xt index 785bd98315..0505bc14f0 100644 --- a/org.omg.sysml.xpect.tests/src/org/omg/sysml/xpect/tests/validation/invalid/FlowUsage_Invalid.sysml.xt +++ b/org.omg.sysml.xpect.tests/src/org/omg/sysml/xpect/tests/validation/invalid/FlowUsage_Invalid.sysml.xt @@ -49,11 +49,11 @@ package FlowUsage_Invalid { flow def I :> H { end a; end b; - // XPECT errors --> "A flow connection definition can have at most two ends." at "end c;" + // XPECT errors --> "A flow definition can have at most two ends." at "end c;" end c; } - // XPECT errors --> "A flow connection definition can have at most two ends." at "flow def J :> I;" + // XPECT errors --> "A flow definition can have at most two ends." at "flow def J :> I;" flow def J :> I; part apart : A { @@ -63,14 +63,14 @@ package FlowUsage_Invalid { message : F from b to c; message : F, G from b to c; - // XPECT errors --> "A flow connection must be typed by flow connection definitions." at "message :A from b to c;" + // XPECT errors --> "A flow usage must be typed by flow definitions." at "message :A from b to c;" //* XPECT warnings --- "Duplicate of inherited member name 'self' from Action, Part" at "message :A from b to c;" "Duplicate of inherited member name 'start' from Action, Part" at "message :A from b to c;" "Duplicate of inherited member name 'done' from Action, Part" at "message :A from b to c;" --- */ message :A from b to c; - // XPECT errors --> "A flow connection must be typed by flow connection definitions." at "message :apart from b to c;" + // XPECT errors --> "A flow usage must be typed by flow definitions." at "message :apart from b to c;" //* XPECT warnings --- "Duplicate of inherited member name 'self' from Action, Part" at "message :apart from b to c;" "Duplicate of inherited member name 'start' from Action, Part" at "message :apart from b to c;" diff --git a/org.omg.sysml.xtext/src/org/omg/sysml/xtext/validation/SysMLValidator.xtend b/org.omg.sysml.xtext/src/org/omg/sysml/xtext/validation/SysMLValidator.xtend index efdc445f53..a8544d1a02 100644 --- a/org.omg.sysml.xtext/src/org/omg/sysml/xtext/validation/SysMLValidator.xtend +++ b/org.omg.sysml.xtext/src/org/omg/sysml/xtext/validation/SysMLValidator.xtend @@ -133,6 +133,7 @@ import org.omg.sysml.util.FeatureUtil import org.omg.sysml.util.UsageUtil import org.omg.sysml.lang.sysml.MetadataFeature import org.omg.sysml.util.TypeUtil +import org.omg.sysml.lang.sysml.ConnectionDefinition /** * This class contains custom validation rules. @@ -234,14 +235,19 @@ class SysMLValidator extends KerMLValidator { public static val INVALID_PORT_USAGE_NESTED_USAGES_NOT_COMPOSITE = "validatePortUsageNestedUsagesNotComposite" public static val INVALID_PORT_USAGE_NESTED_USAGES_NOT_COMPOSITE_MSG = "Nested usages in a port usage (other than ports) must be referential." + public static val INVALID_CONNECTION_DEFINITION_ENDS_ARE_USAGES = "validateConnectionDefinitionEndsAreUsages_" + public static val INVALID_CONNECTION_DEFINITION_ENDS_ARE_USAGES_MSG = "A connection definition end must be a usage." + public static val INVALID_CONNECTION_USAGE_TYPE = "validateConnectionUsageType_" public static val INVALID_CONNECTION_USAGE_TYPE_MSG = "A connection must be typed by connection definitions." + public static val INVALID_FLOW_DEFINITION_ENDS_ARE_USAGES = "validateFlowDefinitionEndsAreUsages_" + public static val INVALID_FLOW_DEFINITION_ENDS_ARE_USAGES_MSG = "A flow definition end must be a usage." public static val INVALID_FLOW_DEFINITION_END = "validateFlowDefinitionConnectionEnds" - public static val INVALID_FLOW_DEFINITION_END_MSG = "A flow connection definition can have at most two ends." + public static val INVALID_FLOW_DEFINITION_END_MSG = "A flow definition can have at most two ends." public static val INVALID_FLOW_USAGE_TYPE = "validateFlowUsageType_" - public static val INVALID_FLOW_USAGE_TYPE_MSG = "A flow connection must be typed by flow connection definitions." + public static val INVALID_FLOW_USAGE_TYPE_MSG = "A flow usage must be typed by flow definitions." public static val INVALID_INTERFACE_DEFINITION_END = "validateInterfaceDefinitionEnd_" public static val INVALID_INTERFACE_DEFINITION_END_MSG = "An interface definition end must be a port." @@ -700,6 +706,12 @@ class SysMLValidator extends KerMLValidator { val usages = usg.nestedUsage.filter[u | !(u instanceof PortUsage)] checkAllNotComposite(usages, INVALID_PORT_USAGE_NESTED_USAGES_NOT_COMPOSITE_MSG, INVALID_PORT_USAGE_NESTED_USAGES_NOT_COMPOSITE) } + + @Check + def checkConnectionDefinition(ConnectionDefinition cdef) { + // validateConnectionDefinitionEndsAreUsages_ + checkEndsAreUsages(cdef, INVALID_CONNECTION_DEFINITION_ENDS_ARE_USAGES_MSG, INVALID_CONNECTION_DEFINITION_ENDS_ARE_USAGES) + } @Check def checkConnectionUsage(ConnectionUsage usg) { @@ -710,8 +722,10 @@ class SysMLValidator extends KerMLValidator { @Check def checkFlowDefinition(FlowDefinition cdef) { - // validateConnectionDefinitionConnectionEnds - val ends = cdef.endFeature + // validateFlowDefinitionEndsAreUsages_ + val ends = checkEndsAreUsages(cdef, INVALID_FLOW_DEFINITION_ENDS_ARE_USAGES_MSG, INVALID_FLOW_DEFINITION_ENDS_ARE_USAGES) + + // validateFlowDefinitionEnds if (ends.size > 2) { val ownedEnds = cdef.ownedEndFeature if (ownedEnds.size <= 2) { @@ -957,7 +971,7 @@ class SysMLValidator extends KerMLValidator { // validateStateDefinitionParallelSubactions is checked by checkTransitionUsage and checkSuccession // validateStateDefinitionStateSubactionKind - checkStateSubactions(defn); + checkStateSubactions(defn,INVALID_STATE_DEFINITION_SUBACTION_KIND) } @Check @@ -977,14 +991,7 @@ class SysMLValidator extends KerMLValidator { // validateStateUsageParallelSubactions is checked by checkTransitionUsage and checkSuccession // validateStateUsageStateSubactionKind - checkStateSubactions(usg) - } - - protected def checkStateSubactions(Type type) { - val errorId = type instanceof Definition? INVALID_STATE_DEFINITION_SUBACTION_KIND: INVALID_STATE_USAGE_SUBACTION_KIND - checkAtMostOneRelationship(type, UsageUtil.getStateSubactionMembershipsOf(type, StateSubactionKind.ENTRY), INVALID_STATE_SUBACTION_KIND_ENTRY_MSG, errorId); - checkAtMostOneRelationship(type, UsageUtil.getStateSubactionMembershipsOf(type, StateSubactionKind.DO), INVALID_STATE_SUBACTION_KIND_DO_MSG, errorId); - checkAtMostOneRelationship(type, UsageUtil.getStateSubactionMembershipsOf(type, StateSubactionKind.EXIT), INVALID_STATE_SUBACTION_KIND_EXIT_MSG, errorId); + checkStateSubactions(usg, INVALID_STATE_USAGE_SUBACTION_KIND) } @Check @@ -1365,6 +1372,28 @@ class SysMLValidator extends KerMLValidator { /* Utility Methods */ + protected def checkStateSubactions(Type type, String errorId) { + checkAtMostOneRelationship(type, UsageUtil.getStateSubactionMembershipsOf(type, StateSubactionKind.ENTRY), INVALID_STATE_SUBACTION_KIND_ENTRY_MSG, errorId); + checkAtMostOneRelationship(type, UsageUtil.getStateSubactionMembershipsOf(type, StateSubactionKind.DO), INVALID_STATE_SUBACTION_KIND_DO_MSG, errorId); + checkAtMostOneRelationship(type, UsageUtil.getStateSubactionMembershipsOf(type, StateSubactionKind.EXIT), INVALID_STATE_SUBACTION_KIND_EXIT_MSG, errorId); + } + + protected def checkEndsAreUsages(Type type, String msg, String errorId) { + val ends = TypeUtil.getAllEndFeaturesOf(type) + val nonUsageEnds = ends.filter[end | !(end instanceof Usage)] + val ownedNonUsageEnds = nonUsageEnds.filter[end | end.owner === type] + if (!nonUsageEnds.isEmpty) { + if (ownedNonUsageEnds.isEmpty()) { + error(msg, type, null, errorId) + } else { + for (end: ownedNonUsageEnds) { + error(msg, end, null, errorId) + } + } + } + return ends; + } + protected def boolean checkNotAny(Iterable list, String msg, EStructuralFeature eFeature, String eId) { var check = true for (obj: list) { From 364c6970af6ea1ba3809d04b0987b63989adb91b Mon Sep 17 00:00:00 2001 From: Ed Seidewitz Date: Thu, 24 Sep 2026 17:37:29 -0400 Subject: [PATCH 3/3] SYSML21-681 Declared "messages" as action usage instead of flow usage. Actually resolves the problem from issue SYSML21-324. - Also Updated "Flows::Message" and "messages" to have usages as owned ends. --- .../library.systems/Flows.sysml | 5 + sysml.library/.index.json | 238 +++++++++++++++++- sysml.library/Systems Library/Flows.sysml | 8 +- 3 files changed, 249 insertions(+), 2 deletions(-) diff --git a/org.omg.sysml.xpect.tests/library.systems/Flows.sysml b/org.omg.sysml.xpect.tests/library.systems/Flows.sysml index f2646f6928..aed02b1f64 100644 --- a/org.omg.sysml.xpect.tests/library.systems/Flows.sysml +++ b/org.omg.sysml.xpect.tests/library.systems/Flows.sysml @@ -45,6 +45,9 @@ standard library package Flows { ref payload :>> MessageAction::payload, Transfer::payload; + end occurrence source: Occurrence :>> Transfer::source; + end occurrence target: Occurrence :>> Transfer::target; + private ref action thisConnection = self; in event occurrence sourceEvent [1] default thisConnection.start { @@ -101,6 +104,8 @@ standard library package Flows { /* * messages is the base feature of all FlowUsages. */ + end occurrence source: Occurrence :>> Message::source, transfers::source; + end occurrence target: Occurrence :>> Message::target, transfers::target; } abstract flow flows: Flow[0..*] nonunique :> messages, flowTransfers { diff --git a/sysml.library/.index.json b/sysml.library/.index.json index cb534c0f50..ad8c740041 100644 --- a/sysml.library/.index.json +++ b/sysml.library/.index.json @@ -26102,6 +26102,65 @@ "self", "that" ], + "Flows::Message::source": [ + "differencesOf", + "dispatchScope", + "endShot", + "immediatePredecessors", + "immediateSuccessors", + "incomingTransferSort", + "incomingTransfers", + "incomingTransfersToSelf", + "innerSpaceDimension", + "innerSpaceOccurrences", + "intersectionsOf", + "isClosed", + "isDispatch", + "isRunToCompletion", + "justOutsideOfOccurrences", + "localClock", + "matingOccurrences", + "middleTimeSlice", + "outerSpaceDimension", + "outgoingTransfers", + "outgoingTransfersFromSelf", + "outsideOfOccurrences", + "portionOf", + "portionOfLife", + "portions", + "predecessors", + "runToCompletionScope", + "sameLifeOccurrences", + "self", + "snapshotOf", + "snapshots", + "sourceOutput", + "spaceBoundary", + "spaceBoundaryOf", + "spaceEnclosedOccurrences", + "spaceInterior", + "spaceInteriorOf", + "spaceShotOf", + "spaceShots", + "spaceSliceOf", + "spaceSlices", + "spaceTimeCoincidentOccurrences", + "spaceTimeEnclosedOccurrences", + "spaceTimeEnclosedPoints", + "startShot", + "suboccurrences", + "successors", + "superoccurrence", + "surroundedByOccurrences", + "that", + "this", + "timeCoincidentOccurrences", + "timeEnclosedOccurrences", + "timeSliceOf", + "timeSlices", + "unionsOf", + "withoutOccurrences" + ], "Flows::Message::sourceEvent": [ "differencesOf", "dispatchScope", @@ -26162,6 +26221,65 @@ "unionsOf", "withoutOccurrences" ], + "Flows::Message::target": [ + "differencesOf", + "dispatchScope", + "endShot", + "immediatePredecessors", + "immediateSuccessors", + "incomingTransferSort", + "incomingTransfers", + "incomingTransfersToSelf", + "innerSpaceDimension", + "innerSpaceOccurrences", + "intersectionsOf", + "isClosed", + "isDispatch", + "isRunToCompletion", + "justOutsideOfOccurrences", + "localClock", + "matingOccurrences", + "middleTimeSlice", + "outerSpaceDimension", + "outgoingTransfers", + "outgoingTransfersFromSelf", + "outsideOfOccurrences", + "portionOf", + "portionOfLife", + "portions", + "predecessors", + "runToCompletionScope", + "sameLifeOccurrences", + "self", + "snapshotOf", + "snapshots", + "spaceBoundary", + "spaceBoundaryOf", + "spaceEnclosedOccurrences", + "spaceInterior", + "spaceInteriorOf", + "spaceShotOf", + "spaceShots", + "spaceSliceOf", + "spaceSlices", + "spaceTimeCoincidentOccurrences", + "spaceTimeEnclosedOccurrences", + "spaceTimeEnclosedPoints", + "startShot", + "suboccurrences", + "successors", + "superoccurrence", + "surroundedByOccurrences", + "targetInput", + "that", + "this", + "timeCoincidentOccurrences", + "timeEnclosedOccurrences", + "timeSliceOf", + "timeSlices", + "unionsOf", + "withoutOccurrences" + ], "Flows::Message::targetEvent": [ "differencesOf", "dispatchScope", @@ -26998,6 +27116,124 @@ "whileLoops", "withoutOccurrences" ], + "Flows::messages::source": [ + "differencesOf", + "dispatchScope", + "endShot", + "immediatePredecessors", + "immediateSuccessors", + "incomingTransferSort", + "incomingTransfers", + "incomingTransfersToSelf", + "innerSpaceDimension", + "innerSpaceOccurrences", + "intersectionsOf", + "isClosed", + "isDispatch", + "isRunToCompletion", + "justOutsideOfOccurrences", + "localClock", + "matingOccurrences", + "middleTimeSlice", + "outerSpaceDimension", + "outgoingTransfers", + "outgoingTransfersFromSelf", + "outsideOfOccurrences", + "portionOf", + "portionOfLife", + "portions", + "predecessors", + "runToCompletionScope", + "sameLifeOccurrences", + "self", + "snapshotOf", + "snapshots", + "sourceOutput", + "spaceBoundary", + "spaceBoundaryOf", + "spaceEnclosedOccurrences", + "spaceInterior", + "spaceInteriorOf", + "spaceShotOf", + "spaceShots", + "spaceSliceOf", + "spaceSlices", + "spaceTimeCoincidentOccurrences", + "spaceTimeEnclosedOccurrences", + "spaceTimeEnclosedPoints", + "startShot", + "suboccurrences", + "successors", + "superoccurrence", + "surroundedByOccurrences", + "that", + "this", + "timeCoincidentOccurrences", + "timeEnclosedOccurrences", + "timeSliceOf", + "timeSlices", + "unionsOf", + "withoutOccurrences" + ], + "Flows::messages::target": [ + "differencesOf", + "dispatchScope", + "endShot", + "immediatePredecessors", + "immediateSuccessors", + "incomingTransferSort", + "incomingTransfers", + "incomingTransfersToSelf", + "innerSpaceDimension", + "innerSpaceOccurrences", + "intersectionsOf", + "isClosed", + "isDispatch", + "isRunToCompletion", + "justOutsideOfOccurrences", + "localClock", + "matingOccurrences", + "middleTimeSlice", + "outerSpaceDimension", + "outgoingTransfers", + "outgoingTransfersFromSelf", + "outsideOfOccurrences", + "portionOf", + "portionOfLife", + "portions", + "predecessors", + "runToCompletionScope", + "sameLifeOccurrences", + "self", + "snapshotOf", + "snapshots", + "spaceBoundary", + "spaceBoundaryOf", + "spaceEnclosedOccurrences", + "spaceInterior", + "spaceInteriorOf", + "spaceShotOf", + "spaceShots", + "spaceSliceOf", + "spaceSlices", + "spaceTimeCoincidentOccurrences", + "spaceTimeEnclosedOccurrences", + "spaceTimeEnclosedPoints", + "startShot", + "suboccurrences", + "successors", + "superoccurrence", + "surroundedByOccurrences", + "targetInput", + "that", + "this", + "timeCoincidentOccurrences", + "timeEnclosedOccurrences", + "timeSliceOf", + "timeSlices", + "unionsOf", + "withoutOccurrences" + ], "Flows::successionFlows": [ "acceptSubactions", "assignments", @@ -280191,5 +280427,5 @@ "withoutOccurrences" ] }, - "checksum": "e69c541524fc1effc91c174657bf78869a7064934d7a70994d63fd364f44d6ae" + "checksum": "77a589d3cfd674e0363598fc273e148c40541f4a374184b13f95a81379704714" } \ No newline at end of file diff --git a/sysml.library/Systems Library/Flows.sysml b/sysml.library/Systems Library/Flows.sysml index f2646f6928..7a8df1bde6 100644 --- a/sysml.library/Systems Library/Flows.sysml +++ b/sysml.library/Systems Library/Flows.sysml @@ -45,6 +45,9 @@ standard library package Flows { ref payload :>> MessageAction::payload, Transfer::payload; + end occurrence source: Occurrence :>> Transfer::source; + end occurrence target: Occurrence :>> Transfer::target; + private ref action thisConnection = self; in event occurrence sourceEvent [1] default thisConnection.start { @@ -96,11 +99,14 @@ standard library package Flows { end occurrence target: Occurrence :>> Flow::target, FlowTransferBefore::target; } - abstract message messages: Message[0..*] nonunique :> transfers, actions { + abstract action messages: Message[0..*] nonunique :> transfers, actions { doc /* * messages is the base feature of all FlowUsages. */ + + end occurrence source: Occurrence :>> Message::source, transfers::source; + end occurrence target: Occurrence :>> Message::target, transfers::target; } abstract flow flows: Flow[0..*] nonunique :> messages, flowTransfers {