You are viewing a plain text version of this content. The canonical link for it is here.
Posted to dev@commons.apache.org by jc...@apache.org on 2005/09/05 17:39:11 UTC

svn commit: r278781 - in /jakarta/commons/sandbox/proxy/trunk/src: java/org/apache/commons/proxy/ java/org/apache/commons/proxy/factory/cglib/ java/org/apache/commons/proxy/factory/javassist/ java/org/apache/commons/proxy/factory/reflect/ java/org/apac...

Author: jcarman
Date: Mon Sep  5 08:39:02 2005
New Revision: 278781

URL: http://svn.apache.org/viewcvs?rev=278781&view=rev
Log:
Implementing subclass proxy support.

Added:
    jakarta/commons/sandbox/proxy/trunk/src/java/org/apache/commons/proxy/factory/util/AbstractSubclassingProxyFactory.java   (with props)
    jakarta/commons/sandbox/proxy/trunk/src/test/org/apache/commons/proxy/factory/AbstractSubclassingProxyFactoryTestCase.java   (with props)
Modified:
    jakarta/commons/sandbox/proxy/trunk/src/java/org/apache/commons/proxy/ProxyFactory.java
    jakarta/commons/sandbox/proxy/trunk/src/java/org/apache/commons/proxy/ProxyUtils.java
    jakarta/commons/sandbox/proxy/trunk/src/java/org/apache/commons/proxy/factory/cglib/CglibProxyFactory.java
    jakarta/commons/sandbox/proxy/trunk/src/java/org/apache/commons/proxy/factory/javassist/JavassistProxyFactory.java
    jakarta/commons/sandbox/proxy/trunk/src/java/org/apache/commons/proxy/factory/javassist/JavassistUtils.java
    jakarta/commons/sandbox/proxy/trunk/src/java/org/apache/commons/proxy/factory/reflect/AbstractInvocationHandler.java
    jakarta/commons/sandbox/proxy/trunk/src/java/org/apache/commons/proxy/factory/reflect/ReflectionProxyFactory.java
    jakarta/commons/sandbox/proxy/trunk/src/java/org/apache/commons/proxy/factory/util/AbstractProxyClassGenerator.java
    jakarta/commons/sandbox/proxy/trunk/src/java/org/apache/commons/proxy/factory/util/AbstractProxyFactory.java
    jakarta/commons/sandbox/proxy/trunk/src/java/org/apache/commons/proxy/factory/util/ProxyClassCache.java
    jakarta/commons/sandbox/proxy/trunk/src/java/org/apache/commons/proxy/factory/util/ProxyClassGenerator.java
    jakarta/commons/sandbox/proxy/trunk/src/java/org/apache/commons/proxy/interceptor/MethodInterceptorChain.java
    jakarta/commons/sandbox/proxy/trunk/src/test/org/apache/commons/proxy/factory/AbstractProxyFactoryTestCase.java
    jakarta/commons/sandbox/proxy/trunk/src/test/org/apache/commons/proxy/factory/cglib/TestCglibProxyFactory.java
    jakarta/commons/sandbox/proxy/trunk/src/test/org/apache/commons/proxy/factory/javassist/TestJavassistProxyFactory.java

Modified: jakarta/commons/sandbox/proxy/trunk/src/java/org/apache/commons/proxy/ProxyFactory.java
URL: http://svn.apache.org/viewcvs/jakarta/commons/sandbox/proxy/trunk/src/java/org/apache/commons/proxy/ProxyFactory.java?rev=278781&r1=278780&r2=278781&view=diff
==============================================================================
--- jakarta/commons/sandbox/proxy/trunk/src/java/org/apache/commons/proxy/ProxyFactory.java (original)
+++ jakarta/commons/sandbox/proxy/trunk/src/java/org/apache/commons/proxy/ProxyFactory.java Mon Sep  5 08:39:02 2005
@@ -39,66 +39,77 @@
      * generated using the current thread's "context class loader."
      *
      * @param delegateProvider the delegate provider
-     * @param proxyInterfaces  the interfaces that the proxy should implement
+     * @param proxyClasses     the interfaces that the proxy should implement
      * @return a proxy which delegates to the object provided by the target object provider
      */
-    public Object createDelegatorProxy( ObjectProvider delegateProvider, Class... proxyInterfaces );
+    public Object createDelegatorProxy( ObjectProvider delegateProvider, Class... proxyClasses );
 
     /**
      * Creates a proxy which delegates to the object provided by <code>delegateProvider</code>.
      *
      * @param classLoader      the class loader to use when generating the proxy
      * @param delegateProvider the delegate provider
-     * @param proxyInterfaces  the interfaces that the proxy should implement
+     * @param proxyClasses     the interfaces that the proxy should implement
      * @return a proxy which delegates to the object provided by the target <code>delegateProvider>
      */
     public Object createDelegatorProxy( ClassLoader classLoader, ObjectProvider delegateProvider,
-                                        Class... proxyInterfaces );
+                                        Class... proxyClasses );
 
     /**
      * Creates a proxy which passes through a {@link MethodInterceptor method interceptor} before eventually reaching
      * the <code>target</code> object.  The proxy will be generated using the current thread's "context class loader."
      *
-     * @param target          the target object
-     * @param interceptor     the method interceptor
-     * @param proxyInterfaces the interfaces that the proxy should implement
+     * @param target       the target object
+     * @param interceptor  the method interceptor
+     * @param proxyClasses the interfaces that the proxy should implement
      * @return a proxy which passes through a {@link MethodInterceptor method interceptor} before eventually reaching
      *         the <code>target</code> object.
      */
-    public Object createInterceptorProxy( Object target, MethodInterceptor interceptor, Class... proxyInterfaces );
+    public Object createInterceptorProxy( Object target, MethodInterceptor interceptor, Class... proxyClasses );
+
     /**
      * Creates a proxy which passes through a {@link org.aopalliance.intercept.MethodInterceptor method interceptor}
      * before eventually reaching the <code>target</code> object.
      *
-     * @param classLoader     the class loader to use when generating the proxy
-     * @param target          the target object
-     * @param interceptor     the method interceptor
-     * @param proxyInterfaces the interfaces that the proxy should implement.
+     * @param classLoader  the class loader to use when generating the proxy
+     * @param target       the target object
+     * @param interceptor  the method interceptor
+     * @param proxyClasses the interfaces that the proxy should implement.
      * @return a proxy which passes through a {@link org.aopalliance.intercept.MethodInterceptor method interceptor}
      *         before eventually reaching the <code>target</code> object.
      */
     public Object createInterceptorProxy( ClassLoader classLoader, Object target, MethodInterceptor interceptor,
-                                          Class... proxyInterfaces );
+                                          Class... proxyClasses );
 
     /**
      * Creates a proxy which uses the provided {@link InvocationHandler} to handle all method invocations.  The proxy
      * will be generated using the current thread's "context class loader."
      *
      * @param invocationHandler the invocation handler
-     * @param proxyInterfaces   the interfaces that the proxy should implement
+     * @param proxyClasses      the interfaces that the proxy should implement
      * @return a proxy which uses the provided {@link InvocationHandler} to handle all method invocations
      */
