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.MonitoredPointDAO;
import org.sigmah.server.dispatch.impl.UserDispatch.UserExecutionContext;
import org.sigmah.server.domain.User;
import org.sigmah.server.domain.reminder.MonitoredPoint;
import org.sigmah.server.domain.reminder.MonitoredPointHistory;
import org.sigmah.server.handler.base.AbstractCommandHandler;
import org.sigmah.shared.command.UpdateMonitoredPoints;
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.MonitoredPointDTO;
import com.google.inject.Inject;
import com.google.inject.persist.Transactional;
/**
* Handler for {@link UpdateMonitoredPoints} command
*
* @author Maxime Lombard (mlombard@ideia.fr)
* @author Denis Colliot (dcolliot@ideia.fr)
* @author Raphaƫl Calabro (rcalabro@ideia.fr)
*/
public class UpdateMonitoredPointsHandler extends AbstractCommandHandler<UpdateMonitoredPoints, ListResult<MonitoredPointDTO>> {
/**
* Injected DAO.
*/
@Inject
private MonitoredPointDAO monitoredPointDAO;
/**
* {@inheritDoc}
*/
@Override
public ListResult<MonitoredPointDTO> execute(final UpdateMonitoredPoints cmd, final UserExecutionContext context) throws CommandException {
final List<MonitoredPointDTO> resultList = new ArrayList<MonitoredPointDTO>();
final User user = context.getUser();
performUpdate(cmd.getList(), user, context, resultList);
return new ListResult<>(resultList);
}
/**
* Update the given reminders in a transaction.
*
* @param monitoredPoints List of reminders to update.
* @param user Current user.
* @param context Execution context.
* @param resultList List of results.
*/
@Transactional
protected void performUpdate(final List<MonitoredPointDTO> monitoredPoints, final User user, final UserExecutionContext context, final List<MonitoredPointDTO> resultList) {
for (final MonitoredPointDTO pointDTO : monitoredPoints) {
// Retrieves entity.
MonitoredPoint point = monitoredPointDAO.findById(pointDTO.getId());
boolean completionDateChanged = false;
if (point.getCompletionDate() == null && pointDTO.getCompletionDate() != null) {
completionDateChanged = true;
}
if (pointDTO.getCompletionDate() == null && point.getCompletionDate() != null) {
completionDateChanged = true;
}
final boolean expectedDateChanged = !pointDTO.getExpectedDate().equals(point.getExpectedDate());
final boolean labelChanged = !pointDTO.getLabel().equals(point.getLabel());
// Updates it.
point.setCompletionDate(pointDTO.getCompletionDate());
point.setExpectedDate(pointDTO.getExpectedDate());
point.setLabel(pointDTO.getLabel());
// History.
if (completionDateChanged) {
Date lastDateOpened = new Date(0);
Date lastDateClosed = new Date(0);
for (final MonitoredPointHistory hist : point.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 MonitoredPointHistory hist = new MonitoredPointHistory();
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() + ">");
point.addHistory(hist);
}
if (labelChanged) {
final MonitoredPointHistory hist = new MonitoredPointHistory();
hist.setDate(new Date());
hist.setType(ReminderChangeType.LABEL_MODIFIED);
hist.setUserId(user.getId());
hist.setValue(user.getName() + ", " + user.getFirstName() + " <" + user.getEmail() + ">");
point.addHistory(hist);
}
if (expectedDateChanged) {
final MonitoredPointHistory hist = new MonitoredPointHistory();
hist.setDate(new Date());
hist.setType(ReminderChangeType.DATE_MODIFIED);
hist.setUserId(user.getId());
hist.setValue(user.getName() + ", " + user.getFirstName() + " <" + user.getEmail() + ">");
point.addHistory(hist);
}
// Saves it.
point = monitoredPointDAO.persist(point, context.getUser());
resultList.add(mapper().map(point, new MonitoredPointDTO(), MonitoredPointDTO.Mode.FULL));
}
}
}