package org.sigmah.server.service;
/*
* #%L
* Sigmah
* %%
* Copyright (C) 2010 - 2016 URD
* %%
* This program is free software: you can redistribute it and/or modify
* it under the terms of the GNU General Public License as
* published by the Free Software Foundation, either version 3 of the
* License, or (at your option) any later version.
*
* 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 General Public License for more details.
*
* You should have received a copy of the GNU General Public
* License along with this program. If not, see
* <http://www.gnu.org/licenses/gpl-3.0.html>.
* #L%
*/
import java.util.ArrayList;
import java.util.Date;
import org.apache.commons.lang3.BooleanUtils;
import org.sigmah.server.dao.ProjectDAO;
import org.sigmah.server.dao.ReminderDAO;
import org.sigmah.server.dao.ReminderListDAO;
import org.sigmah.server.dispatch.impl.UserDispatch.UserExecutionContext;
import org.sigmah.server.domain.Project;
import org.sigmah.server.domain.User;
import org.sigmah.server.domain.reminder.Reminder;
import org.sigmah.server.domain.reminder.ReminderHistory;
import org.sigmah.server.domain.reminder.ReminderList;
import org.sigmah.server.service.base.AbstractEntityService;
import org.sigmah.server.service.util.PropertyMap;
import org.sigmah.shared.dispatch.CommandException;
import org.sigmah.shared.dto.referential.ReminderChangeType;
import org.sigmah.shared.dto.reminder.ReminderDTO;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import com.google.inject.Inject;
import com.google.inject.Singleton;
/**
* {@link Reminder} corresponding service implementation.
*
* @author Denis Colliot (dcolliot@ideia.fr)
*/
@Singleton
public class ReminderService extends AbstractEntityService<Reminder, Integer, ReminderDTO> {
/**
* Logger.
*/
private static final Logger LOG = LoggerFactory.getLogger(ReminderService.class);
@Inject
private ProjectDAO projectDAO;
@Inject
private ReminderDAO reminderDAO;
@Inject
private ReminderListDAO reminderListDAO;
/**
* {@inheritDoc}
*/
@Override
public Reminder create(final PropertyMap properties, final UserExecutionContext context) throws CommandException {
if (LOG.isDebugEnabled()) {
LOG.debug("Starts reminder creation.");
}
final User user = context.getUser();
// Retrieves parameters.
final Object expectedDate = properties.get(ReminderDTO.EXPECTED_DATE);
final Object label = properties.get(ReminderDTO.LABEL);
final Object projectId = properties.get(ReminderDTO.PROJECT_ID);
if (!(projectId instanceof Integer)) {
throw new CommandException("Invalid project id.");
}
// Retrieves project.
LOG.debug("Retrieves the project #{}.", projectId);
final Project project = em().find(Project.class, projectId);
// Retrieves list.
ReminderList list = reminderListDAO.findByProjectId(project.getId());
// Creates the list if needed.
if (list == null) {
LOG.debug("The project #{} does not possess a reminders list. Creates it.", project.getId());
list = new ReminderList();
list.setReminders(new ArrayList<Reminder>());
project.setRemindersList(list);
}
// Creates point.
final Reminder reminder = new Reminder();
reminder.setLabel((String) label);
reminder.setExpectedDate(new Date((Long) expectedDate));
reminder.setCompletionDate(null);
reminder.setDeleted(false);
// Adds it to the list.
list.addReminder(reminder);
ReminderHistory hist = new ReminderHistory();
hist.setDate(new Date());
hist.setType(ReminderChangeType.CREATED);
hist.setUserId(user.getId());
hist.setValue(user.getName() + ", " + user.getFirstName() + " <" + user.getEmail() + ">");
reminder.addHistory(hist);
// Saves it.
reminderListDAO.persist(list, user);
projectDAO.persist(project, user);
LOG.debug("Ends reminder creation #{} in list #{}.", reminder.getId(), list.getId());
return reminder;
}
/**
* {@inheritDoc}
*/
@Override
public Reminder update(final Integer entityId, final PropertyMap changes, final UserExecutionContext context) throws CommandException {
final Reminder reminderToUpdate = reminderDAO.findById(entityId);
if (reminderToUpdate == null) {
throw new CommandException("Cannot find Reminder with id #" + entityId + ".");
}
final User user = context.getUser();
final boolean date_modified = !(new Date((Long) changes.get(ReminderDTO.EXPECTED_DATE)).equals(reminderToUpdate.getExpectedDate()));
final boolean label_modified = !((String) changes.get(ReminderDTO.LABEL)).equals(reminderToUpdate.getLabel());
// Update 3 properties: ExpectedDate,Label,Deleted
reminderToUpdate.setExpectedDate(new Date((Long) changes.get(ReminderDTO.EXPECTED_DATE)));
reminderToUpdate.setLabel((String) changes.get(ReminderDTO.LABEL));
final Boolean deleted = (Boolean) changes.get(ReminderDTO.DELETED);
if (deleted != null) {
reminderToUpdate.setDeleted(deleted);
}
if (BooleanUtils.isFalse(reminderToUpdate.getDeleted())) {
if (date_modified) {
final ReminderHistory hist = new ReminderHistory();
hist.setDate(new Date());
hist.setType(ReminderChangeType.DATE_MODIFIED);
hist.setUserId(user.getId());
hist.setValue(user.getName() + ", " + user.getFirstName() + " <" + user.getEmail() + ">");
reminderToUpdate.addHistory(hist);
}
if (label_modified) {
final ReminderHistory hist = new ReminderHistory();
hist.setDate(new Date());
hist.setType(ReminderChangeType.LABEL_MODIFIED);
hist.setUserId(user.getId());
hist.setValue(user.getName() + ", " + user.getFirstName() + " <" + user.getEmail() + ">");
reminderToUpdate.addHistory(hist);
}
} else {
final ReminderHistory hist = new ReminderHistory();
hist.setDate(new Date());
hist.setType(ReminderChangeType.DELETED);
hist.setUserId(user.getId());
hist.setValue(user.getName() + ", " + user.getFirstName() + " <" + user.getEmail() + ">");
reminderToUpdate.addHistory(hist);
}
return reminderDAO.persist(reminderToUpdate, user);
}
}