package org.fenixedu.bennu.portal.servlet; import java.io.IOException; import java.io.InputStream; import java.util.Arrays; import java.util.Collection; import java.util.Collections; import java.util.EnumSet; import java.util.HashSet; import java.util.Set; import javax.servlet.DispatcherType; import javax.servlet.FilterRegistration; import javax.servlet.ServletContextEvent; import javax.servlet.ServletContextListener; import javax.servlet.annotation.WebListener; import org.fenixedu.bennu.core.servlet.ExceptionHandlerFilter; import org.fenixedu.bennu.core.util.CoreConfiguration; import org.slf4j.Logger; import org.slf4j.LoggerFactory; @WebListener public class PortalInitializer implements ServletContextListener { private static final Logger logger = LoggerFactory.getLogger(PortalInitializer.class); private static final Set<String> themes = new HashSet<>(); @Override public void contextInitialized(ServletContextEvent sce) { Collection<String> themePaths = sce.getServletContext().getResourcePaths("/themes/"); if (themePaths != null) { for (String themePath : themePaths) { try (InputStream stream = sce.getServletContext().getResourceAsStream(themePath + "/default.html")) { if (stream != null) { themes.add(themePath.substring("/themes/".length(), themePath.length() - 1)); } } catch (IOException e) { logger.warn("Could not detect default layout for theme " + themePath, e); } } } logger.info("Available Themes : " + Arrays.toString(themes.toArray())); registerBuiltinPortalBackends(); // Install Bennu Portal Dispatcher. It must be programmatically registered, so that is runs after EVERY other filter FilterRegistration registration = sce.getServletContext().addFilter("BennuPortalDispatcher", BennuPortalDispatcher.class); registration.addMappingForUrlPatterns(EnumSet.of(DispatcherType.REQUEST), true, "/*"); if (CoreConfiguration.getConfiguration().developmentMode()) { ExceptionHandlerFilter.setExceptionHandler(new PortalDevModeExceptionHandler(sce.getServletContext())); } else { ExceptionHandlerFilter.setExceptionHandler(new PortalExceptionHandler(sce.getServletContext())); } sce.getServletContext().setAttribute("portal", new PortalBean(sce.getServletContext())); } private void registerBuiltinPortalBackends() { PortalBackendRegistry.registerPortalBackend(new RedirectPortalBackend()); PortalBackendRegistry.registerPortalBackend(new ForwarderPortalBackend()); } @Override public void contextDestroyed(ServletContextEvent sce) { } public static Set<String> getThemes() { return Collections.unmodifiableSet(themes); } public static boolean isThemeAvailable(String theme) { return themes.contains(theme); } }