Software Disclaimer

Class UML 2.3::Transition


A transition is a directed relationship between a source vertex and a target vertex. It may be part of a compound transition, which takes the state machine from one state configuration to another, representing the complete response of the state machine to an occurrence of an event of a particular type.

Direct Superclasses: Namespace, RedefinableElement

Direct Subclasses: ProtocolTransition

Class Precedence List: Transition, Namespace, RedefinableElement, NamedElement, Element


container : Region (1 1); -- source Transition
effect : Behavior (0 1); -- source Transition
guard : Constraint (0 1); -- source Transition

A guard is a constraint that provides a fine-grained control over the firing of the transition. The guard is evaluated when an event occurrence is dispatched by the state machine. If the guard is true at that time, the transition may be enabled, otherwise, it is disabled. Guards should be pure expressions without side effects. Guard expressions with side effects are ill formed.
Subsets: Namespace.ownedRule

kind : TransitionKind (1 1); -- source Transition
redefinedTransition : Transition (0 1); -- source Transition
redefinitionContext : Classifier (1 1); -- source Transition
source : Vertex (1 1); -- source Transition
target : Vertex (1 1); -- source Transition
trigger : Trigger (0 *); -- source Transition
elementImport : ElementImport (0 *); -- source Namespace
importedMember : PackageableElement (0 *); -- source Namespace
member : NamedElement (0 *); -- source Namespace
ownedMember : NamedElement (0 *); -- source Namespace
ownedRule : Constraint (0 *); -- source Namespace
packageImport : PackageImport (0 *); -- source Namespace
isLeaf : Boolean (1 1); -- source RedefinableElement
redefinedElement : RedefinableElement (0 *); -- source RedefinableElement
clientDependency : Dependency (0 *); -- source NamedElement
name : String (0 1); -- source NamedElement
nameExpression : StringExpression (0 1); -- source NamedElement
namespace : Namespace (0 1); -- source NamedElement
qualifiedName : String (0 1); -- source NamedElement
visibility : VisibilityKind (0 1); -- source NamedElement
ownedComment : Comment (0 *); -- source Element
ownedElement : Element (0 *); -- source Element
owner : Element (0 1); -- source Element


Signature: state_is_local() : Boolean;
Description: A transition with kind local must have a composite state or an entry point as its source.
Expression: (kind = TransitionKind::local) implies ((source.oclIsKindOf (State) and source.oclAsType(State).isComposite) or (source.oclIsKindOf (Pseudostate) and source.oclAsType(Pseudostate).kind = PseudostateKind::entryPoint))

Signature: state_is_internal() : Boolean;
Description: A transition with kind internal must have a state as its source, and its source and target must be equal.
Expression: (kind = TransitionKind::internal) implies (source.oclIsKindOf (State) and source = target)

Signature: state_is_external() : Boolean;
Description: A transition with kind external can source any vertex except entry points.
Expression: (kind = TransitionKind::external) implies not (source.oclIsKindOf(Pseudostate) and source.oclAsType(Pseudostate).kind = PseudostateKind::entryPoint)

Signature: signatures_compatible() : Boolean;
Description: In case of more than one trigger, the signatures of these must be compatible in case the parameters of the signal are assigned to local variables/attributes.
Expression: true

Signature: outgoing_pseudostates() : Boolean;
Description: Transitions outgoing pseudostates may not have a trigger.
The OCL used here is not normative.
Editor's notes: Removed extra close paren.
Expression: source.oclIsKindOf(Pseudostate) and (source.kind <> #initial) implies trigger->isEmpty()
Original: source.oclIsKindOf(Pseudostate) and (source.kind <> #initial)) implies trigger->isEmpty()

Signature: join_segment_state() : Boolean;
Description: A join segment must always originate from a state.
Expression: (target.oclIsKindOf(Pseudostate) and target.kind = #join) implies (source.oclIsKindOf(State))

Signature: join_segment_guards() : Boolean;
Description: A join segment must not have guards or triggers.
Expression: (target.oclIsKindOf(Pseudostate) and target.kind = #join) implies (guard->isEmpty() and trigger->isEmpty())

Signature: initial_transition() : Boolean;
Description: An initial transition at the topmost level (region of a statemachine) either has no trigger or it has a trigger with the stereotype <>.
The OCL used here is not normative.
Editor's notes: added () to isEmpty, but no stateMachine, no .top
Expression: true
Original: self.source.oclIsKindOf(Pseudostate) implies (self.source.oclAsType(Pseudostate).kind = #initial) implies (self.source.container = implies ((self.trigger->isEmpty) or ( = 'create'))

Signature: fork_segment_state() : Boolean;
Description: A fork segment must always target a state.
Expression: (source.oclIsKindOf(Pseudostate) and source.kind = #fork) implies (target.oclIsKindOf(State))

Signature: fork_segment_guards() : Boolean;
Description: A fork segment must not have guards or triggers.
Expression: (source.oclIsKindOf(Pseudostate) and source.kind = #fork) implies (guard->isEmpty() and trigger->isEmpty())


Signature: redefinitionContext.1() : Classifier;
Description: The redefinition context of a transition is the nearest containing statemachine.
Expression: result = let sm = containingStateMachine() in if sm.context->isEmpty() or sm.general->notEmpty() then sm else sm.context endif

Signature: isConsistentWith(redefinee : RedefinableElement; ) : Boolean;
Description: The query isConsistentWith() specifies that a redefining transition is consistent with a redefined transition provided that the redefining transition has the following relation to the redefined transition: A redefining transition redefines all properties of the corresponding redefined transition, except the source state and the trigger.
The OCL used here is not normative.
Editor's notes: Various problems with parentheses, trans not tran
Expression: result = (redefinee.oclIsKindOf(Transition) and let trans: Transition = redefinee.oclAsType(Transition) in (source = trans.source) and (trigger = trans.trigger))
Original: result = (redefinee.oclIsKindOf(Transition) and let trans: Transition = redefinee.oclAsType(Transition) in (source() = trans.source() and trigger() = tran.trigger())

Signature: containingStateMachine() : StateMachine;
Description: The query containingStateMachine() returns the state machine that contains the transition either directly or transitively.
Expression: result = container.containingStateMachine()

Send questions or comments to