package org.hotswap.agent.plugin.jsf; import java.lang.reflect.Method; import org.hotswap.agent.annotation.Init; import org.hotswap.agent.annotation.OnClassLoadEvent; import org.hotswap.agent.annotation.OnResourceFileEvent; import org.hotswap.agent.annotation.Plugin; import org.hotswap.agent.command.Command; import org.hotswap.agent.command.Scheduler; import org.hotswap.agent.javassist.CannotCompileException; import org.hotswap.agent.javassist.CtClass; import org.hotswap.agent.javassist.CtConstructor; import org.hotswap.agent.javassist.NotFoundException; import org.hotswap.agent.logging.AgentLogger; import org.hotswap.agent.util.PluginManagerInvoker; @Plugin(name = "MyFaces", description = "JSF/MyFaces. Clear resource bundle cache when *.properties files are changed.", testedVersions = {"2.2.10"}, expectedVersions = {"2.2"}) public class MyFacesPlugin { private static AgentLogger LOGGER = AgentLogger.getLogger(MyFacesPlugin.class); @Init Scheduler scheduler; @Init ClassLoader appClassLoader; @OnClassLoadEvent(classNameRegexp = "org.apache.myfaces.config.RuntimeConfig") public static void facesApplicationAssociateInitialized(CtClass ctClass) throws NotFoundException, CannotCompileException { String buildInitializePlugin = PluginManagerInvoker.buildInitializePlugin(MyFacesPlugin.class); for (CtConstructor constructor : ctClass.getDeclaredConstructors()) { constructor.insertAfter(buildInitializePlugin); } LOGGER.debug("org.apache.myfaces.config.RuntimeConfig with plugin initialization."); } @OnResourceFileEvent(path = "/", filter = ".*.properties") public void refreshJsfResourceBundles() { scheduler.scheduleCommand(refreshResourceBundles); } private Command refreshResourceBundles = new Command() { public void executeCommand() { LOGGER.debug("Refreshing JSF resource bundles."); try { Class<?> clazz = resolveClass("java.util.ResourceBundle"); Method clearCacheMethod = clazz.getDeclaredMethod("clearCache", ClassLoader.class); clearCacheMethod.invoke(null, appClassLoader); } catch (Exception e) { LOGGER.error("Error clear JSF resource bundles cache", e); } } }; private Class<?> resolveClass(String name) throws ClassNotFoundException { return Class.forName(name, true, appClassLoader); } }