-    public Object createInvocationHandlerProxy( InvocationHandler invocationHandler, Class... proxyInterfaces );
+    public Object createInvocationHandlerProxy( InvocationHandler invocationHandler, Class... proxyClasses );
 
     /**
      * Creates a proxy which uses the provided {@link InvocationHandler} to handle all method invocations.
      *
      * @param classLoader       the class loader to use when generating the proxy
      * @param invocationHandler the invocation handler
-     * @param proxyInterfaces   the interfaces that the proxy should implement
+     * @param proxyClasses      the interfaces that the proxy should implement
      * @return a proxy which uses the provided {@link InvocationHandler} to handle all method invocations
      */
     public Object createInvocationHandlerProxy( ClassLoader classLoader, InvocationHandler invocationHandler,
-                                                Class... proxyInterfaces );
+                                                Class... proxyClasses );
+
+    /**
+     * Returns true if this proxy factory can generate a proxy class which extends/implements
+     * the <code>proxyClasses</code>.
+     *
+     * @param proxyClasses the desired proxy classes
+     * @return true if this proxy factory can generate a proxy class which extends/implements
+     *         the <code>proxyClasses</code>.
+     */
+    public boolean canProxy( Class... proxyClasses );
 }
 

Modified: jakarta/commons/sandbox/proxy/trunk/src/java/org/apache/commons/proxy/ProxyUtils.java
URL: http://svn.apache.org/viewcvs/jakarta/commons/sandbox/proxy/trunk/src/java/org/apache/commons/proxy/ProxyUtils.java?rev=278781&r1=278780&r2=278781&view=diff
==============================================================================
--- jakarta/commons/sandbox/proxy/trunk/src/java/org/apache/commons/proxy/ProxyUtils.java (original)
+++ jakarta/commons/sandbox/proxy/trunk/src/java/org/apache/commons/proxy/ProxyUtils.java Mon Sep  5 08:39:02 2005
@@ -25,25 +25,25 @@
 public class ProxyUtils
 {
     /**
-     * Creates a "null object" which implements the <code>proxyInterfaces</code>.
+     * Creates a "null object" which implements the <code>proxyClasses</code>.
      * @param proxyFactory the proxy factory to be used to create the proxy object
-     * @param proxyInterfaces the proxy interfaces
-     * @return a "null object" which implements the <code>proxyInterfaces</code>.
+     * @param proxyClasses the proxy interfaces
+     * @return a "null object" which implements the <code>proxyClasses</code>.
      */
-    public static Object createNullObject( ProxyFactory proxyFactory, Class... proxyInterfaces )
+    public static Object createNullObject( ProxyFactory proxyFactory, Class... proxyClasses )
     {
-        return proxyFactory.createInvocationHandlerProxy( new NullInvocationHandler(), proxyInterfaces );
+        return proxyFactory.createInvocationHandlerProxy( new NullInvocationHandler(), proxyClasses );
     }
 
     /**
-     * Creates a "null object" which implements the <code>proxyInterfaces</code>.
+     * Creates a "null object" which implements the <code>proxyClasses</code>.
      * @param proxyFactory the proxy factory to be used to create the proxy object
      * @param classLoader the class loader to be used by the proxy factory to create the proxy object
-     * @param proxyInterfaces the proxy interfaces
-     * @return a "null object" which implements the <code>proxyInterfaces</code>.
+     * @param proxyClasses the proxy interfaces
+     * @return a "null object" which implements the <code>proxyClasses</code>.
      */
-    public static Object createNullObject( ProxyFactory proxyFactory, ClassLoader classLoader, Class... proxyInterfaces )
+    public static Object createNullObject( ProxyFactory proxyFactory, ClassLoader classLoader, Class... proxyClasses )
     {
-        return proxyFactory.createInvocationHandlerProxy( classLoader, new NullInvocationHandler(), proxyInterfaces );
+        return proxyFactory.createInvocationHandlerProxy( classLoader, new NullInvocationHandler(), proxyClasses );
     }
 }

Modified: jakarta/commons/sandbox/proxy/trunk/src/java/org/apache/commons/proxy/factory/cglib/CglibProxyFactory.java
URL: http://svn.apache.org/viewcvs/jakarta/commons/sandbox/proxy/trunk/src/java/org/apache/commons/proxy/factory/cglib/CglibProxyFactory.java?rev=278781&r1=278780&r2=278781&view=diff
==============================================================================
--- jakarta/commons/sandbox/proxy/trunk/src/java/org/apache/commons/proxy/factory/cglib/CglibProxyFactory.java (original)
+++ jakarta/commons/sandbox/proxy/trunk/src/java/org/apache/commons/proxy/factory/cglib/CglibProxyFactory.java Mon Sep  5 08:39:02 2005
@@ -22,7 +22,7 @@
 import org.aopalliance.intercept.MethodInterceptor;
 import org.aopalliance.intercept.MethodInvocation;
 import org.apache.commons.proxy.ObjectProvider;
-import org.apache.commons.proxy.factory.util.AbstractProxyFactory;
+import org.apache.commons.proxy.factory.util.AbstractSubclassingProxyFactory;
 
 import java.lang.reflect.AccessibleObject;
 import java.lang.reflect.InvocationHandler;
@@ -35,38 +35,41 @@
  * @author James Carman
  * @version 1.0
  */
