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 EmailMessageDeliverer email = new EmailMessageDeliverer(); 055 SMSMessageDeliverer sms = new SMSMessageDeliverer(); 056 AOLInstantMessageDeliverer aim = new AOLInstantMessageDeliverer(); 057 MockMessageDeliverer mock = new MockMessageDeliverer(); 058 059 messageDelivererTypes = new HashMap<String, Class<? extends MessageDeliverer>>(4); 060 messageDelivererTypes.put(email.getName().toLowerCase(), email.getClass()); 061 messageDelivererTypes.put(sms.getName().toLowerCase(), sms.getClass()); 062 messageDelivererTypes.put(aim.getName().toLowerCase(), aim.getClass()); 063 messageDelivererTypes.put(mock.getName().toLowerCase(), mock.getClass()); 064 } 065 066 /** 067 * @see org.kuali.rice.kcb.service.MessageDelivererRegistryService#getAllDelivererTypes() 068 */ 069 public Collection<String> getAllDelivererTypes() { 070 Collection<MessageDeliverer> deliverers = getAllDeliverers(); 071 Set<String> types = new HashSet<String>(deliverers.size()); 072 for (MessageDeliverer deliverer: deliverers) { 073 types.add(deliverer.getName().toLowerCase()); 074 } 075 return types; 076 } 077 078 /** 079 * Implements by constructing instances of each registered class and adding to an ArrayList that 080 * gets passed back to the calling method. 081 * @see MessageDelivererRegistryService#getAllDelivererTypes() 082 */ 083 public Collection<MessageDeliverer> getAllDeliverers() { 084 ArrayList<MessageDeliverer> delivererTypes = new ArrayList<MessageDeliverer>(); 085 086 Set<Entry<String, Class<? extends MessageDeliverer>>> registeredTypes = messageDelivererTypes.entrySet(); 087 088 // iterate over each type and add an instance of each to the returning ArrayList 089 for(Entry<String, Class<? extends MessageDeliverer>> entry: registeredTypes ) { 090 try { 091 delivererTypes.add(entry.getValue().newInstance()); 092 } catch (InstantiationException e) { 093 LOG.error(e.getStackTrace()); 094 } catch (IllegalAccessException e) { 095 LOG.error(e.getStackTrace()); 096 } 097 } 098 099 return delivererTypes; 100 } 101 102 /** 103 * Implements by calling getDelivererByName for the delivery type name within the messageDelivery object. 104 * @see MessageDelivererRegistryService#getDeliverer(MessageDelivery) 105 */ 106 public MessageDeliverer getDeliverer(MessageDelivery messageDelivery) { 107 if (messageDelivery == null) { 108 throw new RiceIllegalArgumentException("messageDelivery is null"); 109 } 110 111 MessageDeliverer nmd = getDelivererByName(messageDelivery.getDelivererTypeName()); 112 if (nmd == null) { 113 LOG.error("The message deliverer type ('" + messageDelivery.getDelivererTypeName() + "') " + 114 "associated with message delivery id='" + messageDelivery.getId() + "' was not found in the message deliverer registry. This deliverer " + 115 "plugin is not in the system."); 116 } 117 return nmd; 118 } 119 120 /** 121 * 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 122 * all registered deliverers. 123 * @see MessageDelivererRegistryService#getDelivererByName(String) 124 */ 125 public MessageDeliverer getDelivererByName(String messageDelivererName) { 126 if (StringUtils.isBlank(messageDelivererName)) { 127 throw new RiceIllegalArgumentException("messageDelivererName is null or blank"); 128 } 129 130 Class<? extends MessageDeliverer> clazz = messageDelivererTypes.get(messageDelivererName.toLowerCase()); 131 132 if(clazz == null) { 133 LOG.error("The message deliverer type ('" + messageDelivererName + "') " + 134 " was not found in the message deliverer registry. This deliverer " + 135 "plugin is not in the system."); 136 return null; 137 } 138 139 MessageDeliverer messageDeliverer = null; 140 try { 141 messageDeliverer = clazz.newInstance(); 142 } catch (InstantiationException e) { 143 LOG.error(e.getStackTrace()); 144 } catch (IllegalAccessException e) { 145 LOG.error(e.getStackTrace()); 146 } 147 148 return messageDeliverer; 149 } 150}