ro.cs.cm.model.dao.impl.DaoProjectImpl.java Source code

Java tutorial

Introduction

Here is the source code for ro.cs.cm.model.dao.impl.DaoProjectImpl.java

Source

/*******************************************************************************
 * This file is part of Termitaria, a project management tool 
 *  Copyright (C) 2008-2013 CodeSphere S.R.L., www.codesphere.ro
 *   
 *  Termitaria is free software; you can redistribute it and/or 
 *  modify it under the terms of the GNU Affero 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 Affero General Public License for more details.
 *  
 *  You should have received a copy of the GNU Affero General Public License 
 *  along with Termitaria. If not, see  <http://www.gnu.org/licenses/> .
 ******************************************************************************/
package ro.cs.cm.model.dao.impl;

import java.util.ArrayList;
import java.util.Collections;
import java.util.HashSet;
import java.util.List;
import java.util.Set;

import org.hibernate.criterion.DetachedCriteria;
import org.hibernate.criterion.Expression;
import org.hibernate.criterion.Order;
import org.hibernate.criterion.Projections;
import org.hibernate.criterion.Restrictions;
import org.springframework.context.MessageSource;
import org.springframework.orm.hibernate3.support.HibernateDaoSupport;
import org.springframework.security.core.context.SecurityContextHolder;

import ro.cs.cm.business.BLClient;
import ro.cs.cm.business.BLPerson;
import ro.cs.cm.common.IConstant;
import ro.cs.cm.common.IModelConstant;
import ro.cs.cm.common.PermissionConstant;
import ro.cs.cm.common.Tools;
import ro.cs.cm.entity.Client;
import ro.cs.cm.entity.Project;
import ro.cs.cm.entity.ProjectTeam;
import ro.cs.cm.entity.SearchProjectBean;
import ro.cs.cm.entity.TeamMember;
import ro.cs.cm.exception.BusinessException;
import ro.cs.cm.model.dao.DaoBeanFactory;
import ro.cs.cm.model.dao.IDaoProject;
import ro.cs.cm.model.dao.IDaoProjectTeam;
import ro.cs.cm.model.dao.IDaoTeamMember;
import ro.cs.cm.om.Person;
import ro.cs.cm.utils.ProjectComparator;
import ro.cs.cm.web.security.UserAuth;

/**
 * Dao class for Project Entity
 * 
 * @author Coni
 * @author Adelina
 */
public class DaoProjectImpl extends HibernateDaoSupport implements IDaoProject {

    private static IDaoProjectTeam projectTeamDao = DaoBeanFactory.getInstance().getDaoProjectTeam();
    private static IDaoTeamMember teamMemberDao = DaoBeanFactory.getInstance().getDaoTeamMember();

    private static final String CLIENT_FROM_ORG = "project.from.organization";