-public class CglibProxyFactory extends AbstractProxyFactory
+public class CglibProxyFactory extends AbstractSubclassingProxyFactory
 {
 //----------------------------------------------------------------------------------------------------------------------
 // ProxyFactory Implementation
 //----------------------------------------------------------------------------------------------------------------------
 
     public Object createDelegatorProxy( ClassLoader classLoader, ObjectProvider targetProvider,
-                                        Class... proxyInterfaces )
+                                        Class... proxyClasses )
     {
         final Enhancer enhancer = new Enhancer();
         enhancer.setClassLoader( classLoader );
-        enhancer.setInterfaces( proxyInterfaces );
+        enhancer.setInterfaces( toInterfaces( proxyClasses ) );
+        enhancer.setSuperclass( getSuperclass( proxyClasses ) );
         enhancer.setCallback( new ObjectProviderDispatcher( targetProvider ) );
         return enhancer.create();
     }
 
     public Object createInterceptorProxy( ClassLoader classLoader, Object target, MethodInterceptor interceptor,
-                                          Class... proxyInterfaces )
+                                          Class... proxyClasses )
     {
         final Enhancer enhancer = new Enhancer();
         enhancer.setClassLoader( classLoader );
-        enhancer.setInterfaces( proxyInterfaces );
+        enhancer.setInterfaces( toInterfaces( proxyClasses ) );
+        enhancer.setSuperclass( getSuperclass( proxyClasses ) );
         enhancer.setCallback( new InterceptorBridge( target, interceptor ) );
         return enhancer.create();
     }
 
     public Object createInvocationHandlerProxy( ClassLoader classLoader, InvocationHandler invocationHandler,
-                                                Class... proxyInterfaces )
+                                                Class... proxyClasses )
     {
         final Enhancer enhancer = new Enhancer();
         enhancer.setClassLoader( classLoader );
-        enhancer.setInterfaces( proxyInterfaces );
+        enhancer.setInterfaces( toInterfaces( proxyClasses ) );
+        enhancer.setSuperclass( getSuperclass( proxyClasses ) );
         enhancer.setCallback( new InvocationHandlerBridge( invocationHandler ) );
         return enhancer.create();
     }

Modified: jakarta/commons/sandbox/proxy/trunk/src/java/org/apache/commons/proxy/factory/javassist/JavassistProxyFactory.java
URL: http://svn.apache.org/viewcvs/jakarta/commons/sandbox/proxy/trunk/src/java/org/apache/commons/proxy/factory/javassist/JavassistProxyFactory.java?rev=278781&r1=278780&r2=278781&view=diff
==============================================================================
--- jakarta/commons/sandbox/proxy/trunk/src/java/org/apache/commons/proxy/factory/javassist/JavassistProxyFactory.java (original)
+++ jakarta/commons/sandbox/proxy/trunk/src/java/org/apache/commons/proxy/factory/javassist/JavassistProxyFactory.java Mon Sep  5 08:39:02 2005
@@ -21,11 +21,12 @@
 import javassist.CtConstructor;
 import javassist.CtMethod;
 import org.aopalliance.intercept.MethodInterceptor;
+import org.apache.commons.logging.LogFactory;
 import org.apache.commons.proxy.ObjectProvider;
 import org.apache.commons.proxy.exception.ProxyFactoryException;
 import org.apache.commons.proxy.factory.util.AbstractProxyClassGenerator;
-import org.apache.commons.proxy.factory.util.AbstractProxyFactory;
 import org.apache.commons.proxy.factory.util.ProxyClassCache;
+import org.apache.commons.proxy.factory.util.AbstractSubclassingProxyFactory;
 
 import java.lang.reflect.InvocationHandler;
 import java.lang.reflect.Method;
@@ -37,12 +38,11 @@
  * @author James Carman
  * @version 1.0
  */
