/** * The contents of this file are subject to the OpenMRS Public License * Version 1.0 (the "License"); you may not use this file except in * compliance with the License. You may obtain a copy of the License at * http://license.openmrs.org * * Software distributed under the License is distributed on an "AS IS" * basis, WITHOUT WARRANTY OF ANY KIND, either express or implied. See the * License for the specific language governing rights and limitations * under the License. * * Copyright (C) OpenMRS, LLC. All Rights Reserved. */ package org.openmrs.notification.impl; import java.util.Collection; import java.util.List; import java.util.Map; import java.util.Vector; import org.apache.commons.logging.Log; import org.apache.commons.logging.LogFactory; import org.openmrs.Role; import org.openmrs.User; import org.openmrs.api.context.Context; import org.openmrs.api.db.TemplateDAO; import org.openmrs.notification.Message; import org.openmrs.notification.MessageException; import org.openmrs.notification.MessagePreparator; import org.openmrs.notification.MessageSender; import org.openmrs.notification.MessageService; import org.openmrs.notification.Template; import org.openmrs.util.OpenmrsConstants; public class MessageServiceImpl implements MessageService { private static final Log log = LogFactory.getLog(MessageServiceImpl.class); private TemplateDAO templateDAO; private MessageSender messageSender; // Delivers message private MessagePreparator messagePreparator; // Prepares message for delivery public void setTemplateDAO(TemplateDAO dao) { this.templateDAO = dao; } /** * Public constructor Required for use with spring's method injection. Be careful because this * class requires a DAO Context in order to work properly. Please set the DAO context */ public MessageServiceImpl() { } /** * Set the message preparator. * * @param messagePreparator */ public void setMessagePreparator(MessagePreparator messagePreparator) { this.messagePreparator = messagePreparator; } public MessagePreparator getMessagePreparator() { return this.messagePreparator; } /** * Set the message sender. * * @param messageSender */ public void setMessageSender(MessageSender messageSender) { this.messageSender = messageSender; } public MessageSender getMessageSender() { return this.messageSender; } /** * Send the message. All send calls go through this method. * * @param message the Message to be sent * @see org.openmrs.notification.MessageService#sendMessage(org.openmrs.notification.Message) */ public void sendMessage(Message message) throws MessageException { try { messageSender.send(message); } catch (Exception e) { log.error("Message could not be sent due to " + e.getMessage(), e); throw new MessageException(e); } } /** * Create a message object with the given parts. * * @param recipients the recipients of the message * @param sender the send of the message * @param subject the subject of the message * @param content the content or body of the message */ public Message createMessage(String recipients, String sender, String subject, String content) throws MessageException { return createMessage(recipients, sender, subject, content, null, null, null); } /** * Create a message object with the given parts. * * @param sender the send of the message * @param subject the subject of the message * @param content the content or body of the message */ public Message createMessage(String sender, String subject, String content) throws MessageException { return createMessage(null, sender, subject, content); } /** * Create a message object with the given parts. * * @param subject the subject of the message * @param content the content or body of the message */ public Message createMessage(String subject, String content) throws MessageException { return createMessage(null, null, subject, content); } /** * @see org.openmrs.notification.MessageService#createMessage(java.lang.String, * java.lang.String, java.lang.String, java.lang.String, java.lang.String, * java.lang.String, java.lang.String) */ public Message createMessage(String recipients, String sender, String subject, String content, String attachment, String attachmentContentType, String attachmentFileName) throws MessageException { Message message = new Message(); message.setRecipients(recipients); message.setSender(sender); message.setContent(content); message.setSubject(subject); message.setAttachment(attachment); message.setAttachmentContentType(attachmentContentType); message.setAttachmentFileName(attachmentFileName); return message; } /** * Send a message using the given parameters. This is a convenience method so that the client * does not need to create its own Message object. */ public void sendMessage(String recipients, String sender, String subject, String content) throws MessageException { Message message = createMessage(recipients, sender, subject, content); sendMessage(message); } /** * Send a message to a user that is identified by the given identifier. * * @param message <code>Message</code> to be sent * @param recipientId Integer identifier of user (recipient) */ public void sendMessage(Message message, Integer recipientId) throws MessageException { log.debug("Sending message to user with user id " + recipientId); User user = Context.getUserService().getUser(recipientId); message.addRecipient(user.getUserProperty(OpenmrsConstants.USER_PROPERTY_NOTIFICATION_ADDRESS)); // message.setFormat( user( OpenmrsConstants.USER_PROPERTY_NOTIFICATION_FORMAT ) ); sendMessage(message); } /** * Send message to a single user. * * @param message the <code>Message</code> to be sent * @param user the recipient of the message */ public void sendMessage(Message message, User user) throws MessageException { log.debug("Sending message to user " + user); String address = user.getUserProperty(OpenmrsConstants.USER_PROPERTY_NOTIFICATION_ADDRESS); if (address != null) message.addRecipient(address); // message.setFormat( user.getProperty( OpenmrsConstants.USER_PROPERTY_NOTIFICATION_FORMAT ) ); sendMessage(message); } /** * Send message to a collection of recipients. */ public void sendMessage(Message message, Collection<User> users) throws MessageException { log.debug("Sending message to users " + users); for (User user : users) { String address = user.getUserProperty(OpenmrsConstants.USER_PROPERTY_NOTIFICATION_ADDRESS); if (address != null) message.addRecipient(address); } sendMessage(message); } /** * Send a message to a group of users identified by their role. */ public void sendMessage(Message message, String roleName) throws MessageException { log.debug("Sending message to role with name " + roleName); Role role = Context.getUserService().getRole(roleName); sendMessage(message, role); } /** * Sends a message to a group of users identifier by thir role. */ public void sendMessage(Message message, Role role) throws MessageException { log.debug("Sending message to role " + role); log.debug("User Service : " + Context.getUserService()); List<Role> roles = new Vector<Role>(); roles.add(role); Collection<User> users = Context.getUserService().getUsers(null, roles, false); log.debug("Sending message " + message + " to " + users); sendMessage(message, users); } /** * Prepare a message given the template. The template should be populated with all necessary * data including the variable name-value pairs * * @param template the given <code>Template</code> * @return the prepared <code>Message</code> */ public Message prepareMessage(Template template) throws MessageException { return messagePreparator.prepare(template); } /** * Prepare a message based on a template and data used for variable subsitution within template. * * @param templateName name of the template to be used * @param data data mapping used for variable substitution within template * @return the prepared Message */ @SuppressWarnings("unchecked") public Message prepareMessage(String templateName, Map data) throws MessageException { try { Template template = (Template) getTemplatesByName(templateName).get(0); template.setData(data); return prepareMessage(template); } catch (Exception e) { throw new MessageException("Could not prepare message with template " + templateName, e); } } /** * Get all templates in the database. * * @return list of Templates */ @SuppressWarnings("unchecked") public List getAllTemplates() throws MessageException { return templateDAO.getTemplates(); } /** * Get template by identifier. * * @param id template identifier * @return Template */ public Template getTemplate(Integer id) throws MessageException { return templateDAO.getTemplate(id); } /** * Get templates by name. * * @param name the name of the template * @return list of Templates */ @SuppressWarnings("unchecked") public List getTemplatesByName(String name) throws MessageException { return templateDAO.getTemplatesByName(name); } /** * @see org.openmrs.notification.MessageService#create(java.lang.String, java.lang.String) * @deprecated */ public Message create(String subject, String message) throws MessageException { return Context.getMessageService().createMessage(subject, message); } /** * @see org.openmrs.notification.MessageService#create(java.lang.String, java.lang.String, * java.lang.String) * @deprecated */ public Message create(String sender, String subject, String message) throws MessageException { return Context.getMessageService().createMessage(sender, subject, message); } /** * @see org.openmrs.notification.MessageService#create(java.lang.String, java.lang.String, * java.lang.String, java.lang.String) * @deprecated */ public Message create(String recipients, String sender, String subject, String message) throws MessageException { return Context.getMessageService().createMessage(recipients, sender, subject, message); } /** * @see org.openmrs.notification.MessageService#prepare(java.lang.String, java.util.Map) * @deprecated */ @SuppressWarnings("unchecked") public Message prepare(String templateName, Map data) throws MessageException { return prepareMessage(templateName, data); } /** * @see org.openmrs.notification.MessageService#prepare(org.openmrs.notification.Template) * @deprecated */ public Message prepare(Template template) throws MessageException { return prepareMessage(template); } /** * @see org.openmrs.notification.MessageService#send(org.openmrs.notification.Message) * @deprecated use {@link #sendMessage(Message)} */ public void send(Message message) throws MessageException { sendMessage(message); } /** * @see org.openmrs.notification.MessageService#send(org.openmrs.notification.Message, * java.lang.String) * @deprecated use {@link #sendMessage(Message, String)} */ public void send(Message message, String roleName) throws MessageException { sendMessage(message, roleName); } /** * @see org.openmrs.notification.MessageService#send(org.openmrs.notification.Message, * java.lang.Integer) * @deprecated use {@link #sendMessage(Message, Integer)} */ public void send(Message message, Integer userId) throws MessageException { sendMessage(message, userId); } /** * @see org.openmrs.notification.MessageService#send(org.openmrs.notification.Message, * org.openmrs.User) * @deprecated use {@link #sendMessage(Message, User)} */ public void send(Message message, User user) throws MessageException { sendMessage(message, user); } /** * @see org.openmrs.notification.MessageService#send(org.openmrs.notification.Message, * org.openmrs.Role) * @deprecated {@link #send(Message, Role)} */ public void send(Message message, Role role) throws MessageException { sendMessage(message, role); } /** * @see org.openmrs.notification.MessageService#send(org.openmrs.notification.Message, * java.util.Collection) * @deprecated {@link #send(Message, Collection)} */ public void send(Message message, Collection<User> users) throws MessageException { sendMessage(message, users); } /** * @see org.openmrs.notification.MessageService#send(java.lang.String, java.lang.String, * java.lang.String, java.lang.String) * @deprecated use {@link #send(String, String, String, String)} */ public void send(String recipients, String sender, String subject, String message) throws MessageException { sendMessage(recipients, sender, subject, message); } }