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

<body bgcolor="white">

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

<h3>(0) Rationale</h3>

<p>
    Many projects require the use of proxies in order to support such features as method interception/decoration, lazy
    loading, dependency injection, etc. There are many different techniques for creating proxy objects which delegate to
    other objects (JDK proxies, CGLIB, and Javassist to name a few). Using these technologies can prove to be quite
    daunting. This package seeks to abstract away the difficult code required to implement proxies effectively and
    efficiently so that developers can concentrate on implementing the core implementations and method interceptors.
</p>

<h3>(1) Scope of the Package</h3>

<p>
    The package shall create and maintain a suite of utility classes for creating dynamic proxy objects written in the
    Java language to be distributed under the ASF license.  The package will include many different "core object
    provider" implementations supporting many existing remoting technologies (EJB, Hessian, Burlap, JAX-RPC, Apache
    XML-RPC, RMI, etc.) as well as many other "in-vm" implementations (bean instantiation, cloning, constant, etc.).
    The package will also provide "decorator object providers" which add functionality to the object providers they wrap
    such as pooling, singleton, caching, etc.  The package will also serve as a repository for many useful interceptor
    implementations which support such features as logging, asynchronous invocation, etc.  The package will provide
    multiple "proxy factory" implementations, supporting different proxying technologies (JDK proxies, CGLIB, Javassist,
    etc.).
</p>

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

<p>
    <em>Proxy</em> utilizes the JUnit unit testing framework for developing and executing unit tests, but this is of
    interest only to developers of the component. The original will include support for the Hessian and Burlap remoting
    protocols.  The original codebase will also include support for CGLIB and Javassist-base proxies.
</p>

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

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

<p>
    The initial codebase will be contributed by James Carman based on code in the Syringe (http://syringe.dev.java.net)
    project and can be distributed under the Apache license.
</p>

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


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

<ul>
    <li>SVN Repository - New directory <code>proxy</code> in the
        <code>jakarta-commons</code> SVN 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
        [proxy].</li>
    <li>Bugzilla - New component "Proxy" under the "Commons" product
        category, with appropriate version identifiers as needed.</li>
    <li>Jyve FAQ - New category "commons-proxy" (when available). </li>
</ul>


<h3>(4) Initial Committers</h3>
<ul>
    <li>James Carman</li>
</ul>
</body>
</html>