-- =============================================================================
--               ITU-T Rec. X.725 (1995) | ISO/IEC 10165-7 : 1996
-- =============================================================================
--<GDMO.Alias "ITU-T Rec. X.725 (1995) | ISO/IEC 10165-7 : 1996"
--            "ITU-T Rec. X.725 | ISO/IEC 10165-7">--
-- =========================================================
--<GDMO.Document "ITU-T Rec. X.725 (1995) | ISO/IEC 10165-7 : 1996" >--

--<GDMO.Alias    "ITU-T Rec. X.721 (1992) | ISO/IEC 10165-2 : 1992"
--               "CCITT Rec. X.721 (1992) | ISO/IEC 10165-2 : 1992",
--               "ITU-T Rec. X721 | ISO/IEC 10165-2",
--               "ITU-T Rec. X.721 | ISO/IEC 10165-2",
--               "CCITT Rec. X.721 | ISO/IEC 10165-2">--

--<GDMO.Alias    "ITU-T Rec. X.741 (1995) | ISO/IEC 10164-9 : 1995"
--               "CCITT Rec. X.741 (1995) | ISO/IEC 10164-9 : 1995",
--               "ITU-T Rec. X.741 | ISO/IEC 10164-9">--


genericRelationshipObject MANAGED OBJECT CLASS
  DERIVED FROM "ITU-T Rec. X.721 (1992) | ISO/IEC 10165-2 : 1992":top;
  CHARACTERIZED BY genericRelationshipObjectPackage PACKAGE
    ATTRIBUTES relationshipName GET,
      relationshipClass GET,
      relationshipMapping GET;
    ATTRIBUTE GROUPS
      "ITU-T Rec. X.721 (1992) | ISO/IEC 10165-2 : 1992":relationships;;;
REGISTERED AS {GRMD.grm-Object 1};


genericRelationshipObject-system NAME BINDING
  SUBORDINATE OBJECT CLASS genericRelationshipObject AND SUBCLASSES;
  NAMED BY SUPERIOR OBJECT CLASS
    "ITU-T Rec. X.721 (1992) | ISO/IEC 10165-2 : 1992":system AND SUBCLASSES;
  WITH ATTRIBUTE relationshipName;
REGISTERED AS {GRMD.grm-NameBinding 1};


relationshipName ATTRIBUTE
  WITH ATTRIBUTE SYNTAX GRM-ASN1Module.SimpleNameType;
  MATCHES FOR EQUALITY;
REGISTERED AS {GRMD.grm-Attribute 1};


relationshipClass ATTRIBUTE
  WITH ATTRIBUTE SYNTAX GRM-ASN1Module.RelationshipClass;
  MATCHES FOR EQUALITY;
REGISTERED AS {GRMD.grm-Attribute 2};


relationshipMapping ATTRIBUTE
  WITH ATTRIBUTE SYNTAX GRM-ASN1Module.RelationshipMapping;
  MATCHES FOR EQUALITY;
REGISTERED AS {GRMD.grm-Attribute 3};


participantPointer ATTRIBUTE
  WITH ATTRIBUTE SYNTAX GRM-ASN1Module.GroupObjects;
  MATCHES FOR EQUALITY, SET-INTERSECTION, SET-COMPARISON;
  PARAMETERS noSuchObject,
    roleInstanceConflict,
    roleCardinalityViolation,
    relationshipCardinalityViolation;;
--  An implementation may choose to apply ASN.1 subtyping restrictions to the
--  attribute syntax of the participantPointer attribute to reflect the
--  permitted role cardinality constraints defined in a specification.


noSuchObject PARAMETER
  CONTEXT SPECIFIC-ERROR;
  WITH SYNTAX GRM-ASN1Module.ObjectInstance;
REGISTERED AS {GRMD.grm-Parameter 1};


roleCardinalityViolation PARAMETER
  CONTEXT SPECIFIC-ERROR;
  WITH SYNTAX GRM-ASN1Module.Null;
REGISTERED AS {GRMD.grm-Parameter 3};


roleInstanceConflict PARAMETER
  CONTEXT SPECIFIC-ERROR;
  WITH SYNTAX GRM-ASN1Module.ObjectInstance;
REGISTERED AS {GRMD.grm-Parameter 2};


relationshipCardinalityViolation PARAMETER
  CONTEXT SPECIFIC-ERROR;
  WITH SYNTAX GRM-ASN1Module.Null;
REGISTERED AS {GRMD.grm-Parameter 4};


symmetricRelationship RELATIONSHIP CLASS
  BEHAVIOUR symmetricRelationshipBehaviour;
  SUPPORTS
    ESTABLISH establishSymmetricRelationship,
    TERMINATE terminateSymmetricRelationship,
    QUERY querySymmetricRelationship;
  ROLE peerRole
    PERMITTED-ROLE-CARDINALITY-CONSTRAINT GRMExample.TwoToMax
    REQUIRED-ROLE-CARDINALITY-CONSTRAINT GRMExample.Two
    PERMITTED-RELATIONSHIP-CARDINALITY-CONSTRAINT GRMExample.One
  REGISTERED AS {GRMExample.grmEx-Role 4};
