package org.projectapollo.demo;

import java.io.*;
import java.util.*;
import javax.servlet.*;
import javax.servlet.http.*;
import apollo.Session.*;
import apollo.*;
import apollo.Log.*;
import apollo.Statistics.*;

/** Project Apollo Demo Site
* @author Joe Kislo
* @version 1.0 09/18/2000
*/

public class Demo extends HttpServlet {
    public static ManagerTracker MT;
    public void init(ServletConfig config) throws ServletException {
        super.init(config);
        Properties prop =
new Properties();
        try {
            String propFileName = config.getInitParameter(
"PropertiesFile");
            if (propFileName==null) {
                propFileName =
"../servlets/"+this.getClass().getName()+".properties";
            }
            prop.load(
new FileInputStream(propFileName));
        }
catch (IOException io) {
            throw new ServletException("IO Error reading properties file!");
        }
        MT = InitSystem.initSystem(config, prop);
         // MT.getPM().setPermissionsAuthorityName("PA");
        //MT.getPM().setDefaultPermissionsAuthority(new NoPermissionsAuthority());
         }

    public void doGet (HttpServletRequest servletReq, HttpServletResponse servletRes) throws ServletException, IOException {
        doService(servletReq,servletRes);
    }

    public void doPost (HttpServletRequest servletReq, HttpServletResponse servletRes) throws ServletException, IOException {
        doService(servletReq,servletRes);
    }

    private void doService(HttpServletRequest servletReq, HttpServletResponse servletRes) throws ServletException, IOException {
        MT.getStatsManager().getStat(
"Servlet").incStat("TotalTransactions");
        long startTime = System.currentTimeMillis();
        try {
            HTTPRequest req =
new HTTPRequest(servletReq);
            if (req.getParameter("SessionID") == null) {
                String fquid;
                if (req.hasValue("PageHandler")) {
                    fquid=req.getValue(
"PageHandler");
                }
else {
                    fquid=
"";
                }
                HTTPResponse response = MT.getPM().handleRequest(MT, fquid,req,
null);
                response.render(servletRes,servletReq);
            }
else {
                HTTPResponse response;
                try {
                    WebSession thisSession = MT.getSM().getSession(req.getParameter(
"SessionID"));
                    response = MT.getPM().handleRequest(MT, req.getParameter(
"PageHandler"), req,thisSession);
                }
catch (SessionExpired se) {
                    WebSession thisSession = MT.getSM().getSession(req.getParameter(
"SessionID"), true);
                    response = MT.getPM().handleRequest(MT,
"SessionExpired", req,thisSession);
                }
                response.render(servletRes,servletReq);
            }
        }
catch (Exception e) {
             //Get the output stream
            ServletOutputStream out = servletRes.getOutputStream();
            servletRes.setContentType(
"text/html");
            if (e instanceof InvalidSessionID) {
                out.println(
"Invalid session ID! Try relogging in.");
            }
else {
                 //Add it to the stats
                MT.getStatsManager().getStat("UserExceptions").incStat("TotalExceptions");
                MT.getStatsManager().getStat(
"UserExceptions").addStat("Exceptions",new ExceptionData(e));
                MT.getLM().log(e);
                HTTPWriter writer =
new HTTPWriter(out);
                e.printStackTrace(writer);
                writer.close();
            }
        }
        MT.getStatsManager().getStat(
"Servlet").incStat("TotalServletCPUTime",(((float) (System.currentTimeMillis() - startTime))/1000));
    }
 
    public void destroy() {
        super.destroy();
        MT.destroy();
    }

    public String getServletInfo() {
        return "Project Apollo Demo Site";
    }
}