/**
* Copyright (c) 2013-2016, The SeedStack authors <http://seedstack.org>
*
* This Source Code Form is subject to the terms of the Mozilla Public
* License, v. 2.0. If a copy of the MPL was not distributed with this
* file, You can obtain one at http://mozilla.org/MPL/2.0/.
*/
package org.seedstack.seed.web.internal;
import com.google.inject.Injector;
import org.seedstack.seed.web.spi.FilterDefinition;
import org.seedstack.seed.web.spi.ListenerDefinition;
import org.seedstack.seed.web.spi.ServletDefinition;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import javax.servlet.FilterRegistration;
import javax.servlet.ServletContext;
import javax.servlet.ServletRegistration;
class ServletContextConfigurer {
private static final Logger LOGGER = LoggerFactory.getLogger(ServletContextConfigurer.class);
private final ServletContext servletContext;
private final Injector injector;
ServletContextConfigurer(ServletContext servletContext, Injector injector) {
this.servletContext = servletContext;
this.injector = injector;
}
void addFilter(FilterDefinition filterDefinition) {
FilterRegistration.Dynamic filterRegistration = servletContext.addFilter(
filterDefinition.getName(),
injector.getInstance(filterDefinition.getFilterClass())
);
if (filterRegistration != null) {
filterRegistration.setAsyncSupported(filterDefinition.isAsyncSupported());
for (FilterDefinition.Mapping mapping : filterDefinition.getServletMappings()) {
filterRegistration.addMappingForServletNames(mapping.getDispatcherTypes(), mapping.isMatchAfter(), mapping.getValues());
}
for (FilterDefinition.Mapping mapping : filterDefinition.getMappings()) {
filterRegistration.addMappingForUrlPatterns(mapping.getDispatcherTypes(), mapping.isMatchAfter(), mapping.getValues());
}
filterRegistration.setInitParameters(filterDefinition.getInitParameters());
} else {
LOGGER.warn("Servlet filter {} was already registered by the container: injection and interception are not available. Consider adding a web.xml file with metadata-complete=true.", filterDefinition.getName());
}
}
void addServlet(ServletDefinition servletDefinition) {
ServletRegistration.Dynamic servletRegistration = servletContext.addServlet(
servletDefinition.getName(),
injector.getInstance(servletDefinition.getServletClass())
);
if (servletRegistration != null) {
servletRegistration.setAsyncSupported(servletDefinition.isAsyncSupported());
for (String mapping : servletDefinition.getMappings()) {
servletRegistration.addMapping(mapping);
}
servletRegistration.setLoadOnStartup(servletDefinition.getLoadOnStartup());
servletRegistration.setInitParameters(servletDefinition.getInitParameters());
} else {
LOGGER.warn("Servlet {} was already registered by the container: injection and interception are not available. Consider adding a web.xml file with metadata-complete=true.", servletDefinition.getName());
}
}
void addListener(ListenerDefinition listenerDefinition) {
servletContext.addListener(injector.getInstance(listenerDefinition.getListenerClass()));
}
}