REGISTERED AS {GRMExample.grmEx-RelationshipClass 2};


symmetricRelationshipBehaviour BEHAVIOUR DEFINED AS
  " INVARIANT: This relationship has one role - the peer role - for which the
  minimum permitted and minimum required role cardinality constraint is 2. The
  existence of an instance of this relationship class implies the existence of
  at least two corresponding managed objects fulfilling the peer role.

    OPERATIONS:

    ESTABLISH establishSymmetricRelationship

  Signature: The class and identity of the proposed participants in the peer
  role to be bound in a new instance of the Symmetric Relationship class.
  Precondition: The instance of the Symmetric Relationship relationship class
  does not exist.

  Postcondition: The participants in the peer role exist; the instance of the
  Symmetric Relationship relationship class exists; the participants in the peer
  role referenced in the signature are bound in this instance of the Symmetric
  Relationship class.

    TERMINATE terminateSymmetricRelationship Signature: The identity of the
    Symmetric Relationship relationship instance to be terminated.

  Precondition: The instance of the Symmetric Relationship relationship class
  referenced in the signature exists; the participants in the peer role bound in
  this instance of the Symmetric Relationship class exist.

  Postcondition: The referenced instance of the Symmetric Relationship
  relationship class does not exist; the participants in the peer role which
  were bound in this instance of the Symmetric Relationship class exist.";


symmetricRelationshipMapping RELATIONSHIP MAPPING
  RELATIONSHIP CLASS symmetricRelationship;
  BEHAVIOUR symmetricRelationshipMappingBehaviour BEHAVIOUR DEFINED AS
    " This representation of the symmetric relationship uses a relationship
    object to represent the relationship. Objects fulfilling the peer role are
    identified by the peerPointer attribute of the symmetric relationship
    managed object.";;
  RELATIONSHIP OBJECT symmetricRelationshipObject;
  ROLE peerRole RELATED-CLASSES "ITU-T Rec. X.721 (1992) | ISO/IEC 10165-2 : 1992":top
    REPRESENTED-BY RELATIONSHIP-OBJECT-USING-POINTER peerPointer;
  OPERATIONS MAPPING
    ESTABLISH establishSymmetricRelationship
      MAPS-TO-OPERATION CREATE OF RELATIONSHIP OBJECT,
    TERMINATE terminateSymmetricRelationship
      MAPS-TO-OPERATION DELETE OF RELATIONSHIP OBJECT,
    QUERY querySymmetricRelationship
      MAPS-TO-OPERATION GET peerPointer OF RELATIONSHIP OBJECT;
REGISTERED AS {GRMExample.grmEx-RelationshipMapping 3};


symmetricRelationshipObject MANAGED OBJECT CLASS
  DERIVED FROM genericRelationshipObject;
  CHARACTERIZED BY symmetricRelationshipPackage PACKAGE
    ATTRIBUTES peerPointer GET-REPLACE ADD-REMOVE;;;
REGISTERED AS {GRMExample.grmEx-Object 3};


peerPointer ATTRIBUTE
  DERIVED FROM participantPointer;
REGISTERED AS {GRMExample.grmEx-Attribute 1};


dependency RELATIONSHIP CLASS
  BEHAVIOUR dependencyBehaviour;
  SUPPORTS
    ESTABLISH establishDependency,
    TERMINATE terminateDependency,
    QUERY queryDependents,
    QUERY queryParent;
  QUALIFIED BY timeOfEstablishment;
  ROLE parentRole
    PERMITTED-ROLE-CARDINALITY-CONSTRAINT GRMExample.One
    REQUIRED-ROLE-CARDINALITY-CONSTRAINT  GRMExample.One
    PERMITTED-RELATIONSHIP-CARDINALITY-CONSTRAINT GRMExample.One
  REGISTERED AS {GRMExample.grmEx-Role 5}
  ROLE dependentRole
    PERMITTED-ROLE-CARDINALITY-CONSTRAINT GRMExample.OneToMax
    REQUIRED-ROLE-CARDINALITY-CONSTRAINT  GRMExample.One
    PERMITTED-RELATIONSHIP-CARDINALITY-CONSTRAINT GRMExample.One
      BIND-SUPPORT  bindDependent
      UNBIND-SUPPORT unbindDependent
  REGISTERED AS {GRMExample.grmEx-Role 6};
REGISTERED AS {GRMExample.grmEx-RelationshipClass 3};


