ro.cs.ts.model.dao.impl.DaoActivityImpl.java Source code

Java tutorial

Introduction

Here is the source code for ro.cs.ts.model.dao.impl.DaoActivityImpl.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.ts.model.dao.impl;

import java.util.ArrayList;
import java.util.Collections;
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.hibernate.criterion.Subqueries;
import org.springframework.context.MessageSource;
import org.springframework.orm.hibernate3.support.HibernateDaoSupport;
import org.springframework.security.core.context.SecurityContextHolder;

import ro.cs.ts.business.BLProject;
import ro.cs.ts.cm.Project;
import ro.cs.ts.common.IConstant;
import ro.cs.ts.common.IModelConstant;
import ro.cs.ts.common.PermissionConstant;
import ro.cs.ts.common.Tools;
import ro.cs.ts.entity.Activity;
import ro.cs.ts.entity.ProjectDetails;
import ro.cs.ts.entity.Record;
import ro.cs.ts.entity.SearchActivityBean;
import ro.cs.ts.exception.BusinessException;
import ro.cs.ts.model.dao.DaoBeanFactory;
import ro.cs.ts.model.dao.IDaoActivity;
import ro.cs.ts.model.dao.IDaoProjectDetails;
import ro.cs.ts.utils.ActivityComparator;
import ro.cs.ts.web.security.UserAuth;

/**
 * Dao class for Activity Entity
 * 
 * @author Coni
 * @author Adelina
 */
public class DaoActivityImpl extends HibernateDaoSupport implements IDaoActivity {

    private static IDaoProjectDetails projectDetailsDao = DaoBeanFactory.getInstance().getDaoProjectDetails();

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