    /**
     * Searches for Projects after criterion from searchProjectBean.
     * 
     * @author Adelina
     * 
     * @param searchProjectBean
     * @param statusIds
     * @param isDeleteAction
     * @return
     */
    public List<Project> getFromSearch(SearchProjectBean searchProjectBean, Set<Byte> statusIds,
            Set<Integer> clientIds, boolean isDeleteAction, MessageSource messageSource) {
        logger.debug("getFromSearch - START - ");

        UserAuth userAuth = (UserAuth) SecurityContextHolder.getContext().getAuthentication().getPrincipal();

        // set search criterion
        DetachedCriteria dc = DetachedCriteria.forEntityName(IModelConstant.projectAllEntity);
        DetachedCriteria dcCount = DetachedCriteria.forEntityName(IModelConstant.projectAllEntity);

        if (searchProjectBean.getOrganizationId() != -1) {
            dc.add(Restrictions.eq("organizationId", searchProjectBean.getOrganizationId()));
            dcCount.add(Restrictions.eq("organizationId", searchProjectBean.getOrganizationId()));
        }

        if (!userAuth.hasAuthority(PermissionConstant.getInstance().getCM_ProjectAdvancedSearch())) {
            // search only for projects that the user belongs to (such as manager or member)         

            List<TeamMember> members = new ArrayList<TeamMember>();

            List<ProjectTeam> projectTeams = new ArrayList<ProjectTeam>();

            List<Integer> projectIds = new ArrayList<Integer>();

            DetachedCriteria dc1 = DetachedCriteria.forEntityName(IModelConstant.teamMemberEntity);
            dc1.add(Restrictions.eq("personId", userAuth.getPersonId()));
            dc1.add(Restrictions.ne("status", IConstant.NOM_TEAM_MEMBER_STATUS_DELETED));
            members = getHibernateTemplate().findByCriteria(dc1);
            logger.debug("members = " + members);

            if (members != null && members.size() > 0) {
                for (TeamMember user : members) {
                    logger.debug("user = " + user);
                    DetachedCriteria dcProjTeam = DetachedCriteria.forEntityName(IModelConstant.projectTeamEntity);
                    dcProjTeam.add(Restrictions.eq("projectTeamId", user.getProjectTeamId()));
                    dcProjTeam.add(Restrictions.ne("status", IConstant.NOM_PROJECT_TEAM_STATUS_DELETED));
                    projectTeams = getHibernateTemplate().findByCriteria(dcProjTeam);
                    logger.debug("project teams = " + projectTeams);
                    if (projectTeams != null && projectTeams.size() > 0) {
                        for (ProjectTeam projectTeam : projectTeams) {
                            logger.debug("project team = " + projectTeam);
                            projectIds.add(projectTeam.getProjectId());
                        }
                    }
                }
            }

            if (projectTeams == null || projectTeams.size() == 0) {
                projectIds.add(new Integer(-1));
            }

            logger.debug("projectIds = " + projectIds);
            if (projectIds != null && projectIds.size() > 0) {
                dc.add(Expression.or(Expression.eq("managerId", userAuth.getPersonId()),
                        Restrictions.in("projectId", projectIds)));
                dcCount.add(Expression.or(Expression.eq("managerId", userAuth.getPersonId()),
                        Restrictions.in("projectId", projectIds)));
            }
        }

        logger.debug("managerId = " + searchProjectBean.getManagerId());

        // manager      
        if (searchProjectBean.getManagerId() != null && searchProjectBean.getManagerId() != -1) {
            dc.add(Restrictions.eq("managerId", searchProjectBean.getManagerId()));
            dcCount.add(Restrictions.eq("managerId", searchProjectBean.getManagerId()));
            logger.debug("ManagerId Id: " + searchProjectBean.getManagerId());
        }

        // name
        if (Tools.getInstance().stringNotEmpty(searchProjectBean.getName())) {
            dc.add(Restrictions.ilike("name", "%".concat(searchProjectBean.getName().concat("%"))));
            dcCount.add(Restrictions.ilike("name", "%".concat(searchProjectBean.getName().concat("%"))));
            logger.debug("name = " + searchProjectBean.getName());
        }

        logger.debug("clientId = " + searchProjectBean.getClientId());
        logger.debug("clientsIds = " + clientIds);

        // client
        if (searchProjectBean.getClientId() != null && searchProjectBean.getClientId() != 0) {
            dc.add(Restrictions.like("clientId", searchProjectBean.getClientId()));
            dcCount.add(Restrictions.like("clientId", searchProjectBean.getClientId()));
        } else {
            dc.add(Restrictions.in("clientId", clientIds));
            dcCount.add(Restrictions.in("clientId", clientIds));
        }

        //If the user didn't select at least one status then we'll make a search on all of these criterions
        // Status
        if (searchProjectBean.getStatus() != -1) {
            dc.add(Restrictions.eq("status", searchProjectBean.getStatus()));
            dcCount.add(Restrictions.eq("status", searchProjectBean.getStatus()));
        } else {
            dc.add(Restrictions.in("status", statusIds));
            dcCount.add(Restrictions.in("status", statusIds));
        }

        List<Project> res = null;

        //the order can be done while retrieving the data from the database only if the sort parameter is the project name or status;
        //this cannot be done if the results must be ordered by the client name
        if (searchProjectBean.getSortParam() != null && !"".equals(searchProjectBean.getSortParam())
                && !"clientName".equals(searchProjectBean.getSortParam())) {
            // check if I have to order the results
            // if I have to, check if I have to order them ascending or descending
            if (searchProjectBean.getSortDirection() == -1) {
                // ascending
                dc.addOrder(Order.asc(searchProjectBean.getSortParam()));
            } else {
                // descending
                dc.addOrder(Order.desc(searchProjectBean.getSortParam()));
            }

            // if the request didn't come from the pagination area, 
            // it means that I have to set the number of results and pages
            if (isDeleteAction || searchProjectBean.getNbrOfResults() == -1) {
                boolean isSearch = false;
                if (searchProjectBean.getNbrOfResults() == -1) {
                    isSearch = true;
                }
                // set the count(*) restriction         
                dcCount.setProjection(Projections.countDistinct("projectId"));

                //findByCriteria must be called with firstResult and maxResults parameters; the default findByCriteria(DetachedCriteria criteria) implementation
                //sets firstResult and maxResults to -1, which kills the countDistinct Projection         
                int nbrOfResults = ((Integer) getHibernateTemplate().findByCriteria(dcCount, 0, 0).get(0))
                        .intValue();
                logger.debug("search results: ".concat(String.valueOf(nbrOfResults)));
                searchProjectBean.setNbrOfResults(nbrOfResults);

                // get the number of pages
                if (nbrOfResults % searchProjectBean.getResultsPerPage() == 0) {
                    searchProjectBean.setNbrOfPages(nbrOfResults / searchProjectBean.getResultsPerPage());
                } else {
                    searchProjectBean.setNbrOfPages(nbrOfResults / searchProjectBean.getResultsPerPage() + 1);
                }
                // after a project is deleted, the same page has to be displayed;
                //only when all the client from last page are deleted, the previous page will be shown 
                if (isDeleteAction && (searchProjectBean.getCurrentPage() > searchProjectBean.getNbrOfPages())) {
                    searchProjectBean.setCurrentPage(searchProjectBean.getNbrOfPages());
                } else if (isSearch) {
                    searchProjectBean.setCurrentPage(1);
                }
            }

            res = (List<Project>) getHibernateTemplate().findByCriteria(dc,
                    (searchProjectBean.getCurrentPage() - 1) * searchProjectBean.getResultsPerPage(),
                    searchProjectBean.getResultsPerPage());
        } else {
            res = (List<Project>) getHibernateTemplate().findByCriteria(dc);
            // if the request didn't come from the pagination area, 
            // it means that I have to set the number of results and pages
            if (isDeleteAction || searchProjectBean.getNbrOfResults() == -1) {
                boolean isSearch = false;
                if (searchProjectBean.getNbrOfResults() == -1) {
                    isSearch = true;
                }
                int nbrOfResults = res.size();
                logger.debug("search results: ".concat(String.valueOf(nbrOfResults)));
                searchProjectBean.setNbrOfResults(nbrOfResults);

                // get the number of pages
                if (nbrOfResults % searchProjectBean.getResultsPerPage() == 0) {
                    searchProjectBean.setNbrOfPages(nbrOfResults / searchProjectBean.getResultsPerPage());
                } else {
                    searchProjectBean.setNbrOfPages(nbrOfResults / searchProjectBean.getResultsPerPage() + 1);
                }
                // after an exchange is deleted, the same page has to be displayed;
                //only when all the exchanges from last page are deleted, the previous page will be shown 
                if (isDeleteAction && (searchProjectBean.getCurrentPage() > searchProjectBean.getNbrOfPages())) {
                    searchProjectBean.setCurrentPage(searchProjectBean.getNbrOfPages());
                } else if (isSearch) {
                    searchProjectBean.setCurrentPage(1);
                }
            }
        }

        List<Project> newRes = new ArrayList<Project>();

        if (res != null && res.size() > 0) {
            // for every project
            for (Project project : res) {
                Project projectNew = getWithAll(project.getProjectId());
                if (projectNew.getClientId() != null && projectNew.getClientId() > 0) {
                    Client client = projectNew.getClient();
                    if (client != null) {
                        if (client.getType() == IConstant.NOM_CLIENT_TYPE_FIRM) {
                            projectNew.setClientName(client.getC_name());
                        } else {
                            projectNew.setClientName(
                                    client.getP_firstName().concat(" ").concat(client.getP_lastName()));
                        }
                    }
                } else {
                    projectNew.setClientName(messageSource.getMessage(CLIENT_FROM_ORG, null, null));
                }

                newRes.add(projectNew);
            }
        }

        List<Project> projects = new ArrayList<Project>();
        //sorting the exchanges list
        if (searchProjectBean.getSortParam() != null && searchProjectBean.getSortParam().equals("clientName")) {
            Collections.sort(newRes, ProjectComparator.getInstance().projectClientNameComparator());

            //ascending or descending
            if (searchProjectBean.getSortDirection() == IConstant.DESCENDING) {
                Collections.reverse(newRes);
            }

            long start = (searchProjectBean.getCurrentPage() - 1) * searchProjectBean.getResultsPerPage();
            long end = searchProjectBean.getCurrentPage() * searchProjectBean.getResultsPerPage();

            // go over the entries      
            if (newRes.size() > 0) {
                for (int i = (int) start; i < end; i++) {
                    if (i >= newRes.size()) {
                        continue;
                    }
                    projects.add(newRes.get(i));
                }
            }
        } else {
            projects = newRes;
        }

        logger.debug("getFromSearch - END - results size : ".concat(String.valueOf(projects.size())));

        return projects;
    }