dependencyBehaviour BEHAVIOUR DEFINED AS
  " INVARIANT: There exist two roles in this relationship class - parent role
  and dependent role. The existence of a participant in the dependent role
  implies the existence of at least one corresponding participant in the parent
  role. A managed object may not participate in both roles.

  COMMENTS: An object instance fulfilling the dependent role may only
  participate in one instance of this dependency relationship, that is, the
  relationship cardinality is equal to one. An object instance able to fulfil
  the parent role may exist outside a dependency relationship an object
  fulfilling a dependent role shall not. The qualifying attribute,
  timeOfEstablishment, indicates the time, in UTC time format, of establishment
  of the relationship.

    OPERATIONS:

    ESTABLISH establishDependency

  Signature:  The class and identity of the proposed participant object in the
  dependent role to be created by the ESTABLISH operation; the class and
  identity of the proposed participant in the parent role.

  Precondition: The proposed participant in the dependent role does not exist;
  the proposed participant in the parent role exists.

  Postcondition: A new instance of the dependency relationship class exists; the
  participants in the parent role and the dependent role proposed in the
  ESTABLISH signature exist and are bound in the new instance of the dependency
  relationship class. The qualifying attribute, timeOfEstablishment, is set to
  the current value of UTC time.

    BIND bindDependent

  Signature: The class and identity of a participant in the parent role; the
  class and identity of the proposed participant to be created in the dependent role.

  Precondition: The participant in the parent role exists and is bound into an
  instance of the dependency relationship class; the proposed participant in the
  dependent role does not exist.

  Postcondition: The participant in the dependent role referenced in the BIND
  signature exists and is bound into the same dependency relationship as that in
  which the participant in the parent role referenced in the BIND signature is bound.

    UNBIND unbindDependent

  Signature: The class and identity of a participant in the parent role; the
  class and identity of the participant in a dependent role.

  Precondition: The two participants identified in the UNBIND signature exist
  and are bound into the same instance of a dependency relationship; the
  dependency relationship exists; there exists at least one other participant in
  the dependent role bound into the relationship.

  Postcondition: The participant in the dependent role referenced in the UNBIND
  signature does not exist; all other participants bound into the instance of
  dependency relationship class exist and remain bound in the instance of the
  dependency relationship class.

    TERMINATE terminateDependency Signature: The identity of a dependency
    relationship instance to be terminated.

  Precondition: The instance of the dependency relationship class identified in
  the signature exists; only a single participant in dependent role is bound
  into the identified dependency relationship.

  Postcondition: The instance of the dependency relationship class referenced in
  the signature does not exists; the participant that was in the parent role
  exists. The participant(s) in  the dependent role do not exist. The value of
  the qualifying attribute, timeOfEstablishment, is undefined.";


person MANAGED OBJECT CLASS
  DERIVED FROM "ITU-T Rec. X.721 (1992) | ISO/IEC 10165-2 : 1992":top;
  CHARACTERIZED BY
    personPackage PACKAGE
      ATTRIBUTES personName GET;;;
REGISTERED AS {GRMExample.grmEx-Object 4};


personName ATTRIBUTE
  WITH ATTRIBUTE SYNTAX GRMExample.PersonName;
  MATCHES FOR EQUALITY;
REGISTERED AS {GRMExample.grmEx-Attribute 2};


timeOfEstablishment ATTRIBUTE
  WITH ATTRIBUTE SYNTAX GRMExample.TimeStamp ;
REGISTERED AS {GRMExample.grmEx-Attribute 3};


dependencyAttributeRepresentation RELATIONSHIP MAPPING
  RELATIONSHIP CLASS dependency;
  BEHAVIOUR dependencyAttributeRepresentationBehaviour;
  ROLE parentRole RELATED-CLASSES aPerson
    REPRESENTED-BY ATTRIBUTE parent
    QUALIFIES timeOfEstablishment,
  ROLE dependentRole RELATED-CLASSES bPerson
    REPRESENTED-BY ATTRIBUTE dependents;
  OPERATIONS MAPPING
    ESTABLISH establishDependency
      MAPS-TO-OPERATION CREATE OF dependentRole,
    TERMINATE terminateDependency
      MAPS-TO-OPERATION DELETE OF dependentRole,
    BIND bindDependent
      MAPS-TO-OPERATION CREATE OF dependentRole ,
    UNBIND unbindDependent
      MAPS-TO-OPERATION DELETE OF dependentRole,
    QUERY queryParent parentRole
      MAPS-TO-OPERATION GET parent OF dependentRole,
    QUERY queryDependents dependentRole
      MAPS-TO-OPERATION GET dependents OF parentRole;
REGISTERED AS {GRMExample.grmEx-RelationshipMapping 4};


