<?xml version='1.0' encoding='utf-8' ?>

<!-- Document Type Definition for KOMET's XML conversation: KometML     -->

<!ELEMENT komet (request | response)>
<!ELEMENT response (dataTree | editTree | error | resultTree | solverTree | success | valueList)>
<!ELEMENT request (dataTree | editTree | register | resultTree | solverTree | unRegister | valueList | writeEditTree)>

<!-- For Error handling the Server can create an error message embedded -->
<!-- in KometML                                                         -->

<!ELEMENT error EMPTY>
<!ATTLIST error id   CDATA #REQUIRED
                name CDATA #REQUIRED>

<!-- Successful requests can cause the server to create a success       -->
<!-- message in KometML                                                 -->

<!ELEMENT success EMPTY>
<!ATTLIST success id   CDATA #REQUIRED
                  name CDATA #REQUIRED>

<!-- The ResultTree Request consists of an empty resultTree tag,        -->
<!-- whereas the Response is populated with the tags:                   -->
<!-- solver, subSolver, resultSet and result                            -->

<!ELEMENT resultTree (solver*)>
<!ATTLIST resultTree id        CDATA #IMPLIED
                     name      CDATA #IMPLIED>

<!ELEMENT solver (subSolver | resultSet)+>
<!ATTLIST solver     id        CDATA #REQUIRED
                     name      CDATA #REQUIRED
                     active    CDATA #IMPLIED>

<!ELEMENT subSolver (subSolver | resultSet)+>
<!ATTLIST subSolver  id        CDATA #REQUIRED
                     name      CDATA #REQUIRED>

<!ELEMENT resultSet (result)+>
<!ATTLIST resultSet  id        CDATA #REQUIRED
                     name      CDATA #REQUIRED>

<!ELEMENT result EMPTY>
<!ATTLIST result     id        CDATA #REQUIRED
                     name      CDATA #REQUIRED
                     dbName    CDATA #IMPLIED
                     key       CDATA #IMPLIED
                     class     CDATA #IMPLIED
                     ioTtype   CDATA #IMPLIED
                     dataType  CDATA #IMPLIED
                     scope     CDATA #IMPLIED
                     unit      CDATA #IMPLIED
                     belongsTo CDATA #IMPLIED
                     value     CDATA #IMPLIED>


<!-- The dataTree Request contains several item tags,                   -->
<!-- the Response contains table tags, which contain the tags:          -->
<!-- column and keyColumn                                               -->

<!ELEMENT dataTree (item | table)+>

<!ELEMENT table (keyColumn+, column+)>
<!ATTLIST table     id     CDATA #REQUIRED
                    name   CDATA #REQUIRED
                    dbName CDATA #REQUIRED>

<!ELEMENT column EMPTY>
<!ATTLIST column    id        CDATA #REQUIRED
                    name      CDATA #REQUIRED
                    dbName    CDATA #REQUIRED
                    class     CDATA #IMPLIED
                    belongsTo CDATA #IMPLIED
                    scope     CDATA #IMPLIED
                    unit      CDATA #IMPLIED>

<!ELEMENT keyColumn EMPTY>
<!ATTLIST keyColumn id     CDATA #REQUIRED
                    name   CDATA #REQUIRED
                    dbName CDATA #REQUIRED
                    key    CDATA #IMPLIED>

<!ELEMENT item EMPTY>
<!ATTLIST item      class     CDATA #REQUIRED
                    belongsTo CDATA #REQUIRED
                    scope     CDATA #IMPLIED
                    unit      CDATA #IMPLIED>

<!-- The valueList Request contains a values tag which holds the query  -->
<!-- statement and the number of columns that are columns selected      -->
<!-- The Response filles the values tag with the rows and columns       -->
<!-- returned by the the query: row and valueItem                       -->

<!ELEMENT valueList (values)>
<!ATTLIST valueList id        CDATA #IMPLIED
                    name      CDATA #IMPLIED>

<!ELEMENT values (row)+>
<!ATTLIST values    id        CDATA #IMPLIED
                    name      CDATA #IMPLIED
                    num       CDATA #REQUIRED
                    statement CDATA #REQUIRED>

<!ELEMENT row (valueItem)+>
<!ATTLIST row       id        CDATA #IMPLIED
                    name      CDATA #IMPLIED>

<!ELEMENT valueItem EMPTY>
<!ATTLIST valueItem id        CDATA #IMPLIED
                    name      CDATA #IMPLIED
                    value     CDATA #REQUIRED>

<!-- The SolverTree Request consists of an empty solverTree tag,        -->
<!-- whereas the Response is populated with the tags:                   -->
<!-- solverSet and solverPgm                                            -->

<!ELEMENT solverTree (solverSet*)>
<!ATTLIST solverTree id   CDATA #IMPLIED
                     name CDATA #IMPLIED>

<!ELEMENT solverSet (solverPgm | solverSet)+>
<!ATTLIST solverSet id   CDATA #IMPLIED
                    name CDATA #IMPLIED>

<!ELEMENT solverPgm EMPTY>
<!ATTLIST solverPgm id      CDATA #REQUIRED
                    name    CDATA #REQUIRED
                    prgName CDATA #IMPLIED>

