package org.xadoop.servlet;
import java.io.IOException;
import java.util.HashMap;
import javax.servlet.ServletContext;
import javax.servlet.ServletException;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import org.xadoop.SessionAttrs;
import org.xadoop.XadoopConstants;
import org.xadoop.servlet.actions.AbstractAction;
import org.xadoop.servlet.actions.LoginAction;
import org.xadoop.servlet.actions.results.AbstractResult;
import org.xadoop.servlet.pages.AbstractPage;
import org.xadoop.servlet.pages.ErrorPage;
import org.xadoop.servlet.pages.HomePage;
import org.xadoop.servlet.pages.LoginPage;
import org.xadoop.servlet.utils.GetRequest;
import org.xadoop.servlet.utils.ServletResponseTools;
/**
* The Xadoop servlet.
*
* @author Lukas Blunschi
*
*/
public class XadoopServlet extends HttpServlet {
/**
* required default serial version UID.
*/
private static final long serialVersionUID = 1L;
@Override
protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
long begin = System.nanoTime();
// see if user is logged in
String username = (String) req.getSession().getAttribute(SessionAttrs.USERNAME);
boolean isLoggedIn = username == null ? false : true;
// handle actions
// not logged in users may only execute login
String msg = null;
String actionStr = req.getParameter(AbstractAction.P_ACTION);
if (actionStr != null) {
boolean isLoginAction = actionStr.equals(LoginAction.ACTIONNAME);
if (isLoggedIn || isLoginAction) {
ServletContext ctx = req.getSession().getServletContext();
HashMap<String, AbstractAction> am = getActionMap(ctx);
AbstractAction action = am.get(actionStr);
if (action == null) {
msg = "Action " + actionStr + " unknown!";
} else {
AbstractResult result = action.execute(req);
// if everything was okay
// send reload (retaining get parameters)
if (result.wasSuccessful()) {
String parameters = GetRequest.reconstructParameters(req, "&");
String uri = req.getRequestURI();
ServletResponseTools.sendReload(req, resp, uri + parameters + result.getReloadSuffix());
return;
} else {
msg = result.getErrorMessage();
}
}
}
}
// find page to render
AbstractPage page = null;
if (msg != null) {
page = new ErrorPage(msg);
} else {
if (isLoggedIn) {
// logged in users may see all pages
ServletContext ctx = req.getSession().getServletContext();
HashMap<String, AbstractPage> pageMap = getPageMap(ctx);
String pageStr = req.getParameter(AbstractPage.P_PAGE);
page = pageMap.get(pageStr);
if (page == null) {
String pagenameDefault = AbstractPage.extractPagename(HomePage.class);
page = pageMap.get(pagenameDefault);
}
} else {
// not logged in users may see only the login page
page = new LoginPage();
}
}
// get html
StringBuffer html = null;
try {
html = page.getHtml(req);
} catch (Exception e) {
html = new ErrorPage(e.getMessage()).getHtml(req);
}
// produce output
double calcTime = (System.nanoTime() - begin) / 1E6;
ServletResponseTools.streamStringBuffer(html, "text/html", "utf-8", calcTime, req, resp);
}
@Override
protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
doGet(req, resp);
}
@SuppressWarnings("unchecked")
private HashMap<String, AbstractPage> getPageMap(ServletContext ctx) {
return (HashMap<String, AbstractPage>) ctx.getAttribute(XadoopConstants.CTX_PAGEMAP);
}
@SuppressWarnings("unchecked")
private HashMap<String, AbstractAction> getActionMap(ServletContext ctx) {
return (HashMap<String, AbstractAction>) ctx.getAttribute(XadoopConstants.CTX_ACTIONMAP);
}
}