dependencyAttributeRepresentationBehaviour  BEHAVIOUR DEFINED AS
  " This representation of the dependency relationship class uses conjugate
  participant pointers to represent an instance of the relationship; participant
  pointer consistency is to be maintained.

  The relationship management operations ESTABLISH establishDependency and BIND
  bindDependent both map to a create of a participant in the dependent role: the
  distinction being that the relationship management operation ESTABLISH
  establishDependency is used when a participant is the first to fulfil the
  dependent role; the relationship management operation BIND bindDependent is
  used when there is at least one other participant in the dependent role at the
  time of binding. After creation of an object of class bPerson with the
  attribute, parent, identifying an object of class aPerson, the value of the
  attribute, dependents, in the object of class aPerson identifies the
  corresponding object of class bPerson.

  Similarly, the relationship management operations TERMINATE
  terminateDependency and UNBIND unbindDependent both map to a delete of a
  participant in the dependentRole: the distinction being that the relationship
  management operation TERMINATE terminateDependency is used if there is only
  one participant fulfilling the dependentRole; the relationship management
  operation UNBIND unbindDependent is used if there is more than one participant
  fulfilling the dependentRole at time of deletion. Upon deletion of an object
  of class bPerson fulfilling the dependentRole, the value of the attribute,
  dependents, in the object of class aPerson object fulfilling the parentRole is
  modified by removing the identity of the corresponding object of class bPerson.

  The QUERY queryDependents relationship management operation maps to a GET of
  the dependents attribute in the aPerson object fulfilling a parentRole; the
  QUERY queryParent operation maps to a GET of the parent attribute in the
  bPerson object fulfilling a dependentRole.

  The creation of a bPerson managed object class (or bPerson subclass) results
  in the establishment of an instance of the dependency relationship with
  dependencyAttributeRepresentation RELATIONSHIP MAPPING when the value of the
  parent attribute in the object of class bPerson is set-by-create to an
  instance of a managed object of class aPerson and the value of the dependents
  attribute in the object of class aPerson is an empty set.

  The creation of a bPerson (or bPerson subclass) managed object results in its
  being bound to an instance of the dependency relationship with
  dependencyAttributeRepresentation RELATIONSHIP MAPPING when the value of the
  parent attribute in the bPerson object is set-by-create to an instance of
  aPerson managed object class and the dependents attribute in the aPerson
  object is a non-empty set.

  The deletion of a bPerson (or bPerson subclass) managed object results in its
  being unbound from an instance of the dependency relationship with
  dependencyAttributeRepresentation RELATIONSHIP MAPPING when the value of the
  dependents attribute in the aPerson object is not empty after the deletion and
  associated update of the dependents attribute.

  The deletion of a bPerson (or bPerson subclass) managed object results in the
  termination of an instance of the dependency relationship with
  dependencyAttributeRepresentation RELATIONSHIP MAPPING when the value of the
  dependents attribute in the aPerson object is empty after the deletion and the
  associated update of the dependents attribute.";


aPerson MANAGED OBJECT CLASS
  DERIVED FROM person;
  CHARACTERIZED BY parentPackage PACKAGE
    ATTRIBUTES dependents GET,
      timeOfEstablishment GET;;;
REGISTERED AS {GRMExample.grmEx-Object 5};


bPerson MANAGED OBJECT CLASS
  DERIVED FROM person;
  CHARACTERIZED BY
    dependentPackage PACKAGE
      ATTRIBUTES parent PERMITTED VALUES GRMExample.SingleValued GET;;;
REGISTERED AS {GRMExample.grmEx-Object 6};


dependents ATTRIBUTE
  DERIVED FROM participantPointer;
REGISTERED AS {GRMExample.grmEx-Attribute 4};


parent ATTRIBUTE
  DERIVED FROM participantPointer;
REGISTERED AS {GRMExample.grmEx-Attribute 5};


dependencyObjectRepresentation RELATIONSHIP MAPPING
  RELATIONSHIP CLASS dependency;
  BEHAVIOUR dependencyObjectRepresentationBehaviour;
  RELATIONSHIP OBJECT dependencyRelationshipObject
      QUALIFIES timeOfEstablishment;
  ROLE parentRole
    RELATED-CLASSES person
    REPRESENTED-BY RELATIONSHIP-OBJECT-USING-POINTER parent,
  ROLE dependentRole
    RELATED-CLASSES person
    REPRESENTED-BY RELATIONSHIP-OBJECT-USING-POINTER dependents;
  OPERATIONS MAPPING
    ESTABLISH establishDependency
      MAPS-TO-OPERATION CREATE OF RELATIONSHIP OBJECT,
    TERMINATE terminateDependency
      MAPS-TO-OPERATION DELETE OF RELATIONSHIP OBJECT,
    BIND bindDependent dependentRole
      MAPS-TO-OPERATION ADD dependents OF RELATIONSHIP OBJECT,
    UNBIND unbindDependent dependentRole
      MAPS-TO-OPERATION REMOVE dependents OF RELATIONSHIP OBJECT,
    QUERY queryDependents dependentRole
      MAPS-TO-OPERATION GET dependents OF RELATIONSHIP OBJECT,
    QUERY queryParents parentRole
      MAPS-TO-OPERATION GET parent OF RELATIONSHIP OBJECT;
REGISTERED AS {GRMExample.grmEx-RelationshipMapping 5};


