<!-- @version $Id: $ -->
<!--
	ObJectRelationalBridge - Bridging Java objects and relational dabatases
	This DTD describes the grammar of the Descriptor repository
	Author: Thomas Mahler, (c) 2000, 2001, 2002, 2003
  -->

<!--
	The descriptor-repository is the root element of a
    repository.xml file.
	It consists of one jdbc-connection-descriptor and at least one
	class-descriptor element.

	The attribute element allows to add custom attributes.

    The jdbc-connection-descriptor element specifies the default jdbc
	connection for the repository.

	class-descriptor elements specify o/r mapping information for
	persistent classes.
  -->
<!ELEMENT descriptor-repository (documentation?, attribute*,
        jdbc-connection-descriptor*, class-descriptor*)>

<!--
	The version attribute is used to bind a repository.xml
    file to a given version of this dtd. This will help to
    avoid versions conflicts.

    The isolation attribute defines the default isolation level for
    class-descriptor on ODMG api level that do not define a
    specific isolation level (this does NOT touch the jdbc-level
    of the connection).
  -->
<!ATTLIST descriptor-repository
	version (1.0) #REQUIRED
	isolation-level (read-uncommitted | read-committed | repeatable-read |
	                 serializable | optimistic) "read-uncommitted"
	proxy-prefetching-limit CDATA "50"
>

<!--
	The documentation element can be used to store arbitrary
	information on all repository entries.
