/** * This Source Code Form is subject to the terms of the Mozilla Public License, * v. 2.0. If a copy of the MPL was not distributed with this file, You can * obtain one at http://mozilla.org/MPL/2.0/. OpenMRS is also distributed under * the terms of the Healthcare Disclaimer located at http://openmrs.org/license. * * Copyright (C) OpenMRS Inc. OpenMRS is a registered trademark and the OpenMRS * graphic logo is a trademark of OpenMRS Inc. */ package org.openmrs.notification.impl; import java.io.Serializable; import java.util.Date; import java.util.List; import org.openmrs.Role; import org.openmrs.User; import org.openmrs.api.APIException; import org.openmrs.api.context.Context; import org.openmrs.api.impl.BaseOpenmrsService; import org.openmrs.notification.Alert; import org.openmrs.notification.AlertRecipient; import org.openmrs.notification.AlertService; import org.openmrs.notification.db.AlertDAO; import org.openmrs.util.RoleConstants; import org.slf4j.Logger; import org.slf4j.LoggerFactory; import org.springframework.transaction.annotation.Transactional; /** * This class should not be instantiated by itself. * * @see org.openmrs.notification.AlertService */ @Transactional public class AlertServiceImpl extends BaseOpenmrsService implements Serializable, AlertService { private static final long serialVersionUID = 564561231321112365L; private Logger log = LoggerFactory.getLogger(this.getClass()); private AlertDAO dao; /** * Default constructor */ public AlertServiceImpl() { } /** * @see org.openmrs.notification.AlertService#setAlertDAO(org.openmrs.notification.db.AlertDAO) */ @Override public void setAlertDAO(AlertDAO dao) { this.dao = dao; } /** * @see org.openmrs.notification.AlertService#saveAlert(org.openmrs.notification.Alert) */ @Override public Alert saveAlert(Alert alert) throws APIException { log.debug("Create a alert " + alert); if (alert.getCreator() == null) { alert.setCreator(Context.getAuthenticatedUser()); } if (alert.getDateCreated() == null) { alert.setDateCreated(new Date()); } if (alert.getAlertId() != null) { alert.setChangedBy(Context.getAuthenticatedUser()); alert.setDateChanged(new Date()); } // Make sure all recipients are assigned to this alert if (alert.getRecipients() != null) { for (AlertRecipient recipient : alert.getRecipients()) { if (!alert.equals(recipient.getAlert())) { recipient.setAlert(alert); } } } return dao.saveAlert(alert); } /** * @see org.openmrs.notification.AlertService#getAlert(java.lang.Integer) */ @Override @Transactional(readOnly = true) public Alert getAlert(Integer alertId) throws APIException { return dao.getAlert(alertId); } /** * @see org.openmrs.notification.AlertService#purgeAlert(org.openmrs.notification.Alert) */ @Override public void purgeAlert(Alert alert) throws APIException { dao.deleteAlert(alert); } /** * @see org.openmrs.notification.AlertService#getAllActiveAlerts(org.openmrs.User) */ @Override @Transactional(readOnly = true) public List<Alert> getAllActiveAlerts(User user) throws APIException { log.debug("Getting all active alerts for user " + user); return Context.getAlertService().getAlerts(user, true, false); } /** * @see org.openmrs.notification.AlertService#getAlertsByUser(org.openmrs.User) */ @Override @Transactional(readOnly = true) public List<Alert> getAlertsByUser(User user) throws APIException { log.debug("Getting unread alerts for user " + user); if (user == null) { if (Context.isAuthenticated()) { user = Context.getAuthenticatedUser(); } else { user = new User(); } } return Context.getAlertService().getAlerts(user, false, false); } /** * @see org.openmrs.notification.AlertService#getAlerts(org.openmrs.User, boolean, boolean) */ @Override @Transactional(readOnly = true) public List<Alert> getAlerts(User user, boolean includeRead, boolean includeExpired) throws APIException { log.debug("Getting alerts for user " + user + " read? " + includeRead + " expired? " + includeExpired); return dao.getAlerts(user, includeRead, includeExpired); } /** * @see org.openmrs.notification.AlertService#getAllAlerts() */ @Override @Transactional(readOnly = true) public List<Alert> getAllAlerts() throws APIException { log.debug("Getting alerts for all users"); return Context.getAlertService().getAllAlerts(false); } /** * @see org.openmrs.notification.AlertService#getAllAlerts(boolean) */ @Override @Transactional(readOnly = true) public List<Alert> getAllAlerts(boolean includeExpired) throws APIException { log.debug("Getting alerts for all users"); return dao.getAllAlerts(includeExpired); } /** * @see org.openmrs.notification.AlertService#notifySuperUsers(String, Exception, Object...) */ @Override public void notifySuperUsers(String messageCode, Exception cause, Object... messageArguments) { // Generate an internationalized error message with the beginning of the stack trace from cause added onto the end String message = Context.getMessageSourceService().getMessage(messageCode, messageArguments, Context.getLocale()); if (cause != null) { StringBuilder stackTrace = new StringBuilder(); // get the first two lines of the stack trace ( no more can fit in the alert text ) for (StackTraceElement traceElement : cause.getStackTrace()) { stackTrace.append(traceElement); stackTrace.append("\n"); if (stackTrace.length() >= Alert.TEXT_MAX_LENGTH) { break; } } message = message + ":" + stackTrace; //limit message to Alert.TEXT_MAX_LENGTH message = message.substring(0, Math.min(message.length(), Alert.TEXT_MAX_LENGTH)); } //Send an alert to all administrators Alert alert = new Alert(message, Context.getUserService().getUsersByRole(new Role(RoleConstants.SUPERUSER))); // Set the alert so that if any administrator 'reads' it it will be marked as read for everyone who received it alert.setSatisfiedByAny(true); //If there is not user creator for the alert ( because it is being created at start-up )create a user //TODO switch this to use the daemon user when ticket TRUNK-120 is complete if (alert.getCreator() == null) { alert.setCreator(new User(1)); } // save the alert to send it to all administrators Context.getAlertService().saveAlert(alert); } }