<?xml version="1.0" encoding="utf-8"?>
<!-- DTD for Activity -->

<!ELEMENT  ACTIVITY (ACTIVITY_TEMPLATE, ACTIVITY_INSTANCE*)>

<!ELEMENT ACTIVITY_TEMPLATE (PASSED_OBJECT*, TERMINATION_CONDITION?, ROLE+, ACTIVITY_TEMPLATE*)>
<!ATTLIST  ACTIVITY_TEMPLATE
 NAME CDATA #REQUIRED
 IDENTIFIER ID #REQUIRED
 OWNER IDREF #IMPLIED
 ASSIGNED_ROLES IDREFS #IMPLIED
>

<!ELEMENT PASSED_OBJECT EMPTY>
<!ATTLIST PASSED_OBJECT
  OBJECT_CONTEXT_REF IDREF #REQUIRED
  NAME CDATA #REQUIRED
  IDENTIFIER ID #REQUIRED
>

<!ELEMENT TERMINATION_CONDITION (DATE | IS_MEMBER| MEMBER_COUNT| EVENT_CONDITION
                                    |EVENT_COUNT_DIFF_CONDITION|AND|OR)>

<!ELEMENT DATE EMPTY>
<!ATTLIST DATE
  IDENTIFIER ID #REQUIRED
  RELATION (gt | lt | lte | gte | eq) "eq"
  MONTH (Jan|Feb|Mar|Apr|May|Jun|Jul|Aug|Sep|Oct|Nov|Dec) "Jan"
  DAY CDATA #REQUIRED
  YEAR CDATA #REQUIRED
  HOUR CDATA  #REQUIRED
  MIN CDATA  #REQUIRED
>

<!ELEMENT IS_MEMBER EMPTY>
<!ATTLIST IS_MEMBER
  TYPE (positive|negative) "positive"
  ROLE IDREF #REQUIRED
  PRINCIPAL CDATA #REQUIRED
>

<!ELEMENT MEMBER_COUNT ( MEMBERS | INTERSECT | UNION | DIFFERENCE) >
<!ATTLIST MEMBER_COUNT
  IDENTIFIER ID #REQUIRED
  RELATION (gt | lt | lte | gte | eq) "eq"
  VALUE NMTOKEN #REQUIRED
>

<!ELEMENT MEMBERS EMPTY >
<!ATTLIST MEMBERS
  ROLE IDREF #REQUIRED
>

<!ELEMENT INTERSECT (MEMBERS | INTERSECT | UNION | DIFFERENCE)+>

<!ELEMENT UNION (MEMBERS | INTERSECT | UNION | DIFFERENCE)+>

<!ELEMENT DIFFERENCE (MEMBERS | INTERSECT | UNION | DIFFERENCE)+>

<!ELEMENT EVENT_CONDITION (EVENT_COUNT) >
<!ATTLIST EVENT_CONDITION
  IDENTIFIER ID #REQUIRED
  TYPE (positive|negative) "positive"
  RELATION (gt | lt | lte | gte | eq) "eq"
  VALUE NMTOKEN #REQUIRED
>

<!ELEMENT EVENT_COUNT (EVENT_ATTRIBUTE*)>
<!ATTLIST EVENT_COUNT
  IDENTIFIER ID #REQUIRED
  EVENT_TYPE IDREF #IMPLIED
  SUFFIX (start|finish) "finish"
>

<!ELEMENT EVENT_ATTRIBUTE EMPTY>
<!ATTLIST EVENT_ATTRIBUTE
 NAME CDATA #REQUIRED
 RELATION (gt | lt | lte | gte | eq) "eq"
 VALUE CDATA #REQUIRED
>

<!ELEMENT EVENT_COUNT_DIFF_CONDITION (EVENT_COUNT, EVENT_COUNT)>
<!ATTLIST EVENT_COUNT_DIFF_CONDITION
  IDENTIFIER ID #REQUIRED
  TYPE (positive|negative) "positive"
  RELATION (gt | lt | lte | gte | eq) "eq"
  VALUE NMTOKEN #REQUIRED
>

<!ELEMENT AND (DATE | IS_MEMBER| MEMBER_COUNT| EVENT_CONDITION
                       |EVENT_COUNT_DIFF_CONDITION|AND|OR)+>
<!ATTLIST AND
  TYPE (positive|negative) "positive"
>

<!ELEMENT OR (DATE | IS_MEMBER| MEMBER_COUNT| EVENT_CONDITION
                    |EVENT_COUNT_DIFF_CONDITION| AND|OR)+>
<!ATTLIST OR
  TYPE (positive|negative) "positive"
