<!--
    Licensed to the Apache Software Foundation (ASF) under one or more
    contributor license agreements.  See the NOTICE file distributed with
    this work for additional information regarding copyright ownership.
    The ASF licenses this file to You under the Apache License, Version 2.0
    (the "License"); you may not use this file except in compliance with
    the License.  You may obtain a copy of the License at
   
         http://www.apache.org/licenses/LICENSE-2.0
   
    Unless required by applicable law or agreed to in writing, software
    distributed under the License is distributed on an "AS IS" BASIS,
    WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
    See the License for the specific language governing permissions and
    limitations under the License.
-->

<!--
     DTD for the Struts Application Configuration File

     To support validation of your configuration file, include the following
     DOCTYPE element at the beginning (after the "xml" declaration):

     <!DOCTYPE struts-config PUBLIC
       "-//Apache Software Foundation//DTD Struts Configuration 1.4//EN"
       "http://struts.apache.org/dtds/struts-config_1_4.dtd">

     $Id$
-->


<!-- ========== Defined Types ============================================= -->


<!-- An "AttributeName" is the identifier of a page, request, session, or
     application scope attribute.
-->
<!ENTITY % AttributeName "CDATA">


<!-- A "BeanName" is the identifier of a JavaBean, such as a form bean,
     and also serves as the name of the corresponding scripting variable
     and the name of the JSP attribute under which the bean is accessed.
     Therefore, it must conform to the rules for a Java identifier.
-->
<!ENTITY % BeanName "CDATA">


<!-- A "Boolean" is the string representation of a boolean (true or false)
     variable.
-->
<!ENTITY % Boolean "(true|false|yes|no)">


<!-- A "ClassName" is the fully qualified name of a Java class that is
     instantiated to provide the functionality of the enclosing element.
-->
<!ENTITY % ClassName "CDATA">


<!-- An "Integer" is a character string consisting solely of numeric digits,
     optionally preceeded by a minus sign, that can be converted to a
     32-bit integer.
-->
<!ENTITY % Integer "CDATA">


<!-- A "Location" is a relative path, delimited by "/" characters, that
     defines the location of a resource relative to the location of the
     Struts configuration file itself.
-->
<!ENTITY % Location "#PCDATA">


<!-- A "PropName" is the name of a JavaBeans property, and must begin with
     a lower case letter and contain only characters that are legal in a
     Java identifier.
-->
<!ENTITY % PropName "CDATA">


<!-- A "RequestPath" is an module-relative URI path, beginning with a
     slash, that identifies a mapped resource (such as a JSP page or a servlet)
     within this web application.
-->
<!ENTITY % RequestPath "CDATA">


<!-- The name of a JSP bean scope within which such a form bean may be
     accessed.
-->
<!ENTITY % RequestScope "(request|session)">

<!-- Defines possible values for automatic form bean population -->
<!ENTITY % PopulateStrategy "CDATA">

<!-- ========== Top Level Elements ======================================== -->


<!-- The "struts-config" element is the root of the configuration file
     hierarchy, and contains nested elements for all of the other
     configuration settings.
-->
<!ELEMENT struts-config (display-name?, description?, set-property?, form-beans?, global-exceptions?, global-forwards?, action-mappings?, controller?, message-resources*, plug-in*)>
<!ATTLIST struts-config  id             ID              #IMPLIED>

<!-- The "form-beans" element describes the set of form bean descriptors for this
     module. The following attributes are defined:

     type            Fully qualified Java class to use when instantiating
                     ActionFormBean objects. If specified, the object must be a
                     subclass of the default class type.

                     WARNING:  For Struts 1.0, this value is ignored.  You
                     can set the default implementation class name with the
                     "formBean" initialization parameter to the Struts
                     controller servlet.
-->
<!ELEMENT form-beans (form-bean*)>
<!ATTLIST form-beans     id             ID              #IMPLIED>
<!ATTLIST form-beans     type           %ClassName;     #IMPLIED>


<!-- The "form-bean" element describes an ActionForm subclass
     [org.apache.struts.action.ActionForm] that can be referenced by an "action"
     element.


