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

<div align="center">
<h1>Proposal for <em>Collections</em> Package</h1>
</div>

<h3>(0) Rationale</h3>
<p>
   The Java Collections Framework provides a set of abstract data
   type interfaces and implementations that offer both a wealth
   of useful functionality, and a solid foundation for extending
   that functionality.
</p>
<p>
   Many Jakarta projects have needs or design criteria that extend
   beyond the core Collections API, such as introducing new abstract
   data types (e.g., Avalon's BinaryHeap) or changing the behaviour of
   existing abstract data types (e.g., Struts' FastHashMap).
</p>
<p>
   In keeping with the spirit of the Collections API and of abstract
   data types in general, these components can and should be shared
   assets.  A Commons package for abstract data types would
   encourage the development and reuse of a robust set of collections
   classes.
</p>

<h3>(1) Scope of the Package</h3>
<p>
   The package will create and maintain a set of collections and
   related classes designed to be compatible with the Java Collections
   Framework, and to be distributed under the ASF license.
</p>

<h3>(1.5) Interaction With Other Packages</h3>

<p><em>Collections</em> relies only on standard JDK 1.2 (or later) APIs for
production deployment.  It utilizes the JUnit unit testing framework for
developing and executing unit tests, but this is of interest only to
developers of the component.  Collections will also be a dependency for
several future proposed components for the Jakarta Commons subproject. </p>

<p>No external configuration files are utilized.</p>

<h3>(2) Initial Source of the Package</h3>

<p>
   The initial codebase was harvested from existing and proposed
   Jakarta packages, including the Commons Database Connection Pool,
   Struts, and Avalon.
</p>

<p>The proposed package name for the new component is
<code>org.apache.commons.collections</code>.</p>


<h3>(3)  Required Jakarta-Commons Resources</h3>

<ul>
<li>CVS Repository - New directory <code>collections</code> in the
    <code>jakarta-commons</code> CVS repository.  All initial committers
    are already committers on <code>jakarta-commons</code>, so no
    additional user setups are required.</li>
<li>Mailing List - Discussions will take place on the general
    <em>jakarta-commons@jakarta.apache.org</em> mailing list.  To help
    list subscribers identify messages of interest, it is suggested that
    the message subject of messages about this component be prefixed with
    [Collections].</li>
<li>Bugzilla - New component "Collections" under the "Commons" product
    category, with appropriate version identifiers as needed.</li>
<li>Jyve FAQ - New category "commons-collections" (when available). </li>
</ul>


<h3>(4) Initial Committers</h3>
<ul>
   <li>Peter Donald</li>
   <li>Craig McClanahan</li>
   <li>Rodney Waldhoff</li>
   <li>James Strachan</li>
</ul>
</body>
</html>
