package org.sigmah.server.handler;
/*
* #%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 java.util.List;
import org.sigmah.server.dao.ReminderDAO;
import org.sigmah.server.dispatch.impl.UserDispatch.UserExecutionContext;
import org.sigmah.server.domain.User;
import org.sigmah.server.domain.reminder.Reminder;
import org.sigmah.server.domain.reminder.ReminderHistory;
import org.sigmah.server.handler.base.AbstractCommandHandler;
import org.sigmah.shared.command.UpdateReminders;
import org.sigmah.shared.command.result.ListResult;
import org.sigmah.shared.dispatch.CommandException;
import org.sigmah.shared.dto.referential.ReminderChangeType;
import org.sigmah.shared.dto.reminder.ReminderDTO;
import com.google.inject.Inject;
import com.google.inject.persist.Transactional;
/**
* Handler for {@link UpdateReminders} command
*
* @author Maxime Lombard (mlombard@ideia.fr)
* @author Denis Colliot (dcolliot@ideia.fr)
* @author Raphaƫl Calabro (rcalabro@ideia.fr)
*/
public class UpdateRemindersHandler extends AbstractCommandHandler<UpdateReminders, ListResult<ReminderDTO>> {
/**
* Injected DAO.
*/
@Inject
private ReminderDAO reminderDAO;
/**
* {@inheritDoc}
*/
@Override
public ListResult<ReminderDTO> execute(final UpdateReminders cmd, final UserExecutionContext context) throws CommandException {
final List<ReminderDTO> resultList = new ArrayList<ReminderDTO>();
final User user = context.getUser();
performUpdate(cmd.getList(), user, resultList);
return new ListResult<>(resultList);
}
/**
* Update the given reminders in a transaction.
*
* @param reminders List of reminders to update.
* @param user Current user.
* @param resultList List of results.
*/
@Transactional
protected void performUpdate(final List<ReminderDTO> reminders, final User user, final List<ReminderDTO> resultList) {
for (final ReminderDTO reminderDTO : reminders) {
// Retrieves entity.
Reminder reminder = reminderDAO.findById(reminderDTO.getId());
boolean completionDateChanged = false;
if (reminder.getCompletionDate() == null && reminderDTO.getCompletionDate() != null) {
completionDateChanged = true;
}
if (reminderDTO.getCompletionDate() == null && reminder.getCompletionDate() != null) {
completionDateChanged = true;
}
final boolean expectedDateChanged = !reminderDTO.getExpectedDate().equals(reminder.getExpectedDate());
final boolean labelChanged = !reminderDTO.getLabel().equals(reminder.getLabel());
// Updates it.
reminder.setCompletionDate(reminderDTO.getCompletionDate());
reminder.setExpectedDate(reminderDTO.getExpectedDate());
reminder.setLabel(reminderDTO.getLabel());
// History.
if (completionDateChanged) {
Date lastDateOpened = new Date(0);
Date lastDateClosed = new Date(0);
for (final ReminderHistory hist : reminder.getHistory()) {
if (hist.getType() == ReminderChangeType.CLOSED && hist.getDate().after(lastDateClosed)) {
lastDateClosed = hist.getDate();
}
if (hist.getType() == ReminderChangeType.OPENED && hist.getDate().after(lastDateOpened)) {
lastDateOpened = hist.getDate();
}
}
final ReminderHistory hist = new ReminderHistory();
hist.setDate(new Date());
if (lastDateOpened.after(lastDateClosed) || lastDateClosed.equals(lastDateOpened)) {
hist.setType(ReminderChangeType.CLOSED);
} else {
hist.setType(ReminderChangeType.OPENED);
}
hist.setUserId(user.getId());
hist.setValue(user.getName() + ", " + user.getFirstName() + " <" + user.getEmail() + ">");
reminder.addHistory(hist);
}
if (labelChanged) {
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() + ">");
reminder.addHistory(hist);
}
if (expectedDateChanged) {
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() + ">");
reminder.addHistory(hist);
}
// Saves it.
reminder = reminderDAO.persist(reminder, user);
resultList.add(mapper().map(reminder, new ReminderDTO(), ReminderDTO.Mode.WITH_HISTORY));
}
}
}