You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@commons.apache.org by jc...@apache.org on 2008/02/26 20:04:03 UTC
svn commit: r631336 - in
/commons/proper/proxy/trunk/src/main/java/org/apache/commons/proxy/factory:
cglib/CglibProxyFactory.java util/AbstractSubclassingProxyFactory.java
Author: jcarman
Date: Tue Feb 26 11:03:49 2008
New Revision: 631336
URL: http://svn.apache.org/viewvc?rev=631336&view=rev
Log:
Added in proxy class caching
Modified:
commons/proper/proxy/trunk/src/main/java/org/apache/commons/proxy/factory/cglib/CglibProxyFactory.java
commons/proper/proxy/trunk/src/main/java/org/apache/commons/proxy/factory/util/AbstractSubclassingProxyFactory.java
Modified: commons/proper/proxy/trunk/src/main/java/org/apache/commons/proxy/factory/cglib/CglibProxyFactory.java
URL: http://svn.apache.org/viewvc/commons/proper/proxy/trunk/src/main/java/org/apache/commons/proxy/factory/cglib/CglibProxyFactory.java?rev=631336&r1=631335&r2=631336&view=diff
==============================================================================
--- commons/proper/proxy/trunk/src/main/java/org/apache/commons/proxy/factory/cglib/CglibProxyFactory.java (original)
+++ commons/proper/proxy/trunk/src/main/java/org/apache/commons/proxy/factory/cglib/CglibProxyFactory.java Tue Feb 26 11:03:49 2008
@@ -21,6 +21,7 @@
import net.sf.cglib.proxy.CallbackFilter;
import net.sf.cglib.proxy.Dispatcher;
import net.sf.cglib.proxy.Enhancer;
+import net.sf.cglib.proxy.Factory;
import net.sf.cglib.proxy.MethodProxy;
import net.sf.cglib.proxy.NoOp;
import org.apache.commons.proxy.Interceptor;
@@ -28,6 +29,8 @@
import org.apache.commons.proxy.Invoker;
import org.apache.commons.proxy.ObjectProvider;
import org.apache.commons.proxy.factory.util.AbstractSubclassingProxyFactory;
+import org.apache.commons.proxy.factory.util.ProxyClassCache;
+import org.apache.commons.proxy.factory.util.ProxyClassGenerator;
import java.lang.reflect.Method;
import java.lang.reflect.Modifier;
@@ -44,93 +47,124 @@
*/
public class CglibProxyFactory extends AbstractSubclassingProxyFactory
{
-//----------------------------------------------------------------------------------------------------------------------
+//**********************************************************************************************************************
// Fields
-//----------------------------------------------------------------------------------------------------------------------
+//**********************************************************************************************************************
private static CallbackFilter callbackFilter = new PublicCallbackFilter();
+ private static final ProxyClassCache invokerClassCache = new ProxyClassCache(new InvokerProxyClassGenerator());
+ private static final ProxyClassCache interceptorClassCache = new ProxyClassCache(new InterceptorProxyClassGenerator());
+ private static final ProxyClassCache delegatorClassCache = new ProxyClassCache(new DelegatorProxyClassGenerator());
-//----------------------------------------------------------------------------------------------------------------------
-// ProxyFactory Implementation
-//----------------------------------------------------------------------------------------------------------------------
-
- public Object createDelegatorProxy( ClassLoader classLoader, ObjectProvider targetProvider,
- Class[] proxyClasses )
- {
- final Enhancer enhancer = new Enhancer();
- enhancer.setClassLoader( classLoader );
- enhancer.setInterfaces( toInterfaces( proxyClasses ) );
- enhancer.setSuperclass( getSuperclass( proxyClasses ) );
- enhancer.setCallbackFilter( callbackFilter );
- enhancer.setCallbacks( new Callback[]{ new ObjectProviderDispatcher( targetProvider ), NoOp.INSTANCE } );
- return enhancer.create();
- }
-
- public Object createInterceptorProxy( ClassLoader classLoader, Object target, Interceptor interceptor,
- Class[] proxyClasses )
- {
- final Enhancer enhancer = new Enhancer();
- enhancer.setClassLoader( classLoader );
- enhancer.setInterfaces( toInterfaces( proxyClasses ) );
- enhancer.setSuperclass( getSuperclass( proxyClasses ) );
- enhancer.setCallbackFilter( callbackFilter );
- enhancer.setCallbacks( new Callback[]{ new InterceptorBridge( target, interceptor ), NoOp.INSTANCE } );
- return enhancer.create();
- }
-
- public Object createInvokerProxy( ClassLoader classLoader, Invoker invoker,
- Class[] proxyClasses )
- {
- final Enhancer enhancer = new Enhancer();
- enhancer.setClassLoader( classLoader );
- enhancer.setInterfaces( toInterfaces( proxyClasses ) );
- enhancer.setSuperclass( getSuperclass( proxyClasses ) );
- enhancer.setCallbackFilter( callbackFilter );
- enhancer.setCallbacks( new Callback[]{ new InvokerBridge( invoker ), NoOp.INSTANCE } );
- return enhancer.create();
+//**********************************************************************************************************************
+// Other Methods
+//**********************************************************************************************************************
+
+ public Object createDelegatorProxy(ClassLoader classLoader, ObjectProvider targetProvider,
+ Class[] proxyClasses)
+ {
+ final Class proxyClass = delegatorClassCache.getProxyClass(classLoader, proxyClasses);
+ final Object proxy = instantiate(proxyClass);
+ ((Factory) proxy).setCallbacks(new Callback[]{new ObjectProviderDispatcher(targetProvider), NoOp.INSTANCE});
+ return proxy;
+ }
+
+ public Object createInterceptorProxy(ClassLoader classLoader, Object target, Interceptor interceptor,
+ Class[] proxyClasses)
+ {
+ final Class proxyClass = interceptorClassCache.getProxyClass(classLoader, proxyClasses);
+ final Object proxy = instantiate(proxyClass);
+ ((Factory) proxy).setCallbacks(new Callback[]{new InterceptorBridge(target, interceptor), NoOp.INSTANCE});
+ return proxy;
}
-//----------------------------------------------------------------------------------------------------------------------
+ public Object createInvokerProxy(ClassLoader classLoader, Invoker invoker,
+ Class[] proxyClasses)
+ {
+ final Class proxyClass = invokerClassCache.getProxyClass(classLoader, proxyClasses);
+ final Object proxy = instantiate(proxyClass);
+ ((Factory) proxy).setCallbacks(new Callback[]{new InvokerBridge(invoker), NoOp.INSTANCE});
+ return proxy;
+ }
+
+//**********************************************************************************************************************
// Inner Classes
-//----------------------------------------------------------------------------------------------------------------------
+//**********************************************************************************************************************
- private static class PublicCallbackFilter implements CallbackFilter
+ private static class DelegatorProxyClassGenerator implements ProxyClassGenerator
{
- public int accept( Method method )
+ public Class generateProxyClass(ClassLoader classLoader, Class[] proxyClasses)
{
- return Modifier.isPublic( method.getModifiers() ) ? 0 : 1;
+ final Enhancer enhancer = new Enhancer();
+ enhancer.setClassLoader(classLoader);
+ enhancer.setInterfaces(toInterfaces(proxyClasses));
+ enhancer.setSuperclass(getSuperclass(proxyClasses));
+ enhancer.setCallbackFilter(callbackFilter);
+ enhancer.setCallbackTypes(new Class[]{ObjectProviderDispatcher.class, NoOp.class});
+ enhancer.setUseFactory(true);
+ return enhancer.createClass();
}
}
- private class InvokerBridge implements net.sf.cglib.proxy.InvocationHandler
+ private class InterceptorBridge implements net.sf.cglib.proxy.MethodInterceptor
{
- private final Invoker original;
+ private final Interceptor inner;
+ private final Object target;
- public InvokerBridge( Invoker original )
+ public InterceptorBridge(Object target, Interceptor inner)
{
- this.original = original;
+ this.inner = inner;
+ this.target = target;
}
- public Object invoke( Object object, Method method, Object[] objects ) throws Throwable
+ public Object intercept(Object object, Method method, Object[] args, MethodProxy methodProxy) throws Throwable
{
- return original.invoke( object, method, objects );
+ return inner.intercept(new MethodProxyInvocation(target, method, args, methodProxy));
}
}
- private class InterceptorBridge implements net.sf.cglib.proxy.MethodInterceptor
+ private static class InterceptorProxyClassGenerator implements ProxyClassGenerator
{
- private final Interceptor inner;
- private final Object target;
+ public Class generateProxyClass(ClassLoader classLoader, Class[] proxyClasses)
+ {
+ final Enhancer enhancer = new Enhancer();
+ enhancer.setClassLoader(classLoader);
+ enhancer.setInterfaces(toInterfaces(proxyClasses));
+ enhancer.setSuperclass(getSuperclass(proxyClasses));
+ enhancer.setCallbackFilter(callbackFilter);
+ enhancer.setCallbackTypes(new Class[]{InterceptorBridge.class, NoOp.class});
+ enhancer.setUseFactory(true);
+ return enhancer.createClass();
+ }
+ }
+
+ private class InvokerBridge implements net.sf.cglib.proxy.InvocationHandler
+ {
+ private final Invoker original;
- public InterceptorBridge( Object target, Interceptor inner )
+ public InvokerBridge(Invoker original)
{
- this.inner = inner;
- this.target = target;
+ this.original = original;
+ }
+
+ public Object invoke(Object object, Method method, Object[] objects) throws Throwable
+ {
+ return original.invoke(object, method, objects);
}
+ }
- public Object intercept( Object object, Method method, Object[] args, MethodProxy methodProxy ) throws Throwable
+ private static class InvokerProxyClassGenerator implements ProxyClassGenerator
+ {
+ public Class generateProxyClass(ClassLoader classLoader, Class[] proxyClasses)
{
- return inner.intercept( new MethodProxyInvocation( target, method, args, methodProxy ) );
+ final Enhancer enhancer = new Enhancer();
+ enhancer.setClassLoader(classLoader);
+ enhancer.setInterfaces(toInterfaces(proxyClasses));
+ enhancer.setSuperclass(getSuperclass(proxyClasses));
+ enhancer.setCallbackFilter(callbackFilter);
+ enhancer.setCallbackTypes(new Class[]{InvokerBridge.class, NoOp.class});
+ enhancer.setUseFactory(true);
+ return enhancer.createClass();
}
}
@@ -141,7 +175,7 @@
private final Object[] args;
private final Object target;
- public MethodProxyInvocation( Object target, Method method, Object[] args, MethodProxy methodProxy )
+ public MethodProxyInvocation(Object target, Method method, Object[] args, MethodProxy methodProxy)
{
this.target = target;
this.method = method;
@@ -161,7 +195,7 @@
public Object proceed() throws Throwable
{
- return methodProxy.invoke( target, args );
+ return methodProxy.invoke(target, args);
}
public Object getProxy()
@@ -174,7 +208,7 @@
{
private final ObjectProvider delegateProvider;
- public ObjectProviderDispatcher( ObjectProvider delegateProvider )
+ public ObjectProviderDispatcher(ObjectProvider delegateProvider)
{
this.delegateProvider = delegateProvider;
}
@@ -182,6 +216,14 @@
public Object loadObject()
{
return delegateProvider.getObject();
+ }
+ }
+
+ private static class PublicCallbackFilter implements CallbackFilter
+ {
+ public int accept(Method method)
+ {
+ return Modifier.isPublic(method.getModifiers()) ? 0 : 1;
}
}
}
Modified: commons/proper/proxy/trunk/src/main/java/org/apache/commons/proxy/factory/util/AbstractSubclassingProxyFactory.java
URL: http://svn.apache.org/viewvc/commons/proper/proxy/trunk/src/main/java/org/apache/commons/proxy/factory/util/AbstractSubclassingProxyFactory.java?rev=631336&r1=631335&r2=631336&view=diff
==============================================================================
--- commons/proper/proxy/trunk/src/main/java/org/apache/commons/proxy/factory/util/AbstractSubclassingProxyFactory.java (original)
+++ commons/proper/proxy/trunk/src/main/java/org/apache/commons/proxy/factory/util/AbstractSubclassingProxyFactory.java Tue Feb 26 11:03:49 2008
@@ -155,5 +155,26 @@
throw new ProxyFactoryException( errorMessage.toString() );
}
}
+
+ /**
+ * Helper method for instantiating a proxy object from its proxy class. Uses the default constructor.
+ * @param proxyClass the proxy class
+ * @return a proxy object
+ */
+ protected static Object instantiate(Class proxyClass)
+ {
+ try
+ {
+ return proxyClass.newInstance();
+ }
+ catch (InstantiationException e)
+ {
+ throw new ProxyFactoryException("Unable to instantiate proxy object from proxy class.", e);
+ }
+ catch (IllegalAccessException e)
+ {
+ throw new ProxyFactoryException("Unable to instantiate proxy object from proxy class.", e);
+ }
+ }
}