You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@openwebbeans.apache.org by st...@apache.org on 2013/01/25 11:27:15 UTC

svn commit: r1438425 - in /openwebbeans/trunk/webbeans-impl/src: main/java/org/apache/webbeans/component/ main/java/org/apache/webbeans/intercept/ main/java/org/apache/webbeans/portable/ main/java/org/apache/webbeans/proxy/ test/java/org/apache/webbean...

Author: struberg
Date: Fri Jan 25 10:27:14 2013
New Revision: 1438425

URL: http://svn.apache.org/viewvc?rev=1438425&view=rev
Log:
OWB-769 add serialisation support for InterceptorDecorator proxies

Modified:
    openwebbeans/trunk/webbeans-impl/src/main/java/org/apache/webbeans/component/InjectionTargetBean.java
    openwebbeans/trunk/webbeans-impl/src/main/java/org/apache/webbeans/intercept/DefaultInterceptorHandler.java
    openwebbeans/trunk/webbeans-impl/src/main/java/org/apache/webbeans/intercept/NormalScopedBeanInterceptorHandler.java
    openwebbeans/trunk/webbeans-impl/src/main/java/org/apache/webbeans/portable/InjectionTargetImpl.java
    openwebbeans/trunk/webbeans-impl/src/main/java/org/apache/webbeans/proxy/AbstractProxyFactory.java
    openwebbeans/trunk/webbeans-impl/src/main/java/org/apache/webbeans/proxy/InterceptorDecoratorProxyFactory.java
    openwebbeans/trunk/webbeans-impl/src/main/java/org/apache/webbeans/proxy/NormalScopeProxyFactory.java
    openwebbeans/trunk/webbeans-impl/src/test/java/org/apache/webbeans/newtests/interceptors/business/tests/NewProxyTest.java
    openwebbeans/trunk/webbeans-impl/src/test/java/org/apache/webbeans/newtests/interceptors/factory/InterceptorDecoratorProxyFactoryTest.java
    openwebbeans/trunk/webbeans-impl/src/test/java/org/apache/webbeans/newtests/interceptors/resolution/InterceptorProxyChainTest.java

Modified: openwebbeans/trunk/webbeans-impl/src/main/java/org/apache/webbeans/component/InjectionTargetBean.java
URL: http://svn.apache.org/viewvc/openwebbeans/trunk/webbeans-impl/src/main/java/org/apache/webbeans/component/InjectionTargetBean.java?rev=1438425&r1=1438424&r2=1438425&view=diff
==============================================================================
--- openwebbeans/trunk/webbeans-impl/src/main/java/org/apache/webbeans/component/InjectionTargetBean.java (original)
+++ openwebbeans/trunk/webbeans-impl/src/main/java/org/apache/webbeans/component/InjectionTargetBean.java Fri Jan 25 10:27:14 2013
@@ -153,12 +153,13 @@ public abstract class InjectionTargetBea
                 Method[] businessMethods = methodInterceptors.keySet().toArray(new Method[methodInterceptors.size()]);
                 Method[] nonInterceptedMethods = interceptorInfo.getNonInterceptedMethods().toArray(new Method[interceptorInfo.getNonInterceptedMethods().size()]);
 
-                proxyClass = (Class<? extends T>) pf.createProxyClass(classLoader, getReturnType(), businessMethods, nonInterceptedMethods);
+                proxyClass = (Class<? extends T>) pf.createProxyClass(this, classLoader, getReturnType(), businessMethods, nonInterceptedMethods);
 
                 // now we collect the post-construct and pre-destroy interceptors
 
             }
-            injectionTarget.setInterceptorInfo(interceptorInfo, proxyClass, methodInterceptors, postConstructInterceptors, preDestroyInterceptors);
+
+            injectionTarget.setInterceptorInfo(interceptorInfo, proxyClass, methodInterceptors, postConstructInterceptors, preDestroyInterceptors, getId());
 
         }
 

