An action is a named element that is the fundamental unit of executable functionality. The execution of an action represents some transformation or processing in the modeled system, be it a computer system or otherwise. The classifier that owns the behavior of which this action is a part. The ordered set of input pins connected to the Action. These are among the total set of inputs. The ordered set of output pins connected to the Action. The action places its results onto pins in this set. Missing derivation for Action::/context : Classifier OCL true CallAction is an abstract class for actions that invoke behavior and receive return values. The number and order of argument pins must be the same as the number and order of parameters of the invoked behavior or behavioral feature. Pins are matched to parameters by order. OCL true The type, ordering, and multiplicity of an argument pin must be the same as the corresponding parameter of the behavior or behavioral feature. OCL true Only synchronous call actions can have result pins. OCL true 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 does not expect a return values. A list of output pins where the results of performing the invocation are placed. A call behavior action is a call action that invokes a behavior directly rather than invoking a behavioral feature that, in turn, results in the invocation of that behavior. The argument values of the action are available to the execution of the invoked behavior. For synchronous calls the execution of the call behavior action waits until the execution of the invoked behavior completes and a result is returned on its output pin. The action completes immediately without a result, if the call is asynchronous. In particular, the invoked behavior may be an activity. The type, ordering, and multiplicity of an argument or result pin is derived from the corresponding parameter of the behavior. OCL true The number of argument pins and the number of parameters of the behavior of type in and in-out must be equal. OCL true The number of result pins and the number of parameters of the behavior of type return, out, and in-out must be equal. OCL true The invoked behavior. It must be capable of accepting and returning control. A call operation action is an action that transmits an operation call request to the target object, where it may cause the invocation of associated behavior. The argument values of the action are available to the execution of the invoked behavior. If the action is marked synchronous, the execution of the call operation action waits until the execution of the invoked behavior completes and a reply transmission is returned to the caller; otherwise execution of the action is complete when the invocation of the operation is established and the execution of the invoked operation proceeds concurrently with the execution of the calling behavior. Any values returned as part of the reply transmission are put on the result output pins of the call operation action. Upon receipt of the reply transmission, execution of the call operation action is complete. The number of argument pins and the number of owned parameters of the operation of type in and in-out must be equal. OCL true The type, ordering, and multiplicity of an argument or result pin is derived from the corresponding owned parameter of the operation. OCL true The type of the target pin must be the same as the type that owns the operation. OCL true The number of result pins and the number of owned parameters of the operation of type return, out, and in-out must be equal. OCL true The operation to be invoked by the action execution. The target object to which the request is sent. The classifier of the target object is used to dynamically determine a behavior to invoke. This object constitutes the context of the execution of the operation. An input pin is a pin that holds input values to be consumed by an action. InvocationAction is an abstract class for the various actions that invoke behavior. Specification of the ordered set of argument values that appears during execution. The operation compatibleWith takes another multiplicity as input. It checks if one multiplicity is compatible with another. OCL result = Integer.allInstances()->forAll(i : Integer | self.includesCardinality(i) implies other.includesCardinality(i)) 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) An action with implementation-specific semantics. Specifies the action in one or more languages. Provides input to the action. Languages the body strings use, in the same order as the body strings Takes output from the action. An output pin is a pin that holds output values produced by an action. A pin is a typed element and multiplicity element that provides values to actions and accept result values from them. A send signal action is an action that creates a signal instance from its inputs, and transmits it to the target object, where it may cause the firing of a state machine transition or the execution of an activity. The argument values are available to the execution of associated behaviors. The requestor continues execution immediately. Any reply message is ignored and is not transmitted to the requestor. If the input is already a signal instance, use a send object action. The type, ordering, and multiplicity of an argument pin must be the same as the corresponding attribute of the signal. OCL true The number and order of argument pins must be the same as the number and order of attributes in the signal. OCL true The type of signal transmitted to the target object. The target object to which the signal is sent. A value pin is an input pin that provides a value by evaluating a value specification. The type of value specification must be compatible with the type of the value pin. OCL true Value that the pin will provide. An accept call action is an accept event action representing the receipt of a synchronous call request. In addition to the normal operation parameters, the action produces an output that is needed later to supply the information to the reply action necessary to return control to the caller. This action is for synchronous calls. If it is used to handle an asynchronous call, execution of the subsequent reply action will complete immediately with no effects. isUnmrashall must be true for an AcceptCallAction. OCL isUnmarshall = true The result pins must match the in and inout parameters of the operation specified by the trigger event in number, type, and order. OCL true The trigger event must be a CallEvent. OCL trigger.event.oclIsKindOf(CallEvent) Pin where a value is placed containing sufficient information to perform a subsequent reply 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. A accept event action is an action that waits for the occurrence of an event meeting specified conditions. If isUnmarshall is true, there must be exactly one trigger for events of type 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 true There are no output pins if the trigger events are only ChangeEvents, or if they are only CallEvents when this action is an instance of AcceptEventAction and not an instance of a descendant of AcceptEventAction (such as AcceptCallAction). OCL true AcceptEventActions may have no input pins. OCL true If the trigger events are all TimeEvents, there is exactly one output pin. OCL true Indicates whether there is a single output pin for the event, or multiple output pins for attributes of the event. Pins holding the received event objects or their attributes. Event objects may be copied in transmission, so identity might not be preserved. The type of events accepted by the action, as specified by triggers. For triggers with signal events, a signal of the specified type or any subtype of the specified signal type is accepted. A create link object action creates a link object. The type of the result pin must be the same as the association of the action. OCL self.result.type = self.association() The association must be an association class. OCL self.association().oclIsKindOf(Class) The multiplicity of the output pin is 1..1. OCL self.result.multiplicity.is(1,1) Gives the output pin on which the result is put. The qualifiers include all and only the qualifiers of the association end. OCL self.qualifier->collect(qualifier) = self.end.qualifier The end object input pin is not also a qualifier value input pin. OCL self.value->excludesAll(self.qualifier.value) List of qualifier values A qualifier value is not an action. It is an element that identifies links. It gives a single qualifier within a link end data specification. The type of the qualifier value input pin is the same as the type of the qualifier attribute. OCL self.value.type = self.qualifier.type The multiplicity of the qualifier value input pin is "1..1". OCL self.value.multiplicity.is(1,1) The qualifier attribute must be a qualifier of the association end of the link-end data. OCL self.LinkEndData.end->collect(qualifier)->includes(self.qualifier) Attribute representing the qualifier for which the value is to be specified. Input pin from which the specified value for the qualifier is taken. A read extent action is an action that retrieves the current instances of a classifier. The multiplicity of the result output pin is 0..*. OCL self.result.multiplicity.is(0,#null) The type of the result output pin is the classifier. OCL true The classifier whose instances are to be retrieved. The runtime instances of the classifier. A read is classified object action is an action that determines whether a runtime object is classified by a given classifier. The type of the output pin is Boolean OCL self.result.type = Boolean The multiplicity of the input pin is 1..1. OCL self.object.multiplicity.is(1,1) The input pin has no type. OCL self.object.type->isEmpty() The multiplicity of the output pin is 1..1. OCL self.result.multiplicity.is(1,1) The classifier against which the classification of the input object is tested. Indicates whether the classifier must directly classify the input object. Holds the object whose classification is to be tested. After termination of the action, will hold the result of the test. A read link object end action is an action that retrieves an end object from a link object. The type of the result output pin is the same as the type of the association end. OCL self.result.type = self.end.type The association of the association end must be an association class. OCL self.end.Association.oclIsKindOf(AssociationClass) The multiplicity of the result output pin is 1..1. OCL self.result.multiplicity.is(1,1) The multiplicity of the object input pin is 1..1. OCL self.object.multiplicity.is(1,1) The ends of the association must not be static. OCL self.end.association.memberEnd->forall(e | not e.isStatic) The type of the object input pin is the association class that owns the association end. OCL self.object.type = self.end.association The property must be an association end. OCL self.end.association.notEmpty() Link end to be read. Gives the input pin from which the link object is obtained. Pin where the result value is placed. A read link object end qualifier action is an action that retrieves a qualifier end value from a link object. The multiplicity of the object input pin is 1..1. OCL self.object.multiplicity.is(1,1) The ends of the association must not be static. OCL self.qualifier.associationEnd.association.memberEnd->forall(e | not e.isStatic) The type of the result output pin is the same as the type of the qualifier attribute. OCL self.result.type = self.qualifier.type The association of the association end of the qualifier attribute must be an association class. OCL self.qualifier.associationEnd.association.oclIsKindOf(AssociationClass) The multiplicity of the result output pin is 1..1. OCL self.result.multiplicity.is(1,1) The qualifier attribute must be a qualifier attribute of an association end. OCL self.qualifier.associationEnd->size() = 1 The multiplicity of the qualifier attribute is 1..1. OCL self.qualifier.multiplicity.is(1,1) The type of the object input pin is the association class that owns the association end that has the given qualifier attribute. OCL self.object.type = self.qualifier.associationEnd.association Gives the input pin from which the link object is obtained. The attribute representing the qualifier to be read. Pin where the result value is placed. A reclassify object action is an action that changes which classifiers classify an object. The input pin has no type. OCL self.argument.type->size() = 0 The multiplicity of the input pin is 1..1. OCL self.argument.multiplicity.is(1,1) None of the new classifiers may be abstract. OCL not self.newClassifier->exists(isAbstract = true) Specifies whether existing classifiers should be removed before adding the new classifiers. A set of classifiers to be added to the classifiers of the object. Holds the object to be reclassified. A set of classifiers to be removed from the classifiers of the object. A reduce action is an action that reduces a collection to a single value by combining the elements of the collection. The reducer behavior must have two input parameters and one output parameter, of types compatible with the types of elements of the input collection. OCL true The type of the input must be a collection. OCL true The type of the output must be compatible with the type of the output of the reducer behavior. OCL true The collection to be reduced. Tells whether the order of the input collection should determine the order in which the behavior is applied to its elements. Behavior that is applied to two elements of the input collection to produce a value that is the same type as elements of the collection. Gives the output pin on which the result is put. A reply action is an action that accepts a set of return values and a value containing return information produced by a previous accept call action. The reply action returns the values to the caller of the previous call, completing execution of the call. The reply value pins must match the return, out, and inout parameters of the operation on the event on the trigger in number, type, and order. OCL true The event on replyToCall trigger must be a CallEvent replyToCallEvent.oclIsKindOf(CallEvent) OCL replyToCallEvent.oclIsKindOf(CallEvent) The trigger specifying the operation whose call is being replied to. A list of pins containing the reply values of the operation. These values are returned to the caller. A pin containing the return information value produced by an earlier AcceptCallAction. A start classifier behavior action is an action that starts the classifier behavior of the input. If the input pin has a type, then the type must have a classifier behavior. OCL true The multiplicity of the input pin is 1..1 OCL true Holds the object on which to start the owned behavior. StartObjectBehaviorAction is an action that starts the execution either of a directly instantiated behavior or of the classifier behavior 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 number and order of the argument pins must be the same as the number and order of the in and in-out parameters of the invoked behavior. Pins are matched to parameters by order. OCL true The number and order of result pins must be the same as the number and order of the in-out, out and return parameters of the invoked behavior. Pins are matched to parameters by order. OCL true The multiplicity of the object input pin must be [1..1]. OCL true The type, ordering, and multiplicity of an argument or result pin must be the same as the corresponding parameter of the behavior. OCL true The type of the object input pin must be either a Behavior or a BehavioredClassifier with a classifier behavior. OCL true Holds the object which is either a behavior to be started or has a classifier behavior to be started. An unmarshall action is an action that breaks an object of a known type into outputs each of which is equal to a value from a structural feature of the object. The multiplicity of each result output pin must be compatible with the multiplicity of the corresponding structural features of the unmarshall classifier. OCL true The multiplicity of the object input pin is 1..1 OCL true The type and ordering of each result output pin must be the same as the corresponding structural feature of the unmarshall classifier. OCL true The unmarshall classifier must have at least one structural feature. OCL true The number of result output pins must be the same as the number of structural features of the unmarshall classifier. OCL true The type of the object input pin must be the same as the unmarshall classifier. OCL true unmarshallType must be a Classifier with ordered attributes OCL true The object to be unmarshalled. The values of the structural features of the input object. The type of the object to be unmarshalled. An add structural feature value action is a write structural feature action for adding values to a structural feature. Actions adding a value to ordered structural features must have a single input pin for the insertion point with type UnlimitedNatural and multiplicity of 1..1, otherwise the action has no input pin for the insertion point. OCL let insertAtPins : Collection = self.insertAt in if self.structuralFeature.isOrdered = #false then insertAtPins->size() = 0 else let insertAtPin : InputPin= insertAt->asSequence()->first() in insertAtPins->size() = 1 and insertAtPin.type = UnlimitedNatural and insertAtPin.multiplicity.is(1,1)) endif A value input pin is required. OCL self.value -> notEmpty() Gives the position at which to insert a new value or move an existing value in ordered structural features. The type of the pin is UnlimitedNatural, but the value cannot be zero. This pin is omitted for unordered structural features. Specifies whether existing values of the structural feature of the object should be removed before adding the new value. A broadcast signal action is an action that transmits a signal instance to all the potential target objects in the system, which may cause the firing of a state machine transitions or the execution of associated activities of a target object. The argument values are available to the execution of associated behaviors. The requestor continues execution immediately after the signals are sent out. It does not wait for receipt. Any reply messages are ignored and are not transmitted to the requestor. The number and order of argument pins must be the same as the number and order of attributes in the signal. OCL true The type, ordering, and multiplicity of an argument pin must be the same as the corresponding attribute of the signal. OCL true The specification of signal object transmitted to the target objects. A clear association action is an action that destroys all links of an association in which a particular object participates. The type of the input pin must be the same as the type of at least one of the association ends of the association. OCL self.association->exists(end.type = self.object.type) The multiplicity of the input pin is 1..1. OCL self.object.multiplicity.is(1,1) Association to be cleared. Gives the input pin from which is obtained the object whose participation in the association is to be cleared. A clear structural feature action is a structural feature action that removes all values of a structural feature. The multiplicity of the result output pin must be 1..1. OCL result->notEmpty() implies self.result.multiplicity.is(1,1) The type of the result output pin is the same as the type of the inherited object input pin. OCL result->notEmpty() implies self.result.type = self.object.type Gives the output pin on which the result is put. A create link action is a write link action for creating links. The association cannot be an abstract classifier. OCL self.association().isAbstract = #false Specifies ends of association and inputs. A create object action is an action that creates an object that conforms to a statically specified classifier and puts it on an output pin at runtime. The multiplicity of the output pin is 1..1. OCL self.result.multiplicity.is(1,1) The classifier cannot be an association class OCL not self.classifier.oclIsKindOf(AssociationClass) The classifier cannot be abstract. OCL not (self.classifier.isAbstract = #true) The type of the result pin must be the same as the classifier of the action. OCL self.result.type = self.classifier Classifier to be instantiated. Gives the output pin on which the result is put. A destroy link action is a write link action that destroys links and link objects. Specifies ends of association and inputs. A destroy object action is an action that destroys objects. The input pin has no type. OCL self.target.type->size() = 0 The multiplicity of the input pin is 1..1. OCL self.target.multiplicity.is(1,1) Specifies whether links in which the object participates are destroyed along with the object. Specifies whether objects owned by the object are destroyed along with the object. The input pin providing the object to be destroyed. LinkAction is an abstract class for all link actions that identify their links by the objects at the ends of the links and by the qualifiers at ends of the links. The association ends of the link end data must all be from the same association and include all and only the association ends of that association. OCL self.endData->collect(end) = self.association()->collect(connection)) The association ends of the link end data must not be static. OCL self.endData->forall(end.oclisKindOf(NavigableEnd) implies end.isStatic = #false The input pins of the action are the same as the pins of the link end data and insertion pins. OCL self.input->asSet() = let ledpins : Set = self.endData->collect(value) in if self.oclIsKindOf(LinkEndCreationData) then ledpins->union(self.endData.oclAsType(LinkEndCreationData).insertAt) else ledpins Data identifying one end of a link by the objects on its ends and qualifiers. Pins taking end objects and qualifier values as input. The association operates on LinkAction. It returns the association of the action. OCL result = self.endData->asSequence().first().end.association A link end creation data is not an action. It is an element that identifies links. It identifies one end of a link to be created by a create link action. LinkEndCreationData can only be end data for CreateLinkAction or one of its specializations. OCL self.LinkAction.oclIsKindOf(CreateLinkAction) Link end creation data for ordered association ends must have a single input pin for the insertion point with type UnlimitedNatural and multiplicity of 1..1, otherwise the action has no input pin for the insertion point. OCL let insertAtPins : Collection = self.insertAt in if self.end.ordering = #unordered then insertAtPins->size() = 0 else let insertAtPin : InputPin = insertAts->asSequence()->first() in insertAtPins->size() = 1 and insertAtPin.type = UnlimitedNatural and insertAtPin.multiplicity.is(1,1)) endif Specifies where the new link should be inserted for ordered association ends, or where an existing link should be moved to. The type of the input is UnlimitedNatural, but the input cannot be zero. This pin 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. A link end data is not an action. It is an element that identifies links. It identifies one end of a link to be read or written by the children of a link action. A link cannot be passed as a runtime value to or from an action. Instead, a link is identified by its end objects and qualifier values, if any. This requires more than one piece of data, namely, the statically-specified end in the user model, the object on the end, and the qualifier values for that end, if any. These pieces are brought together around a link end data. Each association end is identified separately with an instance of the LinkEndData class. The type of the end object input pin is the same as the type of the association end. OCL self.value.type = self.end.type The multiplicity of the end object input pin must be 1..1. OCL self.value.multiplicity.is(1,1) The property must be an association end. OCL self.end.association->size() = 1 Association end for which this link-end data specifies values. Input pin that provides the specified object for the given end. This pin is omitted if the link-end data specifies an 'open' end for reading. A link end destruction data is not an action. It is an element that identifies links. It identifies one end of a link to be destroyed by destroy link action. LinkEndDestructionData can only be end data for DestroyLinkAction or one of its specializations. OCL true LinkEndDestructionData for ordered nonunique association ends must have a single destroyAt input pin if isDestroyDuplicates is false. It must be of type UnlimitedNatural and have a multiplicity of 1..1. Otherwise, the action has no input pin for the removal position. OCL true Specifies the position of an existing link to be destroyed in ordered nonunique association ends. The type of the pin is UnlimitedNatural, but the value cannot be zero or unlimited. Specifies whether to destroy duplicates of the value in nonunique association ends. A read link action is a link action that navigates across associations to retrieve objects on one end. The multiplicity of the open association end must be compatible with the multiplicity of the result output pin. OCL let openend : Property = self.endData->select(ed | ed.value->size() = 0)->asSequence()->first().end in openend.multiplicity.compatibleWith(self.result.multiplicity) Exactly one link-end data specification (the 'open' end) must not have an end object input pin. OCL self.endData->select(ed | ed.value->size() = 0)->size() = 1 The open end must be navigable. OCL let openend : Property = self.endData->select(ed | ed.value->size() = 0)->asSequence()->first().end in openend.isNavigable() Visibility of the open end must allow access to the object performing the action. OCL let host : Classifier = self.context in let openend : Property = self.endData->select(ed | ed.value->size() = 0)->asSequence()->first().end in openend.visibility = #public or self.endData->exists(oed | not oed.end = openend and (host = oed.end.participant or (openend.visibility = #protected and host.allSupertypes->includes(oed.end.participant)))) The type and ordering of the result output pin are same as the type and ordering of the open association end. OCL let openend : Property = self.endData->select(ed | ed.value->size() = 0)->asSequence()->first().end in self.result.type = openend.type and self.result.ordering = openend.ordering The pin on which are put the objects participating in the association at the end not specified by the inputs. A read self action is an action that retrieves the host object of an action. The multiplicity of the result output pin is 1..1. OCL self.result.multiplicity.is(1,1) If the action is contained in an behavior that is acting as the body of a method, then the operation of the method must not be static. OCL true The action must be contained in an behavior that has a host classifier. OCL self.context->size() = 1 The type of the result output pin is the host classifier. OCL self.result.type = self.context Gives the output pin on which the hosting object is placed. A read structural feature action is a structural feature action that retrieves the values of a structural feature. The type and ordering of the result output pin are the same as the type and ordering of the structural feature. OCL self.result.type = self.structuralFeature.type and self.result.ordering = self.structuralFeature.ordering The multiplicity of the structural feature must be compatible with the multiplicity of the output pin. OCL self.structuralFeature.multiplicity.compatibleWith(self.result.multiplicity) Gives the output pin on which the result is put. A remove structural feature value action is a write structural feature action that removes values from structural features. Actions removing a value from ordered non-unique structural features must have a single removeAt input pin and no value input pin if isRemoveDuplicates is false. The removeAt pin must be of type Unlimited Natural with multiplicity 1..1. Otherwise, the action has a value input pin and no removeAt input pin. OCL if not self.structuralFeature.isOrdered or self.structuralFeature.isUnique or isRemoveDuplicates then self.removeAt -> isEmpty() and self.value -> notEmpty() else self.value -> isEmpty() and self.removeAt -> notEmpty() and self.removeAt.type = UnlimitedNatural and self.removeAt.lower = 1 and self.removeAt.upper = 1 endif Specifies whether to remove duplicates of the value in nonunique structural features. Specifies the position of an existing value to remove in ordered nonunique structural features. The type of the pin is UnlimitedNatural, but the value cannot be zero or unlimited. A send object action is an action that transmits an object to the target object, where it may invoke behavior such as the firing of state machine transitions or the execution of an activity. The value of the object is available to the execution of invoked behaviors. The requestor continues execution immediately. Any reply message is ignored and is not transmitted to the requestor. 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. StructuralFeatureAction is an abstract class for all structural feature actions. A structural feature has exactly one featuringClassifier. OCL self.structuralFeature.featuringClassifier->size() = 1 The multiplicity of the object input pin must be 1..1. OCL self.object.lowerBound()=1 and self.object.upperBound()=1 The structural feature must not be static. OCL self.structuralFeature.isStatic = #false The structural feature must either be owned by the type of the object input pin, or it must be an owned end of a binary association with the type of the opposite end being the type of the object input pin. OCL self.structuralFeature.featuringClassifier.oclAsType(Type)->includes(self.object.type) or self.structuralFeature.oclAsType(Property).opposite.type = self.object.type Visibility of structural feature must allow access to the object performing the action. OCL let host : Classifier = self.context in self.structuralFeature.visibility = #public or host = self.structuralFeature.featuringClassifier.type or (self.structuralFeature.visibility = #protected and host.allSupertypes ->includes(self.structuralFeature.featuringClassifier.type))) Gives the input pin from which the object whose structural feature is to be read or written is obtained. Structural feature to be read. A test identity action is an action that tests if two values are identical objects. The input pins have no type. OCL self.first.type->size() = 0 and self.second.type->size() = 0 The multiplicity of the input pins is 1..1. OCL self.first.multiplicity.is(1,1) and self.second.multiplicity.is(1,1) The type of the result is the UML standard primitive type Boolean. (This is not directly representable in OCL at the metamodel level.) OCL true Gives the pin on which an object is placed. Tells whether the two input objects are identical. Gives the pin on which an object is placed. A value specification action is an action that evaluates a value specification. The multiplicity of the result pin is 1..1 OCL true The type of value specification must be compatible with the type of the result pin. OCL true Gives the output pin on which the result is put. Value specification to be evaluated. WriteLinkAction is an abstract class for link actions that create and destroy links. The visibility of at least one end must allow access to the class using the action. OCL true WriteStructuralFeatureAction is an abstract class for structural feature actions that change structural feature values. The multiplicity of the result output pin must be 1..1. OCL result->notEmpty() implies self.result.multiplicity.is(1,1) The type of the value input pin is the same as the type of the structural feature. OCL self.value->notEmpty() implies self.value.type = self.structuralFeature.type The multiplicity of the input pin is 1..1. OCL self.value.multiplicity.is(1,1) The type of the result output pin is the same as the type of the inherited object input pin. OCL result->notEmpty() implies self.result.type = self.object.type Gives the output pin on which the result is put. Value to be added or removed from the structural feature. An action input pin is a kind of pin that executes an action to determine the values to input to another. The fromAction of an action input pin cannot have control or data flows coming into or out of it or its pins. OCL true The fromAction of an action input pin must only have action input pins as input pins. OCL true The fromAction of an action input pin must have exactly one output pin. OCL true The action used to provide values. An add variable value action is a write variable action for adding values to a variable. A value input pin is required. OCL self.value -> notEmpty() Actions adding values to ordered variables must have a single input pin for the insertion point with type UnlimtedNatural and multiplicity of 1..1, otherwise the action has no input pin for the insertion point. OCL let insertAtPins : Collection = self.insertAt in if self.variable.ordering = #unordered then insertAtPins->size() = 0 else let insertAtPin : InputPin = insertAt->asSequence()->first() in insertAtPins->size() = 1 and insertAtPin.type = UnlimitedNatural and insertAtPin.multiplicity.is(1,1)) endif Gives the position at which to insert a new value or move an existing value in ordered variables. The types is UnlimitedINatural, but the value cannot be zero. This pin is omitted for unordered variables. Specifies whether existing values of the variable should be removed before adding the new value. A clear variable action is a variable action that removes all values of a variable. A raise exception action is an action that causes an exception to occur. The input value becomes the exception object. An input pin whose value becomes an exception object. A read variable action is a variable action that retrieves the values of a variable. The type and ordering of the result output pin of a read-variable action are the same as the type and ordering of the variable. OCL self.result.type =self.variable.type and self.result.ordering = self.variable.ordering The multiplicity of the variable must be compatible with the multiplicity of the output pin. OCL self.variable.multiplicity.compatibleWith(self.result.multiplicity) Gives the output pin on which the result is put. A remove variable value action is a write variable action that removes values from variables. Actions removing a value from ordered non-unique variables must have a single removeAt input pin and no value input pin if isRemoveDuplicates is false. The removeAt pin must be of type Unlimited Natural with multiplicity 1..1. Otherwise, the action has a value input pin and no removeAt input pin. OCL if not self.variable.isOrdered or self.variable.isUnique or isRemoveDuplicates then self.removeAt -> isEmpty() and self.value -> notEmpty() else self.value -> isEmpty() and self.removeAt -> notEmpty() and self.removeAt.type = UnlimitedNatural and self.removeAt.lower() = 1 and self.removeAt.upper() = 1 endif Specifies whether to remove duplicates of the value in nonunique variables. Specifies the position of an existing value to remove in ordered nonunique variables. The type of the pin is UnlimitedNatural, but the value cannot be zero or unlimited. VariableAction is an abstract class for actions that operate on a statically specified variable. The action must be in the scope of the variable. OCL self.variable.isAccessibleBy(self) Variable to be read. WriteVariableAction is an abstract class for variable actions that change variable values. The multiplicity of the input pin is 1..1. OCL self.value.multiplicity.is(1,1) The type input pin is the same as the type of the variable. OCL self.value -> notEmpty() implies self.value.type = self.variable.type Value to be added or removed from the variable. The nodes of the activity must include one ActivityParameterNode for each parameter. OCL true An activity cannot be autonomous and have a classifier or behavioral feature context at the same time. OCL true Edges expressing flow between nodes of the activity. If true, this activity must not make any changes to variables outside the activity or to objects. (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 action, then the model is ill-formed.) The default is false (an activity may make nonlocal changes). An activity edge is an abstract class for directed connections between two activity nodes. Activity edges may be owned only by activities or groups. OCL true The source and target of an edge must be in the same activity as the edge. OCL true Activity containing the edge. Groups containing the edge. Inherited edges replaced by this edge in a specialization of the activity. Node from which tokens are taken when they traverse the edge. Node to which tokens are put when they traverse the edge. An activity final node is a final node that stops all flows in an activity. All nodes and edges of the group must be in the same activity as the group. OCL true No node or edge in a group may be contained by its subgroups or its containing groups, transitively. OCL true Groups may only be owned by activities or groups. OCL true Edges immediately contained in the group. Activity nodes can only be owned by activities or groups. OCL true Edges that have the node as target. Edges that have the node as source. Inherited nodes replaced by this node in a specialization of the activity. An activity parameter node is an object node for inputs and outputs to activities. Activity parameter object nodes with no outgoing edges and one or more incoming edges must have a parameter with out, inout, or return direction. OCL true The type of an activity parameter node is the same as the type of its parameter. OCL true An activity parameter node may have all incoming edges or all outgoing edges, but it must not have both incoming and outgoing edges. OCL true Activity parameter nodes must have parameters from the containing activity. OCL true Activity parameter object nodes with no incoming edges and one or more outgoing edges must have a parameter with in or inout direction. OCL true A parameter with direction inout must have at most two activity parameter nodes in an activity, one with incoming flows and one with outgoing flows. OCL true A parameter with direction other than inout must have at most one activity parameter node in an activity. OCL true The parameter the object node will be accepting or providing values for. A control flow is an edge that starts an activity node after the previous one is finished. Control flows may not have object nodes at either end, except for object nodes with control type. OCL true A control node is an abstract activity node that coordinates flows in an activity. An initial node is a control node at which flow starts when the activity is invoked. Only control edges can have initial nodes as source. OCL true An initial node has no incoming edges. OCL true An object flow is an activity edge that can have objects or data passing along it. Object nodes connected by an object flow, with optionally intervening control nodes, must have compatible types. In particular, the downstream object node type must be the same or a supertype of the upstream object node type. OCL true Object nodes connected by an object flow, with optionally intervening control nodes, must have the same upper bounds. OCL true Object flows may not have actions at either end. OCL true An object node is an abstract activity node that is part of defining object flow in an activity. All edges coming into or going out of object nodes must be object flow edges. OCL true A pin is an object node for inputs and outputs to actions. Value pins have no incoming edges. OCL true An action has pre- and post-conditions. Constraint that must be satisfied when executed is completed. Constraint that must be satisfied when execution is started. If true, all invocations of the activity are handled by the same execution. Activity edges can be contained in interruptible regions. Region that the edge can interrupt. The minimum number of tokens that must traverse the edge at the same time. Nodes immediately contained in the group. Groups containing the node. Interruptible regions containing the node. A behavior owns zero or more parameter sets. The ParameterSets owned by this Behavior. A behavioral feature owns zero or more parameter sets. The ParameterSets owned by this BehavioralFeature. A data store node is a central buffer node for non-transient information. An interruptible activity region is an activity group that supports termination of tokens flowing in the portions of an activity. Interrupting edges of a region must have their source node in the region and their target node outside the region in the same activity containing the region. OCL true The edges leaving the region that will abort other tokens flowing in the region. Nodes immediately contained in the group. Join nodes have a Boolean value specification using the names of the incoming edges to specify the conditions under which the join will emit a token. If a join node has an incoming object flow, it must have an outgoing object flow, otherwise, it must have an outgoing control flow. OCL (self.incoming.select(e | e.isTypeOf(ObjectFlow)->notEmpty() implies self.outgoing.isTypeOf(ObjectFlow)) and (self.incoming.select(e | e.isTypeOf(ObjectFlow)->empty() implies self.outgoing.isTypeOf(ControlFlow)) A join node has one outgoing edge. OCL self.outgoing->size() = 1 Tells whether tokens having objects with the same identity are combined into one by the join. A specification giving the conditions under which the join with emit a token. Default is "and". Object flows have support for multicast/receive, token selection from object nodes, and transformation of tokens. 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 true An edge with constant weight may not target an object node, or lead to an object node downstream with no intervening actions, that has an upper bound less than the weight. OCL true A selection behavior has one input parameter and one output parameter. The input parameter must be a bag of elements of the same as or a supertype of the type of source object node. The output parameter must be the same or a subtype of the type of source object node. The behavior cannot have side effects. OCL true isMulticast and isMultireceive cannot both be true. OCL true An object flow may have a selection behavior only if has an object node as a source. OCL true Tells whether the objects in the flow are passed by multicasting. Tells whether the objects in the flow are gathered from respondents to multicasting. Selects tokens from a source object node. Changes or replaces data tokens flowing along edge. Object nodes have support for token selection, limitation on the number of tokens, specifying the state required for tokens, and carrying control values. If an object node has a selection behavior, then the ordering of the object node is ordered, and vice versa. OCL true A selection behavior has one input parameter and one output parameter. The input parameter must be a bag of elements of the same type as the object node or a supertype of the type of object node. The output parameter must be the same or a subtype of the type of object node. The behavior cannot have side effects. OCL true The required states of the object available at this point in the activity. Tells whether the type of the object node is to be treated as control. Tells whether and how the tokens in the object node are ordered for selection to traverse edges outgoing from the object node. Selects tokens for outgoing edges. The maximum number of tokens allowed in the node. Objects cannot flow into the node if the upper bound is reached. Parameters have support for streaming, exceptions, and parameter sets. A parameter cannot be a stream and exception at the same time. OCL true An input parameter cannot be an exception. OCL true Only in and inout parameters may have a delete effect. Only out, inout, and return parameters may have a create effect. OCL true Reentrant behaviors cannot have stream parameters. OCL true Specifies the effect that the owner of the parameter has on values 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 post values while the behavior is executing. The parameter sets containing the parameter. See ParameterSet. A parameter set is an element that provides alternative sets of inputs or outputs that a behavior may use. Two parameter sets cannot have exactly the same set of parameters. OCL true If a behavior has input parameters that are in a parameter set, then any inputs that are not in a parameter set must be streaming. Same for output parameters. OCL true The parameters in a parameter set must all be inputs or all be outputs of the same parameterized entity, and the parameter set is owned by that entity. OCL true Constraint that should be satisfied for the owner of the parameters in an input parameter set to start execution using the values provided for those parameters, or the owner of the parameters in an output parameter set to end execution providing the values for those parameters, if all preconditions and conditions on input parameter sets were satisfied. Parameters in the parameter set. Control pins have a control type OCL isControl implies isControlType Tells whether the pins provide data to the actions, or just controls when it executes it. ObjectNodeOrderingKind is an enumeration indicating queuing order within a node. Indicates that object node tokens are unordered. Indicates that object node tokens are ordered. Indicates that object node tokens are queued in a last in, first out manner. Indicates that object node tokens are queued in a first in, first out manner. The datatype 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 that the behavior reads values. Indicates that the behavior updates values. Indicates that the behavior deletes values. Activity edges may be owned by at most one structured node. OCL true Groups containing the edge. Structured activity node containing the edge. Edges immediately contained in the group. The bodyOutput pins are output pins on actions in the body of the clause. OCL true A list of output pins within the body fragment whose values are moved to the result pins of the containing conditional node after execution of the clause body. Each clause of a conditional node must have the same number of bodyOutput pins as the conditional node has result output pins, and each clause bodyOutput pin must be compatible with the corresponding result pin (by positional order) in type, multiplicity, ordering and uniqueness. OCL true A conditional node has no input pins. OCL true The result output pins have no incoming edges. OCL true A list of output pins that constitute the data flow outputs of the conditional. Input pins may have outgoing edges only when they are on actions that are structured nodes, and these edges must target a node contained by the structured node. OCL true The result output pins have no incoming edges. OCL true Loop variable inputs must not have outgoing edges. OCL true The bodyOutput pins are output pins on actions in the body of the loop node. OCL true A list of output pins within the body fragment the values of which are moved to the loop variable pins after completion of execution of the body, before the next iteration of the loop begins or before the loop exits. A list of output pins that hold the values of the loop variables during an execution of the loop. When the test fails, the values are movied to the result pins of the loop. A list of values that are moved into the loop variable pins before the first iteration of the loop. A list of output pins that constitute the data flow output of the entire loop. Output pins may have incoming edges only when they are on actions that are structured nodes, and these edges may not target a node contained by the structured node. OCL true Because of the concurrent nature of the execution of actions within and across activities, it can be difficult to guarantee the consistent access and modification of object memory. In order to avoid race conditions or other concurrency-related problems, it is sometimes necessary to isolate the effects of a group of actions from the effects of actions outside the group. This may be indicated by setting the mustIsolate attribute to true on a structured activity node. If a structured activity node is "isolated," then any object used by an action within the node cannot be accessed by any action outside the node until the structured activity node 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 node. The incoming edges of the input pins of a StructuredActivityNode must have sources that are not within the StructuredActivityNode. OCL true The outgoing edges of the output pins of a StructuredActivityNode must have targets that are not within the StructuredActivityNode. OCL true The edges owned by a structured node must have source and target nodes in the structured node, and vice versa. OCL true Edges immediately contained in the structured node. If true, then the actions in the node execute in isolation from actions outside the node. An exception handler is an element that specifies a body to execute in case the specified exception occurs during the execution of the protected node. An edge that has a source in an exception handler structured node must have its target in the handler also, and vice versa. OCL true The exception handler and its input object node are not the source or target of any edge. OCL true If the protected node is a StructuredActivityNode with output pins, then the exception handler body must also be a StructuredActivityNode with output pins that correspond in number and types to those of the protected node. OCL true The handler body has one input, and that input is the same as the exception input. OCL true An object node within the handler body. When the handler catches an exception, the exception token is placed in this node, causing the body to execute. The kind of instances that the handler catches. If an exception occurs whose type is any of the classifiers in the set, the handler catches the exception and executes its body. A node that is executed if the handler satisfies an uncaught exception. The node protected by the handler. The handler is examined if an exception propagates to the outside of the node. An executable node is an abstract class for activity nodes that may be executed. It is used as an attachment point for exception handlers. A set of exception handlers that are examined if an uncaught exception propagates to the outer level of the executable node. An expansion node is an object node used to indicate a flow across the boundary of an expansion region. A flow into a region contains a collection that is broken into its individual elements inside the region, which is executed once per element. A flow out of a region combines individual elements into a collection for use outside the region. One of regionAsInput or regionAsOutput must be non-empty, but not both. OCL true The expansion region for which the node is an input. The expansion region for which the node is an output. An expansion region is a structured activity region that executes multiple times corresponding to elements of an input collection. An ExpansionRegion must have one or more argument ExpansionNodes and zero or more result ExpansionNodes. OCL true An object node that holds a separate element of the input collection during each of the multiple executions of the region. The way in which the executions interact: parallel: all interactions are independent iterative: the interactions occur in order of the elements stream: a stream of values flows into a single execution An object node that accepts a separate element of the output collection during each of the multiple executions of the region. The values are formed into a collection that is available when the execution of the region is complete. ExpansionKind is an enumeration type used to specify how multiple executions of an expansion region interact. The executions are independent. They may be executed concurrently. The executions are dependent and must be executed one at a time, in order of the collection elements. A stream of collection elements flows into a single execution, in order of the collection elements. An action represents a single step within an activity, that is, one that is not further decomposed within the activity. 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. An activity is the specification of parameterized behavior as the coordinated sequencing of subordinate units whose individual elements are actions. The groups of an activity have no supergroups. OCL true Top-level groups in the activity. Nodes coordinated by the activity. ActivityGroup is an abstract class for defining sets of nodes and edges in an activity. Nodes immediately contained in the group. Activity containing the group. Groups immediately contained in the group. Group immediately containing the group. ActivityNode is an abstract class for points in the flow of an activity connected by edges. Activity containing the node. Groups containing the node. Top-level groups in the activity. Top-level partitions in the activity. Specification evaluated at runtime to determine if the edge can be traversed. Groups containing the edge. Partitions containing the edge. Edges immediately contained in the group. Nodes immediately contained in the group. Activity containing the group. Groups containing the node. Partitions containing the node. An activity partition is a kind of activity group for identifying actions that have some characteristic in common. If a non-external partition represents a classifier and is contained in another partition, then the containing partition must represent a classifier, and the classifier of the subpartition must be nested in the classifier represented by the containing partition, or be at the contained end of a strong composition association with the classifier represented by the containing partition. OCL true If a partition represents a part and is contained by another partition, then the part must be of a classifier represented by the containing partition, or of a classifier that is the type of a part representing the containing partition. OCL true If a partition represents a part, then all the non-external partitions in the same dimension and at the same level of nesting in that dimension must represent parts directly contained in the internal structure of the same classifier. OCL true A partition with isDimension = true may not be contained by another partition. OCL true Edges immediately contained in the group. Tells whether the partition groups other partitions along a dimension. Tells whether the partition represents an entity to which the partitioning structure does not apply. Nodes immediately contained in the group. An element constraining behaviors invoked by nodes in the partition. Partitions immediately contained in the partition. Partition immediately containing the partition. A central buffer node is an object node for managing flows from multiple sources and destinations. A decision node is a control node that chooses between outgoing flows. If the decision node has no decision input flow and an incoming control flow, then a decision input behavior has zero input parameters. OCL true A decision node has one or two incoming edges and at least one outgoing edge. OCL true The decisionInputFlow of a decision node must be an incoming edge of the decision node. OCL true The edges coming into and out of a decision node, other than the decision input flow (if any), must be either all object flows or all control flows. OCL true If the decision node has a decision input flow and an incoming control flow, then a decision input behavior has one input parameter whose type is the same as or a supertype of the type of object tokens offered on the decision input flow. OCL true If the decision node has a decision input flow and an second incoming object flow, then a decision input behavior has two input parameters, the first of which has a type that is the same as or a supertype of the type of the type of object tokens offered on the nondecision input flow 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 decision input flow. OCL true A decision input behavior has no output parameters, no in-out parameters and one return parameter. OCL true If the decision node has no decision input flow and an incoming object flow, then a decision input behavior has one input parameter whose type is the same as or a supertype of the type of object tokens offered on the incoming edge. OCL true Provides input to guard specifications on edges outgoing from the decision node. An additional edge incoming to the decision node that provides a decision input value. A final node is an abstract control node at which a flow in an activity stops. A final node has no outgoing edges. OCL true A flow final node is a final node that terminates a flow. A fork node is a control node that splits a flow into multiple concurrent flows. The edges coming into and out of a fork node must be either all object flows or all control flows. OCL true A fork node has one incoming edge. OCL true A join node is a control node that synchronizes multiple flows. 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 merge node has one outgoing edge. OCL true The edges coming into and out of a merge node must be either all object flows or all control flows. OCL true Top-level groups in the activity. Nodes coordinated by the activity. Top-level structured nodes in the activity. Top-level variables in the activity. Missing derivation for Activity::/structuredNode : StructuredActivityNode OCL true Nodes immediately contained in the group. Activity containing the group. Activity nodes may be owned by at most one structured node. OCL true Activity containing the node. Groups containing the node. Structured activity node containing the node. A clause is an element that represents a single branch of a conditional construct, including a test and a body section. The body section is executed only if (but not necessarily if) the test section evaluates true. The test and body parts must be disjoint. OCL true The decider output pin must be for the test body or a node contained by the test body as a structured node. OCL true A nested activity fragment that is executed if the test evaluates to true and the clause is chosen over any concurrent clauses that also evaluate to true. An output pin within the test fragment the value of which is examined after execution of the test to determine whether the body should be executed. A set of clauses whose tests must all evaluate false before the current clause can be tested. A set of clauses which may not be tested unless the current clause tests false. A nested activity fragment with a designated output pin that specifies the result of the test. A conditional node is a structured activity node that represents an exclusive choice among some number of alternatives. No ExecutableNode may appear in the test or body part of more than one clause of a conditional node. OCL true The union of the ExecutabledNodes 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 true No two clauses within a ConditionalNode maybe predecessor clauses of each other, either directly or indirectly. OCL true Set of clauses composing the conditional. If true, the modeler asserts that at least one test will succeed. If true, the modeler asserts that at most one test will succeed. An executable node is an abstract class for activity nodes that may be executed. It is used as an attachment point for exception handlers. A loop node is a structured activity node that represents a loop with setup, test, and body sections. 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 true The set of nodes and edges that perform the repetitive computations of the loop. The body section is executed as long as the test section produces a true value. An output pin within the test fragment the value of which is examined after execution of the test to determine whether to execute the loop body. If true, the test is performed before the first execution of the body. If false, the body is executed once before the test is performed. The set of nodes and edges that initialize values or perform other setup computations for the loop. The set of nodes, edges, and designated value that compute a Boolean value to determine if another execution of the body will be performed. A sequence node is a structured activity node that executes its actions in order. An ordered set of executable nodes. A structured activity node is an executable activity node that may have an expansion into subordinate nodes as an activity group. The subordinate nodes must belong to only one structured activity node, although they may be nested. Activity immediately containing the node. Nodes immediately contained in the group. A variable defined in the scope of the structured activity node. It has no value and may not be accessed Variables are elements for passing data between actions indirectly. A local variable stores values shared by the actions within a structured activity group but not accessible outside it. The output of an action may be written to a variable and read for the input to a subsequent action, which is effectively an indirect data flow path. Because there is no predefined relationship between actions that read and write variables, these actions must be sequenced by control flows to prevent race conditions that may occur between actions that read or write the same variable. A variable is owned by a StructuredNode or Activity, but not both. OCL true An activity that owns the variable. A structured activity node that owns the variable. The isAccessibleBy() operation is not defined in standard UML. Implementations should define it to specify which actions can access a variable. OCL result = true An information flow specifies that one or more information items circulates from its sources to its targets. Information flows require some kind of information channel for transmitting information items from the source to the destination. An information channel is represented in various ways depending on the nature of its sources and targets. It may be represented by connectors, links, associations, or even dependencies. For example, if the source and destination are parts in some composite structure such as a collaboration, then the information channel is likely to be represented by a connector between them. Or, if the source and target are objects (which are a kind of instance specification), they may be represented by a link that joins the two, and so on. 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 and InstanceSpecification except when its classifier is a relationship (i.e. it represents a link). OCL (self.informationSource->forAll(p | p->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 (self.informationTarget->forAll(p | p->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))) The sources and targets of the information flow must conform with the sources and targets or conversely the targets and sources of the realization relationships. OCL true An information flow can only convey classifiers that are allowed to represent an information item. OCL self.conveyed.represented->forAll(p | p->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. An information item is an abstraction of all kinds of information that can be exchanged between objects. It is a kind of classifier intended for representing information in a very abstract way, one which cannot be instantiated. An informationItem has no feature, no generalization, and no associations. OCL self.generalization->isEmpty() and self.feature->isEmpty() 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(p | p->oclIsKindOf(InformationItem))->forAll(p | p.informationFlow.source->forAll(q | self.informationFlow.source->include(q)) and p.informationFlow.target->forAll(q | self.informationFlow.target->include(q)))) and (self.represented->forAll(p | p->oclIsKindOf(Class) or oclIsKindOf(Interface) or oclIsKindOf(InformationItem) or oclIsKindOf(Signal) or oclIsKindOf(Component))) 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. 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). The default multiplicity of an extension end is 0..1. Classifier is defined to be a kind of templateable element so that a classifier can be parameterized. It is also defined to be a kind of parameterable element so that a classifier can be a formal template parameter. The optional template signature specifying the formal template parameters. The template parameter that exposes this element as a formal parameter. The query isTemplate() returns whether this templateable element is actually a template. OCL result = oclAsType(TemplatableElement).isTemplate() or general->exists(g | g.isTemplate()) A classifier template parameter exposes a classifier as a formal template parameter. If "allowSubstitutable" is true, then there must be a constrainingClassifier. OCL allowSubstitutable implies constrainingClassifier->notEmpty() 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 subclasses. If this property is empty, there are no constraints on the classifier that can be used as an argument. The parameterable classifier for this template parameter. A connectable element may be exposed as a connectable element template parameter. The ConnectableElementTemplateParameter for this ConnectableElement parameter. A connectable element template parameter exposes a connectable element as a formal parameter for a template. The ConnectableElement for this template parameter. A named element supports using a string expression to specify its name. This allows names of model elements to involve template parameters. The actual name is evaluated from the string expression only when it is sensible to do so (e.g., when a template is bound). The string expression used to define the name of this named element. 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. The template parameter that exposes this element as a formal parameter. An operation template parameter exposes an operation as a formal parameter for a template. The operation for this template parameter. 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. Packageable elements are able to serve as a template parameter. A parameterable element is an element that can be exposed as a formal template parameter for a template, or specified as an actual parameter in a binding of a template. The formal template parameter that owns this element. The template parameter that exposes this element as a formal parameter. The query isCompatibleWith() determines if this parameterable element is compatible with the specified parameterable element. By default parameterable element P is compatible with parameterable element Q if the kind of P is the same or a subtype as the kind of Q. Subclasses should override this operation to specify different compatibility constraints. OCL result = p->oclIsKindOf(self.oclType) The query isTemplateParameter() determines if this parameterable element is exposed as a formal template parameter. OCL result = templateParameter->notEmpty() 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. A binding of a property template parameter representing an attribute must be to an attribute. OCL (isAttribute(self) and (templateParameterSubstitution->notEmpty()) implies (templateParameterSubstitution->forAll(ts | isAttribute(ts.formal))) The query isCompatibleWith() determines if this parameterable element is compatible with the specified parameterable element. By default parameterable element P is compatible with parameterable element Q if the kind of P is the same or a subtype as the kind of Q. In addition, for properties, the type must be conformant with the type of the specified parameterable element. OCL result = p->oclIsKindOf(self.oclType) and self.type.conformsTo(p.oclAsType(TypedElement).type) A redefinable template signature supports the addition of formal template parameters in a specialization of a template classifier. The inherited parameters are the parameters of the extended template signature. OCL if extendedSignature->isEmpty() then Set{} else extendedSignature.parameter endif The classifier that owns this template signature. The template signature that is extended by this template signature. The formal template parameters of the extendedSignature. Missing derivation for RedefinableTemplateSignature::/inheritedParameter : TemplateParameter OCL true 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, since redefinition only adds new formal parameters. OCL redefinee.isRedefinitionContextValid(self) OCL result = redefinee.oclIsKindOf(RedefineableTemplateSignature) An expression that specifies a string value that is derived by concatenating a set of sub string expressions, some of which might be template parameters. All the operands of a StringExpression must be LiteralStrings OCL operand->forAll (op | op.oclIsKindOf (LiteralString)) If a StringExpression has sub-expressions, it cannot have operands and vice versa (this avoids the problem of having to define a collating sequence between operands and subexpressions). OCL if subExpression->notEmpty() then operand->isEmpty() else operand->notEmpty() The string expression of which this expression is a substring. The StringExpressions that constitute this StringExpression. The query stringValue() returns the string that concatenates, in order, all the component string literals of all the subexpressions that are part of the StringExpression. OCL result = if subExpression->notEmpty() then subExpression->iterate(se; stringValue = ‘| stringValue.concat(se.stringValue())) else operand->iterate()(op; stringValue = ‘ | stringValue.concat(op.value)) A template binding represents a relationship between a templateable element and a template. A template binding specifies the substitutions of actual parameters for the formal parameters of the template. A binding contains at most one parameter substitution for each formal template parameter of the target template signature. OCL template.parameter->forAll(p | parameterSubstitution->select(b | b.formal = p)->size() <= 1) Each parameter substitution must refer to a formal template parameter of the target template signature. OCL parameterSubstitution->forAll(b | template.parameter->includes(b.formal)) The element that is bound by this binding. The parameter substitutions owned by this template binding. The template signature for the template that is the target of the binding. A template parameter exposes a parameterable element as a formal template parameter of a template. The default must be compatible with the formal template parameter. OCL default->notEmpty() implies default->isCompatibleWith(parameteredElement) The element that is the default for this formal template parameter. The element that is owned by this template parameter for the purpose of providing a default. The element that is owned by this template parameter. The element exposed by this template parameter. The template signature that owns this template parameter. A template parameter substitution relates the actual parameter to a formal template parameter as part of a template binding. The actual parameter must be compatible with the formal template parameter, e.g. the actual parameter for a class template parameter must be a class. OCL actual->forAll(a | a.isCompatibleWith(formal.parameteredElement)) The element that is the actual parameter for this substitution. The formal template parameter that is associated with this substitution. The actual parameter that is owned by this substitution. The optional bindings from this element to templates. A template signature bundles the set of formal template parameters for a templated element. Parameters must own the elements they parameter or those elements must be owned by the element being templated. OCL templatedElement.ownedElement->includesAll(parameter.parameteredElement - parameter.ownedParameteredElement) The formal template parameters that are owned by this template signature. The ordered set of all formal template parameters for this template signature. The element that owns this template signature. A templateable element is an element that can optionally be defined as a template and bound to other templates. The optional template signature specifying the formal template parameters. The optional bindings from this element to templates. The query isTemplate() returns whether this templateable element is actually a template. OCL result = ownedTemplateSignature->notEmpty() The query parameterableElements() returns the set of elements that may be used as the parametered elements for a template parameter of this templateable element. By default, this set includes all the owned elements. Subclasses may override this operation if they choose to restrict the set of parameterable elements. OCL result = allOwnedElements->select(oclIsKindOf(ParameterableElement)) ValueSpecification specializes ParameterableElement to specify that a value specification can be exposed as a formal template parameter, and provided as an actual parameter in a binding of a template. The query isCompatibleWith() determines if this parameterable element is compatible with the specified parameterable element. By default parameterable element P is compatible with parameterable element Q if the kind of P is the same or a subtype as the kind of Q. In addition, for ValueSpecification, the type must be conformant with the type of the specified parameterable element. OCL result = p->oclIsKindOf(self.oclType) and self.type.conformsTo(p.oclAsType(TypedElement).type) A model element that has both association and class properties. An AssociationClass can be seen as an association that also has class properties, or as a class that also has association properties. It not only connects a set of classifiers but also defines a set of features that belong to the relationship itself and not to any of the classifiers. The owned attributes and owned ends of an AssociationClass are disjoint OCL ownedAttribute->intersection(ownedEnd)->isEmpty() An AssociationClass cannot be defined between itself and something else. OCL self.endType->excludes(self) and self.endType>collect(et|et.allparents()->excludes(self)) Property represents a declared state of one or more instances in terms of a named relationship to a value or values. When a property is an attribute of a classifier, the value or values are related to the instance of the classifier by being held in slots of the instance. When a property is an association end, the value or values are related to the instance or instances at the other end(s) of the association. The range of valid values represented by the property can be controlled by setting the property's type. Designates the optional association end that owns a qualifier attribute. An optional list of ordered qualifier attributes for the end. If the list is empty, then the Association is not qualified. Indicates the dependencies that reference the supplier. 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 composition of an Expression that states the abstraction relationship between the supplier and the client. 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. References the substitutions that are owned by this Classifier. A dependency is a relationship that signifies that a single or a set of model elements requires other model elements for their specification or implementation. This means that the complete semantics of the depending elements is 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) independent of the client element(s), in the same respect and the same dependency relationship. In some directed dependency relationships (such as Refinement Abstractions), a common convention in the domain of class-based OO software is to put the more abstract element in this role. Despite this convention, users of UML may stipulate a sense of dependency suitable for their domain, which makes a more abstract element dependent on that which is more specific. Indicates the dependencies that reference the client. Specifies the namespace that owns the NamedElement. Missing derivation for NamedElement::/namespace : Namespace OCL true A collection of NamedElements owned by the Namespace. Missing derivation for Namespace::/ownedMember : NamedElement OCL true 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. A substitution is a relationship between two classifiers signifies 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 usage is a relationship in which one element requires another element (or set of elements) for its full implementation or operation. A usage is a dependency in which the client requires the presence of the supplier. A behaviored classifier may have an interface realization. The set of InterfaceRealizations owned by the BehavioredClassifier. Interface realizations reference the Interfaces of which the BehavioredClassifier is an implementation. An interface is a kind of classifier that represents a declaration of a set of coherent public features and obligations. An interface specifies a contract; any instance of a classifier that realizes the interface must fulfill that contract. The obligations that may be associated with an interface are in the form of various kinds of constraints (such as pre- and post-conditions) or protocol specifications, which may impose ordering restrictions on interactions through the interface. The visibility of all features owned by an interface must be public. OCL self.feature->forAll(f | f.visibility = #public) References all the Classifiers that are defined (nested) within the Class. The attributes (i.e. the properties) owned by the class. The operations owned by the class. References all the Interfaces redefined by this Interface. An interface realization is a specialized realization relationship between a classifier and an interface. This relationship signifies that the realizing classifier conforms to the contract specified by the interface. References the Interface specifying the conformance contract. References the BehavioredClassifier that owns this Interfacerealization (i.e., the classifier that realizes the Interface to which it points). The Interface that owns this Operation. References the Interface that owns the Property An association describes a set of tuples whose values refer to typed instances. An instance of an association is called a link. A link is a tuple with one value for each end of the association, where each value is an instance of the type of the end. Only binary associations can be aggregations. OCL self.memberEnd->exists(aggregation <> Aggregation::none) implies self.memberEnd->size() = 2 An association specializing another association has the same number of ends as the other association. OCL parents()->select(oclIsKindOf(Association)).oclAsType(Association)->forAll(p | p.memberEnd->size() = self.memberEnd->size()) Association ends of associations with more than two ends must be owned by the association. OCL if memberEnd->size() > 2 then ownedEnd->includesAll(memberEnd) When an association specializes another association, every end of the specific association corresponds to an end of the general association, and the specific end reaches the same type or a subtype of the more general end. OCL Sequence{1..self.memberEnd->size()}-> forAll(i | self.general->select(oclIsKindOf(Association)).oclAsType(Association)-> forAll(ga |self.memberEnd->at(i).type.conformsTo(ga.memberEnd->at(i).type))) References the classifiers that are used as types of the ends of the association. Specifies whether the association is derived from other model elements such as other associations or constraints. Each end represents participation of instances of the classifier connected to the end in links of the association. The navigable ends that are owned by the association itself. The ends that are owned by the association itself. endType is derived from the types of the member ends. OCL result = self.memberEnd->collect(e | e.type) A behavioral feature is a feature of a classifier that specifies an aspect of the behavior of its instances. Specifies the ordered set of formal parameters of this BehavioralFeature. References the Types representing exceptions that may be raised during an invocation of this feature. The query isDistinguishableFrom() determines whether two BehavioralFeatures may coexist in the same Namespace. It specifies that they have to have different signatures. OCL result = if n.oclIsKindOf(BehavioralFeature) then if ns.getNamesOfMember(self)->intersection(ns.getNamesOfMember(n))->notEmpty() then Set{}->including(self)->including(n)->isUnique(bf | bf.ownedParameter->collect(type)) else true endif else true endif A class describes a set of objects that share the same specifications of features, constraints, and semantics. If true, the Classifier does not provide a complete declaration and can typically not be instantiated. An abstract classifier is intended to be used by other classifiers e.g. as the target of general metarelationships or generalization relationships. References all the Classifiers that are defined (nested) within the Class. The attributes (i.e. the properties) owned by the class. The operations owned by the class. This gives the superclasses of a class. The inherit operation is overridden to exclude redefined properties. OCL result = inhs->excluding(inh | ownedMember->select(oclIsKindOf(RedefinableElement))->select(redefinedElement->includes(inh))) Missing derivation for Class::/superClass : Class OCL true A classifier is a classification of instances - it describes a set of instances that have features in common. A classifier can specify a generalization hierarchy by referencing its general classifiers. The parents of a classifier must be non-final. OCL self.parents()->forAll(not isFinalSpecialization) A classifier may only specialize classifiers of a valid type. OCL self.parents()->forAll(c | self.maySpecializeType(c)) 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 self.allParents()->includes(self) Refers to all of the Properties that are direct (i.e. not inherited or imported) attributes of the classifier. Specifies each feature defined in the classifier. Specifies the general Classifiers for this Classifier. Specifies the Generalization relationships for this Classifier. These Generalizations navigaten to more general classifiers in the generalization hierarchy. Specifies all elements inherited by this classifier from the general classifiers. If true, the Classifier does not provide a complete declaration and can typically not be instantiated. An abstract classifier is intended to be used by other classifiers e.g. as the target of general metarelationships or generalization relationships. If true, the Classifier cannot be specialized by generalization. Note that this property is preserved through package merge operations; that is, the capability to specialize a Classifier (i.e., isFinalSpecialization =false) must be preserved in the resulting Classifier of a package merge operation where a Classifier with isFinalSpecialization =false is merged with a matching Classifier with isFinalSpecialization =true: the resulting Classifier will have isFinalSpecialization =false. References the Classifiers that are redefined by this Classifier. 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)) The query allParents() gives all of the direct and indirect ancestors of a generalized Classifier. OCL result = self.parents()->union(self.parents()->collect(p | p.allParents()) 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 = (self=other) or (self.allParents()->includes(other)) The general classifiers are the classifiers referenced by the generalization relationships. OCL result = self.parents() The query hasVisibilityOf() determines whether a named element is visible in the classifier. By default all are visible. It is only called when the argument is something owned by a parent. OCL result = (n.visibility <> VisibilityKind::private) OCL self.allParents()->including(self)->collect(c | c.member)->includes(n) The query inherit() defines how to inherit a set of elements. Here the operation is defined to inherit them all. It is intended to be redefined in circumstances where inheritance is affected by redefinition. OCL result = inhs 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 = self.inherit(self.parents()->collect(p|p.inheritableMembers(self))->asSet()) 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 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. The value specification for a constraint must evaluate to a Boolean value. OCL true A constraint cannot be applied to itself. OCL not constrainedElement->includes(self) Evaluating the value specification for a constraint must not have side effects. OCL true The ordered set of Elements referenced by this Constraint. Specifies the namespace that owns the NamedElement. A condition that must be true when evaluated in order for the constraint to be satisfied. A data type is a type whose instances are identified only by their value. A data type may contain attributes to support the modeling of structured data types. The Attributes owned by the DataType. The Operations owned by the DataType. The inherit operation is overridden to exclude redefined properties. OCL result = inhs->excluding(inh | ownedMember->select(oclIsKindOf(RedefinableElement))->select(redefinedElement->includes(inh))) A directed relationship represents a relationship between a collection of source model elements and a collection of target model elements. Specifies the sources of the DirectedRelationship. Specifies the targets 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 self.mustBeOwned() implies owner->notEmpty() An element may not directly or indirectly own itself. OCL not self.allOwnedElements()->includes(self) The Comments owned by this element. The Elements owned by this element. The Element that owns this element. The query allOwnedElements() gives all of the direct and indirect owned elements of an element. OCL result = ownedElement->union(ownedElement->collect(e | e.allOwnedElements())) 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 element import identifies an element in another package, and allows the element to be referenced using its name without a qualifier. The visibility of an ElementImport is either public or private. OCL self.visibility = #public or self.visibility = #private An importedElement has either public visibility or no visibility at all. OCL self.importedElement.visibility.notEmpty() implies self.importedElement.visibility = #public Specifies the name that should be added to the namespace of the importing package in lieu of the name of the imported packagable element. The aliased name must not clash with any other member name in the importing package. 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 Package. Specifies the visibility of the imported PackageableElement within the importing Package. The default visibility is the same as that of the imported element. If the imported element does not have a visibility, it is possible to add visibility to the element import. The query getName() returns the name under which the imported PackageableElement will be known in the importing namespace. OCL result = if self.alias->notEmpty() then self.alias else self.importedElement.name endif An enumeration is a data type whose values are enumerated in the model as enumeration literals. The ordered set of literals for this Enumeration. An enumeration literal is a user-defined data value for an enumeration. OCL classifier = enumeration The classifier of this EnumerationLiteral derived to be equal to its enumeration. The Enumeration that this EnumerationLiteral is a member of. Missing derivation for EnumerationLiteral::/classifier : Enumeration OCL true An expression represents a node in an expression tree, which may be non-terminal or terminal. It defines a symbol, and has a possibly empty sequence of operands which are value specifications. Specifies a sequence of operands. The symbol associated with the node in the expression tree. A feature declares a behavioral or structural characteristic of instances 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 indirect instance of the general classifier. Thus, the specific classifier inherits the features of the more general classifier. References the general classifier in the Generalization relationship. Indicates whether the specific classifier can be used wherever the general classifier can be used. If true, the execution traces of the specific classifier will be a superset of the execution traces of the general classifier. References the specializing classifier in the Generalization relationship. An instance specification is a model element that represents an instance in a modeled system. One structural feature (including the same feature inherited from multiple classifiers) is the defining feature of at most one slot in an instance specification. OCL classifier->forAll(c | (c.allFeatures()->forAll(f | slot->select(s | s.definingFeature = f)->size() <= 1))) The defining feature of each slot is a structural feature (directly or inherited) of a classifier of the instance specification. OCL slot->forAll(s | classifier->exists (c | c.allFeatures()->includes (s.definingFeature))) 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 structural feature of the instance. An instance specification can have one slot per structural feature of its classifiers, including inherited features. It is not necessary to model a slot for each structural feature, in which case the instance specification is a partial description. A specification of how to compute, derive, or construct the instance. An instance value is a value specification that identifies an instance. The instance that is the specified value. A literal Boolean is a specification of a Boolean value. The specified Boolean value. The query booleanValue() gives the value. OCL result = value The query isComputable() is redefined to be true. OCL result = true A literal integer is a specification of an integer value. The specified Integer value. The query integerValue() gives the value. OCL result = value The query isComputable() is redefined to be true. OCL result = true A literal null specifies the lack of a value. The query isComputable() is redefined to be true. OCL result = true The query isNull() returns true. OCL result = true A literal real is a specification of a real value. The query isComputable() is redefined to be true. OCL result = true The query realValue() gives the value. OCL result = value A literal specification identifies a literal constant being modeled. A literal string is a specification of a string value. The specified String value. The query isComputable() is redefined to be true. OCL result = true The query stringValue() gives the value. OCL result = value A literal unlimited natural is a specification of an unlimited natural number. The specified UnlimitedNatural value. The query isComputable() is redefined to be true. OCL result = true The query unlimitedValue() gives the value. OCL result = value 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 multiplicity element embeds this information to specify the allowable cardinalities for an instantiation of this element. The lower bound must be a non-negative integer literal. OCL lowerBound()->notEmpty() implies lowerBound() >= 0 If a non-literal ValueSpecification is used for the lower or upper bound, then evaluating that specification must not have side effects. OCL true The upper bound must be greater than or equal to the lower bound. OCL (upperBound()->notEmpty() and lowerBound()->notEmpty()) implies upperBound() >= lowerBound() If a non-literal ValueSpecification is used for the lower or upper bound, then that specification must be a constant expression. OCL true For a multivalued multiplicity, this attribute specifies whether the values in an instantiation of this element are sequentially ordered. For a multivalued multiplicity, this attributes specifies whether the values in an instantiation of this element are unique. Specifies the lower bound of the multiplicity interval. The specification of the lower bound for this multiplicity. Specifies the upper bound of the multiplicity interval. The specification of the upper bound for this multiplicity. The query includesCardinality() checks whether the specified cardinality is valid for this multiplicity. OCL result = (lowerBound() <= C) and (upperBound() >= C) OCL upperBound()->notEmpty() and lowerBound()->notEmpty() The query includesMultiplicity() checks whether this multiplicity includes all the cardinalities allowed by the specified multiplicity. OCL result = (self.lowerBound() <= M.lowerBound()) and (self.upperBound() >= M.upperBound()) OCL self.upperBound()->notEmpty() and self.lowerBound()->notEmpty() and M.upperBound()->notEmpty() and M.lowerBound()->notEmpty() 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. OCL result = if lowerValue->isEmpty() 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. OCL result = if upperValue->isEmpty() then 1 else upperValue.unlimitedValue() endif A named element is an element in a model that may have a name. If a NamedElement is not owned by a Namespace, it does not have a visibility. OCL namespace->isEmpty() implies visibility->isEmpty() If there is no name, or one of the containing namespaces has no name, there is no qualified name. OCL (self.name->isEmpty() or self.allNamespaces()->select(ns | ns.name->isEmpty())->notEmpty()) implies self.qualifiedName->isEmpty() When there is a name, and all of the containing namespaces have a name, the qualified name is constructed from the names of the containing namespaces. OCL (self.name->notEmpty() and self.allNamespaces()->select(ns | ns.name->isEmpty())->isEmpty()) implies self.qualifiedName = self.allNamespaces()->iterate( ns : Namespace; result: String = self.name | ns.name->union(self.separator())->union(result)) The name of the NamedElement. Specifies the namespace that owns the NamedElement. A name which 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 where the NamedElement appears within different Namespaces within the overall model, and its accessibility. The query allNamespaces() gives the sequence of namespaces in which the NamedElement is nested, working outwards. OCL result = if self.namespace->isEmpty() then Sequence{} else self.namespace.allNamespaces()->prepend(self.namespace) 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 unrelated types or (b) they have related types but different names. OCL result = if self.oclIsKindOf(n.oclType) or n.oclIsKindOf(self.oclType) then ns.getNamesOfMember(self)->intersection(ns.getNamesOfMember(n))->isEmpty() else true endif When there is a name, and all of the containing namespaces have a name, the qualified name is constructed from the names of the containing namespaces. OCL result = if self.name->notEmpty() and self.allNamespaces()->select(ns | ns.name->isEmpty())->isEmpty() then self.allNamespaces()->iterate( ns : Namespace; result: String = self.name | ns.name->union(self.separator())->union(result)) else Set{} endif The query separator() gives the string that is used to separate names when constructing a qualified name. OCL result = '::' A namespace is an element in a model that contains a set of named elements that can be identified by name. All the members of a Namespace are distinguishable within it. OCL membersAreDistinguishable() 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. 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. In general a member can have multiple names in a Namespace if it is imported more than once with different aliases. The query takes account of importing. It gives back the set of names that an element would have in an importing namespace, either because it is owned, or if not owned then imported individually, or if not individually then from a package. OCL result = if self.ownedMember ->includes(element) then Set{}->include(element.name) else let elementImports: ElementImport = self.elementImport->select(ei | ei.importedElement = element) in if elementImports->notEmpty() then elementImports->collect(el | el.getName()) else self.packageImport->select(pi | pi.importedPackage.visibleMembers()->includes(element))-> collect(pi | pi.importedPackage.getNamesOfMember(element)) 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 owned members, and also excludes elements which would have the same name when imported. OCL result = self.excludeCollisions(imps)->select(imp | self.ownedMember->forAll(mem | mem.imp.isDistinguishableFrom(mem, self))) The importedMember property is derived from the ElementImports and the PackageImports. References the PackageableElements that are members of this Namespace as a result of either PackageImports or ElementImports. OCL result = self.importMembers(self.elementImport.importedElement.asSet()- >union(self.packageImport.importedPackage->collect(p | p.visibleMembers()))) The Boolean query membersAreDistinguishable() determines whether all of the namespace's members are distinguishable within it. OCL result = self.member->forAll( memb | self.member->excluding(memb)->forAll(other | memb.isDistinguishableFrom(other, self))) An opaque expression is an uninterpreted textual statement that denotes a (possibly empty) set of values when evaluated in a context. If the language attribute is not empty, then the size of the body and language arrays must be the same. OCL language->notEmpty() implies (body->size() = language->size()) The text of the expression, possibly in multiple languages. Specifies the languages in which the expression is stated. The interpretation of the expression body depends on the languages. If the languages are unspecified, they might be implicit from the expression body or the context. Languages are matched to body strings by order. The query isIntegral() tells whether an expression is intended to produce an integer. OCL result = false The query isNonNegative() tells whether an integer expression has a non-negative value. OCL self.isIntegral() OCL result = false The query isPositive() tells whether an integer expression has a positive value. OCL self.isIntegral() OCL result = false The query value() gives an integer value for an expression intended to produce one. OCL true OCL self.isIntegral() An operation is a behavioral feature of a classifier that specifies the name, type, parameters, and constraints for invoking an associated behavior. A bodyCondition can only be specified for a query operation. OCL bodyCondition->notEmpty() implies isQuery An operation can have at most one return parameter; i.e., an owned parameter with the direction set to 'return' OCL self.ownedParameter->select(par | par.direction = #return)->size() <= 1 An optional Constraint on the result values of an invocation of this Operation. The class that owns the operation. The DataType that owns this Operation. Specifies whether the return parameter is ordered or not, if present. 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. Specifies the lower multiplicity of the return parameter, if present. Specifies 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. References the Types representing exceptions that may be raised during an invocation of this operation. References the Operations that are redefined by this Operation. Specifies the return result of the operation, if present. Specifies the upper multiplicity of the return parameter, if present. A redefining operation is consistent with a redefined operation if it has the same number of owned parameters, and the type of each owned parameter conforms to the type of the corresponding redefined parameter. OCL result = redefinee.oclIsKindOf(Operation) and let op : Operation = redefinee.oclAsType(Operation) in self.ownedParameter->size() = op.ownedParameter->size() and Sequence{1..self.ownedParameter->size()}-> forAll(i |op.ownedParameter->at(1).type.conformsTo(self.ownedParameter->at(i).type)) OCL redefinee.isRedefinitionContextValid(self) 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()->any().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()->any().isUnique else true endif If this operation has a return parameter, lower equals the value of lower for that parameter. Otherwise lower is not defined. OCL result = if returnResult()->notEmpty() then returnResult()->any().lower else Set{} 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 (par | par.direction = #return) If this operation has a return parameter, type equals the value of type for that parameter. Otherwise type is not defined. OCL result = if returnResult()->notEmpty() then returnResult()->any().type else Set{} endif If this operation has a return parameter, upper equals the value of upper for that parameter. Otherwise upper is not defined. OCL result = if returnResult()->notEmpty() then returnResult()->any().upper else Set{} endif 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 self.ownedElements->forAll(e | e.visibility->notEmpty() implies e.visbility = #public or e.visibility = #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 packaged elements that are Types. References the PackageMerges that are owned by this Package. Specifies the packageable elements that are owned by this Package. The query makesVisible() defines whether a Package makes an element visible outside itself. Elements with no visibility and elements with public visibility are made visible. OCL result = (ownedMember->includes(el)) or (elementImport->select(ei|ei.importedElement = #public)->collect(ei|ei.importedElement)->includes(el)) or (packageImport->select(pi|pi.visibility = #public)->collect(pi|pi.importedPackage.member->includes(el))->notEmpty()) OCL self.member->includes(el) The query mustBeOwned() indicates whether elements of this type must have an owner. OCL result = false Missing derivation for Package::/nestedPackage : Package OCL true Missing derivation for Package::/ownedType : Type OCL true The query visibleMembers() defines which members of a Package can be accessed outside it. OCL result = member->select( m | self.makesVisible(m)) A package import is a relationship that allows the use of unqualified names to refer to package members from other namespaces. The visibility of a PackageImport is either public or private. OCL self.visibility = #public or self.visibility = #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 importing Namespace, i.e., whether imported elements will in turn be visible to other packages that use that importingPackage as an importedPackage. If the PackageImport is public, the imported elements will be visible outside the package, while if it is private they will not. A package merge defines how the contents of one package are extended by the contents of another package. References the Package that is to be merged with the receiving package of the PackageMerge. References the Package that is being extended with the contents of the merged package of the PackageMerge. A packageable element indicates a named element that may be owned directly by a package. Indicates that packageable elements must always have a visibility, i.e., visibility is not optional. A parameter is a specification of an argument used to pass information into or out of an invocation of a behavioral feature. Specifies 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. References the Operation owning this parameter.