let us start using struts
authoridfx <idfx>
Fri, 5 Sep 2003 20:20:49 +0000 (20:20 +0000)
committeridfx <idfx>
Fri, 5 Sep 2003 20:20:49 +0000 (20:20 +0000)
12 files changed:
build.xml
lib/struts/commons-digester.jar [new file with mode: 0755]
lib/struts/commons-validator.jar [new file with mode: 0755]
lib/struts/jakarta-oro.jar [new file with mode: 0755]
lib/struts/struts-config_1_0.dtd [new file with mode: 0755]
lib/struts/struts-config_1_1.dtd [new file with mode: 0755]
lib/struts/struts.jar [new file with mode: 0755]
lib/struts/tiles-config.dtd [new file with mode: 0755]
lib/struts/tiles-config_1_1.dtd [new file with mode: 0755]
lib/struts/validation_1_1.dtd [new file with mode: 0755]
lib/struts/validator-rules.xml [new file with mode: 0755]
lib/struts/validator-rules_1_1.dtd [new file with mode: 0755]

index cf424b1..4f7d893 100755 (executable)
--- a/build.xml
+++ b/build.xml
@@ -85,6 +85,9 @@
     <fileset dir="lib">
       <include name="*.jar"/>
     </fileset>
+    <fileset dir="lib/struts">
+      <include name="*.jar"/>
+    </fileset>
     <fileset dir="lib/hibernate">
       <include name="*.jar"/>
     </fileset>
         <exclude name="ant.jar"/>
         <exclude name="xerces.jar"/>
       </fileset>
-      <fileset dir="lib/hibernate">
-      </fileset>
+      <fileset dir="lib/hibernate"/>
+      <fileset dir="lib/struts"/>
     </copy>
   </target>
 