Modified: openwebbeans/trunk/webbeans-impl/src/main/java/org/apache/webbeans/intercept/DefaultInterceptorHandler.java
URL: http://svn.apache.org/viewvc/openwebbeans/trunk/webbeans-impl/src/main/java/org/apache/webbeans/intercept/DefaultInterceptorHandler.java?rev=1438425&r1=1438424&r2=1438425&view=diff
==============================================================================
--- openwebbeans/trunk/webbeans-impl/src/main/java/org/apache/webbeans/intercept/DefaultInterceptorHandler.java (original)
+++ openwebbeans/trunk/webbeans-impl/src/main/java/org/apache/webbeans/intercept/DefaultInterceptorHandler.java Fri Jan 25 10:27:14 2013
@@ -18,13 +18,17 @@
  */
 package org.apache.webbeans.intercept;
 
+import java.io.ObjectStreamException;
 import java.lang.reflect.Method;
 import java.util.List;
 import java.util.Map;
 
+import javax.enterprise.inject.spi.Bean;
+import javax.enterprise.inject.spi.BeanManager;
 import javax.enterprise.inject.spi.InterceptionType;
 import javax.enterprise.inject.spi.Interceptor;
 
+import org.apache.webbeans.config.WebBeansContext;
 import org.apache.webbeans.proxy.InterceptorHandler;
 import org.apache.webbeans.util.ExceptionUtil;
 
@@ -44,18 +48,37 @@ public class DefaultInterceptorHandler<T
      */
     private T delegate;
 
+    /**
+     * The passivation if in case this is a
+     * {@link javax.enterprise.inject.spi.PassivationCapable} bean.
+     * we just keep this field for serializing it away
+     */
+    private String beanPassivationId;
+
+
     private Map<Method, List<Interceptor<?>>> interceptors;
     private Map<Interceptor<?>, ?> instances;
 
+    /**
+     * InterceptorHandler wich gets used in our InjectionTargets which
+     * support interceptors and decorators
+     * @param target the decorated and intercepted instance. Needed for delivering Events to private methods, etc.
+     * @param delegate the outermost Decorator or the intercepted instance
+     * @param interceptors Map with all active interceptors for each method.
+     * @param instances the Interceptor instances
+     * @param beanPassivationId passivationId if a Bean is {@link javax.enterprise.inject.spi.PassivationCapable}
+     */
     public DefaultInterceptorHandler(T target,
                                      T delegate,
                                      Map<Method, List<Interceptor<?>>> interceptors,
-                                     Map<Interceptor<?>, ?> instances)
+                                     Map<Interceptor<?>, ?> instances,
+                                     String beanPassivationId)
     {
         this.target = target;
         this.delegate = delegate;
         this.instances = instances;
         this.interceptors = interceptors;
+        this.beanPassivationId = beanPassivationId;
     }
 
     public T getTarget()
@@ -94,4 +117,24 @@ public class DefaultInterceptorHandler<T
             return ExceptionUtil.throwAsRuntimeException(e);
         }
     }
+
+    /**
+     * The following code gets generated into the proxy:
+     *
+     * <pre>
+     * Object writeReplace() throws ObjectStreamException
+     * {
+     *     return provider;
+     * }
+     * </pre>
+     */
+    Object readResolve() throws ObjectStreamException
+    {
+        WebBeansContext webBeansContext = WebBeansContext.getInstance();
+        BeanManager beanManager = webBeansContext.getBeanManagerImpl();
+        Bean<?> bean = beanManager.getPassivationCapableBean(beanPassivationId);
+
+        return webBeansContext.getInterceptorDecoratorProxyFactory().getCachedProxyClass(bean);
+    }
+
 }

