<!--
     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.2//EN"
       "http://struts.apache.org/dtds/struts-config_1_2.dtd">

     $Id: struts-config_1_2.dtd,v 1.8 2004/04/06 23:30:23 husted Exp $
-->


<!-- ========== 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)">


<!-- ========== 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?, data-sources?, form-beans?, global-exceptions?, global-forwards?, action-mappings?, controller?, message-resources*, plug-in*)>
<!ATTLIST struts-config  id             ID              #IMPLIED>


<!-- The "data-sources" element describes a set of DataSource objects [JDBC 2.0
     Standard Extension]. The individual DataSource objects are configured through
     nested <data-source> elements.
-->
<!ELEMENT data-sources (data-source*)>
<!ATTLIST data-sources   id             ID              #IMPLIED>


<!-- The "data-source" element describes a DataSource object [JDBC 2.0 Standard
     Extension] that will be instantiated, configured, and made available as a
     servlet context attribute (or "application-scope bean"). Any object can be
     specified so long as it implements [javax.sql.DataSource] and can be
     configured entirely from JavaBean properties. The following attributes
     are required:

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

     key             Servlet context attribute key under which this data source
                     will be stored.  Default is the value specified by string
                     constant defined by Globals.DATA_SOURCE_KEY. The application
                     module prefix (if any) is appended to the key
                     (${key}$prefix}).
                     [org.apache.struts.Globals.DATA_SOURCE_KEY]

                     NOTE: The application module prefix includes the leading
                     slash, so the default datasource for a module named "foo" is
                     stored under "org.apache.struts.action.DATA_SOURCE/foo".

     type          Fully qualified Java class name for this data source object.
                     The class must implement DataSource [javax.sql.DataSource],
                     and the object must be configurable entirely from JavaBean
                     properties.
-->
<!ELEMENT data-source (set-property*)>
<!ATTLIST data-source    id             ID              #IMPLIED>
<!ATTLIST data-source    className      %ClassName;     #IMPLIED>
<!ATTLIST data-source    key            %AttributeName; #IMPLIED>
<!ATTLIST data-source    type           %ClassName;     #REQUIRED>


<!-- 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"]

     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.
-->
<!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      dynamic        %Boolean;       #IMPLIED>
<!ATTLIST form-bean      name           %BeanName;      #REQUIRED>
<!ATTLIST form-bean      type           %ClassName;     #REQUIRED>


<!-- 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.

     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  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"]

    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 ActionError object [org.apache.struts.action.ActionError]
                     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      handler        %ClassName;     #IMPLIED>
<!ATTLIST exception      key            CDATA           #REQUIRED>
<!ATTLIST exception      path           %RequestPath;    #IMPLIED>
<!ATTLIST exception      scope          %RequestScope;   #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.

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

    contextRelative  Set this to "true" if, in a modular application, the path
                     attribute starts with a slash "/" and should be considered
                     relative to the entire web application rather than the module.
                     Since Struts 1.1.
                     DEPRECATED.
                     [false]

     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.

     path            The module-relative or context-relative path to the resources
                     that is encapsulated by the logical name of this ActionForward.
                     If the path is to be considered context-relative when used in
                     a modular application, then the contextRelative attribute
                     should be set to "true". 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        className      %ClassName;     #IMPLIED>
<!ATTLIST forward        contextRelative %Boolean;      #IMPLIED>
<!ATTLIST forward        module         %RequestPath;   #IMPLIED>
<!ATTLIST forward        name           CDATA           #REQUIRED>
<!ATTLIST forward        path           %RequestPath;   #REQUIRED>
<!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:

     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.

     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"]

     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.

     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.

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

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

     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.

     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]
-->
<!ELEMENT action (icon?, display-name?, description?, set-property*, exception*, forward*)>
<!ATTLIST action         id             ID              #IMPLIED>
<!ATTLIST action         attribute      %BeanName;      #IMPLIED>
<!ATTLIST action         className      %ClassName;     #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         prefix         CDATA           #IMPLIED>
<!ATTLIST action         roles          CDATA           #IMPLIED>
<!ATTLIST action         scope          %RequestScope;  #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]

     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"]

     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.action.RequestProcessor"]

     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     className      %ClassName;     #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
     <data-source>, <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.

     property        Name of the JavaBeans property whose setter method
                     will be called.

     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;      #REQUIRED>
<!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>

