org.squashtest.tm.service.internal.milestone.CustomMilestoneBindingServiceImpl.java Source code

Java tutorial

Introduction

Here is the source code for org.squashtest.tm.service.internal.milestone.CustomMilestoneBindingServiceImpl.java

Source

/**
 *     This file is part of the Squashtest platform.
 *     Copyright (C) 2010 - 2016 Henix, henix.fr
 *
 *     See the NOTICE file distributed with this work for additional
 *     information regarding copyright ownership.
 *
 *     This is free software: you can redistribute it and/or modify
 *     it under the terms of the GNU Lesser General Public License as published by
 *     the Free Software Foundation, either version 3 of the License, or
 *     (at your option) any later version.
 *
 *     this software 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 Lesser General Public License for more details.
 *
 *     You should have received a copy of the GNU Lesser General Public License
 *     along with this software.  If not, see <http://www.gnu.org/licenses/>.
 */
package org.squashtest.tm.service.internal.milestone;

import java.util.ArrayList;
import java.util.Collection;
import java.util.List;

import javax.inject.Inject;
import javax.validation.constraints.NotNull;

import org.apache.commons.collections.CollectionUtils;
import org.apache.commons.collections.Transformer;
import org.springframework.data.domain.Sort;
import org.springframework.data.domain.Sort.Direction;
import org.springframework.stereotype.Service;
import org.squashtest.tm.domain.Identified;
import org.squashtest.tm.domain.milestone.Milestone;
import org.squashtest.tm.domain.milestone.MilestoneRange;
import org.squashtest.tm.domain.project.GenericProject;
import org.squashtest.tm.service.advancedsearch.IndexationService;
import org.squashtest.tm.service.internal.repository.GenericProjectDao;
import org.squashtest.tm.service.internal.repository.MilestoneDao;
import org.squashtest.tm.service.internal.repository.ProjectTemplateDao;
import org.squashtest.tm.service.milestone.MilestoneBindingManagerService;
import org.squashtest.tm.service.security.PermissionEvaluationService;
import org.squashtest.tm.service.security.UserContextService;
import org.squashtest.tm.service.testcase.TestCaseLibraryNavigationService;

@Service("squashtest.tm.service.MilestoneBindingManagerService")
public class CustomMilestoneBindingServiceImpl implements MilestoneBindingManagerService {

    private static final Transformer ID_COLLECTOR = new Transformer() {

        @Override
        public Object transform(Object input) {
            return ((Identified) input).getId();
        }
    };

    @Inject
    private MilestoneDao milestoneDao;

    @Inject
    private GenericProjectDao projectDao;

    @Inject
    private ProjectTemplateDao projectTemplateDao;

    @Inject
    private UserContextService userContextService;

    @Inject
    private PermissionEvaluationService permissionEvaluationService;

    @Inject
    private TestCaseLibraryNavigationService tcService;

    @Inject
    private IndexationService indexService;

    @Override
    public List<Milestone> getAllBindableMilestoneForProject(Long projectId) {

        List<Milestone> milestoneBoundToProject = getAllBindedMilestoneForProject(projectId);
        List<Milestone> allMilestones = milestoneDao.findAll();
        allMilestones.removeAll(milestoneBoundToProject);
        GenericProject project = projectDao.findById(projectId);
        return getMilestoneYouCanSee(allMilestones, project);
    }

    private List<Milestone> getMilestoneYouCanSee(List<Milestone> allMilestones, GenericProject project) {

        List<Milestone> filtered = new ArrayList<>();
        if (permissionEvaluationService.hasRole("ROLE_ADMIN")) {
            // admin can see all
            filtered = allMilestones;
        } else {

            for (Milestone milestone : allMilestones) {
                // project manager can see global, owned and milestone within the project perimeter
                if (!isRestricted(milestone) || isCreatedBySelf(milestone) || milestone.isInPerimeter(project)) {
                    filtered.add(milestone);
                }
            }
        }
        return filtered;
    }

    @Override
    public void bindMilestonesToProject(List<Long> milestoneIds, Long projectId) {
        GenericProject project = projectDao.findById(projectId);
        List<Milestone> milestones = milestoneDao.findAllByIds(milestoneIds);
        project.bindMilestones(milestones);
        for (Milestone milestone : milestones) {
            milestone.addProjectToPerimeter(project);
        }
    }

    @Override
    public void bindProjectsToMilestone(List<Long> projectIds, Long milestoneId) {
        List<GenericProject> projects = projectDao.findAll(projectIds);
        Milestone milestone = milestoneDao.findById(milestoneId);
        milestone.bindProjects(projects);
        milestone.addProjectsToPerimeter(projects);
    }

    @Override
    public List<Milestone> getAllBindedMilestoneForProject(Long projectId) {
        GenericProject project = projectDao.findById(projectId);
        return project.getMilestones();
    }

    @Override
    public List<GenericProject> getAllBindableProjectForMilestone(Long milestoneId) {

        List<GenericProject> projectBoundToMilestone = getAllProjectForMilestone(milestoneId);
        List<GenericProject> allProjects = projectDao.findAll(new Sort(Direction.ASC, "name"));

        Milestone milestone = milestoneDao.findById(milestoneId);
        if (milestone.getRange() == MilestoneRange.RESTRICTED) {
            allProjects.removeAll(projectTemplateDao.findAll());
        }
        allProjects.removeAll(projectBoundToMilestone);

        return allProjects;
    }

    @Override
    public List<GenericProject> getAllProjectForMilestone(Long milestoneId) {
        Milestone milestone = milestoneDao.findById(milestoneId);
        List<GenericProject> bindedProject;
        if (milestone.getRange() == MilestoneRange.GLOBAL) {
            bindedProject = milestone.getProjects();
        } else {
            bindedProject = milestone.getPerimeter();
        }
        return bindedProject;
    }