    /**
     * Get the projects identified by the clientId
     * 
     * @author Adelina
     * 
     * @param clientId
     * @return
     */
    public List<Project> getProjectsByClientId(Integer clientId) {
        logger.debug("getProjectsByClientId - START , clientId : ".concat(clientId.toString()));
        List<Project> projects = null;
        DetachedCriteria dc = DetachedCriteria.forEntityName(IModelConstant.projectWithClientEntity);
        dc.add(Restrictions.eq("client.clientId", clientId));
        dc.add(Restrictions.ne("status", IConstant.NOM_PROJECT_STATUS_DELETED));
        projects = getHibernateTemplate().findByCriteria(dc);
        for (Project project : projects) {
            Person manager = new Person();
            try {
                manager = BLPerson.getInstance().get(project.getManagerId());
            } catch (BusinessException be) {
                logger.error("", be);
            } catch (Exception e) {
                logger.error("", e);
            }
            // set the manager
            project.setManager(manager);
        }
        Tools.getInstance().printList(logger, projects);
        logger.debug("getProjectsByClientId - END");
        return projects;
    }

    @Override
    public Project addAll(Project project) {
        logger.debug("addAll - START");

        // set the manager for the project
        Integer managerId = project.getManagerId();
        logger.debug("managerId = " + managerId);
        Person manager = new Person();
        try {
            manager = BLPerson.getInstance().get(managerId);
        } catch (BusinessException be) {
            logger.error("", be);
        } catch (Exception e) {
            logger.error("", e);
        }
        logger.debug("manager = " + manager);

        // set the manager
        project.setManager(manager);

        getHibernateTemplate().save(IModelConstant.projectAllEntity, project);
        return project;
    }

