<document>
  <header>
    <product>resin</product>
    <title>resin.conf Relax-NG Schema</title>
    <version>Resin 3.0</version>
    <description>
      <p>The formal definition for the resin.conf configuration.</p>
    </description>
  </header>

  <body>
    <summary/>

<section title="Relax-NG Schema">

<def title="com/caucho/server/resin/resin.rnc">
default namespace r = "http://caucho.com/ns/resin"
namespace l = ""

include "resin-content.rnc"

start = r_resin | l_resin
</def>

<def title="com/caucho/server/resin/server.rnc">
default namespace r = "http://caucho.com/ns/resin"

include "resin-content.rnc"

start = element server {
  r_class-loader-Group?,

  r_server-Content
}

</def>

<def title="com/caucho/server/resin/resin.rnc">
default namespace r = "http://caucho.com/ns/resin"
namespace rcore = "http://caucho.com/ns/resin/core"
namespace local = ""
namespace l = ""

include "../webapp/resin-web-xml-content.rnc"

l_resin = element l:caucho.com {
  r_any-Group
}

r_access-log = element access-log {
  r_resin-type?

  & r_log-Content

  & (attribute format { string } | element format { string })?

  & (attribute archive-format { string } | element archive-format { string })?

  & r_init?
}

r_cache = element cache {
  r_path?

  & (attribute enable { r_boolean-Type }
     | element enable { r_boolean-Type })?

  & (attribute entries { r_int } | element entries { r_int })?

  & (attribute memory-size { r_int } | element memory-size { r_int })?

  & (attribute disk-size { r_int } | element disk-size { r_int })?
}

r_document-directory =
 (attribute document-directory { string }

  | element document-directory { string })

r_host = element host {
  (attribute id { string }
   | attribute regexp { string }
   | element regexp { string })?

  & (attribute host-name { string } | element host-name { string })?

  & (attribute secure-host-name { string }
    | element secure-host-name { string })?

  & (attribute host-alias { string } | element host-alias { string })*

  & r_lazy-init?

  & r_startup-mode?

  & r_root-directory?

  & r_host-Group
}

r_host-Content =
  r_env-Content

  & r_access-log?

  & r_class-loader-Group

  & r_document-directory?

  & r_ear-default*

  & r_ear-deploy*

  & r_error-page*

  & r_web-app-deploy*

  & r_web-app-default*

  & rc_web-app*

## &lt;host> flow control
r_host-Flow =
  r_host-Content

  & element rcore:env { rcore_env-Args, r_host-Flow }*

  & element rcore:if { rcore_if-Args, r_host-Flow }*

  & element rcore:choose {
      element rcore:when { rcore_when-Args, r_host-Flow }+,
      element rcore:otherwise { r_host-Flow }?
    }*

## The complete host contents
r_host-Group = r_host-Flow

r_host-default = element host-default {
  r_host-Group
}

r_host-deploy = element host-deploy {
  r_path

  & (attribute archive-directory { r_path-Type }
     | element archive-directory { r_path-Type })?

  & (attribute expand-directory { r_path-Type }
     | element expand-directory { r_path-Type })?

  & (attribute host-name { string }
     | element host-name { string })?

  & (attribute lazy-init { r_boolean-Type }
     | element lazy-init { r_boolean-Type })?

  & r_host-default?
}

r_http = element http {
  (attribute id { string }
   | attribute server-id { string }
   | element server-id { string })?

  & r_port-Content

  & (attribute virtual-host { string } | element virtual-host { string })?
}

r_ignore-client-disconnect =
  attribute ignore-client-disconnect { string }
  | element ignore-client-disconnect { string }

r_keepalive-max =
  attribute keepalive-max { string }
  | element keepalive-max { string }

r_keepalive-timeout =
  attribute keepalive-timeout { string }
  | element keepalive-timeout { string }

r_min-free-memory =
  attribute min-free-memory { string }
  | element min-free-memory { string }

r_persistent-store = element persistent-store {
  r_jndi-name?

  & (attribute type { string } | element type { string })

  & r_init?

  & (attribute max-idle-time { r_period }
     | element max-idle-time { r_period })?
}

