001 /* 002 * Copyright 2011 The Kuali Foundation. 003 * 004 * Licensed under the Educational Community License, Version 2.0 (the "License"); 005 * you may not use this file except in compliance with the License. 006 * You may obtain a copy of the License at 007 * 008 * http://www.opensource.org/licenses/ecl2.php 009 * 010 * Unless required by applicable law or agreed to in writing, software 011 * distributed under the License is distributed on an "AS IS" BASIS, 012 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 013 * See the License for the specific language governing permissions and 014 * limitations under the License. 015 */ 016 package org.kuali.kfs.sys.batch; 017 018 import java.util.Date; 019 import java.util.LinkedHashMap; 020 import java.util.List; 021 import java.util.Map; 022 023 import org.kuali.kfs.sys.batch.service.SchedulerService; 024 import org.kuali.kfs.sys.context.SpringContext; 025 import org.kuali.rice.kns.bo.TransientBusinessObjectBase; 026 import org.quartz.JobDetail; 027 028 public class BatchJobStatus extends TransientBusinessObjectBase { 029 030 // private static final org.apache.log4j.Logger LOG = org.apache.log4j.Logger.getLogger(BatchJobStatus.class); 031 032 private JobDescriptor jobDescriptor; 033 034 private JobDetail jobDetail; 035 036 private static SchedulerService schedulerService; 037 038 private SchedulerService getSchedulerService() { 039 if (schedulerService == null) { 040 schedulerService = SpringContext.getBean(SchedulerService.class); 041 } 042 return schedulerService; 043 } 044 045 // for DD purposes only 046 public BatchJobStatus() { 047 } 048 049 public BatchJobStatus(JobDescriptor jobDescriptor, JobDetail jobDetail) { 050 this.jobDescriptor = jobDescriptor; 051 this.jobDetail = jobDetail; 052 } 053 054 public String getName() { 055 return jobDetail.getName(); 056 } 057 058 public String getGroup() { 059 return jobDetail.getGroup(); 060 } 061 062 public String getFullName() { 063 return jobDetail.getGroup() + "." + jobDetail.getName(); 064 } 065 066 public String getNamespaceCode() { 067 if(jobDescriptor == null) return null; 068 return jobDescriptor.getNamespaceCode(); 069 } 070 071 public Map<String, String> getDependencies() { 072 if(jobDescriptor == null) return null; 073 return jobDescriptor.getDependencies(); 074 } 075 076 public List<Step> getSteps() { 077 if(jobDescriptor == null) return null; 078 return jobDescriptor.getSteps(); 079 } 080 081 public String getStatus() { 082 if (isRunning()) { 083 return SchedulerService.RUNNING_JOB_STATUS_CODE; 084 } 085 String tempStatus = schedulerService.getStatus(jobDetail); 086 if (tempStatus == null) { 087 if (getNextRunDate() != null) { 088 return SchedulerService.SCHEDULED_JOB_STATUS_CODE; 089 } 090 else if (getGroup().equals(SchedulerService.SCHEDULED_GROUP)) { 091 return SchedulerService.PENDING_JOB_STATUS_CODE; 092 } 093 } 094 return tempStatus; 095 } 096 097 public String getDependencyList() { 098 StringBuffer sb = new StringBuffer(200); 099 for (Map.Entry<String, String> entry : getDependencies().entrySet()) { 100 sb.append(entry.getKey() + " (" + entry.getValue() + ") \n"); 101 } 102 return sb.toString(); 103 } 104 105 public String getStepList() { 106 StringBuffer sb = new StringBuffer(200); 107 for (Step step : getSteps()) { 108 sb.append(step.getName() + " \n"); 109 } 110 return sb.toString(); 111 } 112 113 public int getNumSteps() { 114 return getSteps().size(); 115 } 116 117 @Override 118 protected LinkedHashMap toStringMapper() { 119 LinkedHashMap m = new LinkedHashMap(); 120 121 m.put("name", getName()); 122 m.put("group", getGroup()); 123 m.put("status", getStatus()); 124 for (Object key : jobDetail.getJobDataMap().keySet()) { 125 m.put("jobDataMap." + key, jobDetail.getJobDataMap().get(key)); 126 } 127 128 return m; 129 } 130 131 public boolean isScheduled() { 132 // is this instance in the scheuled group? 133 if (getGroup().equals(SchedulerService.SCHEDULED_GROUP)) { 134 return true; 135 } 136 // does this job exist in the scheduled group? 137 if (getSchedulerService().getJob(SchedulerService.SCHEDULED_GROUP, getName()) != null) { 138 return true; 139 } 140 return false; 141 } 142 143 public boolean isRunning() { 144 return getSchedulerService().isJobRunning(getName()); 145 } 146 147 public void runJob(String requestorEmailAddress) { 148 getSchedulerService().runJob(getName(), requestorEmailAddress); 149 } 150 151 public void runJob(int startStep, int endStep, Date startTime, String requestorEmailAddress) { 152 getSchedulerService().runJob(getName(), startStep, endStep, startTime, requestorEmailAddress); 153 } 154 155 public void interrupt() { 156 getSchedulerService().interruptJob(getName()); 157 } 158 159 public void schedule() { 160 // if not already in scheduled group 161 if (!isScheduled()) { 162 // make a copy and add to the scheduled group 163 getSchedulerService().addScheduled(jobDetail); 164 } 165 } 166 167 public void unschedule() { 168 // if in scheduled group and scheduled group, remove it 169 List<BatchJobStatus> jobs = getSchedulerService().getJobs(SchedulerService.UNSCHEDULED_GROUP); 170 boolean inUnscheduledGroup = false; 171 for (BatchJobStatus detail : jobs) { 172 if (detail.getName().equals(getName())) { 173 inUnscheduledGroup = true; 174 } 175 } 176 177 // if only in scheduled group, move it 178 if (!inUnscheduledGroup) { 179 getSchedulerService().addUnscheduled(jobDetail); 180 } 181 getSchedulerService().removeScheduled(getName()); 182 } 183 184 public Date getNextRunDate() { 185 return getSchedulerService().getNextStartTime(this); 186 } 187 }