    @SuppressWarnings("unchecked")
    @Override
    public void unbindMilestonesFromProject(List<Long> milestoneIds, Long projectId) {

        GenericProject project = projectDao.findById(projectId);
        List<Milestone> milestones = milestoneDao.findAllByIds(milestoneIds);
        unbindMilestonesFromProject(project, milestones);
    }

    private void unbindMilestonesFromProject(GenericProject project, List<Milestone> milestones) {

        project.unbindMilestones(milestones);

        // Remove the project in different for loop because milestoneDao.unbindAllObjectsForProject may clear the
        // session
        for (Milestone milestone : milestones) {
            milestone.removeProjectFromPerimeter(project);
        }

        // save the test case and requirement ids for reindexation later
        Collection<Long> milestoneIds = CollectionUtils.collect(milestones, ID_COLLECTOR);

        Collection<Long> tcIds = milestoneDao.findTestCaseIdsBoundToMilestones(milestoneIds);
        Collection<Long> reqIds = milestoneDao.findRequirementVersionIdsBoundToMilestones(milestoneIds);

        for (Milestone milestone : milestones) {
            // that thing will probably clear the session, be careful
            milestoneDao.unbindAllObjectsForProject(milestone.getId(), project.getId());
        }

        // reindex
        indexService.batchReindexTc(tcIds);
        indexService.batchReindexReqVersion(reqIds);
    }

    @Override
    public void unbindAllMilestonesFromProject(@NotNull GenericProject project) {
        unbindMilestonesFromProject(project, project.getMilestones());

    }

    @Override
    public void unbindProjectsFromMilestone(List<Long> projectIds, Long milestoneId) {
        Milestone milestone = milestoneDao.findById(milestoneId);
        List<GenericProject> projects = projectDao.findAll(projectIds);
        milestone.unbindProjects(projects);
        milestone.removeProjectsFromPerimeter(projects);
        milestoneDao.unbindAllObjectsForProjects(milestoneId, projectIds);
    }

    @Override
    public List<Milestone> getAllBindableMilestoneForProject(Long projectId, String type) {
        List<Milestone> milestones = getAllBindableMilestoneForProject(projectId);

        return removeNonBindableStatus(filterByType(milestones, type));
    }

    private List<Milestone> removeNonBindableStatus(List<Milestone> milestones) {

        List<Milestone> filtered = new ArrayList<>();

        for (Milestone milestone : milestones) {
            if (milestone.getStatus().isBindableToProject()) {
                filtered.add(milestone);
            }
        }
        return filtered;
    }

    private List<Milestone> filterByType(List<Milestone> milestones, String type) {

        List<Milestone> filtered;
        if ("global".equals(type)) {
            // global milestone
            filtered = getGlobalMilestones(milestones);

        } else if ("personal".equals(type)) {
            // milestone created by the user
            filtered = getMilestoneCreatedBySelf(milestones);
        } else {
            // other milestone
            filtered = getOtherMilestones(milestones);
        }
        return filtered;
    }

    private List<Milestone> getOtherMilestones(List<Milestone> milestones) {
        List<Milestone> filtered = new ArrayList<>();

        for (Milestone milestone : milestones) {
            if (isRestricted(milestone) && !isCreatedBySelf(milestone)) {
                filtered.add(milestone);
            }
        }
        return filtered;
    }

    private List<Milestone> getMilestoneCreatedBySelf(List<Milestone> milestones) {
        List<Milestone> filtered = new ArrayList<>();
        for (Milestone milestone : milestones) {
            if (isRestricted(milestone) && isCreatedBySelf(milestone)) {
                filtered.add(milestone);
            }
        }
        return filtered;
    }

    private boolean isRestricted(Milestone milestone) {
        boolean isRestricted = false;
        if (milestone.getRange() == MilestoneRange.RESTRICTED) {
            isRestricted = true;
        }
        return isRestricted;
    }

    private boolean isCreatedBySelf(Milestone milestone) {
        boolean isCreatedBySelf = false;
        String myName = userContextService.getUsername();
        if (myName.equals(milestone.getOwner().getLogin())) {
            isCreatedBySelf = true;
        }
        return isCreatedBySelf;
    }

    private List<Milestone> getGlobalMilestones(List<Milestone> milestones) {
        List<Milestone> filtered = new ArrayList<>();
        for (Milestone milestone : milestones) {
            if (milestone.getRange() == MilestoneRange.GLOBAL) {
                filtered.add(milestone);
            }
        }
        return filtered;
    }

    @Override
    public void unbindProjectsFromMilestoneKeepInPerimeter(List<Long> projectIds, Long milestoneId) {
        Milestone milestone = milestoneDao.findById(milestoneId);
        List<GenericProject> projects = projectDao.findAll(projectIds);
        milestone.unbindProjects(projects);
        milestoneDao.unbindAllObjectsForProjects(milestoneId, projectIds);
    }

    @Override
    public void unbindTemplateFrom(Long milestoneId) {
        Milestone milestone = milestoneDao.findById(milestoneId);
        milestone.removeTemplates();
    }

    @Override
    public void bindMilestonesToProjectAndBindObject(Long projectId, List<Long> milestoneIds) {
        bindMilestonesToProject(milestoneIds, projectId);
        for (Long milestoneId : milestoneIds) {
            milestoneDao.bindMilestoneToProjectTestCases(projectId, milestoneId);
            milestoneDao.bindMilestoneToProjectRequirementVersions(projectId, milestoneId);

        }

    }
}