-public class JavassistProxyFactory extends AbstractProxyFactory
+public class JavassistProxyFactory extends AbstractSubclassingProxyFactory
 {
 //----------------------------------------------------------------------------------------------------------------------
 // Fields
 //----------------------------------------------------------------------------------------------------------------------
-
     private static final ProxyClassCache delegatingProxyClassCache = new ProxyClassCache(
             new DelegatingProxyClassGenerator() );
     private static final ProxyClassCache interceptingProxyClassCache = new ProxyClassCache(
@@ -55,11 +55,11 @@
 //----------------------------------------------------------------------------------------------------------------------
 
     public Object createDelegatorProxy( ClassLoader classLoader, ObjectProvider targetProvider,
-                                        Class... proxyInterfaces )
+                                        Class... proxyClasses )
     {
         try
         {
-            final Class clazz = delegatingProxyClassCache.getProxyClass( classLoader, proxyInterfaces );
+            final Class clazz = delegatingProxyClassCache.getProxyClass( classLoader, proxyClasses );
             return clazz.getConstructor( ObjectProvider.class ).newInstance( targetProvider );
         }
         catch( Exception e )
@@ -69,12 +69,12 @@
     }
 
     public Object createInterceptorProxy( ClassLoader classLoader, Object target, MethodInterceptor interceptor,
-                                          Class... proxyInterfaces )
+                                          Class... proxyClasses )
     {
         try
         {
-            final Class clazz = interceptingProxyClassCache.getProxyClass( classLoader, proxyInterfaces );
-            final Method[] methods = AbstractProxyClassGenerator.getImplementationMethods( proxyInterfaces );
+            final Class clazz = interceptingProxyClassCache.getProxyClass( classLoader, proxyClasses );
+            final Method[] methods = AbstractProxyClassGenerator.getImplementationMethods( proxyClasses );
             return clazz.getConstructor( Method[].class, Object.class, MethodInterceptor.class )
                     .newInstance( methods, target, interceptor );
         }
@@ -85,12 +85,12 @@
     }
 
     public Object createInvocationHandlerProxy( ClassLoader classLoader, InvocationHandler invocationHandler,
-                                                Class... proxyInterfaces )
+                                                Class... proxyClasses )
     {
         try
         {
-            final Class clazz = invocationHandlerProxyClassCache.getProxyClass( classLoader, proxyInterfaces );
-            final Method[] methods = AbstractProxyClassGenerator.getImplementationMethods( proxyInterfaces );
+            final Class clazz = invocationHandlerProxyClassCache.getProxyClass( classLoader, proxyClasses );
+            final Method[] methods = AbstractProxyClassGenerator.getImplementationMethods( proxyClasses );
             return clazz.getConstructor( Method[].class, InvocationHandler.class )
                     .newInstance( methods, invocationHandler );
         }
@@ -106,13 +106,13 @@
 
     private static class InvocationHandlerProxyClassGenerator extends AbstractProxyClassGenerator
     {
-        public Class generateProxyClass( ClassLoader classLoader, Class... proxyInterfaces )
+        public Class generateProxyClass( ClassLoader classLoader, Class... proxyClasses )
         {
             try
             {
-                final CtClass proxyClass = JavassistUtils.createClass();
-                final Method[] methods = getImplementationMethods( proxyInterfaces );
-                JavassistUtils.addInterfaces( proxyClass, proxyInterfaces );
+                final CtClass proxyClass = JavassistUtils.createClass( getSuperclass( proxyClasses ) );
+                final Method[] methods = getImplementationMethods( proxyClasses );
+                JavassistUtils.addInterfaces( proxyClass, toInterfaces( proxyClasses ) );
                 JavassistUtils.addField( Method[].class, "methods", proxyClass );
                 JavassistUtils.addField( InvocationHandler.class, "invocationHandler", proxyClass );
                 final CtConstructor proxyConstructor = new CtConstructor(
@@ -124,6 +124,8 @@
                 proxyClass.addConstructor( proxyConstructor );
                 for( int i = 0; i < methods.length; ++i )
                 {
+                    LogFactory.getLog( getClass() )
+                            .debug( "Adding method " + methods[i] + " to delegating proxy class..." );
                     final CtMethod method = new CtMethod( JavassistUtils.resolve( methods[i].getReturnType() ),
                                                           methods[i].getName(),
                                                           JavassistUtils.resolve( methods[i].getParameterTypes() ),
@@ -144,13 +146,13 @@
 
     private static class InterceptingProxyClassGenerator extends AbstractProxyClassGenerator
     {
-        public Class generateProxyClass( ClassLoader classLoader, Class... proxyInterfaces )
+        public Class generateProxyClass( ClassLoader classLoader, Class... proxyClasses )
         {
             try
             {
-                final CtClass proxyClass = JavassistUtils.createClass();
-                final Method[] methods = getImplementationMethods( proxyInterfaces );
-                JavassistUtils.addInterfaces( proxyClass, proxyInterfaces );
+                final CtClass proxyClass = JavassistUtils.createClass( getSuperclass( proxyClasses ) );
+                final Method[] methods = getImplementationMethods( proxyClasses );
+                JavassistUtils.addInterfaces( proxyClass, toInterfaces( proxyClasses ) );
                 JavassistUtils.addField( Method[].class, "methods", proxyClass );
                 JavassistUtils.addField( Object.class, "target", proxyClass );
                 JavassistUtils.addField( MethodInterceptor.class, "interceptor", proxyClass );
@@ -185,19 +187,19 @@
 
     private static class DelegatingProxyClassGenerator extends AbstractProxyClassGenerator
     {
-        public Class generateProxyClass( ClassLoader classLoader, Class... proxyInterfaces )
+        public Class generateProxyClass( ClassLoader classLoader, Class... proxyClasses )
         {
             try
             {
-                final CtClass proxyClass = JavassistUtils.createClass();
+                final CtClass proxyClass = JavassistUtils.createClass( getSuperclass( proxyClasses ) );
                 JavassistUtils.addField( ObjectProvider.class, "provider", proxyClass );
                 final CtConstructor proxyConstructor = new CtConstructor(
                         JavassistUtils.resolve( new Class[]{ObjectProvider.class} ),
                         proxyClass );
                 proxyConstructor.setBody( "{ this.provider = $1; }" );
                 proxyClass.addConstructor( proxyConstructor );
-                JavassistUtils.addInterfaces( proxyClass, proxyInterfaces );
-                final Method[] methods = getImplementationMethods( proxyInterfaces );
+                JavassistUtils.addInterfaces( proxyClass, toInterfaces( proxyClasses ) );
+                final Method[] methods = getImplementationMethods( proxyClasses );
                 for( int i = 0; i < methods.length; ++i )
                 {
                     final Method method = methods[i];
@@ -209,6 +211,7 @@
                                       " )provider.getObject() )." +
                                       method.getName() + "($$); }" );
                     proxyClass.addMethod( ctMethod );
+
                 }
                 return proxyClass.toClass( classLoader );
             }

Modified: jakarta/commons/sandbox/proxy/trunk/src/java/org/apache/commons/proxy/factory/javassist/JavassistUtils.java
URL: http://svn.apache.org/viewcvs/jakarta/commons/sandbox/proxy/trunk/src/java/org/apache/commons/proxy/factory/javassist/JavassistUtils.java?rev=278781&r1=278780&r2=278781&view=diff
==============================================================================
--- jakarta/commons/sandbox/proxy/trunk/src/java/org/apache/commons/proxy/factory/javassist/JavassistUtils.java (original)
+++ jakarta/commons/sandbox/proxy/trunk/src/java/org/apache/commons/proxy/factory/javassist/JavassistUtils.java Mon Sep  5 08:39:02 2005
@@ -69,11 +69,11 @@
         return inputClass.getName();
     }
 
-    public static void addInterfaces( CtClass ctClass, Class... proxyInterfaces )
+    public static void addInterfaces( CtClass ctClass, Class... proxyClasses )
     {
-        for( int i = 0; i < proxyInterfaces.length; i++ )
+        for( int i = 0; i < proxyClasses.length; i++ )
         {
-            Class proxyInterface = proxyInterfaces[i];
+            Class proxyInterface = proxyClasses[i];
             ctClass.addInterface( resolve( proxyInterface ) );
         }
     }

Modified: jakarta/commons/sandbox/proxy/trunk/src/java/org/apache/commons/proxy/factory/reflect/AbstractInvocationHandler.java
URL: http://svn.apache.org/viewcvs/jakarta/commons/sandbox/proxy/trunk/src/java/org/apache/commons/proxy/factory/reflect/AbstractInvocationHandler.java?rev=278781&r1=278780&r2=278781&view=diff
==============================================================================
--- jakarta/commons/sandbox/proxy/trunk/src/java/org/apache/commons/proxy/factory/reflect/AbstractInvocationHandler.java (original)
+++ jakarta/commons/sandbox/proxy/trunk/src/java/org/apache/commons/proxy/factory/reflect/AbstractInvocationHandler.java Mon Sep  5 08:39:02 2005
@@ -34,24 +34,24 @@
     /**
      * Creates a proxy object which implements the specified proxy interfaces.
      *
-     * @param proxyInterfaces the proxy interfaces
+     * @param proxyClasses the proxy interfaces
      * @return a proxy object which implements the specified proxy interfaces
      */
-    public Object createProxy( Class... proxyInterfaces )
+    public Object createProxy( Class... proxyClasses )
     {
-        return createProxy( Thread.currentThread().getContextClassLoader(), proxyInterfaces );
+        return createProxy( Thread.currentThread().getContextClassLoader(), proxyClasses );
     }
 
     /**
      * Creates a proxy object which implements the specified proxy interfaces, using the specified class loader.
      *
      * @param classLoader     the class loader
-     * @param proxyInterfaces the proxy interfaces
+     * @param proxyClasses the proxy interfaces
      * @return a proxy object which implements the specified proxy interfaces, using the specified class loader.
      */
-    public Object createProxy( ClassLoader classLoader, Class... proxyInterfaces )
+    public Object createProxy( ClassLoader classLoader, Class... proxyClasses )
     {
-        return Proxy.newProxyInstance( classLoader, proxyInterfaces, this );
+        return Proxy.newProxyInstance( classLoader, proxyClasses, this );
     }
 }
 

Modified: jakarta/commons/sandbox/proxy/trunk/src/java/org/apache/commons/proxy/factory/reflect/ReflectionProxyFactory.java
URL: http://svn.apache.org/viewcvs/jakarta/commons/sandbox/proxy/trunk/src/java/org/apache/commons/proxy/factory/reflect/ReflectionProxyFactory.java?rev=278781&r1=278780&r2=278781&view=diff
==============================================================================
--- jakarta/commons/sandbox/proxy/trunk/src/java/org/apache/commons/proxy/factory/reflect/ReflectionProxyFactory.java (original)
+++ jakarta/commons/sandbox/proxy/trunk/src/java/org/apache/commons/proxy/factory/reflect/ReflectionProxyFactory.java Mon Sep  5 08:39:02 2005
@@ -36,23 +36,23 @@
 //----------------------------------------------------------------------------------------------------------------------
 
     public Object createDelegatorProxy( ClassLoader classLoader, ObjectProvider targetProvider,
-                                        Class... proxyInterfaces )
+                                        Class... proxyClasses )
     {
-        return Proxy.newProxyInstance( classLoader, proxyInterfaces,
+        return Proxy.newProxyInstance( classLoader, proxyClasses,
                                        new DelegateProviderInvocationHandler( targetProvider ) );
     }
 
     public Object createInterceptorProxy( ClassLoader classLoader, Object target, MethodInterceptor interceptor,
-                                          Class... proxyInterfaces )
+                                          Class... proxyClasses )
     {
         return new MethodInterceptorInvocationHandler( target, interceptor )
-                .createProxy( classLoader, proxyInterfaces );
+                .createProxy( classLoader, proxyClasses );
     }
 
     public Object createInvocationHandlerProxy( ClassLoader classLoader, InvocationHandler invocationHandler,
-                                                Class... proxyInterfaces )
+                                                Class... proxyClasses )
     {
-        return Proxy.newProxyInstance( classLoader, proxyInterfaces, invocationHandler );
+        return Proxy.newProxyInstance( classLoader, proxyClasses, invocationHandler );
     }
 }
 

Modified: jakarta/commons/sandbox/proxy/trunk/src/java/org/apache/commons/proxy/factory/util/AbstractProxyClassGenerator.java
URL: http://svn.apache.org/viewcvs/jakarta/commons/sandbox/proxy/trunk/src/java/org/apache/commons/proxy/factory/util/AbstractProxyClassGenerator.java?rev=278781&r1=278780&r2=278781&view=diff
==============================================================================
--- jakarta/commons/sandbox/proxy/trunk/src/java/org/apache/commons/proxy/factory/util/AbstractProxyClassGenerator.java (original)
+++ jakarta/commons/sandbox/proxy/trunk/src/java/org/apache/commons/proxy/factory/util/AbstractProxyClassGenerator.java Mon Sep  5 08:39:02 2005
@@ -17,6 +17,7 @@
 package org.apache.commons.proxy.factory.util;
 
 import java.lang.reflect.Method;
+import java.lang.reflect.Modifier;
 import java.util.HashSet;
 import java.util.LinkedList;
 import java.util.List;
@@ -39,21 +40,21 @@
      * are no method signature clashes. For methods with the same signature (name and parameter types), the one
      * encountered first will be returned in the result.
      *
-     * @param proxyInterfaces the interfaces the proxy class must implement
+     * @param proxyClasses the interfaces the proxy class must implement
      * @return all methods that the proxy class must implement
      */
-    public static Method[] getImplementationMethods( Class... proxyInterfaces )
+    public static Method[] getImplementationMethods( Class... proxyClasses )
     {
         final Set<MethodSignature> signatures = new HashSet<MethodSignature>();
         final List<Method> resultingMethods = new LinkedList<Method>();
-        for( int i = 0; i < proxyInterfaces.length; i++ )
+        for( int i = 0; i < proxyClasses.length; i++ )
         {
-            Class proxyInterface = proxyInterfaces[i];
+            Class proxyInterface = proxyClasses[i];
             final Method[] methods = proxyInterface.getMethods();
             for( int j = 0; j < methods.length; j++ )
             {
                 final MethodSignature signature = new MethodSignature( methods[j] );
-                if( !signatures.contains( signature ) )
+                if( !signatures.contains( signature ) && !Modifier.isFinal( methods[j].getModifiers() ) )
                 {
                     signatures.add( signature );
                     resultingMethods.add( methods[j] );

Modified: jakarta/commons/sandbox/proxy/trunk/src/java/org/apache/commons/proxy/factory/util/AbstractProxyFactory.java
URL: http://svn.apache.org/viewcvs/jakarta/commons/sandbox/proxy/trunk/src/java/org/apache/commons/proxy/factory/util/AbstractProxyFactory.java?rev=278781&r1=278780&r2=278781&view=diff
==============================================================================
--- jakarta/commons/sandbox/proxy/trunk/src/java/org/apache/commons/proxy/factory/util/AbstractProxyFactory.java (original)
+++ jakarta/commons/sandbox/proxy/trunk/src/java/org/apache/commons/proxy/factory/util/AbstractProxyFactory.java Mon Sep  5 08:39:02 2005
@@ -21,8 +21,12 @@
 import org.apache.commons.logging.LogFactory;
 import org.apache.commons.proxy.ObjectProvider;
 import org.apache.commons.proxy.ProxyFactory;
+import org.apache.commons.proxy.exception.ProxyFactoryException;
 
 import java.lang.reflect.InvocationHandler;
+import java.util.Iterator;
+import java.util.LinkedList;
+import java.util.Collection;
 
 /**
  * A helpful superclass for {@link org.apache.commons.proxy.ProxyFactory} implementations.
@@ -56,21 +60,34 @@
 // ProxyFactory Implementation
 //----------------------------------------------------------------------------------------------------------------------
 
-    public final Object createDelegatorProxy( ObjectProvider targetProvider, Class... proxyInterfaces )
+    public final Object createDelegatorProxy( ObjectProvider targetProvider, Class... proxyClasses )
     {
-        return createDelegatorProxy( Thread.currentThread().getContextClassLoader(), targetProvider, proxyInterfaces );
+        return createDelegatorProxy( Thread.currentThread().getContextClassLoader(), targetProvider, proxyClasses );
     }
 
     public final Object createInterceptorProxy( Object target, MethodInterceptor interceptor,
-                                                Class... proxyInterfaces )
+                                                Class... proxyClasses )
     {
         return createInterceptorProxy( Thread.currentThread().getContextClassLoader(), target, interceptor,
-                                       proxyInterfaces );
+                                       proxyClasses );
     }
 
-    public final Object createInvocationHandlerProxy( InvocationHandler invocationHandler, Class... proxyInterfaces )
+    public final Object createInvocationHandlerProxy( InvocationHandler invocationHandler, Class... proxyClasses )
     {
         return createInvocationHandlerProxy( Thread.currentThread().getContextClassLoader(), invocationHandler,
-                                             proxyInterfaces );
+                                             proxyClasses );
+    }
+
+    public boolean canProxy( Class... proxyClasses )
+    {
+        for( int i = 0; i < proxyClasses.length; i++ )
+        {
+            Class proxyClass = proxyClasses[i];
+            if( !proxyClass.isInterface() )
+            {
+                return false;
+            }
+        }
+        return true;
     }
 }

Added: jakarta/commons/sandbox/proxy/trunk/src/java/org/apache/commons/proxy/factory/util/AbstractSubclassingProxyFactory.java
URL: http://svn.apache.org/viewcvs/jakarta/commons/sandbox/proxy/trunk/src/java/org/apache/commons/proxy/factory/util/AbstractSubclassingProxyFactory.java?rev=278781&view=auto
==============================================================================
--- jakarta/commons/sandbox/proxy/trunk/src/java/org/apache/commons/proxy/factory/util/AbstractSubclassingProxyFactory.java (added)
+++ jakarta/commons/sandbox/proxy/trunk/src/java/org/apache/commons/proxy/factory/util/AbstractSubclassingProxyFactory.java Mon Sep  5 08:39:02 2005
@@ -0,0 +1,128 @@
+/* $Id$
+ *
+ * Copyright 2005 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.
+ */
+package org.apache.commons.proxy.factory.util;
+
+import org.apache.commons.proxy.exception.ProxyFactoryException;
+
+import java.lang.reflect.Modifier;
+import java.util.Collection;
+import java.util.LinkedList;
+import java.util.List;
+
+/**
+ * @author James Carman
+ * @version 1.0
+ */
+public abstract class AbstractSubclassingProxyFactory extends AbstractProxyFactory
+{
+    /**
+     * Returns either {@link Object} if all of the <code>proxyClasses</code> are interfaces or the single non-interface
+     * class from <code>proxyClasses</code>.
+     *
+     * @param proxyClasses the proxy classes
+     * @return either {@link Object} if all of the <code>proxyClasses</code> are interfaces or the single non-interface
+     *         class from <code>proxyClasses</code>
+     * @throws ProxyFactoryException if multiple non-interface classes are contained in <code>proxyClasses</code> or any
+     *                               of the non-interface classes are final
+     */
+    protected static Class getSuperclass( Class... proxyClasses )
+    {
+        final Class[] superclasses = toNonInterfaces( proxyClasses );
+        switch( superclasses.length )
+        {
+            case 0:
+                return Object.class;
+            case 1:
+                final Class superclass = superclasses[0];
+                if( Modifier.isFinal( superclass.getModifiers() ) )
+                {
+                    throw new ProxyFactoryException(
+                            "Proxy class cannot extend " + superclass.getName() + " as it is final." );
+                }
+                try
+                {
+                    superclass.getConstructor();
+                }
+                catch( NoSuchMethodException e )
+                {
+                    throw new ProxyFactoryException( "Proxy class cannot extend " + superclass.getName() + ", because it has no \"default\" constructor.", e );
+                }
+                return superclass;
+            default:
+                final StringBuffer errorMessage = new StringBuffer( "Proxy class cannot extend " );
+                for( int i = 0; i < superclasses.length; i++ )
+                {
+                    Class c = superclasses[i];
+                    errorMessage.append( c.getName() );
+                    if( i != superclasses.length - 1 )
+                    {
+                        errorMessage.append( ", " );
+                    }
+                }
+                errorMessage.append( "; multiple inheritance not allowed." );
+                throw new ProxyFactoryException( errorMessage.toString() );
+        }
+    }
+
+    /**
+     * Returns the <code>proxyClasses</code> transformed into an array of only the interface classes.
+     *
+     * @param proxyClasses the proxy classes
+     * @return the <code>proxyClasses</code> transformed into an array of only the interface classes
+     */
+    protected static Class[] toInterfaces( Class... proxyClasses )
+    {
+        final Collection<Class> interfaces = new LinkedList<Class>();
+        for( int i = 0; i < proxyClasses.length; i++ )
+        {
+            Class proxyInterface = proxyClasses[i];
+            if( proxyInterface.isInterface() )
+            {
+                interfaces.add( proxyInterface );
+            }
+        }
+        return ( Class[] ) interfaces.toArray( new Class[interfaces.size()] );
+    }
+
+    public boolean canProxy( Class... proxyClasses )
+    {
+        try
+        {
+            getSuperclass( proxyClasses );
+            return true;
+        }
+        catch( ProxyFactoryException e )
+        {
+            return false;
+        }
+    }
+
+    private static Class[] toNonInterfaces( Class... proxyClasses )
+    {
+        final List<Class> superclasses = new LinkedList<Class>();
+        for( int i = 0; i < proxyClasses.length; i++ )
+        {
+            Class proxyClass = proxyClasses[i];
+            if( !proxyClass.isInterface() )
+            {
+                superclasses.add( proxyClass );
+            }
+        }
+        return ( Class[] ) superclasses.toArray( new Class[superclasses.size()] );
+
+    }
+}

Propchange: jakarta/commons/sandbox/proxy/trunk/src/java/org/apache/commons/proxy/factory/util/AbstractSubclassingProxyFactory.java
------------------------------------------------------------------------------
    svn:eol-style = native

Propchange: jakarta/commons/sandbox/proxy/trunk/src/java/org/apache/commons/proxy/factory/util/AbstractSubclassingProxyFactory.java
------------------------------------------------------------------------------
    svn:keywords = Id

Modified: jakarta/commons/sandbox/proxy/trunk/src/java/org/apache/commons/proxy/factory/util/ProxyClassCache.java
URL: http://svn.apache.org/viewcvs/jakarta/commons/sandbox/proxy/trunk/src/java/org/apache/commons/proxy/factory/util/ProxyClassCache.java?rev=278781&r1=278780&r2=278781&view=diff
==============================================================================
--- jakarta/commons/sandbox/proxy/trunk/src/java/org/apache/commons/proxy/factory/util/ProxyClassCache.java (original)
+++ jakarta/commons/sandbox/proxy/trunk/src/java/org/apache/commons/proxy/factory/util/ProxyClassCache.java Mon Sep  5 08:39:02 2005
@@ -47,15 +47,15 @@
 // Other Methods
 //----------------------------------------------------------------------------------------------------------------------
 
-    public synchronized Class getProxyClass( ClassLoader classLoader, Class... proxyInterfaces )
+    public synchronized Class getProxyClass( ClassLoader classLoader, Class... proxyClasses )
     {
         final Map<String, WeakReference<Class>> classCache = getClassCache( classLoader );
-        final String key = toClassCacheKey( proxyInterfaces );
+        final String key = toClassCacheKey( proxyClasses );
         Class proxyClass;
         WeakReference<Class> proxyClassReference = classCache.get( key );
         if( proxyClassReference == null )
         {
-            proxyClass = proxyClassGenerator.generateProxyClass( classLoader, proxyInterfaces );
+            proxyClass = proxyClassGenerator.generateProxyClass( classLoader, proxyClasses );
             classCache.put( key, new WeakReference<Class>( proxyClass ) );
         }
         else
@@ -65,7 +65,7 @@
                 proxyClass = proxyClassReference.get();
                 if( proxyClass == null )
                 {
-                    proxyClass = proxyClassGenerator.generateProxyClass( classLoader, proxyInterfaces );
+                    proxyClass = proxyClassGenerator.generateProxyClass( classLoader, proxyClasses );
                     classCache.put( key, new WeakReference<Class>( proxyClass ) );
                 }
             }
@@ -84,14 +84,14 @@
         return cache;
     }
 
-    private String toClassCacheKey( Class... proxyInterfaces )
+    private String toClassCacheKey( Class... proxyClasses )
     {
         final StringBuffer sb = new StringBuffer();
-        for( int i = 0; i < proxyInterfaces.length; i++ )
+        for( int i = 0; i < proxyClasses.length; i++ )
         {
-            Class proxyInterface = proxyInterfaces[i];
+            Class proxyInterface = proxyClasses[i];
             sb.append( proxyInterface.getName() );
-            if( i != proxyInterfaces.length - 1 )
+            if( i != proxyClasses.length - 1 )
             {
                 sb.append( "," );
             }

Modified: jakarta/commons/sandbox/proxy/trunk/src/java/org/apache/commons/proxy/factory/util/ProxyClassGenerator.java
URL: http://svn.apache.org/viewcvs/jakarta/commons/sandbox/proxy/trunk/src/java/org/apache/commons/proxy/factory/util/ProxyClassGenerator.java?rev=278781&r1=278780&r2=278781&view=diff
==============================================================================
--- jakarta/commons/sandbox/proxy/trunk/src/java/org/apache/commons/proxy/factory/util/ProxyClassGenerator.java (original)
+++ jakarta/commons/sandbox/proxy/trunk/src/java/org/apache/commons/proxy/factory/util/ProxyClassGenerator.java Mon Sep  5 08:39:02 2005
@@ -26,6 +26,6 @@
 // Other Methods
 //----------------------------------------------------------------------------------------------------------------------
 
-    public Class generateProxyClass( ClassLoader classLoader, Class... proxyInterfaces );
+    public Class generateProxyClass( ClassLoader classLoader, Class... proxyClasses );
 }
 

Modified: jakarta/commons/sandbox/proxy/trunk/src/java/org/apache/commons/proxy/interceptor/MethodInterceptorChain.java
URL: http://svn.apache.org/viewcvs/jakarta/commons/sandbox/proxy/trunk/src/java/org/apache/commons/proxy/interceptor/MethodInterceptorChain.java?rev=278781&r1=278780&r2=278781&view=diff
==============================================================================
--- jakarta/commons/sandbox/proxy/trunk/src/java/org/apache/commons/proxy/interceptor/MethodInterceptorChain.java (original)
+++ jakarta/commons/sandbox/proxy/trunk/src/java/org/apache/commons/proxy/interceptor/MethodInterceptorChain.java Mon Sep  5 08:39:02 2005
@@ -50,31 +50,31 @@
 //----------------------------------------------------------------------------------------------------------------------
 
     private Object createProxy( ProxyFactory proxyFactory, ClassLoader classLoader, Object terminus,
-                                Class... proxyInterfaces )
+                                Class... proxyClasses )
     {
         Object currentTarget = terminus;
         for( int i = interceptors.length - 1; i >= 0; --i )
         {
             currentTarget = proxyFactory
-                    .createInterceptorProxy( classLoader, currentTarget, interceptors[i], proxyInterfaces );
+                    .createInterceptorProxy( classLoader, currentTarget, interceptors[i], proxyClasses );
         }
         return currentTarget;
     }
 
-    public ObjectProvider createProxyProvider( ProxyFactory proxyFactory, Object terminus, Class... proxyInterfaces )
+    public ObjectProvider createProxyProvider( ProxyFactory proxyFactory, Object terminus, Class... proxyClasses )
     {
         return createProxyProvider( proxyFactory, Thread.currentThread().getContextClassLoader(), terminus,
-                                    proxyInterfaces );
+                                    proxyClasses );
     }
 
     public ObjectProvider createProxyProvider( ProxyFactory proxyFactory, ClassLoader classLoader, Object terminus,
-                                               Class... proxyInterfaces )
+                                               Class... proxyClasses )
     {
-        if( proxyInterfaces.length == 0 )
+        if( proxyClasses.length == 0 )
         {
-            proxyInterfaces = terminus.getClass().getInterfaces();
+            proxyClasses = terminus.getClass().getInterfaces();
         }
-        return new ProxyObjectProvider( proxyFactory, classLoader, terminus, proxyInterfaces );
+        return new ProxyObjectProvider( proxyFactory, classLoader, terminus, proxyClasses );
     }
 
 //----------------------------------------------------------------------------------------------------------------------
@@ -84,22 +84,22 @@
     private class ProxyObjectProvider extends AbstractObjectProvider
     {
         private final ClassLoader classLoader;
-        private final Class[] proxyInterfaces;
+        private final Class[] proxyClasses;
         private final Object terminus;
         private final ProxyFactory proxyFactory;
 
         public ProxyObjectProvider( ProxyFactory proxyFactory, ClassLoader classLoader, Object terminus,
-                                    Class[] proxyInterfaces )
+                                    Class[] proxyClasses )
         {
             this.classLoader = classLoader;
-            this.proxyInterfaces = proxyInterfaces;
+            this.proxyClasses = proxyClasses;
             this.terminus = terminus;
             this.proxyFactory = proxyFactory;
         }
 
         public Object getObject()
         {
-            return createProxy( proxyFactory, classLoader, terminus, proxyInterfaces );
+            return createProxy( proxyFactory, classLoader, terminus, proxyClasses );
         }
     }
 }

Modified: jakarta/commons/sandbox/proxy/trunk/src/test/org/apache/commons/proxy/factory/AbstractProxyFactoryTestCase.java
URL: http://svn.apache.org/viewcvs/jakarta/commons/sandbox/proxy/trunk/src/test/org/apache/commons/proxy/factory/AbstractProxyFactoryTestCase.java?rev=278781&r1=278780&r2=278781&view=diff
==============================================================================
--- jakarta/commons/sandbox/proxy/trunk/src/test/org/apache/commons/proxy/factory/AbstractProxyFactoryTestCase.java (original)
+++ jakarta/commons/sandbox/proxy/trunk/src/test/org/apache/commons/proxy/factory/AbstractProxyFactoryTestCase.java Mon Sep  5 08:39:02 2005
@@ -48,6 +48,12 @@
         this.factory = factory;
     }
 
+    public void testCanProxy()
+    {
+        assertTrue( factory.canProxy( Echo.class ) );
+        assertFalse( factory.canProxy( EchoImpl.class ) );
+    }
+
     public void testInterfaceHierarchies()
     {
         final SortedSet<String> set = ( SortedSet<String> ) factory.createDelegatorProxy( constantProvider( new TreeSet<String>() ), SortedSet.class );
@@ -234,7 +240,7 @@
         }
     }
 
-    private static class NoOpMethodInterceptor implements MethodInterceptor
+    protected static class NoOpMethodInterceptor implements MethodInterceptor
     {
         public Object invoke( MethodInvocation methodInvocation ) throws Throwable
         {

Added: jakarta/commons/sandbox/proxy/trunk/src/test/org/apache/commons/proxy/factory/AbstractSubclassingProxyFactoryTestCase.java
URL: http://svn.apache.org/viewcvs/jakarta/commons/sandbox/proxy/trunk/src/test/org/apache/commons/proxy/factory/AbstractSubclassingProxyFactoryTestCase.java?rev=278781&view=auto
==============================================================================
--- jakarta/commons/sandbox/proxy/trunk/src/test/org/apache/commons/proxy/factory/AbstractSubclassingProxyFactoryTestCase.java (added)
+++ jakarta/commons/sandbox/proxy/trunk/src/test/org/apache/commons/proxy/factory/AbstractSubclassingProxyFactoryTestCase.java Mon Sep  5 08:39:02 2005
@@ -0,0 +1,59 @@
+/* $Id$
+ *
+ * Copyright 2005 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.
+ */
+package org.apache.commons.proxy.factory;
+
+import org.apache.commons.proxy.ProxyFactory;
+import org.apache.commons.proxy.handler.NullInvocationHandler;
+import org.apache.commons.proxy.provider.ConstantProvider;
+import org.apache.commons.proxy.util.Echo;
+import org.apache.commons.proxy.util.EchoImpl;
+
+/**
+ * @author James Carman
+ * @version 1.0
+ */
+public abstract class AbstractSubclassingProxyFactoryTestCase extends AbstractProxyFactoryTestCase
+{
+    protected AbstractSubclassingProxyFactoryTestCase( ProxyFactory factory )
+    {
+        super( factory );
+    }
+
+    public void testCanProxy()
+    {
+        assertTrue( factory.canProxy( Echo.class ) );
+        assertTrue( factory.canProxy( EchoImpl.class ) );
+    }
+
+    public void testDelegatorWithSuperclass()
+    {
+        final Echo echo = ( Echo )factory.createDelegatorProxy( new ConstantProvider( new EchoImpl() ), Echo.class, EchoImpl.class );
+        assertTrue( echo instanceof EchoImpl );
+    }
+
+    public void testInterceptorWithSuperclass()
+    {
+        final Echo echo = ( Echo )factory.createInterceptorProxy( new EchoImpl(), new NoOpMethodInterceptor(), Echo.class, EchoImpl.class );
+        assertTrue( echo instanceof EchoImpl );
+    }
+
+    public void testInvocationHandlerWithSuperclass()
+    {
+        final Echo echo = ( Echo )factory.createInvocationHandlerProxy( new NullInvocationHandler(), Echo.class, EchoImpl.class );
+        assertTrue( echo instanceof EchoImpl );
+    }
+}

Propchange: jakarta/commons/sandbox/proxy/trunk/src/test/org/apache/commons/proxy/factory/AbstractSubclassingProxyFactoryTestCase.java
------------------------------------------------------------------------------
    svn:eol-style = native

Propchange: jakarta/commons/sandbox/proxy/trunk/src/test/org/apache/commons/proxy/factory/AbstractSubclassingProxyFactoryTestCase.java
------------------------------------------------------------------------------
    svn:keywords = Id

Modified: jakarta/commons/sandbox/proxy/trunk/src/test/org/apache/commons/proxy/factory/cglib/TestCglibProxyFactory.java
URL: http://svn.apache.org/viewcvs/jakarta/commons/sandbox/proxy/trunk/src/test/org/apache/commons/proxy/factory/cglib/TestCglibProxyFactory.java?rev=278781&r1=278780&r2=278781&view=diff
==============================================================================
--- jakarta/commons/sandbox/proxy/trunk/src/test/org/apache/commons/proxy/factory/cglib/TestCglibProxyFactory.java (original)
+++ jakarta/commons/sandbox/proxy/trunk/src/test/org/apache/commons/proxy/factory/cglib/TestCglibProxyFactory.java Mon Sep  5 08:39:02 2005
@@ -16,12 +16,13 @@
 package org.apache.commons.proxy.factory.cglib;
 
 import org.apache.commons.proxy.factory.AbstractProxyFactoryTestCase;
+import org.apache.commons.proxy.factory.AbstractSubclassingProxyFactoryTestCase;
 
 /**
  * @author James Carman
  * @version 1.0
  */
-public class TestCglibProxyFactory extends AbstractProxyFactoryTestCase
+public class TestCglibProxyFactory extends AbstractSubclassingProxyFactoryTestCase
 {
     public TestCglibProxyFactory()
     {

Modified: jakarta/commons/sandbox/proxy/trunk/src/test/org/apache/commons/proxy/factory/javassist/TestJavassistProxyFactory.java
URL: http://svn.apache.org/viewcvs/jakarta/commons/sandbox/proxy/trunk/src/test/org/apache/commons/proxy/factory/javassist/TestJavassistProxyFactory.java?rev=278781&r1=278780&r2=278781&view=diff
==============================================================================
--- jakarta/commons/sandbox/proxy/trunk/src/test/org/apache/commons/proxy/factory/javassist/TestJavassistProxyFactory.java (original)
+++ jakarta/commons/sandbox/proxy/trunk/src/test/org/apache/commons/proxy/factory/javassist/TestJavassistProxyFactory.java Mon Sep  5 08:39:02 2005
@@ -16,6 +16,7 @@
 package org.apache.commons.proxy.factory.javassist;
 
 import org.apache.commons.proxy.factory.AbstractProxyFactoryTestCase;
+import org.apache.commons.proxy.factory.AbstractSubclassingProxyFactoryTestCase;
 import org.apache.commons.proxy.util.Echo;
 import org.apache.commons.proxy.util.DuplicateEcho;
 
@@ -27,7 +28,7 @@
  * @author James Carman
  * @version 1.0
  */
-public class TestJavassistProxyFactory extends AbstractProxyFactoryTestCase
+public class TestJavassistProxyFactory extends AbstractSubclassingProxyFactoryTestCase
 {
     public TestJavassistProxyFactory()
     {



---------------------------------------------------------------------
To unsubscribe, e-mail: commons-dev-unsubscribe@jakarta.apache.org
For additional commands, e-mail: commons-dev-help@jakarta.apache.org