<!--
   Copyright 2003-2004 The Apache Software Foundation

   Licensed 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 "Chain of Responsibility" Component</title>
<head>
<body bgcolor="white">


<div align="center">
<h1>The Jakarta Commons <em>Chain of Responsibility</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>
<br><br>
</div>


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

<p>This scope of the <em>Chain of Responsibility</em> component is
to support modelling of complex computations as composition of individual
commands that operate on a context.</p>
 

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

<p>The <em>Chain of Responsibility</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://jakarta.apache.org/jakarta-commons/beanutils"/>Jakarta Commons Beanutils</a> (OPTIONAL)</li>
<li><a href="http://jakarta.apache.org/jakarta-commons/collections"/>Jakarta Commons Collections</a> (OPTIONAL)</li>
<li><a href="http://jakarta.apache.org/jakarta-commons/digester"/>Jakarta Commons Digester</a> (OPTIONAL)</li>
<li><a href="http://jakarta.apache.org/jakarta-commons/logging"/>Jakarta Commons Logging</a> (OPTIONAL)</li>
<li>JavaServer Faces API (Version 1.0 or later) (OPTIONAL)</li>
<li>Portlet API (Version 1.0 or later) (OPTIONAL)</li>
<li>Servlet API (Version 2.2 or later) (OPTIONAL)</li>
<li>JUnit Testing Framework (OPTIONAL, unit tests only)</li>
</ul>


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

<p>Current Release: 1.0</p>
<p>Planned Next Release: 1.0.1</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>Chain</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:martinc@apache.org">Martin Cooper</a></li>
<li><a href="mailto:mrdon@apache.org">Don Brown</a></li>
<li><a href="mailto:jmitchell@apache.org">James Mitchell</a></li>
<li><a href="mailto:germuska@apache.org">Joe Germuska</a></li>
</ul>

</body>
</html>
