/* * The Kuali Financial System, a comprehensive financial management system for higher education. * * Copyright 2005-2014 The Kuali Foundation * * This program is free software: you can redistribute it and/or modify * it under the terms of the GNU Affero General Public License as * published by the Free Software Foundation, either version 3 of the * License, or (at your option) any later version. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU Affero General Public License for more details. * * You should have received a copy of the GNU Affero General Public License * along with this program. If not, see <http://www.gnu.org/licenses/>. */ package org.kuali.kfs.sys.batch; import java.util.Date; import java.util.LinkedHashMap; import java.util.List; import java.util.Map; import org.kuali.kfs.sys.batch.service.SchedulerService; import org.kuali.kfs.sys.context.SpringContext; import org.kuali.rice.krad.bo.TransientBusinessObjectBase; import org.quartz.JobDetail; public class BatchJobStatus extends TransientBusinessObjectBase { // private static final org.apache.log4j.Logger LOG = org.apache.log4j.Logger.getLogger(BatchJobStatus.class); private JobDescriptor jobDescriptor; private JobDetail jobDetail; private static SchedulerService schedulerService; private SchedulerService getSchedulerService() { if (schedulerService == null) { schedulerService = SpringContext.getBean(SchedulerService.class); } return schedulerService; } // for DD purposes only public BatchJobStatus() { } public BatchJobStatus(JobDescriptor jobDescriptor, JobDetail jobDetail) { this.jobDescriptor = jobDescriptor; this.jobDetail = jobDetail; } public String getName() { return jobDetail.getName(); } public String getGroup() { return jobDetail.getGroup(); } public String getFullName() { return jobDetail.getGroup() + "." + jobDetail.getName(); } public String getNamespaceCode() { if(jobDescriptor == null) return null; return jobDescriptor.getNamespaceCode(); } public Map<String, String> getDependencies() { if(jobDescriptor == null) return null; return jobDescriptor.getDependencies(); } public List<Step> getSteps() { if(jobDescriptor == null) return null; return jobDescriptor.getSteps(); } public String getStatus() { if (isRunning()) { return SchedulerService.RUNNING_JOB_STATUS_CODE; } String tempStatus = schedulerService.getStatus(jobDetail); if (tempStatus == null) { if (getNextRunDate() != null) { return SchedulerService.SCHEDULED_JOB_STATUS_CODE; } else if (getGroup().equals(SchedulerService.SCHEDULED_GROUP)) { return SchedulerService.PENDING_JOB_STATUS_CODE; } } return tempStatus; } public String getDependencyList() { StringBuffer sb = new StringBuffer(200); for (Map.Entry<String, String> entry : getDependencies().entrySet()) { sb.append(entry.getKey() + " (" + entry.getValue() + ") \n"); } return sb.toString(); } public String getStepList() { StringBuffer sb = new StringBuffer(200); for (Step step : getSteps()) { sb.append(step.getName() + " \n"); } return sb.toString(); } public int getNumSteps() { return getSteps().size(); } protected LinkedHashMap toStringMapper_RICE20_REFACTORME() { LinkedHashMap m = new LinkedHashMap(); m.put("name", getName()); m.put("group", getGroup()); m.put("status", getStatus()); for (Object key : jobDetail.getJobDataMap().keySet()) { m.put("jobDataMap." + key, jobDetail.getJobDataMap().get(key)); } return m; } public boolean isScheduled() { // is this instance in the scheuled group? if (getGroup().equals(SchedulerService.SCHEDULED_GROUP)) { return true; } // does this job exist in the scheduled group? if (getSchedulerService().getJob(SchedulerService.SCHEDULED_GROUP, getName()) != null) { return true; } return false; } public boolean isRunning() { return getSchedulerService().isJobRunning(getName()); } public void runJob(String requestorEmailAddress) { getSchedulerService().runJob(getName(), requestorEmailAddress); } public void runJob(int startStep, int endStep, Date startTime, String requestorEmailAddress) { getSchedulerService().runJob(getName(), startStep, endStep, startTime, requestorEmailAddress); } public void interrupt() { getSchedulerService().interruptJob(getName()); } public void schedule() { // if not already in scheduled group if (!isScheduled()) { // make a copy and add to the scheduled group getSchedulerService().addScheduled(jobDetail); } } public void unschedule() { // if in scheduled group and scheduled group, remove it List<BatchJobStatus> jobs = getSchedulerService().getJobs(SchedulerService.UNSCHEDULED_GROUP); boolean inUnscheduledGroup = false; for (BatchJobStatus detail : jobs) { if (detail.getName().equals(getName())) { inUnscheduledGroup = true; } } // if only in scheduled group, move it if (!inUnscheduledGroup) { getSchedulerService().addUnscheduled(jobDetail); } getSchedulerService().removeScheduled(getName()); } public Date getNextRunDate() { return getSchedulerService().getNextStartTime(this); } }