src/java/de/uapcore/lightpit/ModuleManager.java

changeset 10
89e3e6e28b69
parent 9
20a9b2bc9063
child 11
737ab27e37b3
--- 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<Menu> mainMenu = new ArrayList<>();
+    private final List<Menu> 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<LightPITModule> getModuleInfo(Registration reg) {
         try {
             final Class scclass = Class.forName(reg.getClassName());
             
@@ -86,19 +90,36 @@
                 );
             }
             
-            return lpservlet && lpmodule;
+            if (lpservlet && lpmodule) {
+                final Class<? extends AbstractLightPITServlet> 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<LightPITModule> 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<Menu> getMainMenu() {
+        return immutableMainMenu;
+    }
 }

mercurial