<!--
  ~ 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 "Proxy" Package</title>
<head>

<body bgcolor="white">


<div align="center">
    <h1>The Apache Commons <em>Proxy</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>Proxy</em> package contains a set of Java classes that facilitate the creation of dynamic proxies.

    <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.3 or later)
    </li>
    <li>
        <a href="http://commons.apache.org/logging">Apache Commons Logging</a>
        (Version 1.0.4 or later) - for logging, <b>optional</b> for deployment
    </li>

    <li><a href="http://aopalliance.sourceforge.net/">AOP Alliance</a>
        (Version 1.0 or later) - for method interceptor support, <b>optional</b> for deployment
    </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>
    <li>
        <a href="http://ws.apache.org/axis/">Apache Axis</a>
        (Version 1.2.1 or later) - used for testing JaxRpcProvider, not required for deployment
        (JaxRpcProvider requires some JAX-RPC implementation at runtime if you wish to use it)
    </li>
    <li>
        <a href="http://commons.apache.org/discovery/">Apache Commons Discovery</a>
        (Version 0.2 or later) - used for testing JaxRpcProvider (required by Axis), not required
        for deployment
    </li>
    <li>
        <a href="http://www.jboss.org/products/javassist">Javassist</a>
        (Version 3.0 or later) - used by JavassistProxyFactory for dynamic proxy generation, not
        required for deployment unless you wish to use JavassistProxyFactory
    </li>
    <li>
        <a href="http://cglib.sourceforge.net/">CGLIB</a>
        (Version 2.0.2 or later) - used by CglibProxyFactory for dynamic proxy generation, not
        required for deployment unless you wish to use CglibProxyFactory
    </li>
    <li>
        <a href="http://www.caucho.com/burlap/index.xtp">Burlap</a>
        (Version 2.1.7 or later) - used by BurlapProvider, not required for deployment unless you wish to
        use BurlapProvider
    </li>
    <li>
        <a href="http://www.caucho.com/hessian/index.xtp">Hessian</a>
        (Version 3.0.1 or later) - used by HessianProvider, not required for deployment unless you wish to
        use HessianProvider
    </li>
    <li>
        <a href="http://ws.apache.org/xmlrpc/">Apache XML-RPC</a>
        (Version 2.0 or later) - used to test XmlRpcInvoker, not required for deployment unless you wish to
        use XmlRpcInvoker
    </li>
    <li>
        <a href="http://gee.cs.oswego.edu/dl/cpj/">Doug Lea's Concurrency API</a>
        (Version 1.3.4 or later) - used by ExecutorInterceptor, not required for deployment unless you wish to
        use ExecutorInterceptor
    </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 1.0-SNAPSHOT</a>

<p>Planned Next Release: 1.0</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>Proxy</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:jcarman@apache.org">James Carman</a></li>
    <li><a href="mailto:knut@apache.org">Knut Wannheden</a></li>
    <li><a href="mailto:hohwille@users.sourceforge.net">J&#246;rg Hohwiller</a></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 apache.org and commons-dev at apache.org.
    Please prefix any emails by [proxy] to pass mail filters.
</p>

</body>
</html>