    /**
     * Get a project with manager
     * 
     * @author Adelina
     * 
     * @param projectId
     * @return
     */
    public Project getWithManger(Integer projectId) {
        logger.debug("getWithManger - START");

        Project project = (Project) getHibernateTemplate().get(IModelConstant.projectWithManagerEntity,
                new Integer(projectId));

        Integer managerId = project.getManagerId();
        logger.debug("managerId = " + managerId);

        logger.debug("getWithManger - END - project with id =".concat(Integer.toString(projectId)));

        return project;
    }

    /**
     * Get a project identified by id if it is not deleted
     * 
     * @author Adelina
     * 
     * @param projectId
     * @return
     */
    public Project getWithStatus(Integer projectId) {
        logger.debug("getWithStatus - START");

        List<Project> projects = new ArrayList<Project>();
        Project project = null;

        DetachedCriteria dc = DetachedCriteria.forEntityName(IModelConstant.projectForUpdateStatusEntity);
        dc.add(Restrictions.eq("projectId", projectId));
        dc.add(Restrictions.ne("status", IConstant.NOM_PROJECT_STATUS_DELETED));

        projects = getHibernateTemplate().findByCriteria(dc);
        if (projects != null && projects.size() > 0) {
            project = projects.get(0);
        }

        logger.debug("getWithStatus - END");
        return project;
    }

    @Override
    public Project getWithAll(Integer projectId) {
        logger.debug("getWithAll - START");
        Project project = (Project) getHibernateTemplate().get(IModelConstant.projectForDeleteEntity,
                new Integer(projectId));

        Integer managerId = project.getManagerId();

        logger.debug("managerId = " + managerId);
        Person manager = new Person();
        try {
            manager = BLPerson.getInstance().get(managerId);
        } catch (BusinessException be) {
            logger.error("", be);
        } catch (Exception e) {
            logger.error("", e);
        }

        if (manager != null && manager.getStatus() != IConstant.NOM_PERSON_STATUS_DELETED) {
            // set the manager
            project.setManager(manager);
        }

        ProjectTeam projectTeam = project.getProjectTeam();
        if (projectTeam != null) {
            Set<TeamMember> teamMembers = projectTeam.getTeamMembers();
            logger.debug("teamMembers = " + teamMembers);
            for (TeamMember member : teamMembers) {
                if (member.getStatus() == IConstant.NOM_TEAM_MEMBER_STATUS_DISABLED && member.getPersonId() > 0) {
                    boolean changeStatusToActivate = false;
                    try {
                        Person person = BLPerson.getInstance().get(member.getPersonId());
                        logger.debug("person = " + person);
                        Byte activated = new Byte(IConstant.NOM_PERSON_STATUS_ACTIVATED);
                        if (person != null && activated.equals(person.getStatus())) {
                            changeStatusToActivate = true;
                        }
                    } catch (BusinessException e) {
                        e.printStackTrace();
                    }
                    logger.debug("changeStatusToActivate = " + changeStatusToActivate);
                    if (changeStatusToActivate) {
                        teamMemberDao.changeStatusToOpen(member);
                    }
                }
            }
        }

        Integer clientId = project.getClientId();
        if (clientId != null && clientId > 0) {
            Client client = new Client();
            try {
                client = BLClient.getInstance().get(clientId);
            } catch (BusinessException be) {
                logger.error("", be);
            } catch (Exception e) {
                logger.error("", e);
            }
            project.setClient(client);
        }

        logger.debug("getWithAll - END - project with id =".concat(Integer.toString(projectId)));

        return project;
    }

