001 /**
002 * Copyright 2005-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 mocks;
017
018 import java.util.ArrayList;
019 import java.util.Collection;
020 import java.util.HashMap;
021 import java.util.Iterator;
022 import java.util.List;
023 import java.util.Map;
024
025 import org.apache.commons.lang.StringUtils;
026 import org.apache.log4j.Logger;
027 import org.joda.time.DateTime;
028 import org.kuali.rice.core.api.config.property.ConfigContext;
029 import org.kuali.rice.core.mail.Mailer;
030 import org.kuali.rice.kew.api.action.ActionItem;
031 import org.kuali.rice.kew.mail.DailyEmailJob;
032 import org.kuali.rice.kew.mail.WeeklyEmailJob;
033 import org.kuali.rice.kew.mail.service.EmailContentService;
034 import org.kuali.rice.kew.api.KewApiConstants;
035 import org.kuali.rice.kim.api.identity.Person;
036 import org.kuali.rice.kim.api.identity.principal.Principal;
037 import org.kuali.rice.kim.api.services.KimApiServiceLocator;
038 import org.quartz.CronTrigger;
039 import org.quartz.JobDetail;
040
041
042 public class MockEmailNotificationServiceImpl /*extends CustomizableActionListEmailServiceImpl*/ implements MockEmailNotificationService {
043 private static final Logger LOG = Logger.getLogger(MockEmailNotificationServiceImpl.class);
044
045 private static Map<String,List> immediateReminders = new HashMap<String,List>();
046 private static Map<String,Integer> aggregateReminderCount = new HashMap<String,Integer>();
047 private boolean sendDailyReminderCalled = false;
048 private boolean sendWeeklyReminderCalled = false;
049
050 private static final String DAILY_TRIGGER_NAME = "Daily Email Trigger";
051 private static final String DAILY_JOB_NAME = "Daily Email";
052 private static final String WEEKLY_TRIGGER_NAME = "Weekly Email Trigger";
053 private static final String WEEKLY_JOB_NAME = "Weekly Email";
054
055 private EmailContentService contentService;
056 private String deploymentEnvironment;
057
058 private Mailer mailer;
059
060 /**
061 * Resets the reminder counts
062 */
063 public void resetReminderCounts() {
064 aggregateReminderCount.clear();
065 immediateReminders.clear();
066 }
067
068 /**
069 * This overridden method will perform the standard operations from org.kuali.rice.kew.mail.ActionListEmailServiceImpl but will also keep track of action
070 * items processed
071 */
072 @Override
073 public void sendImmediateReminder(ActionItem actionItem, Boolean skipOnApprovals) {
074 if (skipOnApprovals != null && skipOnApprovals.booleanValue()
075 && actionItem.getActionRequestCd().equals(KewApiConstants.ACTION_REQUEST_APPROVE_REQ)) {
076 LOG.debug("As requested, skipping immediate reminder notification on action item approval for " + actionItem.getPrincipalId());
077 return;
078 }
079 List actionItemsSentUser = (List)immediateReminders.get(actionItem.getPrincipalId());
080 if (actionItemsSentUser == null) {
081 actionItemsSentUser = new ArrayList();
082 immediateReminders.put(actionItem.getPrincipalId(), actionItemsSentUser);
083 }
084 actionItemsSentUser.add(actionItem);
085 }
086
087 /**
088 * This overridden method returns a value of true always
089 */
090 //@Override
091 protected boolean sendActionListEmailNotification() {
092
093 return true;
094 }
095
096 @Override
097 public void sendDailyReminder() {
098 LOG.info("Sending daily reminder");
099 try {
100 getEmailContentGenerator().generateWeeklyReminder(null, null);
101 }
102 catch (NullPointerException npe) {}
103
104 List<ActionItem> actionItems = new ArrayList<ActionItem>(1);
105 actionItems.add(ActionItem.Builder.create("ai1", "ai2", "ai3", new DateTime(), "ai4", "ai5", "ai6", "ai7", "ai8").build());
106 sendPeriodicReminder(null, actionItems, KewApiConstants.EMAIL_RMNDR_DAY_VAL);
107 //super.sendDailyReminder();
108 sendDailyReminderCalled = true;
109 }
110
111 @Override
112 public boolean wasDailyReminderSent(){
113 return this.sendDailyReminderCalled;
114 }
115
116 @Override
117 public void sendWeeklyReminder() {
118 LOG.info("Sending weekly reminder");
119 try {
120 getEmailContentGenerator().generateWeeklyReminder(null, null);
121 }
122 catch (NullPointerException npe) {}
123 List<ActionItem> actionItems = new ArrayList<ActionItem>(1);
124 actionItems.add(ActionItem.Builder.create("ai1", "ai2", "ai3", new DateTime(), "ai4", "ai5", "ai6", "ai7", "ai8").build());
125 sendPeriodicReminder(null, actionItems, KewApiConstants.EMAIL_RMNDR_WEEK_VAL);
126 //super.sendWeeklyReminder();
127 sendWeeklyReminderCalled = true;
128 }
129
130 @Override
131 public boolean wasWeeklyReminderSent(){
132 return this.sendWeeklyReminderCalled;
133 }
134
135 @Override
136 public void scheduleBatchEmailReminders() throws Exception {
137 sendDailyReminderCalled = false;
138 sendWeeklyReminderCalled = false;
139 LOG.info("Scheduling Batch Email Reminders.");
140 String emailBatchGroup = "Email Batch";
141 String dailyCron = ConfigContext.getCurrentContextConfig()
142 .getProperty(KewApiConstants.DAILY_EMAIL_CRON_EXPRESSION);
143 if (!StringUtils.isBlank(dailyCron)) {
144 LOG.info("Scheduling Daily Email batch with cron expression: " + dailyCron);
145 CronTrigger dailyTrigger = new CronTrigger(DAILY_TRIGGER_NAME, emailBatchGroup, dailyCron);
146 JobDetail dailyJobDetail = new JobDetail(DAILY_JOB_NAME, emailBatchGroup, DailyEmailJob.class);
147 dailyTrigger.setJobName(dailyJobDetail.getName());
148 dailyTrigger.setJobGroup(dailyJobDetail.getGroup());
149 sendDailyReminderCalled = true;
150 } else {
151 LOG.warn("No " + KewApiConstants.DAILY_EMAIL_CRON_EXPRESSION
152 + " parameter was configured. Daily Email batch was not scheduled!");
153 }
154
155 String weeklyCron = ConfigContext.getCurrentContextConfig().getProperty(
156 KewApiConstants.WEEKLY_EMAIL_CRON_EXPRESSION);
157 if (!StringUtils.isBlank(weeklyCron)) {
158 LOG.info("Scheduling Weekly Email batch with cron expression: " + weeklyCron);
159 CronTrigger weeklyTrigger = new CronTrigger(WEEKLY_TRIGGER_NAME, emailBatchGroup, weeklyCron);
160 JobDetail weeklyJobDetail = new JobDetail(WEEKLY_JOB_NAME, emailBatchGroup, WeeklyEmailJob.class);
161 weeklyTrigger.setJobName(weeklyJobDetail.getName());
162 weeklyTrigger.setJobGroup(weeklyJobDetail.getGroup());
163 sendWeeklyReminderCalled = true;
164 } else {
165 LOG.warn("No " + KewApiConstants.WEEKLY_EMAIL_CRON_EXPRESSION
166 + " parameter was configured. Weekly Email batch was not scheduled!");
167 }
168 }
169
170 //@Override
171 protected void sendPeriodicReminder(Person user, Collection<ActionItem> actionItems, String emailSetting) {
172 //super.sendPeriodicReminder(user, actionItems, emailSetting);
173 if (!aggregateReminderCount.containsKey(emailSetting)) {
174 aggregateReminderCount.put(emailSetting, actionItems.size());
175 } else {
176 aggregateReminderCount.put(emailSetting, aggregateReminderCount.get(emailSetting) + actionItems.size());
177 }
178 }
179
180 public Integer getTotalPeriodicRemindersSent(String emailReminderConstant) {
181 Integer returnVal = aggregateReminderCount.get(emailReminderConstant);
182 if (returnVal == null) {
183 returnVal = Integer.valueOf(0);
184 }
185 return returnVal;
186 }
187
188 public Integer getTotalPeriodicRemindersSent() {
189 int total = 0;
190 for (Map.Entry<String, Integer> mapEntry : aggregateReminderCount.entrySet()) {
191 Integer value = mapEntry.getValue();
192 total += (value == null) ? 0 : value.intValue();
193 }
194 return Integer.valueOf(total);
195 }
196
197 public boolean wasStyleServiceAccessed() {
198 return getEmailContentGenerator().wasServiceAccessed();
199 }
200
201 private void resetStyleService() {
202 getEmailContentGenerator().resetServiceAccessed();
203 }
204
205 public int immediateReminderEmailsSent(String networkId, String documentId, String actionRequestCd) {
206 Principal principal = KimApiServiceLocator.getIdentityService().getPrincipalByPrincipalName(networkId);
207 List actionItemsSentUser = immediateReminders.get(principal.getPrincipalId());
208 if (actionItemsSentUser == null) {
209 LOG.info("There are no immediate reminders for Principal " + networkId + " and Document ID " + documentId);
210 return 0;
211 }
212 else {
213 LOG.info("There are " + actionItemsSentUser.size() + " immediate reminders for Principal " + networkId + " and Document ID " + documentId);
214 }
215 int emailsSent = 0;
216 for (Iterator iter = actionItemsSentUser.iterator(); iter.hasNext();) {
217 ActionItem actionItem = (ActionItem) iter.next();
218 if (actionItem.getDocumentId().equals(documentId) && actionItem.getActionRequestCd().equals(actionRequestCd)) {
219 emailsSent++;
220 }
221 }
222 LOG.info(emailsSent + "No immediate e-mails were sent to Principal " + networkId + " and Document ID " + documentId);
223 return emailsSent;
224 }
225
226 public void setEmailContentGenerator(EmailContentService contentService) {
227 this.contentService = contentService;
228 }
229
230 protected MockStyleableEmailContentService getEmailContentGenerator() {
231 return (MockStyleableEmailContentService) contentService;
232 }
233
234 public void setMailer(Mailer mailer){
235 this.mailer = mailer;
236 }
237
238 public void setDeploymentEnvironment(String deploymentEnvironment) {
239 this.deploymentEnvironment = deploymentEnvironment;
240 }
241 }