package fi.otavanopisto.muikku.plugins.communicator; import java.util.HashMap; import java.util.Map; import java.util.Objects; import java.util.concurrent.TimeUnit; import java.util.logging.Level; import java.util.logging.Logger; import javax.ejb.AccessTimeout; import javax.ejb.Asynchronous; import javax.ejb.Lock; import javax.ejb.LockType; import javax.ejb.Singleton; import javax.enterprise.event.Observes; import javax.enterprise.event.TransactionPhase; import javax.inject.Inject; import javax.transaction.Transactional; import javax.transaction.Transactional.TxType; import fi.otavanopisto.muikku.model.users.UserEntity; import fi.otavanopisto.muikku.notifier.NotifierController; import fi.otavanopisto.muikku.plugins.communicator.events.CommunicatorMessageSent; import fi.otavanopisto.muikku.plugins.communicator.model.CommunicatorMessage; import fi.otavanopisto.muikku.schooldata.entity.User; import fi.otavanopisto.muikku.users.UserController; import fi.otavanopisto.muikku.users.UserEntityController; @Singleton public class CommunicatorMessageSentNotifier { @Inject private Logger logger; @Inject private CommunicatorNewInboxMessageNotification communicatorNewInboxMessageNotification; @Inject private CommunicatorController communicatorController; @Inject private UserEntityController userEntityController; @Inject private UserController userController; @Inject private NotifierController notifierController; @Asynchronous @AccessTimeout(value = 30, unit = TimeUnit.MINUTES) @Transactional (value = TxType.REQUIRES_NEW) public void onCommunicatorMessageSent(@Observes (during = TransactionPhase.AFTER_COMPLETION) CommunicatorMessageSent event) { CommunicatorMessage communicatorMessage = communicatorController.findCommunicatorMessageById(event.getCommunicatorMessageId()); UserEntity sender = userEntityController.findUserEntityById(communicatorMessage.getSender()); UserEntity recipient = userEntityController.findUserEntityById(event.getRecipientUserEntityId()); if ((communicatorMessage != null) && (sender != null) && (recipient != null)) { if (!Objects.equals(sender.getId(), recipient.getId())) { Map<String, Object> params = new HashMap<String, Object>(); User senderUser = userController.findUserByUserEntityDefaults(sender); params.put("sender", String.format("%s %s", senderUser.getFirstName(), senderUser.getLastName())); params.put("subject", communicatorMessage.getCaption()); params.put("content", communicatorMessage.getContent()); params.put("url", String.format("%s/communicator", event.getBaseUrl())); //TODO Hash paramters cannot be utilized in redirect URLs //params.put("url", String.format("%s/communicator#inbox/%d", baseUrl, message.getCommunicatorMessageId().getId())); notifierController.sendNotification(communicatorNewInboxMessageNotification, sender, recipient, params); } } else { logger.log(Level.SEVERE, String.format("Communicator couldn't send notifications as some entity was not found")); } } }