    @Override
    public Project updateAll(Project project) {
        logger.debug("updateAll - START - of project with id ".concat(String.valueOf(project.getProjectId())));

        // set the manager for the project
        Integer managerId = project.getManagerId();
        logger.debug("managerId = " + managerId);
        Person manager = new Person();
        try {
            manager = BLPerson.getInstance().get(managerId);
        } catch (BusinessException be) {
            logger.error("", be);
        } catch (Exception e) {
            logger.error("", e);
        }

        // set the manager
        project.setManager(manager);

        // update the project entity
        getHibernateTemplate().update(IModelConstant.projectAllEntity, project);

        logger.debug("updateAll - END - of project: ".concat(String.valueOf(project.getProjectId())));
        return project;

    }

    /**
     * Get the clients for certain projects
     * 
     * @author Adelina
     * 
     * @param organizationId
     * @return
     */
    public List<Client> getClientsForProjects(Integer organizationId) {
        logger.debug("getClients - START - ");

        // set search criterion
        DetachedCriteria dc = DetachedCriteria.forEntityName(IModelConstant.projectAllEntity);

        List<Client> clients = new ArrayList<Client>();

        List<Project> projects = new ArrayList<Project>();
        dc.add(Restrictions.eq("organizationId", organizationId));
        dc.add(Restrictions.ne("status", IConstant.NOM_PROJECT_STATUS_DELETED));

        projects = getHibernateTemplate().findByCriteria(dc);

        Set<Integer> clientIds = new HashSet<Integer>();
        if (projects != null && projects.size() > 0) {
            for (Project project : projects) {
                clientIds.add(project.getClientId());
            }
            logger.debug("clientIds = " + clientIds);
            DetachedCriteria dcClient = DetachedCriteria.forEntityName(IModelConstant.clientEntity);
            dcClient.add(Restrictions.in("clientId", clientIds));
            dcClient.add(Restrictions.ne("status", IConstant.NOM_CLIENT_STATUS_DELETED));
            clients = getHibernateTemplate().findByCriteria(dcClient);
            logger.debug("clients = " + clients);
        }

        logger.debug("getClients - END - ");
        return clients;
    }

    /**
     * Finish the project
     * 
     * @author Adelina
     * 
     * @param project
     * @return
     */
    public Project finishProject(Integer projectId) {
        logger.debug("finishProject - START ".concat(String.valueOf(projectId)));
        Project project = getWithManger(projectId);
        project.setStatus(IConstant.NOM_PROJECT_STATUS_CLOSED);
        getHibernateTemplate().update(IModelConstant.projectForUpdateStatusEntity, project);
        logger.debug("finishProject - END");
        return project;
    }

    /**
     * Activate the project
     * 
     * @author Adelina
     * 
     * @param project
     * @return
     */
    public Project activateProject(Integer projectId) {
        logger.debug("activateProject - START ".concat(String.valueOf(projectId)));
        Project project = getWithManger(projectId);
        project.setStatus(IConstant.NOM_PROJECT_STATUS_OPENED);
        getHibernateTemplate().update(IModelConstant.projectForUpdateStatusEntity, project);
        logger.debug("activateProject - END");
        return project;
    }

    /**
     * Abort the project
     * 
     * @author Adelina
     * 
     * @param project
     * @return
     */
    public Project abortProject(Integer projectId) {
        logger.debug("abortProject - START ".concat(String.valueOf(projectId)));
        Project project = getWithManger(projectId);
        project.setStatus(IConstant.NOM_PROJECT_STATUS_ABORTED);
        getHibernateTemplate().update(IModelConstant.projectForUpdateStatusEntity, project);
        logger.debug("abortProject - END");
        return project;
    }

    /**
     * Update the status of the Project
     * 
     * @author Adelina
     * 
     * @param projectId
     * @return
     */
    public Project updateStatus(Integer projectId) {
        logger.debug("updateStatus - START id : ".concat(String.valueOf(projectId)));

        Project project = getWithManger(projectId);
        if (project.getStatus() == IConstant.NOM_PROJECT_STATUS_OPENED) {
            project.setStatus(IConstant.NOM_PROJECT_STATUS_CLOSED);
        } else {
            project.setStatus(IConstant.NOM_PROJECT_STATUS_OPENED);
        }

        getHibernateTemplate().update(IModelConstant.projectEntity, project);

        logger.debug("updateStatus - END");
        return project;
    }

    /**
     * Get a project for delete
     * 
     * @author Adelina
     * 
     * @param projectId
     * @return
     */
    public Project getForDelete(Integer projectId) {
        logger.debug("getForDelete - START");

        Project project = (Project) getHibernateTemplate().get(IModelConstant.projectForDeleteEntity,
                new Integer(projectId));

        logger.debug("getForDelete - END - project with id =".concat(Integer.toString(projectId)));

        return project;
    }

