package org.tgdb.frame;
import org.tgdb.util.Timer;
import java.io.*;
import java.util.Enumeration;
import javax.servlet.RequestDispatcher;
import javax.servlet.ServletContext;
import javax.servlet.ServletException;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import javax.servlet.http.HttpSession;
import javax.xml.parsers.DocumentBuilder;
import javax.xml.parsers.DocumentBuilderFactory;
import org.apache.log4j.Logger;
import org.w3c.dom.Document;
import org.w3c.dom.Element;
import org.w3c.dom.NodeList;
public class Controller extends HttpServlet
{
private static Logger logger = Logger.getLogger(Controller.class);
private static final String CONTROLLER_TAG = "controller";
private static final String WORKFLOWMANAGERS_TAG = "workflow-managers";
private static final String WORKFLOWMANAGER_TAG = "workflow-manager";
private static final String CLASS_ATTR = "class";
private static final String ACTIONPREFIX_ATTR = "actionPrefix";
private static final String WORKFLOW_MANAGER = "WorkflowManager";
private String workflowManagerClassName;
private String loginClassName;
public void init() throws ServletException {
try
{
parseXML();
navAction = new NavigatorAction();
requestLogAction = new RequestLogAction();
}
catch (Exception e)
{
throw new ServletException("Failed to read controller.xml");
}
}
private void debugSession(HttpSession session) {
Enumeration names = session.getAttributeNames();
String out = "------------------------------>Controller#debugSession: \n";
while (names.hasMoreElements())
{
out += names.nextElement()+"\n";
}
logger.debug(out);
}
private NavigatorAction navAction;
private RequestLogAction requestLogAction;
private Caller checkLogin(HttpServletRequest request, HttpServletResponse response) throws ArxFrameException {
try
{
HttpSession session = request.getSession();
Caller caller = (Caller)session.getAttribute("caller");
if (caller == null){
logger.debug("------------------------------>Controller#checkLogin: Caller is null");
Class c = Class.forName(loginClassName);
ILogin login = (ILogin)c.newInstance();
caller = login.doLogin(request, response);
session.setAttribute("caller", caller);
return caller;
}else{
logger.debug("------------------------------>Controller#checkLogin: Caller not null ("+caller.getName()+")");
Class c = Class.forName(loginClassName);
ILogin login = (ILogin)c.newInstance();
Caller newcaller = login.doLogin(request, response);
if(newcaller.getUsr().compareTo(caller.getUsr())!=0){
logger.debug("------------------------------>Controller#checkLogin: Caller not null. User '"+caller.getUsr()+"' logs out & user '"+newcaller.getUsr()+"' logs in.");
caller = null;
session.invalidate();
Navigator nav = new Navigator();
request.getSession().setAttribute("caller", newcaller);
request.getSession().setAttribute("navigator", nav);
System.gc();
return newcaller;
}else{
newcaller = null;
System.gc();
return caller;
}
}
}
catch (ArxLoginForward alf)
{
throw alf;
}
catch (Exception e)
{
logger.error("------------------------------>Controller#checkLogin: Could not login", e);
throw new ArxFrameException("Could not login", e);
}
}
protected void processRequest(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
try
{
response.setHeader("Expires", "Sat, 6 May 1995 12:00:00 GMT");
response.setHeader("Cache-Control", "no-store, no-cache, must-revalidate");
response.addHeader("Cache-Control", "post-check=0, pre-check=0");
response.setHeader("Pragma", "no-cache");
response.setContentType("text/html;charset=UTF-8");
response.setHeader("Content-Type", "text/html; charset=utf-8");
request.setCharacterEncoding("UTF-8");
logger.debug("");
logger.debug("-------------------->Controller#processRequest: Started");
long t1 = System.currentTimeMillis();
HttpSession session = request.getSession();
ServletContext context = getServletContext();
// Log QS
requestLogAction.performAction(request, context);
//debugSession(session);
Caller caller = checkLogin(request, response);
/** Handle Navigation actions */
navAction.performAction(request, response, context);
/**
* The user have a workflow manager to handle workflows in the appliction.
*/
IWorkFlowManager workflowManager = getWorkflowManager(request,context);
workflowManager.setCaller(caller);
/**
* Get the next page from workflow manager
*/
String nextPage = workflowManager.getNextPage(request, context);
/**
* Forward to view
*/
RequestDispatcher forwarder = request.getRequestDispatcher("/"+nextPage);
forwarder.forward(request, response);
long t2 = System.currentTimeMillis();
logger.debug("-------------------->Controller#processRequest: Completed in "+(t2-t1)+" ms");
logger.debug("");
}
catch (ArxLoginForward alf)
{
response.setHeader("Expires", "Sat, 6 May 1995 12:00:00 GMT");
response.setHeader("Cache-Control", "no-store, no-cache, must-revalidate");
response.addHeader("Cache-Control", "post-check=0, pre-check=0");
response.setHeader("Pragma", "no-cache");
response.setContentType("text/html;charset=UTF-8");
response.setHeader("Pragma", "no-cache");
RequestDispatcher forwarder = request.getRequestDispatcher(alf.getUrl());
forwarder.forward(request, response);
}
catch (ArxFrameException afe)
{
logger.error("ArxFrameException.", afe);
response.setHeader("Expires", "Sat, 6 May 1995 12:00:00 GMT");
response.setHeader("Cache-Control", "no-store, no-cache, must-revalidate");
response.addHeader("Cache-Control", "post-check=0, pre-check=0");
response.setHeader("Pragma", "no-cache");
response.setContentType("text/html;charset=UTF-8");
response.setHeader("Pragma", "no-cache");
RequestDispatcher forwarder = request.getRequestDispatcher("error/GeneralError.jsp");
forwarder.forward(request, response);
}
}
private IWorkFlowManager getWorkflowManager(HttpServletRequest request, ServletContext context) throws ArxFrameException {
IWorkFlowManager mgr = null;
try
{
mgr = (IWorkFlowManager)request.getSession().getAttribute(WORKFLOW_MANAGER);
if (mgr == null)
{
Class c = Class.forName(workflowManagerClassName);
mgr = (IWorkFlowManager)c.newInstance();
mgr.setContext(context);
request.getSession().setAttribute(WORKFLOW_MANAGER, mgr);
}
}
catch (Exception e)
{
logger.error("------------------------------>Controller#getWorkflowManager: Failed to get workflow manager", e);
throw new ArxFrameException("Failed to get workflowManager.", e);
}
return mgr;
}
private void parseXML() throws Exception {
Timer t = new Timer();
try
{
ServletContext context = this.getServletContext();
InputStream is = context.getResourceAsStream("/controller.xml");
//wrkFlwMgrs = new ArrayList();
DocumentBuilderFactory factory = DocumentBuilderFactory.newInstance();
DocumentBuilder builder = factory.newDocumentBuilder();
Document doc = builder.parse(is);
// Get login class name
NodeList nl = doc.getElementsByTagName("login");
Element e = (Element)nl.item(0);
loginClassName = e.getAttribute(CLASS_ATTR);
NodeList nl2 = doc.getElementsByTagName(WORKFLOWMANAGER_TAG);
Element wflmgr = (Element)nl2.item(0);
workflowManagerClassName = wflmgr.getAttribute(CLASS_ATTR);
}
catch (Exception e)
{
logger.error("------------------------------>Controller#parseXML: Failed to read xml data for Controller", e);
throw new Exception("Could read configuration", e);
}
t.stop();
}
// <editor-fold defaultstate="collapsed">
protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
processRequest(request, response);
}
protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
processRequest(request, response);
}
public String getServletInfo() {
return "Short description";
}
// </editor-fold>
}