 <!--
   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 "Collections" Package</title>
<head>
<body bgcolor="white">


<div align="center">
<h1>The Apache Commons <em>Collections</em> Package</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>Collections</em> package contains a set of Java classes that
extend or augment the Java Collections Framework. This includes new interfaces
and new implementations together with supporting utility classes.

<p>In addition to the main commons-collections jar, a testframework jar file is also produced.

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

<p>The <em>Collections</em> package 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://www.junit.org">JUnit Testing Framework</a>
    (Version 3.8.1 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:
<a href="http://jakarta.apache.org/site/binindex.cgi">Version 3.2</a>

<p>Planned Next Release:  3.3</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>Collections</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:morgand@apache.org">Morgan Delagrange</a></li>
   <li><a href="mailto:donaldp@apache.org">Peter Donald</a></li>
   <li><a href="mailto:geirm@apache.org">Geir Magnusson Jr.</a></li>
   <li><a href="mailto:craigmcc@apache.org">Craig McClanahan</a></li>
   <li><a href="mailto:jstrachan@apache.org">James Strachan</a></li>
   <li><a href="mailto:rwaldhoff@apache.org">Rodney Waldhoff</a></li>
   <li><a href="mailto:jvanzyl@apache.org">Jason van Zyl</a></li>
   <li><a href="mailto:bayard@apache.org">Henri Yandell</a></li>
   <li><a href="mailto:scolebourne@apache.org">Stephen Colebourne</a></li>
   <li><a href="mailto:rdonkin@apache.org">Robert Burrell Donkin</a></li>
   <li><a href="mailto:psteitz@apache.org">Phil Steitz</a></li>
   <li><a href="mailto:matth@apache.org">Matthew Hawthorne</a></li>
   <li><a href="mailto:jcarman@apache.org">James Carman</a></li>
   <li>Arun M. Thomas</li>
</ul>

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

<p>
Want to help?
All ideas and suggestions should be made to the commons mailing lists,
commons-user at jakarta.apache.org and commons-dev at jakarta.apache.org.
Please prefix any emails by [collections] to pass mail filters.
</p>

</body>
</html>