The "form-bean" element describes a particular form bean, which is a
     JavaBean that implements the org.apache.struts.action.ActionForm
     class.  The following attributes are defined:

     className       The configuration bean for this form bean object. If
                     specified, the object must be a subclass of the default
                     configuration bean.
                     ["org.apache.struts.config.FormBeanConfig"]

     extends         The name of the form bean that this bean will
                     inherit configuration information from.

     name            The unique identifier for this form bean. Referenced by the
                     <action> element to specify which form bean to use with its
                     request.
                     
     type            Fully qualified Java class name of the ActionForm subclass
                     to use with this form bean.
                     
     enhanced        Reserved for future use.
-->
<!ELEMENT form-bean (icon?, display-name?, description?, set-property*, form-property*)>
<!ATTLIST form-bean      id             ID              #IMPLIED>
<!ATTLIST form-bean      className      %ClassName;     #IMPLIED>
<!ATTLIST form-bean      enhanced       %Boolean;       #IMPLIED>
<!ATTLIST form-bean      extends        %BeanName;      #IMPLIED>
<!ATTLIST form-bean      name           %BeanName;      #REQUIRED>
<!ATTLIST form-bean      type           %ClassName;     #IMPLIED>


<!-- The "form-property" element describes a JavaBean property that can be used to
     configure an instance of a DynaActionForm or a subclass thereof. This element
     is only utilized when the "type" attribute of the enclosing "form-bean" element
     is [org.apache.struts.action.DynaActionForm] or a subclass of DynaActionForm. If
     a custom DynaActionForm subclass is used, then the "dynamic" attribute of the
     enclosing <form-bean> element must be set to "true". Since Struts 1.1.

     className       The configuration bean for this form property object. If
                     specified, the object must be a subclass of the default
                     configuration bean.
                     ["org.apache.struts.config.FormPropertyConfig"]

     initial         String representation of the initial value for this property.
                     If not specified, primitives will be initialized to zero and
                     objects initialized to the zero-argument instantiation of that
                     object class.  For example, Strings will be initialized to ""

     name            The name of the JavaBean property described by this element.

     reset           The flag that indicates when this property should be reset 
                     to its "initial" value when the form's "reset()" method is 
                     called.  If this is set to "true", the property is always 
                     reset when "reset()" is called.  This can also be set to 
                     one or more HTTP methods, such as GET or POST. In such a 
                     case, the property will be reset only when the HTTP method 
                     used for the request being processed is included in this 
                     attribute's value(s).  Multiple HTTP methods can be 
                     specified by separating them with whitespace or commas.

     size            The number of array elements to create if the value of the
                     "type" attribute specifies an array, but there is no value
                     specified for the "initial" attribute.

     type            Fully qualified Java class name of the field underlying this
                     property, optionally followed by "[]" to indicate that the
                     field is indexed.
-->
<!ELEMENT form-property  (set-property*)>
<!ATTLIST form-property  className      %ClassName;     #IMPLIED>
<!ATTLIST form-property  initial        CDATA           #IMPLIED>
<!ATTLIST form-property  name           %PropName;      #REQUIRED>
<!ATTLIST form-property  reset          %Boolean;       #IMPLIED>
<!ATTLIST form-property  size           %Integer;       #IMPLIED>
<!ATTLIST form-property  type           %ClassName;     #REQUIRED>


<!-- The "global-exceptions" element describes a set of exceptions that might be
     thrown by an Action object. The handling of individual exception types is
     configured through nested exception elements. An <action> element may
     override a global exception handler by registering a local exception handler
     for the same exception type. Since Struts 1.1.
-->
<!ELEMENT global-exceptions (exception*)>
<!ATTLIST global-exceptions id          ID              #IMPLIED>


<!-- The "exception" element registers an ExceptionHandler for an exception type.
     The following attributes are defined:

    bundle           Servlet context attribute for the message resources bundle
                     associated with this handler. The default attribute is the
                     value specified by the string constant declared at
                     Globals.MESSAGES_KEY.
                     [org.apache.struts.Globals.MESSAGES_KEY]

    className        The configuration bean for this ExceptionHandler object.
                     If specified, className must be a subclass of the default
                     configuration bean
                     ["org.apache.struts.config.ExceptionConfig"]

    extends          The name of the exception handler that this 
                     will inherit configuration information from.

    handler          Fully qualified Java class name for this exception handler.
                     ["org.apache.struts.action.ExceptionHandler"]

    key              The key to use with this handler's message resource bundle
                     that will retrieve the error message template for this
                     exception.

    path             The module-relative URI to the resource that will complete
                     the request/response if this exception occurs.

    scope            The context ("request" or "session") that is used to access
                     the ActionMessage object 
                     [org.apache.struts.action.ActionMessage] for this 
                     exception.

    type             Fully qualified Java class name of the exception type to
                     register with this handler.