dependencyObjectRepresentationBehaviour BEHAVIOUR DEFINED AS
  " This representation of the dependency relationship uses a relationship
  object to represent an instance of the relationship and to relate the
  participants. The relationship management operation ESTABLISH
  establishDependency maps to a CREATE of a dependencyRelationshipObject object
  and the relationship management operation TERMINATE terminateDependency maps
  to a DELETE of the dependencyRelationshipObject object. The relationship
  management operation BIND bindDependent maps to an ADD operation on the
  dependents attribute in a dependencyRelationshipObject object. The
  relationship management operation UNBIND unbindDependent maps to a REMOVE
  operation on the dependents attribute in the dependencyRelationshipObject object.

  The creation of a DependencyRelationshipObject object results in the
  establishment of a dependency relationship with the
  dependencyObjectRepresentation RELATIONSHIP MAPPING. Because the parent role
  is not dynamic (i.e. BIND-SUPPORT and UNBIND-SUPPORT are not defined for the
  parent role), the parent attribute within the DependencyRelationshipObject
  must be set-by-create to the value of exactly one instance of person object
  fulfilling the parentRole; the value of the parent attribute cannot be changed
  during the lifetime of the dependency operation.

  The addition of a value representing a person object to the dependents
  attribute of a dependencyRelationshipObject object results in the person
  object's being bound into the relationship corresponding to the
  dependencyRelationshipObject object in the dependentRole.

  The removal of a value representing a person object from the dependents
  attribute of a dependencyRelationshipObject object, results in the person
  object's being unbound from the relationship corresponding to the
  dependencyRelationshipObject object.

  The deletion of a dependencyRelationshipObject results in the termination of
  the corresponding dependency relationship with the
  dependencyObjectRepresentation RELATIONSHIP MAPPING.";


dependencyRelationshipObject MANAGED OBJECT CLASS
  DERIVED FROM genericRelationshipObject;
  CHARACTERIZED BY
    dependencyRelationshipObjectPackage PACKAGE
      ATTRIBUTES
        dependents GET-REPLACE ADD-REMOVE,
        parent GET,
        timeOfEstablishment GET;
    REGISTERED AS {GRMExample.grmEx-Package x};;
REGISTERED AS {GRMExample.grmEx-Object 7};


dependencyNamingRepresentation RELATIONSHIP MAPPING
  RELATIONSHIP CLASS dependency;
  BEHAVIOUR dependencyNamingRepresentationBehaviour;
  ROLE parentRole RELATED-CLASSES cPerson
    REPRESENTED-BY NAMING aNameBinding USING SUPERIOR
    QUALIFIES timeOfEstablishment,
  ROLE dependentRole RELATED-CLASSES person
    REPRESENTED-BY NAMING aNameBinding USING SUBORDINATE;
  OPERATIONS MAPPING
    ESTABLISH establishDependency MAPS-TO-OPERATION
      CREATE OF dependentRole,
    BIND bindDependent dependentRole MAPS-TO-OPERATION
      CREATE OF dependentRole,
    UNBIND unbindDependent dependentRole MAPS-TO-OPERATION
      DELETE OF dependentRole,
    TERMINATE terminateDependency MAPS-TO-OPERATION
      DELETE OF dependentRole,
    QUERY queryDependents dependentRole MAPS-TO-OPERATION
      GET "ITU-T Rec. X.721 | ISO/IEC 10165-2":nameBinding OF dependentRole,
    QUERY queryParent parentRole MAPS-TO-OPERATION
      GET "ITU-T Rec. X.721 | ISO/IEC 10165-2":nameBinding OF dependentRole;
REGISTERED AS {GRMExample.grmEx-RelationshipMapping 6};


