package com.netflix.governator.guice.servlet;
import java.lang.reflect.Modifier;
import java.util.EnumSet;
import java.util.LinkedList;
import java.util.List;
import java.util.Set;
import javax.servlet.DispatcherType;
import javax.servlet.ServletContainerInitializer;
import javax.servlet.ServletContext;
import javax.servlet.ServletException;
import javax.servlet.annotation.HandlesTypes;
import com.google.inject.Injector;
import com.google.inject.servlet.GuiceFilter;
@HandlesTypes(WebApplicationInitializer.class)
public class GovernatorServletContainerInitializer implements ServletContainerInitializer {
@Override
public void onStartup(Set<Class<?>> initializerClasses, ServletContext servletContext) throws ServletException {
final WebApplicationInitializer initializer = getInitializer(initializerClasses, servletContext);
if (initializer != null) {
servletContext.addFilter("guiceFilter", new GuiceFilter()).addMappingForUrlPatterns(EnumSet.allOf(DispatcherType.class), true, "/*");
servletContext.addListener(new GovernatorServletContextListener() {
@Override
protected Injector createInjector() throws Exception {
return initializer.createInjector();
}
});
}
}
private WebApplicationInitializer getInitializer(Set<Class<?>> initializerClasses, ServletContext servletContext)
throws ServletException {
List<WebApplicationInitializer> initializers = new LinkedList<WebApplicationInitializer>();
if (initializerClasses != null) {
for (Class<?> initializerClass : initializerClasses) {
if (!initializerClass.isInterface() && !Modifier.isAbstract(initializerClass.getModifiers())
&& WebApplicationInitializer.class.isAssignableFrom(initializerClass)) {
try {
initializers.add((WebApplicationInitializer) initializerClass.newInstance());
} catch (Throwable ex) {
throw new ServletException("Failed to instantiate WebApplicationInitializer class", ex);
}
}
}
}
if (initializers.isEmpty()) {
servletContext.log("No WebApplicationInitializer types found on classpath");
return null;
}
if (initializers.size() > 1) {
servletContext.log(
"Multiple WebApplicationInitializer types found on classpath. Expected one but found " + initializers.size());
return null;
}
return initializers.get(0);
}
}