/******************************************************************************* * Gisgraphy Project * * This library is free software; you can redistribute it and/or * modify it under the terms of the GNU Lesser General Public * License as published by the Free Software Foundation; either * version 2.1 of the License, or (at your option) any later version. * * This library is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * Lesser General Public License for more details. * * You should have received a copy of the GNU Lesser General Public * License along with this library; if not, write to the Free Software * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307, USA * * Copyright 2008 Gisgraphy project * David Masclet <davidmasclet@gisgraphy.com> * * *******************************************************************************/ package com.gisgraphy.webapp.listener; import java.util.HashMap; import java.util.List; import java.util.Map; import javax.servlet.ServletContext; import javax.servlet.ServletContextEvent; import javax.servlet.ServletContextListener; import org.apache.commons.logging.Log; import org.apache.commons.logging.LogFactory; import org.springframework.beans.factory.NoSuchBeanDefinitionException; import org.springframework.context.ApplicationContext; import org.springframework.security.authentication.AuthenticationProvider; import org.springframework.security.authentication.ProviderManager; import org.springframework.security.authentication.RememberMeAuthenticationProvider; import org.springframework.web.context.support.WebApplicationContextUtils; import com.gisgraphy.Constants; import com.gisgraphy.model.LabelValue; import com.gisgraphy.service.LookupManager; /** * <p> * StartupListener class used to initialize and database settings and populate * any application-wide drop-downs. <p/> * <p> * Keep in mind that this listener is executed outside of * OpenSessionInViewFilter, so if you're using Hibernate you'll have to * explicitly initialize all loaded data at the GenericDao or service level to * avoid LazyInitializationException. Hibernate.initialize() works well for * doing this. * * @author <a href="mailto:matt@raibledesigns.com">Matt Raible</a> */ public class StartupListener implements ServletContextListener { private static final Log log = LogFactory.getLog(StartupListener.class); @SuppressWarnings( { "unchecked" }) public void contextInitialized(ServletContextEvent event) { log.debug("initializing context..."); ServletContext context = event.getServletContext(); // Orion starts Servlets before Listeners, so check if the config // object already exists Map<String, Object> config = (HashMap<String, Object>) context .getAttribute(Constants.CONFIG); if (config == null) { config = new HashMap<String, Object>(); } if (context.getInitParameter(Constants.CSS_THEME) != null) { config.put(Constants.CSS_THEME, context .getInitParameter(Constants.CSS_THEME)); } ApplicationContext ctx = WebApplicationContextUtils .getRequiredWebApplicationContext(context); boolean encryptPassword = true; try { ProviderManager provider = (ProviderManager) ctx.getBean(ctx.getBeanNamesForType(ProviderManager.class)[0]); for (Object o : provider.getProviders()) { AuthenticationProvider p = (AuthenticationProvider) o; if (p instanceof RememberMeAuthenticationProvider) { config.put("rememberMeEnabled", Boolean.TRUE); } config.put(Constants.ENCRYPT_PASSWORD, Boolean.TRUE); config.put(Constants.ENC_ALGORITHM, "SHA"); } } catch (NoSuchBeanDefinitionException n) { log.debug("authenticationManager bean not found, assuming test and ignoring..."); // ignore, should only happen when testing } context.setAttribute(Constants.CONFIG, config); // output the retrieved values for the Init and Context Parameters if (log.isDebugEnabled()) { log .debug("Remember Me Enabled? " + config.get("rememberMeEnabled")); log.debug("Encrypt Passwords? " + encryptPassword); if (encryptPassword) { log.debug("Encryption Algorithm: " + config.get(Constants.ENC_ALGORITHM)); } log.debug("Populating drop-downs..."); } setupContext(context); } /** * This method uses the LookupManager to lookup available roles from the * data layer. * * @param context * The servlet context */ public static void setupContext(ServletContext context) { ApplicationContext ctx = WebApplicationContextUtils .getRequiredWebApplicationContext(context); LookupManager mgr = (LookupManager) ctx.getBean("lookupManager"); // get list of possible roles List<LabelValue> allRoles = mgr.getAllRoles(); context.setAttribute(Constants.AVAILABLE_ROLES, allRoles); log.debug("Drop-down initialization complete [OK]"); } /** * Shutdown servlet context (currently a no-op method). * * @param servletContextEvent * The servlet context event */ public void contextDestroyed(ServletContextEvent servletContextEvent) { // LogFactory.release(Thread.currentThread().getContextClassLoader()); // Commented out the above call to avoid warning when SLF4J in // classpath. // WARN: The method class // org.apache.commons.logging.impl.SLF4JLogFactory#release() was // invoked. // WARN: Please see http://www.slf4j.org/codes.html for an explanation. } }