package org.hotswap.agent.plugin.deltaspike.proxy;
import java.lang.reflect.InvocationHandler;
import java.lang.reflect.Method;
import javax.enterprise.inject.spi.BeanManager;
import org.apache.deltaspike.core.api.provider.BeanManagerProvider;
import org.apache.deltaspike.partialbean.impl.PartialBeanProxyFactory;
import org.hotswap.agent.logging.AgentLogger;
import org.hotswap.agent.util.ReflectionHelper;
public class PartialBeanClassRefreshAgent {
private static AgentLogger LOGGER = AgentLogger.getLogger(PartialBeanClassRefreshAgent.class);
public static void refreshPartialBeanClass(ClassLoader classLoader, Object partialBean) {
ClassLoader oldContextClassLoader = Thread.currentThread().getContextClassLoader();
ProxyClassLoadingDelegate.beginProxyRegeneration();
try {
Thread.currentThread().setContextClassLoader(classLoader);
Object lifecycle = (Object) ReflectionHelper.get(partialBean, "lifecycle");
if (lifecycle != null) {
Class<?> targetClass = (Class) ReflectionHelper.get(lifecycle, "targetClass");
PartialBeanProxyFactory proxyFactory = PartialBeanProxyFactory.getInstance();
try {
// Deltaspike 1.5
Method m3 = PartialBeanProxyFactory.class.getMethod("getProxyClass", new Class[] { BeanManager.class, Class.class, Class.class} );
Class<? extends InvocationHandler> delegateInvocationHandlerClass = (Class) ReflectionHelper.get(lifecycle, "delegateInvocationHandlerClass");
m3.invoke(proxyFactory, new Object[] {BeanManagerProvider.getInstance().getBeanManager(), targetClass, delegateInvocationHandlerClass} );
} catch (NoSuchMethodException e) {
// Deltaspike 1.7
Method m2 = PartialBeanProxyFactory.class.getMethod("getProxyClass", new Class[] { BeanManager.class, Class.class } );
m2.invoke(proxyFactory, new Object[] {BeanManagerProvider.getInstance().getBeanManager(), targetClass} );
}
}
} catch (Exception e) {
LOGGER.error("Deltaspike proxy redefinition failed", e);
} finally {
Thread.currentThread().setContextClassLoader(oldContextClassLoader);
ProxyClassLoadingDelegate.endProxyRegeneration();
}
}
}