    /**
    * Search for activities
    * 
    * @author Adelina
    * 
    * @param searchActivityBean
    * @param projectIds
    * @param isDeleteAction
    * @return
    * @throws BusinessException 
    */
    public List<Activity> getFromSearch(SearchActivityBean searchActivityBean, Set<Integer> projectIds,
            Integer organizationId, boolean isDeleteAction, MessageSource messageSource) throws BusinessException {
        logger.debug("getFromSearch - START ");

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

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

        // organization      
        if (searchActivityBean.getOrganizationId() != null) {
            dc.add(Restrictions.eq("organizationId", searchActivityBean.getOrganizationId()));
            dcCount.add(Restrictions.eq("organizationId", searchActivityBean.getOrganizationId()));
        }

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

        // project   
        if (searchActivityBean.getProjectId() != null) {
            if (searchActivityBean.getProjectId() != IConstant.NOM_ACTIVITY_SEARCH_ALL
                    && searchActivityBean.getProjectId() != IConstant.NOM_ACTIVITY_SEARCH_IN_ORGANIZATION) {
                //set the selected projectId as search criteria               
                dc.createCriteria("projectDetails")
                        .add(Restrictions.eq("projectId", searchActivityBean.getProjectId()));
                dcCount.createCriteria("projectDetails")
                        .add(Restrictions.eq("projectId", searchActivityBean.getProjectId()));
            } else if (searchActivityBean.getProjectId() == IConstant.NOM_ACTIVITY_SEARCH_ALL) {
                if (!userAuth.hasAuthority(PermissionConstant.getInstance().getTS_ActivityAdvancedSearch())) {
                    DetachedCriteria subquery = DetachedCriteria
                            .forEntityName(IModelConstant.activityForListingEntity);
                    subquery.createCriteria("projectDetails").add(Restrictions.in("projectId", projectIds));
                    subquery.add(Restrictions.disjunction());
                    subquery.setProjection(Projections.id());
                    dc.add(Expression.or(Subqueries.propertyIn("activityId", subquery),
                            Restrictions.isNull("projectDetails")));
                    dcCount.add(Expression.or(Subqueries.propertyIn("activityId", subquery),
                            Restrictions.isNull("projectDetails")));
                }
            } else if (searchActivityBean.getProjectId() == IConstant.NOM_ACTIVITY_SEARCH_IN_ORGANIZATION) {
                dc.add(Restrictions.isNull("projectDetails"));
                dcCount.add(Restrictions.isNull("projectDetails"));
            }
        }

        // Status
        dc.add(Restrictions.ne("status", IConstant.NOM_ACTIVITY_STATUS_DELETED));
        dcCount.add(Restrictions.ne("status", IConstant.NOM_ACTIVITY_STATUS_DELETED));

        // Billable
        if (searchActivityBean.getBillable() != null) {
            if (searchActivityBean.getBillable().equals(IConstant.NOM_BILLABLE_YES)
                    || searchActivityBean.getBillable().equals(IConstant.NOM_BILLABLE_NO)) {
                dc.add(Restrictions.eq("billable", searchActivityBean.getBillable()));
                dcCount.add(Restrictions.eq("billable", searchActivityBean.getBillable()));
            }
        }

        //the results list
        List<Activity> res = null;

        //the order can be done while retrieving the data from the database only if the sort parameter is the activity name or billable;
        //this cannot be done if the results must be ordered by project name
        if (searchActivityBean.getSortParam() != null && !"".equals(searchActivityBean.getSortParam())
                && !"projectName".equals(searchActivityBean.getSortParam())) {
            // check if I have to order the results
            // if I have to, check if I have to order them ascending or descending
            if (searchActivityBean.getSortDirection() == -1) {
                // ascending
                dc.addOrder(Order.asc(searchActivityBean.getSortParam()));
            } else {
                // descending
                dc.addOrder(Order.desc(searchActivityBean.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 || searchActivityBean.getNbrOfResults() == -1) {
                boolean isSearch = false;
                if (searchActivityBean.getNbrOfResults() == -1) {
                    isSearch = true;
                }
                // set the count(*) restriction         
                dcCount.setProjection(Projections.countDistinct("activityId"));

                //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)));
                searchActivityBean.setNbrOfResults(nbrOfResults);

                // get the number of pages
                if (nbrOfResults % searchActivityBean.getResultsPerPage() == 0) {
                    searchActivityBean.setNbrOfPages(nbrOfResults / searchActivityBean.getResultsPerPage());
                } else {
                    searchActivityBean.setNbrOfPages(nbrOfResults / searchActivityBean.getResultsPerPage() + 1);
                }
                // after an activity 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 && (searchActivityBean.getCurrentPage() > searchActivityBean.getNbrOfPages())) {
                    searchActivityBean.setCurrentPage(searchActivityBean.getNbrOfPages());
                } else if (isSearch) {
                    searchActivityBean.setCurrentPage(1);
                }
            }

            res = (List<Activity>) getHibernateTemplate().findByCriteria(dc,
                    (searchActivityBean.getCurrentPage() - 1) * searchActivityBean.getResultsPerPage(),
                    searchActivityBean.getResultsPerPage());
        } else {
            res = (List<Activity>) 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 || searchActivityBean.getNbrOfResults() == -1) {
                boolean isSearch = false;
                if (searchActivityBean.getNbrOfResults() == -1) {
                    isSearch = true;
                }
                int nbrOfResults = res.size();
                logger.debug("search results: ".concat(String.valueOf(nbrOfResults)));
                searchActivityBean.setNbrOfResults(nbrOfResults);

                // get the number of pages
                if (nbrOfResults % searchActivityBean.getResultsPerPage() == 0) {
                    searchActivityBean.setNbrOfPages(nbrOfResults / searchActivityBean.getResultsPerPage());
                } else {
                    searchActivityBean.setNbrOfPages(nbrOfResults / searchActivityBean.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 && (searchActivityBean.getCurrentPage() > searchActivityBean.getNbrOfPages())) {
                    searchActivityBean.setCurrentPage(searchActivityBean.getNbrOfPages());
                } else if (isSearch) {
                    searchActivityBean.setCurrentPage(1);
                }
            }
        }

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

        if (projectIds.size() > 0) {
            projects = BLProject.getInstance().getProjectsSimpleByProjectIds(projectIds);
            logger.debug("projects = " + projects);
        }

        // setting the project name 
        for (Activity activity : res) {
            if (activity.getProjectDetails() != null && activity.getProjectDetails().getProjectId() != null) {
                if (projects != null && projects.size() > 0) {
                    for (Project project : projects) {
                        if (activity.getProjectDetails().getProjectId().equals(project.getProjectId())) {
                            activity.setProjectName(project.getName());
                            activity.setProjectId(project.getProjectId());
                            activity.setProjectManagerId(project.getManagerId());
                            logger.debug("activity = " + activity);
                            break;
                        }
                    }
                }
            } else {
                activity.setProjectId(-1);
                activity.setProjectName(messageSource.getMessage(PROJECT_FROM_ORG, null, null));
            }

            logger.debug("projectName = " + activity.getProjectName());
        }

        List<Activity> activities = new ArrayList<Activity>();
        if (searchActivityBean.getSortParam() != null && "projectName".equals(searchActivityBean.getSortParam())) {
            //sorting the exchanges list
            //------sort the list
            if (searchActivityBean.getSortParam().equals("projectName")) {
                Collections.sort(res, ActivityComparator.getInstance().activityProjectNameComparator());
            }

            //ascending or descending
            if (searchActivityBean.getSortDirection() == IConstant.DESCENDING) {
                Collections.reverse(res);
            }
            long start = (searchActivityBean.getCurrentPage() - 1) * searchActivityBean.getResultsPerPage();
            long end = searchActivityBean.getCurrentPage() * searchActivityBean.getResultsPerPage();

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

        logger.debug("getFromSearch - END");
        return activities;
    }

    /**
     * Returns an activity containing the basic info
     * @author Coni
     * @param activityId
     * @return
     */
    public Activity get(int activityId) {
        logger.debug("get - START - activity with id =".concat(String.valueOf(activityId)));
        Activity activity = (Activity) getHibernateTemplate().get(IModelConstant.activitySimpleEntity, activityId);
        logger.debug("get - END");
        return activity;
    }

    /**
     * Gets all an organization's activities
     * 
     * @author Coni
     * @param organizationId
     * @return
     * @throws BusinessException
     */
    public List<Activity> getByOrganization(int organizationId) {
        logger.debug("getByOrganization - START");
        DetachedCriteria dc = DetachedCriteria.forEntityName(IModelConstant.activitySimpleEntity);
        dc.add(Restrictions.eq("organizationId", organizationId));
        dc.add(Restrictions.ne("status", IConstant.NOM_ACTIVITY_STATUS_DELETED));
        dc.add(Restrictions.isNull("projectDetailId"));
        List<Activity> result = getHibernateTemplate().findByCriteria(dc);
        logger.debug("getByOrganization - END");
        return result;
    }

    /**
     * Returns an activity containing all the info
     * 
     * @author Adelina
     * 
     * @param activityId
     * @return
     */
    public Activity getWithAll(Integer activityId) {

        logger.debug("get - START - activity with id =".concat(String.valueOf(activityId)));
        Activity activity = (Activity) getHibernateTemplate().get(IModelConstant.activityEntity, activityId);
        logger.debug("get - END");

        return activity;
    }

    /**
     * Adds an activity
     * 
     * @author Adelina
     * 
     * @param activity
     */
    public void add(Activity activity) {
        logger.debug("add - START");

        getHibernateTemplate().save(IModelConstant.activityEntity, activity);

        logger.debug("add - END");
    }

    /**
     * Updates an activity
     * 
     * @author Adelina
     * 
     * @param activity
     */
    public void update(Activity activity) {
        logger.debug("update - START");

        getHibernateTemplate().update(IModelConstant.activityForUpdateEntity, activity);

        logger.debug("update - END");
    }

    /**
     * Gets all a project activities
     * 
     * @author Coni
     * @param projectId
     * @return
     * @throws  
     * @throws BusinessException
     */
    public List<Activity> getByProjectId(int projectId) {
        logger.debug("getByProjectId - START");
        DetachedCriteria dc = DetachedCriteria.forEntityName(IModelConstant.activitySimpleEntity);
        ProjectDetails projectDetails = projectDetailsDao.getByProjectId(projectId);

        dc.add(Restrictions.eq("projectDetailId", projectDetails.getProjectDetailId()));
        dc.add(Restrictions.ne("status", IConstant.NOM_ACTIVITY_STATUS_DELETED));

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

    /**
    * Returns an activity containing with project details
    * 
    * @author Adelina
    * 
    * @param activityId
    * @return
    */
    public Activity getWithProjectDetail(Integer activityId) {

        logger.debug("get - START - activity with id =".concat(String.valueOf(activityId)));
        Activity activity = (Activity) getHibernateTemplate().get(IModelConstant.activityForListingEntity,
                activityId);
        logger.debug("get - END");

        return activity;
    }

    /**
     * Deletes an activity
     * 
     * @author Adelina
     * 
     * @param activityId
     * @return
     */
    public Activity deleteAll(Integer activityId) {
        logger.debug("deleteAll - START");
        logger.debug("Deleting activity with id: ".concat(activityId.toString()));

        Activity activity = get(activityId);
        activity.setStatus(IConstant.NOM_ACTIVITY_STATUS_DELETED);

        logger.debug("Deleting the activity : " + activity);
        getHibernateTemplate().update(IModelConstant.activitySimpleEntity, activity);
        logger.debug("Activity " + activity + " has been deleted");
        logger.debug("deleteAll  - END");
        return activity;
    }

    /**
     * Cheks if an activity has associated a records
     *
     * @author Adelina
     * 
     * @param activityId
     * @return
     */
    public boolean hasActivityAssociateRecord(Integer activityId) {
        logger.debug("hasActivityAssociateRecord - START");

        StringBuffer hql = new StringBuffer("select a from ");
        hql.append(IModelConstant.activityWithRecordsEntity);
        hql.append(" as a inner join a.records as r where a.activityId=");
        hql.append(activityId);
        logger.debug(hql.toString());

        List<Activity> activities = getHibernateTemplate().find(hql.toString());
        Tools.getInstance().printList(logger, activities);
        logger.debug("size = " + activities.size());
        if (activities != null && activities.size() > 0) {
            Activity activity = activities.get(0);
            logger.debug("Activity = " + activity);
            Set<Record> records = activity.getRecords();
            logger.debug("size  records = " + records.size());
            if (records != null && records.size() > 0) {
                return true;
            }
            return false;
        }

        logger.debug("hasActivityAssociateRecord - END");
        return false;
    }

    /**
     * Returns Activity entities that use the Currency with the id currencyId
     * @author Coni
     * @param currencyId
     * @return
     * @throws BusinessException 
     */
    public List<Activity> getByCurrencyId(int currencyId) {
        logger.debug("getByCurrencyId - START");
        DetachedCriteria dc = DetachedCriteria.forEntityName(IModelConstant.activityWithCurrenciesEntity);
        dc.add(Restrictions.or(Restrictions.eq("costPriceCurrencyId", currencyId),
                Restrictions.eq("billingPriceCurrencyId", currencyId)));
        dc.add(Restrictions.ne("status", IConstant.NOM_ACTIVITY_STATUS_DELETED));

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

    /**
     * Deletes an activity
     * 
     * @author Adelina
     * 
     * @param activity
     * @return
     */
    public Activity delete(Activity activity) {
        logger.debug("delete - START");
        logger.debug("Deleting activity with id: ".concat(String.valueOf(activity.getActivityId())));

        activity.setStatus(IConstant.NOM_ACTIVITY_STATUS_DELETED);

        logger.debug("Deleting the activity : " + activity);
        getHibernateTemplate().update(IModelConstant.activitySimpleEntity, activity);
        logger.debug("Activity " + activity + " has been deleted");
        logger.debug("delete  - END");
        return activity;
    }

    /**
     * Gets the activities for a projectDetail
     * 
     * @author Adelina
     * 
     * @param projectDetailId
     * @return
     * @throws  
     * @throws BusinessException
     */
    public List<Activity> getByProjectDetailId(Integer projectDetailId) {
        logger.debug("getByProjectDetailId - START");
        DetachedCriteria dc = DetachedCriteria.forEntityName(IModelConstant.activitySimpleEntity);

        dc.add(Restrictions.eq("projectDetailId", projectDetailId));
        dc.add(Restrictions.ne("status", IConstant.NOM_ACTIVITY_STATUS_DELETED));

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

}