Modified: openwebbeans/trunk/webbeans-impl/src/main/java/org/apache/webbeans/intercept/NormalScopedBeanInterceptorHandler.java
URL: http://svn.apache.org/viewvc/openwebbeans/trunk/webbeans-impl/src/main/java/org/apache/webbeans/intercept/NormalScopedBeanInterceptorHandler.java?rev=1438425&r1=1438424&r2=1438425&view=diff
==============================================================================
--- openwebbeans/trunk/webbeans-impl/src/main/java/org/apache/webbeans/intercept/NormalScopedBeanInterceptorHandler.java (original)
+++ openwebbeans/trunk/webbeans-impl/src/main/java/org/apache/webbeans/intercept/NormalScopedBeanInterceptorHandler.java Fri Jan 25 10:27:14 2013
@@ -48,7 +48,10 @@ public class NormalScopedBeanInterceptor
     private transient BeanManager beanManager;
     protected transient Bean<?> bean;
 
-    // we just keep this field for serializing it away
+    /**
+     * The passivation if in case this is a {@link PassivationCapable} bean.
+     * we just keep this field for serializing it away
+     */
     private String beanPassivationId;
 
     public NormalScopedBeanInterceptorHandler(BeanManager beanManager, Bean<?> bean)

Modified: openwebbeans/trunk/webbeans-impl/src/main/java/org/apache/webbeans/portable/InjectionTargetImpl.java
URL: http://svn.apache.org/viewvc/openwebbeans/trunk/webbeans-impl/src/main/java/org/apache/webbeans/portable/InjectionTargetImpl.java?rev=1438425&r1=1438424&r2=1438425&view=diff
==============================================================================
--- openwebbeans/trunk/webbeans-impl/src/main/java/org/apache/webbeans/portable/InjectionTargetImpl.java (original)
+++ openwebbeans/trunk/webbeans-impl/src/main/java/org/apache/webbeans/portable/InjectionTargetImpl.java Fri Jan 25 10:27:14 2013
@@ -108,6 +108,13 @@ public class InjectionTargetImpl<T> exte
     private BeanInterceptorInfo interceptorInfo = null;
 
     /**
+     * The passivationId of the bean this InjectionTarget serves.
+     * We need this to restore the interceptor proxy on de-serialisation.
+     * Only needed for Beans which are {@link javax.enterprise.inject.spi.PassivationCapable}.
+     */
+    private String beanPassivationId = null;
+
+    /**
      * Defines the interceptor/decorator stack for the InjectionTargetBean.
      * In case this is already defined, we get the ProxyClass for the Bean
      * or <code>null</code> if this Bean doesn't need any proxy.
@@ -142,13 +149,14 @@ public class InjectionTargetImpl<T> exte
     }
 
     public void setInterceptorInfo(BeanInterceptorInfo interceptorInfo, Class<? extends T> proxyClass, Map<Method, List<Interceptor<?>>> methodInterceptors,
-                                   List<Interceptor<?>> postConstructInterceptors, List<Interceptor<?>> preDestroyInterceptors)
+                                   List<Interceptor<?>> postConstructInterceptors, List<Interceptor<?>> preDestroyInterceptors, String beanPassivationId)
     {
         this.interceptorInfo = interceptorInfo;
         this.proxyClass = proxyClass;
         this.methodInterceptors = methodInterceptors;
         this.postConstructInterceptors = postConstructInterceptors;
         this.preDestroyInterceptors = preDestroyInterceptors;
+        this.beanPassivationId = beanPassivationId;
     }
 
     /**
@@ -210,7 +218,7 @@ public class InjectionTargetImpl<T> exte
                     delegate = pf.createProxyInstance(proxyClass, instance, new DecoratorHandler(interceptorInfo, instances, i - 1, instance));
                 }
             }
-            InterceptorHandler interceptorHandler = new DefaultInterceptorHandler<T>(instance, delegate, methodInterceptors, interceptorInstances);
+            InterceptorHandler interceptorHandler = new DefaultInterceptorHandler<T>(instance, delegate, methodInterceptors, interceptorInstances, beanPassivationId);
 
             T proxyInstance = pf.createProxyInstance(proxyClass, instance, interceptorHandler);
             instance = proxyInstance;

Modified: openwebbeans/trunk/webbeans-impl/src/main/java/org/apache/webbeans/proxy/AbstractProxyFactory.java
URL: http://svn.apache.org/viewvc/openwebbeans/trunk/webbeans-impl/src/main/java/org/apache/webbeans/proxy/AbstractProxyFactory.java?rev=1438425&r1=1438424&r2=1438425&view=diff
==============================================================================
--- openwebbeans/trunk/webbeans-impl/src/main/java/org/apache/webbeans/proxy/AbstractProxyFactory.java (original)
+++ openwebbeans/trunk/webbeans-impl/src/main/java/org/apache/webbeans/proxy/AbstractProxyFactory.java Fri Jan 25 10:27:14 2013
@@ -176,6 +176,7 @@ public abstract class AbstractProxyFacto
 
         Class<T> clazz = defineAndLoadClass(classLoader, proxyClassName, proxyBytes);
 
+
         return clazz;
     }
 

Modified: openwebbeans/trunk/webbeans-impl/src/main/java/org/apache/webbeans/proxy/InterceptorDecoratorProxyFactory.java
URL: http://svn.apache.org/viewvc/openwebbeans/trunk/webbeans-impl/src/main/java/org/apache/webbeans/proxy/InterceptorDecoratorProxyFactory.java?rev=1438425&r1=1438424&r2=1438425&view=diff
==============================================================================
--- openwebbeans/trunk/webbeans-impl/src/main/java/org/apache/webbeans/proxy/InterceptorDecoratorProxyFactory.java (original)
+++ openwebbeans/trunk/webbeans-impl/src/main/java/org/apache/webbeans/proxy/InterceptorDecoratorProxyFactory.java Fri Jan 25 10:27:14 2013
@@ -19,10 +19,13 @@
 package org.apache.webbeans.proxy;
 
 
+import javax.enterprise.inject.spi.Bean;
+import java.io.ObjectStreamException;
 import java.lang.reflect.Constructor;
 import java.lang.reflect.Field;
 import java.lang.reflect.Method;
 import java.lang.reflect.Modifier;
+import java.util.concurrent.ConcurrentHashMap;
 
 import org.apache.webbeans.config.WebBeansContext;
 import org.apache.webbeans.exception.WebBeansConfigurationException;
@@ -57,8 +60,11 @@ public class InterceptorDecoratorProxyFa
     /** the name of the field which stores the Method[] of all intercepted methods */
     public static final String FIELD_INTERCEPTED_METHODS = "owbIntDecMethods";
 