    /**
     * Delete a project with all data necessary
     * 
     * @author Adelina
     * 
     * @param projectId
     * @return
     */
    public Project deleteAll(Integer projectId) {
        logger.debug("deleteAll - START");
        logger.debug("Deleting project with id: ".concat(projectId.toString()));
        Project project = getForDelete(projectId);
        project.setStatus(IConstant.NOM_PROJECT_STATUS_DELETED);
        ProjectTeam projectTeam = project.getProjectTeam();
        if (projectTeam != null) {
            logger.debug("projectTeam = " + projectTeam);
            projectTeam.setStatus(IConstant.NOM_PROJECT_TEAM_STATUS_DELETED);
            logger.debug("projectTeam status = " + projectTeam.getStatus());
            Set<TeamMember> members = projectTeam.getTeamMembers();
            for (TeamMember member : members) {
                member.setStatus(IConstant.NOM_TEAM_MEMBER_STATUS_DELETED);
            }
        }
        logger.debug("Deleting the project : " + project);
        getHibernateTemplate().update(IModelConstant.projectForDeleteEntity, project);
        logger.debug("Project " + project + " has been deleted");
        logger.debug("deleteAll  - END");
        return project;
    }

    public Project getForView(Integer projectId) {
        logger.debug("getForView - START");

        DetachedCriteria dc = DetachedCriteria.forEntityName(IModelConstant.projectForDeleteEntity);

        List<Project> projects = new ArrayList<Project>();

        dc.add(Restrictions.eq("projectId", projectId));
        dc.add(Restrictions.ne("status", IConstant.NOM_PROJECT_STATUS_DELETED));
        projects = getHibernateTemplate().findByCriteria(dc);

        Project project = projects.get(0);

        ProjectTeam projectTeam = projectTeamDao.get(projectId, true);
        project.setProjectTeam(projectTeam);

        Integer managerId = project.getManagerId();

        logger.debug("managerId = " + managerId);
        Person manager = new Person();
        try {
            manager = BLPerson.getInstance().get(managerId);
        } catch (BusinessException be) {
            logger.error("", be);
        } catch (Exception e) {
            logger.error("", e);
        }
        // set the manager
        project.setManager(manager);

        Integer clientId = project.getClientId();
        if (clientId != null && clientId > 0) {
            Client client = new Client();
            try {
                client = BLClient.getInstance().get(clientId);
            } catch (BusinessException be) {
                logger.error("", be);
            } catch (Exception e) {
                logger.error("", e);
            }
            // set the client
            project.setClient(client);
        }

        logger.debug("getForView - END - project with id =".concat(Integer.toString(projectId)));

        return project;
    }

    /**
     * Get the projects for the client
     * 
     * @author Adelina
     * 
     * @param clientId
     * @return
     */
    public List<Project> getClientsProjects(Integer clientId) {
        logger.debug("getClientsProjects - START , clientId : ".concat(clientId.toString()));
        List<Project> projects = null;
        DetachedCriteria dc = DetachedCriteria.forEntityName(IModelConstant.projectForDeleteEntity);
        dc.add(Restrictions.eq("clientId", clientId));
        dc.add(Restrictions.ne("status", IConstant.NOM_PROJECT_STATUS_DELETED));
        projects = getHibernateTemplate().findByCriteria(dc);
        Tools.getInstance().printList(logger, projects);
        logger.debug("getClientsProjects - END");
        return projects;
    }

    /**
     * Get all the projects by organizationId
     * 
     * @author Adelina
     * 
     * @param organizationId
     * @param isFinishedAndAbandoned
     * @return
     */
    public List<Project> getAllProjects(Integer organizationId, boolean isFinishedAndAbandoned) {
        logger.debug("getProjects - START");
        List<Project> projects = new ArrayList<Project>();
        DetachedCriteria dc = DetachedCriteria.forEntityName(IModelConstant.projectAllEntity);
        dc.add(Restrictions.eq("organizationId", organizationId));
        if (isFinishedAndAbandoned) {
            dc.add(Restrictions.ne("status", IConstant.NOM_PROJECT_STATUS_DELETED));
        } else {
            dc.add(Restrictions.eq("status", IConstant.NOM_PROJECT_STATUS_OPENED));
        }
        List<Project> res = getHibernateTemplate().findByCriteria(dc);
        if (res != null && res.size() > 0) {
            // for every project
            for (Project project : res) {
                Project projectNew = getWithAll(project.getProjectId());
                projects.add(projectNew);
            }
        }
        logger.debug("getProjects - END");
        return projects;
    }

