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.sigmah.server.dao.MonitoredPointDAO; import org.sigmah.server.dao.MonitoredPointListDAO; import org.sigmah.server.dao.ProjectDAO; 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.MonitoredPoint; import org.sigmah.server.domain.reminder.MonitoredPointHistory; import org.sigmah.server.domain.reminder.MonitoredPointList; 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.MonitoredPointDTO; 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 MonitoredPoint} corresponding service implementation. * * @author Denis Colliot (dcolliot@ideia.fr) */ @Singleton public class MonitoredPointService extends AbstractEntityService<MonitoredPoint, Integer, MonitoredPointDTO> { /** * Logger. */ private static final Logger LOG = LoggerFactory.getLogger(MonitoredPointService.class); @Inject private ProjectDAO projectDAO; @Inject private MonitoredPointDAO monitoredPointDAO; @Inject private MonitoredPointListDAO monitoredPointListDAO; /** * {@inheritDoc} */ @Override public MonitoredPoint create(final PropertyMap properties, final UserExecutionContext context) throws CommandException { if (LOG.isDebugEnabled()) { LOG.debug("Starts monitored point creation."); } final User user = context.getUser(); // Retrieves parameters. final Object expectedDate = properties.get(MonitoredPointDTO.EXPECTED_DATE); final Object label = properties.get(MonitoredPointDTO.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 = projectDAO.findById((Integer) projectId); // Retrieves list. MonitoredPointList list = monitoredPointListDAO.findByProjectId(project.getId()); // Creates the list if needed. if (list == null) { LOG.debug("The project #{} doesn't have a points list. Creates it.", project.getId()); list = new MonitoredPointList(); list.setPoints(new ArrayList<MonitoredPoint>()); project.setPointsList(list); } // Creates point. final MonitoredPoint point = new MonitoredPoint(); point.setLabel((String) label); point.setExpectedDate(new Date((Long) expectedDate)); point.setCompletionDate(null); point.setFile(null); point.setDeleted(false); // Adds it to the list. list.addMonitoredPoint(point); final MonitoredPointHistory hist = new MonitoredPointHistory(); hist.setDate(new Date()); hist.setType(ReminderChangeType.CREATED); hist.setUserId(user.getId()); hist.setValue(user.getName() + ", " + user.getFirstName() + " <" + user.getEmail() + ">"); point.addHistory(hist); // Saves it. monitoredPointListDAO.persist(list, user); projectDAO.persist(project, user); LOG.debug("Ends monitored point creation #{} in list #{}.", point.getId(), list.getId()); return point; } /** * {@inheritDoc} */ @Override public MonitoredPoint update(final Integer entityId, final PropertyMap changes, final UserExecutionContext context) throws CommandException { final User user = context.getUser(); final MonitoredPoint point = monitoredPointDAO.findById(entityId); if (point == null) { throw new CommandException("Cannot find MonitoredPoint with id #" + entityId + "."); } final boolean date_modified = !(new Date((Long) changes.get(MonitoredPointDTO.EXPECTED_DATE)).equals(point.getExpectedDate())); final boolean label_modified = !((String) changes.get(MonitoredPointDTO.LABEL)).equals(point.getLabel()); // Update 3 properties: ExpectedDate,Label,Deleted point.setExpectedDate(new Date((Long) changes.get(MonitoredPointDTO.EXPECTED_DATE))); point.setLabel((String) changes.get(MonitoredPointDTO.LABEL)); final Boolean deleted = (Boolean) changes.get(MonitoredPointDTO.DELETED); if (deleted != null) { point.setDeleted(deleted); } if (!point.getDeleted()) { if (date_modified) { 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); } if (label_modified) { 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); } } else { final MonitoredPointHistory hist = new MonitoredPointHistory(); hist.setDate(new Date()); hist.setType(ReminderChangeType.DELETED); hist.setUserId(user.getId()); hist.setValue(user.getName() + ", " + user.getFirstName() + " <" + user.getEmail() + ">"); point.addHistory(hist); } return monitoredPointDAO.persist(point, user); } }