diff -r 20a9b2bc9063 -r 89e3e6e28b69 src/java/de/uapcore/lightpit/ModuleManager.java --- a/src/java/de/uapcore/lightpit/ModuleManager.java Fri Dec 15 17:39:54 2017 +0100 +++ b/src/java/de/uapcore/lightpit/ModuleManager.java Sat Dec 16 20:19:28 2017 +0100 @@ -28,6 +28,10 @@ */ package de.uapcore.lightpit; +import java.util.ArrayList; +import java.util.Collections; +import java.util.List; +import java.util.Optional; import javax.servlet.Registration; import javax.servlet.ServletContext; import javax.servlet.ServletContextEvent; @@ -40,7 +44,7 @@ * Scans registered servlets for LightPIT modules. */ @WebListener -public class ModuleManager implements ServletContextListener { +public final class ModuleManager implements ServletContextListener { private static final Logger LOG = LoggerFactory.getLogger(ModuleManager.class); @@ -48,8 +52,10 @@ * The attribute name in the servlet context under which an instance of this class can be found. */ public static final String SC_ATTR_NAME = ModuleManager.class.getName(); + private ServletContext sc; - private ServletContext sc; + private final List mainMenu = new ArrayList<>(); + private final List immutableMainMenu = Collections.unmodifiableList(mainMenu); @Override public void contextInitialized(ServletContextEvent sce) { @@ -61,12 +67,10 @@ @Override public void contextDestroyed(ServletContextEvent sce) { - assert sc != null && sc.equals(sce.getServletContext()); - sc.removeAttribute(SC_ATTR_NAME); unloadAll(); } - private boolean isRegisteredAsModule(Registration reg) { + private Optional getModuleInfo(Registration reg) { try { final Class scclass = Class.forName(reg.getClassName()); @@ -86,19 +90,36 @@ ); } - return lpservlet && lpmodule; + if (lpservlet && lpmodule) { + final Class clazz = scclass; + final LightPITModule moduleInfo = clazz.getAnnotation(LightPITModule.class); + return Optional.of(moduleInfo); + } else { + return Optional.empty(); + } } catch (ClassNotFoundException ex) { LOG.error( "Servlet registration refers to class {} which cannot be found by the class loader (Reason: {})", reg.getClassName(), ex.getMessage() ); - return false; + return Optional.empty(); } } + private void addModuleToMenu(LightPITModule moduleInfo) { + final Menu menu = new Menu( + new ResourceKey(moduleInfo.bundleBaseName(), moduleInfo.menuKey()), + moduleInfo.modulePath() + ); + mainMenu.add(menu); + } + private void handleServletRegistration(String name, Registration reg) { - if (isRegisteredAsModule(reg)) { + final Optional moduleInfo = getModuleInfo(reg); + if (moduleInfo.isPresent()) { + addModuleToMenu(moduleInfo.get()); + LOG.info("Module detected: {}", name); } else { LOG.debug("Servlet {} is no module, skipping.", name); @@ -117,6 +138,15 @@ * Unloads all found modules. */ public void unloadAll() { + mainMenu.clear(); LOG.info("All modules unloaded."); } + + /** + * Returns the main menu. + * @return a list of menus belonging to the main menu + */ + public List getMainMenu() { + return immutableMainMenu; + } }