/** * Copyright © 2002 Instituto Superior Técnico * * This file is part of FenixEdu Academic. * * FenixEdu Academic is free software: you can redistribute it and/or modify * it under the terms of the GNU Lesser General Public License as published by * the Free Software Foundation, either version 3 of the License, or * (at your option) any later version. * * FenixEdu Academic is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU Lesser General Public License for more details. * * You should have received a copy of the GNU Lesser General Public License * along with FenixEdu Academic. If not, see <http://www.gnu.org/licenses/>. */ /** * */ package org.fenixedu.academic.service.services.messaging; import java.text.MessageFormat; import java.util.HashSet; import java.util.Locale; import java.util.Set; import java.util.stream.Collectors; import org.fenixedu.academic.domain.Person; import org.fenixedu.academic.domain.messaging.ConversationMessage; import org.fenixedu.academic.domain.messaging.ConversationThread; import org.fenixedu.academic.domain.messaging.ForumSubscription; import org.fenixedu.academic.domain.person.RoleType; import org.fenixedu.academic.domain.util.email.Message; import org.fenixedu.academic.domain.util.email.Recipient; import org.fenixedu.academic.domain.util.email.SystemSender; import org.fenixedu.academic.util.Bundle; import org.fenixedu.academic.util.HtmlToTextConverterUtil; import org.fenixedu.bennu.core.domain.Bennu; import org.fenixedu.bennu.core.domain.User; import org.fenixedu.bennu.core.i18n.BundleUtil; /** * @author <a href="mailto:goncalo@ist.utl.pt"> Goncalo Luiz</a><br> * Created on May 23, 2006, 3:48:23 PM * */ public abstract class ForumService { protected static final Locale DEFAULT_LOCALE = new Locale("pt"); private static String getString(final String key) { return BundleUtil.getString(Bundle.GLOBAL, DEFAULT_LOCALE, key); } protected void sendNotifications(ConversationMessage conversationMessage) { this.notifyEmailSubscribers(conversationMessage); this.notifyLastReplier(conversationMessage); } private void notifyEmailSubscribers(ConversationMessage conversationMessage) { final Set<User> readers = conversationMessage.getConversationThread().getForum().getReadersGroup().getMembers().collect(Collectors.toSet()); final Set<Person> teachers = new HashSet<Person>(); final Set<Person> students = new HashSet<Person>(); final Set<ForumSubscription> subscriptionsToRemove = new HashSet<ForumSubscription>(); for (final ForumSubscription subscription : conversationMessage.getConversationThread().getForum() .getForumSubscriptionsSet()) { Person subscriber = subscription.getPerson(); if (!readers.contains(subscriber.getUser())) { subscriptionsToRemove.add(subscription); } if (subscription.getReceivePostsByEmail()) { if (subscriber.getEmail() == null) { subscription.setReceivePostsByEmail(false); } else { if (RoleType.TEACHER.isMember(subscriber.getUser())) { teachers.add(subscriber); } else { students.add(subscriber); } } } } for (final ForumSubscription subscriptionToRemove : subscriptionsToRemove) { conversationMessage.getConversationThread().getForum().removeForumSubscriptions(subscriptionToRemove); subscriptionToRemove.delete(); } sendEmailWithConversationMessage(teachers, students, conversationMessage); } private void notifyLastReplier(ConversationMessage conversationMessage) { ConversationMessage nextToLastConversationMessage = conversationMessage.getConversationThread().getNextToLastConversationMessage(); if (nextToLastConversationMessage != null) { Person nextToLastMessageReplier = nextToLastConversationMessage.getCreator(); if (!conversationMessage.getConversationThread().getForum() .isPersonReceivingMessagesByEmail(nextToLastMessageReplier)) { final Set<Person> teachers = new HashSet<Person>(); final Set<Person> students = new HashSet<Person>(); if (RoleType.TEACHER.isMember(nextToLastMessageReplier.getUser())) { teachers.add(nextToLastMessageReplier); } else { students.add(nextToLastMessageReplier); } sendEmailWithConversationMessage(teachers, students, conversationMessage); } } } private void sendEmailToPersons(Set<Person> persons, String personsName, String subject, String body) { if (!persons.isEmpty()) { final Recipient recipient = new Recipient(getString("label.teachers"), Person.convertToUserGroup(persons)); SystemSender systemSender = Bennu.getInstance().getSystemSender(); new Message(systemSender, systemSender.getConcreteReplyTos(), recipient.asCollection(), subject, body, ""); } } private void sendEmailWithConversationMessage(Set<Person> teachers, Set<Person> students, ConversationMessage conversationMessage) { final String emailSubject = getEmailFormattedSubject(conversationMessage.getConversationThread()); sendEmailToPersons(teachers, getString("label.teachers"), emailSubject, getEmailFormattedBody(conversationMessage, true)); sendEmailToPersons(students, getString("label.students"), emailSubject, getEmailFormattedBody(conversationMessage, false)); } private String getEmailFormattedSubject(ConversationThread conversationThread) { String emailSubject = MessageFormat.format(getString("forum.email.subject"), conversationThread.getTitle()); return emailSubject; } private String getEmailFormattedBody(ConversationMessage conversationMessage, boolean isForTeacher) { String emailBodyAsText = HtmlToTextConverterUtil.convertToText(conversationMessage.getBody().getContent()); String emailFormattedBody = MessageFormat.format(getString("forum.email.body"), conversationMessage.getCreator().getName(), conversationMessage.getConversationThread().getTitle(), conversationMessage.getConversationThread() .getForum().getName(), emailBodyAsText); return emailFormattedBody; } }