-    //X TODO add caching of created proxy classes. This is needed to prevent class loading clashes.
-    //X a generated proxy cannot easily get redefined later!
+    /**
+     * Caches the proxy classes for each bean.
+     * We need this to prevent filling up the ClassLoaders by
+     */
+    private ConcurrentHashMap<Bean<?>, Class<?>> cachedProxyClasses = new ConcurrentHashMap<Bean<?>, Class<?>>();
 
 
     public InterceptorDecoratorProxyFactory(WebBeansContext webBeansContext)
@@ -129,12 +135,6 @@ public class InterceptorDecoratorProxyFa
         return null;
     }
 
-    @Override
-    protected void createSerialisation(ClassWriter cw, String proxyClassFileName, Class<?> classToProxy, String classFileName)
-    {
-        // nothing to do ;)
-    }
-
     /**
      * <p>Create a decorator and interceptor proxy for the given type. A single instance
      * of such a proxy class has exactly one single internal instance.</p>
@@ -158,15 +158,15 @@ public class InterceptorDecoratorProxyFa
      * </p>
      *
      *
+     * @param bean the bean the proxy serves for. Needed for caching and serialisation.
      * @param classLoader to use for creating the class in
      * @param classToProxy the class for which a subclass will get generated
      * @param interceptedMethods the list of intercepted or decorated business methods.
      * @param nonInterceptedMethods all methods which are <b>not</b> intercepted nor decorated and shall get delegated directly
      * @param <T>
      * @return the proxy class
-     * //X TODO for serialisation reasons this probably needs the Bean it serves.
      */
