MessageServiceImpl.java
/*
* Copyright (C) 2000 - 2024 Silverpeas
*
* This program is free software: you can redistribute it and/or modify
* it under the terms of the GNU Affero General Public License as
* published by the Free Software Foundation, either version 3 of the
* License, or (at your option) any later version.
*
* As a special exception to the terms and conditions of version 3.0 of
* the GPL, you may redistribute this Program in connection with Free/Libre
* Open Source Software ("FLOSS") applications as described in Silverpeas's
* FLOSS exception. You should have received a copy of the text describing
* the FLOSS exception, and it is also available here:
* "https://www.silverpeas.org/legal/floss_exception.html"
*
* This program 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 Affero General Public License for more details.
*
* You should have received a copy of the GNU Affero General Public License
* along with this program. If not, see <https://www.gnu.org/licenses/>.
*/
package org.silverpeas.components.mailinglist.service.model;
import org.silverpeas.components.mailinglist.service.model.beans.Activity;
import org.silverpeas.components.mailinglist.service.model.beans.MailingList;
import org.silverpeas.components.mailinglist.service.model.beans.MailingListActivity;
import org.silverpeas.components.mailinglist.service.model.beans.Message;
import org.silverpeas.components.mailinglist.service.model.dao.MessageDao;
import org.silverpeas.components.mailinglist.service.util.OrderBy;
import org.silverpeas.core.annotation.Service;
import org.silverpeas.core.personalorganizer.model.ToDoHeader;
import org.silverpeas.core.personalorganizer.service.CalendarRuntimeException;
import org.silverpeas.core.personalorganizer.service.SilverpeasCalendar;
import org.silverpeas.core.util.logging.SilverLogger;
import javax.inject.Inject;
import javax.transaction.Transactional;
import java.util.Collection;
import java.util.Collections;
import java.util.Date;
import java.util.List;
@Service
@Transactional
public class MessageServiceImpl implements MessageService {
@Inject
private MessageDao messageDao;
private int elementsPerPage = 10;
@Inject
private SilverpeasCalendar calendar;
private static final int MSG_PER_ACTIVITY = 5;
public int getElementsPerPage() {
return elementsPerPage;
}
@Override
public void setElementsPerPage(final int elementsPerPage) {
this.elementsPerPage = elementsPerPage;
}
public MessageDao getMessageDao() {
return messageDao;
}
@Override
public String saveMessage(final Message message) {
if (message == null) {
return null;
}
String id = message.getId();
if (id == null) {
id = messageDao.saveMessage(message);
MessageIndexer.indexMessage(message);
} else {
messageDao.updateMessage(message);
}
return id;
}
@Override
public Message getMessage(final String id) {
return messageDao.findMessageById(id);
}
@Override
public List<Message> listMessages(final MailingList mailingList, final int pageNumber,
final OrderBy orderBy) {
return messageDao.listAllMessagesOfMailingList(mailingList.getComponentId(), pageNumber,
this.elementsPerPage, orderBy);
}
@Override
public List<Message> listDisplayableMessages(final MailingList mailingList, final int month,
final int year, final int pageNumber, final OrderBy orderBy) {
return messageDao
.listDisplayableMessagesOfMailingList(mailingList.getComponentId(), month, year, pageNumber,
this.elementsPerPage, orderBy);
}
@Override
public List<Message> listUnmoderatedeMessages(final MailingList mailingList, final int pageNumber,
final OrderBy orderBy) {
return messageDao.listUnmoderatedMessagesOfMailingList(mailingList.getComponentId(), pageNumber,
this.elementsPerPage, orderBy);
}
@Override
public int getNumberOfPagesForUnmoderatedMessages(final MailingList mailingList) {
final long nbElements =
messageDao.listTotalNumberOfUnmoderatedMessages(mailingList.getComponentId());
return getNumberOfPages(nbElements);
}
@Override
public int getNumberOfPagesForDisplayableMessages(final MailingList mailingList) {
final long nbElements =
messageDao.listTotalNumberOfDisplayableMessages(mailingList.getComponentId());
return getNumberOfPages(nbElements);
}
@Override
public int getNumberOfPagesForAllMessages(final MailingList mailingList) {
final long nbElements = messageDao.listTotalNumberOfMessages(mailingList.getComponentId());
return getNumberOfPages(nbElements);
}
private int getNumberOfPages(final long nbElements) {
int nbPages = (int) (nbElements / this.elementsPerPage);
if (nbElements % this.elementsPerPage != 0) {
nbPages = nbPages + 1;
}
return nbPages;
}
@Override
public MailingListActivity getActivity(final MailingList mailingList) {
if (mailingList == null) {
return null;
}
List<Message> messages = messageDao
.listActivityMessages(mailingList.getComponentId(), MSG_PER_ACTIVITY,
new OrderBy("sentDate", false));
List<Activity> activities = messageDao.listActivity(mailingList.getComponentId());
Collections.sort(activities);
return new MailingListActivity(messages, activities);
}
@Override
public void deleteMessage(String id) {
Message message = messageDao.findMessageById(id);
if (message != null) {
messageDao.deleteMessage(message);
MessageIndexer.unindexMessage(message);
try {
Collection<ToDoHeader> todos = getCalendar().getOrganizerToDos(message.getComponentId());
if (todos != null && !todos.isEmpty()) {
for (ToDoHeader todo : todos) {
if (id.equalsIgnoreCase(todo.getDescription())) {
todo.setCompletedDate(new Date());
todo.setPercentCompleted(100);
getCalendar().updateToDo(todo);
return;
}
}
}
} catch (CalendarRuntimeException ex) {
SilverLogger.getLogger(this).error(ex.getMessage(), ex);
}
}
}
@Override
public void moderateMessage(String id) {
Message message = messageDao.findMessageById(id);
if (message != null) {
message.setModerated(true);
messageDao.updateMessage(message);
MessageIndexer.indexMessage(message);
}
try {
if (message != null) {
Collection<ToDoHeader> todos = getCalendar().getOrganizerToDos(message.getComponentId());
if (todos != null && !todos.isEmpty()) {
for (ToDoHeader todo : todos) {
if (id.equalsIgnoreCase(todo.getDescription())) {
todo.setCompletedDate(new Date());
todo.setPercentCompleted(100);
getCalendar().updateToDo(todo);
return;
}
}
}
}
} catch (CalendarRuntimeException ex) {
SilverLogger.getLogger(this).error(ex.getMessage(), ex);
}
}
@Override
public List<Message> listDisplayableMessages(MailingList mailingList, int number,
OrderBy orderBy) {
return messageDao
.listDisplayableMessagesOfMailingList(mailingList.getComponentId(), -1, -1, 0, number,
orderBy);
}
public SilverpeasCalendar getCalendar() {
return calendar;
}
@Override
public long getTotalNumberOfMessages(MailingList mailingList) {
return messageDao.listTotalNumberOfMessages(mailingList.getComponentId());
}
}