dependencyNamingRepresentationBehaviour BEHAVIOUR DEFINED AS
  " This representation of the dependency relationship uses naming to represent
  an instance of the relationship.

  The relationship management operations ESTABLISH establishDependency and BIND
  bindDependent both map to a create of a person (or person subclass) object
  participant in the dependentRole using a name binding with a cPerson (or
  cPerson subclass) object as the superior object in the parentRole. The
  distinction is that: the relationship management operation ESTABLISH
  establishDependency is used when the proposed participant in the dependent
  role would be the first object in the role; the relationship management
  operation BIND bindDependent is used when there is at least one other
  participant in the dependent role at the time of creation.

  Similarly, the relationship management operations TERMINATE
  terminateDependency and UNBIND unbindDependent both map to a delete of a
  participant in the dependent role, the distinction being that: the
  relationship management operation TERMINATE terminateDependency is used if the
  participant is the only one fulfilling the dependentRole and the relationship
  management operations UNBIND unbindDependent is used if at least one other
  participant remains fulfilling the dependent role after deletion.

  The QUERY queryDependents relationship management operation maps to a scoped
  get of the nameBinding attribute with a scope level of one on the person
  object in the parent role to determine the contained person objects that have
  the value of their name binding attribute equal to aNameBinding; such objects
  are fulfilling the dependents role.

  The QUERY queryParent relationship management operation maps to a get of the
  nameBinding attribute of the subordinate object to determine that the value of
  its name binding attribute is equal to aNameBinding; subsequent analysis of
  the RDN of the subordinate object name will indicate the parent object.

  The creation of a person (or person subclass) managed object as a subordinate
  to a cPerson (or cPerson subclass) object with aNameBinding name binding
  results in the establishment of an instance of the dependency relationship
  with dependencyNamingRepresentation RELATIONSHIP MAPPING if there are no other
  subordinates with aNameBinding name binding.

  The creation of a person (or person subclass) managed object as a subordinate
  of a cPerson (or cPerson subclass) object with aNameBinding name binding
  results in the binding of the created object into a dependency relationship
  with the dependencyNamingRepresentation RELATIONSHIP MAPPING if there is at
  least one other subordinate with aNameBinding name binding.

  The deletion of a person (or person subclass) managed object bound in the
  dependent role of a dependency relationship with the
  dependencyNamingRepresentation RELATIONSHIP MAPPING, results in the unbinding
  of the deleted object from the dependency relationship when at least one other
  dependents with aNameBinding will exist after the deletion.

  The deletion of a person (or person subclass) managed object bound in the
  dependent role of a dependency relationship with the
  dependencyNamingRepresentation RELATIONSHIP MAPPING, results in the
  termination of the dependency relationship when there will exist no other
  dependents with aNameBinding after the deletion.";


aNameBinding NAME BINDING
  SUBORDINATE OBJECT CLASS person AND SUBCLASSES;
  NAMED BY SUPERIOR OBJECT CLASS cPerson AND SUBCLASSES;
  WITH ATTRIBUTE personName;
  CREATE;
  DELETE;
REGISTERED AS {GRMExample.grmEx-NameBinding x};


cPerson MANAGED OBJECT CLASS
  DERIVED FROM person;
  CHARACTERIZED BY
    timePackage PACKAGE
      ATTRIBUTES timeOfEstablishment GET;;;
REGISTERED AS {GRMExample.grmEx-Object 8};


generalCompositionRelationship RELATIONSHIP CLASS
  BEHAVIOUR generalCompositionRelationshipBehaviour;
  SUPPORTS
    ESTABLISH establishGeneralComposition,
    TERMINATE terminateGeneralComposition;
  ROLE compositeRole
    PERMITTED-ROLE-CARDINALITY-CONSTRAINT GRMExample.One
    REQUIRED-ROLE-CARDINALITY-CONSTRAINT GRMExample.One
  REGISTERED AS {GRMExample.grmEx-Role 7}
  ROLE componentRole
    PERMITTED-ROLE-CARDINALITY-CONSTRAINT GRMExample.OneToMax
    REQUIRED-ROLE-CARDINALITY-CONSTRAINT GRMExample.One
      BIND-SUPPORT bindComponent
      UNBIND-SUPPORT unbindComponent
  REGISTERED AS {GRMExample.grmEx-Role 8};
REGISTERED AS {GRMExample.grmEx-RelationshipClass 4};


generalCompositionRelationshipBehaviour BEHAVIOUR DEFINED AS
  " INVARIANT: The existence of an instance of this relationship class implies
  the existence of exactly one participant in the composite role and one or more
  participants in the component role. At least one property of the composite
  participant is such that it depends upon properties of the components. At
  least the identity of the composite participant is such that it is independent
  of the existence or properties of the components; that is, creating, updating,
  or deleting any component does not change the identity of the composite.

    OPERATIONS:

    ESTABLISH establishGeneralComposition

  Signature: The class and identity of the proposed participant in the composite
  role and the class and identity of the proposed participant(s) in the
  component role to be bound in an instance of the generalCompositionRelationship.

  Precondition: The proposed participants are not already bound in the same
  instance of the generalCompositionRelationship class or a subclass thereof.

  Postcondition: An instance of the generalCompositionRelationship class exists;
  the participants referenced in the signature are bound into this instance of
  the generalCompositionRelationship class.

    BIND bindComponent

  Signature: The class and identity of a proposed participant in the component
  role; the identity of a generalCompositionRelationship.

  Precondition: The referenced instance of the generalCompositionRelationship
  class exists; the proposed participant in the component role is not bound into
  this instance of generalCompositionRelationship class; there exists at least
  one other participant in the component role bound into this instance of the
  generalCompositionRelationship class.

  Postcondition: The participant in the component role referenced in the
  signature exists and is bound in this instance of the
  generalCompositionRelationship class.

    UNBIND unbindComponent

  Signature: The class and identity of a participant in the component role; the
  identity of a generalCompositionRelationship.

  Precondition: The instance of the generalCompositionRelationship class
  referenced in the signature exists; the participant in the component role
  referenced in the signature is bound into the referenced instance of
  generalCompositionRelationship class; there exists at least one other
  participant in the component role bound into the referenced instance of the
  generalCompositionRelationship class.

  Postcondition: The referenced participant in the component role exists but is
  not bound into the referenced instance of the generalCompositionRelationship
  class; the referenced instance of the generalCompositionRelationship class exists.

    TERMINATE terminateGeneralComposition Signature: The identity of a
    generalCompositionRelationship instance. Precondition: The referenced
    instance of the generalCompositionRelationship class exists.

  Postcondition: The referenced instance of the generalCompositionRelationship
  class does not exist; the participants in the composite role and in the
  component role that were bound into the relationship exist.";


