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
31
32
33
34
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
90
91
92
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
107
108
109
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
120
121
122
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
133
134
135
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
146
147
148
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
181
182
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 }