package org.sakaiproject.component.app.scheduler;
import org.apache.commons.logging.Log;
import org.apache.commons.logging.LogFactory;
import org.quartz.Job;
import org.quartz.JobDataMap;
import org.quartz.JobDetail;
import org.quartz.JobExecutionContext;
import org.quartz.JobExecutionException;
import org.quartz.JobListener;
import org.quartz.Trigger;
import org.quartz.TriggerListener;
import java.util.Date;
/**
* Created by IntelliJ IDEA.
* User: duffy
* Date: Aug 26, 2010
* Time: 11:41:57 AM
* To change this template use File | Settings | File Templates.
*/
public class NavigableEventLogListener implements TriggerListener, JobListener
{
private final static Log
LOG = LogFactory.getLog(NavigableEventLogListener.class.getName() + ".jobExecutions");
private static enum EVENTTYPE
{
JOB_EXECUTING, JOB_VETOED, JOB_EXECUTED, TRIGGER_FIRED, TRIGGER_MISFIRED, TRIGGER_COMPLETED
};
public void jobToBeExecuted(JobExecutionContext context)
{
info (EVENTTYPE.JOB_EXECUTING, null, context, null, 0);
}
public void jobExecutionVetoed(JobExecutionContext context)
{
info (EVENTTYPE.JOB_VETOED, null, context, null, 0);
}
public void jobWasExecuted(JobExecutionContext context, JobExecutionException e)
{
info (EVENTTYPE.JOB_EXECUTED, null, context, e, 0);
}
public String getName()
{
return NavigableEventLogListener.class.getName();
}
public void triggerFired(Trigger trigger, JobExecutionContext context)
{
info (EVENTTYPE.TRIGGER_FIRED, trigger, context, null, 0);
}
public boolean vetoJobExecution(Trigger trigger, JobExecutionContext jobExecutionContext)
{
return false;
}
public void triggerMisfired(Trigger trigger)
{
info (EVENTTYPE.TRIGGER_MISFIRED, trigger, null, null, 0);
}
public void triggerComplete(Trigger trigger, JobExecutionContext context, int i)
{
info (EVENTTYPE.TRIGGER_COMPLETED, trigger, context, null, i);
}
private void info (EVENTTYPE eventType, Trigger trig, JobExecutionContext context, JobExecutionException exception,
int exitCode)
{
JobDetail
detail = (context != null)?context.getJobDetail():null;
final JobDataMap
dataMap = (context != null)?context.getMergedJobDataMap():null;
final String
jobName = (detail != null)?detail.getName():null,
jobDesc = (detail != null)?detail.getDescription():null;
final Class
jobClass = (detail != null)?detail.getJobClass():null;
final Trigger
trigger = (trig != null)?trig:((context != null)?context.getTrigger():null);
final String
trigName = (trigger != null)?trigger.getName():null,
trigDesc = (trigger != null)?trigger.getDescription():null;
final Date
trigStart = (trigger != null)?trigger.getStartTime():null,
trigEnd = (trigger != null)?trigger.getEndTime():null;
StringBuilder
sb = new StringBuilder();
switch (eventType)
{
case JOB_EXECUTING:
{
sb.append("Job Executing: [");
sb.append("name: ").append(jobName).append(", description: ").append((jobDesc != null)?jobDesc:"")
.append(", class: ").append(jobClass.getName());
sb.append("]");
break;
}
case JOB_VETOED:
{
sb.append("Job Vetoed: [");
sb.append("name: ").append(jobName).append(", description: ").append((jobDesc != null)?jobDesc:"")
.append(", class: ").append(jobClass.getName());
break;
}
case JOB_EXECUTED:
{
sb.append("Job Executed: [");
sb.append("name: ").append(jobName).append(", description: ").append((jobDesc != null)?jobDesc:"")
.append(", class: ").append(jobClass.getName());
if (exception != null)
{
sb.append (", exception: ").append(exception.getMessage())
.append(", exception cause: ").append(exception.getCause().getClass().getName());
}
sb.append("]");
break;
}
case TRIGGER_FIRED:
{
sb.append("Trigger Fired: [");
sb.append("trigger: ").append(trigName).append(", trigger description: ").append((trigDesc != null)?trigDesc:"")
.append(", start: ").append((trigStart != null)?trigStart.toString():null)
.append(", end: ").append((trigEnd != null)?trigEnd.toString():null);
sb.append(", job: ").append(jobName).append(", job description: ").append((jobDesc != null)?jobDesc:"")
.append(", class: ").append(jobClass.getName());
sb.append("]");
break;
}
case TRIGGER_MISFIRED:
{
sb.append("Trigger Misfired: [");
sb.append("trigger: ").append(trigName).append(", trigger description: ").append((trigDesc != null)?trigDesc:"")
.append(", start: ").append((trigStart!=null)?trigStart.toString():null)
.append(", end: ").append((trigEnd!=null)?trigEnd.toString():null);
sb.append("]");
break;
}
case TRIGGER_COMPLETED:
{
sb.append("Trigger Completed: [");
sb.append("trigger: ").append(trigName).append(", trigger description: ").append((trigDesc != null)?trigDesc:"")
.append(", start: ").append((trigStart!=null)?trigStart.toString():null)
.append(", end: ").append((trigEnd!=null)?trigEnd.toString():null);
sb.append(", job: ").append(jobName).append(", job description: ").append((jobDesc != null)?jobDesc:"")
.append(", class: ").append(jobClass.getName())
.append(", execution result: ").append(exitCode);
sb.append("]");
break;
}
}
if (LOG.isDebugEnabled())
{
LOG.debug(sb.toString());
}
}
}