<!--
   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: STATUS.html,v 1.4 2004/11/17 08:05:39 mrdon Exp $<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>
</ul>

</body>
</html>
