Hi there,
I briefly mentioned in one mail that it would be possible to use dynamic
proxies to provide a release-less interface for pooled components. I did
a simple proof-of-concept implementation (shown below), in case someone
might be interested. It of course works, but is far from efficient.
As I also mentioned, there's always a small performance hit associated
with dynamic proxies. In many cases this is acceptable, but I would
still suggest including a release() method of some sort in the CM
replacement interface. However, dynamic proxies could be used at some
level to provide additional functionality, such as access control.
(: A ;)
// Interfacer.java ----------------------------------------------------
public interface Interfacer
{
Object lookup( String role ) throws Exception;
}
// ComponentSource.java -----------------------------------------------
public interface ComponentSource
{
Object lookup( String role ) throws Exception;
void release( Object obj ) throws Exception;
}
// DefaultInterfacer.java ---------------------------------------------
import java.lang.reflect.Proxy;
import java.lang.reflect.Method;
import java.lang.reflect.InvocationHandler;
import org.apache.avalon.framework.thread.ThreadSafe;
public class DefaultInterfacer implements Interfacer
{
private ComponentSource m_source;
public DefaultInterfacer(ComponentSource source)
{
m_source = source;
}
public Object lookup(String role) throws Exception
{
Object component = m_source.lookup( role );
if ( component instanceof ThreadSafe ) {
return component;
}
Class[] interfaces = new Class[] { Class.forName( role ) };
InvocationHandler handler =
new ReleaseHandler( m_source, role );
return Proxy.newProxyInstance(
Thread.currentThread().getContextClassLoader(),
interfaces, handler );
}
private static class ReleaseHandler implements InvocationHandler
{
ComponentSource source;
String role;
ReleaseHandler( ComponentSource source, String role )
{
this.source = source;
this.role = role;
}
public Object invoke(Object proxy, Method method, Object[] args)
throws Throwable
{
Object component = this.source.lookup( this.role );
Object result = method.invoke( component, args );
this.source.release( component );
return result;
}
}
}
//---------------------------------------------------------------------
--
To unsubscribe, e-mail: <mailto:[EMAIL PROTECTED]>
For additional commands, e-mail: <mailto:[EMAIL PROTECTED]>