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 }