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    }