    /**
     * Get projects by person
     * 
     * @author Adelina
     * 
     * @param personId
     * @return
     */
    public List<Project> getProjectsByPerson(Integer personId, boolean isFinishedAndAbandoned) {
        logger.debug("getProjectsByPerson - START");

        logger.debug("personId = " + personId);

        List<Project> projects = new ArrayList<Project>();

        List<TeamMember> members = new ArrayList<TeamMember>();

        List<ProjectTeam> projectTeams = new ArrayList<ProjectTeam>();

        List<Integer> projectIds = new ArrayList<Integer>();
        DetachedCriteria dc = DetachedCriteria.forEntityName(IModelConstant.teamMemberEntity);
        dc.add(Restrictions.eq("personId", personId));
        dc.add(Restrictions.ne("status", IConstant.NOM_TEAM_MEMBER_STATUS_DELETED));
        members = getHibernateTemplate().findByCriteria(dc);
        logger.debug("members = " + members);

        if (members != null && members.size() > 0) {
            for (TeamMember user : members) {
                logger.debug("user = " + user);
                DetachedCriteria dcProjTeam = DetachedCriteria.forEntityName(IModelConstant.projectTeamEntity);
                dcProjTeam.add(Restrictions.eq("projectTeamId", user.getProjectTeamId()));
                dcProjTeam.add(Restrictions.ne("status", IConstant.NOM_PROJECT_TEAM_STATUS_DELETED));
                projectTeams = getHibernateTemplate().findByCriteria(dcProjTeam);
                logger.debug("project teams = " + projectTeams);
                if (projectTeams != null && projectTeams.size() > 0) {
                    for (ProjectTeam projectTeam : projectTeams) {
                        logger.debug("project team = " + projectTeam);
                        projectIds.add(projectTeam.getProjectId());
                    }
                }
            }
            if (projectTeams == null || projectTeams.size() == 0) {
                projectIds.add(new Integer(-1));
            }

        } else {
            projectIds.add(new Integer(-1));
        }

        logger.debug("projectIds = " + projectIds);
        DetachedCriteria dc1 = DetachedCriteria.forEntityName(IModelConstant.projectAllEntity);
        dc1.add(Expression.or(Expression.eq("managerId", personId), Restrictions.in("projectId", projectIds)));

        if (isFinishedAndAbandoned) {
            dc1.add(Restrictions.ne("status", IConstant.NOM_PROJECT_STATUS_DELETED));
        } else {
            dc1.add(Restrictions.eq("status", IConstant.NOM_PROJECT_STATUS_OPENED));
        }

        List<Project> res = getHibernateTemplate().findByCriteria(dc1);
        if (res != null && res.size() > 0) {
            // for every project
            for (Project project : res) {
                logger.debug("project = " + project);
                Project projectNew = getWithAll(project.getProjectId());
                projects.add(projectNew);
            }
        }

        logger.debug("getProjectsByPerson - END");
        return projects;

    }

    /**
     * Get the project for a certain manager
     * 
     * @author Adelina
     * 
     * @param managerId
     * @return
     */
    public List<Project> getProjectsByManager(Integer managerId, boolean isFinishedAndAbandoned) {
        logger.debug("getProjectsByManager - START");
        List<Project> projects = new ArrayList<Project>();
        DetachedCriteria dc = DetachedCriteria.forEntityName(IModelConstant.projectAllEntity);
        dc.add(Restrictions.eq("managerId", managerId));
        if (isFinishedAndAbandoned) {
            dc.add(Restrictions.ne("status", IConstant.NOM_PROJECT_STATUS_DELETED));
        } else {
            dc.add(Restrictions.eq("status", IConstant.NOM_PROJECT_STATUS_OPENED));
        }
        List<Project> res = getHibernateTemplate().findByCriteria(dc);
        if (res != null && res.size() > 0) {
            // for every project
            for (Project project : res) {
                Project projectNew = getWithAll(project.getProjectId());
                projects.add(projectNew);
            }
        }
        logger.debug("getProjectsByManager - END");
        return projects;
    }

    /**
     * Gets the projects whose project teams include the person with the specified id
     * 
     * @author Coni
     * 
     * @param personId
     * @return
     * @throws BusinessException
     */
    public List<Project> getProjectsByTeamMember(Integer personId) {
        logger.debug("getProjectsByTeamMember - START");
        List<Project> projects = null;
        DetachedCriteria dc = DetachedCriteria.forEntityName(IModelConstant.projectWithProjectTeamEntity);
        List<ProjectTeam> projectTeams = projectTeamDao.getByPerson(personId);

        if (projectTeams != null) {
            List<Integer> projectIds = new ArrayList<Integer>();
            for (ProjectTeam projectTeam : projectTeams) {
                projectIds.add(new Integer(projectTeam.getProjectId()));
            }
            dc.add(Restrictions.in("projectId", projectIds));
            dc.add(Restrictions.ne("status", IConstant.NOM_PROJECT_STATUS_DELETED));
            projects = getHibernateTemplate().findByCriteria(dc);
        }
        logger.debug("getProjectsByTeamMember - END");
        return projects;
    }