-->
<!ELEMENT exception (icon?, display-name?, description?, set-property*)>
<!ATTLIST exception      id             ID              #IMPLIED>
<!ATTLIST exception      bundle         %AttributeName; #IMPLIED>
<!ATTLIST exception      className      %ClassName;     #IMPLIED>
<!ATTLIST exception      extends        %ClassName;     #IMPLIED>
<!ATTLIST exception      handler        %ClassName;     #IMPLIED>
<!ATTLIST exception      key            CDATA           #IMPLIED>
<!ATTLIST exception      path           %RequestPath;   #IMPLIED>
<!ATTLIST exception      scope          CDATA           #IMPLIED>
<!ATTLIST exception      type           %ClassName;     #REQUIRED>


<!-- The "global-forwards" element describes a set of ActionForward objects
     [org.apache.struts.action.ActionForward] that are available to all Action
     objects as a return value. The individual ActionForwards are configured
     through nested <forward> elements. An <action> element may override a global
     forward by defining a local <forward> of the same name.

     type            Fully qualified Java class to use when instantiating
                     ActionForward objects.  If specified, the object must be a
                     subclass of the default class type.

                     WARNING:  For Struts 1.0, this value is ignored.  You
                     can set the default implementation class name with the
                     "forward" initialization parameter to the Struts
                     controller servlet.
-->
<!ELEMENT global-forwards (forward*)>
<!ATTLIST global-forwards id            ID              #IMPLIED>
<!ATTLIST global-forwards type          %ClassName;     #IMPLIED>


<!-- The "forward" element describes an ActionForward that is to be made
     available to an Action as a return value. An ActionForward is referenced by
     a logical name and encapsulates a URI. A "forward" element may be used to
     describe both global and local ActionForwards. Global forwards are available
     to all the Action objects in the module. Local forwards can be
     nested within an <action> element and only available to an Action object
     when it is invoked through that ActionMapping.

     catalog         The name of a commons-chain catalog in which to look up
                     a command to be executed as part of servicing this request.
                     Only meaningful if "command" is also specified.

     className       Fully qualified Java class name of ActionForward
                     subclass to use for this object.
                     ["org.apache.struts.action.ActionForward"]

     command         The name of a commons-chain command which should be looked up
                     and executed as part of servicing this request.

     extends         The name of the forward configuration that this 
                     will inherit configuration information from.

     module          The module prefix to use with this path. This value should
                     begin with a slash ("/").

     name            The unique identifier for this forward. Referenced by the
                     Action object at runtime to select - by its logical name -
                     the resource that should complete the request/response.
                     ["success"].

     path            The module-relative path to the resources that is 
                     encapsulated by the logical name of this ActionForward.
                     This value should begin with a slash ("/") character.

     redirect        Set to "true" if a redirect instruction should be issued to
                     the user-agent so that a new request is issued for this
                     forward's resource. If true,  RequestDispatcher.Redirect is
                     called. If "false", RequestDispatcher.forward is called instead.
                     [false]
-->
<!ELEMENT forward (icon?, display-name?, description?, set-property*)>
<!ATTLIST forward        id             ID              #IMPLIED>
<!ATTLIST forward        catalog        CDATA           #IMPLIED>
<!ATTLIST forward        className      %ClassName;     #IMPLIED>
<!ATTLIST forward        command        CDATA           #IMPLIED>
<!ATTLIST forward        extends        CDATA           #IMPLIED>
<!ATTLIST forward        module         %RequestPath;   #IMPLIED>
<!ATTLIST forward        name           CDATA           "success">
<!ATTLIST forward        path           %RequestPath;   #IMPLIED>
<!ATTLIST forward        redirect       %Boolean;       #IMPLIED>


