<!--
   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 Apache Commons "BeanUtils" Component</title>
<head>
<body bgcolor="white">


<div align="center">
<h1>The Apache Commons <em>BeanUtils</em> Component</h1>
$Id$<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 <em>BeanUtils</em> Component contains a set of Java classes that provide
static utility methods useful in manipulating Java classes that conform to the
JavaBeans Specification naming patterns for bean properties in a dynamic
fashion.  The following classes are included:</p>
<ul>
<li><strong>BeanUtils</strong> - Higher level getters and setters that deal
    with automatic conversion of String-represented property values to the
    corresponding data types of the underlying property setters (and vice
    versa), using the capabilities of the ConvertUtils and PropertyUtils
    classes.</li>
<li><strong>ConvertUtils</strong> - Utility methods to convert String arguments
    to native Java types (and vice versa)</li>.
<li><strong>PropertyUtils</strong> - Low level getters and setters for bean
    properties that perform no type conversions at all.  Works on
    <code>List</code> objects as well (Not JavaBeans standard).</li>
</ul>

<p>An innovative and unique feature of this component is the syntax for
accessing nested and indexed bean properties.  See the Javadocs
<a href="http://commons.apache.org/beanutils/api/">PropertyUtils</a>
for more information about this feature.</p>


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

<p>The <em>BeanUtils</em> component is dependent upon the following external
components for development and use:</p>
<ul>
<li><a href="http://java.sun.com/j2se">Java Development Kit</a>
    (Version 1.2 or later)</li>
<li><a href="http://commons.apache.org">Collections Classes</a>
    from the Apache Commons Subproject</li>
<li><a href="http://commons.apache.org">Logging Classes</a>
    from the Apache Commons Subproject</li>
<li><a href="http://www.junit.org">JUnit Testing Framework</a>
    (Version 3.7 or later) - for unit tests only, not required
    for deployment</li>
</ul>


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

<p>Current Release: Version 1.6.1</p>

<p>Planned Next Release: 1.7</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>BeanUtils</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:craigmcc@apache.org">Craig McClanahan</a></li>
<li><a href="mailto:geirm@apache.org">Geir Magnusson Jr.</a></li>
<li><a href="mailto:sanders@apache.org">Scott Sanders</a></li>
<li><a href="mailto:rdonkin@apache.org">Robert Burrell Donkin</a></li>
<li><a href="mailto:dion@apache.org">dIon Gillard</a></li>
<li><a href="mailto:jstrachan@apache.org">James Strachan</a></li>
<li><a href="mailto:yoavs@apache.org">Yoav Shapira</a></li>
<li>Niall Pemberton (niallp at apache fot org)</li>
</ul>


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

<p>The following action items need to be completed prior to the next
release of this component:</p>

<table border="1">

  <tr>
    <th width="80%">Action Item</th>
    <th width="20%">Volunteer</th>
  </tr>

  <tr>
    <td><strong>Finish locale-sensitive beans and converters.</strong>.
    <td align="center">All</td>
  </tr>

  <tr>
    <td><strong>Add test cases</strong>.  Especially for i18n classes.</td>
    <td align="center">All</td>
  </tr>

</table>

</body>
</html>
