package org.kisst.servlet4j;
import org.kisst.http4j.server.HttpCall;
import org.kisst.http4j.server.HttpCallHandler;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import java.io.IOException;
import java.io.PrintWriter;
import java.util.HashMap;
public class ServletContainer implements HttpCallHandler {
private final static Logger logger=LoggerFactory.getLogger(ServletContainer.class);
public void addServlet(String url, AbstractServlet servlet) {
handlerMap.put(url, servlet);
}
private HashMap<String, AbstractServlet> handlerMap=new HashMap<String, AbstractServlet>();
@Override public void handle(HttpCall call, String subPath) {
//public void handle(String target,Request baseRequest,HttpServletRequest request,HttpServletResponse response) {
logger.info("Handling request {}",call.request.getQueryString());
String path=call.request.getRequestURI();
call.baseRequest.setHandled(true);
try {
if ("/".equals(path))
path="default";
for (String prefix : handlerMap.keySet()) {
if (path.startsWith(prefix)) {
handlerMap.get(prefix).handle(call.request, call.response);
return;
}
}
//handlerMap.get("default").handle(request, response);
throw new RuntimeException("No servlet for path ["+path+"}");
}
catch (Exception e) {
try {
PrintWriter out = call.response.getWriter();
out.println(e.getMessage());
out.println("<pre>");
e.printStackTrace(out);
out.println("</pre>");
} catch (IOException e1) {
// ignore the new error, and now write to the logfile anyway
logger.error("Error when handling "+path, e);
}
}
}
}