 <!--
   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 behavior 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>