diff --git a/lib/struts/commons-digester.jar b/lib/struts/commons-digester.jar
new file mode 100755 (executable)
index 0000000..c2a7d9d
Binary files /dev/null and b/lib/struts/commons-digester.jar differ
diff --git a/lib/struts/commons-validator.jar b/lib/struts/commons-validator.jar
new file mode 100755 (executable)
index 0000000..096a7f4
Binary files /dev/null and b/lib/struts/commons-validator.jar differ
diff --git a/lib/struts/jakarta-oro.jar b/lib/struts/jakarta-oro.jar
new file mode 100755 (executable)
index 0000000..346504c
Binary files /dev/null and b/lib/struts/jakarta-oro.jar differ
diff --git a/lib/struts/struts-config_1_0.dtd b/lib/struts/struts-config_1_0.dtd
new file mode 100755 (executable)
index 0000000..97ef9a0
--- /dev/null
@@ -0,0 +1,408 @@
+<?xml version="1.0" encoding="ISO-8859-1"?>\r
+\r
+\r
+<!--\r
+     DTD for the Struts Application Configuration File, Version 1.0\r
+\r
+     To support validation of your configuration file, include the following\r
+     DOCTYPE element at the beginning (after the "xml" declaration):\r
+\r
+     <!DOCTYPE struts-config PUBLIC\r
+       "-//Apache Software Foundation//DTD Struts Configuration 1.0//EN"\r
+       "http://jakarta.apache.org/struts/dtds/struts-config_1_0.dtd">\r
+\r
+     $Id: struts-config_1_0.dtd,v 1.5 2001/06/02 18:20:47 craigmcc Exp $\r
+-->\r
+\r
+\r
+<!-- ========== Defined Types ============================================= -->\r
+\r
+\r
+<!-- A "BeanName" is the identifier of a JavaBean, such as a form bean,\r
+     and also serves as the name of the corresponding scripting variable\r
+     and the name of the JSP attribute under which the bean is accessed.\r
+     Therefore, it must conform to the rules for a Java identifier.\r
+-->\r
+<!ENTITY % BeanName "CDATA">\r
+\r
+\r
+<!-- A "Boolean" is the string representation of a boolean (true or false)\r
+     variable.\r
+-->\r
+<!ENTITY % Boolean "(true|false|yes|no)">\r
+\r
+\r
+<!-- A "ClassName" is the fully qualified name of a Java class that is\r
+     instantiated to provide the functionality of the enclosing element.\r
+-->\r
+<!ENTITY % ClassName "CDATA">\r
+\r
+\r
+<!-- An "Integer" is a character string consisting solely of numeric digits,\r
+     optionally preceeded by a minus sign, that can be converted to a\r
+     32-bit integer.\r
+-->\r
+<!ENTITY % Integer "CDATA">\r
+\r
+\r
+<!-- A "Location" is a relative path, delimited by "/" characters, that\r
+     defines the location of a resource relative to the location of the\r
+     Struts configuration file itself.\r
+-->\r
+<!ENTITY % Location "#PCDATA">\r
+\r
+\r
+<!-- A "PropName" is the name of a JavaBeans property, and must begin with\r
+     a lower case letter and contain only characters that are legal in a\r
+     Java identifier.\r
+-->\r
+<!ENTITY % PropName "CDATA">\r
+\r
+\r
+<!-- A "RequestPath" is a context-relative URI path, beginning with a slash,\r
+     that identifies a mapped resource (such as a JSP page or a servlet)\r
+     within this web application.\r
+-->\r
+<!ENTITY % RequestPath "CDATA">\r
+\r
+\r
+<!-- The name of a JSP bean scope within which such a form bean may be\r
+     accessed.\r
+-->\r
+<!ENTITY % RequestScope "(request|session)">\r
+\r
+\r
+<!-- ========== Top Level Elements ======================================== -->\r
+\r
+\r
+<!-- The "struts-config" element is the root of the configuration file\r
+     hierarchy, and contains nested elements for all of the other\r
+     configuration settings.\r
+-->\r
+<!ELEMENT struts-config (data-sources?, form-beans?, global-forwards?, action-mappings?)>\r
+<!ATTLIST struts-config  id             ID              #IMPLIED>\r
+\r
+\r
+<!-- The "data-sources" element describes a set of JDBC 2.0 Standard Extension\r
+     data source objects which will be configured according to the nested\r
+     "data-source" elements found inside.\r
+-->\r
+\r
+<!ELEMENT data-sources (data-source*)>\r
+<!ATTLIST data-sources   id             ID              #IMPLIED>\r
+\r
+\r
+<!-- The "data-source" element describes a JDBC 2.0 Standard Extension data\r
+     source object (that implements javax.sql.DataSource) which will be\r
+     configured according to the properties and nested elements found here,\r
+     and made available as a servlet context attribute (i.e. application\r
+     scope bean).  The following attributes are required:\r
+\r
+     key             Servlet context attribute key under which this data\r
+                     source will be stored.  Default is the value specified\r
+                     by string constant Action.DATA_SOURCE_KEY.\r
+\r
+     type            Fully qualified Java class name of the implementation\r
+                     class (must implement javax.sql.DataSource).  Default\r
+                     value is 'org.apache.struts.util.GenericDataSource'.\r
+\r
+     NOTE:  The following attributes are defined by the default data source\r
+     implementation, and only take effect for that class or subclasses of\r
+     that class.\r
+\r
+     WARNING:  The use of these attributes is deprecated.  You should use\r
+     nested &lt;set-property&gt; elements to configure *all* properties of\r
+     your data source implementation.\r
+\r
+     autoCommit      The default auto-commit state for newly created\r
+                     connections.\r
+\r
+     description     The description of this data source.\r
+\r
+     driverClass     The Java class name of the JDBC driver to be used.\r
+                     [REQUIRED]\r
+\r
+     loginTimeout    The maximum number of seconds to wait for a connection\r
+                     to be created or returned.  Default is driver dependent.\r
+\r
+     maxCount        The maximum number of connections to be created.\r
+\r
+     minCount        The minimum number of connections to be created.\r
+\r
+     password        The database password to use when connecting. [REQUIRED]\r
+\r
+     readOnly        The default read-only state for newly created\r
+                     connections.\r
+\r
+     url             The JDBC URL to use when connecting. [REQUIRED]\r
+\r
+     user            The database username to use when connecting. [REQUIRED]\r
+\r
+-->\r
+<!ELEMENT data-source (set-property*)>\r
+<!ATTLIST data-source    id             ID              #IMPLIED>\r
+<!ATTLIST data-source    key            %BeanName;      #IMPLIED>\r
+<!ATTLIST data-source    type           %ClassName;     #IMPLIED>\r
+<!-- All of the following attributes are deprecated.  Use a nested          -->\r
+<!-- set-property element to configure data source properties.              -->\r
+<!ATTLIST data-source    autoCommit     %Boolean;       #IMPLIED>\r
+<!ATTLIST data-source    description    CDATA           #IMPLIED>\r
+<!ATTLIST data-source    driverClass    %ClassName;     #IMPLIED>\r
+<!ATTLIST data-source    loginTimeout   %Integer;       #IMPLIED>\r
+<!ATTLIST data-source    maxCount       %Integer;       #IMPLIED>\r
+<!ATTLIST data-source    minCount       %Integer;       #IMPLIED>\r
+<!ATTLIST data-source    password       CDATA           #IMPLIED>\r
+<!ATTLIST data-source    readOnly       %Boolean;       #IMPLIED>\r
+<!ATTLIST data-source    url            CDATA           #IMPLIED>\r
+<!ATTLIST data-source    user           CDATA           #IMPLIED>\r
+\r
+\r
+<!-- The "form-beans" element is the root of the set of form bean descriptors\r
+     for this application.  The following attributes are defined:\r
+\r
+     type            Fully qualified Java class name of the implementation\r
+                     class used for ActionFormBean objects.  DEPRECATED.\r
+\r
+                     WARNING:  For Struts 1.0, this value is ignored.  You\r
+                     can set the default implementation class name with the\r
+                     "formBean" initialization parameter to the Struts\r
+                     controller servlet.\r
+-->\r
+<!ELEMENT form-beans (form-bean*)>\r
+<!ATTLIST form-beans     id             ID              #IMPLIED>\r
+<!ATTLIST form-beans     type           %ClassName;     "org.apache.struts.action.ActionFormBean">\r
+\r
+\r
+<!-- The "form-bean" element describes a particular form bean, which is a\r
+     JavaBean that implements the org.apache.struts.action.ActionForm\r
+     class.  The following attributes are defined:\r
+\r
+     className       Fully qualified Java class name of the ActionFormBean\r
+                     implementation class to use.  Defaults to the value\r
+                     configured as the "formBean" initialization parameter\r
+                     to the Struts controller servlet.\r
+\r
+     name            Unique identifier of this bean, used to reference it\r
+                     in corresponding action mappings.\r
+\r
+     type            Fully qualified Java class name of the implementation\r
+                     class to be used or generated\r
+-->\r
+<!ELEMENT form-bean (icon?, display-name?, description?, set-property*)>\r
+<!ATTLIST form-bean      id             ID              #IMPLIED>\r
+<!ATTLIST form-bean      className      %ClassName;     #IMPLIED>\r
+<!ATTLIST form-bean      name           %BeanName;      #REQUIRED>\r
+<!ATTLIST form-bean      type           %ClassName;     #REQUIRED>\r
+\r
+\r
+<!-- The "global-forwards" element configures the global mappings of logical\r
+     names (used within the application) to mappable resources (identified\r
+     by context-relative URI paths).  A global "forward" with a particular name\r
+     can be locally overridden by defining a "forward" of the same name within\r
+     an "action" element.  The following attribute are defined:\r
+\r
+     type            Fully qualified Java class name of the implementation\r
+                     class used for ActionForward objects.  DEPRECATED.\r
+\r
+                     WARNING:  For Struts 1.0, this value is ignored.  You\r
+                     can set the default implementation class name with the\r
+                     "forward" initialization parameter to the Struts\r
+                     controller servlet.\r
+-->\r
+<!ELEMENT global-forwards (forward*)>\r
+<!ATTLIST global-forwards id            ID              #IMPLIED>\r
+<!ATTLIST global-forwards type          %ClassName;     "org.apache.struts.action.ActionForward">\r
+\r
+\r
+<!-- The "forward" element describes a mapping of a logical name (used within\r
+     the application) to a mappable resource identified by a context-relative\r
+     URI path.  The following attributes are defined:\r
+\r
+     className       Fully qualified Java class name of the ActionForward\r
+                     implementation class to use.  Defaults to the value\r
+                     configured as the "forward" initialization parameter\r
+                     to the Struts controller servlet.\r
+\r
+     name            Unique identifier of this forward, used to reference it\r
+                     in application action classes.\r
+\r
+     path            The context-relative path of the mapped resource.\r
+\r
+     redirect        Set to "true" if sendRedirect() should be used to forward\r
+                     to this resource, or "false" in order to use\r
+                     RequestDispatcher.forward() instead.\r
+-->\r
+<!ELEMENT forward (icon?, display-name?, description?, set-property*)>\r
+<!ATTLIST forward        id             ID              #IMPLIED>\r
+<!ATTLIST forward        className      %ClassName;     #IMPLIED>\r
+<!ATTLIST forward        name           CDATA           #REQUIRED>\r
+<!ATTLIST forward        path           %RequestPath;   #REQUIRED>\r
+<!ATTLIST forward        redirect       %Boolean;       #IMPLIED>\r
+\r
+\r
+<!-- The "action-mappings" element configures the mappings from submitted\r
+     request paths to the corresponding Action classes that should be\r
+     used to process these requests.  The following attributes are\r
+     defined:\r
+\r
+     type           Fully qualified Java class name of the ActionMapping\r
+                    implementation class to be used.  DEPRECATED.\r
+\r
+                     WARNING:  For Struts 1.0, this value is ignored.  You\r
+                     can set the default implementation class name with the\r
+                     "mapping" initialization parameter to the Struts\r
+                     controller servlet.\r
+-->\r
+<!ELEMENT action-mappings (action*)>\r
+<!ATTLIST action-mappings id             ID              #IMPLIED>\r
+<!ATTLIST action-mappings type           %ClassName;     "org.apache.struts.action.ActionMapping">\r
+\r
+\r
+<!-- The "action" element describes a mapping from a request paths to the\r
+     corresponding Action classes that should be used to process these\r
+     requests.  The following attributes are defined:\r
+\r
+     attribute       Name of the request-scope or session-scope attribute\r
+                     under which our form bean is accessed, if it is other\r
+                     than the bean's specified "name".  Optional if\r
+                     "name" is specified, else not allowed.\r
+\r
+     className       Fully qualified Java class name of the ActionMapping\r
+                     implementation class to use.  Defaults to the value\r
+                     configured as the "mapping" initialization parameter\r
+                     to the Struts controller servlet.\r
+\r
+     forward         Context-relative path of the servlet or JSP resource that\r
+                     will process this request, instead of instantiating and\r
+                     calling the Action class specified by "type".  Exactly one\r
+                     of "forward", "include", or "type" must be specified.\r
+\r
+     include         Context-relative path of the servlet or JSP resource that\r
+                     will process this request, instead of instantiating and\r
+                     calling the Action class specified by "type".  Exactly one\r
+                     of "forward", "include", or "type" must be specified.\r
+\r
+     input           Context-relative path of the input form to which control\r
+                     should be returned if a validation error is encountered.\r
+                     Required if "name" is specified and the input bean\r
+                     returns validation errors.  Optional if "name" is\r
+                     specified and the input bean does not return validation\r
+                     errors.  Not allowed if "name" is not specified.\r
+\r
+     name            Name of the form bean, if any, that is associated\r
+                     with this action.\r
+\r
+     path            The context-relative path of the submitted request,\r
+                     starting with a "/" character, and without the\r
+                     filename extension if extension mapping is used.\r
+\r
+     parameter       General purpose configuration parameter that can be used\r
+                     to pass extra information to the Action selected by this\r
+                     mapping.\r
+\r
+     prefix          Prefix used to match request parameter names to form bean\r
+                     property names, if any.  Optional if "name" is specified,\r
+                     else not allowed.\r
+\r
+     scope           Identifier of the scope ("request" or "session") within\r
+                     which our form bean is accessed, if any.  Optional if\r
+                     "name" is specified, else not allowed.\r
+\r
+     suffix          Suffix used to match request parameter names to form bean\r
+                     property names, if any.  Optional if "name" is specified,\r
+                     else not allowed.\r
+\r
+     type            Fully qualified Java class name of the Action class\r
+                     (implements org.apache.struts.action.Action) to be\r
+                     used to process requests for this mapping if the "forward"\r
+                     or "include" attribute is not included.  Exactly one\r
+                     of "forward", "include", or "type" must be specified.\r
+\r
+     unknown         Set to "true" if this action should be configured as the\r
+                     default for this application, to handle all requests\r
+                     not handled by another action.  Only one action can be\r
+                     defined as a default within a single application.\r
+\r
+     validate        Set to "true" if the validate() method of the form bean\r
+                     should be called prior to calling this action, or set to\r
+                     "false" if you do not want validation performed.\r
+-->\r
+<!ELEMENT action (icon?, display-name?, description?, set-property*, forward*)>\r
+<!ATTLIST action         id             ID              #IMPLIED>\r
+<!ATTLIST action         attribute      %BeanName;      #IMPLIED>\r
+<!ATTLIST action         className      %ClassName;     #IMPLIED>\r
+<!ATTLIST action         forward        %RequestPath;   #IMPLIED>\r
+<!ATTLIST action         include        %RequestPath;   #IMPLIED>\r
+<!ATTLIST action         input          %RequestPath;   #IMPLIED>\r
+<!ATTLIST action         name           %BeanName;      #IMPLIED>\r
+<!ATTLIST action         parameter      CDATA           #IMPLIED>\r
+<!ATTLIST action         path           %RequestPath;   #REQUIRED>\r
+<!ATTLIST action         prefix         CDATA           #IMPLIED>\r
+<!ATTLIST action         scope          %RequestScope;  #IMPLIED>\r
+<!ATTLIST action         suffix         CDATA           #IMPLIED>\r
+<!ATTLIST action         type           %ClassName;     #IMPLIED>\r
+<!ATTLIST action         unknown        %Boolean;       #IMPLIED>\r
+<!ATTLIST action         validate       %Boolean;       #IMPLIED>\r
+\r
+\r
+<!-- The "set-property" element specifies the name and value of an additional\r
+     JavaBeans configuration property whose setter method will be called\r
+     on the object that represents our surrounding element.  This is especially\r
+     useful when an extended implementation class (with additional properties)\r
+     is configured on the <global-forwards> or <action-mappings> elements.\r
+     The following attributes are defined:\r
+\r
+     property        Name of the JavaBeans property whose setter method\r
+                     will be called.\r
+\r
+     value           String representation of the value to which this\r
+                     property will be set, after suitable type conversion\r
+-->\r
+<!ELEMENT set-property EMPTY>\r
+<!ATTLIST set-property   id             ID              #IMPLIED>\r
+<!ATTLIST set-property   property       %PropName;      #REQUIRED>\r
+<!ATTLIST set-property   value          CDATA           #REQUIRED>\r
+\r
+\r
+\r
+<!-- ========== Subordinate Elements ====================================== -->\r
+\r
+\r
+<!-- The "description" element contains descriptive (paragraph length) text\r
+     about the surrounding element, suitable for use in GUI tools.\r
+-->\r
+<!ELEMENT description (#PCDATA)>\r
+<!ATTLIST description    id             ID              #IMPLIED>\r
+\r
+\r
+\r
+<!-- The "display-name" element contains a short (one line) description of\r
+     the surrounding element, suitable for use in GUI tools.\r
+-->\r
+<!ELEMENT display-name (#PCDATA)>\r
+<!ATTLIST display-name   id             ID              #IMPLIED>\r
+\r
+\r
+<!-- The "icon" element contains a small-icon and large-icon element which\r
+     specify the location, relative to the Struts configuration file, for small\r
+     and large images used to represent the surrounding element in GUI tools.\r
+-->\r
+<!ELEMENT icon (small-icon?, large-icon?)>\r
+<!ATTLIST icon           id             ID              #IMPLIED>\r
+\r
+\r
+<!-- The "large-icon" element specifies the location, relative to the Struts\r
+     configuration file, of a resource containing a large (32x32 pixel)\r
+     icon image.\r
+-->\r
+<!ELEMENT large-icon (%Location;)>\r
+<!ATTLIST large-icon     id             ID              #IMPLIED>\r
+\r
+\r
+<!-- The "small-icon" element specifies the location, relative to the Struts\r
+     configuration file, of a resource containing a small (16x16 pixel)\r
+     icon image.\r
+-->\r
+<!ELEMENT small-icon (%Location;)>\r
+<!ATTLIST small-icon     id             ID              #IMPLIED>\r
+\r
diff --git a/lib/struts/struts-config_1_1.dtd b/lib/struts/struts-config_1_1.dtd
new file mode 100755 (executable)
index 0000000..2eee0a7
--- /dev/null
@@ -0,0 +1,697 @@
+<!--\r
+     DTD for the Struts Application Configuration File, Version 1.1\r
+\r
+     To support validation of your configuration file, include the following\r
+     DOCTYPE element at the beginning (after the "xml" declaration):\r
+\r
+     <!DOCTYPE struts-config PUBLIC\r
+       "-//Apache Software Foundation//DTD Struts Configuration 1.1//EN"\r
+       "http://jakarta.apache.org/struts/dtds/struts-config_1_1.dtd">\r
+\r
+     $Id: struts-config_1_1.dtd,v 1.40 2003/05/14 08:17:16 turner Exp $\r
+-->\r
+\r
+\r
+<!-- ========== Defined Types ============================================= -->\r
+\r
+\r
+<!-- An "AttributeName" is the identifier of a page, request, session, or\r
+     application scope attribute.\r
+-->\r
+<!ENTITY % AttributeName "CDATA">\r
+\r
+\r
+<!-- A "BeanName" is the identifier of a JavaBean, such as a form bean,\r
+     and also serves as the name of the corresponding scripting variable\r
+     and the name of the JSP attribute under which the bean is accessed.\r
+     Therefore, it must conform to the rules for a Java identifier.\r
+-->\r
+<!ENTITY % BeanName "CDATA">\r
+\r
+\r
+<!-- A "Boolean" is the string representation of a boolean (true or false)\r
+     variable.\r
+-->\r
+<!ENTITY % Boolean "(true|false|yes|no)">\r
+\r
+\r
+<!-- A "ClassName" is the fully qualified name of a Java class that is\r
+     instantiated to provide the functionality of the enclosing element.\r
+-->\r
+<!ENTITY % ClassName "CDATA">\r
+\r
+\r
+<!-- An "Integer" is a character string consisting solely of numeric digits,\r
+     optionally preceeded by a minus sign, that can be converted to a\r
+     32-bit integer.\r
+-->\r
+<!ENTITY % Integer "CDATA">\r
+\r
+\r
+<!-- A "Location" is a relative path, delimited by "/" characters, that\r
+     defines the location of a resource relative to the location of the\r
+     Struts configuration file itself.\r
+-->\r
+<!ENTITY % Location "#PCDATA">\r
+\r
+\r
+<!-- A "PropName" is the name of a JavaBeans property, and must begin with\r
+     a lower case letter and contain only characters that are legal in a\r
+     Java identifier.\r
+-->\r
+<!ENTITY % PropName "CDATA">\r
+\r
+\r
+<!-- A "RequestPath" is an application-relative URI path, beginning with a\r
+     slash, that identifies a mapped resource (such as a JSP page or a servlet)\r
+     within this web application.\r
+-->\r
+<!ENTITY % RequestPath "CDATA">\r
+\r
+\r
+<!-- The name of a JSP bean scope within which such a form bean may be\r
+     accessed.\r
+-->\r
+<!ENTITY % RequestScope "(request|session)">\r
+\r
+\r
+<!-- ========== Top Level Elements ======================================== -->\r
+\r
+\r
+<!-- The "struts-config" element is the root of the configuration file\r
+     hierarchy, and contains nested elements for all of the other\r
+     configuration settings.\r
+-->\r
+<!ELEMENT struts-config (data-sources?, form-beans?, global-exceptions?, global-forwards?, action-mappings?, controller?, message-resources*, plug-in*)>\r
+<!ATTLIST struts-config  id             ID              #IMPLIED>\r
+\r
+\r
+<!-- The "data-sources" element describes a set of DataSource objects [JDBC 2.0\r
+     Standard Extension]. The individual DataSource objects are configured through\r
+     nested <data-source> elements.\r
+-->\r
+<!ELEMENT data-sources (data-source*)>\r
+<!ATTLIST data-sources   id             ID              #IMPLIED>\r
+\r
+\r
+<!-- The "data-source" element describes a DataSource object [JDBC 2.0 Standard\r
+     Extension] that will be instantiated, configured, and made available as a\r
+     servlet context attribute (or "application-scope bean"). Any object can be\r
+     specified so long as it implements [javax.sql.DataSource] and can be\r
+     configured entirely from JavaBean properties. The following attributes\r
+     are required:\r
+\r
+     className       The configuration bean for this DataSource object. If\r
+                     specified, the object must be a subclass of the default\r
+                     configuration bean.\r
+                     ["org.apache.struts.config.DataSourceConfig"]\r
+\r
+     key             Servlet context attribute key under which this data source\r
+                     will be stored.  Default is the value specified by string\r
+                     constant defined by Globals.DATA_SOURCE_KEY. The application\r
+                     module prefix (if any) is appended to the key\r
+                     (${key}$prefix}).\r
+                     [org.apache.struts.Globals.DATA_SOURCE_KEY]\r
+\r
+                     NOTE: The application module prefix includes the leading\r
+                     slash, so the default datasource for a module named "foo" is\r
+                     stored under "org.apache.struts.action.DATA_SOURCE/foo".\r
+\r
+     type            Fully qualified Java class name for this data source object.\r
+                     The class must implement DataSource [javax.sql.DataSource],\r
+                     and the object must be configurable entirely from JavaBean\r
+                     properties.\r
+-->\r
+<!ELEMENT data-source (set-property*)>\r
+<!ATTLIST data-source    id             ID              #IMPLIED>\r
+<!ATTLIST data-source    className      %ClassName;     #IMPLIED>\r
+<!ATTLIST data-source    key            %AttributeName; #IMPLIED>\r
+<!ATTLIST data-source    type           %ClassName;     #IMPLIED>\r
+\r
+\r
+<!-- The "form-beans" element describes the set of form bean descriptors for this\r
+     application module. The following attributes are defined:\r
+\r
+     type            Fully qualified Java class to use when instantiating\r
+                     ActionFormBean objects. If specified, the object must be a\r
+                     subclass of the default class type.\r
+                     DEPRECATED.\r
+\r
+                     WARNING:  For Struts 1.0, this value is ignored.  You\r
+                     can set the default implementation class name with the\r
+                     "formBean" initialization parameter to the Struts\r
+                     controller servlet.\r
+-->\r
+<!ELEMENT form-beans (form-bean*)>\r
+<!ATTLIST form-beans     id             ID              #IMPLIED>\r
+<!ATTLIST form-beans     type           %ClassName;     #IMPLIED>\r
+\r
+\r
+<!-- The "form-bean" element describes an ActionForm subclass\r
+     [org.apache.struts.action.ActionForm] that can be referenced by an "action"\r
+     element.\r
+\r
+\r
+The "form-bean" element describes a particular form bean, which is a\r
+     JavaBean that implements the org.apache.struts.action.ActionForm\r
+     class.  The following attributes are defined:\r
+\r
+     className       The configuration bean for this form bean object. If\r
+                     specified, the object must be a subclass of the default\r
+                     configuration bean.\r
+                     ["org.apache.struts.config.FormBeanConfig"]\r
+\r
+     dynamic         If the form bean type is a  DynaActionForm subclass (that you\r
+                     created), then (and only then) set this attribute to "true".\r
+                     If the type is set to the default DynaActionForm or any\r
+                     conventional ActionForm subclass, then this attribute can be\r
+                     omitted.\r
+                     [true] if type is "org.apache.struts.action.DynaActionForm"\r
+                     [false] otherwise  DEPRECATED - THIS IS NOW DETERMINED\r
+                     DYNAMICALLY BASED ON THE SPECIFIED IMPLEMENTATION CLASS.\r
+\r
+     name            The unique identifier for this form bean. Referenced by the\r
+                     <action> element to specify which form bean to use with its\r
+                     request.\r
+\r
+     type            Fully qualified Java class name of the ActionForm subclass\r
+                     to use with this form bean.\r
+-->\r
+<!ELEMENT form-bean (icon?, display-name?, description?, set-property*, form-property*)>\r
+<!ATTLIST form-bean      id             ID              #IMPLIED>\r
+<!ATTLIST form-bean      className      %ClassName;     #IMPLIED>\r
+<!ATTLIST form-bean      dynamic        %Boolean;       #IMPLIED>\r
+<!ATTLIST form-bean      name           %BeanName;      #REQUIRED>\r
+<!ATTLIST form-bean      type           %ClassName;     #REQUIRED>\r
+\r
+\r
+<!-- The "form-property" element describes a JavaBean property that can be used to\r
+     configure an instance of a DynaActionForm or a subclass thereof. This element\r
+     is only utilized when the "type" attribute of the enclosing "form-bean" element\r
+     is [org.apache.struts.action.DynaActionForm] or a subclass of DynaActionForm. If\r
+     a custom DynaActionForm subclass is used, then the "dynamic" attribute of the\r
+     enclosing <form-bean> element must be set to "true". Since Struts 1.1.\r
+\r
+     className       The configuration bean for this form property object. If\r
+                     specified, the object must be a subclass of the default\r
+                     configuration bean.\r
+                     ["org.apache.struts.config.FormPropertyConfig"]\r
+\r
+     initial         String representation of the initial value for this property.\r
+                     If not specified, primitives will be initialized to zero and\r
+                     objects initialized to the zero-argument instantiation of that\r
+                     object class.  For example, Strings will be initialized to ""\r
+\r
+\r
+     name            The name of the JavaBean property described by this element.\r
+\r
+     size            The number of array elements to create if the value of the\r
+                     "type" attribute specifies an array, but there is no value\r
+                     specified for the "initial" attribute.\r
+\r
+     type            Fully qualified Java class name of the field underlying this\r
+                     property, optionally followed by "[]" to indicate that the\r
+                     field is indexed.\r
+-->\r
+<!ELEMENT form-property  (set-property*)>\r
+<!ATTLIST form-property  className      %ClassName;     #IMPLIED>\r
+<!ATTLIST form-property  initial        CDATA           #IMPLIED>\r
+<!ATTLIST form-property  name           %PropName;      #REQUIRED>\r
+<!ATTLIST form-property  size           %Integer;       #IMPLIED>\r
+<!ATTLIST form-property  type           %ClassName;     #REQUIRED>\r
+\r
+\r
+<!-- The "global-exceptions" element describes a set of exceptions that might be\r
+     thrown by an Action object. The handling of individual exception types is\r
+     configured through nested exception elements. An <action> element may\r
+     override a global exception handler by registering a local exception handler\r
+     for the same exception type. Since Struts 1.1.\r
+-->\r
+<!ELEMENT global-exceptions (exception*)>\r
+<!ATTLIST global-exceptions id          ID              #IMPLIED>\r
+\r
+\r
+<!-- The "exception" element registers an ExceptionHandler for an exception type.\r
+     The following attributes are defined:\r
+\r
+    bundle           Servlet context attribute for the message resources bundle\r
+                     associated with this handler. The default attribute is the\r
+                     value specified by the string constant declared at\r
+                     Globals.MESSAGES_KEY.\r
+                     [org.apache.struts.Globals.MESSAGES_KEY]\r
+\r
+    className        The configuration bean for this ExceptionHandler object.\r
+                     If specified, className must be a subclass of the default\r
+                     configuration bean\r
+                     ["org.apache.struts.config.ExceptionConfig"]\r
+\r
+    handler          Fully qualified Java class name for this exception handler.\r
+                     ["org.apache.struts.action.ExceptionHandler"]\r
+\r
+    key              The key to use with this handler's message resource bundle\r
+                     that will retrieve the error message template for this\r
+                     exception.\r
+\r
+    path             The module-relative URI to the resource that will complete\r
+                     the request/response if this exception occurs.\r
+\r
+    scope            The context ("request" or "session") that is used to access\r
+                     the ActionError object [org.apache.struts.action.ActionError]\r
+                     for this exception.\r
+\r
+    type             Fully qualified Java class name of the exception type to\r
+                     register with this handler.\r
+-->\r
+<!ELEMENT exception (icon?, display-name?, description?, set-property*)>\r
+<!ATTLIST exception      id             ID              #IMPLIED>\r
+<!ATTLIST exception      bundle         %AttributeName; #IMPLIED>\r
+<!ATTLIST exception      className      %ClassName;     #IMPLIED>\r
+<!ATTLIST exception      handler        %ClassName;     #IMPLIED>\r
+<!ATTLIST exception      key            CDATA           #REQUIRED>\r
+<!ATTLIST exception      path           %RequestPath;   #IMPLIED>\r
+<!ATTLIST exception      scope          CDATA           #IMPLIED>\r
+<!ATTLIST exception      type           %ClassName;     #REQUIRED>\r
+\r
+\r
+<!-- The "global-forwards" element describes a set of ActionForward objects\r
+     [org.apache.struts.action.ActionForward] that are available to all Action\r
+     objects as a return value. The individual ActionForwards are configured\r
+     through nested <forward> elements. An <action> element may override a global\r
+     forward by defining a local <forward> of the same name.\r
+\r
+     type            Fully qualified Java class to use when instantiating\r
+                     ActionForward objects.  If specified, the object must be a\r
+                     subclass of the default class type.\r
+                     DEPRECATED.\r
+\r
+                     WARNING:  For Struts 1.0, this value is ignored.  You\r
+                     can set the default implementation class name with the\r
+                     "forward" initialization parameter to the Struts\r
+                     controller servlet.\r
+-->\r
+<!ELEMENT global-forwards (forward*)>\r
+<!ATTLIST global-forwards id            ID              #IMPLIED>\r
+<!ATTLIST global-forwards type          %ClassName;     #IMPLIED>\r
+\r
+\r
+<!-- The "forward" element describes an ActionForward that is to be made\r
+     available to an Action as a return value. An ActionForward is referenced by\r
+     a logical name and encapsulates a URI. A "forward" element may be used to\r
+     describe both global and local ActionForwards. Global forwards are available\r
+     to all the Action objects in the application module. Local forwards can be\r
+     nested within an <action> element and only available to an Action object\r
+     when it is invoked through that ActionMapping.\r
+\r
+     className       Fully qualified Java class name of ActionForward\r
+                     subclass to use for this object.\r
+                     ["org.apache.struts.action.ActionForward"]\r
+\r
+    contextRelative  Set this to "true" if, in a modular application, the path\r
+                     attribute starts with a slash "/" and should be considered\r
+                     relative to the entire web application rather than the module.\r
+                     Since Struts 1.1.\r
+                     [false]\r
+\r
+     name            The unique identifier for this forward. Referenced by the\r
+                     Action object at runtime to select - by its logical name -\r
+                     the resource that should complete the request/response.\r
+\r
+     path            The module-relative or context-relative path to the resources\r
+                     that is encapsulated by the logical name of this ActionForward.\r
+                     If the path is to be considered context-relative when used in\r
+                     a modular application, then the contextRelative attribute\r
+                     should be set to "true". This value should begin with a slash\r
+                     ("/") character.\r
+\r
+     redirect        Set to "true" if a redirect instruction should be issued to\r
+                     the user-agent so that a new request is issued for this\r
+                     forward's resource. If true,  RequestDispatcher.Redirect is\r
+                     called. If "false", RequestDispatcher.forward is called instead.\r
+                     [false]\r
+-->\r
+<!ELEMENT forward (icon?, display-name?, description?, set-property*)>\r
+<!ATTLIST forward        id             ID              #IMPLIED>\r
+<!ATTLIST forward        className      %ClassName;     #IMPLIED>\r
+<!ATTLIST forward        contextRelative %Boolean;      #IMPLIED>\r
+<!ATTLIST forward        name           CDATA           #REQUIRED>\r
+<!ATTLIST forward        path           %RequestPath;   #REQUIRED>\r
+<!ATTLIST forward        redirect       %Boolean;       #IMPLIED>\r
+\r
+\r
+<!-- The "action-mappings" element describes a set of ActionMapping objects\r
+     [org.apache.struts.action.ActionMapping] that are available to process\r
+     requests matching the url-pattern our ActionServlet registered with the\r
+     container. The individual ActionMappings are configured through nested\r
+     <action> elements. The following attributes are defined:\r
+\r
+     type           Fully qualified Java class to use when instantiating\r
+                    ActionMapping objects. If specified, the object must be a\r
+                    subclass of the default class type.\r
+\r
+                    WARNING:  For Struts 1.0, this value is ignored.  You\r
+                    can set the default implementation class name with the\r
+                    "mapping" initialization parameter to the Struts\r
+                    controller servlet.\r
+-->\r
+<!ELEMENT action-mappings (action*)>\r
+<!ATTLIST action-mappings id             ID              #IMPLIED>\r
+<!ATTLIST action-mappings type           %ClassName;     #IMPLIED>\r
+\r
+\r
+<!-- The "action" element describes an ActionMapping object that is to be used\r
+     to process a request for a specific module-relative URI. The following\r
+     attributes are defined:\r
+\r
+     attribute       Name of the request-scope or session-scope attribute that\r
+                     is used to access our ActionForm bean, if it is other than\r
+                     the bean's specified "name". Optional if "name" is specified,\r
+                     else not valid.\r
+\r
+     className       The fully qualified Java class name of the ActionMapping\r
+                     subclass to use for this action mapping object. Defaults to\r
+                     the type specified by the enclosing <action-mappings>\r
+                     element or to "org.apache.struts.action.ActionMapping" if\r
+                     not specified.\r
+                     ["org.apache.struts.action.ActionMapping"]\r
+\r
+     forward         Module-relative path of the servlet or other resource that\r
+                     will process this request, instead of the Action class\r
+                     specified by "type".  The path WILL NOT be processed\r
+                     through the "forwardPattern" attribute that is configured\r
+                     on the "controller" element for this application module.\r
+                     Exactly one of "forward", "include", or "type" must be\r
+                     specified.\r
+\r
+     include         Module-relative path of the servlet or other resource that\r
+                     will process this request, instead of the Action class\r
+                     specified by "type".  The path WILL NOT be processed\r
+                     through the "forwardPattern" attribute that is configured\r
+                     on the "controller" element for this application module.\r
+                     Exactly one of "forward", "include", or "type" must be\r
+                     specified.\r
+\r
+     input           Module-relative path of the action or other resource to\r
+                     which control should be returned if a validation error is\r
+                     encountered. Valid only when "name" is specified. Required\r
+                     if "name" is specified and the input bean returns\r
+                     validation errors. Optional if "name" is specified and the\r
+                     input bean does not return validation errors.\r
+\r
+     name            Name of the form bean, if any, that is associated with this\r
+                     action mapping.\r
+\r
+     path            The module-relative path of the submitted request, starting\r
+                     with a "/" character, and without the filename extension if\r
+                     extension mapping is used.\r
+\r
+                     NOTE:  Do *not* include a period in your path name,\r
+                     because it will look like a filename extension and\r
+                     cause your Action to not be located.\r
+\r
+     parameter       General-purpose configuration parameter that can be used to\r
+                     pass extra information to the Action object selected by\r
+                     this action mapping.\r
+\r
+     prefix          Prefix used to match request parameter names to ActionForm\r
+                     property names, if any. Optional if "name" is specified,\r
+                     else not allowed.\r
+\r
+     roles           Comma-delimited list of security role names that are allowed\r
+                     access to this ActionMapping object. Since Struts 1.1.\r
+\r
+     scope           The context ("request" or "session") that is used to\r
+                     access our ActionForm bean, if any.  Optional if "name" is\r
+                     specified, else not valid.\r
+\r
+     suffix          Suffix used to match request parameter names to ActionForm\r
+                     bean property names, if any. Optional if "name" is\r
+                     specified, else not valid.\r
+\r
+     type            Fully qualified Java class name of the Action subclass\r
+                     [org.apache.struts.action.Action] that will process requests\r
+                     for this action mapping. Not valid if either the "forward"\r
+                     or "include" attribute is specified.  Exactly one of\r
+                     "forward", "include", or "type" must be specified.\r
+\r
+     unknown         Set to "true" if this object should be configured as the\r
+                     default action mapping for this module. If a request does not\r
+                     match another object, it will be passed to the ActionMapping\r
+                     object with unknown set to "true". Only one ActionMapping\r
+                     can be marked as "unknown" within a module.\r
+                     [false]\r
+\r
+     validate        Set to "true" if the validate method of the ActionForm bean\r
+                     should be called prior to calling the Action object for this\r
+                     action mapping, or set to "false" if you do not want the\r
+                     validate method called.\r
+                     [true]\r
+-->\r
+<!ELEMENT action (icon?, display-name?, description?, set-property*, exception*, forward*)>\r
+<!ATTLIST action         id             ID              #IMPLIED>\r
+<!ATTLIST action         attribute      %BeanName;      #IMPLIED>\r
+<!ATTLIST action         className      %ClassName;     #IMPLIED>\r
+<!ATTLIST action         forward        %RequestPath;   #IMPLIED>\r
+<!ATTLIST action         include        %RequestPath;   #IMPLIED>\r
+<!ATTLIST action         input          %RequestPath;   #IMPLIED>\r
+<!ATTLIST action         name           %BeanName;      #IMPLIED>\r
+<!ATTLIST action         parameter      CDATA           #IMPLIED>\r
+<!ATTLIST action         path           %RequestPath;   #REQUIRED>\r
+<!ATTLIST action         prefix         CDATA           #IMPLIED>\r
+<!ATTLIST action         roles          CDATA           #IMPLIED>\r
+<!ATTLIST action         scope          %RequestScope;  #IMPLIED>\r
+<!ATTLIST action         suffix         CDATA           #IMPLIED>\r
+<!ATTLIST action         type           %ClassName;     #IMPLIED>\r
+<!ATTLIST action         unknown        %Boolean;       #IMPLIED>\r
+<!ATTLIST action         validate       %Boolean;       #IMPLIED>\r
+\r
+\r
+<!-- The "controller" element describes the ControllerConfig bean\r
+     [org.apache.struts.config.ControllerConfig] that encapsulates\r
+     an application module's runtime configuration. The following\r
+     attributes are defined:\r
+\r
+     bufferSize      The size of the input buffer used when processing\r
+                     file uploads.\r
+                     [4096]\r
+\r
+     className       Fully qualified Java class name of the\r
+                     ControllerConfig subclass for this controller object.\r
+                     If specified, the object must be a subclass of the\r
+                     default class.\r
+                     ["org.apache.struts.config.ControllerConfig"]\r
+\r
+     contentType     Default content type (and optional character encoding) to\r
+                     be set on each response. May be overridden by the Action,\r
+                     JSP, or other resource to which the request is forwarded.\r
+                     ["text/html"]\r
+\r
+     debug           Debugging detail level for this module. [0]\r
+                     DEPRECATED - configure the logging detail level\r
+                     in your underlying logging implementation.\r
+\r
+     forwardPattern  Replacement pattern defining how the "path" attribute of a\r
+                     <forward> element is mapped to a context-relative URL when\r
+                     it starts with a slash (and when the contextRelative\r
+                     property is false). This value may consist of any\r
+                     combination of the following:\r
+                     - "$M" - Replaced by the module prefix of this module\r
+                     - "$P" - Replaced by the "path" attribute of the  selected\r
+                     "forward" element\r
+                     - "$$" - Causes a literal dollar sign to be rendered\r
+                     - "$x" - (Where "x" is any character not defined above)\r
+                     Silently swallowed, reserved for future use\r
+                     If not specified, the default forwardPattern is "$M$P",\r
+                     which is consistent with the previous behavior of\r
+                     forwards.  Since Struts 1.1.  ["$M$P"]\r
+\r
+     inputForward    Set to "true" if you want the "input" attribute of\r
+                     <action> elements to be the name of a local or global\r
+                     ActionForward, which will then be used to calculate the\r
+                     ultimate URL. Set to "false" (the default) to treat the\r
+                     "input" parameter of <action> elements as a\r
+                     module-relative path to the resource\r
+                     to be used as the input form. Since Struts 1.1.\r
+                     [false]\r
+\r
+     locale          Set to "true" if you want a Locale object stored in the\r
+                     user's session if not already present.\r
+                     [true]\r
+\r
+     maxFileSize     The maximum size (in bytes) of a file to be accepted as a\r
+                     file upload.  Can be expressed as a number followed by a\r
+                     "K", "M", or "G", which are interpreted to mean kilobytes,\r
+                     megabytes, or gigabytes, respectively.\r
+                     ["250M"]\r
+\r
+     memFileSize     The maximum size (in bytes) of a file whose contents will\r
+                     be retained in memory after uploading. Files larger than\r
+                     this threshold will be written to some alternative storage\r
+                     medium, typically a hard disk. Can be expressed as a number\r
+                     followed by a "K", "M", or "G", which are interpreted to\r
+                     mean kilobytes, megabytes, or gigabytes, respectively.\r
+                     ["256K"]\r
+\r
+     multipartClass  The fully qualified Java class name of the multipart\r
+                     request handler class to be used with this module.\r
+                     ["org.apache.struts.upload.CommonsMultipartRequestHandler"]\r
+\r
+     nocache         Set to "true" if you want the controller to add HTTP\r
+                     headers for defeating caching to every response from\r
+                     this module.  [false]\r
+\r
+     pagePattern     Replacement pattern defining how the "page" attribute of\r
+                     custom tags using it is mapped to a context-relative URL\r
+                     of the corresponding resource.  This value may consist of\r
+                     any combination of the following:\r
+                     - "$M" - Replaced by the module prefix of this module\r
+                     - "$P" - Replaced by the value of the "page" attribute\r
+                     - "$$" - Causes a literal dollar sign to be rendered\r
+                     - "$x" - (Where "x" is any character not defined above)\r
+                              Silently swallowed, reserved for future use\r
+                     If not specified, the default forwardPattern is\r
+                     "$M$P", which is consistent with previous hard coded\r
+                     behavior of URL evaluation for "page" attributes.\r
+                     ["$M$P"]\r
+\r
+     processorClass  The fully qualified Java class name of the\r
+                     RequestProcessor subclass to be used with this module.\r
+                     ["org.apache.struts.action.RequestProcessor"]\r
+\r
+     tempDir         Temporary working directory to use when processing\r
+                     file uploads.\r
+                     [{Directory provided by servlet container}]\r
+-->\r
+<!ELEMENT controller     (set-property*)>\r
+<!ATTLIST controller     id             ID              #IMPLIED>\r
+<!ATTLIST controller     bufferSize     %Integer;       #IMPLIED>\r
+<!ATTLIST controller     className      %ClassName;     #IMPLIED>\r
+<!ATTLIST controller     contentType    CDATA           #IMPLIED>\r
+<!ATTLIST controller     debug          %Integer;       #IMPLIED>\r
+<!ATTLIST controller     forwardPattern CDATA           #IMPLIED>\r
+<!ATTLIST controller     inputForward   %Boolean;       #IMPLIED>\r
+<!ATTLIST controller     locale         %Boolean;       #IMPLIED>\r
+<!ATTLIST controller     maxFileSize    CDATA           #IMPLIED>\r
+<!ATTLIST controller     memFileSize    CDATA           #IMPLIED>\r
+<!ATTLIST controller     multipartClass %ClassName;     #IMPLIED>\r
+<!ATTLIST controller     nocache        %Boolean;       #IMPLIED>\r
+<!ATTLIST controller     pagePattern    CDATA           #IMPLIED>\r
+<!ATTLIST controller     processorClass %ClassName;     #IMPLIED>\r
+<!ATTLIST controller     tempDir        CDATA           #IMPLIED>\r
+\r
+\r
+<!-- The "message-resources" element describes a MessageResources object with\r
+     message templates for this module. The following attributes are defined:\r
+\r
+     className       The configuration bean for this message resources object.\r
+                     If specified, the object must be a subclass of the default\r
+                     configuration bean.\r
+                     ["org.apache.struts.config.MessageResourcesConfig"]\r
+\r
+     factory         Fully qualified Java class name of the\r
+                     MessageResourcesFactory subclass to use for this message\r
+                     resources object.\r
+                     ["org.apache.struts.util.PropertyMessageResourcesFactory"]\r
+\r
+     key             Servlet context attribute under which this message\r
+                     resources bundle will be stored. The default attribute is\r
+                     the value specified by the string constant at\r
+                     [Globals.MESSAGES_KEY]. The application module prefix (if\r
+                     any) is appended to the key (${key}${prefix}).\r
+                     [org.apache.struts.Globals.MESSAGES_KEY]\r
+\r
+                     NOTE: The application module  prefix includes the leading\r
+                     slash, so the default message resource bundle for a module\r
+                     named "foo" is stored under\r
+                     "org.apache.struts.action.MESSAGE/foo".\r
+\r
+     null            Set to "true" if you want our message resources to return a\r
+                     null string for unknown message keys, or "false" to return a\r
+                     message with the bad key value.\r
+\r
+     parameter       Configuration parameter to be passed to the createResources\r
+                     method of our factory object.\r
+-->\r
+<!ELEMENT message-resources (set-property*)>\r
+<!ATTLIST message-resources id          ID              #IMPLIED>\r
+<!ATTLIST message-resources className   %ClassName;     #IMPLIED>\r
+<!ATTLIST message-resources factory     %ClassName;     #IMPLIED>\r
+<!ATTLIST message-resources key         %AttributeName; #IMPLIED>\r
+<!ATTLIST message-resources null        %Boolean;       #IMPLIED>\r
+<!ATTLIST message-resources parameter   CDATA           #REQUIRED>\r
+\r
+\r
+<!-- The "plug-in" element specifies the fully qualified class name of a\r
+     general-purpose application plug-in module that receives notification of\r
+     application startup and shutdown events. An instance of the specified class\r
+     is created for each element, and can be configured with nested <set-property>\r
+     elements. The following attributes are supported:\r
+\r
+     className       Fully qualified Java class name of the plug-in class; must\r
+                     implement [org.apache.struts.action.PlugIn].\r
+-->\r
+<!ELEMENT plug-in           (set-property*)>\r
+<!ATTLIST plug-in           id          ID              #IMPLIED>\r
+<!ATTLIST plug-in           className   %ClassName;     #REQUIRED>\r
+\r
+\r
+<!-- ========== Subordinate Elements ====================================== -->\r
+\r
+\r
+<!-- The "description" element contains descriptive (paragraph length) text\r
+     about the surrounding element, suitable for use in GUI tools.\r
+-->\r
+<!ELEMENT description    (#PCDATA)>\r
+<!ATTLIST description    id             ID              #IMPLIED>\r
+\r
+\r
+<!-- The "display-name" element contains a short (one line) description of\r
+     the surrounding element, suitable for use in GUI tools.\r
+-->\r
+<!ELEMENT display-name (#PCDATA)>\r
+<!ATTLIST display-name   id             ID              #IMPLIED>\r
+\r
+\r
+<!-- The "icon" element contains a small-icon and large-icon element which\r
+     specify the location, relative to the Struts configuration file, for small\r
+     and large images used to represent the surrounding element in GUI tools.\r
+-->\r
+<!ELEMENT icon           (small-icon?, large-icon?)>\r
+<!ATTLIST icon           id             ID              #IMPLIED>\r
+\r
+\r
+<!-- The "large-icon" element specifies the location, relative to the Struts\r
+     configuration file, of a resource containing a large (32x32 pixel)\r
+     icon image.\r
+-->\r
+<!ELEMENT large-icon     (%Location;)>\r
+<!ATTLIST large-icon     id             ID              #IMPLIED>\r
+\r
+\r
+<!-- The "set-property" element specifies the method name and initial value of\r
+     an additional JavaBean configuration property. When the object representing\r
+     the surrounding element is instantiated, the accessor for the indicated\r
+     property is called and passed the indicated value. The "set-property"\r
+     element is especially useful when a custom subclass is used with\r
+     <data-source>, <forward>, <action>, or <plug-in> elements. The subclass\r
+     can be passed whatever other properties may be required to configure the\r
+     object without changing how the struts-config is parsed.\r
+\r
+     property        Name of the JavaBeans property whose setter method\r
+                     will be called.\r
+\r
+     value           String representation of the value to which this\r
+                     property will be set, after suitable type conversion\r
+-->\r
+<!ELEMENT set-property   EMPTY>\r
+<!ATTLIST set-property   id             ID              #IMPLIED>\r
+<!ATTLIST set-property   property       %PropName;      #REQUIRED>\r
+<!ATTLIST set-property   value          CDATA           #REQUIRED>\r
+\r
+\r
+<!-- The "small-icon" element specifies the location, relative to the Struts\r
+     configuration file, of a resource containing a small (16x16 pixel)\r
+     icon image.\r
+-->\r
+<!ELEMENT small-icon     (%Location;)>\r
+<!ATTLIST small-icon     id             ID              #IMPLIED>\r
+\r
diff --git a/lib/struts/struts.jar b/lib/struts/struts.jar
new file mode 100755 (executable)
index 0000000..db32f9f
Binary files /dev/null and b/lib/struts/struts.jar differ
diff --git a/lib/struts/tiles-config.dtd b/lib/struts/tiles-config.dtd
new file mode 100755 (executable)
index 0000000..09ea6ec
--- /dev/null
@@ -0,0 +1,61 @@
+<?xml version="1.0" encoding="ISO-8859-1"?>\r
+<!--\r
+     DTD for the Tile Definition File, Version 1.0\r
+\r
+     To support validation of your configuration file, include the following\r
+     DOCTYPE element at the beginning (after the "xml" declaration):\r
+\r
+     <!DOCTYPE tiles-definitions PUBLIC\r
+       "-//Apache Software Foundation//DTD Tiles Configuration//EN"\r
+       "http://jakarta.apache.org/struts/dtds/tiles-config.dtd">\r
+\r
+     $Id: tiles-config.dtd,v 1.1 2002/06/25 03:23:20 craigmcc Exp $\r
+-->\r
+<!ELEMENT component-definitions (definition+)>\r
+<!ELEMENT tiles-definitions (definition+)>\r
+<!ELEMENT definition (put*, putList*)>\r
+<!ATTLIST definition\r
+       name CDATA #REQUIRED\r
+       page CDATA #IMPLIED\r
+       path CDATA #IMPLIED\r
+       extends CDATA #IMPLIED\r
+       role CDATA #IMPLIED\r
+       template CDATA #IMPLIED\r
+       controllerClass CDATA #IMPLIED\r
+       controllerUrl CDATA #IMPLIED\r
+>\r
+<!ELEMENT put (#PCDATA)>\r
+<!ATTLIST put\r
+       name CDATA #REQUIRED\r
+       value CDATA #IMPLIED\r
+       type (string | page | template | definition) #IMPLIED\r
+       content CDATA #IMPLIED\r
+       direct (true | false) #IMPLIED\r
+>\r
+<!ELEMENT putList ( (add* | item* | bean* | putList*)+) >\r
+<!ATTLIST putList\r
+       name CDATA #REQUIRED\r
+>\r
+<!ELEMENT putListElements (add | item | bean)>\r
+\r
+<!ELEMENT add (#PCDATA)>\r
+<!ATTLIST add\r
+       value CDATA #IMPLIED\r
+       type (string | page | template | definition) #IMPLIED\r
+       content CDATA #IMPLIED\r
+       direct (true | false) #IMPLIED\r
+>\r
+\r
+<!ELEMENT bean (#PCDATA)>\r
+<!ATTLIST bean\r
+       classtype CDATA #REQUIRED\r
+>\r
+\r
+<!ELEMENT item (#PCDATA)>\r
+<!ATTLIST item\r
+       value CDATA #REQUIRED\r
+       link CDATA #REQUIRED\r
+       classtype CDATA #IMPLIED\r
+       icon CDATA #IMPLIED\r
+       tooltip CDATA #IMPLIED\r
+>\r
diff --git a/lib/struts/tiles-config_1_1.dtd b/lib/struts/tiles-config_1_1.dtd
new file mode 100755 (executable)
index 0000000..0c35701
--- /dev/null
@@ -0,0 +1,281 @@
+<!--\r
+     DTD for the Tile Definition File, Version 1.1\r
+\r
+     To support validation of your configuration file, include the following\r
+     DOCTYPE element at the beginning (after the "xml" declaration):\r
+\r
+     <!DOCTYPE tiles-definitions PUBLIC\r
+       "-//Apache Software Foundation//DTD Tiles Configuration 1.1//EN"\r
+       "http://jakarta.apache.org/struts/dtds/tiles-config_1_1.dtd">\r
+\r
+     $Id: tiles-config_1_1.dtd,v 1.6 2003/05/03 16:19:56 jholmes Exp $\r
+-->\r
+\r
+\r
+<!-- ========== Defined Types ============================================= -->\r
+\r
+\r
+<!-- A "Boolean" is the string representation of a boolean (true or false)\r
+     variable.\r
+-->\r
+<!ENTITY % Boolean "(true|false)">\r
+\r
+\r
+<!-- A "ContentType" is the content type of an attribute passed to a tile\r
+     component.\r
+-->\r
+<!ENTITY % ContentType "(string|page|template|definition)">\r
+\r
+<!-- A "ClassName" is the fully qualified name of a Java class that is\r
+     instantiated to provide the functionality of the enclosing element.\r
+-->\r
+<!ENTITY % ClassName "CDATA">\r
+\r
+<!-- A "RequestPath" is an application-relative URI path, beginning with a\r
+     slash, that identifies a mapped resource (such as a JSP page or a servlet)\r
+     within this web application.\r
+-->\r
+<!ENTITY % RequestPath "CDATA">\r
+\r
+<!-- A "DefinitionName" is the unique identifier of a definition. This identifier\r
+     is a logical name used to reference the definition.\r
+-->\r
+<!ENTITY % DefinitionName "CDATA">\r
+\r
+<!-- A "BeanName" is the identifier of a JavaBean, such as a form bean,\r
+     and also serves as the name of the corresponding scripting variable\r
+     and the name of the JSP attribute under which the bean is accessed.\r
+     Therefore, it must conform to the rules for a Java identifier.\r
+-->\r
+<!ENTITY % BeanName "CDATA">\r
+\r
+<!-- A "PropName" is the name of a JavaBeans property, and must begin with\r
+     a lower case letter and contain only characters that are legal in a\r
+     Java identifier.\r
+-->\r
+<!ENTITY % PropName "CDATA">\r
+\r
+<!-- A "Location" is a relative path, delimited by "/" characters, that\r
+     defines the location of a resource relative to the location of the\r
+     configuration file itself.\r
+-->\r
+<!ENTITY % Location "#PCDATA">\r
+\r
+\r
+\r
+<!-- ========== Top Level Elements ======================================== -->\r
+\r
+\r
+  <!-- deprecated: use tiles-definitions instead.-->\r
+<!ELEMENT component-definitions (definition+)>\r
+\r
+<!-- The "tiles-definitions" element is the root of the configuration file\r
+     hierarchy, and contains nested elements for all of the other\r
+     configuration settings.\r
+-->\r
+<!ELEMENT tiles-definitions (definition+)>\r
+\r
+<!-- The "definition" element describes a definition that can be inserted in a jsp\r
+     page. This definition is identified by its logical name. A definition allows\r
+     to define all the attributes that can be set in <insert> tag from a jsp page.\r
+\r
+     controllerClass The fully qualified Java class name of the controller\r
+                     subclass to call immediately before the tiles is inserted.\r
+                     Only one of controllerClass or controllerUrl should be\r
+                     specified.\r
+\r
+     controllerUrl   The context-relative path to the resource used as controller\r
+                     called immediately before the tiles is inserted.\r
+                     Only one of controllerClass or controllerUrl should be\r
+                     specified.\r
+\r
+     extends         Name of a definition that is used as ancestor of this definition.\r
+                     All attributes from the ancestor are available to the new\r
+                     definition. Any attribute inherited from the ancestor can\r
+                     be overloaded by providing a new value.\r
+\r
+     name            The unique identifier for this definition.\r
+\r
+     page            Same as path.\r
+\r
+     path            The context-relative path to the resource used as tiles to\r
+                     insert. This tiles will be inserted and a tiles context\r
+                     containing appropriate attributes will be available.\r
+\r
+     role            Security role name that is allowed access to this definition\r
+                     object. The definition is inserted only if the role name is\r
+                     allowed.\r
+\r
+     template        Same as path. For compatibility with the template tag library.\r
+-->\r
+<!ELEMENT definition (icon?, display-name?, description?, put*, putList*)>\r
+<!ATTLIST definition       id               ID               #IMPLIED>\r
+<!ATTLIST definition       controllerClass  %ClassName;      #IMPLIED>\r
+<!ATTLIST definition       controllerUrl    %RequestPath;    #IMPLIED>\r
+<!ATTLIST definition       extends          %DefinitionName; #IMPLIED>\r
+<!ATTLIST definition       name             %DefinitionName; #REQUIRED>\r
+<!ATTLIST definition       page             %RequestPath;    #IMPLIED>\r
+<!ATTLIST definition       path             %RequestPath;    #IMPLIED>\r
+<!ATTLIST definition       role             CDATA            #IMPLIED>\r
+<!ATTLIST definition       template         %RequestPath;    #IMPLIED>\r
+\r
+\r
+<!-- The "put" element describes an attribute of a definition. It allows to\r
+     specify the tiles attribute name and its value. The tiles value can be\r
+     specified as an xml attribute, or in the body of the <put> tag.\r
+\r
+     content         Same as value. For compatibility with the template tag library.\r
+\r
+     direct          Same as type="string". For compatibility with the template\r
+                     tag library.\r
+\r
+     name            The unique identifier for this put.\r
+\r
+     type            The type of the value. Can be: string, page, template or definition.\r
+                     By default, no type is associated to a value. If a type is\r
+                     associated, it will be used as a hint to process the value\r
+                     when the attribute will be used in the inserted tiles.\r
+\r
+     value           The value associated to this tiles attribute. The value should\r
+                     be specified with this tag attribute, or in the body of the tag.\r
+-->\r
+<!ELEMENT put (#PCDATA)>\r
+<!ATTLIST put              id               ID              #IMPLIED>\r
+<!ATTLIST put              content          CDATA           #IMPLIED>\r
+<!ATTLIST put              direct           %Boolean;       #IMPLIED>\r
+<!ATTLIST put              name             CDATA           #REQUIRED>\r
+<!ATTLIST put              type             %ContentType;   #IMPLIED>\r
+<!ATTLIST put              value            CDATA           #IMPLIED>\r
+\r
+\r
+<!-- The "putList" element describes a list attribute of a definition. It allows to\r
+     specify an attribute that is a java List containing any kind of values. In\r
+     the config file, the list elements are specified by nested <add>, <item> or\r
+     <putList>.\r
+\r
+     name            The unique identifier for this put list.\r
+-->\r
+<!ELEMENT putList ( (add* | item* | bean* | putList*)+) >\r
+<!ATTLIST putList          id               ID              #IMPLIED>\r
+<!ATTLIST putList          name             CDATA           #REQUIRED>\r
+\r
+<!-- ========== Subordinate Elements ====================================== -->\r
+\r
+<!-- The "add" element describes an element of a list. It is similar to the\r
+     <put> element.\r
+\r
+     content         Same as value. For compatibility with the template tag library.\r
+\r
+     direct          Same as type="string". For compatibility with the template\r
+                     tag library.\r
+\r
+     type            The type of the value. Can be: string, page, template or definition.\r
+                     By default, no type is associated to a value. If a type is\r
+                     associated, it will be used as a hint to process the value\r
+                     when the attribute will be used in the inserted tiles.\r
+\r
+     value           The value associated to this tiles attribute. The value should\r
+                     be specified with this tag attribute, or in the body of the tag.\r
+-->\r
+<!ELEMENT add (#PCDATA)>\r
+<!ATTLIST add              id               ID              #IMPLIED>\r
+<!ATTLIST add              content          CDATA           #IMPLIED>\r
+<!ATTLIST add              direct           %Boolean;       #IMPLIED>\r
+<!ATTLIST add              type             %ContentType;   #IMPLIED>\r
+<!ATTLIST add              value            CDATA           #IMPLIED>\r
+\r
+\r
+<!-- The "bean" element describes an element of a list. It create a bean of the\r
+     specified java classtype. This bean is initialized with appropriate nested\r
+     <set-property>.\r
+\r
+     classtype       The fully qualified classname for this bean.\r
+-->\r
+<!ELEMENT bean (set-property*)>\r
+<!ATTLIST bean             id               ID              #IMPLIED>\r
+<!ATTLIST bean             classtype        %ClassName;     #REQUIRED>\r
+\r
+<!-- The "set-property" element specifies the method name and initial value of\r
+     a bean property. When the object representing\r
+     the surrounding element is instantiated, the accessor for the indicated\r
+     property is called and passed the indicated value.\r
+\r
+     property        Name of the JavaBeans property whose setter method\r
+                     will be called.\r
+\r
+     value           String representation of the value to which this\r
+                     property will be set, after suitable type conversion\r
+-->\r
+<!ELEMENT set-property   EMPTY>\r
+<!ATTLIST set-property   id             ID              #IMPLIED>\r
+<!ATTLIST set-property   property       %PropName;      #REQUIRED>\r
+<!ATTLIST set-property   value          CDATA           #REQUIRED>\r
+\r
+\r
+<!-- The "item" element describes an element of a list. It create a bean added as\r
+     element to the list. Each bean can contain different properties: value, link,\r
+     icon, tooltip. These properties are to be interpreted by the jsp page using\r
+     them.\r
+     By default the bean is of type\r
+     "org.apache.struts.tiles.beans.SimpleMenuItem". This bean is useful to\r
+     create a list of beans used as menu items.\r
+\r
+     classtype       The fully qualified classtype for this bean.\r
+                     If specified, the classtype must be a subclass of the interface\r
+                     "org.apache.struts.tiles.beans.MenuItem".\r
+\r
+     icon            The bean 'icon' property.\r
+\r
+     link            The bean 'link' property.\r
+\r
+     tooltip         The bean 'tooltip' property.\r
+\r
+     value           The bean 'value' property.\r
+-->\r
+<!ELEMENT item (#PCDATA)>\r
+<!ATTLIST item             id               ID              #IMPLIED>\r
+<!ATTLIST item             classtype        %ClassName;     #IMPLIED>\r
+<!ATTLIST item             icon             CDATA           #IMPLIED>\r
+<!ATTLIST item             link             CDATA           #REQUIRED>\r
+<!ATTLIST item             tooltip          CDATA           #IMPLIED>\r
+<!ATTLIST item             value            CDATA           #REQUIRED>\r
+\r
+\r
+<!-- ========== Info Elements ====================================== -->\r
+\r
+<!-- The "description" element contains descriptive (paragraph length) text\r
+     about the surrounding element, suitable for use in GUI tools.\r
+-->\r
+<!ELEMENT description    (#PCDATA)>\r
+<!ATTLIST description    id             ID              #IMPLIED>\r
+\r
+\r
+<!-- The "display-name" element contains a short (one line) description of\r
+     the surrounding element, suitable for use in GUI tools.\r
+-->\r
+<!ELEMENT display-name (#PCDATA)>\r
+<!ATTLIST display-name   id             ID              #IMPLIED>\r
+\r
+\r
+<!-- The "icon" element contains a small-icon and large-icon element which\r
+     specify the location, relative to the Struts configuration file, for small\r
+     and large images used to represent the surrounding element in GUI tools.\r
+-->\r
+<!ELEMENT icon           (small-icon?, large-icon?)>\r
+<!ATTLIST icon           id             ID              #IMPLIED>\r
+\r
+\r
+<!-- The "large-icon" element specifies the location, relative to the Struts\r
+     configuration file, of a resource containing a large (32x32 pixel)\r
+     icon image.\r
+-->\r
+<!ELEMENT large-icon     (%Location;)>\r
+<!ATTLIST large-icon     id             ID              #IMPLIED>\r
+\r
+\r
+<!-- The "small-icon" element specifies the location, relative to the Struts\r
+     configuration file, of a resource containing a small (16x16 pixel)\r
+     icon image.\r
+-->\r
+<!ELEMENT small-icon     (%Location;)>\r
+<!ATTLIST small-icon     id             ID              #IMPLIED>\r
diff --git a/lib/struts/validation_1_1.dtd b/lib/struts/validation_1_1.dtd
new file mode 100755 (executable)
index 0000000..0d448ff
--- /dev/null
@@ -0,0 +1,251 @@
+<!--\r
+    DEPRECATED ** DEPRECATED ** DEPRECATED ** DEPRECATED ** DEPRECATED\r
+    DEPRECATED ** DEPRECATED ** DEPRECATED ** DEPRECATED ** DEPRECATED\r
+    \r
+     Refer to the below DTD Instead:\r
+    \r
+    <!DOCTYPE form-validation PUBLIC\r
+          "-//Apache Software Foundation//DTD Commons Validator Rules Configuration 1.0//EN"\r
+          "http://jakarta.apache.org/commons/dtds/validator_1_0.dtd">\r
+\r
+\r
+    $Id: validation_1_1.dtd,v 1.5 2002/11/14 20:33:13 rleland Exp $\r
+-->\r
+\r
+\r
+<!--\r
+    DEPRECATED ** DEPRECATED ** DEPRECATED ** DEPRECATED ** DEPRECATED\r
+    DEPRECATED ** DEPRECATED ** DEPRECATED ** DEPRECATED ** DEPRECATED \r
+    The "form-validation" element is the root of the configuration file\r
+     hierarchy, and contains nested elements for all of the other\r
+     configuration settings.\r
+-->\r
+<!ELEMENT form-validation (global*, formset+)>\r
+\r
+\r
+<!--\r
+    DEPRECATED ** DEPRECATED ** DEPRECATED ** DEPRECATED ** DEPRECATED\r
+    DEPRECATED ** DEPRECATED ** DEPRECATED ** DEPRECATED ** DEPRECATED \r
+    Global "constants" may be defined for use of other elements.\r
+-->\r
+<!ELEMENT global (constant*)>\r
+\r
+\r
+<!--\r
+    DEPRECATED ** DEPRECATED ** DEPRECATED ** DEPRECATED ** DEPRECATED\r
+    DEPRECATED ** DEPRECATED ** DEPRECATED ** DEPRECATED ** DEPRECATED \r
+     The "constant" element defines a static value that can be used as\r
+     replacement parameters within "field" elements. The "constant-name" and\r
+     "constant-value" elements define the constant's reference id and\r
+     replacement value.\r
+-->\r
+<!ELEMENT constant (constant-name, constant-value)>\r
+<!ELEMENT constant-name  (#PCDATA)>\r
+<!ELEMENT constant-value (#PCDATA)>\r
+\r
+\r
+<!--\r
+    DEPRECATED ** DEPRECATED ** DEPRECATED ** DEPRECATED ** DEPRECATED\r
+    DEPRECATED ** DEPRECATED ** DEPRECATED ** DEPRECATED ** DEPRECATED \r
+      The "formset" element defines a set of forms for a locale. Formsets for\r
+      specific locales can override only those fields that change. The\r
+      localization is properly scoped, so that a formset can override just the\r
+      language, or just the country, or both.\r
+-->\r
+<!ELEMENT formset (constant*, form+)>\r
+<!ATTLIST formset language     CDATA #IMPLIED\r
+                  country      CDATA #IMPLIED >\r
+\r
+\r
+<!--\r
+    DEPRECATED ** DEPRECATED ** DEPRECATED ** DEPRECATED ** DEPRECATED\r
+    DEPRECATED ** DEPRECATED ** DEPRECATED ** DEPRECATED ** DEPRECATED \r
+     The "form" element defines a set of fields to be validated. The name\r
+     corresponds to the identifer the application assigns to the form. In the\r
+     case of the Struts framework, this is the attribute property from\r
+     the ActionMapping. Struts also offers the alternative of using the\r
+     the path property as the Validator form name.\r
+-->\r
+<!ELEMENT form    (field+ )>\r
+<!ATTLIST form    name CDATA #REQUIRED>\r
+\r
+\r
+<!--\r
+    DEPRECATED ** DEPRECATED ** DEPRECATED ** DEPRECATED ** DEPRECATED\r
+    DEPRECATED ** DEPRECATED ** DEPRECATED ** DEPRECATED ** DEPRECATED \r
+     The "field" element defines the properties to be validated. In a\r
+     web application, a field would also correspond to a control on\r
+     a HTML form. To validate the properties, the validator works through\r
+     a JavaBean representation, like a Struts ActionForm. The field element\r
+     can accept up to 4 attributes:\r
+\r
+     property        The property on the JavaBean corresponding to this\r
+                     field element.\r
+\r
+     depends         The comma-delimited list of validators to apply against\r
+                     this field. For the field to succeed, all the\r
+                     validators must succeed.\r
+\r
+     page            The JavaBean corresponding to this form may include\r
+                     a page property. Only fields with a "page" attribute\r
+                     value that is equal to or less than the page property\r
+                     on the form JavaBean are processed. This is useful when\r
+                     using a "wizard" approach to completing a large form,\r
+                     to ensure that a page is not skipped.\r
+                     [0]\r
+\r
+     indexedListProperty\r
+                     The "indexedListProperty" is the method name that will\r
+                     return an array or a Collection used to retrieve the\r
+                     list and then loop through the list performing the\r
+                     validations for this field.\r
+\r
+     fieldOrder      [:FIXME: is this still supported?]\r
+-->\r
+<!ELEMENT field   (msg?, arg0?, arg1?, arg2?, arg3?, var* )>\r
+<!ATTLIST field   property CDATA #REQUIRED\r
+                  depends  CDATA #IMPLIED\r
+                  page     CDATA #IMPLIED\r
+                  indexedListProperty CDATA #IMPLIED >\r
+\r
+\r
+<!--\r
+    DEPRECATED ** DEPRECATED ** DEPRECATED ** DEPRECATED ** DEPRECATED\r
+    DEPRECATED ** DEPRECATED ** DEPRECATED ** DEPRECATED ** DEPRECATED \r
+     The "msg" element defines a custom message key to use when one of the\r
+     validators for this field fails. Each validator has a default message\r
+     property that is used when a corresonding field msg is not specified.\r
+     Each validator applied to a field may have its own msg element.\r
+     The msg element accepts up to three attributes.\r
+\r
+      name        The name of the validator corresponding to this msg.\r
+\r
+      key         The key that will return the message template from a\r
+                  resource bundle.\r
+\r
+      resource    If set to "false", the key is taken to be a literal\r
+                  value rather than a bundle key.\r
+                  [true]\r
+-->\r
+<!ELEMENT msg     EMPTY>\r
+<!ATTLIST msg     name     CDATA #IMPLIED\r
+                  key      CDATA #IMPLIED\r
+                  resource CDATA #IMPLIED >\r
+\r
+\r
+<!--\r
+    DEPRECATED ** DEPRECATED ** DEPRECATED ** DEPRECATED ** DEPRECATED\r
+    DEPRECATED ** DEPRECATED ** DEPRECATED ** DEPRECATED ** DEPRECATED \r
+     The "arg0" element defines the first replacement value to use with the\r
+     message template for this validator or this field.\r
+     The arg0 element accepts up to three attributes.\r
+\r
+      name        The name of the validator corresponding to this msg.\r
+\r
+      key         The key that will return the message template from a\r
+                  resource bundle.\r
+\r
+      resource    If set to "false", the key is taken to be a literal\r
+                  value rather than a bundle key.\r
+                  [true]\r
+-->\r
+<!ELEMENT arg0    EMPTY>\r
+<!ATTLIST arg0    name     CDATA #IMPLIED\r
+                  key      CDATA #IMPLIED\r
+                  resource CDATA #IMPLIED >\r
+\r
+\r
+<!--\r
+    DEPRECATED ** DEPRECATED ** DEPRECATED ** DEPRECATED ** DEPRECATED\r
+    DEPRECATED ** DEPRECATED ** DEPRECATED ** DEPRECATED ** DEPRECATED \r
+     The "arg1" element defines the second replacement value to use with the\r
+     message template for this validator or this field.\r
+     The arg1 element accepts up to three attributes.\r
+\r
+      name        The name of the validator corresponding to this msg.\r
+\r
+      key         The key that will return the message template from a\r
+                  resource bundle.\r
+\r
+      resource    If set to "false", the key is taken to be a literal\r
+                  value rather than a bundle key.\r
+                  [true]\r
+-->\r
+<!ELEMENT arg1    EMPTY>\r
+<!ATTLIST arg1    name     CDATA #IMPLIED\r
+                  key      CDATA #IMPLIED\r
+                  resource CDATA #IMPLIED >\r
+\r
+\r
+<!--\r
+    DEPRECATED ** DEPRECATED ** DEPRECATED ** DEPRECATED ** DEPRECATED\r
+    DEPRECATED ** DEPRECATED ** DEPRECATED ** DEPRECATED ** DEPRECATED \r
+     The "arg2" element defines the third replacement value to use with the\r
+     message template for this validator or this field.\r
+     The arg2 element accepts up to three attributes.\r
+\r
+      name        The name of the validator corresponding to this msg.\r
+\r
+      key         The key that will return the message template from a\r
+                  resource bundle.\r
+\r
+      resource    If set to "false", the key is taken to be a literal\r
+                  value rather than a bundle key.\r
+                  [true]\r
+-->\r
+<!ELEMENT arg2    EMPTY>\r
+<!ATTLIST arg2    name     CDATA #IMPLIED\r
+                  key      CDATA #IMPLIED\r
+                  resource CDATA #IMPLIED >\r
+\r
+<!--\r
+    DEPRECATED ** DEPRECATED ** DEPRECATED ** DEPRECATED ** DEPRECATED\r
+    DEPRECATED ** DEPRECATED ** DEPRECATED ** DEPRECATED ** DEPRECATED \r
+     The "arg3" element defines the fourth replacement value to use with the\r
+     message template for this validator or this field.\r
+     The arg0 element accepts up to three attributes.\r
+\r
+      name        The name of the validator corresponding to this msg.\r
+\r
+      key         The key that will return the message template from a\r
+                  resource bundle.\r
+\r
+      resource    If set to "false", the key is taken to be a literal\r
+                  value rather than a bundle key.\r
+                  [true]\r
+-->\r
+<!ELEMENT arg3    EMPTY>\r
+<!ATTLIST arg3    name     CDATA #IMPLIED\r
+                  key      CDATA #IMPLIED\r
+                  resource CDATA #IMPLIED >\r
+\r
+\r
+<!--\r
+    DEPRECATED ** DEPRECATED ** DEPRECATED ** DEPRECATED ** DEPRECATED\r
+    DEPRECATED ** DEPRECATED ** DEPRECATED ** DEPRECATED ** DEPRECATED \r
+     The "var" element can set parameters that a field may need to pass to\r
+     one of its validators, such as the minimum and maximum values in a\r
+     range validation. These parameters may also be referenced by one of the\r
+     arg? elements using a shell syntax: ${var:var-name}.\r
+-->\r
+<!ELEMENT var (var-name, var-value)>\r
+\r
+\r
+\r
+<!--\r
+    DEPRECATED ** DEPRECATED ** DEPRECATED ** DEPRECATED ** DEPRECATED\r
+    DEPRECATED ** DEPRECATED ** DEPRECATED ** DEPRECATED ** DEPRECATED \r
+     The name of the var parameter to provide to a field's validators.\r
+-->\r
+<!ELEMENT var-name  (#PCDATA)>\r
+\r
+\r
+\r
+<!--\r
+    DEPRECATED ** DEPRECATED ** DEPRECATED ** DEPRECATED ** DEPRECATED\r
+    DEPRECATED ** DEPRECATED ** DEPRECATED ** DEPRECATED ** DEPRECATED \r
+     The value of the var parameter to provide to a field's validators.\r
+-->\r
+<!ELEMENT var-value (#PCDATA)>\r
+\r
+<!-- eof -->
\ No newline at end of file
diff --git a/lib/struts/validator-rules.xml b/lib/struts/validator-rules.xml
new file mode 100755 (executable)
index 0000000..4bc3ab7
--- /dev/null
@@ -0,0 +1,1044 @@
+<!DOCTYPE form-validation PUBLIC\r
+          "-//Apache Software Foundation//DTD Commons Validator Rules Configuration 1.0//EN"\r
+          "http://jakarta.apache.org/commons/dtds/validator_1_0.dtd">\r
+<!--\r
+\r
+   This file contains the default Struts Validator pluggable validator\r
+   definitions.  It should be placed somewhere under /WEB-INF and\r
+   referenced in the struts-config.xml under the plug-in element\r
+   for the ValidatorPlugIn.\r
+\r
+      <plug-in className="org.apache.struts.validator.ValidatorPlugIn">\r
+        <set-property property="pathnames" value="/WEB-INF/validator-rules.xml,\r
+                                                  /WEB-INF/validation.xml"/>\r
+      </plug-in>\r
+\r
+   These are the default error messages associated with\r
+   each validator defined in this file.  They should be\r
+   added to your projects ApplicationResources.properties\r
+   file or you can associate new ones by modifying the\r
+   pluggable validators msg attributes in this file.\r
+\r
+   # Struts Validator Error Messages\r
+   errors.required={0} is required.\r
+   errors.minlength={0} can not be less than {1} characters.\r
+   errors.maxlength={0} can not be greater than {1} characters.\r
+   errors.invalid={0} is invalid.\r
+\r
+   errors.byte={0} must be a byte.\r
+   errors.short={0} must be a short.\r
+   errors.integer={0} must be an integer.\r
+   errors.long={0} must be a long.\r
+   errors.float={0} must be a float.\r
+   errors.double={0} must be a double.\r
+\r
+   errors.date={0} is not a date.\r
+   errors.range={0} is not in the range {1} through {2}.\r
+   errors.creditcard={0} is an invalid credit card number.\r
+   errors.email={0} is an invalid e-mail address.\r
+\r
+-->\r
+\r
+<form-validation>\r
+\r
+   <global>\r
+\r
+      <validator name="required"\r
+            classname="org.apache.struts.validator.FieldChecks"\r
+               method="validateRequired"\r
+         methodParams="java.lang.Object,\r
+                       org.apache.commons.validator.ValidatorAction,\r
+                       org.apache.commons.validator.Field,\r
+                       org.apache.struts.action.ActionErrors,\r
+                       javax.servlet.http.HttpServletRequest"\r
+                  msg="errors.required">\r
+\r
+         <javascript><![CDATA[\r
+            function validateRequired(form) {\r
+                var isValid = true;\r
+                var focusField = null;\r
+                var i = 0;\r
+                var fields = new Array();\r
+                oRequired = new required();\r
+                for (x in oRequired) {\r
+                       var field = form[oRequired[x][0]];\r
+                       \r
+                    if (field.type == 'text' ||\r
+                        field.type == 'textarea' ||\r
+                        field.type == 'file' ||\r
+                        field.type == 'select-one' ||\r
+                        field.type == 'radio' ||\r
+                        field.type == 'password') {\r
+                        \r
+                        var value = '';\r
+                                               // get field's value\r
+                                               if (field.type == "select-one") {\r
+                                                       var si = field.selectedIndex;\r
+                                                       if (si >= 0) {\r
+                                                               value = field.options[si].value;\r
+                                                       }\r
+                                               } else {\r
+                                                       value = field.value;\r
+                                               }\r
+                        \r
+                        if (trim(value).length == 0) {\r
+                        \r
+                               if (i == 0) {\r
+                                   focusField = field;\r
+                               }\r
+                               fields[i++] = oRequired[x][1];\r
+                               isValid = false;\r
+                        }\r
+                    }\r
+                }\r
+                if (fields.length > 0) {\r
+                   focusField.focus();\r
+                   alert(fields.join('\n'));\r
+                }\r
+                return isValid;\r
+            }\r
+            \r
+            // Trim whitespace from left and right sides of s.\r
+            function trim(s) {\r
+                return s.replace( /^\s*/, "" ).replace( /\s*$/, "" );\r
+            }\r
+            \r
+            ]]>\r
+         </javascript>\r
+\r
+      </validator>\r
+\r
+      <validator name="requiredif"\r
+                 classname="org.apache.struts.validator.FieldChecks"\r
+                 method="validateRequiredIf"\r
+                 methodParams="java.lang.Object,\r
+                               org.apache.commons.validator.ValidatorAction,\r
+                               org.apache.commons.validator.Field,\r
+                               org.apache.struts.action.ActionErrors,\r
+                               org.apache.commons.validator.Validator,\r
+                               javax.servlet.http.HttpServletRequest"\r
+                 msg="errors.required">\r
+      </validator>\r
+\r
+      <validator name="minlength"\r
+            classname="org.apache.struts.validator.FieldChecks"\r
+               method="validateMinLength"\r
+         methodParams="java.lang.Object,\r
+                       org.apache.commons.validator.ValidatorAction,\r
+                       org.apache.commons.validator.Field,\r
+                       org.apache.struts.action.ActionErrors,\r
+                       javax.servlet.http.HttpServletRequest"\r
+              depends=""\r
+                  msg="errors.minlength">\r
+\r
+         <javascript><![CDATA[\r
+            function validateMinLength(form) {\r
+                var isValid = true;\r
+                var focusField = null;\r
+                var i = 0;\r
+                var fields = new Array();\r
+                oMinLength = new minlength();\r
+                for (x in oMinLength) {\r
+                    var field = form[oMinLength[x][0]];\r
+                    \r
+                    if (field.type == 'text' ||\r
+                        field.type == 'textarea') {\r
+                        \r
+                        var iMin = parseInt(oMinLength[x][2]("minlength"));\r
+                        if ((trim(field.value).length > 0) && (field.value.length < iMin)) {\r
+                            if (i == 0) {\r
+                                focusField = field;\r
+                            }\r
+                            fields[i++] = oMinLength[x][1];\r
+                            isValid = false;\r
+                        }\r
+                    }\r
+                }\r
+                if (fields.length > 0) {\r
+                   focusField.focus();\r
+                   alert(fields.join('\n'));\r
+                }\r
+                return isValid;\r
+            }]]>\r
+         </javascript>\r
+\r
+      </validator>\r
+\r
+\r
+      <validator name="maxlength"\r
+            classname="org.apache.struts.validator.FieldChecks"\r
+               method="validateMaxLength"\r
+         methodParams="java.lang.Object,\r
+                       org.apache.commons.validator.ValidatorAction,\r
+                       org.apache.commons.validator.Field,\r
+                       org.apache.struts.action.ActionErrors,\r
+                       javax.servlet.http.HttpServletRequest"\r
+              depends=""\r
+                  msg="errors.maxlength">\r
+\r
+         <javascript><![CDATA[\r
+            function validateMaxLength(form) {\r
+                var isValid = true;\r
+                var focusField = null;\r
+                var i = 0;\r
+                var fields = new Array();\r
+                oMaxLength = new maxlength();\r
+                for (x in oMaxLength) {\r
+                    var field = form[oMaxLength[x][0]];\r
+                    \r
+                    if (field.type == 'text' ||\r
+                        field.type == 'textarea') {\r
+                        \r
+                        var iMax = parseInt(oMaxLength[x][2]("maxlength"));\r
+                        if (field.value.length > iMax) {\r
+                            if (i == 0) {\r
+                                focusField = field;\r
+                            }\r
+                            fields[i++] = oMaxLength[x][1];\r
+                            isValid = false;\r
+                        }\r
+                    }\r
+                }\r
+                if (fields.length > 0) {\r
+                   focusField.focus();\r
+                   alert(fields.join('\n'));\r
+                }\r
+                return isValid;\r
+            }]]>\r
+         </javascript>\r
+\r
+      </validator>\r
+\r
+\r
+      <validator name="mask"\r
+            classname="org.apache.struts.validator.FieldChecks"\r
+               method="validateMask"\r
+         methodParams="java.lang.Object,\r
+                       org.apache.commons.validator.ValidatorAction,\r
+                       org.apache.commons.validator.Field,\r
+                       org.apache.struts.action.ActionErrors,\r
+                       javax.servlet.http.HttpServletRequest"\r
+              depends=""\r
+                  msg="errors.invalid">\r
+\r
+         <javascript><![CDATA[\r
+            function validateMask(form) {\r
+                var isValid = true;\r
+                var focusField = null;\r
+                var i = 0;\r
+                var fields = new Array();\r
+                oMasked = new mask();\r
+                for (x in oMasked) {\r
+                    var field = form[oMasked[x][0]];\r
+                    \r
+                    if ((field.type == 'text' || \r
+                         field.type == 'textarea') && \r
+                         (field.value.length > 0)) {\r
+                        \r
+                        if (!matchPattern(field.value, oMasked[x][2]("mask"))) {\r
+                            if (i == 0) {\r
+                                focusField = field;\r
+                            }\r
+                            fields[i++] = oMasked[x][1];\r
+                            isValid = false;\r
+                        }\r
+                    }\r
+                }\r
+                \r
+                if (fields.length > 0) {\r
+                   focusField.focus();\r
+                   alert(fields.join('\n'));\r
+                }\r
+                return isValid;\r
+            }\r
+\r
+            function matchPattern(value, mask) {\r
+               return mask.exec(value);\r
+            }]]>\r
+         </javascript>\r
+\r
+      </validator>\r
+\r
+\r
+      <validator name="byte"\r
+            classname="org.apache.struts.validator.FieldChecks"\r
+               method="validateByte"\r
+         methodParams="java.lang.Object,\r
+                       org.apache.commons.validator.ValidatorAction,\r
+                       org.apache.commons.validator.Field,\r
+                       org.apache.struts.action.ActionErrors,\r
+                       javax.servlet.http.HttpServletRequest"\r
+              depends=""\r
+                  msg="errors.byte"\r
+       jsFunctionName="ByteValidations">\r
+\r
+         <javascript><![CDATA[\r
+            function validateByte(form) {\r
+                var bValid = true;\r
+                var focusField = null;\r
+                var i = 0;\r
+                var fields = new Array();\r
+                oByte = new ByteValidations();\r
+                for (x in oByte) {\r
+                       var field = form[oByte[x][0]];\r
+                       \r
+                    if (field.type == 'text' ||\r
+                        field.type == 'textarea' ||\r
+                        field.type == 'select-one' ||\r
+                                               field.type == 'radio') {\r
+\r
+                                               var value = '';\r
+                                               // get field's value\r
+                                               if (field.type == "select-one") {\r
+                                                       var si = field.selectedIndex;\r
+                                                       if (si >= 0) {\r
+                                                               value = field.options[si].value;\r
+                                                       }\r
+                                               } else {\r
+                                                       value = field.value;\r
+                                               }\r
+                        \r
+                        if (value.length > 0) {\r
+                            if (!isAllDigits(value)) {\r
+                                bValid = false;\r
+                                if (i == 0) {\r
+                                    focusField = field;\r
+                                }\r
+                                fields[i++] = oByte[x][1];\r
+\r
+                            } else {\r
+\r
+                                   var iValue = parseInt(value);\r
+                                   if (isNaN(iValue) || !(iValue >= -128 && iValue <= 127)) {\r
+                                       if (i == 0) {\r
+                                           focusField = field;\r
+                                       }\r
+                                       fields[i++] = oByte[x][1];\r
+                                       bValid = false;\r
+                                   }\r
+                            }\r
+                                               }\r
+                                               \r
+                    }\r
+                }\r
+                if (fields.length > 0) {\r
+                   focusField.focus();\r
+                   alert(fields.join('\n'));\r
+                }\r
+                return bValid;\r
+            }]]>\r
+         </javascript>\r
+\r
+      </validator>\r
+\r
+\r
+      <validator name="short"\r
+            classname="org.apache.struts.validator.FieldChecks"\r
+               method="validateShort"\r
+         methodParams="java.lang.Object,\r
+                       org.apache.commons.validator.ValidatorAction,\r
+                       org.apache.commons.validator.Field,\r
+                       org.apache.struts.action.ActionErrors,\r
+                       javax.servlet.http.HttpServletRequest"\r
+              depends=""\r
+                  msg="errors.short"\r
+       jsFunctionName="ShortValidations">\r
+\r
+         <javascript><![CDATA[\r
+            function validateShort(form) {\r
+                var bValid = true;\r
+                var focusField = null;\r
+                var i = 0;\r
+                var fields = new Array();\r
+                oShort = new ShortValidations();\r
+                for (x in oShort) {\r
+                       var field = form[oShort[x][0]];\r
+                       \r
+                    if (field.type == 'text' ||\r
+                        field.type == 'textarea' ||\r
+                        field.type == 'select-one' ||\r
+                        field.type == 'radio') {\r
+                        \r
+                        var value = '';\r
+                                               // get field's value\r
+                                               if (field.type == "select-one") {\r
+                                                       var si = field.selectedIndex;\r
+                                                       if (si >= 0) {\r
+                                                               value = field.options[si].value;\r
+                                                       }\r
+                                               } else {\r
+                                                       value = field.value;\r
+                                               }\r
+                        \r
+                        if (value.length > 0) {\r
+                            if (!isAllDigits(value)) {\r
+                                bValid = false;\r
+                                if (i == 0) {\r
+                                    focusField = field;\r
+                                }\r
+                                fields[i++] = oShort[x][1];\r
+\r
+                            } else {\r
+                        \r
+                                   var iValue = parseInt(value);\r
+                                   if (isNaN(iValue) || !(iValue >= -32768 && iValue <= 32767)) {\r
+                                       if (i == 0) {\r
+                                           focusField = field;\r
+                                       }\r
+                                       fields[i++] = oShort[x][1];\r
+                                       bValid = false;\r
+                                   }\r
+                              }\r
+                       }\r
+                    }\r
+                }\r
+                if (fields.length > 0) {\r
+                   focusField.focus();\r
+                   alert(fields.join('\n'));\r
+                }\r
+                return bValid;\r
+            }]]>\r
+         </javascript>\r
+\r
+      </validator>\r
+\r
+\r
+      <validator name="integer"\r
+            classname="org.apache.struts.validator.FieldChecks"\r
+               method="validateInteger"\r
+         methodParams="java.lang.Object,\r
+                       org.apache.commons.validator.ValidatorAction,\r
+                       org.apache.commons.validator.Field,\r
+                       org.apache.struts.action.ActionErrors,\r
+                       javax.servlet.http.HttpServletRequest"\r
+              depends=""\r
+                  msg="errors.integer"\r
+       jsFunctionName="IntegerValidations">\r
+\r
+         <javascript><![CDATA[\r
+            function validateInteger(form) {\r
+                var bValid = true;\r
+                var focusField = null;\r
+                var i = 0;\r
+                var fields = new Array();\r
+                oInteger = new IntegerValidations();\r
+                for (x in oInteger) {\r
+                       var field = form[oInteger[x][0]];\r
+\r
+                    if (field.type == 'text' ||\r
+                        field.type == 'textarea' ||\r
+                        field.type == 'select-one' ||\r
+                        field.type == 'radio') {\r
+                        \r
+                        var value = '';\r
+                                               // get field's value\r
+                                               if (field.type == "select-one") {\r
+                                                       var si = field.selectedIndex;\r
+                                                   if (si >= 0) {\r
+                                                           value = field.options[si].value;\r
+                                                   }\r
+                                               } else {\r
+                                                       value = field.value;\r
+                                               }\r
+                        \r
+                        if (value.length > 0) {\r
+                        \r
+                            if (!isAllDigits(value)) {\r
+                                bValid = false;\r
+                                if (i == 0) {\r
+                                       focusField = field;\r
+                                   }\r
+                                                       fields[i++] = oInteger[x][1];\r
+                                                       \r
+                            } else {\r
+                                   var iValue = parseInt(value);\r
+                                   if (isNaN(iValue) || !(iValue >= -2147483648 && iValue <= 2147483647)) {\r
+                                       if (i == 0) {\r
+                                           focusField = field;\r
+                                       }\r
+                                       fields[i++] = oInteger[x][1];\r
+                                       bValid = false;\r
+                                  }\r
+                           }\r
+                       }\r
+                    }\r
+                }\r
+                if (fields.length > 0) {\r
+                   focusField.focus();\r
+                   alert(fields.join('\n'));\r
+                }\r
+                return bValid;\r
+            }\r
+\r
+            function isAllDigits(argvalue) {\r
+                argvalue = argvalue.toString();\r
+                var validChars = "0123456789";\r
+                var startFrom = 0;\r
+                if (argvalue.substring(0, 2) == "0x") {\r
+                   validChars = "0123456789abcdefABCDEF";\r
+                   startFrom = 2;\r
+                } else if (argvalue.charAt(0) == "0") {\r
+                   validChars = "01234567";\r
+                   startFrom = 1;\r
+                } else if (argvalue.charAt(0) == "-") {\r
+                    startFrom = 1;\r
+                }\r
+                \r
+                for (var n = startFrom; n < argvalue.length; n++) {\r
+                    if (validChars.indexOf(argvalue.substring(n, n+1)) == -1) return false;\r
+                }\r
+                return true;\r
+            }]]>\r
+         </javascript>\r
+\r
+      </validator>\r
+\r
+\r
+      <validator name="long"\r
+            classname="org.apache.struts.validator.FieldChecks"\r
+               method="validateLong"\r
+         methodParams="java.lang.Object,\r
+                       org.apache.commons.validator.ValidatorAction,\r
+                       org.apache.commons.validator.Field,\r
+                       org.apache.struts.action.ActionErrors,\r
+                       javax.servlet.http.HttpServletRequest"\r
+              depends=""\r
+                  msg="errors.long"/>\r
+\r
+\r
+      <validator name="float"\r
+            classname="org.apache.struts.validator.FieldChecks"\r
+               method="validateFloat"\r
+         methodParams="java.lang.Object,\r
+                       org.apache.commons.validator.ValidatorAction,\r
+                       org.apache.commons.validator.Field,\r
+                       org.apache.struts.action.ActionErrors,\r
+                       javax.servlet.http.HttpServletRequest"\r
+              depends=""\r
+                  msg="errors.float"\r
+       jsFunctionName="FloatValidations">\r
+\r
+         <javascript><![CDATA[\r
+            function validateFloat(form) {\r
+                var bValid = true;\r
+                var focusField = null;\r
+                var i = 0;\r
+                var fields = new Array();\r
+                oFloat = new FloatValidations();\r
+                for (x in oFloat) {\r
+                       var field = form[oFloat[x][0]];\r
+                       \r
+                    if (field.type == 'text' ||\r
+                        field.type == 'textarea' ||\r
+                        field.type == 'select-one' ||\r
+                        field.type == 'radio') {\r
+                        \r
+                       var value = '';\r
+                                               // get field's value\r
+                                               if (field.type == "select-one") {\r
+                                                       var si = field.selectedIndex;\r
+                                                       if (si >= 0) {\r
+                                                           value = field.options[si].value;\r
+                                                       }\r
+                                               } else {\r
+                                                       value = field.value;\r
+                                               }\r
+                        \r
+                        if (value.length > 0) {\r
+                            // remove '.' before checking digits\r
+                            var tempArray = value.split('.');\r
+                            var joinedString= tempArray.join('');\r
+\r
+                            if (!isAllDigits(joinedString)) {\r
+                                bValid = false;\r
+                                if (i == 0) {\r
+                                    focusField = field;\r
+                                }\r
+                                fields[i++] = oFloat[x][1];\r
+\r
+                            } else {\r
+                                   var iValue = parseFloat(value);\r
+                                   if (isNaN(iValue)) {\r
+                                       if (i == 0) {\r
+                                           focusField = field;\r
+                                       }\r
+                                       fields[i++] = oFloat[x][1];\r
+                                       bValid = false;\r
+                                   }\r
+                            }\r
+                        }\r
+                    }\r
+                }\r
+                if (fields.length > 0) {\r
+                   focusField.focus();\r
+                   alert(fields.join('\n'));\r
+                }\r
+                return bValid;\r
+            }]]>\r
+         </javascript>\r
+\r
+      </validator>\r
+\r
+\r
+      <validator name="double"\r
+            classname="org.apache.struts.validator.FieldChecks"\r
+               method="validateDouble"\r
+         methodParams="java.lang.Object,\r
+                       org.apache.commons.validator.ValidatorAction,\r
+                       org.apache.commons.validator.Field,\r
+                       org.apache.struts.action.ActionErrors,\r
+                       javax.servlet.http.HttpServletRequest"\r
+              depends=""\r
+                  msg="errors.double"/>\r
+\r
+\r
+      <validator name="date"\r
+            classname="org.apache.struts.validator.FieldChecks"\r
+               method="validateDate"\r
+         methodParams="java.lang.Object,\r
+                       org.apache.commons.validator.ValidatorAction,\r
+                       org.apache.commons.validator.Field,\r
+                       org.apache.struts.action.ActionErrors,\r
+                       javax.servlet.http.HttpServletRequest"\r
+              depends=""\r
+                  msg="errors.date"\r
+       jsFunctionName="DateValidations">\r
+\r
+         <javascript><![CDATA[\r
+            function validateDate(form) {\r
+               var bValid = true;\r
+               var focusField = null;\r
+               var i = 0;\r
+               var fields = new Array();\r
+               oDate = new DateValidations();\r
+               for (x in oDate) {\r
+                   var value = form[oDate[x][0]].value;\r
+                   var datePattern = oDate[x][2]("datePatternStrict");\r
+                   if ((form[oDate[x][0]].type == 'text' ||\r
+                        form[oDate[x][0]].type == 'textarea') &&\r
+                       (value.length > 0) &&\r
+                       (datePattern.length > 0)) {\r
+                     var MONTH = "MM";\r
+                     var DAY = "dd";\r
+                     var YEAR = "yyyy";\r
+                     var orderMonth = datePattern.indexOf(MONTH);\r
+                     var orderDay = datePattern.indexOf(DAY);\r
+                     var orderYear = datePattern.indexOf(YEAR);\r
+                     if ((orderDay < orderYear && orderDay > orderMonth)) {\r
+                         var iDelim1 = orderMonth + MONTH.length;\r
+                         var iDelim2 = orderDay + DAY.length;\r
+                         var delim1 = datePattern.substring(iDelim1, iDelim1 + 1);\r
+                         var delim2 = datePattern.substring(iDelim2, iDelim2 + 1);\r
+                         if (iDelim1 == orderDay && iDelim2 == orderYear) {\r
+                            dateRegexp = new RegExp("^(\\d{2})(\\d{2})(\\d{4})$");\r
+                         } else if (iDelim1 == orderDay) {\r
+                            dateRegexp = new RegExp("^(\\d{2})(\\d{2})[" + delim2 + "](\\d{4})$");\r
+                         } else if (iDelim2 == orderYear) {\r
+                            dateRegexp = new RegExp("^(\\d{2})[" + delim1 + "](\\d{2})(\\d{4})$");\r
+                         } else {\r
+                            dateRegexp = new RegExp("^(\\d{2})[" + delim1 + "](\\d{2})[" + delim2 + "](\\d{4})$");\r
+                         }\r
+                         var matched = dateRegexp.exec(value);\r
+                         if(matched != null) {\r
+                            if (!isValidDate(matched[2], matched[1], matched[3])) {\r
+                               if (i == 0) {\r
+                                   focusField = form[oDate[x][0]];\r
+                               }\r
+                               fields[i++] = oDate[x][1];\r
+                               bValid =  false;\r
+                            }\r
+                         } else {\r
+                            if (i == 0) {\r
+                                focusField = form[oDate[x][0]];\r
+                            }\r
+                            fields[i++] = oDate[x][1];\r
+                            bValid =  false;\r
+                         }\r
+                     } else if ((orderMonth < orderYear && orderMonth > orderDay)) {\r
+                         var iDelim1 = orderDay + DAY.length;\r
+                         var iDelim2 = orderMonth + MONTH.length;\r
+                         var delim1 = datePattern.substring(iDelim1, iDelim1 + 1);\r
+                         var delim2 = datePattern.substring(iDelim2, iDelim2 + 1);\r
+                         if (iDelim1 == orderMonth && iDelim2 == orderYear) {\r
+                             dateRegexp = new RegExp("^(\\d{2})(\\d{2})(\\d{4})$");\r
+                         } else if (iDelim1 == orderMonth) {\r
+                             dateRegexp = new RegExp("^(\\d{2})(\\d{2})[" + delim2 + "](\\d{4})$");\r
+                         } else if (iDelim2 == orderYear) {\r
+                             dateRegexp = new RegExp("^(\\d{2})[" + delim1 + "](\\d{2})(\\d{4})$");\r
+                         } else {\r
+                             dateRegexp = new RegExp("^(\\d{2})[" + delim1 + "](\\d{2})[" + delim2 + "](\\d{4})$");\r
+                         }\r
+                         var matched = dateRegexp.exec(value);\r
+                         if(matched != null) {\r
+                             if (!isValidDate(matched[1], matched[2], matched[3])) {\r
+                                 if (i == 0) {\r
+                                     focusField = form[oDate[x][0]];\r
+                                 }\r
+                                 fields[i++] = oDate[x][1];\r
+                                 bValid =  false;\r
+                              }\r
+                         } else {\r
+                             if (i == 0) {\r
+                                 focusField = form[oDate[x][0]];\r
+                             }\r
+                             fields[i++] = oDate[x][1];\r
+                             bValid =  false;\r
+                         }\r
+                     } else if ((orderMonth > orderYear && orderMonth < orderDay)) {\r
+                         var iDelim1 = orderYear + YEAR.length;\r
+                         var iDelim2 = orderMonth + MONTH.length;\r
+                         var delim1 = datePattern.substring(iDelim1, iDelim1 + 1);\r
+                         var delim2 = datePattern.substring(iDelim2, iDelim2 + 1);\r
+                         if (iDelim1 == orderMonth && iDelim2 == orderDay) {\r
+                             dateRegexp = new RegExp("^(\\d{4})(\\d{2})(\\d{2})$");\r
+                         } else if (iDelim1 == orderMonth) {\r
+                             dateRegexp = new RegExp("^(\\d{4})(\\d{2})[" + delim2 + "](\\d{2})$");\r
+                         } else if (iDelim2 == orderDay) {\r
+                             dateRegexp = new RegExp("^(\\d{4})[" + delim1 + "](\\d{2})(\\d{2})$");\r
+                         } else {\r
+                             dateRegexp = new RegExp("^(\\d{4})[" + delim1 + "](\\d{2})[" + delim2 + "](\\d{2})$");\r
+                         }\r
+                         var matched = dateRegexp.exec(value);\r
+                         if(matched != null) {\r
+                             if (!isValidDate(matched[3], matched[2], matched[1])) {\r
+                                 if (i == 0) {\r
+                                     focusField = form[oDate[x][0]];\r
+                                  }\r
+                                  fields[i++] = oDate[x][1];\r
+                                  bValid =  false;\r
+                              }\r
+                          } else {\r
+                              if (i == 0) {\r
+                                  focusField = form[oDate[x][0]];\r
+                              }\r
+                              fields[i++] = oDate[x][1];\r
+                              bValid =  false;\r
+                          }\r
+                     } else {\r
+                         if (i == 0) {\r
+                             focusField = form[oDate[x][0]];\r
+                         }\r
+                         fields[i++] = oDate[x][1];\r
+                         bValid =  false;\r
+                     }\r
+                  }\r
+               }\r
+               if (fields.length > 0) {\r
+                  focusField.focus();\r
+                  alert(fields.join('\n'));\r
+               }\r
+               return bValid;\r
+            }\r
+\r
+           function isValidDate(day, month, year) {\r
+               if (month < 1 || month > 12) {\r
+                    return false;\r
+                }\r
+                if (day < 1 || day > 31) {\r
+                    return false;\r
+                }\r
+                if ((month == 4 || month == 6 || month == 9 || month == 11) &&\r
+                    (day == 31)) {\r
+                    return false;\r
+                }\r
+                if (month == 2) {\r
+                    var leap = (year % 4 == 0 &&\r
+                               (year % 100 != 0 || year % 400 == 0));\r
+                    if (day>29 || (day == 29 && !leap)) {\r
+                        return false;\r
+                    }\r
+                }\r
+                return true;\r
+            }]]>\r
+         </javascript>\r
+\r
+      </validator>\r
+\r
+<!-- range is deprecated use intRange instead -->\r
+      <validator name="range"\r
+            classname="org.apache.struts.validator.FieldChecks"\r
+               method="validateIntRange"\r
+         methodParams="java.lang.Object,\r
+                       org.apache.commons.validator.ValidatorAction,\r
+                       org.apache.commons.validator.Field,\r
+                       org.apache.struts.action.ActionErrors,\r
+                       javax.servlet.http.HttpServletRequest"\r
+              depends="integer"\r
+                  msg="errors.range">\r
+\r
+         <javascript><![CDATA[\r
+            function validateRange(form) {\r
+                return validateIntRange(form);\r
+            }]]>\r
+         </javascript>\r
+\r
+      </validator>\r
+\r
+      <validator name="intRange"\r
+            classname="org.apache.struts.validator.FieldChecks"\r
+               method="validateIntRange"\r
+         methodParams="java.lang.Object,\r
+                       org.apache.commons.validator.ValidatorAction,\r
+                       org.apache.commons.validator.Field,\r
+                       org.apache.struts.action.ActionErrors,\r
+                       javax.servlet.http.HttpServletRequest"\r
+              depends="integer"\r
+                  msg="errors.range">\r
+\r
+         <javascript><![CDATA[\r
+            function validateIntRange(form) {\r
+                var isValid = true;\r
+                var focusField = null;\r
+                var i = 0;\r
+                var fields = new Array();\r
+                oRange = new intRange();\r
+                for (x in oRange) {\r
+                    var field = form[oRange[x][0]];\r
+                    \r
+                    if ((field.type == 'text' ||\r
+                         field.type == 'textarea') &&\r
+                        (field.value.length > 0)) {\r
+                        \r
+                        var iMin = parseInt(oRange[x][2]("min"));\r
+                        var iMax = parseInt(oRange[x][2]("max"));\r
+                        var iValue = parseInt(field.value);\r
+                        if (!(iValue >= iMin && iValue <= iMax)) {\r
+                            if (i == 0) {\r
+                                focusField = field;\r
+                            }\r
+                            fields[i++] = oRange[x][1];\r
+                            isValid = false;\r
+                        }\r
+                    }\r
+                }\r
+                if (fields.length > 0) {\r
+                    focusField.focus();\r
+                    alert(fields.join('\n'));\r
+                }\r
+                return isValid;\r
+            }]]>\r
+         </javascript>\r
+\r
+      </validator>\r
+\r
+      <validator name="floatRange"\r
+            classname="org.apache.struts.validator.FieldChecks"\r
+               method="validateFloatRange"\r
+         methodParams="java.lang.Object,\r
+                       org.apache.commons.validator.ValidatorAction,\r
+                       org.apache.commons.validator.Field,\r
+                       org.apache.struts.action.ActionErrors,\r
+                       javax.servlet.http.HttpServletRequest"\r
+              depends="float"\r
+                  msg="errors.range">\r
+\r
+         <javascript><![CDATA[\r
+            function validateFloatRange(form) {\r
+                var isValid = true;\r
+                var focusField = null;\r
+                var i = 0;\r
+                var fields = new Array();\r
+                oRange = new floatRange();\r
+                for (x in oRange) {\r
+                    var field = form[oRange[x][0]];\r
+                    \r
+                    if ((field.type == 'text' ||\r
+                         field.type == 'textarea') &&\r
+                        (field.value.length > 0)) {\r
+                        \r
+                        var fMin = parseFloat(oRange[x][2]("min"));\r
+                        var fMax = parseFloat(oRange[x][2]("max"));\r
+                        var fValue = parseFloat(field.value);\r
+                        if (!(fValue >= fMin && fValue <= fMax)) {\r
+                            if (i == 0) {\r
+                                focusField = field;\r
+                            }\r
+                            fields[i++] = oRange[x][1];\r
+                            isValid = false;\r
+                        }\r
+                    }\r
+                }\r
+                if (fields.length > 0) {\r
+                    focusField.focus();\r
+                    alert(fields.join('\n'));\r
+                }\r
+                return isValid;\r
+            }]]>\r
+         </javascript>\r
+\r
+      </validator>\r
+\r
+      <validator name="creditCard"\r
+            classname="org.apache.struts.validator.FieldChecks"\r
+               method="validateCreditCard"\r
+         methodParams="java.lang.Object,\r
+                       org.apache.commons.validator.ValidatorAction,\r
+                       org.apache.commons.validator.Field,\r
+                       org.apache.struts.action.ActionErrors,\r
+                       javax.servlet.http.HttpServletRequest"\r
+              depends=""\r
+                  msg="errors.creditcard">\r
+\r
+         <javascript><![CDATA[\r
+            function validateCreditCard(form) {\r
+                var bValid = true;\r
+                var focusField = null;\r
+                var i = 0;\r
+                var fields = new Array();\r
+                oCreditCard = new creditCard();\r
+                for (x in oCreditCard) {\r
+                    if ((form[oCreditCard[x][0]].type == 'text' ||\r
+                         form[oCreditCard[x][0]].type == 'textarea') &&\r
+                        (form[oCreditCard[x][0]].value.length > 0)) {\r
+                        if (!luhnCheck(form[oCreditCard[x][0]].value)) {\r
+                            if (i == 0) {\r
+                                focusField = form[oCreditCard[x][0]];\r
+                            }\r
+                            fields[i++] = oCreditCard[x][1];\r
+                            bValid = false;\r
+                        }\r
+                    }\r
+                }\r
+                if (fields.length > 0) {\r
+                    focusField.focus();\r
+                    alert(fields.join('\n'));\r
+                }\r
+                return bValid;\r
+            }\r
+\r
+            /**\r
+             * Reference: http://www.ling.nwu.edu/~sburke/pub/luhn_lib.pl\r
+             */\r
+            function luhnCheck(cardNumber) {\r
+                if (isLuhnNum(cardNumber)) {\r
+                    var no_digit = cardNumber.length;\r
+                    var oddoeven = no_digit & 1;\r
+                    var sum = 0;\r
+                    for (var count = 0; count < no_digit; count++) {\r
+                        var digit = parseInt(cardNumber.charAt(count));\r
+                        if (!((count & 1) ^ oddoeven)) {\r
+                            digit *= 2;\r
+                            if (digit > 9) digit -= 9;\r
+                        };\r
+                        sum += digit;\r
+                    };\r
+                    if (sum == 0) return false;\r
+                    if (sum % 10 == 0) return true;\r
+                };\r
+                return false;\r
+            }\r
+\r
+            function isLuhnNum(argvalue) {\r
+                argvalue = argvalue.toString();\r
+                if (argvalue.length == 0) {\r
+                    return false;\r
+                }\r
+                for (var n = 0; n < argvalue.length; n++) {\r
+                    if ((argvalue.substring(n, n+1) < "0") ||\r
+                        (argvalue.substring(n,n+1) > "9")) {\r
+                        return false;\r
+                    }\r
+                }\r
+                return true;\r
+            }]]>\r
+         </javascript>\r
+\r
+      </validator>\r
+\r
+\r
+      <validator name="email"\r
+            classname="org.apache.struts.validator.FieldChecks"\r
+               method="validateEmail"\r
+         methodParams="java.lang.Object,\r
+                       org.apache.commons.validator.ValidatorAction,\r
+                       org.apache.commons.validator.Field,\r
+                       org.apache.struts.action.ActionErrors,\r
+                       javax.servlet.http.HttpServletRequest"\r
+              depends=""\r
+                  msg="errors.email">\r
+\r
+         <javascript><![CDATA[\r
+            function validateEmail(form) {\r
+                var bValid = true;\r
+                var focusField = null;\r
+                var i = 0;\r
+                var fields = new Array();\r
+                oEmail = new email();\r
+                for (x in oEmail) {\r
+                    if ((form[oEmail[x][0]].type == 'text' ||\r
+                         form[oEmail[x][0]].type == 'textarea') &&\r
+                        (form[oEmail[x][0]].value.length > 0)) {\r
+                        if (!checkEmail(form[oEmail[x][0]].value)) {\r
+                            if (i == 0) {\r
+                                focusField = form[oEmail[x][0]];\r
+                            }\r
+                            fields[i++] = oEmail[x][1];\r
+                            bValid = false;\r
+                        }\r
+                    }\r
+                }\r
+                if (fields.length > 0) {\r
+                    focusField.focus();\r
+                    alert(fields.join('\n'));\r
+                }\r
+                return bValid;\r
+            }\r
+\r
+            /**\r
+             * Reference: Sandeep V. Tamhankar (stamhankar@hotmail.com),\r
+             * http://javascript.internet.com\r
+             */\r
+            function checkEmail(emailStr) {\r
+               if (emailStr.length == 0) {\r
+                   return true;\r
+               }\r
+               var emailPat=/^(.+)@(.+)$/;\r
+               var specialChars="\\(\\)<>@,;:\\\\\\\"\\.\\[\\]";\r
+               var validChars="\[^\\s" + specialChars + "\]";\r
+               var quotedUser="(\"[^\"]*\")";\r
+               var ipDomainPat=/^(\d{1,3})[.](\d{1,3})[.](\d{1,3})[.](\d{1,3})$/;\r
+               var atom=validChars + '+';\r
+               var word="(" + atom + "|" + quotedUser + ")";\r
+               var userPat=new RegExp("^" + word + "(\\." + word + ")*$");\r
+               var domainPat=new RegExp("^" + atom + "(\\." + atom + ")*$");\r
+               var matchArray=emailStr.match(emailPat);\r
+               if (matchArray == null) {\r
+                   return false;\r
+               }\r
+               var user=matchArray[1];\r
+               var domain=matchArray[2];\r
+               if (user.match(userPat) == null) {\r
+                   return false;\r
+               }\r
+               var IPArray = domain.match(ipDomainPat);\r
+               if (IPArray != null) {\r
+                   for (var i = 1; i <= 4; i++) {\r
+                      if (IPArray[i] > 255) {\r
+                         return false;\r
+                      }\r
+                   }\r
+                   return true;\r
+               }\r
+               var domainArray=domain.match(domainPat);\r
+               if (domainArray == null) {\r
+                   return false;\r
+               }\r
+               var atomPat=new RegExp(atom,"g");\r
+               var domArr=domain.match(atomPat);\r
+               var len=domArr.length;\r
+               if ((domArr[domArr.length-1].length < 2) ||\r
+                   (domArr[domArr.length-1].length > 3)) {\r
+                   return false;\r
+               }\r
+               if (len < 2) {\r
+                   return false;\r
+               }\r
+               return true;\r
+            }]]>\r
+         </javascript>\r
+\r
+      </validator>\r
+\r
+   </global>\r
+\r
+</form-validation>\r
diff --git a/lib/struts/validator-rules_1_1.dtd b/lib/struts/validator-rules_1_1.dtd
new file mode 100755 (executable)
index 0000000..2d24c8c
--- /dev/null
@@ -0,0 +1,282 @@
+<!--\r
+    DEPRECATED ** DEPRECATED ** DEPRECATED ** DEPRECATED ** DEPRECATED\r
+    DEPRECATED ** DEPRECATED ** DEPRECATED ** DEPRECATED ** DEPRECATED \r
+    \r
+     Refer to the below DTD Instead:\r
+    \r
+    <!DOCTYPE form-validation PUBLIC\r
+          "-//Apache Software Foundation//DTD Commons Validator Rules Configuration 1.0//EN"\r
+          "http://jakarta.apache.org/commons/dtds/validator_1_0.dtd">\r
+\r
+\r
+    $Id: validator-rules_1_1.dtd,v 1.6 2002/11/14 20:33:13 rleland Exp $\r
+-->\r
+\r
+\r
+<!-- =================================================== Top Level Elements -->\r
+\r
+\r
+<!--\r
+    DEPRECATED ** DEPRECATED ** DEPRECATED ** DEPRECATED ** DEPRECATED\r
+    DEPRECATED ** DEPRECATED ** DEPRECATED ** DEPRECATED ** DEPRECATED \r
+     The "form-validation" element is the root of the configuration file\r
+     hierarchy, and contains nested elements for all of the other\r
+     configuration settings.\r
+-->\r
+<!ELEMENT form-validation (global+)>\r
+\r
+\r
+<!--\r
+    DEPRECATED ** DEPRECATED ** DEPRECATED ** DEPRECATED ** DEPRECATED\r
+    DEPRECATED ** DEPRECATED ** DEPRECATED ** DEPRECATED ** DEPRECATED \r
+    The elements defined here are all global and must be nested within a\r
+    "global" element.\r
+-->\r
+<!ELEMENT global (validator+)>\r
+\r
+\r
+<!--\r
+    DEPRECATED ** DEPRECATED ** DEPRECATED ** DEPRECATED ** DEPRECATED\r
+    DEPRECATED ** DEPRECATED ** DEPRECATED ** DEPRECATED ** DEPRECATED \r
+     The "validator" element defines what validators objects can be used with\r
+     the fields referenced by the formset elements. The validator element can\r
+     accept 4 properties: name, classname, method, methodparams, msg, depends,\r
+     and jsFunctionName.\r
+-->\r
+<!ELEMENT validator (javascript?)>\r
+<!ATTLIST validator name           CDATA #REQUIRED\r
+                    classname      CDATA #REQUIRED\r
+                    method         CDATA #REQUIRED\r
+                    methodParams   CDATA #REQUIRED\r
+                    msg            CDATA #REQUIRED\r
+                    depends        CDATA #IMPLIED\r
+                    jsFunctionName CDATA #IMPLIED >\r
+\r
+\r
+<!--\r
+    DEPRECATED ** DEPRECATED ** DEPRECATED ** DEPRECATED ** DEPRECATED\r
+    DEPRECATED ** DEPRECATED ** DEPRECATED ** DEPRECATED ** DEPRECATED \r
+     The "javascript" element defines a JavaScript that can be used to perform\r
+     client-side validators.\r
+-->\r
+<!ELEMENT javascript (#PCDATA)>\r
+\r
+\r
+<!--\r
+    DEPRECATED ** DEPRECATED ** DEPRECATED ** DEPRECATED ** DEPRECATED\r
+    DEPRECATED ** DEPRECATED ** DEPRECATED ** DEPRECATED ** DEPRECATED \r
+     The "constant" element defines a static value that can be used as\r
+     replacement parameters within "field" elements. The "constant-name" and\r
+     "constant-value" elements define the constant's reference id and replacement\r
+     value.\r
+-->\r
+<!ELEMENT constant (constant-name, constant-value)>\r
+<!ELEMENT constant-name  (#PCDATA)>\r
+<!ELEMENT constant-value (#PCDATA)>\r
+\r
+\r
+<!--\r
+    DEPRECATED ** DEPRECATED ** DEPRECATED ** DEPRECATED ** DEPRECATED\r
+    DEPRECATED ** DEPRECATED ** DEPRECATED ** DEPRECATED ** DEPRECATED \r
+      The "formset" element defines a set of forms for a locale. Formsets for\r
+      specific locales can override only those fields that change. The\r
+      localization is properly scoped, so that a formset can override just the\r
+      language, or just the country, or both.\r
+-->\r
+<!ELEMENT formset (constant*, form+)>\r
+<!ATTLIST formset language     CDATA #IMPLIED\r
+                  country      CDATA #IMPLIED >\r
+\r
+\r
+<!--\r
+    DEPRECATED ** DEPRECATED ** DEPRECATED ** DEPRECATED ** DEPRECATED\r
+    DEPRECATED ** DEPRECATED ** DEPRECATED ** DEPRECATED ** DEPRECATED \r
+     The "form" element defines a set of fields to be validated. The name\r
+     corresponds to the identifer the application assigns to the form. In the\r
+     case of the Struts framework, this is the attribute property from\r
+     the ActionMapping. Struts also offers the alternative of using the\r
+     the path property as the Validator form name.\r
+-->\r
+<!ELEMENT form    (field+ )>\r
+<!ATTLIST form    name CDATA #REQUIRED>\r
+\r
+\r
+<!--\r
+    DEPRECATED ** DEPRECATED ** DEPRECATED ** DEPRECATED ** DEPRECATED\r
+    DEPRECATED ** DEPRECATED ** DEPRECATED ** DEPRECATED ** DEPRECATED \r
+     The "field" element defines the properties to be validated. In a\r
+     web application, a field would also correspond to a control on\r
+     a HTML form. To validate the properties, the validator works through\r
+     a JavaBean representation, like a Struts ActionForm. The field element\r
+     can accept up to 4 attributes:\r
+\r
+     property        The property on the JavaBean corresponding to this\r
+                     field element.\r
+\r
+     depends         The comma-delimited list of validators to apply against\r
+                     this field. For the field to succeed, all the\r
+                     validators must succeed.\r
+\r
+     page            The JavaBean corresponding to this form may include\r
+                     a page property. Only fields with a "page" attribute\r
+                     value that is equal to or less than the page property\r
+                     on the form JavaBean are processed. This is useful when\r
+                     using a "wizard" approach to completing a large form,\r
+                     to ensure that a page is not skipped.\r
+                     [0]\r
+\r
+     indexedListProperty\r
+                     The "indexedListProperty" is the method name that will\r
+                     return an array or a Collection used to retrieve the\r
+                     list and then loop through the list performing the\r
+                     validations for this field.\r
+\r
+     fieldOrder      [:FIXME: is this still supported?]\r
+-->\r
+<!ELEMENT field   (msg|arg0|arg1|arg2|arg3|var)*>\r
+<!ATTLIST field   property CDATA #REQUIRED\r
+                  depends  CDATA #IMPLIED\r
+                  page     CDATA #IMPLIED\r
+                  indexedListProperty CDATA #IMPLIED >\r
+\r
+\r
+<!--\r
+    DEPRECATED ** DEPRECATED ** DEPRECATED ** DEPRECATED ** DEPRECATED\r
+    DEPRECATED ** DEPRECATED ** DEPRECATED ** DEPRECATED ** DEPRECATED \r
+     The "msg" element defines a custom message key to use when one of the\r
+     validators for this field fails. Each validator has a default message\r
+     property that is used when a corresonding field msg is not specified.\r
+     Each validator applied to a field may have its own msg element.\r
+     The msg element accepts up to three attributes.\r
+\r
+      name        The name of the validator corresponding to this msg.\r
+\r
+      key         The key that will return the message template from a\r
+                  resource bundle.\r
+\r
+      resource    If set to "false", the key is taken to be a literal\r
+                  value rather than a bundle key.\r
+                  [true]\r
+-->\r
+<!ELEMENT msg     EMPTY>\r
+<!ATTLIST msg     name     CDATA #IMPLIED\r
+                  key      CDATA #IMPLIED\r
+                  resource CDATA #IMPLIED >\r
+\r
+\r
+<!--\r
+    DEPRECATED ** DEPRECATED ** DEPRECATED ** DEPRECATED ** DEPRECATED\r
+    DEPRECATED ** DEPRECATED ** DEPRECATED ** DEPRECATED ** DEPRECATED \r
+     The "arg0" element defines the first replacement value to use with the\r
+     message template for this validator or this field.\r
+     The arg0 element accepts up to three attributes.\r
+\r
+      name        The name of the validator corresponding to this msg.\r
+\r
+      key         The key that will return the message template from a\r
+                  resource bundle.\r
+\r
+      resource    If set to "false", the key is taken to be a literal\r
+                  value rather than a bundle key.\r
+                  [true]\r
+-->\r
+<!ELEMENT arg0    EMPTY>\r
+<!ATTLIST arg0    name     CDATA #IMPLIED\r
+                  key      CDATA #IMPLIED\r
+                  resource CDATA #IMPLIED >\r
+\r
+\r
+<!--\r
+    DEPRECATED ** DEPRECATED ** DEPRECATED ** DEPRECATED ** DEPRECATED\r
+    DEPRECATED ** DEPRECATED ** DEPRECATED ** DEPRECATED ** DEPRECATED \r
+     The "arg1" element defines the second replacement value to use with the\r
+     message template for this validator or this field.\r
+     The arg1 element accepts up to three attributes.\r
+\r
+      name        The name of the validator corresponding to this msg.\r
+\r
+      key         The key that will return the message template from a\r
+                  resource bundle.\r
+\r
+      resource    If set to "false", the key is taken to be a literal\r
+                  value rather than a bundle key.\r
+                  [true]\r
+-->\r
+<!ELEMENT arg1    EMPTY>\r
+<!ATTLIST arg1    name     CDATA #IMPLIED\r
+                  key      CDATA #IMPLIED\r
+                  resource CDATA #IMPLIED >\r
+\r
+\r
+<!--\r
+    DEPRECATED ** DEPRECATED ** DEPRECATED ** DEPRECATED ** DEPRECATED\r
+    DEPRECATED ** DEPRECATED ** DEPRECATED ** DEPRECATED ** DEPRECATED \r
+     The "arg2" element defines the third replacement value to use with the\r
+     message template for this validator or this field.\r
+     The arg2 element accepts up to three attributes.\r
+\r
+      name        The name of the validator corresponding to this msg.\r
+\r
+      key         The key that will return the message template from a\r
+                  resource bundle.\r
+\r
+      resource    If set to "false", the key is taken to be a literal\r
+                  value rather than a bundle key.\r
+                  [true]\r
+-->\r
+<!ELEMENT arg2    EMPTY>\r
+<!ATTLIST arg2    name     CDATA #IMPLIED\r
+                  key      CDATA #IMPLIED\r
+                  resource CDATA #IMPLIED >\r
+\r
+<!--\r
+    DEPRECATED ** DEPRECATED ** DEPRECATED ** DEPRECATED ** DEPRECATED\r
+    DEPRECATED ** DEPRECATED ** DEPRECATED ** DEPRECATED ** DEPRECATED \r
+     The "arg3" element defines the fourth replacement value to use with the\r
+     message template for this validator or this field.\r
+     The arg0 element accepts up to three attributes.\r
+\r
+      name        The name of the validator corresponding to this msg.\r
+\r
+      key         The key that will return the message template from a\r
+                  resource bundle.\r
+\r
+      resource    If set to "false", the key is taken to be a literal\r
+                  value rather than a bundle key.\r
+                  [true]\r
+-->\r
+<!ELEMENT arg3    EMPTY>\r
+<!ATTLIST arg3    name     CDATA #IMPLIED\r
+                  key      CDATA #IMPLIED\r
+                  resource CDATA #IMPLIED >\r
+\r
+\r
+<!--\r
+    DEPRECATED ** DEPRECATED ** DEPRECATED ** DEPRECATED ** DEPRECATED\r
+    DEPRECATED ** DEPRECATED ** DEPRECATED ** DEPRECATED ** DEPRECATED \r
+     The "var" element can set parameters that a field may need to pass to\r
+     one of its validators, such as the minimum and maximum values in a\r
+     range validation. These parameters may also be referenced by one of the\r
+     arg? elements using a shell syntax: ${var:var-name}.\r
+-->\r
+<!ELEMENT var (var-name, var-value)>\r
+\r
+\r
+\r
+<!--\r
+    DEPRECATED ** DEPRECATED ** DEPRECATED ** DEPRECATED ** DEPRECATED\r
+    DEPRECATED ** DEPRECATED ** DEPRECATED ** DEPRECATED ** DEPRECATED \r
+     The name of the var parameter to provide to a field's validators.\r
+-->\r
+<!ELEMENT var-name  (#PCDATA)>\r
+\r
+\r
+\r
+<!--\r
+    DEPRECATED ** DEPRECATED ** DEPRECATED ** DEPRECATED ** DEPRECATED\r
+    DEPRECATED ** DEPRECATED ** DEPRECATED ** DEPRECATED ** DEPRECATED \r
+     The value of the var parameter to provide to a field's validators.\r
+-->\r
+<!ELEMENT var-value (#PCDATA)>\r
+\r
+<!-- eof -->\r