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.List; import org.apache.commons.collections4.CollectionUtils; import org.sigmah.server.dao.OrgUnitBannerDAO; import org.sigmah.server.dao.OrgUnitDetailsDAO; import org.sigmah.server.dao.PhaseModelDAO; import org.sigmah.server.dao.PrivacyGroupDAO; import org.sigmah.server.dao.ProjectBannerDAO; import org.sigmah.server.dao.ProjectDetailsDAO; import org.sigmah.server.dispatch.impl.UserDispatch.UserExecutionContext; import org.sigmah.server.domain.OrgUnitBanner; import org.sigmah.server.domain.OrgUnitDetails; import org.sigmah.server.domain.OrgUnitModel; import org.sigmah.server.domain.PhaseModel; import org.sigmah.server.domain.ProjectBanner; import org.sigmah.server.domain.ProjectDetails; import org.sigmah.server.domain.ProjectModel; import org.sigmah.server.domain.element.DefaultFlexibleElement; import org.sigmah.server.domain.element.FlexibleElement; import org.sigmah.server.domain.profile.PrivacyGroup; import org.sigmah.server.domain.profile.Profile; import org.sigmah.server.handler.base.AbstractCommandHandler; import org.sigmah.shared.command.DeletePrivacyGroups; import org.sigmah.shared.command.result.DeleteResult; import org.sigmah.shared.command.result.DeleteResult.DeleteErrorCause; import org.sigmah.shared.dispatch.CommandException; import org.sigmah.shared.dto.profile.PrivacyGroupDTO; import org.slf4j.Logger; import org.slf4j.LoggerFactory; import com.google.inject.Inject; import com.google.inject.persist.Transactional; /** * Handler for {@link DeletePrivacyGroups} command. * * @author Maxime Lombard (mlombard@ideia.fr) (v2.0) * @author Denis Colliot (dcolliot@ideia.fr) (v2.0) * @author Raphaƫl Calabro (rcalabro@ideia.fr) */ public class DeletePrivacyGroupsHandler extends AbstractCommandHandler<DeletePrivacyGroups, DeleteResult<PrivacyGroupDTO>> { /** * Logger. */ private final static Logger LOG = LoggerFactory.getLogger(DeleteFlexibleElementsHandler.class); /** * Injected {@link PrivacyGroupDAO}. */ @Inject private PrivacyGroupDAO privacyGroupDAO; /** * Injected {@link ProjectBannerDAO}. */ @Inject private ProjectBannerDAO projectBannerDAO; /** * Injected {@link ProjectDetailsDAO}. */ @Inject private ProjectDetailsDAO projectDetailsDAO; /** * Injected {@link PhaseModelDAO}. */ @Inject private PhaseModelDAO phaseModelDAO; /** * Injected {@link OrgUnitBannerDAO}. */ @Inject private OrgUnitBannerDAO orgUnitBannerDAO; /** * Injected {@link OrgUnitDetailsDAO}. */ @Inject private OrgUnitDetailsDAO orgUnitDetailsDAO; /** * {@inheritDoc} */ @Override public DeleteResult<PrivacyGroupDTO> execute(final DeletePrivacyGroups cmd, final UserExecutionContext context) throws CommandException { final List<Integer> privacyGroupIds = cmd.getPrivacyGroupIds(); // Result that may contain detected error(s). final DeleteResult<PrivacyGroupDTO> result = new DeleteResult<PrivacyGroupDTO>(); if (CollectionUtils.isEmpty(privacyGroupIds)) { // Nothing to delete. return result; } performDelete(privacyGroupIds, context, result); return result; } /** * Delete each given privacy group. * * @param privacyGroupIds List of the privacy group ids to delete. * @param context Execution context. * @param result List of result objects. */ @Transactional protected void performDelete(final List<Integer> privacyGroupIds, final UserExecutionContext context, final DeleteResult<PrivacyGroupDTO> result) { // For each privacy group. for (final Integer privacyGroupId : privacyGroupIds) { // Valid privacy group ? if (privacyGroupId == null) { continue; } final PrivacyGroup privacyGroup = privacyGroupDAO.findById(privacyGroupId); if (privacyGroup == null) { continue; } // Process delete. deletePrivacyGroup(privacyGroup, context, result); } } /** * Deletes the existing given {@code privacyGroup}. * * @param privacyGroup * The privacy group to delete (never {@code null}). * @param context * The execution context. * @param result * The result that contains detected error(s). */ private void deletePrivacyGroup(final PrivacyGroup privacyGroup, final UserExecutionContext context, final DeleteResult<PrivacyGroupDTO> result) { final Integer privacyGroupId = privacyGroup.getId(); final PrivacyGroupDTO privacyGroupDTO = mapper().map(privacyGroup, new PrivacyGroupDTO()); boolean errorDetected = false; // -- // Is there any flexible element(s) related to the privacy group(s) ? // -- if (privacyGroupDAO.countRelatedFlexibleElements(privacyGroupId) > 0) { errorDetected = true; final List<FlexibleElement> elements = privacyGroupDAO.findRelatedFlexibleElements(privacyGroupId); for (final FlexibleElement element : elements) { // Handles the flexible element error. handleFlexibleElementError(privacyGroupDTO, element, result); } } // -- // Is there any profile(s) related to the privacy group(s) ? // -- if (privacyGroupDAO.countRelatedProfiles(privacyGroupId) > 0) { errorDetected = true; final List<Profile> profiles = privacyGroupDAO.findRelatedProfiles(privacyGroupId); for (final Profile profile : profiles) { result.addError(privacyGroupDTO, new DeleteErrorCause(profile.getName())); } } if (errorDetected) { return; } // -- // No error detected ; privacy group can be deleted. // -- LOG.debug("Deleting the following privacy group: {}", privacyGroup); privacyGroupDAO.remove(privacyGroup, context.getUser()); result.addDeleted(privacyGroupDTO); } /** * <p> * Handles the detected flexible element referencing the privacy group. * </p> * <p> * Retrieves the parent component referencing the given flexible {@code element} and adds an error to the * {@code result}. * </p> * * @param privacyGroup * The referenced privacy group DTO. * @param element * The flexible element. * @param result * The result that contains detected error(s). */ private void handleFlexibleElementError(final PrivacyGroupDTO privacyGroup, final FlexibleElement element, final DeleteResult<PrivacyGroupDTO> result) { // -- // Does the flexible element belong to a Project model component ? // -- final ProjectModel projectModel; final PhaseModel phaseModel = phaseModelDAO.findFromFlexibleElement(element.getId()); if (phaseModel != null) { // Flexible element referenced by phase model. projectModel = phaseModel.getParentProjectModel(); } else { final ProjectDetails projectDetails = projectDetailsDAO.findFromFlexibleElement(element.getId()); if (projectDetails != null) { // Flexible element referenced by project details. projectModel = projectDetails.getProjectModel(); } else { final ProjectBanner projectBanner = projectBannerDAO.findFromFlexibleElement(element.getId()); if (projectBanner != null) { // Flexible element referenced by project banner. projectModel = projectBanner.getProjectModel(); } else { projectModel = null; } } } if (projectModel != null) { result.addError(privacyGroup, new DeleteErrorCause(element.getLabel(), projectModel.getName(), element instanceof DefaultFlexibleElement)); return; } // -- // Does the flexible element belong to an OrgUnit model component ? // -- final OrgUnitModel orgUnitModel; final OrgUnitDetails orgUnitDetails = orgUnitDetailsDAO.findFromFlexibleElement(element.getId()); if (orgUnitDetails != null) { // Flexible element referenced by orgUnit details. orgUnitModel = orgUnitDetails.getOrgUnitModel(); } else { final OrgUnitBanner orgUnitBanner = orgUnitBannerDAO.findFromFlexibleElement(element.getId()); if (orgUnitBanner != null) { // Flexible element referenced by orgUnit banner. orgUnitModel = orgUnitBanner.getOrgUnitModel(); } else { orgUnitModel = null; } } if (orgUnitModel != null) { result.addError(privacyGroup, new DeleteErrorCause(element.getLabel(), orgUnitModel.getName(), element instanceof DefaultFlexibleElement)); return; } // No parent model has been found (should never happen). result.addError(privacyGroup, new DeleteErrorCause(element.getLabel(), "Unknown model", element instanceof DefaultFlexibleElement)); } }