<!-- The "action-mappings" element describes a set of ActionMapping objects
     [org.apache.struts.action.ActionMapping] that are available to process
     requests matching the url-pattern our ActionServlet registered with the
     container. The individual ActionMappings are configured through nested
     <action> elements. The following attributes are defined:

     type           Fully qualified Java class to use when instantiating
                    ActionMapping objects. If specified, the object must be a
                    subclass of the default class type.

                    WARNING:  For Struts 1.0, this value is ignored.  You
                    can set the default implementation class name with the
                    "mapping" initialization parameter to the Struts
                    controller servlet.
-->
<!ELEMENT action-mappings (action*)>
<!ATTLIST action-mappings id             ID              #IMPLIED>
<!ATTLIST action-mappings type           %ClassName;     #IMPLIED>


<!-- The "action" element describes an ActionMapping object that is to be used
     to process a request for a specific module-relative URI. The following
     attributes are defined:

     actionId        The name which uniquely identifies the mapping within a 
                     module. The Controlelr has built-in recognition for URIs
                     that begin with an actionId and will automatically 
                     translate forwards.

     attribute       Name of the request-scope or session-scope attribute that
                     is used to access our ActionForm bean, if it is other than
                     the bean's specified "name". Optional if "name" is specified,
                     else not valid.

     cancellable     Set to "true" if the Action can be cancelled. By default,
                     when an Action is cancelled, validation is bypassed
                     and the Action should not execute the business operation.
                     If a request tries to cancel an Action when cancellable
                    is not set, a "InvalidCancelException" is thrown.
                     [false]

     catalog         The name of a commons-chain catalog in which to look up
                     a command to be executed as part of servicing this request.
                     Only meaningful if "command" is also specified.

     className       The fully qualified Java class name of the ActionMapping
                     subclass to use for this action mapping object. Defaults to
                     the type specified by the enclosing <action-mappings>
                     element or to "org.apache.struts.action.ActionMapping" if
                     not specified.
                     ["org.apache.struts.action.ActionMapping"]

     command         The name of a commons-chain command which should be looked up
                     and executed as part of servicing this request.  

     dispatcher      The fully qualified Java class name of the Dispatcher 
                     implementation to use to execute the action. This is optional,
                     and the fallback behavior is to invoke the classical 
                     execute() method.

     extends         The path or actionId of the action mapping configuration 
                     that this will inherit configuration information from.

     forward         Module-relative path of the servlet or other resource that
                     will process this request, instead of the Action class
                     specified by "type".  The path WILL NOT be processed
                     through the "forwardPattern" attribute that is configured
                     on the "controller" element for this module.
                     Exactly one of "forward", "include", or "type" must be
                     specified.

     include         Module-relative path of the servlet or other resource that
                     will process this request, instead of the Action class
                     specified by "type".  The path WILL NOT be processed
                     through the "forwardPattern" attribute that is configured
                     on the "controller" element for this module.
                     Exactly one of "forward", "include", or "type" must be
                     specified.

     input           Module-relative path of the action or other resource to
                     which control should be returned if a validation error is
                     encountered. Valid only when "name" is specified. Required
                     if "name" is specified and the input bean returns
                     validation errors. Optional if "name" is specified and the
                     input bean does not return validation errors.

     name            Name of the form bean, if any, that is associated with this
                     action mapping.

     parameter       General-purpose configuration parameter that can be used to
                     pass extra information to the Action object selected by
                     this action mapping.

     path            The module-relative path of the submitted request, starting
                     with a "/" character, and without the filename extension if
                     extension mapping is used.

                     NOTE:  Do *not* include a period in your path name,
                     because it will look like a filename extension and
                     cause your Action to not be located.

     populate        Comma-delimited list of events that trigger the population
                     of an ActionForm. Since Struts 1.4.
                     [all]

     prefix          Prefix used to match request parameter names to ActionForm
                     property names, if any. Optional if "name" is specified,
                     else not allowed.

     reset           Comma-delimited list of events that trigger the reset()
                     method to be called on an ActionForm. Since Struts 1.4.
                     [all]

     roles           Comma-delimited list of security role names that are allowed
                     access to this ActionMapping object. Since Struts 1.1.

     scope           The context ("request" or "session") that is used to
                     access our ActionForm bean, if any.  Optional if "name" is
                     specified, else not valid. [session]

     suffix          Suffix used to match request parameter names to ActionForm
                     bean property names, if any. Optional if "name" is
                     specified, else not valid.

     type            Fully qualified Java class name of the Action subclass
                     [org.apache.struts.action.Action] that will process requests
                     for this action mapping. Not valid if either the "forward"
                     or "include" attribute is specified.  Exactly one of
                     "forward", "include", or "type" must be specified.

     unknown         Set to "true" if this object should be configured as the
                     default action mapping for this module. If a request does not
                     match another object, it will be passed to the ActionMapping
                     object with unknown set to "true". Only one ActionMapping
                     can be marked as "unknown" within a module.
                     [false]

     validate        Set to "true" if the validate method of the ActionForm bean
                     should be called prior to calling the Action object for this
                     action mapping, or set to "false" if you do not want the
                     validate method called.
                     [true]

     reset           Allows to specify conditions for automatic form reset.
                     Possible values: not specified, "request", "forward",
                     "request-forward" or "none".
                     [request-forward]

