1 /**
2 * Copyright 2005-2013 The Kuali Foundation
3 *
4 * Licensed under the Educational Community License, Version 2.0 (the "License");
5 * you may not use this file except in compliance with the License.
6 * You may obtain a copy of the License at
7 *
8 * http://www.opensource.org/licenses/ecl2.php
9 *
10 * Unless required by applicable law or agreed to in writing, software
11 * distributed under the License is distributed on an "AS IS" BASIS,
12 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13 * See the License for the specific language governing permissions and
14 * limitations under the License.
15 */
16 package org.kuali.rice.ken.service.impl;
17
18 import org.apache.commons.lang.StringUtils;
19 import org.kuali.rice.ken.bo.NotificationMessageDelivery;
20 import org.kuali.rice.ken.document.kew.NotificationWorkflowDocument;
21 import org.kuali.rice.ken.service.NotificationMessageContentService;
22 import org.kuali.rice.ken.service.NotificationWorkflowDocumentService;
23 import org.kuali.rice.ken.util.NotificationConstants;
24 import org.kuali.rice.kew.api.WorkflowDocument;
25 import org.kuali.rice.kew.api.WorkflowRuntimeException;
26 import org.kuali.rice.kew.api.action.ActionRequest;
27 import org.kuali.rice.kew.api.action.ActionRequestType;
28 import org.kuali.rice.kim.api.identity.principal.Principal;
29 import org.kuali.rice.kim.api.services.KimApiServiceLocator;
30
31 import java.util.List;
32
33 /**
34 * This class is responsible for interacting with KEW - this is the default implementation that
35 * leverages the KEW client API.
36 * @author Kuali Rice Team (rice.collab@kuali.org)
37 */
38 public class NotificationWorkflowDocumentServiceImpl implements NotificationWorkflowDocumentService {
39 private static org.apache.log4j.Logger LOG = org.apache.log4j.Logger
40 .getLogger(NotificationWorkflowDocumentServiceImpl.class);
41
42 private NotificationMessageContentService messageContentService;
43
44 /**
45 * Constructs a NotificationWorkflowDocumentServiceImpl instance.
46 * @param messageContentService
47 */
48 public NotificationWorkflowDocumentServiceImpl(NotificationMessageContentService messageContentService) {
49 this.messageContentService = messageContentService;
50 }
51
52 /**
53 * Implements by instantiating a NotificationWorkflowDocument, which in turn interacts with
54 * Workflow to set it up with an initiator of the passed in user id.
55 * @see org.kuali.rice.ken.service.NotificationWorkflowDocumentService#createAndAdHocRouteNotificationWorkflowDocument(org.kuali.rice.ken.bo.NotificationMessageDelivery,
56 * java.lang.String, java.lang.String, java.lang.String)
57 */
58 public String createAndAdHocRouteNotificationWorkflowDocument(NotificationMessageDelivery messageDelivery,
59 String initiatorUserId,
60 String recipientUserId, String annotation) {
61 // obtain a workflow user object first
62 //WorkflowIdDTO initiator = new WorkflowIdDTO(initiatorUserId);
63
64 // now construct the workflow document, which will interact with workflow
65 WorkflowDocument document = NotificationWorkflowDocument.createNotificationDocument(initiatorUserId);
66
67 // this is our loose foreign key to our message delivery record in notification
68 document.setApplicationDocumentId(messageDelivery.getId().toString());
69 //document.setAppDocId(messageDelivery.getId().toString());
70
71 // now add the content of the notification as XML to the document
72 document.setApplicationContent(messageContentService.generateNotificationMessage(
73 messageDelivery.getNotification(), messageDelivery.getUserRecipientId()));
74
75 if (!StringUtils.isBlank(messageDelivery.getNotification().getTitle())) {
76 document.setTitle(messageDelivery.getNotification().getTitle());
77 } else {
78 LOG.error("Encountered notification with no title set: Message Delivery #" + messageDelivery.getId()
79 + ", Notification #" + messageDelivery.getNotification().getId());
80 }
81
82 // now set up the ad hoc route
83 String actionRequested;
84 if (NotificationConstants.DELIVERY_TYPES.ACK.equals(messageDelivery.getNotification().getDeliveryType())) {
85 actionRequested = NotificationConstants.KEW_CONSTANTS.ACK_AD_HOC_ROUTE;
86 } else {
87 actionRequested = NotificationConstants.KEW_CONSTANTS.FYI_AD_HOC_ROUTE;
88 }
89
90 // Clarification of ad hoc route call
91 // param 1 - actionRequested will be either ACK or FYI
92 // param 2 - annotation is whatever text we pass in to describe the transaction - this will be system generated
93 // param 3 - recipient is the person who will receive this request
94 // param 4 - this is the responsibilityParty (a.k.a the system that produced this request), so we'll put the producer name in there
95 // param 5 - this is the "force action" requests - if set to true, this will be delivered to the recipients list regardless of
96 // whether the recipient has already taken action on this request; in our case, this doesn't really apply at this point in time,
97 // so we'll set to true just to be safe
98
99 // recipientUserId will always be a principal ID due to code changes in NotificationMessageDeliveryResolverServiceImpl.buildCompleteRecipientList()
100 Principal principal = KimApiServiceLocator.getIdentityService().getPrincipal(recipientUserId);
101
102 document.adHocToPrincipal(ActionRequestType.fromCode(actionRequested), annotation, principal.getPrincipalId(),
103 messageDelivery.getNotification().getProducer().getName(), true);
104
105 // now actually route it along its way
106 document.route(annotation);
107
108 return document.getDocumentId();
109 }
110
111 /**
112 * This service method is implemented by constructing a NotificationWorkflowDocument using the
113 * pre-existing document Id that is passed in.
114 * @see org.kuali.rice.ken.service.NotificationWorkflowDocumentService#findNotificationWorkflowDocumentByDocumentId(java.lang.String,
115 * java.lang.String)
116 */
117 public WorkflowDocument getNotificationWorkflowDocumentByDocumentId(String initiatorUserId,
118 String workflowDocumentId) {
119 // construct the workflow id value object
120 //WorkflowIdDTO initiator = new WorkflowIdDTO(initiatorUserId);
121
122 // now return the actual document instance
123 // this handles going out and getting the workflow document
124 return NotificationWorkflowDocument.loadNotificationDocument(initiatorUserId, workflowDocumentId);
125 }
126
127 /**
128 * @see org.kuali.rice.ken.service.NotificationWorkflowDocumentService#clearAllFyisAndAcknowledgeNotificationWorkflowDocument(java.lang.String,
129 * org.kuali.rice.ken.document.kew.NotificationWorkflowDocument, java.lang.String)
130 */
131 public void clearAllFyisAndAcknowledgeNotificationWorkflowDocument(String initiatorUserId,
132 WorkflowDocument workflowDocument, String annotation) {
133 List<ActionRequest> reqs = workflowDocument.getRootActionRequests();
134 for (int i = 0; i < reqs.size(); i++) {
135 LOG.info("Action Request[" + i + "] = " + reqs.get(i).getActionRequested());
136 if (reqs.get(i).getActionRequested().equals(ActionRequestType.ACKNOWLEDGE)) {
137 workflowDocument.acknowledge(annotation);
138 } else if (reqs.get(i).getActionRequested().equals(ActionRequestType.FYI)) {
139 workflowDocument.logAnnotation(annotation);
140 workflowDocument.fyi();
141 } else {
142 throw new WorkflowRuntimeException("Invalid notification action request in workflow document ("
143 + workflowDocument.getDocumentId()
144 + ") was encountered. Should be either an acknowledge or fyi and was not.");
145 }
146 }
147 }
148
149 /**
150 * @see org.kuali.rice.ken.service.NotificationWorkflowDocumentService#terminateWorkflowDocument(org.kuali.rice.kew.api.WorkflowDocument)
151 */
152 public void terminateWorkflowDocument(WorkflowDocument document) {
153 document.superUserCancel("terminating document: documentId=" + document.getDocumentId() + ", appDocId="
154 + document.getApplicationDocumentId());
155 }
156 }