<!-- The writeSolverData Request is used to write back te edited        -->
<!-- Solver infomation to the database. This is only the information    -->
<!-- whether or not the solver should be started. Like the solverTree,  -->
<!-- it is populated with the tags:                                     -->
<!-- solverSet and solverPgm                                            -->

<!ELEMENT writeSolverData (solverSet*)>
<!ATTLIST writeSolverData id     CDATA #IMPLIED
                          name   CDATA #IMPLIED>

<!-- The editTree Request consists of an empty editTree tag, whereas    -->
<!-- the Response is populated with the tags:                           -->
<!-- editSolver, editSubSolver editTable and editItem                   -->

<!ELEMENT editTree (editSolver*)>
<!ATTLIST editTree      id     CDATA #IMPLIED
                        name   CDATA #IMPLIED>

<!ELEMENT editSolver (editSubSolver | editTable)+>
<!ATTLIST editSolver    id     CDATA #REQUIRED
                        name   CDATA #REQUIRED>

<!ELEMENT editSubSolver (editSubSolver | editTable)+>
<!ATTLIST editSubSolver id     CDATA #REQUIRED
                        name   CDATA #REQUIRED>

<!ELEMENT editTable (editItem)+>
<!ATTLIST editTable     id     CDATA #REQUIRED
                        name   CDATA #REQUIRED
                        dbName CDATA #REQUIRED>

<!ELEMENT editItem EMPTY>
<!ATTLIST editItem      id     CDATA #REQUIRED
                        name   CDATA #REQUIRED
                        dbName CDATA #REQUIRED
                        class  CDATA #REQUIRED
                        value  CDATA #REQUIRED>

<!-- The writeEditTree Request is used to write the edited values back  -->
<!-- to the database. Like the editTree, it is populated with the tags: -->
<!-- editSolver, editSubSolver editTable and editItem                   -->

<!ELEMENT writeEditTree (editSolver*)>
<!ATTLIST eriteEditTree id     CDATA #IMPLIED
                        name   CDATA #IMPLIED>

<!-- These Tags implement the data structure needed for registering     -->
<!-- solvers, subsolvers resultsets and results                         -->
<!-- Moreover, both solver dependencies and relations between tables    -->
<!-- (which are here defined as resultsets) can be modelled             -->

<!-- Each result encapsulates exactly one Ontology-Tag that describes   -->
<!-- the Ontology-Attributes stored in the [solver].owl file at the     -->
<!-- server side                                                        -->

<!ELEMENT register (regSolver+)>
<!ATTLIST register id   CDATA #IMPLIED
                   name CDATA #IMPLIED>

<!ELEMENT regSolver ((regSubSolver | regResultSet)+, regRequiredResult*, regRelation*)>
<!ATTLIST regSolver id        CDATA #REQUIRED
                    name      CDATA #REQUIRED
                    namespace CDATA #REQUIRED
                    visible   CDATA #REQUIRED>

<!ELEMENT regSubSolver (regSubSolver | regResultSet)+>
<!ATTLIST regSubSolver id       CDATA #REQUIRED
                       name     CDATA #REQUIRED
                       visible  CDATA #REQUIRED>

<!ELEMENT regResultSet (regResult)+>
<!ATTLIST regResultSet id       CDATA #REQUIRED
                       name     CDATA #REQUIRED
                       dbName   CDATA #REQUIRED
                       visible  CDATA #REQUIRED
                       editable CDATA #IMPLIED>

<!ELEMENT regResult (regOntology)+>
<!ATTLIST regResult id          CDATA #REQUIRED
                    name        CDATA #REQUIRED
                    dbName      CDATA #REQUIRED
                    key         CDATA #REQUIRED
                    visible     CDATA #REQUIRED>

<!ELEMENT regOntology EMPTY>
<!ATTLIST regOntology class     CDATA #REQUIRED
                      ioType    CDATA #REQUIRED
                      dataType  CDATA #REQUIRED
                      scope     CDATA #REQUIRED
                      unit      CDATA #REQUIRED
                      belongsTo CDATA #REQUIRED
                      accuracy  CDATA #IMPLIED>

<!ELEMENT regRelation (regForeignKey)+>
<!ATTLIST regRelation id                     CDATA #REQUIRED
                      sourceResultSetID      CDATA #REQUIRED
                      destinationResultSetID CDATA #REQUIRED>

<!ELEMENT regForeignKey EMPTY>
<!ATTLIST regForeignKey id                   CDATA #REQUIRED>

<!ELEMENT regRequiredResult EMPTY>
<!ATTLIST regRequiredResult class     CDATA #REQUIRED
                            belongsTo CDATA #REQUIRED
                            scope     CDATA #IMPLIED
                            unit      CDATA #IMPLIED
                            accuracy  CDATA #IMPLIED>

<!-- The unRegister Request ist just empty tag pointing to the solver   -->
<!-- to be unregisterd with its id attribute                            -->

<!ELEMENT unRegister EMPTY>
<!ATTLIST unRegister id      CDATA #REQUIRED>