/*
* Copyright 2010-2014 Ning, Inc.
*
* Ning licenses this file to you 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.killbill.commons.skeleton.listeners;
import javax.servlet.ServletContextEvent;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import com.google.common.base.Strings;
import com.google.common.collect.ImmutableList;
import com.google.inject.Guice;
import com.google.inject.Injector;
import com.google.inject.Module;
import com.google.inject.Stage;
/**
* Start up the base module when the server comes up. This gets configured in web.xml:
* <p/>
* <pre>
* <context-param>
* <param-name>guiceModuleClassName</param-name>
* <param-value>org.killbill.commons.skeleton.listeners.GuiceServletContextListener</param-value>
* </context-param>
* </pre>
*/
public class GuiceServletContextListener extends com.google.inject.servlet.GuiceServletContextListener {
private static final Logger log = LoggerFactory.getLogger(GuiceServletContextListener.class);
protected Iterable<? extends Module> guiceModules = null;
@Override
public void contextInitialized(final ServletContextEvent event) {
// Check if the module was overridden in subclasses
if (guiceModules == null) {
guiceModules = ImmutableList.<Module>of(initializeGuiceModuleFromWebXML(event));
}
super.contextInitialized(event);
}
private Module initializeGuiceModuleFromWebXML(final ServletContextEvent event) {
final String moduleClassName = event.getServletContext().getInitParameter("guiceModuleClassName");
if (Strings.isNullOrEmpty(moduleClassName)) {
throw new IllegalStateException("Missing parameter for the base Guice module!");
}
try {
final Class<?> moduleClass = Class.forName(moduleClassName);
if (!Module.class.isAssignableFrom(moduleClass)) {
throw new IllegalStateException(String.format("%s exists but is not a Guice Module!", moduleClassName));
}
final Module module = (Module) moduleClass.newInstance();
log.info("Instantiated " + moduleClassName + " as the main guice module.");
return module;
} catch (final ClassNotFoundException cnfe) {
throw new IllegalStateException(cnfe);
} catch (final InstantiationException ie) {
throw new IllegalStateException(ie);
} catch (final IllegalAccessException iae) {
throw new IllegalStateException(iae);
}
}
/**
* Do *not* use this method to retrieve the injector. It actually creates a new instance
* of a Guice injector which in turn will upset Guice.
*/
@Override
protected Injector getInjector() {
if (guiceModules == null) {
throw new IllegalStateException("Never found the Guice Module to use!");
}
return Guice.createInjector(Stage.PRODUCTION, guiceModules);
}
/**
* This method can be called by classes extending GuiceServletContextListener to retrieve
* the actual injector. This requires some inside knowledge on where it is
* stored, but the actual key is not visible outside the guice packages.
*/
public Injector injector(final ServletContextEvent event) {
return (Injector) event.getServletContext().getAttribute(Injector.class.getName());
}
}