View Javadoc
1   package org.kuali.ole.batch.impl;
2   
3   import org.apache.commons.lang.StringUtils;
4   import org.apache.log4j.Logger;
5   import org.apache.velocity.Template;
6   import org.apache.velocity.VelocityContext;
7   import org.apache.velocity.app.VelocityEngine;
8   import org.kuali.ole.OLEConstants;
9   import org.kuali.ole.batch.bo.OLEBatchProcessJobDetailsBo;
10  import org.kuali.ole.batch.bo.OLEBatchProcessScheduleBo;
11  import org.kuali.ole.batch.document.OLEBatchProcessDefinitionDocument;
12  import org.kuali.ole.batch.helper.OLEBatchProcessDataHelper;
13  import org.kuali.ole.deliver.batch.OleMailer;
14  import org.kuali.ole.sys.batch.AbstractStep;
15  import org.kuali.ole.sys.batch.service.SchedulerService;
16  import org.kuali.rice.core.api.criteria.QueryByCriteria;
17  import org.kuali.rice.core.api.mail.EmailBody;
18  import org.kuali.rice.core.api.mail.EmailFrom;
19  import org.kuali.rice.core.api.mail.EmailSubject;
20  import org.kuali.rice.core.api.mail.EmailToList;
21  import org.kuali.rice.core.api.resourceloader.GlobalResourceLoader;
22  import org.kuali.rice.kns.service.KNSServiceLocator;
23  import org.kuali.rice.krad.service.KRADServiceLocator;
24  import org.kuali.rice.krad.service.KRADServiceLocatorWeb;
25  
26  import java.io.StringWriter;
27  import java.util.*;
28  
29  /**
30   * Created with IntelliJ IDEA.
31   * User: meenrajd
32   * Date: 7/25/13
33   * Time: 4:02 PM
34   * To change this template use File | Settings | File Templates.
35   */
36  public class OLEBatchProcessEmailStep extends AbstractStep {
37      private static final Logger LOG = Logger.getLogger(OLEBatchProcessEmailStep.class);
38      private static final String FROMEMAIL = "BATCHJOBADMIN@KUALI.ORG";
39  
40      private OleMailer oleMailer;
41  
42      private OleMailer getOleMailer() {
43          if (oleMailer == null) {
44              oleMailer = GlobalResourceLoader.getService("oleMailer");
45          }
46          return oleMailer;
47      }
48  
49      private OLEBatchProcessDataHelper oleBatchProcessDataHelper;
50  
51      private OLEBatchProcessDataHelper getOLEBatchProcessDataHelper() {
52  
53          if (oleBatchProcessDataHelper == null) {
54              oleBatchProcessDataHelper = OLEBatchProcessDataHelper.getInstance();
55          }
56          return oleBatchProcessDataHelper;
57      }
58  
59      @Override
60      public boolean execute(String jobName, Date jobRunDate) throws InterruptedException {
61          buildJobReport(jobName);
62          return true;
63      }
64  
65      private void buildJobReport(String jobName) {
66          try {
67              String jobId = StringUtils.substringAfter(jobName, SchedulerService.SCHEDULED_GROUP + "." + OLEConstants.OLEBatchProcess.ADHOC_BATCH_JOB);
68              String scheduleId = StringUtils.substringAfter(jobName, SchedulerService.SCHEDULED_GROUP + "." + OLEConstants.OLEBatchProcess.BATCH_JOB);
69              if (StringUtils.isNotEmpty(jobId)) {
70                  OLEBatchProcessJobDetailsBo jobDetailsBo = readJobRecord(jobId);
71                  OLEBatchProcessDefinitionDocument processDefDoc = readOLEBatchProcessDefinitionDocument(jobDetailsBo.getBatchProcessId());
72                  sendJobReportMail(processDefDoc, jobDetailsBo);
73              } else if (StringUtils.isNotEmpty(scheduleId)) {
74                  OLEBatchProcessScheduleBo scheduleBo = readScheduleRecord(scheduleId);
75                  OLEBatchProcessJobDetailsBo jobDetailsBo = readJobRecordForSch(scheduleBo.getBatchProcessId());
76                  if(jobDetailsBo==null){
77                      LOG.error("Error while Running step OLEBatchProcessEmailStep:: Unable to get job details for process id:: "+scheduleBo.getBatchProcessId());
78                  }else{
79                      OLEBatchProcessDefinitionDocument processDefDoc = readOLEBatchProcessDefinitionDocument(jobDetailsBo.getBatchProcessId());
80                      sendJobReportMail(processDefDoc, jobDetailsBo);
81                  }
82              }
83          } catch (Exception ex) {
84              LOG.error("Error while Running step OLEBatchProcessEmailStep:: ", ex);
85          }
86      }
87  
88      /**
89       * reads the job record which is being run
90       *
91       * @param processId
92       * @return
93       */
94      private OLEBatchProcessJobDetailsBo readJobRecordForSch(String processId) {
95          Map<String, String> jobMap = new HashMap<String, String>();
96          jobMap.put("bat_prcs_id", processId);
97          List<OLEBatchProcessJobDetailsBo> jobDetailsBoList = (List<OLEBatchProcessJobDetailsBo>) KRADServiceLocatorWeb.getLegacyDataAdapter().findMatchingOrderBy(OLEBatchProcessJobDetailsBo.class, jobMap, "JOB_ID", false);
98          if (jobDetailsBoList.isEmpty()) {
99              return null;
100         } else {
101             return jobDetailsBoList.get(0);
102         }
103     }
104 
105     /**
106      * reads the job record which is being run
107      *
108      * @param jobId
109      * @return
110      */
111     private OLEBatchProcessJobDetailsBo readJobRecord(String jobId) {
112         Map<String, String> jobMap = new HashMap<String, String>();
113         jobMap.put("job_id", jobId);
114         OLEBatchProcessJobDetailsBo jobDetailsBo = KRADServiceLocatorWeb.getLegacyDataAdapter().findByPrimaryKey(OLEBatchProcessJobDetailsBo.class, jobMap);
115         return jobDetailsBo;
116     }
117 
118     /**
119      * reads the schedule record which is being run
120      *
121      * @param scheduleId
122      * @return
123      */
124     private OLEBatchProcessScheduleBo readScheduleRecord(String scheduleId) {
125         Map<String, String> schMap = new HashMap<String, String>();
126         schMap.put("ole_bat_prcs_schdule_id", scheduleId);
127         OLEBatchProcessScheduleBo scheduleBo = KRADServiceLocator.getDataObjectService().findUnique(OLEBatchProcessScheduleBo.class, QueryByCriteria.Builder.andAttributes(schMap).build());
128         return scheduleBo;
129     }
130 
131     /**
132      * Read the OLEBatchProcessDefinitionDocument record by using batchProcessId.
133      *
134      * @param batchProcessId
135      * @return
136      */
137     private OLEBatchProcessDefinitionDocument readOLEBatchProcessDefinitionDocument(String batchProcessId) {
138         Map<String, String> jobMap = new HashMap<String, String>();
139         jobMap.put("bat_prcs_id", batchProcessId);
140         OLEBatchProcessDefinitionDocument processDefDoc = KRADServiceLocatorWeb.getLegacyDataAdapter().findByPrimaryKey(OLEBatchProcessDefinitionDocument.class, jobMap);
141         return processDefDoc;
142     }
143 
144     /**
145      * Sends mail to the given recipients
146      *
147      * @param processDefDoc, job
148      * @return
149      */
150     private void sendJobReportMail(OLEBatchProcessDefinitionDocument processDefDoc, OLEBatchProcessJobDetailsBo job) throws Exception {
151         if (StringUtils.isNotBlank(processDefDoc.getEmailIds())) {
152             String[] emailsIdsArray = processDefDoc.getEmailIds().split(",");
153             if (Integer.parseInt(job.getNoOfSuccessRecords()) <= 0) {
154                 if (processDefDoc.getBatchProcessType().equals(OLEConstants.OLEBatchProcess.BATCH_DELETE)){
155                     getOleMailer().sendEmail(new EmailFrom(FROMEMAIL), new EmailToList(Arrays.asList(emailsIdsArray)),
156                             new EmailSubject(OLEConstants.OLEBatchProcess.BATCH_DELETION_JOB + (StringUtils.isEmpty(processDefDoc.getBatchProcessName()) ? "" : processDefDoc.getBatchProcessName()) + OLEConstants.OLEBatchProcess.FAILED),
157                             new EmailBody(getReportByVM(job,processDefDoc)), null, null, true);
158                 }
159                 else {
160                     getOleMailer().sendEmail(new EmailFrom(FROMEMAIL), new EmailToList(Arrays.asList(emailsIdsArray)),
161                             new EmailSubject((StringUtils.isEmpty(processDefDoc.getBatchProcessName()) ? "" : processDefDoc.getBatchProcessName() + "-") + processDefDoc.getBatchProcessType() + OLEConstants.OLEBatchProcess.FAILED),
162                             new EmailBody(getReportByVM(job,processDefDoc)), null, null, true);
163                 }
164             } else {
165                 if (processDefDoc.getBatchProcessType().equals(OLEConstants.OLEBatchProcess.BATCH_DELETE)){
166                     getOleMailer().sendEmail(new EmailFrom(FROMEMAIL), new EmailToList(Arrays.asList(emailsIdsArray)),
167                             new EmailSubject(OLEConstants.OLEBatchProcess.BATCH_DELETION_JOB + (StringUtils.isEmpty(processDefDoc.getBatchProcessName()) ? "" : processDefDoc.getBatchProcessName()) + OLEConstants.OLEBatchProcess.COMPLETE),
168                             new EmailBody(getReportByVM(job,processDefDoc)), null, null, true);
169                 }
170                 else {
171                     getOleMailer().sendEmail(new EmailFrom(FROMEMAIL), new EmailToList(Arrays.asList(emailsIdsArray)),
172                             new EmailSubject((StringUtils.isEmpty(processDefDoc.getBatchProcessName()) ? "" : processDefDoc.getBatchProcessName() + "-") + processDefDoc.getBatchProcessType() + OLEConstants.OLEBatchProcess.COMPLETE),
173                             new EmailBody(getReportByVM(job,processDefDoc)), null, null, true);
174                 }
175             }
176         }
177     }
178     /**
179      *
180      * @param job
181      * @return
182      * @throws Exception
183      */
184     private String getReportByVM(OLEBatchProcessJobDetailsBo job,OLEBatchProcessDefinitionDocument processDefDoc) throws Exception {
185         VelocityEngine ve = GlobalResourceLoader.getService("velocityEngine");
186         ve.init();
187         VelocityContext context = new VelocityContext();
188         context.put("job", job);
189         context.put("processDefDoc", processDefDoc);
190         context.put("dataHelper", OLEBatchProcessDataHelper.getInstance());
191         context.put("Integer", Integer.class);
192         context.put("StringUtils", StringUtils.class);
193         Template t = ve.getTemplate("jobreport.vm");
194         StringWriter writer = new StringWriter();
195         t.merge(context, writer);
196         return writer.toString();
197     }
198 
199 
200 }