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    }