-->
<!ELEMENT action (icon?, display-name?, description?, set-property*, exception*, forward*)>
<!ATTLIST action         id             ID              #IMPLIED>
<!ATTLIST action         actionId       CDATA           #IMPLIED>
<!ATTLIST action         attribute      %BeanName;      #IMPLIED>
<!ATTLIST action         cancellable    %Boolean;       #IMPLIED>
<!ATTLIST action         catalog        CDATA           #IMPLIED>
<!ATTLIST action         className      %ClassName;     #IMPLIED>
<!ATTLIST action         command        CDATA           #IMPLIED>
<!ATTLIST action         dispatcher     %ClassName;     #IMPLIED>
<!ATTLIST action         extends        %RequestPath;   #IMPLIED>
<!ATTLIST action         forward        %RequestPath;   #IMPLIED>
<!ATTLIST action         include        %RequestPath;   #IMPLIED>
<!ATTLIST action         input          %RequestPath;   #IMPLIED>
<!ATTLIST action         name           %BeanName;      #IMPLIED>
<!ATTLIST action         parameter      CDATA           #IMPLIED>
<!ATTLIST action         path           %RequestPath;   #REQUIRED>
<!ATTLIST action         populate       %PopulateStrategy; #IMPLIED>
<!ATTLIST action         prefix         CDATA           #IMPLIED>
<!ATTLIST action         reset          %PopulateStrategy; #IMPLIED>
<!ATTLIST action         roles          CDATA           #IMPLIED>
<!ATTLIST action         scope          %RequestScope;  #IMPLIED>
<!ATTLIST action         singleton      %Boolean;       #IMPLIED>
<!ATTLIST action         suffix         CDATA           #IMPLIED>
<!ATTLIST action         type           %ClassName;     #IMPLIED>
<!ATTLIST action         unknown        %Boolean;       #IMPLIED>
<!ATTLIST action         validate       %Boolean;       #IMPLIED>


