/*
* LoggedInJob.java
*
*/
package org.projectapollo.demo.Jobs;
import apollo.Job.*;
import apollo.Session.*;
import apollo.Template.*;
import apollo.*;
import java.util.*;
import org.projectapollo.demo.Storable.*;

/**
*
* @author kislo
* @version
*/

public
class LoggedInJob implements Job {
 
    /** Creates new DemoJob */
    private double percentage;
    private int jobID;
    private String jobName;
    private String error;
    private JobResult jobResult;
    private int status;
    private ManagerTracker MT;
    private Date startDate;
    private User user;
    private int returnFormat;
    private int pauseTime;
    private String extendedStatus;
    private boolean foregroundOperation;
    private boolean crash;

    public LoggedInJob(ManagerTracker MT, String jobName, User user, int returnFormat, int pauseTime, boolean crash) {
        this.MT=MT;
        this.jobName=jobName;
        this.user=user;
        this.percentage=0.0;
        this.returnFormat=returnFormat;
        this.pauseTime=pauseTime;
        this.crash=crash;
        status=JobManager.JOB_UNINITIALIZED;
    }

    private
void crash() throws UserException{
        Vector a =
null;
        try {
            a.addElement(
"Uh-oh, Nullpointer exception!");
        }
catch (Exception e) {
            throw new UserException("Oh my goodness, we crashed!",e);
        }
    }

    public JobResult execute() throws Exception {
         //Attach this job to a UserID for tracking
         JobMembership jm = new JobMembership(user.getUserID(), new Integer(jobID));
        jm.insert(MT);
        status=JobManager.JOB_RUNNING;
        extendedStatus=
"Fetching user list";
        jobResult =
new JobResult();
 
        TemplatePage mainPage;
        TemplatePage row;
        if (returnFormat==JobMembership.RETURN_TYPE_MS_WORD) {
            mainPage = MT.getPM().getPage(
"Jobs.LoggedInUsers.doc");
            row = MT.getPM().getPage(
"Jobs.LoggedInUsers_Row.doc");
            jobResult.setResultTypeID(JobMembership.RETURN_TYPE_MS_WORD);
        }
else if (returnFormat==JobMembership.RETURN_TYPE_MS_EXCEL) {
            row= MT.getPM().getPage(
"Jobs.LoggedInUsers_Row.xls");
            mainPage= MT.getPM().getPage(
"Jobs.LoggedInUsers.xls");
            jobResult.setResultTypeID(JobMembership.RETURN_TYPE_MS_EXCEL);
        }
else if (returnFormat==JobMembership.RETURN_TYPE_HTML) {
            row=MT.getPM().getPage(
"Jobs.LoggedInUsers_Row.html");
            mainPage= MT.getPM().getPage(
"Jobs.LoggedInUsers.html");
            jobResult.setResultTypeID(JobMembership.RETURN_TYPE_HTML);
        }
else {
            row=MT.getPM().getPage(
"Jobs.LoggedInUsers_Row.txt");
            mainPage=MT.getPM().getPage(
"Jobs.LoggedInUsers.txt");
            jobResult.setResultTypeID(JobMembership.RETURN_TYPE_TEXT);
        }
 
 
        int totalNum=0;
        for (Enumeration e = MT.getSM().getSessions(); e.hasMoreElements();) {
            WebSession s = (WebSession) e.nextElement();
            if (!s.isExpired()) {
                totalNum++;
            }
        }

        StringBuffer sb =
new StringBuffer();
        Hashtable RT =
new Hashtable();
        int count=0;
        for (Enumeration e = MT.getSM().getSessions(); e.hasMoreElements();) {
            WebSession s = (WebSession) e.nextElement();
            if (s.isExpired()) {
                continue;
            }
            count++;
            percentage=count/totalNum;
            extendedStatus=
"Fetching user number "+count;
 
            if (percentage>.7 && crash) {
                crash();
            }
            RT.put(
"Username", s.getValue("Username"));
            RT.put(
"Idle", new Integer(s.getTimeBetweenTransactions()));
            sb.append(row.toString(RT,
null));
            Thread.sleep(pauseTime);
        }
 
        RT=
new Hashtable();
        RT.put(
"UserRows", sb);
        jobResult.setResult(mainPage.toString(RT,
null));
        status=JobManager.JOB_FINISHED;
        return jobResult;
    }
 
    public double getPercentage() {
        return percentage;
    }
 
    public int getStatusID() {
        return status;
    }
 
    public void setStatusID(int statusID) {
        this.status=statusID;
    }

    public JobResult getJobResult() {
        return jobResult;
    }
 
    public void setJobID(int jobID) {
        this.jobID=jobID;
    }
 
    public int getJobID() {
        return jobID;
    }
 
    public String getJobName() {
        return jobName;
    }
 
    public String getError() {
        return error;
    }

    public void setError(String error) {
        this.error=error;
    }

    public Date getStartDate() {
        return startDate;
    }

    public String getExtendedStatus() {
        return extendedStatus;
    }

    public void setStartDate(Date startDate) {
        this.startDate=startDate;
    }
}