-    public synchronized <T> Class<T> createProxyClass(ClassLoader classLoader, Class<T> classToProxy,
+    public synchronized <T> Class<T> createProxyClass(Bean<T> bean, ClassLoader classLoader, Class<T> classToProxy,
                                                       Method[] interceptedMethods, Method[] nonInterceptedMethods)
             throws ProxyGenerationException
     {
@@ -186,9 +186,16 @@ public class InterceptorDecoratorProxyFa
             throw new ProxyGenerationException(e);
         }
 
+        cachedProxyClasses.put(bean, clazz);
+
         return clazz;
     }
 
+    public <T> Class<T> getCachedProxyClass(Bean<T> bean)
+    {
+        return (Class<T>) cachedProxyClasses.get(bean);
+    }
+
     @Override
     protected Class getMarkerInterface()
     {
@@ -210,6 +217,26 @@ public class InterceptorDecoratorProxyFa
                 FIELD_INTERCEPTED_METHODS, Type.getDescriptor(Method[].class), null, null).visitEnd();
     }
 
+    @Override
+    protected void createSerialisation(ClassWriter cw, String proxyClassFileName, Class<?> classToProxy, String classFileName)
+    {
+        String[] exceptionTypeNames = {Type.getType(ObjectStreamException.class).getInternalName()};
+        MethodVisitor mv = cw.visitMethod(Modifier.PUBLIC, "writeReplace", "()Ljava/lang/Object;", null, exceptionTypeNames);
+
+        // fill method body
+        mv.visitCode();
+
+        // load the contextual instance Provider
+        mv.visitVarInsn(Opcodes.ALOAD, 0);
+        mv.visitFieldInsn(Opcodes.GETFIELD, proxyClassFileName, FIELD_INTERCEPTOR_HANDLER, Type.getDescriptor(InterceptorHandler.class));
+
+        mv.visitInsn(Opcodes.ARETURN);
+
+        mv.visitMaxs(-1, -1);
+        mv.visitEnd();
+    }
+
+
     /**
      * Each of our interceptor/decorator proxies has exactly 1 constructor
      * which invokes the super ct + sets the delegation field.

Modified: openwebbeans/trunk/webbeans-impl/src/main/java/org/apache/webbeans/proxy/NormalScopeProxyFactory.java
URL: http://svn.apache.org/viewvc/openwebbeans/trunk/webbeans-impl/src/main/java/org/apache/webbeans/proxy/NormalScopeProxyFactory.java?rev=1438425&r1=1438424&r2=1438425&view=diff
==============================================================================
--- openwebbeans/trunk/webbeans-impl/src/main/java/org/apache/webbeans/proxy/NormalScopeProxyFactory.java (original)
+++ openwebbeans/trunk/webbeans-impl/src/main/java/org/apache/webbeans/proxy/NormalScopeProxyFactory.java Fri Jan 25 10:27:14 2013
@@ -52,6 +52,10 @@ public class NormalScopeProxyFactory ext
     /** the name of the field which stores the {@link Provider} for the Contextual Instance */
     public static final String FIELD_INSTANCE_PROVIDER = "owbContextualInstanceProvider";
 
+    /**
+     * Caches the proxy classes for each bean.
+     * We need this to prevent filling up the ClassLoaders by
+     */
     private ConcurrentHashMap<Bean<?>, Class<?>> cachedProxyClasses = new ConcurrentHashMap<Bean<?>, Class<?>>();
 
 

