package org.hotswap.agent.plugin.owb;
import org.hotswap.agent.annotation.OnClassLoadEvent;
import org.hotswap.agent.javassist.CannotCompileException;
import org.hotswap.agent.javassist.ClassPool;
import org.hotswap.agent.javassist.CtClass;
import org.hotswap.agent.javassist.CtConstructor;
import org.hotswap.agent.javassist.CtField;
import org.hotswap.agent.javassist.NotFoundException;
import org.hotswap.agent.logging.AgentLogger;
/**
* WebBeanContextTransformer - extend WebContextsService by WebContextsTracker
*
* @author Vladimir Dvorak
*/
public class WebBeansContextsServiceTransformer {
private static AgentLogger LOGGER = AgentLogger.getLogger(WebBeansContextsServiceTransformer.class);
public static final String CONTEXT_TRACKER_FLD_NAME = "__contextTracker";
@OnClassLoadEvent(classNameRegexp = "org.apache.webbeans.web.context.WebContextsService")
public static void transform(CtClass ctClass, ClassPool classPool) throws NotFoundException, CannotCompileException {
CtField contextTrackerFld = CtField.make("public org.hotswap.agent.plugin.owb.command.WebContextsTracker " + CONTEXT_TRACKER_FLD_NAME + ";", ctClass);
ctClass.addField(contextTrackerFld);
CtClass[] constructorParams = new CtClass[] {
classPool.get("org.apache.webbeans.config.WebBeansContext")
};
CtConstructor declaredConstructor = ctClass.getDeclaredConstructor(constructorParams);
declaredConstructor.insertAfter(
"{ " +
"this." + CONTEXT_TRACKER_FLD_NAME + " = new org.hotswap.agent.plugin.owb.command.WebContextsTracker();" +
"this.requestContexts = this." + CONTEXT_TRACKER_FLD_NAME + ".requestContexts; " +
"this.sessionContexts = this." + CONTEXT_TRACKER_FLD_NAME + ".sessionContexts; " +
"this.conversationContexts = this." + CONTEXT_TRACKER_FLD_NAME + ".conversationContexts;" +
"}"
);
LOGGER.debug("Class '{}' patched with .", ctClass.getName());
}
}