/*
**
** Copyright 2013, Jules White
**
**
*/
package org.magnum.soda.server.wamp;
import java.lang.reflect.InvocationHandler;
import java.lang.reflect.Method;
import java.util.Map;
import java.util.WeakHashMap;
import org.magnum.soda.proxy.ProxyCreator;
import org.mockito.cglib.proxy.Callback;
import org.mockito.cglib.proxy.Enhancer;
import org.mockito.cglib.proxy.MethodInterceptor;
import org.mockito.cglib.proxy.MethodProxy;
import org.objenesis.ObjenesisHelper;
public class CglibProxyCreator implements ProxyCreator {
public CglibProxyCreator(ClassLoader cl) {
classLoader_ = cl;
}
private class CglibProxy implements MethodInterceptor {
private InvocationHandler handler_;
public CglibProxy (InvocationHandler hdlr) {
handler_ = hdlr;
}
public Object intercept(Object object, Method method, Object[] args, MethodProxy methodProxy ) throws Throwable {
return handler_.invoke(object, method, args);
}
}
private ClassLoader classLoader_;
private Map<Object,InvocationHandler> proxies_ = new WeakHashMap<Object, InvocationHandler>();
@Override
public Object createProxy(ClassLoader cl, Class<?>[] types,
InvocationHandler hdlr) {
Enhancer enhancer = new Enhancer();
enhancer.setSuperclass(types[0]);
CglibProxy intercept = new CglibProxy(hdlr);
enhancer.setCallbackType(intercept.getClass());
final Class<?> proxyClass = enhancer.createClass();
Enhancer.registerCallbacks(proxyClass, new Callback[]{intercept});
Object proxy = ObjenesisHelper.newInstance(proxyClass);
proxies_.put(proxy,hdlr);
return proxy;
}
@Override
public InvocationHandler getInvocationHandler(Object proxy) {
return proxies_.get(proxy);
}
@Override
public boolean supportsNonInterfaceProxies() {
return true;
}
@Override
public ClassLoader getProxyClassLoader() {
return classLoader_;
}
}