<!--
 Licensed to the Apache Software Foundation (ASF) under one or more
 contributor license agreements.  See the NOTICE file distributed with
 this work for additional information regarding copyright ownership.
 The ASF licenses this file to You under the Apache License, Version 2.0
 (the "License"); you may not use this file except in compliance with
 the License.  You may obtain a copy of the License at

      http://www.apache.org/licenses/LICENSE-2.0

 Unless required by applicable law or agreed to in writing, software
 distributed under the License is distributed on an "AS IS" BASIS,
 WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
 See the License for the specific language governing permissions and
 limitations under the License.
-->
<html>
<head>
<title>Status File for Jakarta Commons "Validator" Component</title>
<head>
<body bgcolor="white">


<div align="center">
<h1>The Jakarta Commons <em>Validator</em> Component</h1>
<br>
<a href="#Introduction">[Introduction]</a>
<a href="#Dependencies">[Dependencies]</a>
<a href="#Release Info">[Release Info]</a>
<a href="#Committers">[Committers]</a>
<a href="#Action Items">[Action Items]</a>
<br><br>
</div>


<a name="Introduction"></a>
<h3>1.  INTRODUCTION</h3>


<p> The commons-validator package provides a simple, extendable  
framework to define validators (validation methods) and validation rules 
in an xml file.  There is support for internationalization of 
validation rules and error messages.
</p>

<p>
The package should :
<ul>
<li>Provide in an easy way to define validations for fields</li>
<li>Provide internationalization support for validation rules and error messages.</li>
<li>Provide an easy way to define validators</li>
<li>Provide a way to store information in a validator definition so JavaScript client 
    side validation can be auto-generated matching the server side validation.</li>
</ul>
</p>

<p>
Non-goals:
<ul>
<li>This package does not auto-generate JavaScript client side code.</li>
</ul>
</p>
 

<a name="Dependencies"></a>
<h3>2.  DEPENDENCIES</h3>

<p>The <em>Logging</em> component is dependent upon the following external
components for compilation:</p>
<ul>
<li><a href="http://www.junit.org/">JUnit</a>
    (Version 3.2 or later)</li>
</ul>

<a name="Release Info"></a>
<h3>3.  RELEASE INFO</h3>

<p>Current Release:  <strong>Unreleased, CVS Repository Only</strong></p>

<p>Planned Next Release: 1.0</p>
<P>Tentative Release Date: November 1st, 2002</P>
<P>Release Manager: James Turner</P>
<B>OPEN BUGS</B><BR>
7318  javascript: zero - means bad integer?? <BR>
7349  Date Validation passes invalid date  <BR>
8787  Indexed field validation patch  <BR>
10584 Not all validation files are read in Validation PlugIn  <BR>
10782  If two fields are required, and one has a mask, the mask is <BR>  
13030  Digester unable to resolve external DTD  <BR>
13421  GenericValidator & GenericTypeValidator unused variables & J  <BR>
13472  Attempt to modify FastHashMap while in fast mode through ite  <P>
<B>TO DO</B><BR>
Add DTD for Validation XML<BR>
Improve Javadoc<BR>
Write basic tutorial<P>

<a name="Committers"></a>
<h3>4.  COMMITTERS</h3>

<p>The following individuals are the primary developers and maintainers of this
component.  Developers who plan to use <em>Validator</em> in their own
projects are encouraged to collaborate on the future development of this
component to ensure that it continues to meet a variety of needs.</p>
<ul>
  <li><a href="mailto:dwinterfeldt@apache.org">David Winterfeldt</a></li>
  <li><a href="mailto:craigmcc@apache.org">Craig McClanahan</a></li>
  <li><a href="mailto:turner@blackbear.com">James Turner</a></li>
  <li><a href="mailto:martinc@apache.org">Martin Cooper</a></li>
  <li><a href="mailto:dgraham@apache.org">David Graham</a></li>
  <li><a href="mailto:rleland@apache.org">Robert Leland</a></li>
</ul>

<a name="Action Items"></a>
<h3>5.  ACTION ITEMS</h3>

<p>TO DO List:</p>

<table border="1">
  <tr>
    <th width="70%">Action Item</th>
    <th width="20%">Volunteer</th>
    <th width="10%">Expected</th>
  </tr>
  <tr>
    <td>Documentation.</td>
    <td>James Turner</td>
    <td>1.0 Release</td>
  </tr>
  <tr>
    <td>
       Create ability to define a component.  For example, to define 
       a global validation rule for an address object that can 
       then be referenced in a form element.
    </td>
    <td></td><td>Post 1.0</td>
  </tr>
</table>

</body>
</html>
