package com.aol.micro.server.servers;
import javax.servlet.ServletContext;
import javax.servlet.ServletRegistration;
import org.pcollections.PStack;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import com.aol.micro.server.auto.discovery.ServletConfiguration;
import com.aol.micro.server.servers.model.ServerData;
import com.aol.micro.server.servers.model.ServletData;
import lombok.AllArgsConstructor;
@AllArgsConstructor
public class ServletConfigurer {
private final Logger logger = LoggerFactory.getLogger(getClass());
private final ServerData serverData;
private final PStack<ServletData> servletData;
public void addServlets(ServletContext webappContext) {
addExplicitlyDeclaredServlets(webappContext);
addAutoDiscoveredServlets(webappContext);
}
private void handleServlet(ServletConfiguration servlet,ServletContext webappContext){
servlet.getServlet().visit(clazz-> {
setInitParameters(webappContext.addServlet(getName(servlet),
clazz), servlet)
.addMapping(servlet.getMapping());
return 1;
}, obj-> {
ServletRegistration.Dynamic servletReg = webappContext.addServlet(
servlet.getName(), obj);
servletReg.addMapping(servlet.getMapping());
return 2;
});
}
private void addAutoDiscoveredServlets(ServletContext webappContext) {
serverData
.getRootContext()
.getBeansOfType(ServletConfiguration.class)
.values()
.forEach(servlet -> handleServlet(servlet,webappContext));
}
private void addExplicitlyDeclaredServlets(ServletContext webappContext) {
for (ServletData servletData : servletData) {
ServletRegistration.Dynamic servletReg = webappContext.addServlet(
servletData.getServletName(), servletData.getServlet());
servletReg.addMapping(servletData.getMapping());
logServlet(servletData);
}
}
private void logServlet(ServletData servlet) {
logger.info("Registering {} servlet on {}",servlet.getServlet().getClass().getName(), servlet.getMapping());
}
private void logServlet(ServletConfiguration servlet) {
logger.info("Registering {} servlet on {}",servlet.getClass().getName(), servlet.getMapping()[0]);
}
private ServletRegistration.Dynamic setInitParameters(
ServletRegistration.Dynamic addServlet, ServletConfiguration servlet) {
addServlet.setInitParameters(servlet.getInitParameters());
return addServlet;
}
private String getName(ServletConfiguration servlet) {
if (servlet.getName() != null)
return servlet.getName();
return servlet.getClass().getName();
}
}