001/** 002 * Copyright 2005-2016 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 org.kuali.rice.ken.postprocessor.kew; 017 018import org.apache.log4j.Logger; 019import org.kuali.rice.core.framework.persistence.dao.GenericDao; 020import org.kuali.rice.ken.bo.NotificationBo; 021import org.kuali.rice.ken.core.GlobalNotificationServiceLocator; 022import org.kuali.rice.ken.document.kew.NotificationWorkflowDocument; 023import org.kuali.rice.ken.service.NotificationMessageContentService; 024import org.kuali.rice.ken.service.NotificationService; 025import org.kuali.rice.ken.util.Util; 026import org.kuali.rice.kew.api.KewApiConstants; 027import org.kuali.rice.kew.api.WorkflowDocument; 028import org.kuali.rice.kew.api.action.ActionType; 029import org.kuali.rice.kew.framework.postprocessor.ActionTakenEvent; 030import org.kuali.rice.kew.framework.postprocessor.AfterProcessEvent; 031import org.kuali.rice.kew.framework.postprocessor.BeforeProcessEvent; 032import org.kuali.rice.kew.framework.postprocessor.DeleteEvent; 033import org.kuali.rice.kew.framework.postprocessor.DocumentLockingEvent; 034import org.kuali.rice.kew.framework.postprocessor.DocumentRouteLevelChange; 035import org.kuali.rice.kew.framework.postprocessor.DocumentRouteStatusChange; 036import org.kuali.rice.kew.framework.postprocessor.PostProcessor; 037import org.kuali.rice.kew.framework.postprocessor.ProcessDocReport; 038 039import java.util.List; 040 041 042/** 043 * This class is the post processor that gets run when the general notification 044 * message sending form is approved by its reviewers. 045 * @author Kuali Rice Team (rice.collab@kuali.org) 046 */ 047public class NotificationSenderFormPostProcessor implements PostProcessor { 048 private static final Logger LOG = Logger.getLogger(NotificationSenderFormPostProcessor.class); 049 050 NotificationService notificationService; 051 GenericDao businessObjectDao; 052 NotificationMessageContentService messageContentService; 053 054 /** 055 * Constructs a NotificationSenderFormPostProcessor instance. 056 */ 057 public NotificationSenderFormPostProcessor() { 058 this.notificationService = GlobalNotificationServiceLocator.getInstance().getNotificationService(); 059 this.businessObjectDao = GlobalNotificationServiceLocator.getInstance().getGenericDao(); 060 this.messageContentService = GlobalNotificationServiceLocator.getInstance().getNotificationMessageContentService(); 061 } 062 063 /** 064 * Constructs a NotificationSenderFormPostProcessor instance. 065 * @param notificationService 066 * @param businessObjectDao 067 */ 068 public NotificationSenderFormPostProcessor(NotificationService notificationService, GenericDao businessObjectDao) { 069 this.notificationService = notificationService; 070 this.businessObjectDao = businessObjectDao; 071 } 072 073 /** 074 * @see org.kuali.rice.kew.framework.postprocessor.PostProcessor#doActionTaken(org.kuali.rice.kew.framework.postprocessor.ActionTakenEvent) 075 */ 076 @Override 077 public ProcessDocReport doActionTaken(ActionTakenEvent arg0) throws Exception { 078 return new ProcessDocReport(true, ""); 079 } 080 081 /** 082 * @see org.kuali.rice.kew.framework.postprocessor.PostProcessor#afterActionTaken(org.kuali.rice.kew.api.action.ActionType, org.kuali.rice.kew.framework.postprocessor.ActionTakenEvent) 083 */ 084 @Override 085 public ProcessDocReport afterActionTaken(ActionType performed, ActionTakenEvent event) throws Exception { 086 return new ProcessDocReport(true, ""); 087 } 088 089 /** 090 * @see org.kuali.rice.kew.framework.postprocessor.PostProcessor#doDeleteRouteHeader(org.kuali.rice.kew.framework.postprocessor.DeleteEvent) 091 */ 092 @Override 093 public ProcessDocReport doDeleteRouteHeader(DeleteEvent arg0) throws Exception { 094 return new ProcessDocReport(true, ""); 095 } 096 097 /** 098 * @see org.kuali.rice.kew.framework.postprocessor.PostProcessor#doRouteLevelChange(org.kuali.rice.kew.framework.postprocessor.DocumentRouteLevelChange) 099 */ 100 @Override 101 public ProcessDocReport doRouteLevelChange(DocumentRouteLevelChange arg0) throws Exception { 102 return new ProcessDocReport(true, ""); 103 } 104 105 /** 106 * When the EDL simple message sending form is submitted, it is routed straight to FINAL and at that time (when RESOLVED), we 107 * actually send the notification. 108 * @see org.kuali.rice.kew.framework.postprocessor.PostProcessor#doRouteStatusChange(org.kuali.rice.kew.framework.postprocessor.DocumentRouteStatusChange) 109 */ 110 @Override 111 public ProcessDocReport doRouteStatusChange(DocumentRouteStatusChange arg0) throws Exception { 112 LOG.debug("ENTERING NotificationSenderFormPostProcessor.doRouteStatusChange() for Notification Sender Form with document ID: " + arg0.getDocumentId()); 113 114 if(arg0.getNewRouteStatus().equals(KewApiConstants.ROUTE_HEADER_PROCESSED_CD)) { 115 LOG.debug("Workflow status has changed to RESOLVED for Notification Sender Form with document ID: " + arg0.getDocumentId() + 116 ". We are now calling the NotificationService.sendNotification() service."); 117 118 // obtain a workflow user object first 119 //NetworkIdDTO proxyUser = new NetworkIdDTO(Util.getNotificationSystemUser()); 120 String proxyUserId = Util.getNotificationSystemUser(); 121 122 // now construct the workflow document, which will interact with workflow 123 WorkflowDocument document; 124 try { 125 document = NotificationWorkflowDocument.loadNotificationDocument(proxyUserId, arg0.getDocumentId()); 126 127 LOG.debug("XML:" + document.getApplicationContent()); 128 129 //parse out the application content into a Notification BO 130 NotificationBo notification = messageContentService.parseSerializedNotificationXml(document.getApplicationContent().getBytes()); 131 132 LOG.debug("Notification Content: " + notification.getContent()); 133 134 // send the notification 135 notificationService.sendNotification(notification); 136 137 LOG.debug("NotificationService.sendNotification() was successfully called for Notification Sender Form with document ID: " + arg0.getDocumentId()); 138 } catch(Exception e) { 139 throw new RuntimeException(e); 140 } 141 } 142 143 LOG.debug("LEAVING NotificationSenderFormPostProcessor.doRouteStatusChange() for Notification Sender Form with document ID: " + arg0.getDocumentId()); 144 return new ProcessDocReport(true, ""); 145 } 146 147 /** 148 * @see org.kuali.rice.kew.framework.postprocessor.PostProcessor#beforeProcess(org.kuali.rice.kew.framework.postprocessor.BeforeProcessEvent) 149 */ 150 @Override 151 public ProcessDocReport beforeProcess(BeforeProcessEvent beforeProcessEvent) throws Exception { 152 return new ProcessDocReport(true, ""); 153 } 154 155 /** 156 * @see org.kuali.rice.kew.framework.postprocessor.PostProcessor#afterProcess(org.kuali.rice.kew.framework.postprocessor.AfterProcessEvent) 157 */ 158 @Override 159 public ProcessDocReport afterProcess(AfterProcessEvent afterProcessEvent) throws Exception { 160 return new ProcessDocReport(true, ""); 161 } 162 163 /** 164 * @see org.kuali.rice.kew.framework.postprocessor.PostProcessor#getDocumentIdsToLock(org.kuali.rice.kew.framework.postprocessor.DocumentLockingEvent) 165 */ 166 @Override 167 public List<String> getDocumentIdsToLock(DocumentLockingEvent documentLockingEvent) throws Exception { 168 return null; 169 } 170 171}