A ValueSpecificationAction is an Action that evaluates a ValueSpecification and provides a result. The multiplicity of the result OutputPin is 1..1 OCL result.is(1,1) The type of the value ValueSpecification must conform to the type of the result OutputPin. OCL value.type.conformsTo(result.type) The OutputPin on which the result value is placed. The ValueSpecification to be evaluated. VariableAction is an abstract class for Actions that operate on a specified Variable. The VariableAction must be in the scope of the variable. OCL variable.isAccessibleBy(self) The Variable to be read or written. WriteLinkAction is an abstract class for LinkActions that create and destroy links. The visibility of at least one end must allow access from the context Classifier of the WriteLinkAction. OCL endData.end->exists(end | end.type=_'context' or end.visibility=VisibilityKind::public or end.visibility=VisibilityKind::protected and endData.end->exists(other | other<>end and _'context'.conformsTo(other.type.oclAsType(Classifier)))) WriteStructuralFeatureAction is an abstract class for StructuralFeatureActions that change StructuralFeature values. The multiplicity of the result OutputPin must be 1..1. OCL result <> null implies result.is(1,1) The type of the value InputPin must conform to the type of the structuralFeature. OCL value <> null implies value.type.conformsTo(structuralFeature.type) The multiplicity of the value InputPin is 1..1. OCL value<>null implies value.is(1,1) The type of the result OutputPin is the same as the type of the inherited object InputPin. OCL result <> null implies result.type = object.type The OutputPin on which is put the input object as modified by the WriteStructuralFeatureAction. The InputPin that provides the value to be added or removed from the StructuralFeature. WriteVariableAction is an abstract class for VariableActions that change Variable values. The type of the value InputPin must conform to the type of the variable. OCL value <> null implies value.type.conformsTo(variable.type) The multiplicity of the value InputPin is 1..1. OCL value<>null implies value.is(1,1) The InputPin that gives the value to be added or removed from the Variable. ExpansionKind is an enumeration type used to specify how an ExpansionRegion executes its contents. The content of the ExpansionRegion is executed concurrently for the elements of the input collections. The content of the ExpansionRegion is executed iteratively for the elements of the input collections, in the order of the input elements, if the collections are ordered. A stream of input collection elements flows into a single execution of the content of the ExpansionRegion, in the order of the collection elements if the input collections are ordered. An AcceptCallAction is an AcceptEventAction that handles the receipt of a synchronous call request. In addition to the values from the Operation input parameters, the Action produces an output that is needed later to supply the information to the ReplyAction necessary to return control to the caller. An AcceptCallAction is for synchronous calls. If it is used to handle an asynchronous call, execution of the subsequent ReplyAction will complete immediately with no effect. The number of result OutputPins must be the same as the number of input (in and inout) ownedParameters of the Operation specified by the trigger Event. The type, ordering and multiplicity of each result OutputPin must be consistent with the corresponding input Parameter. OCL let parameter: OrderedSet(Parameter) = trigger.event->asSequence()->first().oclAsType(CallEvent).operation.inputParameters() in result->size() = parameter->size() and Sequence{1..result->size()}->forAll(i | parameter->at(i).type.conformsTo(result->at(i).type) and parameter->at(i).isOrdered = result->at(i).isOrdered and parameter->at(i).compatibleWith(result->at(i))) The action must have exactly one trigger, which must be for a CallEvent. OCL trigger->size()=1 and trigger->asSequence()->first().event.oclIsKindOf(CallEvent) isUnmrashall must be true for an AcceptCallAction. OCL isUnmarshall = true An OutputPin where a value is placed containing sufficient information to perform a subsequent ReplyAction and return control to the caller. The contents of this value are opaque. It can be passed and copied but it cannot be manipulated by the model. An AcceptEventAction is an Action that waits for the occurrence of one or more specific Events. If isUnmarshall=false and any of the triggers are for SignalEvents or TimeEvents, there must be exactly one result OutputPin with multiplicity 1..1. OCL not isUnmarshall and trigger->exists(event.oclIsKindOf(SignalEvent) or event.oclIsKindOf(TimeEvent)) implies output->size() = 1 and output->first().is(1,1) AcceptEventActions may have no input pins. OCL input->size() = 0 There are no OutputPins if the trigger events are only ChangeEvents and/or CallEvents when this action is an instance of AcceptEventAction and not an instance of a descendant of AcceptEventAction (such as AcceptCallAction). OCL (self.oclIsTypeOf(AcceptEventAction) and (trigger->forAll(event.oclIsKindOf(ChangeEvent) or event.oclIsKindOf(CallEvent)))) implies output->size() = 0 If isUnmarshall is true (and this is not an AcceptCallAction), there must be exactly one trigger, which is for a SignalEvent. The number of result output pins must be the same as the number of attributes of the signal. The type and ordering of each result output pin must be the same as the corresponding attribute of the signal. The multiplicity of each result output pin must be compatible with the multiplicity of the corresponding attribute. OCL isUnmarshall and self.oclIsTypeOf(AcceptEventAction) implies trigger->size()=1 and trigger->asSequence()->first().event.oclIsKindOf(SignalEvent) and let attribute: OrderedSet(Property) = trigger->asSequence()->first().event.oclAsType(SignalEvent).signal.allAttributes() in attribute->size()>0 and result->size() = attribute->size() and Sequence{1..result->size()}->forAll(i | result->at(i).type = attribute->at(i).type and result->at(i).isOrdered = attribute->at(i).isOrdered and result->at(i).includesMultiplicity(attribute->at(i))) If isUnmarshall=false and all the triggers are for SignalEvents, then the type of the single result OutputPin must either be null or all the signals must conform to it. OCL not isUnmarshall implies result->isEmpty() or let type: Type = result->first().type in type=null or (trigger->forAll(event.oclIsKindOf(SignalEvent)) and trigger.event.oclAsType(SignalEvent).signal->forAll(s | s.conformsTo(type))) Indicates whether there is a single OutputPin for a SignalEvent occurrence, or multiple OutputPins for attribute values of the instance of the Signal associated with a SignalEvent occurrence. OutputPins holding the values received from an Event occurrence. The Triggers specifying the Events of which the AcceptEventAction waits for occurrences. An Action is the fundamental unit of executable functionality. The execution of an Action represents some transformation or processing in the modeled system. Actions provide the ExecutableNodes within Activities and may also be used within Interactions. The context Classifier of the Behavior that contains this Action, or the Behavior itself if it has no context. The ordered set of InputPins representing the inputs to the Action. If true, the Action can begin a new, concurrent execution, even if there is already another execution of the Action ongoing. If false, the Action cannot begin a new execution until any previous execution has completed. A Constraint that must be satisfied when execution of the Action is completed. A Constraint that must be satisfied when execution of the Action is started. The ordered set of OutputPins representing outputs from the Action. The derivation for the context property. OCL result = (let behavior: Behavior = self.containingBehavior() in if behavior=null then null else if behavior._'context' = null then behavior else behavior._'context' endif endif) Return this Action and all Actions contained directly or indirectly in it. By default only the Action itself is returned, but the operation is overridden for StructuredActivityNodes. OCL result = (self->asSet()) Returns all the ActivityNodes directly or indirectly owned by this Action. This includes at least all the Pins of the Action. OCL result = (input.oclAsType(Pin)->asSet()->union(output->asSet())) OCL result = (if inStructuredNode<>null then inStructuredNode.containingBehavior() else if activity<>null then activity else interaction endif endif ) An ActionInputPin is a kind of InputPin that executes an Action to determine the values to input to another Action. The fromAction of an ActionInputPin must only have ActionInputPins as InputPins. OCL fromAction.input->forAll(oclIsKindOf(ActionInputPin)) The fromAction of an ActionInputPin must have exactly one OutputPin. OCL fromAction.output->size() = 1 The fromAction of an ActionInputPin cannot have ActivityEdges coming into or out of it or its Pins. OCL fromAction.incoming->union(outgoing)->isEmpty() and fromAction.input.incoming->isEmpty() and fromAction.output.outgoing->isEmpty() The Action used to provide the values of the ActionInputPin. An AddStructuralFeatureValueAction is a WriteStructuralFeatureAction for adding values to a StructuralFeature. A value InputPin is required. OCL value<>null AddStructuralFeatureActions adding a value to ordered StructuralFeatures must have a single InputPin for the insertion point with type UnlimitedNatural and multiplicity of 1..1 if isReplaceAll=false, and must have no Input Pin for the insertion point when the StructuralFeature is unordered. OCL if not structuralFeature.isOrdered then insertAt = null else not isReplaceAll implies insertAt<>null and insertAt->forAll(type=UnlimitedNatural and is(1,1.oclAsType(UnlimitedNatural))) endif The InputPin that gives the position at which to insert the value in an ordered StructuralFeature. The type of the insertAt InputPin is UnlimitedNatural, but the value cannot be zero. It is omitted for unordered StructuralFeatures. Specifies whether existing values of the StructuralFeature should be removed before adding the new value. An AddVariableValueAction is a WriteVariableAction for adding values to a Variable. A value InputPin is required. OCL value <> null AddVariableValueActions for ordered Variables must have a single InputPin for the insertion point with type UnlimtedNatural and multiplicity of 1..1 if isReplaceAll=false, otherwise the Action has no InputPin for the insertion point. OCL if not variable.isOrdered then insertAt = null else not isReplaceAll implies insertAt<>null and insertAt->forAll(type=UnlimitedNatural and is(1,1.oclAsType(UnlimitedNatural))) endif The InputPin that gives the position at which to insert a new value or move an existing value in ordered Variables. The type of the insertAt InputPin is UnlimitedNatural, but the value cannot be zero. It is omitted for unordered Variables. Specifies whether existing values of the Variable should be removed before adding the new value. A BroadcastSignalAction is an InvocationAction that transmits a Signal instance to all the potential target objects in the system. Values from the argument InputPins are used to provide values for the attributes of the Signal. The requestor continues execution immediately after the Signal instances are sent out and cannot receive reply values. The number of argument InputPins must be the same as the number of attributes in the signal. OCL argument->size() = signal.allAttributes()->size() The type, ordering, and multiplicity of an argument InputPin must be the same as the corresponding attribute of the signal. OCL let attribute: OrderedSet(Property) = signal.allAttributes() in Sequence{1..argument->size()}->forAll(i | argument->at(i).type.conformsTo(attribute->at(i).type) and argument->at(i).isOrdered = attribute->at(i).isOrdered and argument->at(i).compatibleWith(attribute->at(i))) A BroadcaseSignalAction may not specify onPort. OCL onPort=null The Signal whose instances are to be sent. CallAction is an abstract class for Actions that invoke a Behavior with given argument values and (if the invocation is synchronous) receive reply values. The number of argument InputPins must be the same as the number of input (in and inout) ownedParameters of the called Behavior or Operation. The type, ordering and multiplicity of each argument InputPin must be consistent with the corresponding input Parameter. OCL let parameter: OrderedSet(Parameter) = self.inputParameters() in argument->size() = parameter->size() and Sequence{1..argument->size()}->forAll(i | argument->at(i).type.conformsTo(parameter->at(i).type) and argument->at(i).isOrdered = parameter->at(i).isOrdered and argument->at(i).compatibleWith(parameter->at(i))) The number of result OutputPins must be the same as the number of output (inout, out and return) ownedParameters of the called Behavior or Operation. The type, ordering and multiplicity of each result OutputPin must be consistent with the corresponding input Parameter. OCL let parameter: OrderedSet(Parameter) = self.outputParameters() in result->size() = parameter->size() and Sequence{1..result->size()}->forAll(i | parameter->at(i).type.conformsTo(result->at(i).type) and parameter->at(i).isOrdered = result->at(i).isOrdered and parameter->at(i).compatibleWith(result->at(i))) Only synchronous CallActions can have result OutputPins. OCL result->notEmpty() implies isSynchronous If true, the call is synchronous and the caller waits for completion of the invoked Behavior. If false, the call is asynchronous and the caller proceeds immediately and cannot receive return values. The OutputPins on which the reply values from the invocation are placed (if the call is synchronous). Return the in and inout ownedParameters of the Behavior or Operation being called. (This operation is abstract and should be overridden by subclasses of CallAction.) Return the inout, out and return ownedParameters of the Behavior or Operation being called. (This operation is abstract and should be overridden by subclasses of CallAction.) A CallBehaviorAction is a CallAction that invokes a Behavior directly. The argument values of the CallBehaviorAction are passed on the input Parameters of the invoked Behavior. If the call is synchronous, the execution of the CallBehaviorAction waits until the execution of the invoked Behavior completes and the values of output Parameters of the Behavior are placed on the result OutputPins. If the call is asynchronous, the CallBehaviorAction completes immediately and no results values can be provided. A CallBehaviorAction may not specify onPort. OCL onPort=null The Behavior being invoked. Return the inout, out and return ownedParameters of the Behavior being called. OCL result = (behavior.outputParameters()) Return the in and inout ownedParameters of the Behavior being called. OCL result = (behavior.inputParameters()) A CallOperationAction is a CallAction that transmits an Operation call request to the target object, where it may cause the invocation of associated Behavior. The argument values of the CallOperationAction are passed on the input Parameters of the Operation. If call is synchronous, the execution of the CallOperationAction waits until the execution of the invoked Operation completes and the values of output Parameters of the Operation are placed on the result OutputPins. If the call is asynchronous, the CallOperationAction completes immediately and no results values can be provided. If onPort has no value, the operation must be an owned or inherited feature of the type of the target InputPin, otherwise the Port given by onPort must be an owned or inherited feature of the type of the target InputPin, and the Port must have a required or provided Interface with the operation as an owned or inherited feature. OCL if onPort=null then target.type.oclAsType(Classifier).allFeatures()->includes(operation) else target.type.oclAsType(Classifier).allFeatures()->includes(onPort) and onPort.provided->union(onPort.required).allFeatures()->includes(operation) endif The Operation being invoked. The InputPin that provides the target object to which the Operation call request is sent. Return the inout, out and return ownedParameters of the Operation being called. OCL result = (operation.outputParameters()) Return the in and inout ownedParameters of the Operation being called. OCL result = (operation.inputParameters()) A Clause is an Element that represents a single branch of a ConditionalNode, including a test and a body section. The body section is executed only if (but not necessarily if) the test section evaluates to true. The bodyOutput Pins are OutputPins on Actions in the body of the Clause. OCL _'body'.oclAsType(Action).allActions().output->includesAll(bodyOutput) The decider Pin must be on an Action in the test section of the Clause and must be of type Boolean with multiplicity 1..1. OCL test.oclAsType(Action).allActions().output->includes(decider) and decider.type = Boolean and decider.is(1,1) The test and body parts of a ConditionalNode must be disjoint with each other. OCL test->intersection(_'body')->isEmpty() The set of ExecutableNodes that are executed if the test evaluates to true and the Clause is chosen over other Clauses within the ConditionalNode that also have tests that evaluate to true. The OutputPins on Actions within the body section whose values are moved to the result OutputPins of the containing ConditionalNode after execution of the body. An OutputPin on an Action in the test section whose Boolean value determines the result of the test. A set of Clauses whose tests must all evaluate to false before this Clause can evaluate its test. A set of Clauses that may not evaluate their tests unless the test for this Clause evaluates to false. The set of ExecutableNodes that are executed in order to provide a test result for the Clause. A ClearAssociationAction is an Action that destroys all links of an Association in which a particular object participates. The multiplicity of the object InputPin is 1..1. OCL object.is(1,1) The type of the InputPin must conform to the type of at least one of the memberEnds of the association. OCL association.memberEnd->exists(self.object.type.conformsTo(type)) The Association to be cleared. The InputPin that gives the object whose participation in the Association is to be cleared. A ClearStructuralFeatureAction is a StructuralFeatureAction that removes all values of a StructuralFeature. The type of the result OutputPin is the same as the type of the inherited object InputPin. OCL result<>null implies result.type = object.type The multiplicity of the result OutputPin must be 1..1. OCL result<>null implies result.is(1,1) The OutputPin on which is put the input object as modified by the ClearStructuralFeatureAction. A ClearVariableAction is a VariableAction that removes all values of a Variable. A ConditionalNode is a StructuredActivityNode that chooses one among some number of alternative collections of ExecutableNodes to execute. The result OutputPins have no incoming edges. OCL result.incoming->isEmpty() A ConditionalNode has no InputPins. OCL input->isEmpty() No ExecutableNode in the ConditionNode may appear in the test or body part of more than one clause of a ConditionalNode. OCL node->select(oclIsKindOf(ExecutableNode)).oclAsType(ExecutableNode)->forAll(n | self.clause->select(test->union(_'body')->includes(n))->size()=1) Each clause of a ConditionalNode must have the same number of bodyOutput pins as the ConditionalNode has result OutputPins, and each clause bodyOutput Pin must be compatible with the corresponding result OutputPin (by positional order) in type, multiplicity, ordering, and uniqueness. OCL clause->forAll( bodyOutput->size()=self.result->size() and Sequence{1..self.result->size()}->forAll(i | bodyOutput->at(i).type.conformsTo(result->at(i).type) and bodyOutput->at(i).isOrdered = result->at(i).isOrdered and bodyOutput->at(i).isUnique = result->at(i).isUnique and bodyOutput->at(i).compatibleWith(result->at(i)))) The union of the ExecutableNodes in the test and body parts of all clauses must be the same as the subset of nodes contained in the ConditionalNode (considered as a StructuredActivityNode) that are ExecutableNodes. OCL clause.test->union(clause._'body') = node->select(oclIsKindOf(ExecutableNode)).oclAsType(ExecutableNode) No two clauses within a ConditionalNode may be predecessorClauses of each other, either directly or indirectly. OCL clause->closure(predecessorClause)->intersection(clause)->isEmpty() The set of Clauses composing the ConditionalNode. If true, the modeler asserts that the test for at least one Clause of the ConditionalNode will succeed. If true, the modeler asserts that the test for at most one Clause of the ConditionalNode will succeed. The OutputPins that onto which are moved values from the bodyOutputs of the Clause selected for execution. Return only this ConditionalNode. This prevents Actions within the ConditionalNode from having their OutputPins used as bodyOutputs or decider Pins in containing LoopNodes or ConditionalNodes. OCL result = (self->asSet()) A CreateLinkAction is a WriteLinkAction for creating links. The Association cannot be an abstract Classifier. OCL not self.association().isAbstract The LinkEndData that specifies the values to be placed on the Association ends for the new link. A CreateLinkObjectAction is a CreateLinkAction for creating link objects (AssociationClasse instances). The multiplicity of the OutputPin is 1..1. OCL result.is(1,1) The type of the result OutputPin must be the same as the Association of the CreateLinkObjectAction. OCL result.type = association() The Association must be an AssociationClass. OCL self.association().oclIsKindOf(AssociationClass) The output pin on which the newly created link object is placed. A CreateObjectAction is an Action that creates an instance of the specified Classifier. The classifier cannot be abstract. OCL not classifier.isAbstract The multiplicity of the result OutputPin is 1..1. OCL result.is(1,1) The classifier cannot be an AssociationClass. OCL not classifier.oclIsKindOf(AssociationClass) The type of the result OutputPin must be the same as the classifier of the CreateObjectAction. OCL result.type = classifier The Classifier to be instantiated. The OutputPin on which the newly created object is placed. A DestroyLinkAction is a WriteLinkAction that destroys links (including link objects). The LinkEndData that the values of the Association ends for the links to be destroyed. A DestroyObjectAction is an Action that destroys objects. The multiplicity of the targe IinputPin is 1..1. OCL target.is(1,1) The target InputPin has no type. OCL target.type= null Specifies whether links in which the object participates are destroyed along with the object. Specifies whether objects owned by the object (via composition) are destroyed along with the object. The InputPin providing the object to be destroyed. An ExpansionNode is an ObjectNode used to indicate a collection input or output for an ExpansionRegion. A collection input of an ExpansionRegion contains a collection that is broken into its individual elements inside the region, whose content is executed once per element. A collection output of an ExpansionRegion combines individual elements produced by the execution of the region into a collection for use outside the region. One of regionAsInput or regionAsOutput must be non-empty, but not both. OCL regionAsInput->notEmpty() xor regionAsOutput->notEmpty() The ExpansionRegion for which the ExpansionNode is an input. The ExpansionRegion for which the ExpansionNode is an output. An ExpansionRegion is a StructuredActivityNode that executes its content multiple times corresponding to elements of input collection(s). The ExpansionNodes that hold the input collections for the ExpansionRegion. The mode in which the ExpansionRegion executes its contents. If parallel, executions are concurrent. If iterative, executions are sequential. If stream, a stream of values flows into a single execution. The ExpansionNodes that form the output collections of the ExpansionRegion. An InputPin is a Pin that holds input values to be consumed by an Action. An InputPin may have outgoing ActivityEdges only when it is owned by a StructuredActivityNode, and these edges must target a node contained (directly or indirectly) in the owning StructuredActivityNode. OCL outgoing->notEmpty() implies action<>null and action.oclIsKindOf(StructuredActivityNode) and action.oclAsType(StructuredActivityNode).allOwnedNodes()->includesAll(outgoing.target) InvocationAction is an abstract class for the various actions that request Behavior invocation. The InputPins that provide the argument values passed in the invocation request. For CallOperationActions, SendSignalActions, and SendObjectActions, an optional Port of the target object through which the invocation request is sent. LinkAction is an abstract class for all Actions that identify the links to be acted on using LinkEndData. The inputValue InputPins is the same as the union of all the InputPins referenced by the endData. OCL inputValue->asBag()=endData.allPins() The ends of the endData must all be from the same Association and include all and only the memberEnds of that association. OCL endData.end = self.association().memberEnd->asBag() The ends of the endData must not be static. OCL endData->forAll(not end.isStatic) The LinkEndData identifying the values on the ends of the links acting on by this LinkAction. InputPins used by the LinkEndData of the LinkAction. Returns the Association acted on by this LinkAction. OCL result = (endData->asSequence()->first().end.association) LinkEndCreationData is LinkEndData used to provide values for one end of a link to be created by a CreateLinkAction. LinkEndCreationData for ordered Association ends must have a single insertAt InputPin for the insertion point with type UnlimitedNatural and multiplicity of 1..1, if isReplaceAll=false, and must have no InputPin for the insertion point when the association ends are unordered. OCL if not end.isOrdered then insertAt = null else not isReplaceAll=false implies insertAt <> null and insertAt->forAll(type=UnlimitedNatural and is(1,1)) endif For ordered Association ends, the InputPin that provides the position where the new link should be inserted or where an existing link should be moved to. The type of the insertAt InputPin is UnlimitedNatural, but the input cannot be zero. It is omitted for Association ends that are not ordered. Specifies whether the existing links emanating from the object on this end should be destroyed before creating a new link. Adds the insertAt InputPin (if any) to the set of all Pins. OCL result = (self.LinkEndData::allPins()->including(insertAt)) LinkEndData is an Element that identifies on end of a link to be read or written by a LinkAction. As a link (that is not a link object) cannot be passed as a runtime value to or from an Action, it is instead identified by its end objects and qualifier values, if any. A LinkEndData instance provides these values for a single Association end. The type of the value InputPin conforms to the type of the Association end. OCL value<>null implies value.type.conformsTo(end.type) The multiplicity of the value InputPin must be 1..1. OCL value<>null implies value.is(1,1) The value InputPin is not also the qualifier value InputPin. OCL value->excludesAll(qualifier.value) The Property must be an Association memberEnd. OCL end.association <> null The qualifiers must be qualifiers of the Association end. OCL end.qualifier->includesAll(qualifier.qualifier) The Association end for which this LinkEndData specifies values. A set of QualifierValues used to provide values for the qualifiers of the end. The InputPin that provides the specified value for the given end. This InputPin is omitted if the LinkEndData specifies the "open" end for a ReadLinkAction. Returns all the InputPins referenced by this LinkEndData. By default this includes the value and qualifier InputPins, but subclasses may override the operation to add other InputPins. OCL result = (value->asBag()->union(qualifier.value)) LinkEndDestructionData is LinkEndData used to provide values for one end of a link to be destroyed by a DestroyLinkAction. LinkEndDestructionData for ordered, nonunique Association ends must have a single destroyAt InputPin if isDestroyDuplicates is false, which must be of type UnlimitedNatural and have a multiplicity of 1..1. Otherwise, the action has no destroyAt input pin. OCL if not end.isOrdered or end.isUnique or isDestroyDuplicates then destroyAt = null else destroyAt <> null and destroyAt->forAll(type=UnlimitedNatural and is(1,1)) endif The InputPin that provides the position of an existing link to be destroyed in an ordered, nonunique Association end. The type of the destroyAt InputPin is UnlimitedNatural, but the value cannot be zero or unlimited. Specifies whether to destroy duplicates of the value in nonunique Association ends. Adds the destroyAt InputPin (if any) to the set of all Pins. OCL result = (self.LinkEndData::allPins()->including(destroyAt)) A LoopNode is a StructuredActivityNode that represents an iterative loop with setup, test, and body sections. The result OutputPins have no incoming edges. OCL result.incoming->isEmpty() The loopVariableInputs must not have outgoing edges. OCL loopVariableInput.outgoing->isEmpty() The union of the ExecutableNodes in the setupPart, test and bodyPart of a LoopNode must be the same as the subset of nodes contained in the LoopNode (considered as a StructuredActivityNode) that are ExecutableNodes. OCL setupPart->union(test)->union(bodyPart)=node->select(oclIsKindOf(ExecutableNode)).oclAsType(ExecutableNode)->asSet() The bodyOutput pins are OutputPins on Actions in the body of the LoopNode. OCL bodyPart.oclAsType(Action).allActions().output->includesAll(bodyOutput) The test and body parts of a ConditionalNode must be disjoint with each other. OCL setupPart->intersection(test)->isEmpty() and setupPart->intersection(bodyPart)->isEmpty() and test->intersection(bodyPart)->isEmpty() A LoopNode must have the same number of bodyOutput Pins as loopVariables, and each bodyOutput Pin must be compatible with the corresponding loopVariable (by positional order) in type, multiplicity, ordering and uniqueness. OCL bodyOutput->size()=loopVariable->size() and Sequence{1..loopVariable->size()}->forAll(i | bodyOutput->at(i).type.conformsTo(loopVariable->at(i).type) and bodyOutput->at(i).isOrdered = loopVariable->at(i).isOrdered and bodyOutput->at(i).isUnique = loopVariable->at(i).isUnique and loopVariable->at(i).includesMultiplicity(bodyOutput->at(i))) A LoopNode must have the same number of loopVariableInputs and loopVariables, and they must match in type, uniqueness and multiplicity. OCL loopVariableInput->size()=loopVariable->size() and loopVariableInput.type=loopVariable.type and loopVariableInput.isUnique=loopVariable.isUnique and loopVariableInput.lower=loopVariable.lower and loopVariableInput.upper=loopVariable.upper A LoopNode must have the same number of result OutputPins and loopVariables, and they must match in type, uniqueness and multiplicity. OCL result->size()=loopVariable->size() and result.type=loopVariable.type and result.isUnique=loopVariable.isUnique and result.lower=loopVariable.lower and result.upper=loopVariable.upper All ActivityEdges outgoing from loopVariable OutputPins must have targets within the LoopNode. OCL allOwnedNodes()->includesAll(loopVariable.outgoing.target) The OutputPins on Actions within the bodyPart, the values of which are moved to the loopVariable OutputPins after the completion of each execution of the bodyPart, before the next iteration of the loop begins or before the loop exits. The set of ExecutableNodes that perform the repetitive computations of the loop. The bodyPart is executed as long as the test section produces a true value. An OutputPin on an Action in the test section whose Boolean value determines whether to continue executing the loop bodyPart. If true, the test is performed before the first execution of the bodyPart. If false, the bodyPart is executed once before the test is performed. A list of OutputPins that hold the values of the loop variables during an execution of the loop. When the test fails, the values are moved to the result OutputPins of the loop. A list of InputPins whose values are moved into the loopVariable Pins before the first iteration of the loop. A list of OutputPins that receive the loopVariable values after the last iteration of the loop and constitute the output of the LoopNode. The set of ExecutableNodes executed before the first iteration of the loop, in order to initialize values or perform other setup computations. The set of ExecutableNodes executed in order to provide the test result for the loop. Return only this LoopNode. This prevents Actions within the LoopNode from having their OutputPins used as bodyOutputs or decider Pins in containing LoopNodes or ConditionalNodes. OCL result = (self->asSet()) Return the loopVariable OutputPins in addition to other source nodes for the LoopNode as a StructuredActivityNode. OCL result = (self.StructuredActivityNode::sourceNodes()->union(loopVariable)) An OpaqueAction is an Action whose functionality is not specified within UML. If the language attribute is not empty, then the size of the body and language lists must be the same. OCL language->notEmpty() implies (_'body'->size() = language->size()) Provides a textual specification of the functionality of the Action, in one or more languages other than UML. The InputPins providing inputs to the OpaqueAction. If provided, a specification of the language used for each of the body Strings. The OutputPins on which the OpaqueAction provides outputs. An OutputPin is a Pin that holds output values produced by an Action. An OutputPin may have incoming ActivityEdges only when it is owned by a StructuredActivityNode, and these edges must have sources contained (directly or indirectly) in the owning StructuredActivityNode. OCL incoming->notEmpty() implies action<>null and action.oclIsKindOf(StructuredActivityNode) and action.oclAsType(StructuredActivityNode).allOwnedNodes()->includesAll(incoming.source) A Pin is an ObjectNode and MultiplicityElement that provides input values to an Action or accepts output values from an Action. A control Pin has a control type. OCL isControl implies isControlType Pin multiplicity is not unique. OCL not isUnique Indicates whether the Pin provides data to the Action or just controls how the Action executes. A QualifierValue is an Element that is used as part of LinkEndData to provide the value for a single qualifier of the end given by the LinkEndData. The multiplicity of the value InputPin is 1..1. OCL value.is(1,1) The type of the value InputPin conforms to the type of the qualifier Property. OCL value.type.conformsTo(qualifier.type) The qualifier must be a qualifier of the Association end of the linkEndData that owns this QualifierValue. OCL linkEndData.end.qualifier->includes(qualifier) The qualifier Property for which the value is to be specified. The InputPin from which the specified value for the qualifier is taken. A RaiseExceptionAction is an Action that causes an exception to occur. The input value becomes the exception object. An InputPin whose value becomes the exception object. A ReadExtentAction is an Action that retrieves the current instances of a Classifier. The type of the result OutputPin is the classifier. OCL result.type = classifier The multiplicity of the result OutputPin is 0..*. OCL result.is(0,*) The Classifier whose instances are to be retrieved. The OutputPin on which the Classifier instances are placed. A ReadIsClassifiedObjectAction is an Action that determines whether an object is classified by a given Classifier. The object InputPin has no type. OCL object.type = null The multiplicity of the result OutputPin is 1..1. OCL result.is(1,1) The type of the result OutputPin is Boolean. OCL result.type = Boolean The multiplicity of the object InputPin is 1..1. OCL object.is(1,1) The Classifier against which the classification of the input object is tested. Indicates whether the input object must be directly classified by the given Classifier or whether it may also be an instance of a specialization of the given Classifier. The InputPin that holds the object whose classification is to be tested. The OutputPin that holds the Boolean result of the test. A ReadLinkAction is a LinkAction that navigates across an Association to retrieve the objects on one end. The type and ordering of the result OutputPin are same as the type and ordering of the open Association end. OCL self.openEnd()->forAll(type=result.type and isOrdered=result.isOrdered) The multiplicity of the open Association end must be compatible with the multiplicity of the result OutputPin. OCL self.openEnd()->first().compatibleWith(result) Visibility of the open end must allow access from the object performing the action. OCL let openEnd : Property = self.openEnd()->first() in openEnd.visibility = VisibilityKind::public or endData->exists(oed | oed.end<>openEnd and (_'context' = oed.end.type or (openEnd.visibility = VisibilityKind::protected and _'context'.conformsTo(oed.end.type.oclAsType(Classifier))))) Exactly one linkEndData specification (corresponding to the "open" end) must not have an value InputPin. OCL self.openEnd()->size() = 1 The open end must be navigable. OCL self.openEnd()->first().isNavigable() The OutputPin on which the objects retrieved from the "open" end of those links whose values on other ends are given by the endData. Returns the ends corresponding to endData with no value InputPin. (A well-formed ReadLinkAction is constrained to have only one of these.) OCL result = (endData->select(value=null).end->asOrderedSet()) A ReadLinkObjectEndAction is an Action that retrieves an end object from a link object. The end Property must be an Association memberEnd. OCL end.association <> null The multiplicity of the object InputPin is 1..1. OCL object.is(1,1) The ends of the association must not be static. OCL end.association.memberEnd->forAll(e | not e.isStatic) The type of the result OutputPin is the same as the type of the end Property. OCL result.type = end.type The multiplicity of the result OutputPin is 1..1. OCL result.is(1,1) The type of the object InputPin is the AssociationClass that owns the end Property. OCL object.type = end.association The association of the end must be an AssociationClass. OCL end.association.oclIsKindOf(AssociationClass) The Association end to be read. The input pin from which the link object is obtained. The OutputPin where the result value is placed. A ReadLinkObjectEndQualifierAction is an Action that retrieves a qualifier end value from a link object. The multiplicity of the object InputPin is 1..1. OCL object.is(1,1) The type of the object InputPin is the AssociationClass that owns the Association end that has the given qualifier Property. OCL object.type = qualifier.associationEnd.association The multiplicity of the qualifier Property is 1..1. OCL qualifier.is(1,1) The ends of the Association must not be static. OCL qualifier.associationEnd.association.memberEnd->forAll(e | not e.isStatic) The multiplicity of the result OutputPin is 1..1. OCL result.is(1,1) The type of the result OutputPin is the same as the type of the qualifier Property. OCL result.type = qualifier.type The association of the Association end of the qualifier Property must be an AssociationClass. OCL qualifier.associationEnd.association.oclIsKindOf(AssociationClass) The qualifier Property must be a qualifier of an Association end. OCL qualifier.associationEnd <> null The InputPin from which the link object is obtained. The qualifier Property to be read. The OutputPin where the result value is placed. A ReadSelfAction is an Action that retrieves the context object of the Behavior execution within which the ReadSelfAction execution is taking place. A ReadSelfAction must have a context Classifier. OCL _'context' <> null The multiplicity of the result OutputPin is 1..1. OCL result.is(1,1) If the ReadSelfAction is contained in an Behavior that is acting as a method, then the Operation of the method must not be static. OCL let behavior: Behavior = self.containingBehavior() in behavior.specification<>null implies not behavior.specification.isStatic The type of the result OutputPin is the context Classifier. OCL result.type = _'context' The OutputPin on which the context object is placed. A ReadStructuralFeatureAction is a StructuralFeatureAction that retrieves the values of a StructuralFeature. The multiplicity of the StructuralFeature must be compatible with the multiplicity of the result OutputPin. OCL structuralFeature.compatibleWith(result) The type and ordering of the result OutputPin are the same as the type and ordering of the StructuralFeature. OCL result.type =structuralFeature.type and result.isOrdered = structuralFeature.isOrdered The OutputPin on which the result values are placed. A ReadVariableAction is a VariableAction that retrieves the values of a Variable. The type and ordering of the result OutputPin are the same as the type and ordering of the variable. OCL result.type =variable.type and result.isOrdered = variable.isOrdered The multiplicity of the variable must be compatible with the multiplicity of the output pin. OCL variable.compatibleWith(result) The OutputPin on which the result values are placed. A ReclassifyObjectAction is an Action that changes the Classifiers that classify an object. The object InputPin has no type. OCL object.type = null None of the newClassifiers may be abstract. OCL not newClassifier->exists(isAbstract) The multiplicity of the object InputPin is 1..1. OCL object.is(1,1) Specifies whether existing Classifiers should be removed before adding the new Classifiers. A set of Classifiers to be added to the Classifiers of the given object. The InputPin that holds the object to be reclassified. A set of Classifiers to be removed from the Classifiers of the given object. A ReduceAction is an Action that reduces a collection to a single value by repeatedly combining the elements of the collection using a reducer Behavior. The reducer Behavior must have two input ownedParameters and one output ownedParameter, where the type of the output Parameter and the type of elements of the input collection conform to the types of the input Parameters. OCL let inputs: OrderedSet(Parameter) = reducer.inputParameters() in let outputs: OrderedSet(Parameter) = reducer.outputParameters() in inputs->size()=2 and outputs->size()=1 and inputs.type->forAll(t | outputs.type->forAll(conformsTo(t)) and -- Note that the following only checks the case when the collection is via multiple tokens. collection.upperBound()>1 implies collection.type.conformsTo(t)) The type of the collection InputPin must be a collection. The type of the output of the reducer Behavior must conform to the type of the result OutputPin. OCL reducer.outputParameters().type->forAll(conformsTo(result.type)) The InputPin that provides the collection to be reduced. Indicates whether the order of the input collection should determine the order in which the reducer Behavior is applied to its elements. A Behavior that is repreatedly applied to two elements of the input collection to produce a value that is of the same type as elements of the collection. The output pin on which the result value is placed. A RemoveStructuralFeatureValueAction is a WriteStructuralFeatureAction that removes values from a StructuralFeature. RemoveStructuralFeatureValueActions removing a value from ordered, non-unique StructuralFeatures must have a single removeAt InputPin and no value InputPin, if isRemoveDuplicates is false. The removeAt InputPin must be of type Unlimited Natural with multiplicity 1..1. Otherwise, the Action has a value InputPin and no removeAt InputPin. OCL if structuralFeature.isOrdered and not structuralFeature.isUnique and not isRemoveDuplicates then value = null and removeAt <> null and removeAt.type = UnlimitedNatural and removeAt.is(1,1) else removeAt = null and value <> null endif Specifies whether to remove duplicates of the value in nonunique StructuralFeatures. An InputPin that provides the position of an existing value to remove in ordered, nonunique structural features. The type of the removeAt InputPin is UnlimitedNatural, but the value cannot be zero or unlimited. A RemoveVariableValueAction is a WriteVariableAction that removes values from a Variables. ReadVariableActions removing a value from ordered, non-unique Variables must have a single removeAt InputPin and no value InputPin, if isRemoveDuplicates is false. The removeAt InputPin must be of type Unlimited Natural with multiplicity 1..1. Otherwise, the Action has a value InputPin and no removeAt InputPin. OCL if variable.isOrdered and not variable.isUnique and not isRemoveDuplicates then value = null and removeAt <> null and removeAt.type = UnlimitedNatural and removeAt.is(1,1) else removeAt = null and value <> null endif Specifies whether to remove duplicates of the value in nonunique Variables. An InputPin that provides the position of an existing value to remove in ordered, nonunique Variables. The type of the removeAt InputPin is UnlimitedNatural, but the value cannot be zero or unlimited. A ReplyAction is an Action that accepts a set of reply values and a value containing return information produced by a previous AcceptCallAction. The ReplyAction returns the values to the caller of the previous call, completing execution of the call. The replyValue InputPins must match the output (return, out, and inout) parameters of the operation of the event of the replyToCall Trigger in number, type, ordering, and multiplicity. OCL let parameter:OrderedSet(Parameter) = replyToCall.event.oclAsType(CallEvent).operation.outputParameters() in replyValue->size()=parameter->size() and Sequence{1..replyValue->size()}->forAll(i | replyValue->at(i).type.conformsTo(parameter->at(i).type) and replyValue->at(i).isOrdered=parameter->at(i).isOrdered and replyValue->at(i).compatibleWith(parameter->at(i))) The event of the replyToCall Trigger must be a CallEvent. OCL replyToCall.event.oclIsKindOf(CallEvent) The Trigger specifying the Operation whose call is being replied to. A list of InputPins providing the values for the output (inout, out, and return) Parameters of the Operation. These values are returned to the caller. An InputPin that holds the return information value produced by an earlier AcceptCallAction. A SendObjectAction is an InvocationAction that transmits an input object to the target object, which is handled as a request message by the target object. The requestor continues execution immediately after the object is sent out and cannot receive reply values. If onPort is not empty, the Port given by onPort must be an owned or inherited feature of the type of the target InputPin. OCL onPort<>null implies target.type.oclAsType(Classifier).allFeatures()->includes(onPort) The request object, which is transmitted to the target object. The object may be copied in transmission, so identity might not be preserved. The target object to which the object is sent. A SendSignalAction is an InvocationAction that creates a Signal instance and transmits it to the target object. Values from the argument InputPins are used to provide values for the attributes of the Signal. The requestor continues execution immediately after the Signal instance is sent out and cannot receive reply values. The type, ordering, and multiplicity of an argument InputPin must be the same as the corresponding attribute of the signal. OCL let attribute: OrderedSet(Property) = signal.allAttributes() in Sequence{1..argument->size()}->forAll(i | argument->at(i).type.conformsTo(attribute->at(i).type) and argument->at(i).isOrdered = attribute->at(i).isOrdered and argument->at(i).compatibleWith(attribute->at(i))) The number and order of argument InputPins must be the same as the number and order of attributes of the signal. OCL argument->size()=signal.allAttributes()->size() If onPort is not empty, the Port given by onPort must be an owned or inherited feature of the type of the target InputPin. OCL not onPort->isEmpty() implies target.type.oclAsType(Classifier).allFeatures()->includes(onPort) The Signal whose instance is transmitted to the target. The InputPin that provides the target object to which the Signal instance is sent. A SequenceNode is a StructuredActivityNode that executes a sequence of ExecutableNodes in order. The ordered set of ExecutableNodes to be sequenced. A StartClassifierBehaviorAction is an Action that starts the classifierBehavior of the input object. The multiplicity of the object InputPin is 1..1 OCL object.is(1,1) If the InputPin has a type, then the type or one of its ancestors must have a classifierBehavior. OCL object.type->notEmpty() implies (object.type.oclIsKindOf(BehavioredClassifier) and object.type.oclAsType(BehavioredClassifier).classifierBehavior<>null) The InputPin that holds the object whose classifierBehavior is to be started. A StartObjectBehaviorAction is an InvocationAction that starts the execution either of a directly instantiated Behavior or of the classifierBehavior of an object. Argument values may be supplied for the input Parameters of the Behavior. If the Behavior is invoked synchronously, then output values may be obtained for output Parameters. The multiplicity of the object InputPin must be 1..1. OCL object.is(1,1) The type of the object InputPin must be either a Behavior or a BehavioredClassifier with a classifierBehavior. OCL self.behavior()<>null A StartObjectBehaviorAction may not specify onPort. OCL onPort->isEmpty() An InputPin that holds the object that is either a Behavior to be started or has a classifierBehavior to be started. Return the inout, out and return ownedParameters of the Behavior being called. OCL result = (self.behavior().outputParameters()) Return the in and inout ownedParameters of the Behavior being called. OCL result = (self.behavior().inputParameters()) If the type of the object InputPin is a Behavior, then that Behavior. Otherwise, if the type of the object InputPin is a BehavioredClassifier, then the classifierBehavior of that BehavioredClassifier. OCL result = (if object.type.oclIsKindOf(Behavior) then object.type.oclAsType(Behavior) else if object.type.oclIsKindOf(BehavioredClassifier) then object.type.oclAsType(BehavioredClassifier).classifierBehavior else null endif endif) StructuralFeatureAction is an abstract class for all Actions that operate on StructuralFeatures. The multiplicity of the object InputPin must be 1..1. OCL object.is(1,1) The structuralFeature must either be an owned or inherited feature of the type of the object InputPin, or it must be an owned end of a binary Association whose opposite end had as a type to which the type of the object InputPin conforms. OCL object.type.oclAsType(Classifier).allFeatures()->includes(structuralFeature) or object.type.conformsTo(structuralFeature.oclAsType(Property).opposite.type) The visibility of the structuralFeature must allow access from the object performing the ReadStructuralFeatureAction. OCL structuralFeature.visibility = VisibilityKind::public or _'context'.allFeatures()->includes(structuralFeature) or structuralFeature.visibility=VisibilityKind::protected and _'context'.conformsTo(structuralFeature.oclAsType(Property).opposite.type.oclAsType(Classifier)) The structuralFeature must not be static. OCL not structuralFeature.isStatic The structuralFeature must have exactly one featuringClassifier. OCL structuralFeature.featuringClassifier->size() = 1 The InputPin from which the object whose StructuralFeature is to be read or written is obtained. The StructuralFeature to be read or written. A StructuredActivityNode is an Action that is also an ActivityGroup and whose behavior is specified by the ActivityNodes and ActivityEdges it so contains. Unlike other kinds of ActivityGroup, a StructuredActivityNode owns the ActivityNodes and ActivityEdges it contains, and so a node or edge can only be directly contained in one StructuredActivityNode, though StructuredActivityNodes may be nested. The outgoing ActivityEdges of the OutputPins of a StructuredActivityNode must have targets that are not within the StructuredActivityNode. OCL output.outgoing.target->excludesAll(allOwnedNodes()-input) The edges of a StructuredActivityNode are all the ActivityEdges with source and target ActivityNodes contained directly or indirectly within the StructuredActivityNode and at least one of the source or target not contained in any more deeply nested StructuredActivityNode. OCL edge=self.sourceNodes().outgoing->intersection(self.allOwnedNodes().incoming)-> union(self.targetNodes().incoming->intersection(self.allOwnedNodes().outgoing))->asSet() The incoming ActivityEdges of an InputPin of a StructuredActivityNode must have sources that are not within the StructuredActivityNode. OCL input.incoming.source->excludesAll(allOwnedNodes()-output) The Activity immediately containing the StructuredActivityNode, if it is not contained in another StructuredActivityNode. The ActivityEdges immediately contained in the StructuredActivityNode. If true, then any object used by an Action within the StructuredActivityNode cannot be accessed by any Action outside the node until the StructuredActivityNode as a whole completes. Any concurrent Actions that would result in accessing such objects are required to have their execution deferred until the completion of the StructuredActivityNode. The ActivityNodes immediately contained in the StructuredActivityNode. The InputPins owned by the StructuredActivityNode. The OutputPins owned by the StructuredActivityNode. The Variables defined in the scope of the StructuredActivityNode. Returns this StructuredActivityNode and all Actions contained in it. OCL result = (node->select(oclIsKindOf(Action)).oclAsType(Action).allActions()->including(self)->asSet()) Returns all the ActivityNodes contained directly or indirectly within this StructuredActivityNode, in addition to the Pins of the StructuredActivityNode. OCL result = (self.Action::allOwnedNodes()->union(node)->union(node->select(oclIsKindOf(Action)).oclAsType(Action).allOwnedNodes())->asSet()) Return those ActivityNodes contained immediately within the StructuredActivityNode that may act as sources of edges owned by the StructuredActivityNode. OCL result = (node->union(input.oclAsType(ActivityNode)->asSet())-> union(node->select(oclIsKindOf(Action)).oclAsType(Action).output)->asSet()) Return those ActivityNodes contained immediately within the StructuredActivityNode that may act as targets of edges owned by the StructuredActivityNode. OCL result = (node->union(output.oclAsType(ActivityNode)->asSet())-> union(node->select(oclIsKindOf(Action)).oclAsType(Action).input)->asSet()) The Activity that directly or indirectly contains this StructuredActivityNode (considered as an Action). OCL result = (self.Action::containingActivity()) A TestIdentityAction is an Action that tests if two values are identical objects. The multiplicity of the InputPins is 1..1. OCL first.is(1,1) and second.is(1,1) The InputPins have no type. OCL first.type= null and second.type = null The type of the result OutputPin is Boolean. OCL result.type=Boolean The InputPin on which the first input object is placed. The OutputPin whose Boolean value indicates whether the two input objects are identical. The OutputPin on which the second input object is placed. An UnmarshallAction is an Action that retrieves the values of the StructuralFeatures of an object and places them on OutputPins. The unmarshallType must have at least one StructuralFeature. OCL unmarshallType.allAttributes()->size() >= 1 The number of result outputPins must be the same as the number of attributes of the unmarshallType. OCL unmarshallType.allAttributes()->size() = result->size() The type, ordering and multiplicity of each attribute of the unmarshallType must be compatible with the type, ordering and multiplicity of the corresponding result OutputPin. OCL let attribute:OrderedSet(Property) = unmarshallType.allAttributes() in Sequence{1..result->size()}->forAll(i | attribute->at(i).type.conformsTo(result->at(i).type) and attribute->at(i).isOrdered=result->at(i).isOrdered and attribute->at(i).compatibleWith(result->at(i))) The multiplicity of the object InputPin is 1..1 OCL object.is(1,1) The type of the object InputPin conform to the unmarshallType. OCL object.type.conformsTo(unmarshallType) The InputPin that gives the object to be unmarshalled. The OutputPins on which are placed the values of the StructuralFeatures of the input object. The type of the object to be unmarshalled. A ValuePin is an InputPin that provides a value by evaluating a ValueSpecification. A ValuePin may have no incoming ActivityEdges. OCL incoming->isEmpty() The type of the value ValueSpecification must conform to the type of the ValuePin. OCL value.type.conformsTo(type) The ValueSpecification that is evaluated to obtain the value that the ValuePin will provide. An Activity is the specification of parameterized Behavior as the coordinated sequencing of subordinate units. A Parameter with direction other than inout must have exactly one ActivityParameterNode in an Activity. OCL ownedParameter->forAll(p | p.direction <> ParameterDirectionKind::inout implies node->select( oclIsKindOf(ActivityParameterNode) and oclAsType(ActivityParameterNode).parameter = p)->size()= 1) A Parameter with direction inout must have exactly two ActivityParameterNodes in an Activity, at most one with incoming ActivityEdges and at most one with outgoing ActivityEdges. OCL ownedParameter->forAll(p | p.direction = ParameterDirectionKind::inout implies let associatedNodes : Set(ActivityNode) = node->select( oclIsKindOf(ActivityParameterNode) and oclAsType(ActivityParameterNode).parameter = p) in associatedNodes->size()=2 and associatedNodes->select(incoming->notEmpty())->size()<=1 and associatedNodes->select(outgoing->notEmpty())->size()<=1 ) ActivityEdges expressing flow between the nodes of the Activity. Top-level ActivityGroups in the Activity. If true, this Activity must not make any changes to objects. The default is false (an Activity may make nonlocal changes). (This is an assertion, not an executable property. It may be used by an execution engine to optimize model execution. If the assertion is violated by the Activity, then the model is ill-formed.) If true, all invocations of the Activity are handled by the same execution. ActivityNodes coordinated by the Activity. Top-level ActivityPartitions in the Activity. Top-level StructuredActivityNodes in the Activity. Top-level Variables defined by the Activity. An ActivityEdge is an abstract class for directed connections between two ActivityNodes. If an ActivityEdge is directly owned by an Activity, then its source and target must be directly or indirectly contained in the same Activity. OCL activity<>null implies source.containingActivity() = activity and target.containingActivity() = activity The Activity containing the ActivityEdge, if it is directly owned by an Activity. A ValueSpecification that is evaluated to determine if a token can traverse the ActivityEdge. If an ActivityEdge has no guard, then there is no restriction on tokens traversing the edge. ActivityGroups containing the ActivityEdge. ActivityPartitions containing the ActivityEdge. The StructuredActivityNode containing the ActivityEdge, if it is owned by a StructuredActivityNode. The InterruptibleActivityRegion for which this ActivityEdge is an interruptingEdge. ActivityEdges from a generalization of the Activity containing this ActivityEdge that are redefined by this ActivityEdge. The ActivityNode from which tokens are taken when they traverse the ActivityEdge. The ActivityNode to which tokens are put when they traverse the ActivityEdge. The minimum number of tokens that must traverse the ActivityEdge at the same time. If no weight is specified, this is equivalent to specifying a constant value of 1. OCL result = (redefiningElement.oclIsKindOf(ActivityEdge)) An ActivityFinalNode is a FinalNode that terminates the execution of its owning Activity or StructuredActivityNode. ActivityGroup is an abstract class for defining sets of ActivityNodes and ActivityEdges in an Activity. All containedNodes and containeEdges of an ActivityGroup must be in the same Activity as the group. OCL containedNode->forAll(activity = self.containingActivity()) and containedEdge->forAll(activity = self.containingActivity()) No containedNode or containedEdge of an ActivityGroup may be contained by its subgroups or its superGroups, transitively. OCL subgroup->closure(subgroup).containedNode->excludesAll(containedNode) and superGroup->closure(superGroup).containedNode->excludesAll(containedNode) and subgroup->closure(subgroup).containedEdge->excludesAll(containedEdge) and superGroup->closure(superGroup).containedEdge->excludesAll(containedEdge) ActivityEdges immediately contained in the ActivityGroup. ActivityNodes immediately contained in the ActivityGroup. The Activity containing the ActivityGroup, if it is directly owned by an Activity. Other ActivityGroups immediately contained in this ActivityGroup. The ActivityGroup immediately containing this ActivityGroup, if it is directly owned by another ActivityGroup. The Activity that directly or indirectly contains this ActivityGroup. OCL result = (if superGroup<>null then superGroup.containingActivity() else inActivity endif) ActivityNode is an abstract class for points in the flow of an Activity connected by ActivityEdges. The Activity containing the ActivityNode, if it is directly owned by an Activity. ActivityGroups containing the ActivityNode. InterruptibleActivityRegions containing the ActivityNode. ActivityPartitions containing the ActivityNode. The StructuredActivityNode containing the ActvityNode, if it is directly owned by a StructuredActivityNode. ActivityEdges that have the ActivityNode as their target. ActivityEdges that have the ActivityNode as their source. ActivityNodes from a generalization of the Activity containining this ActivityNode that are redefined by this ActivityNode. The Activity that directly or indirectly contains this ActivityNode. OCL result = (if inStructuredNode<>null then inStructuredNode.containingActivity() else activity endif) OCL result = (redefiningElement.oclIsKindOf(ActivityNode)) An ActivityParameterNode is an ObjectNode for accepting values from the input Parameters or providing values to the output Parameters of an Activity. An ActivityParameterNode with no outgoing ActivityEdges and one or more incoming ActivityEdges must have a parameter with direction out, inout, or return. OCL (incoming->notEmpty() and outgoing->isEmpty()) implies (parameter.direction = ParameterDirectionKind::out or parameter.direction = ParameterDirectionKind::inout or parameter.direction = ParameterDirectionKind::return) The parameter of an ActivityParameterNode must be from the containing Activity. OCL activity.ownedParameter->includes(parameter) The type of an ActivityParameterNode is the same as the type of its parameter. OCL type = parameter.type An ActivityParameterNode with no incoming ActivityEdges and one or more outgoing ActivityEdges must have a parameter with direction in or inout. OCL (outgoing->notEmpty() and incoming->isEmpty()) implies (parameter.direction = ParameterDirectionKind::_'in' or parameter.direction = ParameterDirectionKind::inout) An ActivityParameterNode may have all incoming ActivityEdges or all outgoing ActivityEdges, but it must not have both incoming and outgoing ActivityEdges. OCL incoming->isEmpty() or outgoing->isEmpty() The Parameter for which the ActivityParameterNode will be accepting or providing values. An ActivityPartition is a kind of ActivityGroup for identifying ActivityNodes that have some characteristic in common. If a non-external ActivityPartition represents a Classifier and has a superPartition, then the superPartition must represent a Classifier, and the Classifier of the subpartition must be nested (nestedClassifier or ownedBehavior) in the Classifier represented by the superPartition, or be at the contained end of a composition Association with the Classifier represented by the superPartition. OCL (not isExternal and represents.oclIsKindOf(Classifier) and superPartition->notEmpty()) implies ( let representedClassifier : Classifier = represents.oclAsType(Classifier) in superPartition.represents.oclIsKindOf(Classifier) and let representedSuperClassifier : Classifier = superPartition.represents.oclAsType(Classifier) in (representedSuperClassifier.oclIsKindOf(BehavioredClassifier) and representedClassifier.oclIsKindOf(Behavior) and representedSuperClassifier.oclAsType(BehavioredClassifier).ownedBehavior->includes(representedClassifier.oclAsType(Behavior))) or (representedSuperClassifier.oclIsKindOf(Class) and representedSuperClassifier.oclAsType(Class).nestedClassifier->includes(representedClassifier)) or (Association.allInstances()->exists(a | a.memberEnd->exists(end1 | end1.isComposite and end1.type = representedClassifier and a.memberEnd->exists(end2 | end1<>end2 and end2.type = representedSuperClassifier)))) ) If an ActivityPartition represents a Property and has a superPartition, then the Property must be of a Classifier represented by the superPartition, or of a Classifier that is the type of a Property represented by the superPartition. OCL (represents.oclIsKindOf(Property) and superPartition->notEmpty()) implies ( (superPartition.represents.oclIsKindOf(Classifier) and represents.owner = superPartition.represents) or (superPartition.represents.oclIsKindOf(Property) and represents.owner = superPartition.represents.oclAsType(Property).type) ) If an ActivityPartition represents a Property and has a superPartition representing a Classifier, then all the other non-external subpartitions of the superPartition must represent Properties directly owned by the same Classifier. OCL (represents.oclIsKindOf(Property) and superPartition->notEmpty() and superPartition.represents.oclIsKindOf(Classifier)) implies ( let representedClassifier : Classifier = superPartition.represents.oclAsType(Classifier) in superPartition.subpartition->reject(isExternal)->forAll(p | p.represents.oclIsKindOf(Property) and p.owner=representedClassifier) ) An ActvivityPartition with isDimension = true may not be contained by another ActivityPartition. OCL isDimension implies superPartition->isEmpty() ActivityEdges immediately contained in the ActivityPartition. Indicates whether the ActivityPartition groups other ActivityPartitions along a dimension. Indicates whether the ActivityPartition represents an entity to which the partitioning structure does not apply. ActivityNodes immediately contained in the ActivityPartition. An Element represented by the functionality modeled within the ActivityPartition. Other ActivityPartitions immediately contained in this ActivityPartition (as its subgroups). Other ActivityPartitions immediately containing this ActivityPartition (as its superGroups). A CentralBufferNode is an ObjectNode for managing flows from multiple sources and targets. A ControlFlow is an ActivityEdge traversed by control tokens or object tokens of control type, which are use to control the execution of ExecutableNodes. ControlFlows may not have ObjectNodes at either end, except for ObjectNodes with control type. OCL (source.oclIsKindOf(ObjectNode) implies source.oclAsType(ObjectNode).isControlType) and (target.oclIsKindOf(ObjectNode) implies target.oclAsType(ObjectNode).isControlType) A ControlNode is an abstract ActivityNode that coordinates flows in an Activity. A DataStoreNode is a CentralBufferNode for persistent data. A DecisionNode is a ControlNode that chooses between outgoing ActivityEdges for the routing of tokens. If the DecisionNode has no decisionInputFlow and an incoming ControlFlow, then any decisionInput Behavior has no in parameters. OCL (decisionInput<>null and decisionInputFlow=null and incoming->exists(oclIsKindOf(ControlFlow))) implies decisionInput.inputParameters()->isEmpty() The ActivityEdges incoming to and outgoing from a DecisionNode, other than the decisionInputFlow (if any), must be either all ObjectFlows or all ControlFlows. OCL let allEdges: Set(ActivityEdge) = incoming->union(outgoing) in let allRelevantEdges: Set(ActivityEdge) = if decisionInputFlow->notEmpty() then allEdges->excluding(decisionInputFlow) else allEdges endif in allRelevantEdges->forAll(oclIsKindOf(ControlFlow)) or allRelevantEdges->forAll(oclIsKindOf(ObjectFlow)) The decisionInputFlow of a DecisionNode must be an incoming ActivityEdge of the DecisionNode. OCL incoming->includes(decisionInputFlow) If the DecisionNode has a decisionInputFlow and an second incoming ObjectFlow, then any decisionInput has two in Parameters, the first of which has a type that is the same as or a supertype of the type of object tokens offered on the non-decisionInputFlow and the second of which has a type that is the same as or a supertype of the type of object tokens offered on the decisionInputFlow. OCL (decisionInput<>null and decisionInputFlow<>null and incoming->forAll(oclIsKindOf(ObjectFlow))) implies decisionInput.inputParameters()->size()=2 A DecisionNode has one or two incoming ActivityEdges and at least one outgoing ActivityEdge. OCL (incoming->size() = 1 or incoming->size() = 2) and outgoing->size() > 0 If the DecisionNode has a decisionInputFlow and an incoming ControlFlow, then any decisionInput Behavior has one in Parameter whose type is the same as or a supertype of the type of object tokens offered on the decisionInputFlow. OCL (decisionInput<>null and decisionInputFlow<>null and incoming->exists(oclIsKindOf(ControlFlow))) implies decisionInput.inputParameters()->size()=1 A decisionInput Behavior has no out parameters, no inout parameters, and one return parameter. OCL decisionInput<>null implies (decisionInput.ownedParameter->forAll(par | par.direction <> ParameterDirectionKind::out and par.direction <> ParameterDirectionKind::inout ) and decisionInput.ownedParameter->one(par | par.direction <> ParameterDirectionKind::return)) If the DecisionNode has no decisionInputFlow and an incoming ObjectFlow, then any decisionInput Behavior has one in Parameter whose type is the same as or a supertype of the type of object tokens offered on the incoming ObjectFlow. OCL (decisionInput<>null and decisionInputFlow=null and incoming->forAll(oclIsKindOf(ObjectFlow))) implies decisionInput.inputParameters()->size()=1 A Behavior that is executed to provide an input to guard ValueSpecifications on ActivityEdges outgoing from the DecisionNode. An additional ActivityEdge incoming to the DecisionNode that provides a decision input value for the guards ValueSpecifications on ActivityEdges outgoing from the DecisionNode. An ExceptionHandler is an Element that specifies a handlerBody ExecutableNode to execute in case the specified exception occurs during the execution of the protected ExecutableNode. The handlerBody has no incoming or outgoing ActivityEdges and the exceptionInput has no incoming ActivityEdges. OCL handlerBody.incoming->isEmpty() and handlerBody.outgoing->isEmpty() and exceptionInput.incoming->isEmpty() If the protectedNode is an Action with OutputPins, then the handlerBody must also be an Action with the same number of OutputPins, which are compatible in type, ordering, and multiplicity to those of the protectedNode. OCL (protectedNode.oclIsKindOf(Action) and protectedNode.oclAsType(Action).output->notEmpty()) implies ( handlerBody.oclIsKindOf(Action) and let protectedNodeOutput : OrderedSet(OutputPin) = protectedNode.oclAsType(Action).output, handlerBodyOutput : OrderedSet(OutputPin) = handlerBody.oclAsType(Action).output in protectedNodeOutput->size() = handlerBodyOutput->size() and Sequence{1..protectedNodeOutput->size()}->forAll(i | handlerBodyOutput->at(i).type.conformsTo(protectedNodeOutput->at(i).type) and handlerBodyOutput->at(i).isOrdered=protectedNodeOutput->at(i).isOrdered and handlerBodyOutput->at(i).compatibleWith(protectedNodeOutput->at(i))) ) The handlerBody is an Action with one InputPin, and that InputPin is the same as the exceptionInput. OCL handlerBody.oclIsKindOf(Action) and let inputs: OrderedSet(InputPin) = handlerBody.oclAsType(Action).input in inputs->size()=1 and inputs->first()=exceptionInput An ActivityEdge that has a source within the handlerBody of an ExceptionHandler must have its target in the handlerBody also, and vice versa. OCL let nodes:Set(ActivityNode) = handlerBody.oclAsType(Action).allOwnedNodes() in nodes.outgoing->forAll(nodes->includes(target)) and nodes.incoming->forAll(nodes->includes(source)) The handlerBody must have the same owner as the protectedNode. OCL handlerBody.owner=protectedNode.owner The exceptionInput must either have no type or every exceptionType must conform to the exceptionInput type. OCL exceptionInput.type=null or exceptionType->forAll(conformsTo(exceptionInput.type.oclAsType(Classifier))) An ObjectNode within the handlerBody. When the ExceptionHandler catches an exception, the exception token is placed on this ObjectNode, causing the handlerBody to execute. The Classifiers whose instances the ExceptionHandler catches as exceptions. If an exception occurs whose type is any exceptionType, the ExceptionHandler catches the exception and executes the handlerBody. An ExecutableNode that is executed if the ExceptionHandler catches an exception. The ExecutableNode protected by the ExceptionHandler. If an exception propagates out of the protectedNode and has a type matching one of the exceptionTypes, then it is caught by this ExceptionHandler. An ExecutableNode is an abstract class for ActivityNodes whose execution may be controlled using ControlFlows and to which ExceptionHandlers may be attached. A set of ExceptionHandlers that are examined if an exception propagates out of the ExceptionNode. A FinalNode is an abstract ControlNode at which a flow in an Activity stops. A FinalNode has no outgoing ActivityEdges. OCL outgoing->isEmpty() A FlowFinalNode is a FinalNode that terminates a flow by consuming the tokens offered to it. A ForkNode is a ControlNode that splits a flow into multiple concurrent flows. The ActivityEdges incoming to and outgoing from a ForkNode must be either all ObjectFlows or all ControlFlows. OCL let allEdges : Set(ActivityEdge) = incoming->union(outgoing) in allEdges->forAll(oclIsKindOf(ControlFlow)) or allEdges->forAll(oclIsKindOf(ObjectFlow)) A ForkNode has one incoming ActivityEdge. OCL incoming->size()=1 An InitialNode is a ControlNode that offers a single control token when initially enabled. An InitialNode has no incoming ActivityEdges. OCL incoming->isEmpty() All the outgoing ActivityEdges from an InitialNode must be ControlFlows. OCL outgoing->forAll(oclIsKindOf(ControlFlow)) An InterruptibleActivityRegion is an ActivityGroup that supports the termination of tokens flowing in the portions of an activity within it. The interruptingEdges of an InterruptibleActivityRegion must have their source in the region and their target outside the region, but within the same Activity containing the region. OCL interruptingEdge->forAll(edge | node->includes(edge.source) and node->excludes(edge.target) and edge.target.containingActivity() = inActivity) The ActivityEdges leaving the InterruptibleActivityRegion on which a traversing token will result in the termination of other tokens flowing in the InterruptibleActivityRegion. ActivityNodes immediately contained in the InterruptibleActivityRegion. A JoinNode is a ControlNode that synchronizes multiple flows. A JoinNode has one outgoing ActivityEdge. OCL outgoing->size() = 1 If one of the incoming ActivityEdges of a JoinNode is an ObjectFlow, then its outgoing ActivityEdge must be an ObjectFlow. Otherwise its outgoing ActivityEdge must be a ControlFlow. OCL if incoming->exists(oclIsKindOf(ObjectFlow)) then outgoing->forAll(oclIsKindOf(ObjectFlow)) else outgoing->forAll(oclIsKindOf(ControlFlow)) endif Indicates whether incoming tokens having objects with the same identity are combined into one by the JoinNode. A ValueSpecification giving the condition under which the JoinNode will offer a token on its outgoing ActivityEdge. If no joinSpec is specified, then the JoinNode will offer an outgoing token if tokens are offered on all of its incoming ActivityEdges (an "and" condition). A merge node is a control node that brings together multiple alternate flows. It is not used to synchronize concurrent flows but to accept one among several alternate flows. A MergeNode has one outgoing ActivityEdge. OCL outgoing->size()=1 The ActivityEdges incoming to and outgoing from a MergeNode must be either all ObjectFlows or all ControlFlows. OCL let allEdges : Set(ActivityEdge) = incoming->union(outgoing) in allEdges->forAll(oclIsKindOf(ControlFlow)) or allEdges->forAll(oclIsKindOf(ObjectFlow)) An ObjectFlow is an ActivityEdge that is traversed by object tokens that may hold values. Object flows also support multicast/receive, token selection from object nodes, and transformation of tokens. A selection Behavior has one input Parameter and one output Parameter. The input Parameter must have the same as or a supertype of the type of the source ObjectNode, be non-unique and have multiplicity 0..*. The output Parameter must be the same or a subtype of the type of source ObjectNode. The Behavior cannot have side effects. OCL selection<>null implies selection.inputParameters()->size()=1 and selection.inputParameters()->forAll(not isUnique and is(0,*)) and selection.outputParameters()->size()=1 ObjectFlows may not have ExecutableNodes at either end. OCL not (source.oclIsKindOf(ExecutableNode) or target.oclIsKindOf(ExecutableNode)) A transformation Behavior has one input Parameter and one output Parameter. The input Parameter must be the same as or a supertype of the type of object token coming from the source end. The output Parameter must be the same or a subtype of the type of object token expected downstream. The Behavior cannot have side effects. OCL transformation<>null implies transformation.inputParameters()->size()=1 and transformation.outputParameters()->size()=1 An ObjectFlow may have a selection Behavior only if it has an ObjectNode as its source. OCL selection<>null implies source.oclIsKindOf(ObjectNode) ObjectNodes connected by an ObjectFlow, with optionally intervening ControlNodes, must have compatible types. In particular, the downstream ObjectNode type must be the same or a supertype of the upstream ObjectNode type. ObjectNodes connected by an ObjectFlow, with optionally intervening ControlNodes, must have the same upperBounds. An ObjectFlow with a constant weight may not target an ObjectNode, with optionally intervening ControlNodes, that has an upper bound less than the weight. isMulticast and isMultireceive cannot both be true. OCL not (isMulticast and isMultireceive) Indicates whether the objects in the ObjectFlow are passed by multicasting. Indicates whether the objects in the ObjectFlow are gathered from respondents to multicasting. A Behavior used to select tokens from a source ObjectNode. A Behavior used to change or replace object tokens flowing along the ObjectFlow. An ObjectNode is an abstract ActivityNode that may hold tokens within the object flow in an Activity. ObjectNodes also support token selection, limitation on the number of tokens held, specification of the state required for tokens being held, and carrying control values. A selection Behavior has one input Parameter and one output Parameter. The input Parameter must have the same type as or a supertype of the type of ObjectNode, be non-unique, and have multiplicity 0..*. The output Parameter must be the same or a subtype of the type of ObjectNode. The Behavior cannot have side effects. OCL selection<>null implies selection.inputParameters()->size()=1 and selection.inputParameters()->forAll(p | not p.isUnique and p.is(0,*) and self.type.conformsTo(p.type)) and selection.outputParameters()->size()=1 and selection.inputParameters()->forAll(p | self.type.conformsTo(p.type)) If an ObjectNode has a selection Behavior, then the ordering of the object node is ordered, and vice versa. OCL (selection<>null) = (ordering=ObjectNodeOrderingKind::ordered) If isControlType=false, the ActivityEdges incoming to or outgoing from an ObjectNode must all be ObjectFlows. OCL (not isControlType) implies incoming->union(outgoing)->forAll(oclIsKindOf(ObjectFlow)) The States required to be associated with the values held by tokens on this ObjectNode. Indicates whether the type of the ObjectNode is to be treated as representing control values that may traverse ControlFlows. Indicates how the tokens held by the ObjectNode are ordered for selection to traverse ActivityEdges outgoing from the ObjectNode. A Behavior used to select tokens to be offered on outgoing ActivityEdges. The maximum number of tokens that may be held by this ObjectNode. Tokens cannot flow into the ObjectNode if the upperBound is reached. If no upperBound is specified, then there is no limit on how many tokens the ObjectNode can hold. A Variable is a ConnectableElement that may store values during the execution of an Activity. Reading and writing the values of a Variable provides an alternative means for passing data than the use of ObjectFlows. A Variable may be owned directly by an Activity, in which case it is accessible from anywhere within that activity, or it may be owned by a StructuredActivityNode, in which case it is only accessible within that node. An Activity that owns the Variable. A StructuredActivityNode that owns the Variable. A Variable is accessible by Actions within its scope (the Activity or StructuredActivityNode that owns it). OCL result = (if scope<>null then scope.allOwnedNodes()->includes(a) else a.containingActivity()=activityScope endif) ObjectNodeOrderingKind is an enumeration indicating queuing order for offering the tokens held by an ObjectNode. Indicates that tokens are unordered. Indicates that tokens are ordered. Indicates that tokens are queued in a last in, first out manner. Indicates that tokens are queued in a first in, first out manner. A substitution is a relationship between two classifiers signifying that the substituting classifier complies with the contract specified by the contract classifier. This implies that instances of the substituting classifier are runtime substitutable where instances of the contract classifier are expected. The contract with which the substituting classifier complies. Instances of the substituting classifier are runtime substitutable where instances of the contract classifier are expected. A BehavioralFeature is a feature of a Classifier that specifies an aspect of the behavior of its instances. A BehavioralFeature is implemented (realized) by a Behavior. A BehavioralFeature specifies that a Classifier will respond to a designated request by invoking its implementing method. When isAbstract is true there are no methods. OCL isAbstract implies method->isEmpty() Specifies the semantics of concurrent calls to the same passive instance (i.e., an instance originating from a Class with isActive being false). Active instances control access to their own BehavioralFeatures. If true, then the BehavioralFeature does not have an implementation, and one must be supplied by a more specific Classifier. If false, the BehavioralFeature must have an implementation in the Classifier or one must be inherited. A Behavior that implements the BehavioralFeature. There may be at most one Behavior for a particular pairing of a Classifier (as owner of the Behavior) and a BehavioralFeature (as specification of the Behavior). The ordered set of formal Parameters of this BehavioralFeature. The ParameterSets owned by this BehavioralFeature. The Types representing exceptions that may be raised during an invocation of this BehavioralFeature. Creates a return result parameter with the specified name and type. The name for the new return result, or null. The type for the new return result, or null. The query isDistinguishableFrom() determines whether two BehavioralFeatures may coexist in the same Namespace. It specifies that they must have different signatures. OCL result = ((n.oclIsKindOf(BehavioralFeature) and ns.getNamesOfMember(self)->intersection(ns.getNamesOfMember(n))->notEmpty()) implies Set{self}->including(n.oclAsType(BehavioralFeature))->isUnique(ownedParameter->collect(p| Tuple { name=p.name, type=p.type,effect=p.effect,direction=p.direction,isException=p.isException, isStream=p.isStream,isOrdered=p.isOrdered,isUnique=p.isUnique,lower=p.lower, upper=p.upper })) ) The ownedParameters with direction in and inout. OCL result = (ownedParameter->select(direction=ParameterDirectionKind::_'in' or direction=ParameterDirectionKind::inout)) The ownedParameters with direction out, inout, or return. OCL result = (ownedParameter->select(direction=ParameterDirectionKind::out or direction=ParameterDirectionKind::inout or direction=ParameterDirectionKind::return)) A Classifier represents a classification of instances according to their Features. A Classifier may only specialize Classifiers of a valid type. OCL parents()->forAll(c | self.maySpecializeType(c)) The Classifier that maps to a GeneralizationSet may neither be a specific nor a general Classifier in any of the Generalization relationships defined for that GeneralizationSet. In other words, a power type may not be an instance of itself nor may its instances also be its subclasses. OCL powertypeExtent->forAll( gs | gs.generalization->forAll( gen | not (gen.general = self) and not gen.general.allParents()->includes(self) and not (gen.specific = self) and not self.allParents()->includes(gen.specific) )) The parents of a Classifier must be non-final. OCL parents()->forAll(not isFinalSpecialization) Generalization hierarchies must be directed and acyclical. A Classifier can not be both a transitively general and transitively specific Classifier of the same Classifier. OCL not allParents()->includes(self) All of the Properties that are direct (i.e., not inherited or imported) attributes of the Classifier. The CollaborationUses owned by the Classifier. Specifies each Feature directly defined in the classifier. Note that there may be members of the Classifier that are of the type Feature but are not included, e.g., inherited features. The generalizing Classifiers for this Classifier. The Generalization relationships for this Classifier. These Generalizations navigate to more general Classifiers in the generalization hierarchy. All elements inherited by this Classifier from its general Classifiers. If true, the Classifier can only be instantiated by instantiating one of its specializations. An abstract Classifier is intended to be used by other Classifiers e.g., as the target of Associations or Generalizations. If true, the Classifier cannot be specialized. The optional RedefinableTemplateSignature specifying the formal template parameters. The UseCases owned by this classifier. The GeneralizationSet of which this Classifier is a power type. The Classifiers redefined by this Classifier. A CollaborationUse which indicates the Collaboration that represents this Classifier. The Substitutions owned by this Classifier. TheClassifierTemplateParameter that exposes this element as a formal parameter. The set of UseCases for which this Classifier is the subject. Retrieves all the attributes of this classifier, including those inherited from its parents. Retrieves all the operations of this classifier, including those inherited from its parents. Retrieves all the interfaces on which this classifier or any of its parents has a usage dependency. Retrieves the first operation with the specified name, parameter names, and parameter types from this classifier. The name of the operation to retrieve, or null. The parameter names of the operation to retrieve, or null. The parameter types of the operation to retrieve, or null. Retrieves the first operation with the specified name, parameter names, and parameter types from this classifier, ignoring case if indicated. The name of the operation to retrieve, or null. The parameter names of the operation to retrieve, or null. The parameter types of the operation to retrieve, or null. Whether to ignore case in String comparisons. Retrieves the operations of this classifier. Retrieves the interfaces on which this classifier has a usage dependency. The query allFeatures() gives all of the Features in the namespace of the Classifier. In general, through mechanisms such as inheritance, this will be a larger set than feature. OCL result = (member->select(oclIsKindOf(Feature))->collect(oclAsType(Feature))->asSet()) The query allParents() gives all of the direct and indirect ancestors of a generalized Classifier. OCL result = (parents()->union(parents()->collect(allParents())->asSet())) The query conformsTo() gives true for a Classifier that defines a type that conforms to another. This is used, for example, in the specification of signature conformance for operations. OCL result = (if other.oclIsKindOf(Classifier) then let otherClassifier : Classifier = other.oclAsType(Classifier) in self = otherClassifier or allParents()->includes(otherClassifier) else false endif) The general Classifiers are the ones referenced by the Generalization relationships. OCL result = (parents()) The query hasVisibilityOf() determines whether a NamedElement is visible in the classifier. Non-private members are visible. It is only called when the argument is something owned by a parent. OCL allParents()->including(self)->collect(member)->includes(n) OCL result = (n.visibility <> VisibilityKind::private) The query inherit() defines how to inherit a set of elements passed as its argument. It excludes redefined elements from the result. OCL result = (inhs->reject(inh | inh.oclIsKindOf(RedefinableElement) and ownedMember->select(oclIsKindOf(RedefinableElement))-> select(redefinedElement->includes(inh.oclAsType(RedefinableElement))) ->notEmpty())) The query inheritableMembers() gives all of the members of a Classifier that may be inherited in one of its descendants, subject to whatever visibility restrictions apply. OCL c.allParents()->includes(self) OCL result = (member->select(m | c.hasVisibilityOf(m))) The inheritedMember association is derived by inheriting the inheritable members of the parents. OCL result = (inherit(parents()->collect(inheritableMembers(self))->asSet())) The query isTemplate() returns whether this Classifier is actually a template. OCL result = (ownedTemplateSignature <> null or general->exists(g | g.isTemplate())) The query maySpecializeType() determines whether this classifier may have a generalization relationship to classifiers of the specified type. By default a classifier may specialize classifiers of the same or a more general type. It is intended to be redefined by classifiers that have different specialization constraints. OCL result = (self.oclIsKindOf(c.oclType())) The query parents() gives all of the immediate ancestors of a generalized Classifier. OCL result = (generalization.general->asSet()) The Interfaces directly realized by this Classifier OCL result = ((clientDependency-> select(oclIsKindOf(Realization) and supplier->forAll(oclIsKindOf(Interface))))-> collect(supplier.oclAsType(Interface))->asSet()) The Interfaces directly used by this Classifier OCL result = ((supplierDependency-> select(oclIsKindOf(Usage) and client->forAll(oclIsKindOf(Interface))))-> collect(client.oclAsType(Interface))->asSet()) The Interfaces realized by this Classifier and all of its generalizations OCL result = (directlyRealizedInterfaces()->union(self.allParents()->collect(directlyRealizedInterfaces()))->asSet()) The Interfaces used by this Classifier and all of its generalizations OCL result = (directlyUsedInterfaces()->union(self.allParents()->collect(directlyUsedInterfaces()))->asSet()) OCL result = (substitution.contract->includes(contract)) The query allAttributes gives an ordered set of all owned and inherited attributes of the Classifier. All owned attributes appear before any inherited attributes, and the attributes inherited from any more specific parent Classifier appear before those of any more general parent Classifier. However, if the Classifier has multiple immediate parents, then the relative ordering of the sets of attributes from those parents is not defined. OCL result = (attribute->asSequence()->union(parents()->asSequence().allAttributes())->select(p | member->includes(p))->asOrderedSet()) All StructuralFeatures related to the Classifier that may have Slots, including direct attributes, inherited attributes, private attributes in generalizations, and memberEnds of Associations, but excluding redefined StructuralFeatures. OCL result = (member->select(oclIsKindOf(StructuralFeature))-> collect(oclAsType(StructuralFeature))-> union(self.inherit(self.allParents()->collect(p | p.attribute)->asSet())-> collect(oclAsType(StructuralFeature)))->asSet()) A ClassifierTemplateParameter exposes a Classifier as a formal template parameter. If allowSubstitutable is true, then there must be a constrainingClassifier. OCL allowSubstitutable implies constrainingClassifier->notEmpty() The parameteredElement has no direct features, and if constrainedElement is empty it has no generalizations. OCL parameteredElement.feature->isEmpty() and (constrainingClassifier->isEmpty() implies parameteredElement.allParents()->isEmpty()) If the parameteredElement is not abstract, then the Classifier used as an argument shall not be abstract. OCL (not parameteredElement.isAbstract) implies templateParameterSubstitution.actual->forAll(a | not a.oclAsType(Classifier).isAbstract) The argument to a ClassifierTemplateParameter is a Classifier. OCL templateParameterSubstitution.actual->forAll(a | a.oclIsKindOf(Classifier)) If there are any constrainingClassifiers, then every argument must be the same as or a specialization of them, or if allowSubstitutable is true, then it can also be substitutable. OCL templateParameterSubstitution.actual->forAll( a | let arg : Classifier = a.oclAsType(Classifier) in constrainingClassifier->forAll( cc | arg = cc or arg.conformsTo(cc) or (allowSubstitutable and arg.isSubstitutableFor(cc)) ) ) If there are any constrainingClassifiers, then the parameteredElement must be the same as or a specialization of them, or if allowSubstitutable is true, then it can also be substitutable. OCL constrainingClassifier->forAll( cc | parameteredElement = cc or parameteredElement.conformsTo(cc) or (allowSubstitutable and parameteredElement.isSubstitutableFor(cc)) ) Constrains the required relationship between an actual parameter and the parameteredElement for this formal parameter. The classifiers that constrain the argument that can be used for the parameter. If the allowSubstitutable attribute is true, then any Classifier that is compatible with this constraining Classifier can be substituted; otherwise, it must be either this Classifier or one of its specializations. If this property is empty, there are no constraints on the Classifier that can be used as an argument. The Classifier exposed by this ClassifierTemplateParameter. A Feature declares a behavioral or structural characteristic of Classifiers. The Classifiers that have this Feature as a feature. Specifies whether this Feature characterizes individual instances classified by the Classifier (false) or the Classifier itself (true). A Generalization is a taxonomic relationship between a more general Classifier and a more specific Classifier. Each instance of the specific Classifier is also an instance of the general Classifier. The specific Classifier inherits the features of the more general Classifier. A Generalization is owned by the specific Classifier. The general classifier in the Generalization relationship. Represents a set of instances of Generalization. A Generalization may appear in many GeneralizationSets. Indicates whether the specific Classifier can be used wherever the general Classifier can be used. If true, the execution traces of the specific Classifier shall be a superset of the execution traces of the general Classifier. If false, there is no such constraint on execution traces. If unset, the modeler has not stated whether there is such a constraint or not. The specializing Classifier in the Generalization relationship. A GeneralizationSet is a PackageableElement whose instances represent sets of Generalization relationships. Every Generalization associated with a particular GeneralizationSet must have the same general Classifier. OCL generalization->collect(general)->asSet()->size() <= 1 The Classifier that maps to a GeneralizationSet may neither be a specific nor a general Classifier in any of the Generalization relationships defined for that GeneralizationSet. In other words, a power type may not be an instance of itself nor may its instances be its subclasses. OCL powertype <> null implies generalization->forAll( gen | not (gen.general = powertype) and not gen.general.allParents()->includes(powertype) and not (gen.specific = powertype) and not powertype.allParents()->includes(gen.specific) ) Designates the instances of Generalization that are members of this GeneralizationSet. Indicates (via the associated Generalizations) whether or not the set of specific Classifiers are covering for a particular general classifier. When isCovering is true, every instance of a particular general Classifier is also an instance of at least one of its specific Classifiers for the GeneralizationSet. When isCovering is false, there are one or more instances of the particular general Classifier that are not instances of at least one of its specific Classifiers defined for the GeneralizationSet. Indicates whether or not the set of specific Classifiers in a Generalization relationship have instance in common. If isDisjoint is true, the specific Classifiers for a particular GeneralizationSet have no members in common; that is, their intersection is empty. If isDisjoint is false, the specific Classifiers in a particular GeneralizationSet have one or more members in common; that is, their intersection is not empty. Designates the Classifier that is defined as the power type for the associated GeneralizationSet, if there is one. An InstanceSpecification is a model element that represents an instance in a modeled system. An InstanceSpecification can act as a DeploymentTarget in a Deployment relationship, in the case that it represents an instance of a Node. It can also act as a DeployedArtifact, if it represents an instance of an Artifact. An InstanceSpecification can act as a DeployedArtifact if it represents an instance of an Artifact. OCL deploymentForArtifact->notEmpty() implies classifier->exists(oclIsKindOf(Artifact)) No more than one slot in an InstanceSpecification may have the same definingFeature. OCL classifier->forAll(c | (c.allSlottableFeatures()->forAll(f | slot->select(s | s.definingFeature = f)->size() <= 1))) The definingFeature of each slot is a StructuralFeature related to a classifier of the InstanceSpecification, including direct attributes, inherited attributes, private attributes in generalizations, and memberEnds of Associations, but excluding redefined StructuralFeatures. OCL slot->forAll(s | classifier->exists (c | c.allSlottableFeatures()->includes (s.definingFeature))) An InstanceSpecification can act as a DeploymentTarget if it represents an instance of a Node and functions as a part in the internal structure of an encompassing Node. OCL deployment->notEmpty() implies classifier->exists(node | node.oclIsKindOf(Node) and Node.allInstances()->exists(n | n.part->exists(p | p.type = node))) The Classifier or Classifiers of the represented instance. If multiple Classifiers are specified, the instance is classified by all of them. A Slot giving the value or values of a StructuralFeature of the instance. An InstanceSpecification can have one Slot per StructuralFeature of its Classifiers, including inherited features. It is not necessary to model a Slot for every StructuralFeature, in which case the InstanceSpecification is a partial description. A specification of how to compute, derive, or construct the instance. An InstanceValue is a ValueSpecification that identifies an instance. The InstanceSpecification that represents the specified value. An Operation is a BehavioralFeature of a Classifier that specifies the name, type, parameters, and constraints for invoking an associated Behavior. An Operation may invoke both the execution of method behaviors as well as other behavioral responses. Operation specializes TemplateableElement in order to support specification of template operations and bound operations. Operation specializes ParameterableElement to specify that an operation can be exposed as a formal template parameter, and provided as an actual parameter in a binding of a template. An Operation can have at most one return parameter; i.e., an owned parameter with the direction set to 'return.' OCL self.ownedParameter->select(direction = ParameterDirectionKind::return)->size() <= 1 A bodyCondition can only be specified for a query Operation. OCL bodyCondition <> null implies isQuery An optional Constraint on the result values of an invocation of this Operation. The Class that owns this operation, if any. The DataType that owns this Operation, if any. The Interface that owns this Operation, if any. Specifies whether the return parameter is ordered or not, if present. This information is derived from the return result for this Operation. Specifies whether an execution of the BehavioralFeature leaves the state of the system unchanged (isQuery=true) or whether side effects may occur (isQuery=false). Specifies whether the return parameter is unique or not, if present. This information is derived from the return result for this Operation. Specifies the lower multiplicity of the return parameter, if present. This information is derived from the return result for this Operation. The parameters owned by this Operation. An optional set of Constraints specifying the state of the system when the Operation is completed. An optional set of Constraints on the state of the system when the Operation is invoked. The Types representing exceptions that may be raised during an invocation of this operation. The Operations that are redefined by this Operation. The OperationTemplateParameter that exposes this element as a formal parameter. The return type of the operation, if present. This information is derived from the return result for this Operation. The upper multiplicity of the return parameter, if present. This information is derived from the return result for this Operation. Retrieves the (only) return result parameter for this operation. The query isConsistentWith() specifies, for any two Operations in a context in which redefinition is possible, whether redefinition would be consistent. A redefining operation is consistent with a redefined operation if it has the same number of owned parameters, and for each parameter the following holds: - Direction, ordering and uniqueness are the same. - The corresponding types are covariant, contravariant or invariant. - The multiplicities are compatible, depending on the parameter direction. OCL redefiningElement.isRedefinitionContextValid(self) OCL result = (redefiningElement.oclIsKindOf(Operation) and let op : Operation = redefiningElement.oclAsType(Operation) in self.ownedParameter->size() = op.ownedParameter->size() and Sequence{1..self.ownedParameter->size()}-> forAll(i | let redefiningParam : Parameter = op.ownedParameter->at(i), redefinedParam : Parameter = self.ownedParameter->at(i) in (redefiningParam.isUnique = redefinedParam.isUnique) and (redefiningParam.isOrdered = redefinedParam. isOrdered) and (redefiningParam.direction = redefinedParam.direction) and (redefiningParam.type.conformsTo(redefinedParam.type) or redefinedParam.type.conformsTo(redefiningParam.type)) and (redefiningParam.direction = ParameterDirectionKind::inout implies (redefinedParam.compatibleWith(redefiningParam) and redefiningParam.compatibleWith(redefinedParam))) and (redefiningParam.direction = ParameterDirectionKind::_'in' implies redefinedParam.compatibleWith(redefiningParam)) and ((redefiningParam.direction = ParameterDirectionKind::out or redefiningParam.direction = ParameterDirectionKind::return) implies redefiningParam.compatibleWith(redefinedParam)) )) If this operation has a return parameter, isOrdered equals the value of isOrdered for that parameter. Otherwise isOrdered is false. OCL result = (if returnResult()->notEmpty() then returnResult()-> exists(isOrdered) else false endif) If this operation has a return parameter, isUnique equals the value of isUnique for that parameter. Otherwise isUnique is true. OCL result = (if returnResult()->notEmpty() then returnResult()->exists(isUnique) else true endif) If this operation has a return parameter, lower equals the value of lower for that parameter. Otherwise lower has no value. OCL result = (if returnResult()->notEmpty() then returnResult()->any(true).lower else null endif) The query returnResult() returns the set containing the return parameter of the Operation if one exists, otherwise, it returns an empty set OCL result = (ownedParameter->select (direction = ParameterDirectionKind::return)->asSet()) If this operation has a return parameter, type equals the value of type for that parameter. Otherwise type has no value. OCL result = (if returnResult()->notEmpty() then returnResult()->any(true).type else null endif) If this operation has a return parameter, upper equals the value of upper for that parameter. Otherwise upper has no value. OCL result = (if returnResult()->notEmpty() then returnResult()->any(true).upper else null endif) An OperationTemplateParameter exposes an Operation as a formal parameter for a template. A default for an OperationTemplateParameter must be an Operation with the same Parameter types, directions and multiplicities as the exposed Operation. OCL default->notEmpty() implies (default.oclIsKindOf(Operation) and (let defaultOp : Operation = default.oclAsType(Operation) in defaultOp.ownedParameter->size() = parameteredElement.ownedParameter->size() and Sequence{1.. defaultOp.ownedParameter->size()}->forAll( ix | let p1: Parameter = defaultOp.ownedParameter->at(ix), p2 : Parameter = parameteredElement.ownedParameter->at(ix) in p1.type = p2.type and p1.upper = p2.upper and p1.lower = p2.lower and p1.direction = p2.direction and p1.isOrdered = p2.isOrdered and p1.isUnique = p2.isUnique))) The Operation exposed by this OperationTemplateParameter. A Parameter is a specification of an argument used to pass information into or out of an invocation of a BehavioralFeature. Parameters can be treated as ConnectableElements within Collaborations. Only in and inout Parameters may have a delete effect. Only out, inout, and return Parameters may have a create effect. OCL (effect = ParameterEffectKind::delete implies (direction = ParameterDirectionKind::_'in' or direction = ParameterDirectionKind::inout)) and (effect = ParameterEffectKind::create implies (direction = ParameterDirectionKind::out or direction = ParameterDirectionKind::inout or direction = ParameterDirectionKind::return)) An input Parameter cannot be an exception. OCL isException implies (direction <> ParameterDirectionKind::_'in' and direction <> ParameterDirectionKind::inout) A Parameter may only be associated with a Connector end within the context of a Collaboration. OCL end->notEmpty() implies collaboration->notEmpty() Reentrant behaviors cannot have stream Parameters. OCL (isStream and behavior <> null) implies not behavior.isReentrant A Parameter cannot be a stream and exception at the same time. OCL not (isException and isStream) Parameters typed by DataTypes cannot have an effect. OCL (type.oclIsKindOf(DataType)) implies (effect = null) A String that represents a value to be used when no argument is supplied for the Parameter. Specifies a ValueSpecification that represents a value to be used when no argument is supplied for the Parameter. Indicates whether a parameter is being sent into or out of a behavioral element. Specifies the effect that executions of the owner of the Parameter have on objects passed in or out of the parameter. Tells whether an output parameter may emit a value to the exclusion of the other outputs. Tells whether an input parameter may accept values while its behavior is executing, or whether an output parameter may post values while the behavior is executing. The Operation owning this parameter. The ParameterSets containing the parameter. See ParameterSet. Sets the default value for this parameter to the specified Boolean value. The new default value. Sets the default value for this parameter to the specified integer value. The new default value. Sets the default value for this parameter to the null value. Sets the default value for this parameter to the specified real value. The new default value. Sets the default value for this parameter to the specified string value. The new default value. Sets the default value for this parameter to the specified unlimited natural value. The new default value. Derivation for Parameter::/default OCL result = (if self.type = String then defaultValue.stringValue() else null endif) A ParameterSet designates alternative sets of inputs or outputs that a Behavior may use. The Parameters in a ParameterSet must all be inputs or all be outputs of the same parameterized entity, and the ParameterSet is owned by that entity. OCL parameter->forAll(p1, p2 | self.owner = p1.owner and self.owner = p2.owner and p1.direction = p2.direction) If a parameterized entity has input Parameters that are in a ParameterSet, then any inputs that are not in a ParameterSet must be streaming. Same for output Parameters. OCL ((parameter->exists(direction = ParameterDirectionKind::_'in')) implies behavioralFeature.ownedParameter->select(p | p.direction = ParameterDirectionKind::_'in' and p.parameterSet->isEmpty())->forAll(isStream)) and ((parameter->exists(direction = ParameterDirectionKind::out)) implies behavioralFeature.ownedParameter->select(p | p.direction = ParameterDirectionKind::out and p.parameterSet->isEmpty())->forAll(isStream)) Two ParameterSets cannot have exactly the same set of Parameters. OCL parameter->forAll(parameterSet->forAll(s1, s2 | s1->size() = s2->size() implies s1.parameter->exists(p | not s2.parameter->includes(p)))) A constraint that should be satisfied for the owner of the Parameters in an input ParameterSet to start execution using the values provided for those Parameters, or the owner of the Parameters in an output ParameterSet to end execution providing the values for those Parameters, if all preconditions and conditions on input ParameterSets were satisfied. Parameters in the ParameterSet. A Property is a StructuralFeature. A Property related by ownedAttribute to a Classifier (other than an association) represents an attribute and might also represent an association end. It relates an instance of the Classifier to a value or set of values of the type of the attribute. A Property related by memberEnd to an Association represents an end of the Association. The type of the Property is the type of the end of the Association. A Property has the capability of being a DeploymentTarget in a Deployment relationship. This enables modeling the deployment to hierarchical nodes that have Properties functioning as internal parts. Property specializes ParameterableElement to specify that a Property can be exposed as a formal template parameter, and provided as an actual parameter in a binding of a template. Subsetting may only occur when the context of the subsetting property conforms to the context of the subsetted property. OCL subsettedProperty->notEmpty() implies (subsettingContext()->notEmpty() and subsettingContext()->forAll (sc | subsettedProperty->forAll(sp | sp.subsettingContext()->exists(c | sc.conformsTo(c))))) A derived union is read only. OCL isDerivedUnion implies isReadOnly A multiplicity on the composing end of a composite aggregation must not have an upper bound greater than 1. OCL isComposite and association <> null implies opposite.upperBound() <= 1 A redefined Property must be inherited from a more general Classifier. OCL (redefinedProperty->notEmpty()) implies (redefinitionContext->notEmpty() and redefinedProperty->forAll(rp| ((redefinitionContext->collect(fc| fc.allParents()))->asSet())->collect(c| c.allFeatures())->asSet()->includes(rp))) A subsetting Property may strengthen the type of the subsetted Property, and its upper bound may be less. OCL subsettedProperty->forAll(sp | self.type.conformsTo(sp.type) and ((self.upperBound()->notEmpty() and sp.upperBound()->notEmpty()) implies self.upperBound() <= sp.upperBound() )) A binding of a PropertyTemplateParameter representing an attribute must be to an attribute. OCL (self.isAttribute() and (templateParameterSubstitution->notEmpty()) implies (templateParameterSubstitution->forAll(ts | ts.formal.oclIsKindOf(Property) and ts.formal.oclAsType(Property).isAttribute()))) A derived union is derived. OCL isDerivedUnion implies isDerived A Property can be a DeploymentTarget if it is a kind of Node and functions as a part in the internal structure of an encompassing Node. OCL deployment->notEmpty() implies owner.oclIsKindOf(Node) and Node.allInstances()->exists(n | n.part->exists(p | p = self)) A Property may not subset a Property with the same name. OCL subsettedProperty->forAll(sp | sp.name <> name) If a Property is a classifier-owned end of a binary Association, its owner must be the type of the opposite end. OCL (opposite->notEmpty() and owningAssociation->isEmpty()) implies classifier = opposite.type All qualified Properties must be Association ends OCL qualifier->notEmpty() implies association->notEmpty() Specifies the kind of aggregation that applies to the Property. The Association of which this Property is a member, if any. Designates the optional association end that owns a qualifier attribute. The Class that owns this Property, if any. The DataType that owns this Property, if any. A ValueSpecification that is evaluated to give a default value for the Property when an instance of the owning Classifier is instantiated. The Interface that owns this Property, if any. If isComposite is true, the object containing the attribute is a container for the object or value contained in the attribute. This is a derived value, indicating whether the aggregation of the Property is composite or not. Specifies whether the Property is derived, i.e., whether its value or values can be computed from other information. Specifies whether the property is derived as the union of all of the Properties that are constrained to subset it. True indicates this property can be used to uniquely identify an instance of the containing Class. In the case where the Property is one end of a binary association this gives the other end. The owning association of this property, if any. An optional list of ordered qualifier attributes for the end. The properties that are redefined by this property, if any. The properties of which this Property is constrained to be a subset, if any. Retrieves a string representation of the default value for this property. Retrieves the other end of the (binary) association in which this property is a member end. Sets the default value for this property to the specified Boolean value. The new default value. Sets the default value for this property based on the specified string representation. A string repesentation of the new default value. Sets the default value for this property to the specified integer value. The new default value. Sets the navigability of this property as indicated. The new navigability. Sets the default value for this property to the null value. Sets the default value for this property to the specified real value. The new default value. Sets the default value for this property to the specified string value. The new default value. Sets the default value for this property to the specified unlimited natural value. The new default value. The query isAttribute() is true if the Property is defined as an attribute of some Classifier. OCL result = (not classifier->isEmpty()) The query isCompatibleWith() determines if this Property is compatible with the specified ParameterableElement. This Property is compatible with ParameterableElement p if the kind of this Property is thesame as or a subtype of the kind of p. Further, if p is a TypedElement, then the type of this Property must be conformant with the type of p. OCL result = (self.oclIsKindOf(p.oclType()) and (p.oclIsKindOf(TypedElement) implies self.type.conformsTo(p.oclAsType(TypedElement).type))) The value of isComposite is true only if aggregation is composite. OCL result = (aggregation = AggregationKind::composite) The query isConsistentWith() specifies, for any two Properties in a context in which redefinition is possible, whether redefinition would be logically consistent. A redefining Property is consistent with a redefined Property if the type of the redefining Property conforms to the type of the redefined Property, and the multiplicity of the redefining Property (if specified) is contained in the multiplicity of the redefined Property. OCL redefiningElement.isRedefinitionContextValid(self) OCL result = (redefiningElement.oclIsKindOf(Property) and let prop : Property = redefiningElement.oclAsType(Property) in (prop.type.conformsTo(self.type) and ((prop.lowerBound()->notEmpty() and self.lowerBound()->notEmpty()) implies prop.lowerBound() >= self.lowerBound()) and ((prop.upperBound()->notEmpty() and self.upperBound()->notEmpty()) implies prop.lowerBound() <= self.lowerBound()) and (self.isComposite implies prop.isComposite))) The query isNavigable() indicates whether it is possible to navigate across the property. OCL result = (not classifier->isEmpty() or association.navigableOwnedEnd->includes(self)) If this property is a memberEnd of a binary association, then opposite gives the other end. OCL result = (if association <> null and association.memberEnd->size() = 2 then association.memberEnd->any(e | e <> self) else null endif) The query subsettingContext() gives the context for subsetting a Property. It consists, in the case of an attribute, of the corresponding Classifier, and in the case of an association end, all of the Classifiers at the other ends. OCL result = (if association <> null then association.memberEnd->excluding(self)->collect(type)->asSet() else if classifier<>null then classifier->asSet() else Set{} endif endif) A RedefinableElement is an element that, when defined in the context of a Classifier, can be redefined more specifically or differently in the context of another Classifier that specializes (directly or indirectly) the context Classifier. A redefining element must be consistent with each redefined element. OCL redefinedElement->forAll(re | re.isConsistentWith(self)) A RedefinableElement can only redefine non-leaf RedefinableElements. OCL redefinedElement->forAll(re | not re.isLeaf) At least one of the redefinition contexts of the redefining element must be a specialization of at least one of the redefinition contexts for each redefined element. OCL redefinedElement->forAll(re | self.isRedefinitionContextValid(re)) Indicates whether it is possible to further redefine a RedefinableElement. If the value is true, then it is not possible to further redefine the RedefinableElement. The RedefinableElement that is being redefined by this element. The contexts that this element may be redefined from. The query isConsistentWith() specifies, for any two RedefinableElements in a context in which redefinition is possible, whether redefinition would be logically consistent. By default, this is false; this operation must be overridden for subclasses of RedefinableElement to define the consistency conditions. OCL redefiningElement.isRedefinitionContextValid(self) OCL result = (false) The query isRedefinitionContextValid() specifies whether the redefinition contexts of this RedefinableElement are properly related to the redefinition contexts of the specified RedefinableElement to allow this element to redefine the other. By default at least one of the redefinition contexts of this element must be a specialization of at least one of the redefinition contexts of the specified element. OCL result = (redefinitionContext->exists(c | c.allParents()->includesAll(redefinedElement.redefinitionContext))) A RedefinableTemplateSignature supports the addition of formal template parameters in a specialization of a template classifier. If any of the parent Classifiers are a template, then the extendedSignature must include the signature of that Classifier. OCL classifier.allParents()->forAll(c | c.ownedTemplateSignature->notEmpty() implies self->closure(extendedSignature)->includes(c.ownedTemplateSignature)) The Classifier that owns this RedefinableTemplateSignature. The signatures extended by this RedefinableTemplateSignature. The formal template parameters of the extended signatures. Derivation for RedefinableTemplateSignature::/inheritedParameter OCL result = (if extendedSignature->isEmpty() then Set{} else extendedSignature.parameter->asSet() endif) The query isConsistentWith() specifies, for any two RedefinableTemplateSignatures in a context in which redefinition is possible, whether redefinition would be logically consistent. A redefining template signature is always consistent with a redefined template signature, as redefinition only adds new formal parameters. OCL redefiningElement.isRedefinitionContextValid(self) OCL result = (redefiningElement.oclIsKindOf(RedefinableTemplateSignature)) A Slot designates that an entity modeled by an InstanceSpecification has a value or values for a specific StructuralFeature. The StructuralFeature that specifies the values that may be held by the Slot. The InstanceSpecification that owns this Slot. The value or values held by the Slot. A StructuralFeature is a typed feature of a Classifier that specifies the structure of instances of the Classifier. If isReadOnly is true, the StructuralFeature may not be written to after initialization. AggregationKind is an Enumeration for specifying the kind of aggregation of a Property. Indicates that the Property has no aggregation. Indicates that the Property has shared aggregation. Indicates that the Property is aggregated compositely, i.e., the composite object has responsibility for the existence and storage of the composed objects (parts). CallConcurrencyKind is an Enumeration used to specify the semantics of concurrent calls to a BehavioralFeature. No concurrency management mechanism is associated with the BehavioralFeature and, therefore, concurrency conflicts may occur. Instances that invoke a BehavioralFeature need to coordinate so that only one invocation to a target on any BehavioralFeature occurs at once. Multiple invocations of a BehavioralFeature that overlap in time may occur to one instance, but only one is allowed to commence. The others are blocked until the performance of the currently executing BehavioralFeature is complete. It is the responsibility of the system designer to ensure that deadlocks do not occur due to simultaneous blocking. Multiple invocations of a BehavioralFeature that overlap in time may occur to one instance and all of them may proceed concurrently. ParameterDirectionKind is an Enumeration that defines literals used to specify direction of parameters. Indicates that Parameter values are passed in by the caller. Indicates that Parameter values are passed in by the caller and (possibly different) values passed out to the caller. Indicates that Parameter values are passed out to the caller. Indicates that Parameter values are passed as return values back to the caller. ParameterEffectKind is an Enumeration that indicates the effect of a Behavior on values passed in or out of its parameters. Indicates that the behavior creates values. Indicates objects that are values of the parameter have values of their properties, or links in which they participate, or their classifiers retrieved during executions of the behavior. Indicates objects that are values of the parameter have values of their properties, or links in which they participate, or their classification changed during executions of the behavior. Indicates objects that are values of the parameter do not exist after executions of the behavior are finished. A trigger for an AnyReceiveEvent is triggered by the receipt of any message that is not explicitly handled by any related trigger. Behavior is a specification of how its context BehavioredClassifier changes state over time. This specification may be either a definition of possible behavior execution or emergent behavior, or a selective illustration of an interesting subset of possible executions. The latter form is typically used for capturing examples, such as a trace of a particular execution. There may be at most one Behavior for a given pairing of BehavioredClassifier (as owner of the Behavior) and BehavioralFeature (as specification of the Behavior). OCL specification <> null implies _'context'.ownedBehavior->select(specification=self.specification)->size() = 1 If a Behavior has a specification BehavioralFeature, then it must have the same number of ownedParameters as its specification. The Behavior Parameters must also "match" the BehavioralParameter Parameters, but the exact requirements for this matching are not formalized. OCL specification <> null implies ownedParameter->size() = specification.ownedParameter->size() The specification BehavioralFeature must be a feature (possibly inherited) of the context BehavioredClassifier of the Behavior. OCL _'context'.feature->includes(specification) The BehavioredClassifier that is the context for the execution of the Behavior. A Behavior that is directly owned as a nestedClassifier does not have a context. Otherwise, to determine the context of a Behavior, find the first BehavioredClassifier reached by following the chain of owner relationships from the Behavior, if any. If there is such a BehavioredClassifier, then it is the context, unless it is itself a Behavior with a non-empty context, in which case that is also the context for the original Behavior. For example, following this algorithm, the context of an entry Behavior in a StateMachine is the BehavioredClassifier that owns the StateMachine. The features of the context BehavioredClassifier as well as the Elements visible to the context Classifier are visible to the Behavior. Tells whether the Behavior can be invoked while it is still executing from a previous invocation. References a list of Parameters to the Behavior which describes the order and type of arguments that can be given when the Behavior is invoked and of the values which will be returned when the Behavior completes its execution. The ParameterSets owned by this Behavior. An optional set of Constraints specifying what is fulfilled after the execution of the Behavior is completed, if its precondition was fulfilled before its invocation. An optional set of Constraints specifying what must be fulfilled before the Behavior is invoked. Designates a BehavioralFeature that the Behavior implements. The BehavioralFeature must be owned by the BehavioredClassifier that owns the Behavior or be inherited by it. The Parameters of the BehavioralFeature and the implementing Behavior must match. A Behavior does not need to have a specification, in which case it either is the classifierBehavior of a BehavioredClassifier or it can only be invoked by another Behavior of the Classifier. References the Behavior that this Behavior redefines. A subtype of Behavior may redefine any other subtype of Behavior. If the Behavior implements a BehavioralFeature, it replaces the redefined Behavior. If the Behavior is a classifierBehavior, it extends the redefined Behavior. A Behavior that is directly owned as a nestedClassifier does not have a context. Otherwise, to determine the context of a Behavior, find the first BehavioredClassifier reached by following the chain of owner relationships from the Behavior, if any. If there is such a BehavioredClassifier, then it is the context, unless it is itself a Behavior with a non-empty context, in which case that is also the context for the original Behavior. OCL result = (if nestingClass <> null then null else let b:BehavioredClassifier = self.behavioredClassifier(self.owner) in if b.oclIsKindOf(Behavior) and b.oclAsType(Behavior)._'context' <> null then b.oclAsType(Behavior)._'context' else b endif endif ) The first BehavioredClassifier reached by following the chain of owner relationships from the Behavior, if any. OCL if from.oclIsKindOf(BehavioredClassifier) then from.oclAsType(BehavioredClassifier) else if from.owner = null then null else self.behavioredClassifier(from.owner) endif endif The in and inout ownedParameters of the Behavior. OCL result = (ownedParameter->select(direction=ParameterDirectionKind::_'in' or direction=ParameterDirectionKind::inout)) The out, inout and return ownedParameters. OCL result = (ownedParameter->select(direction=ParameterDirectionKind::out or direction=ParameterDirectionKind::inout or direction=ParameterDirectionKind::return)) A CallEvent models the receipt by an object of a message invoking a call of an Operation. Designates the Operation whose invocation raised the CalEvent. A ChangeEvent models a change in the system configuration that makes a condition true. A Boolean-valued ValueSpecification that will result in a ChangeEvent whenever its value changes from false to true. An Event is the specification of some occurrence that may potentially trigger effects by an object. A FunctionBehavior is an OpaqueBehavior that does not access or modify any objects or other external data. A FunctionBehavior has at least one output Parameter. OCL self.ownedParameter-> select(p | p.direction = ParameterDirectionKind::out or p.direction= ParameterDirectionKind::inout or p.direction= ParameterDirectionKind::return)->size() >= 1 The types of the ownedParameters are all DataTypes, which may not nest anything but other DataTypes. OCL ownedParameter->forAll(p | p.type <> null and p.type.oclIsTypeOf(DataType) and hasAllDataTypeAttributes(p.type.oclAsType(DataType))) The hasAllDataTypeAttributes query tests whether the types of the attributes of the given DataType are all DataTypes, and similarly for all those DataTypes. OCL result = (d.ownedAttribute->forAll(a | a.type.oclIsKindOf(DataType) and hasAllDataTypeAttributes(a.type.oclAsType(DataType)))) A MessageEvent specifies the receipt by an object of either an Operation call or a Signal instance. An OpaqueBehavior is a Behavior whose specification is given in a textual language other than UML. Specifies the behavior in one or more languages. Languages the body strings use in the same order as the body strings. A SignalEvent represents the receipt of an asynchronous Signal instance. The specific Signal that is associated with this SignalEvent. A TimeEvent is an Event that occurs at a specific point in time. The ValueSpecification when must return a non-negative Integer. OCL when.integerValue() >= 0 Specifies whether the TimeEvent is specified as an absolute or relative time. Specifies the time of the TimeEvent. A Trigger specifies a specific point at which an Event occurrence may trigger an effect in a Behavior. A Trigger may be qualified by the Port on which the Event occurred. If a Trigger specifies one or more ports, the event of the Trigger must be a MessageEvent. OCL port->notEmpty() implies event.oclIsKindOf(MessageEvent) The Event that detected by the Trigger. A optional Port of through which the given effect is detected. An Abstraction is a Relationship that relates two Elements or sets of Elements that represent the same concept at different levels of abstraction or from different viewpoints. An OpaqueExpression that states the abstraction relationship between the supplier(s) and the client(s). In some cases, such as derivation, it is usually formal and unidirectional; in other cases, such as trace, it is usually informal and bidirectional. The mapping expression is optional and may be omitted if the precise relationship between the Elements is not specified. A Comment is a textual annotation that can be attached to a set of Elements. References the Element(s) being commented. Specifies a string that is the comment. A Constraint is a condition or restriction expressed in natural language text or in a machine readable language for the purpose of declaring some of the semantics of an Element or set of Elements. The ValueSpecification for a Constraint must evaluate to a Boolean value. Evaluating the ValueSpecification for a Constraint must not have side effects. A Constraint cannot be applied to itself. OCL not constrainedElement->includes(self) The ordered set of Elements referenced by this Constraint. Specifies the Namespace that owns the Constraint. A condition that must be true when evaluated in order for the Constraint to be satisfied. A Dependency is a Relationship that signifies that a single model Element or a set of model Elements requires other model Elements for their specification or implementation. This means that the complete semantics of the client Element(s) are either semantically or structurally dependent on the definition of the supplier Element(s). The Element(s) dependent on the supplier Element(s). In some cases (such as a trace Abstraction) the assignment of direction (that is, the designation of the client Element) is at the discretion of the modeler and is a stipulation. The Element(s) on which the client Element(s) depend in some respect. The modeler may stipulate a sense of Dependency direction suitable for their domain. A DirectedRelationship represents a relationship between a collection of source model Elements and a collection of target model Elements. Specifies the source Element(s) of the DirectedRelationship. Specifies the target Element(s) of the DirectedRelationship. An Element is a constituent of a model. As such, it has the capability of owning other Elements. Elements that must be owned must have an owner. OCL mustBeOwned() implies owner->notEmpty() An element may not directly or indirectly own itself. OCL not allOwnedElements()->includes(self) The Comments owned by this Element. The Elements owned by this Element. The Element that owns this Element. Adds the specified keyword to this element. The keyword to add. Applies the specified stereotype to this element. The stereotype to apply. Creates an annotation with the specified source and this element as its model element. The source for the new annotation. Destroys this element by removing all cross references to/from it and removing it from its containing resource or object. Retrieves the keywords for this element. Retrieves the stereotype with the specified qualified name that is applicable to this element, or null if no such stereotype is applicable. The qualified name of the applicable stereotype to retrieve. Retrieves the stereotypes that are applicable to this element, including those that are required and/or may already be applied. Retrieves the stereotype with the specified qualified name that is applied to this element, or null if no such stereotype is applied. The qualified name of the applied stereotype to retrieve. Retrieves the stereotypes that are applied to this element. Retrieves the substereotype of the specified stereotype with the specified qualified name that is applied to this element, or null if no such stereotype is applied. The superstereotype of the applied substereotype to retrieve. The qualified name of the applied substereotype to retrieve. Retrieves the substereotypes of the specified stereotype that are applied to this element. The superstereotype of the applied substereotypes to retrieve. Retrieves the model that owns (either directly or indirectly) this element. Retrieves the nearest package that owns (either directly or indirectly) this element, or the element itself (if it is a package). Retrieves the relationships in which this element is involved. Retrieves the relationships of the specified type in which this element is involved. The (meta)type of the relationships to retrieve. Retrieves the stereotype with the specified qualified name that is required for this element, or null if no such stereotype is required. The qualified name of the required stereotype to retrieve. Retrieves the stereotypes that are required for this element. Retrieves the directed relationships for which this element is a source. Retrieves the directed relationships of the specified type for which this element is a source. The (meta)type of the directed relationships to retrieve. Retrieves the application of the specified stereotype for this element, or null if no such stereotype application exists. The stereotype for which to retrieve an application. Retrieves the stereotype applications for this element. Retrieves the directed relationships for which this element is a target. Retrieves the directed relationships of the specified type for which this element is a target. The (meta)type of the directed relationships to retrieve. Retrieves the value of the property with the specified name in the specified stereotype for this element. The stereotype for which to retrieve the value. The name of the property whose value to retrieve. Determines whether this element has the specified keyword. The keyword in question. Determines whether this element has a (non-default) value for the property with the specified name in the specified stereotype. The stereotype for which to test the property. The name of the property in question. Determines whether the specified stereotype is applicable to this element. The stereotype in question. Determines whether the specified stereotype is applied to this element. The stereotype in question. Determines whether the specified stereotype is required for this element. The stereotype in question. Removes the specified keyword from this element. The keyword to remove. Sets the value of the property with the specified name in the specified stereotype for this element. The stereotype for which to set the value. The name of the property whose value to set. The new value for the property. Unapplies the specified stereotype from this element. The stereotype to unapply. The query allOwnedElements() gives all of the direct and indirect ownedElements of an Element. OCL result = (ownedElement->union(ownedElement->collect(e | e.allOwnedElements()))->asSet()) The query mustBeOwned() indicates whether Elements of this type must have an owner. Subclasses of Element that do not require an owner must override this operation. OCL result = (true) An ElementImport identifies a NamedElement in a Namespace other than the one that owns that NamedElement and allows the NamedElement to be referenced using an unqualified name in the Namespace owning the ElementImport. An importedElement has either public visibility or no visibility at all. OCL importedElement.visibility <> null implies importedElement.visibility = VisibilityKind::public The visibility of an ElementImport is either public or private. OCL visibility = VisibilityKind::public or visibility = VisibilityKind::private Specifies the name that should be added to the importing Namespace in lieu of the name of the imported PackagableElement. The alias must not clash with any other member in the importing Namespace. By default, no alias is used. Specifies the PackageableElement whose name is to be added to a Namespace. Specifies the Namespace that imports a PackageableElement from another Namespace. Specifies the visibility of the imported PackageableElement within the importingNamespace, i.e., whether the importedElement will in turn be visible to other Namespaces. If the ElementImport is public, the importedElement will be visible outside the importingNamespace while, if the ElementImport is private, it will not. The query getName() returns the name under which the imported PackageableElement will be known in the importing namespace. OCL result = (if alias->notEmpty() then alias else importedElement.name endif) A multiplicity is a definition of an inclusive interval of non-negative integers beginning with a lower bound and ending with a (possibly infinite) upper bound. A MultiplicityElement embeds this information to specify the allowable cardinalities for an instantiation of the Element. The upper bound must be greater than or equal to the lower bound. OCL upperBound() >= lowerBound() The lower bound must be a non-negative integer literal. OCL lowerBound() >= 0 If a non-literal ValueSpecification is used for lowerValue or upperValue, then evaluating that specification must not have side effects. If a non-literal ValueSpecification is used for lowerValue or upperValue, then that specification must be a constant expression. If it is not empty, then lowerValue must have an Integer value. OCL lowerValue <> null implies lowerValue.integerValue() <> null If it is not empty, then upperValue must have an UnlimitedNatural value. OCL upperValue <> null implies upperValue.unlimitedValue() <> null For a multivalued multiplicity, this attribute specifies whether the values in an instantiation of this MultiplicityElement are sequentially ordered. For a multivalued multiplicity, this attributes specifies whether the values in an instantiation of this MultiplicityElement are unique. The lower bound of the multiplicity interval. The specification of the lower bound for this multiplicity. The upper bound of the multiplicity interval. The specification of the upper bound for this multiplicity. The operation compatibleWith takes another multiplicity as input. It returns true if the other multiplicity is wider than, or the same as, self. OCL result = ((other.lowerBound() <= self.lowerBound()) and ((other.upperBound() = *) or (self.upperBound() <= other.upperBound()))) The query includesMultiplicity() checks whether this multiplicity includes all the cardinalities allowed by the specified multiplicity. OCL self.upperBound()->notEmpty() and self.lowerBound()->notEmpty() and M.upperBound()->notEmpty() and M.lowerBound()->notEmpty() OCL result = ((self.lowerBound() <= M.lowerBound()) and (self.upperBound() >= M.upperBound())) The operation is determines if the upper and lower bound of the ranges are the ones given. OCL result = (lowerbound = self.lowerBound() and upperbound = self.upperBound()) The query isMultivalued() checks whether this multiplicity has an upper bound greater than one. OCL upperBound()->notEmpty() OCL result = (upperBound() > 1) The derived lower attribute must equal the lowerBound. OCL result = (lowerBound()) The query lowerBound() returns the lower bound of the multiplicity as an integer, which is the integerValue of lowerValue, if this is given, and 1 otherwise. OCL result = (if (lowerValue=null or lowerValue.integerValue()=null) then 1 else lowerValue.integerValue() endif) The derived upper attribute must equal the upperBound. OCL result = (upperBound()) The query upperBound() returns the upper bound of the multiplicity for a bounded multiplicity as an unlimited natural, which is the unlimitedNaturalValue of upperValue, if given, and 1, otherwise. OCL result = (if (upperValue=null or upperValue.unlimitedValue()=null) then 1 else upperValue.unlimitedValue() endif) A NamedElement is an Element in a model that may have a name. The name may be given directly and/or via the use of a StringExpression. If a NamedElement is owned by something other than a Namespace, it does not have a visibility. One that is not owned by anything (and hence must be a Package, as this is the only kind of NamedElement that overrides mustBeOwned()) may have a visibility. OCL (namespace = null and owner <> null) implies visibility = null When there is a name, and all of the containing Namespaces have a name, the qualifiedName is constructed from the name of the NamedElement and the names of the containing Namespaces. OCL (name <> null and allNamespaces()->select(ns | ns.name = null)->isEmpty()) implies qualifiedName = allNamespaces()->iterate( ns : Namespace; agg: String = name | ns.name.concat(self.separator()).concat(agg)) If there is no name, or one of the containing Namespaces has no name, there is no qualifiedName. OCL name=null or allNamespaces()->select( ns | ns.name=null )->notEmpty() implies qualifiedName = null Indicates the Dependencies that reference this NamedElement as a client. The name of the NamedElement. The StringExpression used to define the name of this NamedElement. Specifies the Namespace that owns the NamedElement. A name that allows the NamedElement to be identified within a hierarchy of nested Namespaces. It is constructed from the names of the containing Namespaces starting at the root of the hierarchy and ending with the name of the NamedElement itself. Determines whether and how the NamedElement is visible outside its owning Namespace. Creates a dependency between this named element and the specified supplier, owned by this named element's nearest package. The supplier for the new dependency. Creates a usage between this named element and the specified supplier, owned by this named element's nearest package. The supplier for the new usage. Retrieves a localized label for this named element. Retrieves a label for this named element, localized if indicated. Whether to localize the label. The query allNamespaces() gives the sequence of Namespaces in which the NamedElement is nested, working outwards. OCL result = ( if owner = null then OrderedSet{} else let enclosingNamespace : Namespace = if owner.oclIsKindOf(TemplateParameter) and owner.oclAsType(TemplateParameter).signature.template.oclIsKindOf(Namespace) then owner.oclAsType(TemplateParameter).signature.template.oclAsType(Namespace) else namespace endif in enclosingNamespace.allNamespaces()->prepend(enclosingNamespace) endif) The query allOwningPackages() returns the set of all the enclosing Namespaces of this NamedElement, working outwards, that are Packages, up to but not including the first such Namespace that is not a Package. OCL result = (if namespace.oclIsKindOf(Package) then let owningPackage : Package = namespace.oclAsType(Package) in owningPackage->union(owningPackage.allOwningPackages()) else null endif) The query isDistinguishableFrom() determines whether two NamedElements may logically co-exist within a Namespace. By default, two named elements are distinguishable if (a) they have types neither of which is a kind of the other or (b) they have different names. OCL result = ((self.oclIsKindOf(n.oclType()) or n.oclIsKindOf(self.oclType())) implies ns.getNamesOfMember(self)->intersection(ns.getNamesOfMember(n))->isEmpty() ) When a NamedElement has a name, and all of its containing Namespaces have a name, the qualifiedName is constructed from the name of the NamedElement and the names of the containing Namespaces. OCL result = (if self.name <> null and self.allNamespaces()->select( ns | ns.name=null )->isEmpty() then self.allNamespaces()->iterate( ns : Namespace; agg: String = self.name | ns.name.concat(self.separator()).concat(agg)) else null endif) The query separator() gives the string that is used to separate names when constructing a qualifiedName. OCL result = ('::') OCL result = (Dependency.allInstances()->select(d | d.client->includes(self))) A Namespace is an Element in a model that owns and/or imports a set of NamedElements that can be identified by name. All the members of a Namespace are distinguishable within it. OCL membersAreDistinguishable() A Namespace cannot have a PackageImport to itself. OCL packageImport.importedPackage.oclAsType(Namespace)->excludes(self) A Namespace cannot have an ElementImport to one of its ownedMembers. OCL elementImport.importedElement.oclAsType(Element)->excludesAll(ownedMember) References the ElementImports owned by the Namespace. References the PackageableElements that are members of this Namespace as a result of either PackageImports or ElementImports. A collection of NamedElements identifiable within the Namespace, either by being owned or by being introduced by importing or inheritance. A collection of NamedElements owned by the Namespace. Specifies a set of Constraints owned by this Namespace. References the PackageImports owned by the Namespace. Creates an import of the specified element into this namespace with the specified visibility. The element to import. The visibility for the new element import. Creates an import of the specified package into this namespace with the specified visibility. The package to import. The visibility for the new package import. Retrieves the elements imported by this namespace. Retrieves the packages imported by this namespace. The query excludeCollisions() excludes from a set of PackageableElements any that would not be distinguishable from each other in this Namespace. OCL result = (imps->reject(imp1 | imps->exists(imp2 | not imp1.isDistinguishableFrom(imp2, self)))) The query getNamesOfMember() gives a set of all of the names that a member would have in a Namespace, taking importing into account. In general a member can have multiple names in a Namespace if it is imported more than once with different aliases. OCL result = (if self.ownedMember ->includes(element) then Set{element.name} else let elementImports : Set(ElementImport) = self.elementImport->select(ei | ei.importedElement = element) in if elementImports->notEmpty() then elementImports->collect(el | el.getName())->asSet() else self.packageImport->select(pi | pi.importedPackage.visibleMembers().oclAsType(NamedElement)->includes(element))-> collect(pi | pi.importedPackage.getNamesOfMember(element))->asSet() endif endif) The query importMembers() defines which of a set of PackageableElements are actually imported into the Namespace. This excludes hidden ones, i.e., those which have names that conflict with names of ownedMembers, and it also excludes PackageableElements that would have the indistinguishable names when imported. OCL result = (self.excludeCollisions(imps)->select(imp | self.ownedMember->forAll(mem | imp.isDistinguishableFrom(mem, self)))) The importedMember property is derived as the PackageableElements that are members of this Namespace as a result of either PackageImports or ElementImports. OCL result = (self.importMembers(elementImport.importedElement->asSet()->union(packageImport.importedPackage->collect(p | p.visibleMembers()))->asSet())) The Boolean query membersAreDistinguishable() determines whether all of the Namespace's members are distinguishable within it. OCL result = (member->forAll( memb | member->excluding(memb)->forAll(other | memb.isDistinguishableFrom(other, self)))) A PackageableElement is a NamedElement that may be owned directly by a Package. A PackageableElement is also able to serve as the parameteredElement of a TemplateParameter. A PackageableElement owned by a Namespace must have a visibility. OCL visibility = null implies namespace = null A PackageableElement must have a visibility specified if it is owned by a Namespace. The default visibility is public. A PackageImport is a Relationship that imports all the non-private members of a Package into the Namespace owning the PackageImport, so that those Elements may be referred to by their unqualified names in the importingNamespace. The visibility of a PackageImport is either public or private. OCL visibility = VisibilityKind::public or visibility = VisibilityKind::private Specifies the Package whose members are imported into a Namespace. Specifies the Namespace that imports the members from a Package. Specifies the visibility of the imported PackageableElements within the importingNamespace, i.e., whether imported Elements will in turn be visible to other Namespaces. If the PackageImport is public, the imported Elements will be visible outside the importingNamespace, while, if the PackageImport is private, they will not. A ParameterableElement is an Element that can be exposed as a formal TemplateParameter for a template, or specified as an actual parameter in a binding of a template. The formal TemplateParameter that owns this ParameterableElement. The TemplateParameter that exposes this ParameterableElement as a formal parameter. The query isCompatibleWith() determines if this ParameterableElement is compatible with the specified ParameterableElement. By default, this ParameterableElement is compatible with another ParameterableElement p if the kind of this ParameterableElement is the same as or a subtype of the kind of p. Subclasses of ParameterableElement should override this operation to specify different compatibility constraints. OCL result = (self.oclIsKindOf(p.oclType())) The query isTemplateParameter() determines if this ParameterableElement is exposed as a formal TemplateParameter. OCL result = (templateParameter->notEmpty()) Realization is a specialized Abstraction relationship between two sets of model Elements, one representing a specification (the supplier) and the other represents an implementation of the latter (the client). Realization can be used to model stepwise refinement, optimizations, transformations, templates, model synthesis, framework composition, etc. Relationship is an abstract concept that specifies some kind of relationship between Elements. Specifies the elements related by the Relationship. A TemplateableElement is an Element that can optionally be defined as a template and bound to other templates. The optional TemplateSignature specifying the formal TemplateParameters for this TemplateableElement. If a TemplateableElement has a TemplateSignature, then it is a template. The optional TemplateBindings from this TemplateableElement to one or more templates. The query isTemplate() returns whether this TemplateableElement is actually a template. OCL result = (ownedTemplateSignature <> null) The query parameterableElements() returns the set of ParameterableElements that may be used as the parameteredElements for a TemplateParameter of this TemplateableElement. By default, this set includes all the ownedElements. Subclasses may override this operation if they choose to restrict the set of ParameterableElements. OCL result = (self.allOwnedElements()->select(oclIsKindOf(ParameterableElement)).oclAsType(ParameterableElement)->asSet()) A TemplateBinding is a DirectedRelationship between a TemplateableElement and a template. A TemplateBinding specifies the TemplateParameterSubstitutions of actual parameters for the formal parameters of the template. Each parameterSubstitution must refer to a formal TemplateParameter of the target TemplateSignature. OCL parameterSubstitution->forAll(b | signature.parameter->includes(b.formal)) A TemplateBiinding contains at most one TemplateParameterSubstitution for each formal TemplateParameter of the target TemplateSignature. OCL signature.parameter->forAll(p | parameterSubstitution->select(b | b.formal = p)->size() <= 1) The TemplateableElement that is bound by this TemplateBinding. The TemplateParameterSubstitutions owned by this TemplateBinding. The TemplateSignature for the template that is the target of this TemplateBinding. A TemplateParameter exposes a ParameterableElement as a formal parameter of a template. The default must be compatible with the formal TemplateParameter. OCL default <> null implies default.isCompatibleWith(parameteredElement) The ParameterableElement that is the default for this formal TemplateParameter. The ParameterableElement that is owned by this TemplateParameter for the purpose of providing a default. The ParameterableElement that is owned by this TemplateParameter for the purpose of exposing it as the parameteredElement. The ParameterableElement exposed by this TemplateParameter. The TemplateSignature that owns this TemplateParameter. A TemplateParameterSubstitution relates the actual parameter to a formal TemplateParameter as part of a template binding. The actual ParameterableElement must be compatible with the formal TemplateParameter, e.g., the actual ParameterableElement for a Class TemplateParameter must be a Class. OCL actual->forAll(a | a.isCompatibleWith(formal.parameteredElement)) The ParameterableElement that is the actual parameter for this TemplateParameterSubstitution. The formal TemplateParameter that is associated with this TemplateParameterSubstitution. The ParameterableElement that is owned by this TemplateParameterSubstitution as its actual parameter. The TemplateBinding that owns this TemplateParameterSubstitution. A Template Signature bundles the set of formal TemplateParameters for a template. Parameters must own the ParameterableElements they parameter or those ParameterableElements must be owned by the TemplateableElement being templated. OCL template.ownedElement->includesAll(parameter.parameteredElement->asSet() - parameter.ownedParameteredElement->asSet()) The names of the parameters of a TemplateSignature are unique. OCL parameter->forAll( p1, p2 | (p1 <> p2 and p1.parameteredElement.oclIsKindOf(NamedElement) and p2.parameteredElement.oclIsKindOf(NamedElement) ) implies p1.parameteredElement.oclAsType(NamedElement).name <> p2.parameteredElement.oclAsType(NamedElement).name) The formal parameters that are owned by this TemplateSignature. The ordered set of all formal TemplateParameters for this TemplateSignature. The TemplateableElement that owns this TemplateSignature. A Type constrains the values represented by a TypedElement. Specifies the owning Package of this Type, if any. Creates a(n) (binary) association between this type and the specified other type, with the specified navigabilities, aggregations, names, lower bounds, and upper bounds, and owned by this type's nearest package. The navigability for the first end of the new association. The aggregation for the first end of the new association. The name for the first end of the new association. The lower bound for the first end of the new association. The upper bound for the first end of the new association. The type for the first end of the new association. The navigability for the second end of the new association. The aggregation for the second end of the new association. The name for the second end of the new association. The lower bound for the second end of the new association. The upper bound for the second end of the new association. Retrieves the associations in which this type is involved. The query conformsTo() gives true for a Type that conforms to another. By default, two Types do not conform to each other. This query is intended to be redefined for specific conformance situations. OCL result = (false) A TypedElement is a NamedElement that may have a Type specified for it. The type of the TypedElement. A Usage is a Dependency in which the client Element requires the supplier Element (or set of Elements) for its full implementation or operation. VisibilityKind is an enumeration type that defines literals to determine the visibility of Elements in a model. A Named Element with public visibility is visible to all elements that can access the contents of the Namespace that owns it. A NamedElement with private visibility is only visible inside the Namespace that owns it. A NamedElement with protected visibility is visible to Elements that have a generalization relationship to the Namespace that owns it. A NamedElement with package visibility is visible to all Elements within the nearest enclosing Package (given that other owning Elements have proper visibility). Outside the nearest enclosing Package, a NamedElement marked as having package visibility is not visible. Only NamedElements that are not owned by Packages can be marked as having package visibility. Indicates the dependencies that reference the supplier. An artifact is the specification of a physical piece of information that is used or produced by a software development process, or by deployment and operation of a system. Examples of artifacts include model files, source files, scripts, and binary executable files, a table in a database system, a development deliverable, or a word-processing document, a mail message. An artifact is the source of a deployment to a node. A concrete name that is used to refer to the Artifact in a physical context. Example: file system name, universal resource locator. The set of model elements that are manifested in the Artifact. That is, these model elements are utilized in the construction (or generation) of the artifact. The Artifacts that are defined (nested) within the Artifact. The association is a specialization of the ownedMember association from Namespace to NamedElement. The attributes or association ends defined for the Artifact. The association is a specialization of the ownedMember association. The Operations defined for the Artifact. The association is a specialization of the ownedMember association. Creates a property with the specified name, type, lower bound, and upper bound as an owned attribute of this artifact. The name for the new attribute, or null. The type for the new attribute, or null. The lower bound for the new attribute. The upper bound for the new attribute. Creates an operation with the specified name, parameter names, parameter types, and return type (or null) as an owned operation of this artifact. The name for the new operation, or null. The parameter names for the new operation, or null. The parameter types for the new operation, or null. The return type for the new operation, or null. A communication path is an association between two deployment targets, through which they are able to exchange signals and messages. The association ends of a CommunicationPath are typed by DeploymentTargets. OCL endType->forAll (oclIsKindOf(DeploymentTarget)) A deployed artifact is an artifact or artifact instance that has been deployed to a deployment target. A deployment is the allocation of an artifact or artifact instance to a deployment target. A component deployment is the deployment of one or more artifacts or artifact instances to a deployment target, optionally parameterized by a deployment specification. Examples are executables and configuration files. The specification of properties that parameterize the deployment and execution of one or more Artifacts. The Artifacts that are deployed onto a Node. This association specializes the supplier association. The DeployedTarget which is the target of a Deployment. A deployment specification specifies a set of properties that determine execution parameters of a component artifact that is deployed on a node. A deployment specification can be aimed at a specific type of container. An artifact that reifies or implements deployment specification properties is a deployment descriptor. The DeploymentTarget of a DeploymentSpecification is a kind of ExecutionEnvironment. OCL deployment->forAll (location.oclIsKindOf(ExecutionEnvironment)) The deployedElements of a DeploymentTarget that are involved in a Deployment that has an associated Deployment-Specification is a kind of Component (i.e., the configured components). OCL deployment->forAll (location.deployedElement->forAll (oclIsKindOf(Component))) The deployment with which the DeploymentSpecification is associated. The location where an Artifact is deployed onto a Node. This is typically a 'directory' or 'memory address.' The location where a component Artifact executes. This may be a local or remote location. A deployment target is the location for a deployed artifact. The set of elements that are manifested in an Artifact that is involved in Deployment to a DeploymentTarget. The set of Deployments for a DeploymentTarget. Derivation for DeploymentTarget::/deployedElement OCL result = (deployment.deployedArtifact->select(oclIsKindOf(Artifact))->collect(oclAsType(Artifact).manifestation)->collect(utilizedElement)->asSet()) A device is a physical computational resource with processing capability upon which artifacts may be deployed for execution. Devices may be complex (i.e., they may consist of other devices). An execution environment is a node that offers an execution environment for specific types of components that are deployed on it in the form of executable artifacts. A manifestation is the concrete physical rendering of one or more model elements by an artifact. The model element that is utilized in the manifestation in an Artifact. A Node is computational resource upon which artifacts may be deployed for execution. Nodes can be interconnected through communication paths to define network structures. The internal structure of a Node (if defined) consists solely of parts of type Node. OCL part->forAll(oclIsKindOf(Node)) The Nodes that are defined (nested) within the Node. Creates a (binary) communication path between this node and the specified other node, with the specified navigabilities, aggregations, names, lower bounds, and upper bounds, and owned by this node's nearest package. The navigability for the first end of the new communication path. The aggregation for the first end of the new communication path. The name for the first end of the new communication path. The lower bound for the first end of the new communication path. The upper bound for the first end of the new communication path. The type for the first end of the new communication path. The navigability for the second end of the new communication path. The aggregation for the second end of the new communication path. The name for the second end of the new communication path. The lower bound for the second end of the new communication path. The upper bound for the second end of the new communication path. Retrieves the communication paths in which this node is involved. InformationFlows describe circulation of information through a system in a general manner. They do not specify the nature of the information, mechanisms by which it is conveyed, sequences of exchange or any control conditions. During more detailed modeling, representation and realization links may be added to specify which model elements implement an InformationFlow and to show how information is conveyed. InformationFlows require some kind of “information channel” for unidirectional transmission of information items from sources to targets.  They specify the information channel’s realizations, if any, and identify the information that flows along them.  Information moving along the information channel may be represented by abstract InformationItems and by concrete Classifiers. The sources and targets of the information flow must conform to the sources and targets or conversely the targets and sources of the realization relationships. The sources and targets of the information flow can only be one of the following kind: Actor, Node, UseCase, Artifact, Class, Component, Port, Property, Interface, Package, ActivityNode, ActivityPartition, Behavior and InstanceSpecification except when its classifier is a relationship (i.e. it represents a link). OCL (self.informationSource->forAll( sis | oclIsKindOf(Actor) or oclIsKindOf(Node) or oclIsKindOf(UseCase) or oclIsKindOf(Artifact) or oclIsKindOf(Class) or oclIsKindOf(Component) or oclIsKindOf(Port) or oclIsKindOf(Property) or oclIsKindOf(Interface) or oclIsKindOf(Package) or oclIsKindOf(ActivityNode) or oclIsKindOf(ActivityPartition) or (oclIsKindOf(InstanceSpecification) and not sis.oclAsType(InstanceSpecification).classifier->exists(oclIsKindOf(Relationship))))) and (self.informationTarget->forAll( sit | oclIsKindOf(Actor) or oclIsKindOf(Node) or oclIsKindOf(UseCase) or oclIsKindOf(Artifact) or oclIsKindOf(Class) or oclIsKindOf(Component) or oclIsKindOf(Port) or oclIsKindOf(Property) or oclIsKindOf(Interface) or oclIsKindOf(Package) or oclIsKindOf(ActivityNode) or oclIsKindOf(ActivityPartition) or (oclIsKindOf(InstanceSpecification) and not sit.oclAsType(InstanceSpecification).classifier->exists(oclIsKindOf(Relationship))))) An information flow can only convey classifiers that are allowed to represent an information item. OCL self.conveyed->forAll(oclIsKindOf(Class) or oclIsKindOf(Interface) or oclIsKindOf(InformationItem) or oclIsKindOf(Signal) or oclIsKindOf(Component)) Specifies the information items that may circulate on this information flow. Defines from which source the conveyed InformationItems are initiated. Defines to which target the conveyed InformationItems are directed. Determines which Relationship will realize the specified flow. Determines which ActivityEdges will realize the specified flow. Determines which Connectors will realize the specified flow. Determines which Messages will realize the specified flow. InformationItems represent many kinds of information that can flow from sources to targets in very abstract ways.  They represent the kinds of information that may move within a system, but do not elaborate details of the transferred information.  Details of transferred information are the province of other Classifiers that may ultimately define InformationItems.  Consequently, InformationItems cannot be instantiated and do not themselves have features, generalizations, or associations. An important use of InformationItems is to represent information during early design stages, possibly before the detailed modeling decisions that will ultimately define them have been made. Another purpose of InformationItems is to abstract portions of complex models in less precise, but perhaps more general and communicable, ways. The sources and targets of an information item (its related information flows) must designate subsets of the sources and targets of the representation information item, if any. The Classifiers that can realize an information item can only be of the following kind: Class, Interface, InformationItem, Signal, Component. OCL (self.represented->select(oclIsKindOf(InformationItem))->forAll(p | p.conveyingFlow.source->forAll(q | self.conveyingFlow.source->includes(q)) and p.conveyingFlow.target->forAll(q | self.conveyingFlow.target->includes(q)))) and (self.represented->forAll(oclIsKindOf(Class) or oclIsKindOf(Interface) or oclIsKindOf(InformationItem) or oclIsKindOf(Signal) or oclIsKindOf(Component))) An informationItem has no feature, no generalization, and no associations. OCL self.generalization->isEmpty() and self.feature->isEmpty() It is not instantiable. OCL isAbstract Determines the classifiers that will specify the structure and nature of the information. An information item represents all its represented classifiers. An ActionExecutionSpecification is a kind of ExecutionSpecification representing the execution of an Action. The Action referenced by the ActionExecutionSpecification must be owned by the Interaction owning that ActionExecutionSpecification. OCL (enclosingInteraction->notEmpty() or enclosingOperand.combinedFragment->notEmpty()) and let parentInteraction : Set(Interaction) = enclosingInteraction.oclAsType(Interaction)->asSet()->union( enclosingOperand.combinedFragment->closure(enclosingOperand.combinedFragment)-> collect(enclosingInteraction).oclAsType(Interaction)->asSet()) in (parentInteraction->size() = 1) and self.action.interaction->asSet() = parentInteraction Action whose execution is occurring. A BehaviorExecutionSpecification is a kind of ExecutionSpecification representing the execution of a Behavior. Behavior whose execution is occurring. A CombinedFragment defines an expression of InteractionFragments. A CombinedFragment is defined by an interaction operator and corresponding InteractionOperands. Through the use of CombinedFragments the user will be able to describe a number of traces in a compact and concise manner. If the interactionOperator is break, the corresponding InteractionOperand must cover all Lifelines covered by the enclosing InteractionFragment. OCL interactionOperator=InteractionOperatorKind::break implies enclosingInteraction.oclAsType(InteractionFragment)->asSet()->union( enclosingOperand.oclAsType(InteractionFragment)->asSet()).covered->asSet() = self.covered->asSet() The interaction operators 'consider' and 'ignore' can only be used for the ConsiderIgnoreFragment subtype of CombinedFragment OCL ((interactionOperator = InteractionOperatorKind::consider) or (interactionOperator = InteractionOperatorKind::ignore)) implies oclIsKindOf(ConsiderIgnoreFragment) If the interactionOperator is opt, loop, break, assert or neg, there must be exactly one operand. OCL (interactionOperator = InteractionOperatorKind::opt or interactionOperator = InteractionOperatorKind::loop or interactionOperator = InteractionOperatorKind::break or interactionOperator = InteractionOperatorKind::assert or interactionOperator = InteractionOperatorKind::neg) implies operand->size()=1 Specifies the gates that form the interface between this CombinedFragment and its surroundings Specifies the operation which defines the semantics of this combination of InteractionFragments. The set of operands of the combined fragment. A ConsiderIgnoreFragment is a kind of CombinedFragment that is used for the consider and ignore cases, which require lists of pertinent Messages to be specified. The interaction operator of a ConsiderIgnoreFragment must be either 'consider' or 'ignore'. OCL (interactionOperator = InteractionOperatorKind::consider) or (interactionOperator = InteractionOperatorKind::ignore) The NamedElements must be of a type of element that can be a signature for a message (i.e.., an Operation, or a Signal). OCL message->forAll(m | m.oclIsKindOf(Operation) or m.oclIsKindOf(Signal)) The set of messages that apply to this fragment. A Continuation is a syntactic way to define continuations of different branches of an alternative CombinedFragment. Continuations are intuitively similar to labels representing intermediate points in a flow of control. Continuations always occur as the very first InteractionFragment or the very last InteractionFragment of the enclosing InteractionOperand. OCL enclosingOperand->notEmpty() and let peerFragments : OrderedSet(InteractionFragment) = enclosingOperand.fragment in ( peerFragments->notEmpty() and ((peerFragments->first() = self) or (peerFragments->last() = self))) Across all Interaction instances having the same context value, every Lifeline instance covered by a Continuation (self) must be common with one covered Lifeline instance of all other Continuation instances with the same name as self, and every Lifeline instance covered by a Continuation instance with the same name as self must be common with one covered Lifeline instance of self. Lifeline instances are common if they have the same selector and represents associationEnd values. OCL enclosingOperand.combinedFragment->notEmpty() and let parentInteraction : Set(Interaction) = enclosingOperand.combinedFragment->closure(enclosingOperand.combinedFragment)-> collect(enclosingInteraction).oclAsType(Interaction)->asSet() in (parentInteraction->size() = 1) and let peerInteractions : Set(Interaction) = (parentInteraction->union(parentInteraction->collect(_'context')->collect(behavior)-> select(oclIsKindOf(Interaction)).oclAsType(Interaction)->asSet())->asSet()) in (peerInteractions->notEmpty()) and let combinedFragments1 : Set(CombinedFragment) = peerInteractions.fragment-> select(oclIsKindOf(CombinedFragment)).oclAsType(CombinedFragment)->asSet() in combinedFragments1->notEmpty() and combinedFragments1->closure(operand.fragment-> select(oclIsKindOf(CombinedFragment)).oclAsType(CombinedFragment))->asSet().operand.fragment-> select(oclIsKindOf(Continuation)).oclAsType(Continuation)->asSet()-> forAll(c : Continuation | (c.name = self.name) implies (c.covered->asSet()->forAll(cl : Lifeline | -- cl must be common to one lifeline covered by self self.covered->asSet()-> select(represents = cl.represents and selector = cl.selector)->asSet()->size()=1)) and (self.covered->asSet()->forAll(cl : Lifeline | -- cl must be common to one lifeline covered by c c.covered->asSet()-> select(represents = cl.represents and selector = cl.selector)->asSet()->size()=1)) ) Continuations are always global in the enclosing InteractionFragment e.g., it always covers all Lifelines covered by the enclosing InteractionOperator. OCL enclosingOperand->notEmpty() and let operandLifelines : Set(Lifeline) = enclosingOperand.covered in (operandLifelines->notEmpty() and operandLifelines->forAll(ol :Lifeline |self.covered->includes(ol))) True: when the Continuation is at the end of the enclosing InteractionFragment and False when it is in the beginning. A DestructionOccurenceSpecification models the destruction of an object. No other OccurrenceSpecifications on a given Lifeline in an InteractionOperand may appear below a DestructionOccurrenceSpecification. OCL let o : InteractionOperand = enclosingOperand in o->notEmpty() and let peerEvents : OrderedSet(OccurrenceSpecification) = covered.events->select(enclosingOperand = o) in peerEvents->last() = self An ExecutionOccurrenceSpecification represents moments in time at which Actions or Behaviors start or finish. References the execution specification describing the execution that is started or finished at this execution event. An ExecutionSpecification is a specification of the execution of a unit of Behavior or Action within the Lifeline. The duration of an ExecutionSpecification is represented by two OccurrenceSpecifications, the start OccurrenceSpecification and the finish OccurrenceSpecification. The startEvent and the finishEvent must be on the same Lifeline. OCL start.covered = finish.covered References the OccurrenceSpecification that designates the finish of the Action or Behavior. References the OccurrenceSpecification that designates the start of the Action or Behavior. A Gate is a MessageEnd which serves as a connection point for relating a Message which has a MessageEnd (sendEvent / receiveEvent) outside an InteractionFragment with another Message which has a MessageEnd (receiveEvent / sendEvent) inside that InteractionFragment. If this Gate is an actualGate, it must have exactly one matching formalGate within the referred Interaction. OCL interactionUse->notEmpty() implies interactionUse.refersTo.formalGate->select(matches(self))->size()=1 If this Gate is inside a CombinedFragment, it must have exactly one matching Gate which is outside of that CombinedFragment. OCL isInsideCF() implies combinedFragment.cfragmentGate->select(isOutsideCF() and matches(self))->size()=1 If this Gate is outside an 'alt' CombinedFragment, for every InteractionOperator inside that CombinedFragment there must be exactly one matching Gate inside the CombindedFragment with its opposing end enclosed by that InteractionOperator. If this Gate is outside CombinedFragment with operator other than 'alt', there must be exactly one matching Gate inside that CombinedFragment. OCL isOutsideCF() implies if self.combinedFragment.interactionOperator->asOrderedSet()->first() = InteractionOperatorKind::alt then self.combinedFragment.operand->forAll(op : InteractionOperand | self.combinedFragment.cfragmentGate->select(isInsideCF() and oppositeEnd().enclosingFragment()->includes(self.combinedFragment) and matches(self))->size()=1) else self.combinedFragment.cfragmentGate->select(isInsideCF() and matches(self))->size()=1 endif isFormal() implies that no other formalGate of the parent Interaction returns the same getName() as returned for self OCL isFormal() implies interaction.formalGate->select(getName() = self.getName())->size()=1 isActual() implies that no other actualGate of the parent InteractionUse returns the same getName() as returned for self OCL isActual() implies interactionUse.actualGate->select(getName() = self.getName())->size()=1 isOutsideCF() implies that no other outside cfragmentGate of the parent CombinedFragment returns the same getName() as returned for self OCL isOutsideCF() implies combinedFragment.cfragmentGate->select(getName() = self.getName())->size()=1 isInsideCF() implies that no other inside cfragmentGate attached to a message with its other end in the same InteractionOperator as self, returns the same getName() as returned for self OCL isInsideCF() implies let selfOperand : InteractionOperand = self.getOperand() in combinedFragment.cfragmentGate->select(isInsideCF() and getName() = self.getName())->select(getOperand() = selfOperand)->size()=1 This query returns true if this Gate is attached to the boundary of a CombinedFragment, and its other end (if present) is outside of the same CombinedFragment. OCL result = (self.oppositeEnd()-> notEmpty() and combinedFragment->notEmpty() implies let oppEnd : MessageEnd = self.oppositeEnd()->asOrderedSet()->first() in if oppEnd.oclIsKindOf(MessageOccurrenceSpecification) then let oppMOS : MessageOccurrenceSpecification = oppEnd.oclAsType(MessageOccurrenceSpecification) in self.combinedFragment.enclosingInteraction.oclAsType(InteractionFragment)->asSet()-> union(self.combinedFragment.enclosingOperand.oclAsType(InteractionFragment)->asSet()) = oppMOS.enclosingInteraction.oclAsType(InteractionFragment)->asSet()-> union(oppMOS.enclosingOperand.oclAsType(InteractionFragment)->asSet()) else let oppGate : Gate = oppEnd.oclAsType(Gate) in self.combinedFragment.enclosingInteraction.oclAsType(InteractionFragment)->asSet()-> union(self.combinedFragment.enclosingOperand.oclAsType(InteractionFragment)->asSet()) = oppGate.combinedFragment.enclosingInteraction.oclAsType(InteractionFragment)->asSet()-> union(oppGate.combinedFragment.enclosingOperand.oclAsType(InteractionFragment)->asSet()) endif) This query returns true if this Gate is attached to the boundary of a CombinedFragment, and its other end (if present) is inside of an InteractionOperator of the same CombinedFragment. OCL result = (self.oppositeEnd()-> notEmpty() and combinedFragment->notEmpty() implies let oppEnd : MessageEnd = self.oppositeEnd()->asOrderedSet()->first() in if oppEnd.oclIsKindOf(MessageOccurrenceSpecification) then let oppMOS : MessageOccurrenceSpecification = oppEnd.oclAsType(MessageOccurrenceSpecification) in combinedFragment = oppMOS.enclosingOperand.combinedFragment else let oppGate : Gate = oppEnd.oclAsType(Gate) in combinedFragment = oppGate.combinedFragment.enclosingOperand.combinedFragment endif) This query returns true value if this Gate is an actualGate of an InteractionUse. OCL result = (interactionUse->notEmpty()) This query returns true if this Gate is a formalGate of an Interaction. <p>interaction-&gt;notEmpty()</p> OCL result = (interaction->notEmpty()) This query returns the name of the gate, either the explicit name (.name) or the constructed name ('out_" or 'in_' concatenated in front of .message.name) if the explicit name is not present. OCL result = (if name->notEmpty() then name->asOrderedSet()->first() else if isActual() or isOutsideCF() then if isSend() then 'out_'.concat(self.message.name->asOrderedSet()->first()) else 'in_'.concat(self.message.name->asOrderedSet()->first()) endif else if isSend() then 'in_'.concat(self.message.name->asOrderedSet()->first()) else 'out_'.concat(self.message.name->asOrderedSet()->first()) endif endif endif) This query returns true if the name of this Gate matches the name of the in parameter Gate, and the messages for the two Gates correspond. The Message for one Gate (say A) corresponds to the Message for another Gate (say B) if (A and B have the same name value) and (if A is a sendEvent then B is a receiveEvent) and (if A is a receiveEvent then B is a sendEvent) and (A and B have the same messageSort value) and (A and B have the same signature value). OCL result = (self.getName() = gateToMatch.getName() and self.message.messageSort = gateToMatch.message.messageSort and self.message.name = gateToMatch.message.name and self.message.sendEvent->includes(self) implies gateToMatch.message.receiveEvent->includes(gateToMatch) and self.message.receiveEvent->includes(self) implies gateToMatch.message.sendEvent->includes(gateToMatch) and self.message.signature = gateToMatch.message.signature) The query isDistinguishableFrom() specifies that two Gates may coexist in the same Namespace, without an explicit name property. The association end formalGate subsets ownedElement, and since the Gate name attribute is optional, it is allowed to have two formal gates without an explicit name, but having derived names which are distinct. OCL result = (true) If the Gate is an inside Combined Fragment Gate, this operation returns the InteractionOperand that the opposite end of this Gate is included within. OCL result = (if isInsideCF() then let oppEnd : MessageEnd = self.oppositeEnd()->asOrderedSet()->first() in if oppEnd.oclIsKindOf(MessageOccurrenceSpecification) then let oppMOS : MessageOccurrenceSpecification = oppEnd.oclAsType(MessageOccurrenceSpecification) in oppMOS.enclosingOperand->asOrderedSet()->first() else let oppGate : Gate = oppEnd.oclAsType(Gate) in oppGate.combinedFragment.enclosingOperand->asOrderedSet()->first() endif else null endif) A GeneralOrdering represents a binary relation between two OccurrenceSpecifications, to describe that one OccurrenceSpecification must occur before the other in a valid trace. This mechanism provides the ability to define partial orders of OccurrenceSpecifications that may otherwise not have a specified order. An occurrence specification must not be ordered relative to itself through a series of general orderings. (In other words, the transitive closure of the general orderings is irreflexive.) OCL after->closure(toAfter.after)->excludes(before) The OccurrenceSpecification referenced comes after the OccurrenceSpecification referenced by before. The OccurrenceSpecification referenced comes before the OccurrenceSpecification referenced by after. An Interaction is a unit of Behavior that focuses on the observable exchange of information between connectable elements. An Interaction instance must not be contained within another Interaction instance. OCL enclosingInteraction->isEmpty() Actions owned by the Interaction. Specifies the gates that form the message interface between this Interaction and any InteractionUses which reference it. The ordered set of fragments in the Interaction. Specifies the participants in this Interaction. The Messages contained in this Interaction. An InteractionConstraint is a Boolean expression that guards an operand in a CombinedFragment. Minint/maxint can only be present if the InteractionConstraint is associated with the operand of a loop CombinedFragment. OCL maxint->notEmpty() or minint->notEmpty() implies interactionOperand.combinedFragment.interactionOperator = InteractionOperatorKind::loop If minint is specified, then the expression must evaluate to a non-negative integer. OCL minint->notEmpty() implies minint->asSequence()->first().integerValue() >= 0 If maxint is specified, then the expression must evaluate to a positive integer. OCL maxint->notEmpty() implies maxint->asSequence()->first().integerValue() > 0 The dynamic variables that take part in the constraint must be owned by the ConnectableElement corresponding to the covered Lifeline. The constraint may contain references to global data or write-once data. If maxint is specified, then minint must be specified and the evaluation of maxint must be >= the evaluation of minint. OCL maxint->notEmpty() implies (minint->notEmpty() and maxint->asSequence()->first().integerValue() >= minint->asSequence()->first().integerValue() ) The maximum number of iterations of a loop The minimum number of iterations of a loop InteractionFragment is an abstract notion of the most general interaction unit. An InteractionFragment is a piece of an Interaction. Each InteractionFragment is conceptually like an Interaction by itself. References the Lifelines that the InteractionFragment involves. The Interaction enclosing this InteractionFragment. The operand enclosing this InteractionFragment (they may nest recursively). The general ordering relationships contained in this fragment. An InteractionOperand is contained in a CombinedFragment. An InteractionOperand represents one operand of the expression given by the enclosing CombinedFragment. The guard must contain only references to values local to the Lifeline on which it resides, or values global to the whole Interaction. The guard must be placed directly prior to (above) the OccurrenceSpecification that will become the first OccurrenceSpecification within this InteractionOperand. The fragments of the operand. Constraint of the operand. An InteractionUse refers to an Interaction. The InteractionUse is a shorthand for copying the contents of the referenced Interaction where the InteractionUse is. To be accurate the copying must take into account substituting parameters with arguments and connect the formal Gates with the actual ones. Actual Gates of the InteractionUse must match Formal Gates of the referred Interaction. Gates match when their names are equal and their messages correspond. OCL actualGate->notEmpty() implies refersTo.formalGate->forAll( fg : Gate | self.actualGate->select(matches(fg))->size()=1) and self.actualGate->forAll(ag : Gate | refersTo.formalGate->select(matches(ag))->size()=1) The arguments must only be constants, parameters of the enclosing Interaction or attributes of the classifier owning the enclosing Interaction. The returnValueRecipient must be a Property of a ConnectableElement that is represented by a Lifeline covered by this InteractionUse. OCL returnValueRecipient->asSet()->notEmpty() implies let covCE : Set(ConnectableElement) = covered.represents->asSet() in covCE->notEmpty() and let classes:Set(Classifier) = covCE.type.oclIsKindOf(Classifier).oclAsType(Classifier)->asSet() in let allProps : Set(Property) = classes.attribute->union(classes.allParents().attribute)->asSet() in allProps->includes(returnValueRecipient) The arguments of the InteractionUse must correspond to parameters of the referred Interaction. The type of the returnValue must correspond to the type of the returnValueRecipient. OCL returnValue.type->asSequence()->notEmpty() implies returnValue.type->asSequence()->first() = returnValueRecipient.type->asSequence()->first() The InteractionUse must cover all Lifelines of the enclosing Interaction that are common with the lifelines covered by the referred Interaction. Lifelines are common if they have the same selector and represents associationEnd values. OCL let parentInteraction : Set(Interaction) = enclosingInteraction->asSet()-> union(enclosingOperand.combinedFragment->closure(enclosingOperand.combinedFragment)-> collect(enclosingInteraction).oclAsType(Interaction)->asSet()) in parentInteraction->size()=1 and let refInteraction : Interaction = refersTo in parentInteraction.covered-> forAll(intLifeline : Lifeline | refInteraction.covered-> forAll( refLifeline : Lifeline | refLifeline.represents = intLifeline.represents and ( ( refLifeline.selector.oclIsKindOf(LiteralString) implies intLifeline.selector.oclIsKindOf(LiteralString) and refLifeline.selector.oclAsType(LiteralString).value = intLifeline.selector.oclAsType(LiteralString).value ) and ( refLifeline.selector.oclIsKindOf(LiteralInteger) implies intLifeline.selector.oclIsKindOf(LiteralInteger) and refLifeline.selector.oclAsType(LiteralInteger).value = intLifeline.selector.oclAsType(LiteralInteger).value ) ) implies self.covered->asSet()->includes(intLifeline))) The actual gates of the InteractionUse. The actual arguments of the Interaction. Refers to the Interaction that defines its meaning. The value of the executed Interaction. The recipient of the return value. A Lifeline represents an individual participant in the Interaction. While parts and structural features may have multiplicity greater than 1, Lifelines represent only one interacting entity. The selector for a Lifeline must only be specified if the referenced Part is multivalued. OCL self.selector->notEmpty() = (self.represents.oclIsKindOf(MultiplicityElement) and self.represents.oclAsType(MultiplicityElement).isMultivalued()) If a lifeline is in an Interaction referred to by an InteractionUse in an enclosing Interaction, and that lifeline is common with another lifeline in an Interaction referred to by another InteractonUse within that same enclosing Interaction, it must be common to a lifeline within that enclosing Interaction. By common Lifelines we mean Lifelines with the same selector and represents associations. OCL let intUses : Set(InteractionUse) = interaction.interactionUse in intUses->forAll ( iuse : InteractionUse | let usingInteraction : Set(Interaction) = iuse.enclosingInteraction->asSet() ->union( iuse.enclosingOperand.combinedFragment->asSet()->closure(enclosingOperand.combinedFragment).enclosingInteraction->asSet() ) in let peerUses : Set(InteractionUse) = usingInteraction.fragment->select(oclIsKindOf(InteractionUse)).oclAsType(InteractionUse)->asSet() ->union( usingInteraction.fragment->select(oclIsKindOf(CombinedFragment)).oclAsType(CombinedFragment)->asSet() ->closure(operand.fragment->select(oclIsKindOf(CombinedFragment)).oclAsType(CombinedFragment)).operand.fragment-> select(oclIsKindOf(InteractionUse)).oclAsType(InteractionUse)->asSet() )->excluding(iuse) in peerUses->forAll( peerUse : InteractionUse | peerUse.refersTo.lifeline->forAll( l : Lifeline | (l.represents = self.represents and ( self.selector.oclIsKindOf(LiteralString) implies l.selector.oclIsKindOf(LiteralString) and self.selector.oclAsType(LiteralString).value = l.selector.oclAsType(LiteralString).value ) and ( self.selector.oclIsKindOf(LiteralInteger) implies l.selector.oclIsKindOf(LiteralInteger) and self.selector.oclAsType(LiteralInteger).value = l.selector.oclAsType(LiteralInteger).value ) ) implies usingInteraction.lifeline->exists(represents = self.represents and ( self.selector.oclIsKindOf(LiteralString) implies l.selector.oclIsKindOf(LiteralString) and self.selector.oclAsType(LiteralString).value = l.selector.oclAsType(LiteralString).value ) and ( self.selector.oclIsKindOf(LiteralInteger) implies l.selector.oclIsKindOf(LiteralInteger) and self.selector.oclAsType(LiteralInteger).value = l.selector.oclAsType(LiteralInteger).value ) ) ) ) ) The classifier containing the referenced ConnectableElement must be the same classifier, or an ancestor, of the classifier that contains the interaction enclosing this lifeline. OCL represents.namespace->closure(namespace)->includes(interaction._'context') The selector value, if present, must be a LiteralString or a LiteralInteger OCL self.selector->notEmpty() implies self.selector.oclIsKindOf(LiteralInteger) or self.selector.oclIsKindOf(LiteralString) References the InteractionFragments in which this Lifeline takes part. References the Interaction that represents the decomposition. References the Interaction enclosing this Lifeline. References the ConnectableElement within the classifier that contains the enclosing interaction. If the referenced ConnectableElement is multivalued, then this specifies the specific individual part within that set. A Message defines a particular communication between Lifelines of an Interaction. If the sendEvent and the receiveEvent of the same Message are on the same Lifeline, the sendEvent must be ordered before the receiveEvent. OCL receiveEvent.oclIsKindOf(MessageOccurrenceSpecification) implies let f : Lifeline = sendEvent->select(oclIsKindOf(MessageOccurrenceSpecification)).oclAsType(MessageOccurrenceSpecification)->asOrderedSet()->first().covered in f = receiveEvent->select(oclIsKindOf(MessageOccurrenceSpecification)).oclAsType(MessageOccurrenceSpecification)->asOrderedSet()->first().covered implies f.events->indexOf(sendEvent.oclAsType(MessageOccurrenceSpecification)->asOrderedSet()->first() ) < f.events->indexOf(receiveEvent.oclAsType(MessageOccurrenceSpecification)->asOrderedSet()->first() ) Arguments of a Message must only be: i) attributes of the sending lifeline, ii) constants, iii) symbolic values (which are wildcard values representing any legal value), iv) explicit parameters of the enclosing Interaction, v) attributes of the class owning the Interaction. Messages cannot cross boundaries of CombinedFragments or their operands. This is true if and only if both MessageEnds are enclosed within the same InteractionFragment (i.e., an InteractionOperand or an Interaction). OCL sendEvent->notEmpty() and receiveEvent->notEmpty() implies let sendEnclosingFrag : Set(InteractionFragment) = sendEvent->asOrderedSet()->first().enclosingFragment() in let receiveEnclosingFrag : Set(InteractionFragment) = receiveEvent->asOrderedSet()->first().enclosingFragment() in sendEnclosingFrag = receiveEnclosingFrag In the case when the Message signature is a Signal, the arguments of the Message must correspond to the attributes of the Signal. A Message Argument corresponds to a Signal Attribute if the Argument is of the same Class or a specialization of that of the Attribute. OCL (messageSort = MessageSort::asynchSignal ) and signature.oclIsKindOf(Signal) implies let signalAttributes : OrderedSet(Property) = signature.oclAsType(Signal).inheritedMember()-> select(n:NamedElement | n.oclIsTypeOf(Property))->collect(oclAsType(Property))->asOrderedSet() in signalAttributes->size() = self.argument->size() and self.argument->forAll( o: ValueSpecification | not (o.oclIsKindOf(Expression) and o.oclAsType(Expression).symbol->size()=0 and o.oclAsType(Expression).operand->isEmpty() ) implies let p : Property = signalAttributes->at(self.argument->indexOf(o)) in o.type.oclAsType(Classifier).conformsTo(p.type.oclAsType(Classifier))) If the MessageEnds are both OccurrenceSpecifications, then the connector must go between the Parts represented by the Lifelines of the two MessageEnds. The signature must either refer an Operation (in which case messageSort is either synchCall or asynchCall or reply) or a Signal (in which case messageSort is asynchSignal). The name of the NamedElement referenced by signature must be the same as that of the Message. OCL signature->notEmpty() implies ((signature.oclIsKindOf(Operation) and (messageSort = MessageSort::asynchCall or messageSort = MessageSort::synchCall or messageSort = MessageSort::reply) ) or (signature.oclIsKindOf(Signal) and messageSort = MessageSort::asynchSignal ) ) and name = signature.name In the case when a Message with messageSort synchCall or asynchCall has a non empty Operation signature, the arguments of the Message must correspond to the in and inout parameters of the Operation. A Parameter corresponds to an Argument if the Argument is of the same Class or a specialization of that of the Parameter. OCL (messageSort = MessageSort::asynchCall or messageSort = MessageSort::synchCall) and signature.oclIsKindOf(Operation) implies let requestParms : OrderedSet(Parameter) = signature.oclAsType(Operation).ownedParameter-> select(direction = ParameterDirectionKind::inout or direction = ParameterDirectionKind::_'in' ) in requestParms->size() = self.argument->size() and self.argument->forAll( o: ValueSpecification | not (o.oclIsKindOf(Expression) and o.oclAsType(Expression).symbol->size()=0 and o.oclAsType(Expression).operand->isEmpty() ) implies let p : Parameter = requestParms->at(self.argument->indexOf(o)) in o.type.oclAsType(Classifier).conformsTo(p.type.oclAsType(Classifier)) ) In the case when a Message with messageSort reply has a non empty Operation signature, the arguments of the Message must correspond to the out, inout, and return parameters of the Operation. A Parameter corresponds to an Argument if the Argument is of the same Class or a specialization of that of the Parameter. OCL (messageSort = MessageSort::reply) and signature.oclIsKindOf(Operation) implies let replyParms : OrderedSet(Parameter) = signature.oclAsType(Operation).ownedParameter-> select(direction = ParameterDirectionKind::inout or direction = ParameterDirectionKind::out or direction = ParameterDirectionKind::return) in replyParms->size() = self.argument->size() and self.argument->forAll( o: ValueSpecification | o.oclIsKindOf(Expression) and let e : Expression = o.oclAsType(Expression) in e.operand->notEmpty() implies let p : Parameter = replyParms->at(self.argument->indexOf(o)) in e.operand->asSequence()->first().type.oclAsType(Classifier).conformsTo(p.type.oclAsType(Classifier)) ) The arguments of the Message. The Connector on which this Message is sent. The enclosing Interaction owning the Message. The derived kind of the Message (complete, lost, found, or unknown). The sort of communication reflected by the Message. References the Receiving of the Message. References the Sending of the Message. The signature of the Message is the specification of its content. It refers either an Operation or a Signal. This query returns the MessageKind value for this Message. OCL result = (messageKind) The query isDistinguishableFrom() specifies that any two Messages may coexist in the same Namespace, regardless of their names. OCL result = (true) MessageEnd is an abstract specialization of NamedElement that represents what can occur at the end of a Message. References a Message. This query returns a set including the MessageEnd (if exists) at the opposite end of the Message for this MessageEnd. OCL message->notEmpty() OCL result = (message->asSet().messageEnd->asSet()->excluding(self)) This query returns value true if this MessageEnd is a sendEvent. OCL message->notEmpty() OCL result = (message.sendEvent->asSet()->includes(self)) This query returns value true if this MessageEnd is a receiveEvent. <p>message-&gt;notEmpty()</p> OCL message->notEmpty() OCL result = (message.receiveEvent->asSet()->includes(self)) This query returns a set including the enclosing InteractionFragment this MessageEnd is enclosed within. OCL result = (if self->select(oclIsKindOf(Gate))->notEmpty() then -- it is a Gate let endGate : Gate = self->select(oclIsKindOf(Gate)).oclAsType(Gate)->asOrderedSet()->first() in if endGate.isOutsideCF() then endGate.combinedFragment.enclosingInteraction.oclAsType(InteractionFragment)->asSet()-> union(endGate.combinedFragment.enclosingOperand.oclAsType(InteractionFragment)->asSet()) else if endGate.isInsideCF() then endGate.combinedFragment.oclAsType(InteractionFragment)->asSet() else if endGate.isFormal() then endGate.interaction.oclAsType(InteractionFragment)->asSet() else if endGate.isActual() then endGate.interactionUse.enclosingInteraction.oclAsType(InteractionFragment)->asSet()-> union(endGate.interactionUse.enclosingOperand.oclAsType(InteractionFragment)->asSet()) else null endif endif endif endif else -- it is a MessageOccurrenceSpecification let endMOS : MessageOccurrenceSpecification = self->select(oclIsKindOf(MessageOccurrenceSpecification)).oclAsType(MessageOccurrenceSpecification)->asOrderedSet()->first() in if endMOS.enclosingInteraction->notEmpty() then endMOS.enclosingInteraction.oclAsType(InteractionFragment)->asSet() else endMOS.enclosingOperand.oclAsType(InteractionFragment)->asSet() endif endif) A MessageOccurrenceSpecification specifies the occurrence of Message events, such as sending and receiving of Signals or invoking or receiving of Operation calls. A MessageOccurrenceSpecification is a kind of MessageEnd. Messages are generated either by synchronous Operation calls or asynchronous Signal sends. They are received by the execution of corresponding AcceptEventActions. An OccurrenceSpecification is the basic semantic unit of Interactions. The sequences of occurrences specified by them are the meanings of Interactions. References the Lifeline on which the OccurrenceSpecification appears. References the GeneralOrderings that specify EventOcurrences that must occur after this OccurrenceSpecification. References the GeneralOrderings that specify EventOcurrences that must occur before this OccurrenceSpecification. Returns the Lifeline on which the OccurrenceSpecification appears. Sets the Lifeline on which the OccurrenceSpecification appears. A PartDecomposition is a description of the internal Interactions of one Lifeline relative to an Interaction. Assume that within Interaction X, Lifeline L is of class C and decomposed to D. Assume also that there is within X an InteractionUse (say) U that covers L. According to the constraint above U will have a counterpart CU within D. Within the Interaction referenced by U, L should also be decomposed, and the decomposition should reference CU. (This rule is called commutativity of decomposition.) Assume that within Interaction X, Lifeline L is of class C and decomposed to D. Within X there is a sequence of constructs along L (such constructs are CombinedFragments, InteractionUse and (plain) OccurrenceSpecifications). Then a corresponding sequence of constructs must appear within D, matched one-to-one in the same order. i) CombinedFragment covering L are matched with an extra-global CombinedFragment in D. ii) An InteractionUse covering L is matched with a global (i.e., covering all Lifelines) InteractionUse in D. iii) A plain OccurrenceSpecification on L is considered an actualGate that must be matched by a formalGate of D. PartDecompositions apply only to Parts that are Parts of Internal Structures not to Parts of Collaborations. A StateInvariant is a runtime constraint on the participants of the Interaction. It may be used to specify a variety of different kinds of Constraints, such as values of Attributes or Variables, internal or external States, and so on. A StateInvariant is an InteractionFragment and it is placed on a Lifeline. References the Lifeline on which the StateInvariant appears. A Constraint that should hold at runtime for this StateInvariant. InteractionOperatorKind is an enumeration designating the different kinds of operators of CombinedFragments. The InteractionOperand defines the type of operator of a CombinedFragment. The InteractionOperatorKind seq designates that the CombinedFragment represents a weak sequencing between the behaviors of the operands. The InteractionOperatorKind alt designates that the CombinedFragment represents a choice of behavior. At most one of the operands will be chosen. The chosen operand must have an explicit or implicit guard expression that evaluates to true at this point in the interaction. An implicit true guard is implied if the operand has no guard. The InteractionOperatorKind opt designates that the CombinedFragment represents a choice of behavior where either the (sole) operand happens or nothing happens. An option is semantically equivalent to an alternative CombinedFragment where there is one operand with non-empty content and the second operand is empty. The InteractionOperatorKind break designates that the CombinedFragment represents a breaking scenario in the sense that the operand is a scenario that is performed instead of the remainder of the enclosing InteractionFragment. A break operator with a guard is chosen when the guard is true and the rest of the enclosing Interaction Fragment is ignored. When the guard of the break operand is false, the break operand is ignored and the rest of the enclosing InteractionFragment is chosen. The choice between a break operand without a guard and the rest of the enclosing InteractionFragment is done non-deterministically. The InteractionOperatorKind par designates that the CombinedFragment represents a parallel merge between the behaviors of the operands. The OccurrenceSpecifications of the different operands can be interleaved in any way as long as the ordering imposed by each operand as such is preserved. The InteractionOperatorKind strict designates that the CombinedFragment represents a strict sequencing between the behaviors of the operands. The semantics of strict sequencing defines a strict ordering of the operands on the first level within the CombinedFragment with interactionOperator strict. Therefore OccurrenceSpecifications within contained CombinedFragment will not directly be compared with other OccurrenceSpecifications of the enclosing CombinedFragment. The InteractionOperatorKind loop designates that the CombinedFragment represents a loop. The loop operand will be repeated a number of times. The InteractionOperatorKind critical designates that the CombinedFragment represents a critical region. A critical region means that the traces of the region cannot be interleaved by other OccurrenceSpecifications (on those Lifelines covered by the region). This means that the region is treated atomically by the enclosing fragment when determining the set of valid traces. Even though enclosing CombinedFragments may imply that some OccurrenceSpecifications may interleave into the region, such as with par-operator, this is prevented by defining a region. The InteractionOperatorKind neg designates that the CombinedFragment represents traces that are defined to be invalid. The InteractionOperatorKind assert designates that the CombinedFragment represents an assertion. The sequences of the operand of the assertion are the only valid continuations. All other continuations result in an invalid trace. The InteractionOperatorKind ignore designates that there are some message types that are not shown within this combined fragment. These message types can be considered insignificant and are implicitly ignored if they appear in a corresponding execution. Alternatively, one can understand ignore to mean that the message types that are ignored can appear anywhere in the traces. The InteractionOperatorKind consider designates which messages should be considered within this combined fragment. This is equivalent to defining every other message to be ignored. This is an enumerated type that identifies the type of Message. sendEvent and receiveEvent are present sendEvent present and receiveEvent absent sendEvent absent and receiveEvent present sendEvent and receiveEvent absent (should not appear) This is an enumerated type that identifies the type of communication action that was used to generate the Message. The message was generated by a synchronous call to an operation. The message was generated by an asynchronous call to an operation; i.e., a CallAction with isSynchronous = false. The message was generated by an asynchronous send action. The message designating the creation of another lifeline object. The message designating the termination of another lifeline. The message is a reply message to an operation call. If a Part has multiplicity, multiple lifelines might be used to show it. This association shows the lifelines that make up an interaction. A lifeline may be part of more than one interaction use. The event shows the time point at which the action completes execution. The event shows the time point at which the action begins execution. An extension is used to indicate that the properties of a metaclass are extended through a stereotype, and gives the ability to flexibly add (and later remove) stereotypes to classes. The non-owned end of an Extension is typed by a Class. OCL metaclassEnd()->notEmpty() and metaclassEnd().type.oclIsKindOf(Class) An Extension is binary, i.e., it has only two memberEnds. OCL memberEnd->size() = 2 Indicates whether an instance of the extending stereotype must be created when an instance of the extended class is created. The attribute value is derived from the value of the lower property of the ExtensionEnd referenced by Extension::ownedEnd; a lower value of 1 means that isRequired is true, but otherwise it is false. Since the default value of ExtensionEnd::lower is 0, the default value of isRequired is false. References the Class that is extended through an Extension. The property is derived from the type of the memberEnd that is not the ownedEnd. References the end of the extension that is typed by a Stereotype. Retrieves the stereotype that extends a metaclass through this extension. Retrieves the extension end that is typed by a stereotype (as opposed to a metaclass). The query isRequired() is true if the owned end has a multiplicity with the lower bound of 1. OCL result = (ownedEnd.lowerBound() = 1) The query metaclass() returns the metaclass that is being extended (as opposed to the extending stereotype). OCL result = (metaclassEnd().type.oclAsType(Class)) The query metaclassEnd() returns the Property that is typed by a metaclass (as opposed to a stereotype). OCL result = (memberEnd->reject(p | ownedEnd->includes(p.oclAsType(ExtensionEnd)))->any(true)) An extension end is used to tie an extension to a stereotype when extending a metaclass. The default multiplicity of an extension end is 0..1. The multiplicity of ExtensionEnd is 0..1 or 1. OCL (lowerBound() = 0 or lowerBound() = 1) and upperBound() = 1 The aggregation of an ExtensionEnd is composite. OCL self.aggregation = AggregationKind::composite This redefinition changes the default multiplicity of association ends, since model elements are usually extended by 0 or 1 instance of the extension stereotype. References the type of the ExtensionEnd. Note that this association restricts the possible types of an ExtensionEnd to only be Stereotypes. The query lowerBound() returns the lower bound of the multiplicity as an Integer. This is a redefinition of the default lower bound, which normally, for MultiplicityElements, evaluates to 1 if empty. OCL result = (if lowerValue=null then 0 else lowerValue.integerValue() endif) Physical definition of a graphical image. This contains the serialization of the image according to the format. The value could represent a bitmap, image such as a GIF file, or drawing 'instructions' using a standard such as Scalable Vector Graphic (SVG) (which is XML based). This indicates the format of the content, which is how the string content should be interpreted. The following values are reserved: SVG, GIF, PNG, JPG, WMF, EMF, BMP. In addition the prefix 'MIME: ' is also reserved. This option can be used as an alternative to express the reserved values above, for example "SVG" could instead be expressed as "MIME: image/svg+xml". This contains a location that can be used by a tool to locate the image as an alternative to embedding it in the stereotype. A model captures a view of a physical system. It is an abstraction of the physical system, with a certain purpose. This purpose determines what is to be included in the model and what is irrelevant. Thus the model completely describes those aspects of the physical system that are relevant to the purpose of the model, at the appropriate level of detail. The name of the viewpoint that is expressed by a model (this name may refer to a profile definition). Determines whether this model is a metamodel. A package can have one or more profile applications to indicate which profiles have been applied. Because a profile is a package, it is possible to apply a profile not only to packages, but also to profiles. Package specializes TemplateableElement and PackageableElement specializes ParameterableElement to specify that a package can be used as a template and a PackageableElement as a template parameter. A package is used to group elements, and provides a namespace for the grouped elements. If an element that is owned by a package has visibility, it is public or private. OCL packagedElement->forAll(e | e.visibility<> null implies e.visibility = VisibilityKind::public or e.visibility = VisibilityKind::private) Provides an identifier for the package that can be used for many purposes. A URI is the universally unique identification of the package following the IETF URI specification, RFC 2396 http://www.ietf.org/rfc/rfc2396.txt and it must comply with those syntax rules. References the packaged elements that are Packages. References the Package that owns this Package. References the Stereotypes that are owned by the Package. References the packaged elements that are Types. References the PackageMerges that are owned by this Package. Specifies the packageable elements that are owned by this Package.