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.kcb.service.impl; 017 018import java.util.ArrayList; 019import java.util.Collection; 020import java.util.HashMap; 021import java.util.HashSet; 022import java.util.Set; 023import java.util.Map.Entry; 024 025import org.apache.commons.lang.StringUtils; 026import org.apache.log4j.Logger; 027import org.kuali.rice.core.api.exception.RiceIllegalArgumentException; 028import org.kuali.rice.kcb.bo.MessageDelivery; 029import org.kuali.rice.kcb.deliverer.MessageDeliverer; 030import org.kuali.rice.kcb.deliverer.impl.AOLInstantMessageDeliverer; 031import org.kuali.rice.kcb.deliverer.impl.EmailMessageDeliverer; 032import org.kuali.rice.kcb.deliverer.impl.MockMessageDeliverer; 033import org.kuali.rice.kcb.deliverer.impl.SMSMessageDeliverer; 034import org.kuali.rice.kcb.service.MessageDelivererRegistryService; 035 036/** 037 * MessageDelivererRegistryService implementation - for now we use a HashMap to do this registration, in the future we'll use resource loading. 038 * @author Kuali Rice Team (rice.collab@kuali.org) 039 */ 040public class MessageDelivererRegistryServiceImpl implements MessageDelivererRegistryService { 041 private static Logger LOG = Logger.getLogger(MessageDelivererRegistryServiceImpl.class); 042 043 // holds information about the registered deliverer types 044 private HashMap<String, Class<? extends MessageDeliverer>> messageDelivererTypes; 045 046 /** 047 * Constructs an instance of the MessageDelivererRegistryServiceImpl class and sets up the 048 * registered MessageDeliverers in the system. These are the hardcoded message deliverers 049 * that we support out of the box. 050 * 051 * TODO: we'll need to implement a plugin registry discovery mechanism long term. 052 */ 053 public MessageDelivererRegistryServiceImpl() { 054 //KEWActionListMessageDeliverer kewActionList = new KEWActionListMessageDeliverer(); 055 EmailMessageDeliverer email = new EmailMessageDeliverer(); 056 SMSMessageDeliverer sms = new SMSMessageDeliverer(); 057 AOLInstantMessageDeliverer aim = new AOLInstantMessageDeliverer(); 058 MockMessageDeliverer mock = new MockMessageDeliverer(); 059 060 messageDelivererTypes = new HashMap<String, Class<? extends MessageDeliverer>>(4); 061 //messageDelivererTypes.put(kewActionList.getName(), kewActionList.getClass()); 062 messageDelivererTypes.put(email.getName().toLowerCase(), email.getClass()); 063 messageDelivererTypes.put(sms.getName().toLowerCase(), sms.getClass()); 064 messageDelivererTypes.put(aim.getName().toLowerCase(), aim.getClass()); 065 messageDelivererTypes.put(mock.getName().toLowerCase(), mock.getClass()); 066 } 067 068 /** 069 * @see org.kuali.rice.kcb.service.MessageDelivererRegistryService#getAllDelivererTypes() 070 */ 071 public Collection<String> getAllDelivererTypes() { 072 Collection<MessageDeliverer> deliverers = getAllDeliverers(); 073 Set<String> types = new HashSet<String>(deliverers.size()); 074 for (MessageDeliverer deliverer: deliverers) { 075 types.add(deliverer.getName().toLowerCase()); 076 } 077 return types; 078 } 079 080 /** 081 * Implements by constructing instances of each registered class and adding to an ArrayList that 082 * gets passed back to the calling method. 083 * @see MessageDelivererRegistryService#getAllDelivererTypes() 084 */ 085 public Collection<MessageDeliverer> getAllDeliverers() { 086 ArrayList<MessageDeliverer> delivererTypes = new ArrayList<MessageDeliverer>(); 087 088 Set<Entry<String, Class<? extends MessageDeliverer>>> registeredTypes = messageDelivererTypes.entrySet(); 089 090 // iterate over each type and add an instance of each to the returning ArrayList 091 for(Entry<String, Class<? extends MessageDeliverer>> entry: registeredTypes ) { 092 try { 093 delivererTypes.add(entry.getValue().newInstance()); 094 } catch (InstantiationException e) { 095 LOG.error(e.getStackTrace()); 096 } catch (IllegalAccessException e) { 097 LOG.error(e.getStackTrace()); 098 } 099 } 100 101 return delivererTypes; 102 } 103 104 /** 105 * Implements by calling getDelivererByName for the delivery type name within the messageDelivery object. 106 * @see MessageDelivererRegistryService#getDeliverer(MessageDelivery) 107 */ 108 public MessageDeliverer getDeliverer(MessageDelivery messageDelivery) { 109 if (messageDelivery == null) { 110 throw new RiceIllegalArgumentException("messageDelivery is null"); 111 } 112 113 MessageDeliverer nmd = getDelivererByName(messageDelivery.getDelivererTypeName()); 114 if (nmd == null) { 115 LOG.error("The message deliverer type ('" + messageDelivery.getDelivererTypeName() + "') " + 116 "associated with message delivery id='" + messageDelivery.getId() + "' was not found in the message deliverer registry. This deliverer " + 117 "plugin is not in the system."); 118 } 119 return nmd; 120 } 121 122 /** 123 * Implements by doing a key lookup in the hashmap that acts as the deliverer plugin registry. The deliverer name is the key in the hashmap for 124 * all registered deliverers. 125 * @see MessageDelivererRegistryService#getDelivererByName(String) 126 */ 127 public MessageDeliverer getDelivererByName(String messageDelivererName) { 128 if (StringUtils.isBlank(messageDelivererName)) { 129 throw new RiceIllegalArgumentException("messageDelivererName is null or blank"); 130 } 131 132 Class<? extends MessageDeliverer> clazz = messageDelivererTypes.get(messageDelivererName.toLowerCase()); 133 134 if(clazz == null) { 135 LOG.error("The message deliverer type ('" + messageDelivererName + "') " + 136 " was not found in the message deliverer registry. This deliverer " + 137 "plugin is not in the system."); 138 return null; 139 } 140 141 MessageDeliverer messageDeliverer = null; 142 try { 143 messageDeliverer = clazz.newInstance(); 144 } catch (InstantiationException e) { 145 LOG.error(e.getStackTrace()); 146 } catch (IllegalAccessException e) { 147 LOG.error(e.getStackTrace()); 148 } 149 150 return messageDeliverer; 151 } 152}