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