    /**
     * Returns a list of projects for the corresponding team members
     * @author Coni
     * @param teamMembers
     * @return
     */
    public ArrayList<Project> getProjectsByTeamMembers(ArrayList<TeamMember> teamMembers,
            boolean isFinishedAndAbandoned) {
        logger.debug("getProjectsByTeamMembers - START");

        DetachedCriteria dc = DetachedCriteria.forEntityName(IModelConstant.projectAllEntity);
        ArrayList<Project> projects = null;

        if (teamMembers != null && teamMembers.size() > 0) {
            List<Integer> projectTeamsIds = new ArrayList<Integer>();
            for (TeamMember member : teamMembers) {
                projectTeamsIds.add(member.getProjectTeamId());
            }
            if (projectTeamsIds.size() > 0) {
                List<ProjectTeam> projectTeams = projectTeamDao.getByProjectTeamIds(projectTeamsIds);
                List<Integer> projectIds = new ArrayList<Integer>();
                for (ProjectTeam projectTeam : projectTeams) {
                    projectIds.add(projectTeam.getProjectId());
                }
                if (!projectIds.isEmpty()) {
                    dc.add(Restrictions.in("projectId", projectIds));

                    if (isFinishedAndAbandoned) {
                        dc.add(Restrictions.ne("status", IConstant.NOM_PROJECT_STATUS_DELETED));
                    } else {
                        dc.add(Restrictions.eq("status", IConstant.NOM_PROJECT_STATUS_OPENED));
                    }

                    projects = (ArrayList<Project>) getHibernateTemplate().findByCriteria(dc);
                    for (Project project : projects) {
                        for (ProjectTeam projectTeam : projectTeams) {
                            if (project.getProjectId() == projectTeam.getProjectId()) {
                                project.setProjectTeam(projectTeam);
                                break;
                            }
                        }
                    }
                }
            }
        }

        logger.debug("getProjectsByTeamMembers - END");
        return projects;
    }

    /**
     * Gets a Project with the project team by its projectId
     * 
     * @author Coni
     * @author Adelina
     * 
     * @param projectId
     * @return
     */
    public Project getWithProjectTeamByProjectId(int projectId, boolean isNotDeleted) {
        logger.debug("getWithProjectTeamByProjectId - START");
        DetachedCriteria dc = DetachedCriteria.forEntityName(IModelConstant.projectAllEntity);
        List<Project> projects = null;
        dc.add(Restrictions.eq("projectId", projectId));
        dc.add(Restrictions.ne("status", IConstant.NOM_PROJECT_STATUS_DELETED));
        projects = getHibernateTemplate().findByCriteria(dc);
        logger.debug("getWithProjectTeamByProjectId - END , projects size = " + projects.size());
        if (projects.size() > 0) {
            Project project = projects.get(0);
            project.setProjectTeam(projectTeamDao.getWithAllTeamMembers(project.getProjectId(), isNotDeleted));

            Integer managerId = project.getManagerId();

            logger.debug("managerId = " + managerId);
            Person manager = new Person();
            try {
                manager = BLPerson.getInstance().get(managerId);
            } catch (BusinessException be) {
                logger.error("", be);
            } catch (Exception e) {
                logger.error("", e);
            }
            // set the manager
            project.setManager(manager);

            Integer clientId = project.getClientId();
            if (clientId != null && clientId > 0) {
                Client client = new Client();
                try {
                    client = BLClient.getInstance().get(clientId);
                } catch (BusinessException be) {
                    logger.error("", be);
                } catch (Exception e) {
                    logger.error("", e);
                }
                project.setClient(client);
            }

            return project;
        } else {
            return null;
        }
    }

    /**
     * Gets a list of projects with the corresponding project ids
     * @author Coni
     * @param projectIds
     * @return
     * @throws BusinessException
     */
    public List<Project> getSimpleByProjectIds(Set<Integer> projectIds) {
        logger.debug("getSimpleByProjectIds - START");
        DetachedCriteria dc = DetachedCriteria.forEntityName(IModelConstant.projectAllEntity);

        dc.add(Restrictions.in("projectId", projectIds));
        dc.add(Restrictions.ne("status", IConstant.NOM_PROJECT_STATUS_DELETED));

        List<Project> res = getHibernateTemplate().findByCriteria(dc);
        logger.debug("getSimpleByProjectIds - END");
        return res;
    }
}