package org.hotswap.agent.plugin.deltaspike.jsf; import java.util.List; import org.apache.deltaspike.core.api.config.view.ViewConfig; import org.apache.deltaspike.jsf.impl.config.view.ViewConfigExtension; import org.apache.deltaspike.jsf.impl.util.ViewConfigUtils; import org.hotswap.agent.logging.AgentLogger; import org.hotswap.agent.util.ReflectionHelper; /** * The Class ViewConfigReloader. */ public class ViewConfigReloader { private static AgentLogger LOGGER = AgentLogger.getLogger(ViewConfigReloader.class); public static void reloadViewConfig(ClassLoader classLoader, Object viewConfigExtensionObj, List rootClassNameList) { try { ViewConfigExtension viewConfigExtension = (ViewConfigExtension) viewConfigExtensionObj; viewConfigExtension.freeViewConfigCache(null); ReflectionHelper.invoke(viewConfigExtension, viewConfigExtension.getClass(), "resetRootNode", null); for (Object oClass : rootClassNameList) { Class<?> viewConfigRootClass = Class.forName((String)oClass, true, classLoader); if (viewConfigRootClass != null) { doAddPageDefinition(classLoader, viewConfigExtension, viewConfigRootClass); } } viewConfigExtension.buildViewConfig(null); } catch (ClassNotFoundException e) { LOGGER.error("Deltaspike view config reloading failed", e); } } private static void doAddPageDefinition(ClassLoader classLoader, ViewConfigExtension viewConfigExtension, Class<?> viewConfigClass) { if (ViewConfigUtils.isFolderConfig(viewConfigClass)) { viewConfigExtension.addFolderDefinition(viewConfigClass); } else if (ViewConfig.class.isAssignableFrom(viewConfigClass)){ viewConfigExtension.addPageDefinition((Class<? extends ViewConfig>) viewConfigClass); } for (Class<?> subClass: viewConfigClass.getDeclaredClasses()) { Class<?> reloadedSubclass; try { reloadedSubclass = Class.forName(subClass.getName(), true, classLoader); if (reloadedSubclass != null) { doAddPageDefinition(classLoader, viewConfigExtension, reloadedSubclass); } } catch (ClassNotFoundException e) { LOGGER.debug("ViewConfig subclass removed {} ", subClass.getName()); } } } }