subclassedCompositionRelationship RELATIONSHIP CLASS
  DERIVED FROM generalCompositionRelationship;
  BEHAVIOUR subclassedCompositionRelationshipBehaviour
    BEHAVIOUR DEFINED AS
      " This relationship class refines the required role cardinality of the
      component role of the generalCompositionRelationship class to be the range
      1 to 5; all other characteristics of this relationship class are inherited
      from the generalCompositionRelationship class.";;
  ROLE componentRole
    REQUIRED-ROLE-CARDINALITY-CONSTRAINT GRMExample.OneToFive;
REGISTERED AS {GRMExample.grmEx-Object 9};


accessControlDomain RELATIONSHIP CLASS
  BEHAVIOUR accessControlDomainBehaviour BEHAVIOUR DEFINED AS
    " This relationship class binds managed objects which are subject to access
    control (memberObjectRole) to managed objects representing the access
    enforcement function (aefRole) and access decision function (adfRole)
    respectively.";;
  SUPPORTS QUERY queryAccessControlDomain;
  ROLE memberObjectRole
    REQUIRED-ROLE-CARDINALITY-CONSTRAINT GRMExample.ZeroToTwo
      BIND-SUPPORT bindMember
      UNBIND-SUPPORT unbindMember
  REGISTERED AS {GRMExample.grmEx-Role memberObjectRoleArc(1) }
  ROLE aefRole
    COMPATIBLE-WITH "ITU-T Rec. X.741 | ISO/IEC 10164-9":notificationEmitter
    PERMITTED-ROLE-CARDINALITY-CONSTRAINT GRMExample.One
    REQUIRED-ROLE-CARDINALITY-CONSTRAINT GRMExample.One
  REGISTERED AS {GRMExample.grmEx-Role aefRoleArc(2) }
  ROLE adfRole
    COMPATIBLE-WITH "ITU-T Rec. X.741 | ISO/IEC 10164-9":accessControlRules
    PERMITTED-ROLE-CARDINALITY-CONSTRAINT GRMExample.One
    REQUIRED-ROLE-CARDINALITY-CONSTRAINT GRMExample.One
  REGISTERED AS {GRMExample.grmEx-Role adfRoleArc(3) };
REGISTERED AS {GRMExample.grmEx-RelationshipClass accessControlDomainArc(1) };


simpleAccessControlDomain RELATIONSHIP MAPPING
  RELATIONSHIP CLASS accessControlDomain;
  BEHAVIOUR simpleAccessControlDomainBehaviour
    BEHAVIOUR
    DEFINED AS
      ! In this mapping of the accessControlDomain managed relationship class,
      the accessControlDomainObject class (a subclass of the accessControlRules
      class) participates in the adfRole and the notificationEmitter class
      participates in the aefRole; any managed object may participate in the
      memberObjectRole. The memberObjectAttribute in the
      accessControlDomainObject identifies the participants in the
      memberObjectRole and the notificationEmitter-accessControlRules name
      binding contains the aef participant within the adf participant. The QUERY
      queryAccessControlDomain relationship management operation maps to two
      operations, namely : (a) a GET of the memberObjectAttribute of the object
      fulfilling the adfRole; followed by

      (b) a scoped GET of the nameBinding attribute with a scope level of one on
      the object fulfilling the adf role to determine the contained objects that
      have the value of their name binding attribute equal to
      "ITU-T Rec. X.741 | ISO/IEC 10164-9":notificationEmitter-accessControlRules.!;;
  ROLE
    memberObjectRole RELATED-CLASSES  "ITU-T Rec. X721 | ISO/IEC 10165-2":top
    REPRESENTED-BY ATTRIBUTE memberObjectAttribute,
  ROLE
    aefRole RELATED-CLASSES "ITU-T Rec. X.741 | ISO/IEC 10164-9":notificationEmitter
    REPRESENTED-BY NAMING
      "ITU-T Rec. X.741 | ISO/IEC 10164-9":notificationEmitter-accessControlRules
      USING SUBORDINATE,
  ROLE adfRole
    RELATED-CLASSES accessControlDomainObject
    REPRESENTED-BY NAMING
      "ITU-T Rec. X.741 | ISO/IEC 10164-9":notificationEmitter-accessControlRules
      USING SUPERIOR;
  OPERATIONS MAPPING
    BIND bindMember memberObjectRole MAPS-TO-OPERATION
      ADD memberObjectAttribute OF adfRole,
    UNBIND unbindMember memberObjectRole MAPS-TO-OPERATION
      REMOVE memberObjectAttribute OF adfRole,
    QUERY queryAccessControlDomain memberObjectRole MAPS-TO-OPERATION
      GET memberObjectAttribute OF adfRole
      GET "CCITT Rec. X.721 | ISO/IEC 10165-2":nameBinding OF adfRole;