Modified: openwebbeans/trunk/webbeans-impl/src/test/java/org/apache/webbeans/newtests/interceptors/business/tests/NewProxyTest.java
URL: http://svn.apache.org/viewvc/openwebbeans/trunk/webbeans-impl/src/test/java/org/apache/webbeans/newtests/interceptors/business/tests/NewProxyTest.java?rev=1438425&r1=1438424&r2=1438425&view=diff
==============================================================================
--- openwebbeans/trunk/webbeans-impl/src/test/java/org/apache/webbeans/newtests/interceptors/business/tests/NewProxyTest.java (original)
+++ openwebbeans/trunk/webbeans-impl/src/test/java/org/apache/webbeans/newtests/interceptors/business/tests/NewProxyTest.java Fri Jan 25 10:27:14 2013
@@ -75,11 +75,11 @@ public class NewProxyTest extends Abstra
         Map instances = new HashMap();
         instances.put(interceptorBean, interceptor);
         InterceptorHandler interceptorHandler
-                = new DefaultInterceptorHandler<RuntimeExceptionBindingTypeBean>(target, target, interceptors, instances);
+                = new DefaultInterceptorHandler<RuntimeExceptionBindingTypeBean>(target, target, interceptors, instances, null);
         
         InterceptorDecoratorProxyFactory factory = new InterceptorDecoratorProxyFactory(getWebBeansContext());
         Class<RuntimeExceptionBindingTypeBean> proxyClass
-                = factory.createProxyClass(Thread.currentThread().getContextClassLoader(), RuntimeExceptionBindingTypeBean.class, interceptedMethods, null);
+                = factory.createProxyClass(bean, Thread.currentThread().getContextClassLoader(), RuntimeExceptionBindingTypeBean.class, interceptedMethods, null);
 
         RuntimeExceptionBindingTypeBean instance = factory.createProxyInstance(proxyClass, target, interceptorHandler);
         int result = instance.business();

Modified: openwebbeans/trunk/webbeans-impl/src/test/java/org/apache/webbeans/newtests/interceptors/factory/InterceptorDecoratorProxyFactoryTest.java
URL: http://svn.apache.org/viewvc/openwebbeans/trunk/webbeans-impl/src/test/java/org/apache/webbeans/newtests/interceptors/factory/InterceptorDecoratorProxyFactoryTest.java?rev=1438425&r1=1438424&r2=1438425&view=diff
==============================================================================
--- openwebbeans/trunk/webbeans-impl/src/test/java/org/apache/webbeans/newtests/interceptors/factory/InterceptorDecoratorProxyFactoryTest.java (original)
+++ openwebbeans/trunk/webbeans-impl/src/test/java/org/apache/webbeans/newtests/interceptors/factory/InterceptorDecoratorProxyFactoryTest.java Fri Jan 25 10:27:14 2013
@@ -18,12 +18,18 @@
  */
 package org.apache.webbeans.newtests.interceptors.factory;
 
+import javax.enterprise.context.spi.CreationalContext;
+import javax.enterprise.inject.spi.Bean;
+import javax.enterprise.inject.spi.InjectionPoint;
+import java.lang.annotation.Annotation;
 import java.lang.reflect.InvocationTargetException;
 import java.lang.reflect.Method;
+import java.lang.reflect.Type;
 import java.net.URL;
 import java.net.URLClassLoader;
 import java.util.ArrayList;
 import java.util.List;
+import java.util.Set;
 
 import org.apache.webbeans.config.WebBeansContext;
 import org.apache.webbeans.exception.WebBeansException;
@@ -57,8 +63,74 @@ public class InterceptorDecoratorProxyFa
         Method[] interceptedMethods = methods.toArray(new Method[methods.size()]);
         Method[] nonInterceptedMethods = null;
 
