package org.hotswap.agent.plugin.jbossmodules;
import org.hotswap.agent.annotation.Init;
import org.hotswap.agent.annotation.OnClassLoadEvent;
import org.hotswap.agent.annotation.Plugin;
import org.hotswap.agent.javassist.CannotCompileException;
import org.hotswap.agent.javassist.ClassPool;
import org.hotswap.agent.javassist.CtClass;
import org.hotswap.agent.javassist.NotFoundException;
import org.hotswap.agent.logging.AgentLogger;
import org.hotswap.agent.util.PluginManagerInvoker;
/**
* JBossModulesPlugin
*
* @author Vladimir Dvorak
*/
@Plugin(name = "JBossModules",
description = "JBossModules - Jboss modular class loading implementation. ",
testedVersions = {"1.4.4, 1.5.1"},
expectedVersions = {"1.x"},
supportClass={ModuleClassLoaderTransformer.class}
)
public class JBossModulesPlugin {
protected static AgentLogger LOGGER = AgentLogger.getLogger(JBossModulesPlugin.class);
// TODO : Skip system packages, it should be in config file
private static final String SKIP_MODULES_REGEXP = "sun\\.jdk.*|ibm\\.jdk.*|javax\\..*|org\\.jboss\\..*";
private static final String USE_MODULES_REGEXP = "deployment\\..*";
@Init
ClassLoader moduleClassLoader;
@OnClassLoadEvent(classNameRegexp = "org.jboss.modules.ModuleLoader")
public static void transformModule(ClassPool classPool, CtClass ctClass) throws NotFoundException, CannotCompileException {
ctClass.getDeclaredMethod("loadModule", new CtClass[]{classPool.get("org.jboss.modules.ModuleIdentifier")}).insertAfter(
"if (identifier.getName().matches(\"" + USE_MODULES_REGEXP + "\")) {" +
PluginManagerInvoker.buildInitializePlugin(JBossModulesPlugin.class, "$_.getClassLoaderPrivate()") +
"}" +
"return $_;"
);
ctClass.getDeclaredMethod("unloadModuleLocal", new CtClass[]{classPool.get("org.jboss.modules.Module")}).insertBefore(
"if(!$1.getIdentifier().getName().matches(\"" + SKIP_MODULES_REGEXP + "\")) {" +
PluginManagerInvoker.buildCallCloseClassLoader("$1.getClassLoaderPrivate()") +
"}"
);
LOGGER.debug("Class 'org.jboss.modules.Module' patched.");
}
}