Newer
Older
simple-jdbc-stats / src / nl / astraeus / jdbc / web / JdbcStatisticsServlet.java
Rien Nentjes on 2 May 2012 4 KB Small changes, added MIT licence
package nl.astraeus.jdbc.web;

import nl.astraeus.jdbc.util.IOUtils;
import nl.astraeus.jdbc.util.Util;
import nl.astraeus.jdbc.web.model.Settings;
import nl.astraeus.jdbc.web.page.*;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;

import javax.security.auth.login.LoginContext;
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 java.io.IOException;
import java.util.HashMap;
import java.util.Map;

/**
 * User: rnentjes
 * Date: 3/28/12
 * Time: 3:05 PM
 */
public class JdbcStatisticsServlet extends HttpServlet {
    private final static Logger logger = LoggerFactory.getLogger(JdbcStatisticsServlet.class);

    private String head;
    private String bottom;
    private Map<String, Page> mapping = new HashMap<String, Page>();

    @Override
    public void init() throws ServletException {
        super.init();

        try {
            head = IOUtils.toString(getClass().getResourceAsStream("head.html"));
            bottom = IOUtils.toString(getClass().getResourceAsStream("bottom.html"));
        } catch (IOException e) {
            throw new ServletException(e);
        }

        mapping.put("queries", new QueryOverview());
        mapping.put("login", new Login());

        // queries/select/1234
        // queries/page/2
        // queries/cancel
        // queries/select/1234/select/5432

        // queries/action=select/actionValue=1234
        // transactions/action=page&actionValue=3
        // settings
    }

    @Override
    protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
        String uri = req.getRequestURI();

        String [] parts = uri.split("\\/");
        int index = 0;

        if (parts.length > 0) {
            Page page = mapping.get(parts[index++]);

            while(index < (parts.length - 1)) {
                page = page.processGetRequest(parts[index++], parts[index++]);
            }
        }

        doPost(req, resp);
    }

    @Override
    protected void doPost(final HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
        long nano = System.nanoTime();
        
        HttpSession session =  req.getSession();
        boolean ajax = "true".equals(req.getParameter("ajax"));

        resp.setContentType("text/html");

        Settings.get().readSettings(req);

        Page page = (Page)session.getAttribute("page");
        Page menu = (Page)session.getAttribute("menu");

        session.setMaxInactiveInterval(1800);

        if (menu == null) {
            menu = new Menu();

            session.setAttribute("menu", menu);
        }

        if (Settings.get().isSecure() && session.getAttribute("loggedin") == null && !(page instanceof Login)) {
            page = new Login();
        } else if (!(page instanceof Login)) {
            if (page == null || "menumain".equals(req.getParameter("action"))) {
                page = new QueryOverview();
            } else if ("menutransactions".equals(req.getParameter("action"))) {
                page = new TransactionOverview();
            } else if ("menusettings".equals(req.getParameter("action"))) {
                page = new SettingsOverview();
            } else {
                page = page .processRequest(req);
            }
        } else {
            page = page .processRequest(req);
        }

        menu.processRequest(req);

        session.setAttribute("page", page);

        if (!ajax) {
            resp.getWriter().print(head);
        }

        resp.getWriter().print(menu.render(req));
        resp.getWriter().print(Warnings.get(req).render(req));

        long time = System.nanoTime();
        resp.getWriter().println("<div class=\"container-fluid\">");
        resp.getWriter().print(page.render(req));
        resp.getWriter().println("</div>");

        Settings.get().saveSettings(resp);

        if (!ajax) {
            resp.getWriter().print(bottom);
        }

        logger.debug("Request ends, time=" + Util.formatNano(System.nanoTime() - nano) + ", page=" + page.getClass().getSimpleName());
    }

}