+        Bean dummyBean = new Bean() {
+            @Override
+            public Object create(CreationalContext context)
+            {
+                return null;
+            }
+
+            @Override
+            public Set<Type> getTypes()
+            {
+                return null;
+            }
+
+            @Override
+            public Set<Annotation> getQualifiers()
+            {
+                return null;
+            }
+
+            @Override
+            public Class<? extends Annotation> getScope()
+            {
+                return null;
+            }
+
+            @Override
+            public String getName()
+            {
+                return null;
+            }
+
+            @Override
+            public boolean isNullable()
+            {
+                return false;
+            }
+
+            @Override
+            public Set<InjectionPoint> getInjectionPoints()
+            {
+                return null;
+            }
+
+            @Override
+            public Class<?> getBeanClass()
+            {
+                return null;
+            }
+
+            @Override
+            public Set<Class<? extends Annotation>> getStereotypes()
+            {
+                return null;
+            }
+
+            @Override
+            public boolean isAlternative()
+            {
+                return false;
+            }
+
+            @Override
+            public void destroy(Object instance, CreationalContext context)
+            {
+            }
+        };
 
-        Class<ClassInterceptedClass> proxyClass = pf.createProxyClass(classLoader, ClassInterceptedClass.class, interceptedMethods, nonInterceptedMethods);
+        Class<ClassInterceptedClass> proxyClass = pf.createProxyClass(dummyBean, classLoader, ClassInterceptedClass.class, interceptedMethods, nonInterceptedMethods);
         Assert.assertNotNull(proxyClass);
 
         ClassInterceptedClass internalInstance = new ClassInterceptedClass();

Modified: openwebbeans/trunk/webbeans-impl/src/test/java/org/apache/webbeans/newtests/interceptors/resolution/InterceptorProxyChainTest.java
URL: http://svn.apache.org/viewvc/openwebbeans/trunk/webbeans-impl/src/test/java/org/apache/webbeans/newtests/interceptors/resolution/InterceptorProxyChainTest.java?rev=1438425&r1=1438424&r2=1438425&view=diff
==============================================================================
--- openwebbeans/trunk/webbeans-impl/src/test/java/org/apache/webbeans/newtests/interceptors/resolution/InterceptorProxyChainTest.java (original)
+++ openwebbeans/trunk/webbeans-impl/src/test/java/org/apache/webbeans/newtests/interceptors/resolution/InterceptorProxyChainTest.java Fri Jan 25 10:27:14 2013
@@ -122,7 +122,7 @@ public class InterceptorProxyChainTest e
         Method[] businessMethods = methodInterceptors.keySet().toArray(new Method[methodInterceptors.size()]);
         Method[] nonInterceptedMethods = interceptorInfo.getNonInterceptedMethods().toArray(new Method[interceptorInfo.getNonInterceptedMethods().size()]);
 
-        Class<? extends ClassMultiInterceptedClass> proxyClass = pf.createProxyClass(classLoader, ClassMultiInterceptedClass.class, businessMethods, nonInterceptedMethods);
+        Class<? extends ClassMultiInterceptedClass> proxyClass = pf.createProxyClass(bean, classLoader, ClassMultiInterceptedClass.class, businessMethods, nonInterceptedMethods);
         Assert.assertNotNull(proxyClass);
 
 
@@ -135,7 +135,7 @@ public class InterceptorProxyChainTest e
             interceptorInstances.put(interceptorBean, interceptorInstance);
         }
         InterceptorHandler interceptorHandler
-                = new DefaultInterceptorHandler<ClassMultiInterceptedClass>(internalInstance, internalInstance, methodInterceptors, interceptorInstances);
+                = new DefaultInterceptorHandler<ClassMultiInterceptedClass>(internalInstance, internalInstance, methodInterceptors, interceptorInstances, null);
 
         ClassMultiInterceptedClass proxyInstance = pf.createProxyInstance(proxyClass, internalInstance, interceptorHandler);
         Assert.assertNotNull(proxyInstance);