REGISTERED AS {GRMExample.grmEx-RelationshipMapping simpleAccesControlDomainArc(1) };


accessControlDomainObject MANAGED OBJECT CLASS
  DERIVED FROM "ITU-T Rec. X.741 | ISO/IEC 10164-9":accessControlRules;
  CHARACTERIZED BY accessControlDomainPackage PACKAGE
    BEHAVIOUR accessControlDomainObjectBehaviour
      BEHAVIOUR DEFINED AS
        " Membership of the access control domain is identified and modified by
        operations upon the memberObjectAttribute.";;
    ATTRIBUTES memberObjectAttribute GET-REPLACE ADD-REMOVE;;;
REGISTERED AS {GRMExample.grmEx-Object accessControlDomainObjectArc(1) };


coordinatedAccessControlDomain RELATIONSHIP MAPPING
  RELATIONSHIP CLASS accessControlDomain;
  BEHAVIOUR coordinatedAccessControlDomainBehaviour
    BEHAVIOUR DEFINED AS
      " In this mapping of the accessControlDomain managed relationship class,
      the accessControlRules class participates in the adfRole and the
      notificationEmitter class participates in the aefRole; any managed object
      may participate in the memberObjectRole. The relationship is represented
      by the accessControlDomainCoordinator, a subclass of the
      genericRelationshipObject, using the memberObjectAttribute, aefAttribute,
      and adfAttribute attributes.

      The QUERY queryAccessControlDomain relationship management operation maps
      to three GET operations on the relationship object, namely:

      (a) a GET of the memberObjectAttribute;

      (b) a GET of the aefAttribute; and

      (c) a GET of the adfAttribute.";;
  RELATIONSHIP OBJECT accessControlDomainCoordinator;
  ROLE memberObjectRole
    RELATED-CLASSES "CCITT Rec. X.721 | ISO/IEC 10165-2":top
    REPRESENTED-BY RELATIONSHIP-OBJECT-USING-POINTER memberObjectAttribute,
  ROLE aefRole
    RELATED-CLASSES
    "ITU-T Rec. X.741 | ISO/IEC 10164-9":notificationEmitter
    REPRESENTED-BY RELATIONSHIP-OBJECT-USING-POINTER aefAttribute,
  ROLE adfRole
    RELATED-CLASSES "ITU-T Rec. X.741 | ISO/IEC 10164-9":accessControlRules
    REPRESENTED-BY RELATIONSHIP-OBJECT-USING-POINTER adfAttribute;
  OPERATIONS MAPPING
    BIND bindMember
      MAPS-TO-OPERATION ADD memberObjectAttribute OF RELATIONSHIP OBJECT,
    UNBIND unbindMember
      MAPS-TO-OPERATION REMOVE memberObjectAttribute OF RELATIONSHIP OBJECT,
    QUERY queryAccessControlDomain
      MAPS-TO-OPERATION
      GET memberObjectAttribute OF RELATIONSHIP OBJECT
      GET aefAttribute OF RELATIONSHIP OBJECT
      GET adfAttribute OF RELATIONSHIP OBJECT;
REGISTERED AS {GRMExample.grmEx-RelationshipMapping
  coordinatedAccessControlDomainArc(2)};


accessControlDomainCoordinator MANAGED OBJECT CLASS
  DERIVED FROM genericRelationshipObject;
  CHARACTERIZED BY
    accessControlDomainCoordinatorPackage PACKAGE
      ATTRIBUTES
        memberObjectAttribute ATTRIBUTE
          DERIVED FROM participantPointer;
        REGISTERED AS { GRMExample.grmEx-Attribute memberObjectAttributeArc(6) };
        GET-REPLACE ADD-REMOVE,
        aefAttribute ATTRIBUTE
          DERIVED FROM participantPointer;
        REGISTERED AS { GRMExample.grmEx-Attribute aefAttributeArc(7) };
          GET,
        adfAttribute ATTRIBUTE
          DERIVED FROM participantPointer;
        REGISTERED AS { GRMExample.grmEx-Attribute adfAttributeArc(8) };
          GET;;;
REGISTERED AS {GRMExample.grmEx-Object accessControlDomainCoordinatorArc(2)};

-- =============================================================================
--  Formatted by OpenT2 Version 5.5.6.34 on Fri Aug 20 11:20:49 2004