001 /**
002 * Copyright 2005-2012 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 org.kuali.rice.kew.notification.service.impl;
017
018 import java.util.List;
019
020 import javax.xml.namespace.QName;
021
022 import org.apache.commons.lang.StringUtils;
023 import org.kuali.rice.core.api.config.property.ConfigContext;
024 import org.kuali.rice.core.api.resourceloader.GlobalResourceLoader;
025 import org.kuali.rice.kcb.api.message.MessageDTO;
026 import org.kuali.rice.kcb.api.service.KCBServiceNames;
027 import org.kuali.rice.kcb.api.service.MessagingService;
028 import org.kuali.rice.kcb.util.KCBConstants;
029 import org.kuali.rice.kew.api.WorkflowRuntimeException;
030 import org.kuali.rice.kew.api.action.ActionItem;
031 import org.kuali.rice.kew.api.KewApiConstants;
032
033
034 /**
035 * NotificationService implementation that delegates to KCB
036 *
037 * @author Kuali Rice Team (rice.collab@kuali.org)
038 */
039 public class KCBNotificationService extends DefaultNotificationService {
040 @Override
041 protected void sendNotification(ActionItem actionItem) {
042 super.sendNotification(actionItem);
043
044 String enableKENNotificationValue = ConfigContext.getCurrentContextConfig().getProperty(KewApiConstants.ENABLE_KEN_NOTIFICATION);
045 boolean enableKENNotification = Boolean.parseBoolean(enableKENNotificationValue);
046 // we only send per-user messages to KCB
047 if (!enableKENNotification || actionItem.getPrincipalId() != null)
048 return;
049
050
051 // send it off to KCB if available
052 MessagingService ms = (MessagingService) GlobalResourceLoader.getService(new QName(KCBConstants.SERVICE_NAMESPACE, KCBServiceNames.KCB_MESSAGING));
053 if (ms == null) {
054 LOG.info("Could not locate KCB MessagingService. Message will not be forwarded to the KCB.");
055 return;
056 }
057 MessageDTO mvo = new MessageDTO();
058 mvo.setChannel("KEW");
059 mvo.setContent("i'm a kew notification");
060 mvo.setContentType("KEW notification");
061 mvo.setDeliveryType(actionItem.getActionRequestCd());
062 mvo.setProducer("kew@localhost");
063 mvo.setTitle(actionItem.getDocLabel() + " - " + actionItem.getDocName() + " - " + actionItem.getDocTitle());
064 if (StringUtils.isNotBlank(actionItem.getDocHandlerURL())) {
065 mvo.setUrl(actionItem.getDocHandlerURL() + "?docId=" + actionItem.getDocumentId());
066 }
067 mvo.setOriginId(String.valueOf(actionItem.getId()));
068 try {
069 // just assume it's a user at this point...
070 mvo.setRecipient(actionItem.getPrincipalId());
071 LOG.debug("Sending message to KCB: " + mvo);
072 ms.deliver(mvo);
073 } catch (Exception e) {
074 throw new WorkflowRuntimeException("could not deliver message to KCB", e);
075 }
076 }
077
078 @Override
079 public void removeNotification(List<ActionItem> actionItems) {
080 String enableKENNotificationValue = ConfigContext.getCurrentContextConfig().getProperty(KewApiConstants.ENABLE_KEN_NOTIFICATION);
081 boolean enableKENNotification = Boolean.parseBoolean(enableKENNotificationValue);
082 if (!enableKENNotification) {
083 return;
084 }
085 MessagingService ms = (MessagingService) GlobalResourceLoader.getService(new QName(KCBConstants.SERVICE_NAMESPACE, KCBServiceNames.KCB_MESSAGING));
086
087 for (ActionItem actionItem: actionItems) {
088 LOG.debug("Removing KCB messages for action item: " + actionItem.getId() + " " + actionItem.getActionRequestCd() + " " + actionItem.getPrincipalId());
089 try {
090 // we don't have the action takens at this point...? :(
091 ms.removeByOriginId(String.valueOf(actionItem.getId()), null, null);
092 } catch (Exception e) {
093 throw new RuntimeException("could not remove message from KCB", e);
094 }
095 }
096 }
097 }