package com.sun.j2ee.blueprints.waf.controller.web;
import java.io.PrintWriter;
import java.io.OutputStreamWriter;
import java.io.IOException;
import java.util.HashMap;
import java.util.Locale;
import javax.servlet.ServletException;
import javax.servlet.ServletContext;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpSession;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import javax.servlet.ServletConfig;
import javax.naming.NamingException;
import com.sun.j2ee.blueprints.waf.util.I18nUtil;
import com.sun.j2ee.blueprints.waf.exceptions.GeneralFailureException;
import com.sun.j2ee.blueprints.util.tracer.Debug;
import com.sun.j2ee.blueprints.waf.controller.web.URLMappingsXmlDAO;
import com.sun.j2ee.blueprints.waf.controller.web.RequestProcessor;
import com.sun.j2ee.blueprints.waf.controller.web.util.WebKeys;
import com.sun.j2ee.blueprints.waf.util.JNDINames;
import com.sun.j2ee.blueprints.waf.controller.web.flow.FlowHandlerException;
import com.sun.j2ee.blueprints.waf.controller.web.flow.ScreenFlowManager;
import com.sun.j2ee.blueprints.waf.controller.web.WebController;
public class MainServlet extends HttpServlet {
private ServletContext context;
private HashMap urlMappings;
private HashMap eventMappings;
private Locale defaultLocale = null;
private RequestProcessor requestProcessor;
public void init(ServletConfig config) throws ServletException {
String defaultLocaleString = config.getInitParameter("default_locale");
defaultLocale = I18nUtil.getLocaleFromString(defaultLocaleString);
this.context = config.getServletContext();
String requestMappingsURL = null;
try {
requestMappingsURL = context.getResource("/WEB-INF/mappings.xml").toString();
} catch (java.net.MalformedURLException ex) {
System.err.println("MainServlet: initializing ScreenFlowManager malformed URL exception: " + ex);
}
urlMappings = URLMappingsXmlDAO.loadRequestMappings(requestMappingsURL);
context.setAttribute(WebKeys.URL_MAPPINGS, urlMappings);
eventMappings = URLMappingsXmlDAO.loadEventMappings(requestMappingsURL);
context.setAttribute(WebKeys.EVENT_MAPPINGS, eventMappings);
getScreenFlowManager();
getRequestProcessor();
}
public void doGet(HttpServletRequest request, HttpServletResponse response)
throws IOException, ServletException {
doProcess(request, response);
}
public void doPost(HttpServletRequest request, HttpServletResponse response)
throws IOException, ServletException {
doProcess(request, response);
}
private void doProcess(HttpServletRequest request, HttpServletResponse response)
throws IOException, ServletException {
if (request.getSession().getAttribute(WebKeys.LOCALE) == null) {
request.getSession().setAttribute(WebKeys.LOCALE, defaultLocale);
}
try {
getRequestProcessor().processRequest(request);
getScreenFlowManager().forwardToNextScreen(request,response);
} catch (Throwable ex) {
String className = ex.getClass().getName();
String nextScreen = getScreenFlowManager().getExceptionScreen(ex);
request.setAttribute("javax.servlet.jsp.jspException", ex);
if (nextScreen == null) {
ex.printStackTrace();
throw new ServletException("MainServlet: unknown exception: " + className);
}
context.getRequestDispatcher(nextScreen).forward(request, response);
}
}
private RequestProcessor getRequestProcessor() {
RequestProcessor rp = (RequestProcessor)context.getAttribute(WebKeys.REQUEST_PROCESSOR);
if ( rp == null ) {
rp = new RequestProcessor();
rp.init(context);
context.setAttribute(WebKeys.REQUEST_PROCESSOR, rp);
}
return rp;
}
private ScreenFlowManager getScreenFlowManager() {
ScreenFlowManager screenManager = (ScreenFlowManager)context.getAttribute(WebKeys.SCREEN_FLOW_MANAGER);
if (screenManager == null ) {
screenManager = new ScreenFlowManager();
screenManager.init(context);
context.setAttribute(WebKeys.SCREEN_FLOW_MANAGER, screenManager);
}
return screenManager;
}
private URLMapping getURLMapping(String urlPattern) {
if ((urlMappings != null) && urlMappings.containsKey(urlPattern)) {
return (URLMapping)urlMappings.get(urlPattern);
} else {
return null;
}
}
}