/* * Copyright 2013 Atteo. * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. * You may obtain a copy of the License at * * http://www.apache.org/licenses/LICENSE-2.0 * * Unless required by applicable law or agreed to in writing, software * distributed under the License is distributed on an "AS IS" BASIS, * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * See the License for the specific language governing permissions and * limitations under the License. */ package org.atteo.moonshine; import java.io.IOException; import java.util.Enumeration; import java.util.Properties; import javax.servlet.ServletContext; import javax.servlet.ServletContextEvent; import javax.servlet.ServletContextListener; import org.atteo.filtering.PropertiesPropertyResolver; import org.atteo.filtering.PropertyResolver; import com.google.inject.Injector; import com.google.inject.servlet.GuiceServletContextListener; /** * {@link ServletContextListener} which starts {@link Moonshine} framework. * * <p> * Below is a sample web.xml which shows how to start Moonshine framework. * <pre> * {@code * * <web-app version="2.5" xmlns="http://java.sun.com/xml/ns/javaee" * xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" * xsi:schemaLocation="http://java.sun.com/xml/ns/javaee http://java.sun.com/xml/ns/javaee/web-app_2_5.xsd" * metadata-complete="true"> * * <context-param> * <!-- Any context param will be available as a ${property} in Moonshine --> * <param-name>property name</param-name> * <param-value>property value</param-value> * </context-param> * * <listener> * <listener-class>org.atteo.moonshine.MoonshineServletContextListener</listener-class> * </listener> * * <filter> * <filter-name>guiceFilter</filter-name> * <filter-class>com.google.inject.servlet.GuiceFilter</filter-class> * </filter> * * <filter-mapping> * <filter-name>guiceFilter</filter-name> * <url-pattern>/*</url-pattern> * </filter-mapping> * </web-app> * } * </pre> * </p> */ public class MoonshineServletContextListener extends GuiceServletContextListener { private Moonshine moonshine; @Override public void contextInitialized(ServletContextEvent servletContextEvent) { ServletContext servletContext = servletContextEvent.getServletContext(); try { Moonshine.Builder builder = Moonshine.Factory.builder(); configure(builder, servletContext); moonshine = builder.build(); if (moonshine != null) { moonshine.start(); } } catch (IOException | MoonshineException e) { throw new RuntimeException(e); } super.contextInitialized(servletContextEvent); } /** * Configures {@link Moonshine} using provided builder. * @param builder Moonshine builder * @param servletContext servlet context */ protected void configure(Moonshine.Builder builder, ServletContext servletContext) { builder .applicationName(servletContext.getServletContextName()) .shutdownHook(false) .addPropertyResolver(retrieveContextParameters(servletContext)); } @Override public void contextDestroyed(ServletContextEvent servletContextEvent) { super.contextDestroyed(servletContextEvent); if (moonshine != null) { moonshine.close(); } } @Override protected Injector getInjector() { return moonshine.getGlobalInjector(); } private static PropertyResolver retrieveContextParameters(ServletContext servletContext) { Properties properties = new Properties(); Enumeration<String> initParameterNames = servletContext.getInitParameterNames(); while (initParameterNames.hasMoreElements()) { String name = initParameterNames.nextElement(); properties.put(name, servletContext.getInitParameter(name)); } return new PropertiesPropertyResolver(properties); } }