-->
<!ELEMENT documentation (#PCDATA)>

<!--
	The attribute element allows to add custom attributes.

    The jdbc-connection-descriptor element specifies the a jdbc
	connection for the repository.

    The object-cache element specifies the object-cache implementation
    class associated with this class.

	A connection-pool element may be used to define connection pool
	properties for the specified JDBC connection.

    A sequence-manager element may be used to
    define which sequence manager implementation should be used within
    the defined connection.
  -->
<!ELEMENT jdbc-connection-descriptor (documentation?, attribute*,
                object-cache?, connection-pool?, sequence-manager?)>

<!--
    The jcdAlias attribute is a shortcut name for the defined connection
    descriptor. OJB use jcdAlias as key for the defined connections.

    The default-connection attribute used to define if this connection
    should used as default connection with OJB. You could define only
    one connection as default connection. It is also possible to set
    the default connection at runtime using
    PersistenceBrokerFactory#setDefaultKey(...) method.
    If set 'true' you could use on PB-api a shortcut-method of the
    PersistenceBrokerFactory to lookup PersistenceBroker instances.

    The platform attribute is used to define the specific RDBMS
    Platform. This attribute corresponds to a
	org.apache.ojb.broker.platforms.PlatformXXXImpl class.

	The jdbc-level attribute is used to specify the Jdbc compliance
	level of the used Jdbc driver.

    The eager-release attribute was adopt to solve a problem occured when
    using OJB within JBoss (3.0 <= version < 3.2.2, seems to be fixed in jboss 3.2.2).
    Only use within JBoss.

    The batch-mode attribute allow to set batch mode modus global
    from the used connection. It is also possible to change
    batch mode at runtime, using the
    PB.serviceConnectionManager.setBatchMode(...) method.

    The useAutoCommit attribute allow to set how OJB uses
    the autoCommit state of the used connections. The default mode
    was 1. When using mode 0 or 2 with the PB-api, you must use PB
    transaction demarcation.
    0 - OJB ignores the autoCommit setting of the connection and do not
        try to change it. This mode could be helpfully if the
        connection don't let you set the autoCommit state
        (e.g. using datasources from application server).
    1 - set autoCommit explicit 'true' when connection was created
        and temporary set to 'false' when necessary (default mode).
    2 - set autoCommit explicit 'false' when connection was created.

    If the ignoreAutoCommitExceptions attribute is set 'true', all
    exceptions caused by setting autocommit state, will be ignored.
    Default mode 'false'.

	If a jndi-datasource-name for JNDI based lookup of Jdbc
    connections is specified, the four attributes driver, protocol,
    subprotocol, dbalias used for Jdbc DriverManager based construction
    of Jdbc Connections must not be declared.

    The username and password attributes are used as credentials
    for obtaining a jdbc connections.
    If users don't want to keep this information the
    repository.xml file, they could pass user/password
    using PBKey.java to obtain a PersistenceBroker
  -->
<!ATTLIST jdbc-connection-descriptor
	jcd-alias CDATA #REQUIRED
    default-connection (true | false) "false"
    platform (Db2 | Hsqldb | Informix | MsAccess | MsSQLServer |
	          MySQL | Oracle | PostgreSQL | Sybase | SybaseASE |
              SybaseASA | Sapdb | Firebird | Axion | NonstopSql |
              Oracle9i | MaxDB ) "Hsqldb"
	jdbc-level (1.0 | 2.0 | 3.0) "1.0"
	eager-release (true | false) "false"
    batch-mode (true | false) "false"
    useAutoCommit (0 | 1 | 2) "1"
    ignoreAutoCommitExceptions (true | false) "false"

	jndi-datasource-name CDATA #IMPLIED

	driver CDATA #IMPLIED
	protocol CDATA #IMPLIED
	subprotocol CDATA #IMPLIED
	dbalias CDATA #IMPLIED

	username CDATA #IMPLIED
	password CDATA #IMPLIED
>


<!--
    The object-cache element can be used to specify the ObjectCache
    implementation used by OJB. There are three levels of
    declaration:
        1. in OJB.properties file, to declare the standard (default)
        ObjectCache implementation.
        2. on jdbc-connection-descriptor level, to declare ObjectCache implementation
        on a per connection/user level
        3. on class-descriptor level, to declare ObjectCache implementation
        on a per class level

    The priority of the declared object-cache elements are:
    per class > per jdbc descriptor > standard

    E.g. if you declare ObjectCache 'cacheDef' as standard, set
    ObjectCache 'cacheA' in class-descriptor for class A and class B
    does not declare an object-cache element. Then OJB use cacheA as ObjectCache
    for class A and cacheDef for class B
-->
<!ELEMENT object-cache (documentation?, attribute*)>

<!--
    Attribute 'class' specifies the full qualified class name of
    the used ObjectCache implementation.
-->
<!ATTLIST object-cache
    class                          CDATA #REQUIRED
>


<!--
	The connection-pool element specifies the connection pooling
	parameter.
-->
<!ELEMENT connection-pool (documentation?)>


<!--
	maxActive
	maximum number of connections that can be borrowed from the
	pool at one time. When non-positive, there is no limit.

	maxIdle
	controls the maximum number of connections that can sit idle in the
	pool at any time. When non-positive, there is no limit

	maxWait
	max time block to get connection instance from pool, after that exception is thrown.
	When non-positive, block till last judgement

	whenExhaustedAction
	0 - fail when pool is exhausted
	1 - block when pool is exhausted
	2 - grow when pool is exhausted

	testOnBorrow
	The pool will attempt to validate each object before it is returned from the pool

	testOnReturn
	The pool will attempt to validate each object before it is returned to the pool

	testWhileIdle
	Indicates whether or not idle objects should be validated.
	Objects that fail to validate will be dropped from the pool

	timeBetweenEvictionRunsMillis
	indicates how long the eviction thread should sleep before "runs" of examining
	idle objects. When non-positive, no eviction thread will be launched.

	minEvictableIdleTimeMillis
	specifies the minimum amount of time that a connection may sit idle
	in the pool before it is eligable for eviction due to idle time.
	When non-positive, no connection will be dropped from the pool due
	to idle time alone (depends on timeBetweenEvictionRunsMillis > 0)

	numTestsPerEvictionRun
	The number of connections to examine during each run of the
	idle object evictor thread (if any)

    validationQuery
    Here you could specify a validation query used by pool to test a
    obtained connection (e.g. "select 1 from dual"), else a default query was
    used - if defined in the platform class for your database.

    logAbandoned
    Only supported when using
    org.apache.ojb.broker.accesslayer.ConnectionFactoryDBCPImpl
    ConnectionFactory implementation.
    Flag to log stack traces for application code which abandoned
    a Statement or Connection. Defaults to false. Logging of
    abandoned Statements and Connections adds overhead for
    every Connection open or new Statement because a
    stack trace has to be generated.

    removeAbandoned/removeAbandonedTimeout
    Only supported when using
    org.apache.ojb.broker.accesslayer.ConnectionFactoryDBCPImpl
    ConnectionFactory implementation.
    Flag to remove abandoned connections if they exceed the
    removeAbandonedTimeout. Set to true or false, default false.
    If set to true a connection is considered abandoned and
    eligible for removal if it has been idle longer than the
    removeAbandonedTimeout. Setting this to true can recover
    db connections from poorly written applications which
    fail to close a connection.

-->
<!ATTLIST connection-pool
    maxActive                       CDATA #IMPLIED
    maxIdle                         CDATA #IMPLIED
    maxWait                         CDATA #IMPLIED
    minEvictableIdleTimeMillis      CDATA #IMPLIED
    numTestsPerEvictionRun          CDATA #IMPLIED
    testOnBorrow                    (true|false) #IMPLIED
    testOnReturn                    (true|false) #IMPLIED
    testWhileIdle                   (true|false) #IMPLIED
    timeBetweenEvictionRunsMillis   CDATA #IMPLIED
    whenExhaustedAction             (0|1|2) #IMPLIED
    validationQuery                 CDATA #IMPLIED

    logAbandoned                    (true|false) #IMPLIED
    removeAbandoned                 (true|false) #IMPLIED
    removeAbandonedTimeout          CDATA #IMPLIED
>



<!--
	The sequence-manager element specifies the sequence
    manager implementation used for key generation. All
    sequence manager implementations shipped with OJB
    you will find under org.apache.ojb.broker.util.sequence
    If no sequence-manager is defined, OJB use a default one.
    For configuration examples please consult documentation.

    Use the attribute element to pass implementation specific
    properties. This depends on the used implementation class.
-->
<!ELEMENT sequence-manager (documentation?, attribute*)>

<!--
    The className attribute represents the full qualified class name
    of the desired sequence manager implementation - it is mandatory
    when using the sequence-manager element.
    All sequence manager implementations you find will under
    org.apache.ojb.broker.util.sequence package named as SequenceManagerXXXImpl.
    For configuration examples please consult documentation.
-->
<!ATTLIST sequence-manager
    className                       CDATA #REQUIRED
>



<!--
	For interfaces or abstract classes a class-descriptor holds a sequence of
	extent-class elements.

	For concrete classes it must have field-descriptors that describe primitive
	typed instance variables.
	References to other persistent entity classes are specified by
	reference-descriptor elements.
	Collections or arrays attributes that contain other persistent entity
	classes are specified by collection-descriptor elements

	Concrete base classes, may specify a sequence of extent-class elements,
	naming the derived classes.

	A class-descriptor may contain user defined custom attribute elements.

    The insert-procedure, update-procedure and delete-procedure elements
    identify the procedure/function that is defined in the database which
    will handle the insertion, update or deletion of an instance of this
    class.  These elements are all optional.  If they are absent then basic
    sql statements (INSERT INTO xxx..., UPDATE xxx, DELETE FROM xxx) will
    be utilized.

  -->
<!ELEMENT class-descriptor
	((documentation?, extent-class+, attribute*) |
	(documentation?, object-cache?, extent-class*, field-descriptor+,
	 reference-descriptor*, collection-descriptor*,
     index-descriptor*, attribute*,
     insert-procedure?, update-procedure?, delete-procedure?))>


<!--
	The class attribute contains the full qualified name of the specified class.
	As this attribute is of type ID there can only be one class-descriptor per
	class.

	The isolation-level attribute specifies the transactional isolation to be
	used for this class on ODMG api level (this does NOT touch the jdbc-level
    of the connection).

	If the proxy attribute is set, proxies are used for all loading operations
	of instances of this class. If set to "dynamic", dynamic proxies are used.
	If set to another value this value is interpreted as the full-qualified
	name of the proxy class to use.

    If the proxy-prefetching-limit attribute (used with the proxy attribute)
    is set to the value > 0, the collections of objects of this class are materialized
    by groups of the specified size, say when user tries to access the first
    object of the collection, next proxy-prefetching-limit objects are loaded
    by one database query.
    Set this parameter to 0 if you want to turn this feature off.

	The schema attribute may contain the database schema owning the table
	mapped to this class.

	The table attribute specifies the table name this class is mapped to.

	The row-reader attribute may contain a full qualified class name.
	This class will be used as the RowReader implementation used to
	materialize instances of the persistent class.

	The accept-locks attribute specifies whether implicit locking should
	propagate to this class.  Currently relevant for the ODMG layer only.

	The optional initialization-method specifies a no-argument instance
	method that is invoked after reading an instance from a database row.
	It can be used to do initialization and validations.

	The optional factory-class specifies a factory-class that
	that is to be used instead of a no argument constructor.
	If the factory-class is specified the factory-method
	also must be defined.
	factory-method refers to a static no-argument method
	of the factory-class class.

	The refresh attribute can be set to true to force OJB to refresh
	instances when loaded from cache. It's set to false by default.
  -->
<!ATTLIST class-descriptor
	class ID #REQUIRED
	isolation-level (read-uncommitted | read-committed | repeatable-read |
	                 serializable | optimistic) "read-uncommitted"
	proxy CDATA #IMPLIED
	proxy-prefetching-limit CDATA #IMPLIED
	schema CDATA #IMPLIED
	table CDATA #IMPLIED
	row-reader CDATA #IMPLIED
    extends IDREF #IMPLIED
	accept-locks (true | false) "true"
	initialization-method CDATA #IMPLIED
	factory-class CDATA #IMPLIED
	factory-method CDATA #IMPLIED
	refresh (true | false) "false"
>


<!--
	An extent-class element is used to specify an implementing class or a
	derived class that belongs to the extent of all instances of the interface
	or base class.
  -->
<!ELEMENT extent-class (documentation?)>
<!--
	The class-ref attribute must contain a fully qualified classname.
	The repository file must contain a class-descriptor for this class.
  -->
<!ATTLIST extent-class
	class-ref IDREF #REQUIRED
>

<!--
  A field descriptor contains mapping info for a primitive typed
  attribute of a persistent class.

  A field descriptor may contain custom attribute elements.
  -->
<!ELEMENT field-descriptor (documentation?, attribute*)>
<!--
	<b>The id attribute is optional.</b> If not specified, OJB internally
	sorts field-descriptors according to their order of appearance in the
	repository file.
	If a different sort order is intended the id attribute may be used to
	hold a unique number identifying the decriptors position in the sequence of
	field-descriptors.
	The order of the numbers for the field-descriptors must correspond to
	the order of columns in the mapped table.

	The name attribute holds the name of the persistent classes attribute.
	If the PersistentFieldDefaultImpl is used there must be an attribute
	in the persistent class with this name.
	If the PersistentFieldPropertyImpl is used there must be a JavaBeans
	compliant property of this name.

	The table attribute may specify a table different from the mapped
	table for the persistent class. (currently not implemented).

	The column attribute specifies the column the persistent classes field
	is mapped to.

	The optional jdbc-type attribute specifies the JDBC type of the column.
	If not specified OJB tries to identify the JDBC type by inspecting the
	Java attribute by reflection.

	The primarykey specifies if the column is a primary key column.

	The nullable attribute specifies if the column may contain null values.

	The indexed attribute specifies if there is an index on this column

	The autoincrement attribute specifies if the values for the persistent
	attribute are automatically generated by OJB.

    The sequence-name attribute can be used to state explicitly a sequence
    name used by the sequence manager implementations. Check the docs/javadocs
    of the used sequence manager implementation to get information if this
    is a mandatory attribute. OJB standard sequence manager implementations
    build a sequence name by its own, if the attribute was not set.

	The locking attribute is set to true if the persistent attribute is
	used for optimistic locking. can only be set for TIMESTAMP and INTEGER
	columns.

	The updatelock attribute is set to false if the persistent attribute is
	used for optimistic locking AND the dbms should update the lock column
    itself. The default is true which means that when locking is true then
    OJB will update the locking fields. Can only be set for TIMESTAMP and INTEGER
	columns.

	The default-fetch attribute specifies whether the persistent attribute
	belongs to the JDO default fetch group.

	The conversion attribute contains a fully qualified class name.
	This class must implement the interface
	org.apache.ojb.accesslayer.conversions.FieldConversion.
	A FieldConversion can be used to implement conversions between Java-
	attributes and database columns.

	The length attribute can be used to specify a length setting, if
	required by the jdbc-type of the underlying database column.

	The precision attribute can be used to specify a precision setting, if
	required by the jdbc-type of the underlying database column.

	The scale attribute can be used to specify a scale setting, if
	required by the jdbc-type of the underlying database column.

	The access attribute specifies the accessibility of the field.
	"readonly" marks fields that are not to modified. "readwrite" marks
	fields that may be read and written to. "anonymous" marks anonymous fields.
	An anonymous field has a database representation (column) but no
	corresponding Java attribute. Hence the name of such a field does not
	refer to a Java attribute of the class, but is used as a unique
	identifier only.

  -->
<!ATTLIST field-descriptor
	id CDATA #IMPLIED
	name CDATA #REQUIRED
	table CDATA #IMPLIED
	column CDATA #REQUIRED
	jdbc-type (BIT | TINYINT | SMALLINT | INTEGER | BIGINT | DOUBLE |
	           FLOAT | REAL | NUMERIC | DECIMAL | CHAR | VARCHAR |
	           LONGVARCHAR | DATE | TIME | TIMESTAMP | BINARY |
	           VARBINARY | LONGVARBINARY | CLOB | BLOB | STRUCT |
               ARRAY | REF | BOOLEAN | DATALINK) #IMPLIED
	primarykey (true | false) "false"
	nullable (true | false) "true"
	indexed (true | false) "false"
	autoincrement (true | false) "false"
    sequence-name CDATA #IMPLIED
	locking (true | false) "false"
	update-lock (true | false) "true"
	default-fetch (true | false) "false"
	conversion CDATA #IMPLIED
	length CDATA #IMPLIED
	precision CDATA #IMPLIED
	scale CDATA #IMPLIED
	access (readonly | readwrite | anonymous) "readwrite"
>


<!--
  An attribute element allows arbitrary name/value pairs to
  be represented in the repository.
  -->
<!ELEMENT attribute (documentation?)>

<!--
	The attribute-name identifies the name of the attribute.
	The attribute-value identifies the value of the attribute.
-->
<!ATTLIST attribute
	attribute-name CDATA #REQUIRED
	attribute-value CDATA #REQUIRED
>

<!--
    A reference-descriptor contains mapping info for an attribute of a
    persistent class that is not primitive but references another
    persistent entity Object.

    A foreignkey element contains information on foreign key columns that
    implement the association on the database level.

    A reference-decriptor may contain user defined attribute elements.
  -->
<!ELEMENT reference-descriptor (documentation?, foreignkey+, attribute*)>
<!--
	The name attribute holds the name of the persistent classes attribute.
	If the PersistentFieldDefaultImpl is used there must be an attribute
	in the persistent class with this name.
	If the PersistentFieldPropertyImpl is used there must be a JavaBeans
	compliant property of this name.

	The class-ref attribute contains a fully qualified class name.
	This class is the Object type of the persistent reference attribute.
	As this is an IDREF there must be a class-descriptor for this class
	in the repository too.

	The proxy attribute can be set to true to specify that proxy based
	lazy loading should be used for this attribute.

    If the proxy-prefetching-limit attribute (used with the proxy attribute)
    is set to the value > 0, then loading of the reference for the first
    object of some collection causes loading of the references for
    the next proxy-prefetching-limit objects.
    Set this parameter to 0 if you want to turn this feature off.

	The refresh attribute can be set to true to force OJB to refresh
	object references on instance loading.

	The auto-retrieve attribute specifies whether OJB automatically retrieves
	this reference attribute on loading the persistent object.
	If set to false the reference attribute is set to null. In this case the
	user is responsible to fill the reference attribute.

	The auto-update attribute specifies whether OJB automatically stores
	this reference attribute on storing the persistent object.
	This attribute must be set to false if using the OTM, ODMG or JDO layer.

	The auto-delete attribute specifies whether OJB automatically deletes
	this reference attribute on deleting the persistent object.
	This attribute must be set to false if using the OTM, ODMG or JDO layer.

	The otm-dependent attribute specifies whether the OTM layer automatically
    creates the referred object or deletes it if the reference field is set to null.
    Also otm-dependent references behave as if auto-update and auto-delete
    were set to true, but the auto-update and auto-delete attributes themself
    must be always set to false for use with OTM layer.

  -->
<!ATTLIST reference-descriptor
	name CDATA #REQUIRED
	class-ref IDREF #REQUIRED

	proxy (true | false) "false"
	proxy-prefetching-limit CDATA #IMPLIED
	refresh (true | false) "false"

	auto-retrieve (true | false) "true"
	auto-update (true | false) "false"
	auto-delete (true | false) "false"
	otm-dependent (true | false) "false"
>

<!--
    A foreignkey element contains information on a foreign-key persistent
    attribute that implement the association on the database level.
  -->
<!ELEMENT foreignkey (documentation?)>
<!--
	The field-id-ref contains the id attribute of the field-descriptor
	used as a foreign key.
  -->
<!ATTLIST foreignkey
	field-id-ref CDATA #IMPLIED
	field-ref CDATA #IMPLIED
>


<!--
    A collection-descriptor contains mapping info for a Collection- or
    Array-attribute of a  persistent class that contains persistent
    entity Objects.

    The inverse-foreignkey elements contains information on foreign-key
    attributes that implement the association on the database level.

    The fk-pointing-to-this-class and fk-pointing-to-element-class elements
    are only needed if the Collection or array implements a m:n association.
    In this case they contain information on the foreign-key columns of
    the intermediary table.

    A collection-descriptor may contain user defined attribute elements.
  -->
<!ELEMENT collection-descriptor (
    documentation?,
    orderby*,
    inverse-foreignkey*,
	fk-pointing-to-this-class*,
	fk-pointing-to-element-class*,
	query-customizer?,
	attribute*)>


<!--
	The name attribute holds the name of the persistent classes attribute.
	If the PersistentFieldDefaultImpl is used there must be an attribute
	in the persistent class with this name.
	If the PersistentFieldPropertyImpl is used there must be a JavaBeans
	compliant property of this name.

	The collection-class may hold a fully qualified class name.
	This class must be the Java type of the Collection attribute.
	This attribute must only specified if the attribute type is not
	a java.util.Collection (or subclass) or Array type.

	The element-class-ref attribute contains a fully qualified class name.
	This class is the Object type of the elements of persistent collection
	or Array attribute.
	As this is an IDREF there must be a class-descriptor for this class
	in the repository too.

	The orderby attribute may specify a field of the element class.
	The Collection or Array will be sorted according to the specified attribute.
	The sort attribute may be used to specify ascending or descending order for
	this operation.

	The indirection-table must specify the name of an intermediary table,
	if the persistent collection attribute implements a m:n association.

	The proxy attribute can be set to true to specify that proxy based
	lazy loading should be used for this attribute.

    If the proxy-prefetching-limit attribute (used with the proxy attribute)
    is set to the value > 0, then loading of the collection for the first
    object of some other collection causes loading of the collections for
    the next proxy-prefetching-limit objects.
    Set this parameter to 0 if you want to turn this feature off.

	The refresh attribute can be set to true to force OJB to refresh
	object and collection references on instance loading.

	The auto-retrieve attribute specifies whether OJB automatically retrieves
	this attribute on loading the persistent object.
	If set to false the persistent attribute is set to null. In this case the
	user is responsible to fill the persistent attribute.

	The auto-update attribute specifies whether OJB automatically stores
	this reference attribute on storing the persistent object.
	This attribute must be set to false if using the OTM, ODMG or JDO layer.

	The auto-delete attribute specifies whether OJB automatically deletes
	this reference attribute on deleting the persistent object.
	This attribute must be set to false if using the OTM, ODMG or JDO layer.

	The otm-dependent attribute specifies whether the OTM layer automatically
    creates collection elements that were included into the collectionelements
    and deletes collection elements that were excluded from the collection.
    Also otm-dependent references behave as if auto-update and auto-delete
    were set to true, but the auto-update and auto-delete attributes themself
    must be always set to false for use with OTM layer.


  -->
<!ATTLIST collection-descriptor
	name CDATA #IMPLIED
	collection-class CDATA #IMPLIED
	element-class-ref IDREF #REQUIRED
	orderby CDATA #IMPLIED
	sort (ASC | DESC) "ASC"

	indirection-table CDATA #IMPLIED

	proxy (true | false) "false"
	proxy-prefetching-limit CDATA #IMPLIED
	refresh (true | false) "false"

	auto-retrieve (true | false) "true"
	auto-update (true | false) "false"
	auto-delete (true | false) "false"
	otm-dependent (true | false) "false"
>

<!--
	an OrderBy elemnent contains an attribute name and a sort order
  -->
<!ELEMENT orderby (documentation?)>
<!ATTLIST orderby
	name CDATA #REQUIRED
	sort (ASC | DESC) "ASC"
>

<!--
    A inverse-foreignkey element contains information on a foreign-key
    persistent attribute that implement the association on the database level.
  -->
<!ELEMENT inverse-foreignkey (documentation?)>
<!--
	The field-id-ref contains the id attribute of the field-descriptor
	in the class of the collection elements that is used as a foreign key.
  -->
<!ATTLIST inverse-foreignkey
	field-id-ref CDATA #IMPLIED
	field-ref CDATA #IMPLIED
>

<!--
    A fk-pointing-to-this-class element contains information on a foreign-key
    column of an intermediary table in a m:n scenario.
  -->
<!ELEMENT fk-pointing-to-this-class (documentation?)>
<!--
	The column attribute specifies the foreign-key column in the intermediary
	table that points to the class holding the collection.
  -->
<!ATTLIST fk-pointing-to-this-class
	column CDATA #REQUIRED
>

<!--
    A fk-pointing-to-element-class element contains information on a foreign-key
    column of an intermediary table in a m:n scenario.
  -->
<!ELEMENT fk-pointing-to-element-class (documentation?)>
<!--
	The column attribute specifies the foreign-key column in the intermediary
	table that points to the class of the collection elements.
  -->
<!ATTLIST fk-pointing-to-element-class
	column CDATA #REQUIRED
>


<!--
	a queryEnhancer element to enhance the 1:n query
  -->
<!ELEMENT query-customizer (
	documentation?,
	attribute*)>
<!ATTLIST query-customizer
	class CDATA #REQUIRED
>

<!--
    An index-descriptor describes an index by listing its columns.  It may be
    unique or not.
-->
<!ELEMENT index-descriptor (documentation?, index-column+)>
<!ATTLIST index-descriptor
    name CDATA #REQUIRED
    unique (true | false) "false">

<!--
    An index-column is just the name of a column in an index.
-->
<!ELEMENT index-column (documentation?)>
<!ATTLIST index-column
    name CDATA #REQUIRED>

<!--
	Identifies the procedure/function that should be used to handle
    insertions for a specific class-descriptor.

    The nested 'argument' elements define the argument list for the
    procedure/function as well as the source for each argument.

    The name attribute identifies the name of the procedure/function to use

    The return-field-ref identifies the field-descriptor that will receive
    the value that is returned by the procedure/function.  If the procedure/
    function does not include a return value, then do not specify a value
    for this attribute.

    The include-all-fields attribute indicates if all field-descriptors in
    the corresponding class-descriptor are to be passed to the procedure/
    function.  If include-all-fields is 'true', any nested 'argument'
    elements will be ignored.  In this case, values for all field-descriptors
    will be passed to the procedure/function.  The order of values that are
    passed to the procedure/function will match the order of field-descriptors
    on the corresponding class-descriptor.  If include-all-fields is false,
    then values will be passed to the procedure/function based on the
    information in the nested 'argument' elements.
  -->
<!ELEMENT insert-procedure
	(documentation?, (runtime-argument | constant-argument)*, attribute*)>
<!ATTLIST insert-procedure
	name CDATA #REQUIRED
    return-field-ref CDATA #IMPLIED
    include-all-fields (true | false) "false"
>

<!--
	Identifies the procedure/function that should be used to handle
    updates for a specific class-descriptor.

    The nested 'argument' elements define the argument list for the
    procedure/function as well as the source for each argument.

    The name attribute identifies the name of the procedure/function to use

    The return-field-ref identifies the field-descriptor that will receive
    the value that is returned by the procedure/function.  If the procedure/
    function does not include a return value, then do not specify a value
    for this attribute.

    The include-all-fields attribute indicates if all field-descriptors in
    the corresponding class-descriptor are to be passed to the procedure/
    function.  If include-all-fields is 'true', any nested 'argument'
    elements will be ignored.  In this case, values for all field-descriptors
    will be passed to the procedure/function.  The order of values that are
    passed to the procedure/function will match the order of field-descriptors
    on the corresponding class-descriptor.  If include-all-fields is false,
    then values will be passed to the procedure/function based on the
    information in the nested 'argument' elements.
  -->
<!ELEMENT update-procedure
	(documentation?, (runtime-argument | constant-argument)*, attribute*)>
<!ATTLIST update-procedure
	name CDATA #REQUIRED
    return-field-ref CDATA #IMPLIED
    include-all-fields (true | false) "false"
>

<!--
	Identifies the procedure/function that should be used to handle
    deletions for a specific class-descriptor.

    The nested 'runtime-argument' and 'constant-argument' elements define
    the argument list for the procedure/function as well as the source
    for each argument.

    The name attribute identifies the name of the procedure/function to use

    The return-field-ref identifies the field-descriptor that will receive
    the value that is returned by the procedure/function.  If the procedure/
    function does not include a return value, then do not specify a value
    for this attribute.

    The include-pk-only attribute indicates if all field-descriptors in
    the corresponding class-descriptor that are identified as being part of
    the primary key are to be passed to the procedure/function.  If
    include-pk-only is 'true', any nested 'argument' elements will be
    ignored.  In this case, values for all field-descriptors that are identified
    as being part of the primary key will be passed to the procedure/function.
    The order of values that are passed to the procedure/function will match
    the order of field-descriptors on the corresponding class-descriptor.
    If include-pk-only is false, then values will be passed to the procedure/
    function based on the information in the nested 'argument' elements.
  -->
<!ELEMENT delete-procedure
	(documentation?, (runtime-argument | constant-argument)*, attribute*)>
<!ATTLIST delete-procedure
	name CDATA #REQUIRED
    return-field-ref CDATA #IMPLIED
    include-pk-only (true | false) "false"
>
<!--
    Defines an argument that is passed to a procedure/function.  Each argument
    will be set to a value from a field-descriptor or null.

    The field-ref attribute identifies the field-descriptor in the corresponding
    class-descriptor that provides the value for this argument.  If this attribute
    is unspecified, then this argument will be set to null.
-->
<!ELEMENT runtime-argument
	(documentation?, attribute*)>
<!ATTLIST runtime-argument
	field-ref CDATA #IMPLIED
    return (true | false) "false"
>
<!--
    Defines a constant value that is passed to a procedure/function.

    The value attribute identifies the value that is passed to the procedure/
    function.
-->
<!ELEMENT constant-argument
	(documentation?, attribute*)>
<!ATTLIST constant-argument
    value CDATA #REQUIRED
>