>

<!-- Need More work, Temp solutions:
Return Typpe is an ID, hence an NEW_OBJECT with codebase has to be declared for this,
However PARAM_TYPE is CDATA and is codebase or thisUSer, 7/25, Tanvir
During calling need to ensure right types of value is passed with PARAMETER tags
-->
<!ELEMENT METHOD_SIGNATURE EMPTY>
<!ATTLIST METHOD_SIGNATURE
  NAME NMTOKEN #REQUIRED
  RETURN_TYPE IDREF #IMPLIED
  PARAM_TYPE CDATA #IMPLIED
>

<!ELEMENT OBJECT (ACL)>
<!ATTLIST OBJECT
 NAME CDATA #REQUIRED
 IDENTIFIER ID #REQUIRED
>

<!ELEMENT ACL (ACL_ENTRY*)>
<!ATTLIST ACL
  ACL_OWNER IDREF #IMPLIED
>

<!-- Principal can be a user or a role id -->
<!ELEMENT ACL_ENTRY (PERMISSION*)>
<!ATTLIST ACL_ENTRY
  ACL_ENTRY_TYPE (positive|negative) "positive"
  SUBJECT IDREFS #IMPLIED
>

<!ELEMENT PERMISSION (METHOD_SIGNATURE)>

<!ELEMENT ROLE (ADMISSION_CONSTRAINTS?, ACTIVATION_CONSTRAINTS?, OPERATION*)>
<!ATTLIST ROLE
  NAME CDATA #REQUIRED
  IDENTIFIER ID #REQUIRED
  OWNER IDREF #IMPLIED
  ASSIGN IDREFS #IMPLIED
  ROLE_INTERFACE NMTOKEN #IMPLIED
>

<!ELEMENT ADMISSION_CONSTRAINTS (DATE | IS_MEMBER| MEMBER_COUNT| EVENT_CONDITION|EVENT_COUNT_DIFF_CONDITION| AND|OR)+>

<!ELEMENT ACTIVATION_CONSTRAINTS (DATE | IS_MEMBER| MEMBER_COUNT| EVENT_CONDITION|EVENT_COUNT_DIFF_CONDITION|AND|OR)+>

<!ELEMENT OPERATION (PRECONDITION?, ACTION?)>
<!ATTLIST OPERATION
  NAME NMTOKEN #REQUIRED
  IDENTIFIER ID #REQUIRED
>

<!ELEMENT PRECONDITION (DATE | IS_MEMBER| MEMBER_COUNT| EVENT_CONDITION|EVENT_COUNT_DIFF_CONDITION|AND|OR)>

<!ELEMENT ACTION (NEW_OBJECT*, OBJECT_INTERFACE?, NEW_ACTIVITY?, METHOD_INVOCATION?, NOTIFY_EVENT? )>

<!ELEMENT NEW_OBJECT EMPTY>
<!ATTLIST NEW_OBJECT
  NAME CDATA #REQUIRED
  IDENTIFIER ID #REQUIRED
  CODEBASE CDATA #REQUIRED
  OWNER IDREF #IMPLIED
>

<!ELEMENT OBJECT_INTERFACE EMPTY>
<!ATTLIST OBJECT_INTERFACE
  CODEBASE CDATA #REQUIRED
  OBJECT_REF IDREF #REQUIRED
  INVOKED_METHODS CDATA #REQUIRED
>

<!ELEMENT NEW_ACTIVITY (ROLE_ASSIGNMENT*)>
<!ATTLIST NEW_ACTIVITY
  NAME CDATA #REQUIRED
  IDENTIFIER ID #REQUIRED
  ACTIVITY_TEMPLATE_REF IDREF #REQUIRED
  OBJECT_REFS IDREFS #IMPLIED
  OWNER IDREF #IMPLIED
>

<!ELEMENT ROLE_ASSIGNMENT (PRINCIPAL+)>
<!ATTLIST ROLE_ASSIGNMENT
  ROLE IDREF #REQUIRED
>

<!ELEMENT PRINCIPAL EMPTY>
<!ATTLIST PRINCIPAL
  URN CDATA #REQUIRED
>

<!-- Ordering of parameter matches with method signature params -->
<!ELEMENT METHOD_INVOCATION (METHOD_SIGNATURE, PARAMETER*)>
<!ATTLIST METHOD_INVOCATION
  OBJECT_REF IDREF #REQUIRED
>

<!ELEMENT PARAMETER EMPTY>
<!ATTLIST PARAMETER
  VALUE IDREF #REQUIRED
>

