1 package org.kuali.ole.batch.controller;
2
3 import org.apache.commons.io.IOUtils;
4 import org.kuali.ole.OLEConstants;
5 import org.kuali.ole.batch.bo.OLEBatchProcessJobDetailsBo;
6 import org.kuali.ole.batch.bo.OLEBatchProcessScheduleBo;
7 import org.kuali.ole.batch.document.OLEBatchProcessDefinitionDocument;
8 import org.kuali.ole.batch.form.OLEBatchProcessJobDetailsForm;
9 import org.kuali.ole.batch.helper.OLEBatchProcessDataHelper;
10 import org.kuali.ole.batch.service.OLEBatchSchedulerService;
11 import org.kuali.ole.sys.batch.BatchFile;
12 import org.kuali.ole.sys.batch.BatchFileUtils;
13 import org.kuali.rice.core.api.resourceloader.GlobalResourceLoader;
14 import org.kuali.rice.krad.service.BusinessObjectService;
15 import org.kuali.rice.krad.service.KRADServiceLocator;
16 import org.kuali.rice.krad.util.GlobalVariables;
17 import org.kuali.rice.krad.web.controller.TransactionalDocumentControllerBase;
18 import org.kuali.rice.krad.web.form.UifFormBase;
19 import org.quartz.CronExpression;
20 import org.springframework.stereotype.Controller;
21 import org.springframework.validation.BindingResult;
22 import org.springframework.web.bind.annotation.ModelAttribute;
23 import org.springframework.web.bind.annotation.RequestMapping;
24 import org.springframework.web.servlet.ModelAndView;
25
26 import javax.servlet.http.HttpServletRequest;
27 import javax.servlet.http.HttpServletResponse;
28 import java.io.File;
29 import java.io.FileInputStream;
30 import java.io.InputStream;
31 import java.sql.Timestamp;
32 import java.text.ParseException;
33 import java.text.SimpleDateFormat;
34 import java.util.*;
35
36
37
38
39
40
41
42
43
44
45 @Controller
46 @RequestMapping(value = "/oleBatchProcessJobController")
47 public class OLEBatchProcessJobDetailsController extends TransactionalDocumentControllerBase {
48
49 private OLEBatchProcessDataHelper oleBatchProcessDataHelper;
50 private BusinessObjectService businessObjectService;
51
52 public BusinessObjectService getBusinessObjectService() {
53 if(businessObjectService==null)
54 businessObjectService = KRADServiceLocator.getBusinessObjectService();
55 return businessObjectService;
56 }
57
58 private OLEBatchProcessDataHelper getOLEBatchProcessDataHelper(){
59
60 if(oleBatchProcessDataHelper==null){
61 oleBatchProcessDataHelper= OLEBatchProcessDataHelper.getInstance();
62 }
63 return oleBatchProcessDataHelper;
64 }
65
66 @Override
67 protected OLEBatchProcessJobDetailsForm createInitialForm(HttpServletRequest request) {
68 OLEBatchProcessJobDetailsForm oleBatchProcessJobDetailsForm = new OLEBatchProcessJobDetailsForm();
69 GlobalVariables.getUserSession().addObject("formId", oleBatchProcessJobDetailsForm.getFormKey());
70 List<OLEBatchProcessJobDetailsBo> oLEBatchProcessJobDetailsBoList = (List<OLEBatchProcessJobDetailsBo>) getBusinessObjectService().findAll(OLEBatchProcessJobDetailsBo.class);
71 oleBatchProcessJobDetailsForm.setoLEBatchProcessJobDetailsBoList(oLEBatchProcessJobDetailsBoList);
72 return oleBatchProcessJobDetailsForm;
73 }
74
75 @RequestMapping(params = "methodToCall=stopButton")
76 public ModelAndView stopButton(@ModelAttribute("KualiForm") UifFormBase form, BindingResult result,
77 HttpServletRequest request, HttpServletResponse response) throws Exception {
78 OLEBatchProcessJobDetailsForm oLEBatchProcessJobDetailsForm = (OLEBatchProcessJobDetailsForm) form;
79 OLEBatchProcessJobDetailsBo oLEBatchProcessJobDetailsBo = (OLEBatchProcessJobDetailsBo) oLEBatchProcessJobDetailsForm.getDocument();
80 Map map = new HashMap();
81 map.put("jobId", request.getParameter("jobId"));
82 List<OLEBatchProcessJobDetailsBo> oLEBatchProcessJobDetailsBoList = (List<OLEBatchProcessJobDetailsBo>) getBusinessObjectService().findMatching(OLEBatchProcessJobDetailsBo.class, map);
83 if(oLEBatchProcessJobDetailsBoList != null && oLEBatchProcessJobDetailsBoList.size() > 0) {
84 oLEBatchProcessJobDetailsBoList.get(0).setStatus(OLEConstants.OLEBatchProcess.JOB_STATUS_STOPPED);
85 getBusinessObjectService().save(oLEBatchProcessJobDetailsBoList);
86 }
87 return getUIFModelAndView(oLEBatchProcessJobDetailsForm);
88 }
89
90 @RequestMapping(params = "methodToCall=startButton")
91 public ModelAndView restartButton(@ModelAttribute("KualiForm") UifFormBase form, BindingResult result,
92 HttpServletRequest request, HttpServletResponse response) {
93 OLEBatchProcessJobDetailsForm oLEBatchProcessJobDetailsForm = (OLEBatchProcessJobDetailsForm) form;
94 Map map = new HashMap();
95 map.put("jobId", request.getParameter("jobId"));
96 OLEBatchProcessJobDetailsBo jobDetailsBo = getBusinessObjectService().findByPrimaryKey(OLEBatchProcessJobDetailsBo.class, map);
97 jobDetailsBo.setStatus(OLEConstants.OLEBatchProcess.JOB_STATUS_RUNNING);
98 getBusinessObjectService().save(jobDetailsBo);
99 runJobNow(jobDetailsBo.getJobId());
100 return getUIFModelAndView(oLEBatchProcessJobDetailsForm);
101 }
102
103 @RequestMapping(params = "methodToCall=resumeButton")
104 public ModelAndView resumeButton(@ModelAttribute("KualiForm") UifFormBase form, BindingResult result,
105 HttpServletRequest request, HttpServletResponse response) {
106 OLEBatchProcessJobDetailsForm oLEBatchProcessJobDetailsForm = (OLEBatchProcessJobDetailsForm) form;
107 Map map = new HashMap();
108 map.put("jobId", request.getParameter("jobId"));
109 OLEBatchProcessJobDetailsBo jobDetailsBo = getBusinessObjectService().findByPrimaryKey(OLEBatchProcessJobDetailsBo.class, map);
110 jobDetailsBo.setStatus(OLEConstants.OLEBatchProcess.JOB_STATUS_RUNNING);
111 getBusinessObjectService().save(jobDetailsBo);
112 runJobNow(jobDetailsBo.getJobId());
113 return getUIFModelAndView(oLEBatchProcessJobDetailsForm);
114 }
115
116 @RequestMapping(params = "methodToCall=removeButton")
117 public ModelAndView removeButton(@ModelAttribute("KualiForm") UifFormBase form, BindingResult result,
118 HttpServletRequest request, HttpServletResponse response) throws Exception {
119 OLEBatchProcessJobDetailsForm oLEBatchProcessJobDetailsForm = (OLEBatchProcessJobDetailsForm) form;
120 Map map = new HashMap();
121 map.put("jobId", request.getParameter("jobId"));
122 List<OLEBatchProcessJobDetailsBo> oLEBatchProcessJobDetailsBoList = (List<OLEBatchProcessJobDetailsBo>) getBusinessObjectService().findMatching(OLEBatchProcessJobDetailsBo.class, map);
123 OLEBatchProcessJobDetailsBo job = oLEBatchProcessJobDetailsBoList.get(0);
124 getOLEBatchProcessDataHelper().deleteBatchFailureFile(job.getBatchProcessType(),job.getJobId() + "_FailureRecord" + "_" + job.getUploadFileName());
125 getBusinessObjectService().delete(job);
126 List<OLEBatchProcessJobDetailsBo> oleBatchProcessJobDetailsBoList = (List<OLEBatchProcessJobDetailsBo> )getBusinessObjectService().findAll(OLEBatchProcessJobDetailsBo.class);
127 oLEBatchProcessJobDetailsForm.setoLEBatchProcessJobDetailsBoList(oleBatchProcessJobDetailsBoList);
128 return getUIFModelAndView(oLEBatchProcessJobDetailsForm);
129 }
130
131
132 @RequestMapping(params = "methodToCall=pauseButton")
133 public ModelAndView pauseButton(@ModelAttribute("KualiForm") UifFormBase form, BindingResult result,
134 HttpServletRequest request, HttpServletResponse response) {
135 OLEBatchProcessJobDetailsForm oLEBatchProcessJobDetailsForm = (OLEBatchProcessJobDetailsForm) form;
136 Map map = new HashMap();
137 map.put("jobId", request.getParameter("jobId"));
138 List<OLEBatchProcessJobDetailsBo> oLEBatchProcessJobDetailsBoList = (List<OLEBatchProcessJobDetailsBo>) getBusinessObjectService().findMatching(OLEBatchProcessJobDetailsBo.class, map);
139 oLEBatchProcessJobDetailsBoList.get(0).setStatus(OLEConstants.OLEBatchProcess.JOB_STATUS_PAUSED);
140 getBusinessObjectService().save(oLEBatchProcessJobDetailsBoList);
141 return getUIFModelAndView(oLEBatchProcessJobDetailsForm);
142 }
143
144
145 @RequestMapping(params = "methodToCall=openViewReport")
146 public ModelAndView openViewReport(@ModelAttribute("KualiForm") UifFormBase form, BindingResult result,
147 HttpServletRequest request, HttpServletResponse response) {
148 Map map = new HashMap();
149 map.put("jobId", request.getParameter("jobId"));
150 List<OLEBatchProcessJobDetailsBo> oLEBatchProcessJobDetailsBoList = (List<OLEBatchProcessJobDetailsBo>) getBusinessObjectService().findMatching(OLEBatchProcessJobDetailsBo.class, map);
151 OLEBatchProcessJobDetailsBo jobDetailsBo = oLEBatchProcessJobDetailsBoList.get(0);
152 if (jobDetailsBo.getBatchProcessType().equalsIgnoreCase(OLEConstants.OLEBatchProcess.BATCH_EXPORT)) {
153 jobDetailsBo.setUploadFileName(getOLEBatchProcessDataHelper().getExportPathUrl(jobDetailsBo));
154 }
155 else if (jobDetailsBo.getBatchProcessType().equalsIgnoreCase(OLEConstants.OLEBatchProcess.BATCH_BIB_IMPORT)) {
156 jobDetailsBo.setBibErrorPath(getOLEBatchProcessDataHelper().getBibPathUrl(jobDetailsBo));
157 }
158 ((OLEBatchProcessJobDetailsForm) form).setoLEBatchProcessJobDetailsBoList(oLEBatchProcessJobDetailsBoList);
159 ((OLEBatchProcessJobDetailsForm) form).setOLEBatchProcessJobDetailsBo(jobDetailsBo);
160
161 return getUIFModelAndView(form);
162 }
163
164 @RequestMapping(params = "methodToCall=downLoadFile")
165 public ModelAndView downLoadFile(@ModelAttribute("KualiForm") UifFormBase form, BindingResult result,
166 HttpServletRequest request, HttpServletResponse response) throws Exception {
167
168 OLEBatchProcessJobDetailsForm oleBatchProcessJobDetailsForm = (OLEBatchProcessJobDetailsForm) form;
169
170 Map map = new HashMap();
171 map.put("jobId", oleBatchProcessJobDetailsForm.getJobId());
172
173 List<OLEBatchProcessJobDetailsBo> oLEBatchProcessJobDetailsBoList = (List<OLEBatchProcessJobDetailsBo>) getBusinessObjectService().findMatching(OLEBatchProcessJobDetailsBo.class, map);
174 if (oLEBatchProcessJobDetailsBoList != null && oLEBatchProcessJobDetailsBoList.size() > 0) {
175 OLEBatchProcessJobDetailsBo job = oLEBatchProcessJobDetailsBoList.get(0);
176 map.clear();
177 map.put("batchProcessId",job.getBatchProcessId());
178 List<OLEBatchProcessDefinitionDocument> oleBatchProcessDefinitionDocumentList = (List<OLEBatchProcessDefinitionDocument>) getBusinessObjectService().findMatching(OLEBatchProcessDefinitionDocument.class, map);
179 if(oleBatchProcessDefinitionDocumentList!=null && oleBatchProcessDefinitionDocumentList.size()>0){
180 OLEBatchProcessDefinitionDocument oleBatchProcessDefinitionDocument=oleBatchProcessDefinitionDocumentList.get(0);
181 File file = new File(getBatchProcessFilePath(oleBatchProcessDefinitionDocument.getBatchProcessType()) + job.getJobId() + "_FailureRecord" + "_" + job.getUploadFileName());
182 if (!file.exists() || !file.isFile()) {
183 throw new RuntimeException("Error: non-existent file or directory provided");
184 }
185 File containingDirectory = file.getParentFile();
186 if (!BatchFileUtils.isDirectoryAccessible(containingDirectory.getAbsolutePath())) {
187 throw new RuntimeException("Error: inaccessible directory provided");
188 }
189
190 BatchFile batchFile = new BatchFile();
191 batchFile.setFile(file);
192 response.setContentType("application/octet-stream");
193 response.setHeader("Content-disposition", "attachment; filename=" + file.getName());
194 response.setHeader("Expires", "0");
195 response.setHeader("Cache-Control", "must-revalidate, post-check=0, pre-check=0");
196 response.setHeader("Pragma", "public");
197 response.setContentLength((int) file.length());
198
199 InputStream fis = new FileInputStream(file);
200 IOUtils.copy(fis, response.getOutputStream());
201 response.getOutputStream().flush();
202 }
203 }
204 return null;
205
206
207 }
208
209 @RequestMapping(params = "methodToCall=jobDocHandler")
210 public ModelAndView jobDocHandler(@ModelAttribute("KualiForm") UifFormBase form, BindingResult result,
211 HttpServletRequest request, HttpServletResponse response) throws Exception {
212 OLEBatchProcessJobDetailsForm oleBatchProcessJobDetailsForm = (OLEBatchProcessJobDetailsForm) form;
213 ModelAndView modelAndView=super.docHandler(oleBatchProcessJobDetailsForm,result,request,response);
214 String documentClass= request.getParameter("documentClass");
215 if(documentClass!=null && OLEBatchProcessScheduleBo.class.toString().contains(documentClass)){
216 List<OLEBatchProcessScheduleBo> oleBatchProcessScheduleBoList = (List<OLEBatchProcessScheduleBo>) getBusinessObjectService().findAll(OLEBatchProcessScheduleBo.class);
217 oleBatchProcessJobDetailsForm.setOleBatchProcessScheduleBoList(oleBatchProcessScheduleBoList);
218 oneTimeDate(oleBatchProcessScheduleBoList);
219 }
220 else{
221 List<OLEBatchProcessJobDetailsBo> oLEBatchProcessJobDetailsBoList = (List<OLEBatchProcessJobDetailsBo>) getBusinessObjectService().findAll(OLEBatchProcessJobDetailsBo.class);
222 oleBatchProcessJobDetailsForm.setoLEBatchProcessJobDetailsBoList(oLEBatchProcessJobDetailsBoList);
223 }
224 return modelAndView;
225 }
226
227 private String getBatchProcessFilePath(String batchProceesType) {
228 String batchProcessLocation = getOLEBatchProcessDataHelper().getBatchProcessFilePath(batchProceesType);
229 return batchProcessLocation;
230 }
231
232
233
234
235
236 private void runJobNow(String jobName){
237 OLEBatchSchedulerService schedulerService = GlobalResourceLoader.getService("oleSchedulerService");
238 try {
239 schedulerService.startJob(jobName);
240 } catch (Exception e) {
241 LOG.error("Error while starting job with job id :: "+jobName);
242 }
243 }
244
245 private void oneTimeDate(List<OLEBatchProcessScheduleBo> oleBatchProcessScheduleBoList){
246
247 try{
248 for(OLEBatchProcessScheduleBo oleBatchProcessScheduleBo :oleBatchProcessScheduleBoList){
249 CronExpression exp = new CronExpression(oleBatchProcessScheduleBoList.get(0).getCronExpression());
250 Date date = exp.getNextValidTimeAfter(new Date());
251 if(date!=null){
252 SimpleDateFormat sdf = new SimpleDateFormat("MM/dd/yyyy HH:mm:ss");
253 Timestamp nextRunTime = new Timestamp(date.getTime());
254 oleBatchProcessScheduleBo.setNextRunTime(nextRunTime);
255 }
256 }
257 } catch(ParseException e){
258 LOG.error("Error while validating cron exp::"+ oleBatchProcessScheduleBoList.get(0).getCronExpression(),e);
259 }
260
261
262 }
263
264 @RequestMapping(params = "methodToCall=removeScheduleJob")
265 public ModelAndView removeScheduleJob(@ModelAttribute("KualiForm") UifFormBase form, BindingResult result,
266 HttpServletRequest request, HttpServletResponse response) throws Exception {
267 OLEBatchProcessJobDetailsForm oleBatchProcessJobDetailsForm = (OLEBatchProcessJobDetailsForm)form;
268 Map map =new HashMap();
269 map.put("scheduleId",request.getParameter("scheduleId"));
270 List<OLEBatchProcessScheduleBo> oLEBatchProcessScheduleBoList = (List<OLEBatchProcessScheduleBo>) getBusinessObjectService().findMatching(OLEBatchProcessScheduleBo.class, map);
271 OLEBatchProcessScheduleBo scheduleBo = oLEBatchProcessScheduleBoList.get(0);
272 getOLEBatchProcessDataHelper().deleteBatchFailureFile(scheduleBo.getBatchProcessType(),scheduleBo.getScheduleId() + "_Scheduled" + "_" + scheduleBo.getUploadFileName());
273 getBusinessObjectService().delete(scheduleBo);
274 removeJob(scheduleBo.getScheduleId());
275 List<OLEBatchProcessScheduleBo> oleBatchProcessScheduleBoList = ( List<OLEBatchProcessScheduleBo> ) getBusinessObjectService().findAll(OLEBatchProcessScheduleBo.class);
276 oleBatchProcessJobDetailsForm.setOleBatchProcessScheduleBoList(oleBatchProcessScheduleBoList);
277 return getUIFModelAndView(oleBatchProcessJobDetailsForm);
278
279 }
280
281 private void removeJob(String jobName){
282 OLEBatchSchedulerService schedulerService = GlobalResourceLoader.getService("oleSchedulerService");
283 try {
284 schedulerService.deleteJob(jobName);
285 } catch (Exception e) {
286 LOG.error("Error while removing job with schedule id :: "+jobName);
287 }
288 }
289
290
291 }
292
293
294