View Javadoc

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   * Created with IntelliJ IDEA.
38   * User: krishnamohanv
39   * Date: 7/12/13
40   * Time: 5:06 PM
41   * To change this template use File | Settings | File Templates.
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      * Runs the process for the profile selected and takes the scheduled record id as the job name
234      * @param jobName
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