r_ping = element ping {
  r_any-Group*
}

r_port = element port {
  (attribute id { string }
   | attribute server-id { string }
   | element server-id { string })?

  & r_port-Content

  & (attribute index { string } | element index { string })?

  & (attribute group { string } | element group { string })?

  & (attribute backup { string } | element backup { string })?

  & r_protocol
}

r_port-Content =
  ((attribute port { string } | element port { string })

   & (attribute host { string } | element host { string })?

   & (attribute read-timeout { r_period-Type }
      | element read-timeout { r_period-Type })?

   & (attribute write-timeout { r_period-Type }
      | element write-timeout { r_period-Type })?

   & (attribute socket-listen-backlog { r_int-Type }
      | element socket-listen-backlog { r_int-Type })?

   & (attribute tcp-no-delay { string } | element tcp-no-delay { string })?

   & (r_openssl | r_jsse-ssl)?
   )

r_protocol =
  element protocol {
    r_resin-type,

    r_any-Group*
  }

r_resin = element resin {
  r_resin-Content
}

## &lt;resin> basic contents
r_resin-Basis = 
  r_env-Basis

  & (attribute user-name { string } | element user-name { string })?

  & (attribute group-name { string } | element group-name { string })?

  & r_min-free-memory?

  & (attribute security-provider { string }
    | element security-provider { string })*

  & (attribute security-manager { string }
    | element security-manager { string })*

  & r_server*

  & r_thread-pool?

  & r_transaction-manager?

## &lt;resin> flow control
r_resin-Flow =
  r_resin-Basis

  & element rcore:env { rcore_env-Args, r_resin-Flow }*

  & element rcore:if { rcore_if-Args, r_resin-Flow }*

  & element rcore:choose {
      element rcore:when { rcore_when-Args, r_resin-Flow }+,
      element rcore:otherwise { r_resin-Flow }?
    }*

r_resin-Content = r_resin-Flow

r_root-directory =
  attribute root-directory { string }
  | element root-directory { string }

r_server = element server {
  r_root-directory?,

  r_server-Content
}

## &lt;server> basic contents
r_server-Basis = 
  r_env-Basis

  & r_access-log?

  & r_cache?

  & r_ear-default*

  & r_http*

  & r_host*

  & r_host-default*

  & r_host-deploy*

  & r_ignore-client-disconnect?

  & r_keepalive-max?

  & r_keepalive-timeout?

  & r_persistent-store?

  & r_ping*

  & r_port*

  & r_session-cookie?

  & r_session-url-prefix?

  & r_url-character-encoding?

  & r_web-app-default*

## &lt;server> flow control
r_server-Flow =
  (r_class-loader-Group?, r_server-Basis)

  & element rcore:env { rcore_env-Args, r_server-Flow }*

  & element rcore:if { rcore_if-Args, r_server-Flow }*

  & element rcore:choose {
      element rcore:when { rcore_when-Args, r_server-Flow }+,
      element rcore:otherwise { r_server-Flow }?
    }*

## complete &lt;server> contents
r_server-Content = r_server-Flow

r_session-cookie = 
  attribute session-cookie { string }
  | element session-cookie { string }

r_session-url-prefix =
  attribute alternate-session-url-prefix { string }
  | element alternate-session-url-prefix { string }
  | attribute session-url-prefix { string }
  | element session-url-prefix { string }

r_spare-thread-max =
  attribute spare-thread-max { string }
  | element spare-thread-max { string }

r_spare-thread-min =
  attribute spare-thread-min { string }
  | element spare-thread-min { string }

r_thread-pool = element thread-pool {
  r_thread-max?

  & r_spare-thread-min?
}

r_thread-max =
  attribute thread-max { string }
  | element thread-max { string }

r_transaction-log = element transaction-log {
  r_path+
}

r_transaction-manager = element transaction-manager {
  r_transaction-log?
}

r_url-character-encoding =
  attribute url-character-encoding { string }
  | element url-character-encoding { string }
</def>

</section>

  </body>
</document>

  