<!-- The "controller" element describes the ControllerConfig bean
     [org.apache.struts.config.ControllerConfig] that encapsulates
     a module's runtime configuration. The following
     attributes are defined:

     bufferSize      The size of the input buffer used when processing
                     file uploads.
                     [4096]

     catalog         Name of the catalog to use when processing requests
                     for this module.
                     [struts]

     className       Fully qualified Java class name of the
                     ControllerConfig subclass for this controller object.
                     If specified, the object must be a subclass of the
                     default class.
                     ["org.apache.struts.config.ControllerConfig"]

     command         Name of the command to execute to process a request.
                     [servlet-standard]

     contentType     Default content type (and optional character encoding) to
                     be set on each response. May be overridden by the Action,
                     JSP, or other resource to which the request is forwarded.
                     ["text/html"]

     forwardPattern  Replacement pattern defining how the "path" attribute of a
                     <forward> element is mapped to a context-relative URL when
                     it starts with a slash (and when the contextRelative
                     property is false). This value may consist of any
                     combination of the following:
                     - "$M" - Replaced by the module prefix of this module
                     - "$P" - Replaced by the "path" attribute of the  selected
                     "forward" element
                     - "$$" - Causes a literal dollar sign to be rendered
                     - "$x" - (Where "x" is any character not defined above)
                     Silently swallowed, reserved for future use
                     If not specified, the default forwardPattern is "$M$P",
                     which is consistent with the previous behavior of
                     forwards.  Since Struts 1.1.  ["$M$P"]

     inputForward    Set to "true" if you want the "input" attribute of
                     <action> elements to be the name of a local or global
                     ActionForward, which will then be used to calculate the
                     ultimate URL. Set to "false" (the default) to treat the
                     "input" parameter of <action> elements as a
                     module-relative path to the resource
                     to be used as the input form. Since Struts 1.1.
                     [false]

     locale          Set to "true" if you want a Locale object stored in the
                     user's session if not already present.
                     [true]

     maxFileSize     The maximum size (in bytes) of a file to be accepted as a
                     file upload.  Can be expressed as a number followed by a
                     "K", "M", or "G", which are interpreted to mean kilobytes,
                     megabytes, or gigabytes, respectively.
                     ["250M"]

     memFileSize     The maximum size (in bytes) of a file whose contents will
                     be retained in memory after uploading. Files larger than
                     this threshold will be written to some alternative storage
                     medium, typically a hard disk. Can be expressed as a number
                     followed by a "K", "M", or "G", which are interpreted to
                     mean kilobytes, megabytes, or gigabytes, respectively.
                     ["256K"]

     multipartClass  The fully qualified Java class name of the multipart
                     request handler class to be used with this module.
                     ["org.apache.struts.upload.CommonsMultipartRequestHandler"]

     nocache         Set to "true" if you want the controller to add HTTP
                     headers for defeating caching to every response from
                     this module.  [false]

     pagePattern     Replacement pattern defining how the "page" attribute of
                     custom tags using it is mapped to a context-relative URL
                     of the corresponding resource.  This value may consist of
                     any combination of the following:
                     - "$M" - Replaced by the module prefix of this module
                     - "$P" - Replaced by the value of the "page" attribute
                     - "$$" - Causes a literal dollar sign to be rendered
                     - "$x" - (Where "x" is any character not defined above)
                              Silently swallowed, reserved for future use
                     If not specified, the default forwardPattern is
                     "$M$P", which is consistent with previous hard coded
                     behavior of URL evaluation for "page" attributes.
                     ["$M$P"]

     processorClass  The fully qualified Java class name of the
                     RequestProcessor subclass to be used with this module.
                     ["org.apache.struts.chain.ComposableRequestProcessor"]

     tempDir         Temporary working directory to use when processing
                     file uploads.
                     [{Directory provided by servlet container}]

-->
<!ELEMENT controller     (set-property*)>
<!ATTLIST controller     id             ID              #IMPLIED>
<!ATTLIST controller     bufferSize     %Integer;       #IMPLIED>
<!ATTLIST controller     catalog        CDATA           #IMPLIED>
<!ATTLIST controller     className      %ClassName;     #IMPLIED>
<!ATTLIST controller     command        CDATA           #IMPLIED>
<!ATTLIST controller     contentType    CDATA           #IMPLIED>
<!ATTLIST controller     forwardPattern CDATA           #IMPLIED>
<!ATTLIST controller     inputForward   %Boolean;       #IMPLIED>
<!ATTLIST controller     locale         %Boolean;       #IMPLIED>
<!ATTLIST controller     maxFileSize    CDATA           #IMPLIED>
<!ATTLIST controller     memFileSize    CDATA           #IMPLIED>
<!ATTLIST controller     multipartClass %ClassName;     #IMPLIED>
<!ATTLIST controller     nocache        %Boolean;       #IMPLIED>
<!ATTLIST controller     pagePattern    CDATA           #IMPLIED>
<!ATTLIST controller     processorClass %ClassName;     #IMPLIED>
<!ATTLIST controller     tempDir        CDATA           #IMPLIED>


<!-- The "message-resources" element describes a MessageResources object with
     message templates for this module. The following attributes are defined:

     className       The configuration bean for this message resources object.
                     If specified, the object must be a subclass of the default
                     configuration bean.
                     ["org.apache.struts.config.MessageResourcesConfig"]

     factory         Fully qualified Java class name of the
                     MessageResourcesFactory subclass to use for this message
                     resources object.
                     ["org.apache.struts.util.PropertyMessageResourcesFactory"]

     key             Servlet context attribute under which this message
                     resources bundle will be stored. The default attribute is
                     the value specified by the string constant at
                     [Globals.MESSAGES_KEY]. The module prefix (if
                     any) is appended to the key (${key}${prefix}).
                     [org.apache.struts.Globals.MESSAGES_KEY]

                     NOTE: The module  prefix includes the leading
                     slash, so the default message resource bundle for a module
                     named "foo" is stored under
                     "org.apache.struts.action.MESSAGE/foo".

     null            Set to "true" if you want our message resources to return a
                     null string for unknown message keys, or "false" to return a
                     message with the bad key value.

     parameter       Configuration parameter to be passed to the createResources
                     method of our factory object.