<!ELEMENT NOTIFY_EVENT (NOTIFY_EVENT_ATTRIBUTE*)>
<!ATTLIST NOTIFY_EVENT
  IDENTIFIER ID #REQUIRED
  NAME CDATA #REQUIRED
>

<!--
Currently the method invocation of these object will only return String
-->
<!ELEMENT NOTIFY_EVENT_ATTRIBUTE (METHOD_INVOCATION | ATTRIBUTE_VALUE) >
<!ATTLIST NOTIFY_EVENT_ATTRIBUTE
 NAME CDATA #REQUIRED
>
<!ELEMENT ATTRIBUTE_VALUE EMPTY >
<!ATTLIST ATTRIBUTE_VALUE
 VALUE CDATA #IMPLIED
>
<!--
Instance definition, keeps runtime program data structure and values
-->

<!ELEMENT ACTIVITY_INSTANCE (PASSED_OBJECT_INS*, TERMINATION_CONDITION_INS?, ROLE_INS+, OBJECT*, ACTIVITY*)>
<!ATTLIST  ACTIVITY_INSTANCE
 IDENTIFIER ID #REQUIRED
 ASSIGNED_ROLES IDREFS #IMPLIED
>

<!ELEMENT PASSED_OBJECT_INS EMPTY>
<!ATTLIST PASSED_OBJECT_INS
  OBJECT_CONTEXT_REF IDREF #REQUIRED
  OBJECT_REF IDREF #IMPLIED
>

<!ELEMENT TERMINATION_CONDITION_INS (DATE_INS | IS_MEMBER_INS| MEMBER_COUNT_INS| EVENT_CONDITION_INS| EVENT_COUNT_DIFF_CONDITION_INS| AND_INS |OR_INS )>

<!ELEMENT DATE_INS EMPTY>
<!ATTLIST DATE_INS
  ID_REF IDREF #IMPLIED
  VALUE (true|false) "false"
>

<!ELEMENT IS_MEMBER_INS EMPTY>
<!ATTLIST IS_MEMBER_INS
  TYPE (positive|negative) "positive"
  ROLE IDREF #REQUIRED
  VALUE (true|false|check) "false"
>

<!ELEMENT MEMBER_COUNT_INS ( MEMBERS_INS | INTERSECT_INS | UNION_INS | DIFFERENCE_INS) >
<!ATTLIST MEMBER_COUNT_INS
  ID_REF IDREF #IMPLIED
  VALUE (true|false|check) "false"
>

<!ELEMENT MEMBERS_INS EMPTY >
<!ATTLIST MEMBERS_INS
  ROLE IDREF #REQUIRED
>

<!ELEMENT INTERSECT_INS (MEMBERS_INS | INTERSECT_INS | UNION_INS | DIFFERENCE_INS)+>

<!ELEMENT UNION_INS (MEMBERS_INS | INTERSECT_INS | UNION_INS | DIFFERENCE_INS)+>

<!ELEMENT DIFFERENCE_INS (MEMBERS_INS | INTERSECT_INS | UNION_INS | DIFFERENCE_INS)+>

<!ELEMENT EVENT_CONDITION_INS (EVENT_COUNT_INS)>
<!ATTLIST EVENT_CONDITION_INS
  ID_REF IDREF #IMPLIED
  VALUE (true|false) "false"
>

<!-- EVENT_TYPE is EVENT_SOURCE, that is activity, role, object
 GEN_REF is operation or application defined notify event  -->
<!ELEMENT EVENT_COUNT_INS EMPTY>
<!ATTLIST EVENT_COUNT_INS
  ID_REF IDREF #IMPLIED
  EVENT_TYPE_REF IDREF #IMPLIED
  GENERATOR_REF IDREF #IMPLIED
  PROPERTIES (notify|query|unknown) "unknown"
  VALUE NMTOKEN #IMPLIED
>

<!ELEMENT EVENT_COUNT_DIFF_CONDITION_INS (EVENT_COUNT_INS, EVENT_COUNT_INS)>
<!ATTLIST EVENT_COUNT_DIFF_CONDITION_INS
  ID_REF IDREF #IMPLIED
  VALUE NMTOKEN #REQUIRED
>

<!ELEMENT AND_INS (DATE_INS | IS_MEMBER_INS| MEMBER_COUNT_INS| EVENT_CONDITION_INS|EVENT_COUNT_DIFF_CONDITION_INS|AND_INS|OR_INS)+>
<!ATTLIST AND_INS
  TYPE (positive|negative) "positive"
  VALUE (true|false) "false"
>

