package org.hotswap.agent.annotation.handler; import org.hotswap.agent.annotation.OnClassLoadEvent; import org.hotswap.agent.config.PluginManager; import org.hotswap.agent.logging.AgentLogger; import org.hotswap.agent.util.HotswapTransformer; /** * Transform method handler - handle @OnClassLoadEvent annotation on a method. * * @author Jiri Bubnik */ public class OnClassLoadedHandler implements PluginHandler<OnClassLoadEvent> { protected static AgentLogger LOGGER = AgentLogger.getLogger(OnClassLoadedHandler.class); protected PluginManager pluginManager; protected HotswapTransformer hotswapTransformer; public OnClassLoadedHandler(PluginManager pluginManager) { this.pluginManager = pluginManager; this.hotswapTransformer = pluginManager.getHotswapTransformer(); if (hotswapTransformer == null) { throw new IllegalArgumentException("Error instantiating OnClassLoadedHandler. Hotswap transformer is missing in PluginManager."); } } @Override public boolean initField(PluginAnnotation<OnClassLoadEvent> pluginAnnotation) { throw new IllegalAccessError("@OnClassLoadEvent annotation not allowed on fields."); } @Override public boolean initMethod(final PluginAnnotation<OnClassLoadEvent> pluginAnnotation) { LOGGER.debug("Init for method " + pluginAnnotation.getMethod()); if (hotswapTransformer == null) { LOGGER.error("Error in init for method " + pluginAnnotation.getMethod() + ". Hotswap transformer is missing."); return false; } final OnClassLoadEvent annot = pluginAnnotation.getAnnotation(); if (annot == null) { LOGGER.error("Error in init for method " + pluginAnnotation.getMethod() + ". Annotation missing."); return false; } ClassLoader appClassLoader = null; if (pluginAnnotation.getPlugin() != null){ appClassLoader = pluginManager.getPluginRegistry().getAppClassLoader(pluginAnnotation.getPlugin()); } hotswapTransformer.registerTransformer(appClassLoader, annot.classNameRegexp(), new PluginClassFileTransformer(pluginManager, pluginAnnotation)); return true; } }