-->
<!ELEMENT message-resources (set-property*)>
<!ATTLIST message-resources id          ID              #IMPLIED>
<!ATTLIST message-resources className   %ClassName;     #IMPLIED>
<!ATTLIST message-resources factory     %ClassName;     #IMPLIED>
<!ATTLIST message-resources key         %AttributeName; #IMPLIED>
<!ATTLIST message-resources null        %Boolean;       #IMPLIED>
<!ATTLIST message-resources parameter   CDATA           #REQUIRED>


<!-- The "plug-in" element specifies the fully qualified class name of a
     general-purpose application plug-in module that receives notification of
     application startup and shutdown events. An instance of the specified class
     is created for each element, and can be configured with nested <set-property>
     elements. The following attributes are supported:

     className       Fully qualified Java class name of the plug-in class; must
                     implement [org.apache.struts.action.PlugIn].
-->
<!ELEMENT plug-in           (set-property*)>
<!ATTLIST plug-in           id          ID              #IMPLIED>
<!ATTLIST plug-in           className   %ClassName;     #REQUIRED>


<!-- ========== Subordinate Elements ====================================== -->


<!-- The "description" element contains descriptive (paragraph length) text
     about the surrounding element, suitable for use in GUI tools.
-->
<!ELEMENT description    (#PCDATA)>
<!ATTLIST description    id             ID              #IMPLIED>


<!-- The "display-name" element contains a short (one line) description of
     the surrounding element, suitable for use in GUI tools.
-->
<!ELEMENT display-name (#PCDATA)>
<!ATTLIST display-name   id             ID              #IMPLIED>


<!-- The "icon" element contains a small-icon and large-icon element which
     specify the location, relative to the Struts configuration file, for small
     and large images used to represent the surrounding element in GUI tools.
-->
<!ELEMENT icon           (small-icon?, large-icon?)>
<!ATTLIST icon           id             ID              #IMPLIED>


<!-- The "large-icon" element specifies the location, relative to the Struts
     configuration file, of a resource containing a large (32x32 pixel)
     icon image.
-->
<!ELEMENT large-icon     (%Location;)>
<!ATTLIST large-icon     id             ID              #IMPLIED>


<!-- The "set-property" element specifies the method name and initial value of
     an additional JavaBean configuration property. When the object representing
     the surrounding element is instantiated, the accessor for the indicated
     property is called and passed the indicated value. The "set-property"
     element is especially useful when a custom subclass is used with
     <forward>, <action>, or <plug-in> elements. The subclass
     can be passed whatever other properties may be required to configure the
     object without changing how the struts-config is parsed.

    Since Struts 1.3, an alternate syntax is supported.  By using
    the "key" attribute instead of the "property" attribute, you can set 
    arbitrary string properties on the Config object which is populated
    based on the containing element.   NOTE: the "key" attribute is NOT
  supported for <set-property> inside a <plug-in> element.

     property        Name of the JavaBeans property whose setter method
                     will be called. Exactly one of
                     "property" or "key" must be specified.

     key             Where supported, the key which will be used to store
                     the specified value in the given config object.  Exactly one of
                     "property" or "key" must be specified.

     value           String representation of the value to which this
                     property will be set, after suitable type conversion

-->
<!ELEMENT set-property   EMPTY>
<!ATTLIST set-property   id             ID              #IMPLIED>
<!ATTLIST set-property   property       %PropName;      #IMPLIED>
<!ATTLIST set-property   key            CDATA           #IMPLIED>
<!ATTLIST set-property   value          CDATA           #REQUIRED>


<!-- The "small-icon" element specifies the location, relative to the Struts
     configuration file, of a resource containing a small (16x16 pixel)
     icon image.
-->
<!ELEMENT small-icon     (%Location;)>
<!ATTLIST small-icon     id             ID              #IMPLIED>