<!ELEMENT OR_INS (DATE_INS | IS_MEMBER_INS| MEMBER_COUNT_INS| EVENT_CONDITION_INS|EVENT_COUNT_DIFF_CONDITION_INS|AND_INS|OR_INS)+>
<!ATTLIST OR_INS
  TYPE (positive|negative) "positive"
  VALUE (true|false) "false"
>

<!ELEMENT ROLE_INS (PRINCIPAL*, ADMISSION_CONSTRAINTS_INS?, ACTIVATION_CONSTRAINTS_INS?, OPERATION_INS*)>
<!ATTLIST ROLE_INS
  IDENTIFIER ID #REQUIRED
  ROLE_TYPE IDREF #IMPLIED
  ASSIGN IDREFS #IMPLIED
>

<!ELEMENT ADMISSION_CONSTRAINTS_INS (DATE_INS | IS_MEMBER_INS| MEMBER_COUNT_INS| EVENT_CONDITION_INS| EVENT_COUNT_DIFF_CONDITION_INS|AND_INS |OR_INS )>

<!ELEMENT ACTIVATION_CONSTRAINTS_INS (DATE_INS | IS_MEMBER_INS| MEMBER_COUNT_INS| EVENT_CONDITION_INS| EVENT_COUNT_DIFF_CONDITION_INS|AND_INS |OR_INS )>

<!ELEMENT OPERATION_INS (PRECONDITION_INS?, ACTION_INS?)>
<!ATTLIST OPERATION_INS
  IDENTIFIER ID #REQUIRED
  OP_REF IDREF #REQUIRED
>

<!ELEMENT PRECONDITION_INS (DATE_INS | IS_MEMBER_INS| MEMBER_COUNT_INS| EVENT_CONDITION_INS|EVENT_COUNT_DIFF_CONDITION_INS| AND_INS |OR_INS )>

<!ELEMENT ACTION_INS (NEW_OBJECT_INS*, OBJECT_INTERFACE_INS?, NEW_ACTIVITY_INS?, METHOD_INVOCATION_INS?, NOTIFY_EVENT_INS?)>

<!-- ID = fully bound id (instance id) of new object -->
<!ELEMENT NEW_OBJECT_INS EMPTY>
<!ATTLIST NEW_OBJECT_INS
  CODEBASE CDATA #REQUIRED
  IDENTIFIER ID #REQUIRED
  OWNER IDREF #IMPLIED
>

<!ELEMENT NEW_ACTIVITY_INS (ROLE_ASSIGNMENT_INS*)>
<!ATTLIST NEW_ACTIVITY_INS
  IDENTIFIER ID #REQUIRED
  ACTIVITY_TEMPLATE_REF IDREF #REQUIRED
  OBJECT_REFS IDREFS #IMPLIED
  OWNER IDREF #IMPLIED
>

<!ELEMENT ROLE_ASSIGNMENT_INS (PRINCIPAL+)>
<!ATTLIST ROLE_ASSIGNMENT_INS
  ROLE IDREF #REQUIRED
>

<!ELEMENT OBJECT_INTERFACE_INS EMPTY>
<!ATTLIST OBJECT_INTERFACE_INS
  CODEBASE CDATA #REQUIRED
  OBJECT_REF IDREF #REQUIRED
  INVOKED_METHODS CDATA #REQUIRED
>

<!-- Ordering of parameter matches with method signature params -->
<!ELEMENT METHOD_INVOCATION_INS (METHOD_SIGNATURE, PARAMETER_INS*)>
<!ATTLIST METHOD_INVOCATION_INS
  OBJECT_REF IDREF #REQUIRED
  RETURN ID #IMPLIED
>

<!ELEMENT NOTIFY_EVENT_INS (NOTIFY_EVENT_ATTRIBUTE_INS*)>
<!ATTLIST NOTIFY_EVENT_INS
  IDENTIFIER ID #REQUIRED
  ID_REF IDREF #IMPLIED
  OP_REF IDREF #IMPLIED
  VALUE NMTOKEN #IMPLIED
>

<!ELEMENT NOTIFY_EVENT_ATTRIBUTE_INS (METHOD_INVOCATION_INS | ATTRIBUTE_VALUE_INS) >
<!ATTLIST NOTIFY_EVENT_ATTRIBUTE_INS
  NAME CDATA #IMPLIED
>

<!ELEMENT ATTRIBUTE_VALUE_INS EMPTY >
<!ATTLIST ATTRIBUTE_VALUE_INS
 VALUE CDATA #IMPLIED
>

<!ELEMENT PARAMETER_INS EMPTY>
<!ATTLIST PARAMETER_INS
  VALUE IDREF #IMPLIED
>

