IssueDAOImpl.java

  1. package org.itracker.persistence.dao;

  2. import org.apache.commons.collections.CollectionUtils;
  3. import org.apache.commons.collections.Predicate;
  4. import org.apache.commons.collections.Transformer;
  5. import org.hibernate.Criteria;
  6. import org.hibernate.HibernateException;
  7. import org.hibernate.Query;
  8. import org.hibernate.criterion.Order;
  9. import org.hibernate.criterion.Restrictions;
  10. import org.itracker.model.*;
  11. import org.itracker.model.util.IssueUtilities;

  12. import java.util.*;

  13. /**
  14.  * Default implementation of <code>IssueDAO</code> using Hibernate.
  15.  *
  16.  * @author ready
  17.  */
  18. public class IssueDAOImpl extends BaseHibernateDAOImpl<Issue> implements IssueDAO {

  19.     private ProjectDAO projectDAO;

  20.     public Issue findByPrimaryKey(Integer issueId) {

  21.         try {
  22.             Issue issue = (Issue) getSession().get(Issue.class, issueId);
  23.             if (null != issue) {
  24.                 getSession().refresh(issue);
  25.             } else {
  26.                 throw new NoSuchEntityException("Issue " + issueId);
  27.             }
  28.             return issue;
  29.         } catch (HibernateException ex) {
  30.             throw convertHibernateAccessException(ex);
  31.         }
  32.     }

  33.     public Long countAllIssues() {

  34.         final Long count;

  35.         try {
  36.             final Query query = getSession().getNamedQuery("IssueCountAll");
  37.             count = (Long) query.uniqueResult();
  38.         } catch (HibernateException ex) {
  39.             throw convertHibernateAccessException(ex);
  40.         }

  41.         return count;

  42.     }

  43.     @SuppressWarnings("unchecked")
  44.     public List<Issue> findAll() {

  45.         final List<Issue> issues;

  46.         try {
  47.             issues = getSession().getNamedQuery("IssuesAllQuery").list();
  48.         } catch (HibernateException ex) {
  49.             throw convertHibernateAccessException(ex);
  50.         }

  51.         return issues;

  52.     }

  53.     @SuppressWarnings("unchecked")
  54.     public List<Issue> findByStatus(int status) {

  55.         try {
  56.             Query query = getSession().getNamedQuery("IssuesByStatusQuery");
  57.             query.setInteger("issueStatus", status);
  58.             return query.list();
  59.         } catch (HibernateException ex) {
  60.             throw convertHibernateAccessException(ex);
  61.         }

  62.     }

  63.     @SuppressWarnings("unchecked")
  64.     public List<Issue> findByStatusLessThan(int maxExclusiveStatus) {

  65.         final List<Issue> issues;

  66.         try {
  67.             Query query = getSession().getNamedQuery("IssuesByStatusLessThanQuery");
  68.             query.setInteger("maxExclusiveStatus", maxExclusiveStatus);
  69.             issues = query.list();
  70.         } catch (HibernateException ex) {
  71.             throw convertHibernateAccessException(ex);
  72.         }

  73.         return issues;

  74.     }

  75.     @SuppressWarnings("unchecked")
  76.     public List<Issue> findByStatusLessThanEqualTo(int maxStatus) {

  77.         final List<Issue> issues;

  78.         try {
  79.             Query query = getSession().getNamedQuery("IssuesByStatusLessThanEqualToQuery");
  80.             query.setInteger("maxStatus", maxStatus);
  81.             issues = query.list();
  82.         } catch (HibernateException ex) {
  83.             throw convertHibernateAccessException(ex);
  84.         }

  85.         return issues;

  86.     }

  87.     @SuppressWarnings("unchecked")
  88.     public List<Issue> findByStatusLessThanEqualToInAvailableProjects(int maxStatus) {

  89.         final List<Issue> issues;

  90.         try {
  91.             Query query = getSession().getNamedQuery(
  92.                     "IssuesByStatusLessThanEqualToInAvailableProjectsQuery");
  93.             query.setInteger("maxStatus", maxStatus);
  94.             issues = query.list();
  95.         } catch (HibernateException ex) {
  96.             throw convertHibernateAccessException(ex);
  97.         }

  98.         return issues;

  99.     }

  100.     @SuppressWarnings("unchecked")
  101.     public List<Issue> findBySeverity(int severity) {

  102.         final List<Issue> issues;

  103.         try {
  104.             Query query = getSession().getNamedQuery("IssuesBySeverityQuery");
  105.             query.setInteger("severity", severity);
  106.             issues = query.list();
  107.         } catch (HibernateException ex) {
  108.             throw convertHibernateAccessException(ex);
  109.         }

  110.         return issues;

  111.     }

  112.     @SuppressWarnings("unchecked")
  113.     public List<Issue> findByProject(Integer projectId) {

  114.         final List<Issue> issues;

  115.         try {
  116.             Query query = getSession().getNamedQuery("IssuesByProjectQuery");
  117.             query.setInteger("projectId", projectId);
  118.             issues = query.list();
  119.         } catch (HibernateException ex) {
  120.             throw convertHibernateAccessException(ex);
  121.         }

  122.         return issues;

  123.     }

  124.     public Long countByProject(Integer projectId) {

  125.         final Long count;

  126.         try {
  127.             final Query query = getSession().getNamedQuery(
  128.                     "IssueCountByProjectQuery");
  129.             query.setInteger("projectId", projectId);
  130.             count = (Long) query.uniqueResult();
  131.         } catch (HibernateException ex) {
  132.             throw convertHibernateAccessException(ex);
  133.         }

  134.         return count;

  135.     }

  136.     @SuppressWarnings("unchecked")
  137.     public List<Issue> findByProjectAndLowerStatus(Integer projectId,
  138.                                                    int maxExclusiveStatus) {

  139.         final List<Issue> issues;

  140.         try {
  141.             Query query = getSession().getNamedQuery(
  142.                     "IssuesByProjectAndLowerStatusQuery");
  143.             query.setInteger("projectId", projectId);
  144.             query.setInteger("maxExclusiveStatus", maxExclusiveStatus);
  145.             issues = query.list();
  146.         } catch (HibernateException ex) {
  147.             throw convertHibernateAccessException(ex);
  148.         }

  149.         return issues;

  150.     }

  151.     public Long countByProjectAndLowerStatus(Integer projectId,
  152.                                              int maxExclusiveStatus) {

  153.         final Long count;

  154.         try {
  155.             final Query query = getSession().getNamedQuery(
  156.                     "IssueCountByProjectAndLowerStatusQuery");
  157.             query.setInteger("projectId", projectId);
  158.             query.setInteger("maxExclusiveStatus", maxExclusiveStatus);
  159.             count = (Long) query.uniqueResult();
  160.         } catch (HibernateException ex) {
  161.             throw convertHibernateAccessException(ex);
  162.         }

  163.         return count;

  164.     }

  165.     @SuppressWarnings("unchecked")
  166.     public List<Issue> findByProjectAndHigherStatus(Integer projectId,
  167.                                                     int status) {

  168.         final List<Issue> issues;

  169.         try {
  170.             Query query = getSession().getNamedQuery(
  171.                     "IssuesByProjectAndHigherStatusQuery");
  172.             query.setInteger("projectId", projectId);
  173.             query.setInteger("minStatus", status);
  174.             issues = query.list();
  175.         } catch (HibernateException ex) {
  176.             throw convertHibernateAccessException(ex);
  177.         }

  178.         return issues;

  179.     }

  180.     public Long countByProjectAndHigherStatus(Integer projectId, int minStatus) {

  181.         final Long count;

  182.         try {
  183.             final Query query = getSession().getNamedQuery(
  184.                     "IssueCountByProjectAndHigherStatusQuery");
  185.             query.setInteger("projectId", projectId);
  186.             query.setInteger("minStatus", minStatus);
  187.             count = (Long) query.uniqueResult();
  188.         } catch (HibernateException ex) {
  189.             throw convertHibernateAccessException(ex);
  190.         }

  191.         return count;

  192.     }

  193.     @SuppressWarnings("unchecked")
  194.     public List<Issue> findByOwner(Integer ownerId, int maxExclusiveStatus) {

  195.         final List<Issue> issues;

  196.         try {
  197.             Query query = getSession().getNamedQuery("IssuesByOwnerQuery");
  198.             query.setInteger("ownerId", ownerId);
  199.             query.setInteger("maxExclusiveStatus", maxExclusiveStatus);
  200.             issues = query.list();
  201.         } catch (HibernateException ex) {
  202.             throw convertHibernateAccessException(ex);
  203.         }

  204.         return issues;

  205.     }

  206.     @SuppressWarnings("unchecked")
  207.     public List<Issue> findByOwnerInAvailableProjects(Integer ownerId,
  208.                                                       int maxExclusiveStatus) {

  209.         final List<Issue> issues;

  210.         try {
  211.             Query query = getSession().getNamedQuery(
  212.                     "IssuesByOwnerInAvailableProjectsQuery");
  213.             query.setInteger("ownerId", ownerId);
  214.             query.setInteger("maxExclusiveStatus", maxExclusiveStatus);

  215.             issues = query.list();
  216.         } catch (HibernateException ex) {
  217.             throw convertHibernateAccessException(ex);
  218.         }

  219.         return issues;

  220.     }

  221.     @SuppressWarnings("unchecked")
  222.     public List<Issue> findUnassignedIssues(int maxStatus) {

  223.         final List<Issue> issues;

  224.         try {
  225.             Query query = getSession().getNamedQuery("IssuesUnassignedQuery");
  226.             query.setInteger("maxStatus", maxStatus);

  227.             issues = query.list();
  228.         } catch (HibernateException ex) {
  229.             throw convertHibernateAccessException(ex);
  230.         }

  231.         return issues;

  232.     }

  233.     @SuppressWarnings("unchecked")
  234.     public List<Issue> findByCreator(Integer creatorId,
  235.                                      int maxExclusiveStatus) {

  236.         final List<Issue> issues;

  237.         try {
  238.             Query query = getSession().getNamedQuery("IssuesByCreatorQuery");
  239.             query.setInteger("creatorId", creatorId);
  240.             query.setInteger("maxExclusiveStatus", maxExclusiveStatus);
  241.             issues = query.list();
  242.         } catch (HibernateException ex) {
  243.             throw convertHibernateAccessException(ex);
  244.         }

  245.         return issues;

  246.     }

  247.     @SuppressWarnings("unchecked")
  248.     public List<Issue> findByCreatorInAvailableProjects(Integer creatorId,
  249.                                                         int maxExclusiveStatus) {

  250.         final List<Issue> issues;

  251.         try {
  252.             Query query = getSession().getNamedQuery(
  253.                     "IssuesByCreatorInAvailableProjectsQuery");
  254.             query.setInteger("creatorId", creatorId);
  255.             query.setInteger("maxExclusiveStatus", maxExclusiveStatus);
  256.             issues = query.list();
  257.         } catch (HibernateException ex) {
  258.             throw convertHibernateAccessException(ex);
  259.         }

  260.         return issues;

  261.     }

  262.     @SuppressWarnings("unchecked")
  263.     public List<Issue> findByNotification(Integer userId,
  264.                                           int maxExclusiveStatus) {

  265.         final List<Issue> issues;

  266.         try {
  267.             final Query query = getSession().getNamedQuery(
  268.                     "IssuesByNotificationQuery");
  269.             query.setInteger("userId", userId);
  270.             query.setInteger("maxExclusiveStatus", maxExclusiveStatus);
  271.             issues = query.list();
  272.         } catch (HibernateException ex) {
  273.             throw convertHibernateAccessException(ex);
  274.         }

  275.         return issues;

  276.     }

  277.     @SuppressWarnings("unchecked")
  278.     public List<Issue> findByNotificationInAvailableProjects(Integer userId,
  279.                                                              int maxExclusiveStatus) {

  280.         final List<Issue> issues;

  281.         try {
  282.             final Query query = getSession().getNamedQuery(
  283.                     "IssuesByNotificationInAvailableProjectsQuery");
  284.             query.setInteger("userId", userId);
  285.             //@ToDo Check this query.
  286.             query.setInteger("maxExclusiveStatus", maxExclusiveStatus);
  287.             issues = query.list();
  288.         } catch (HibernateException ex) {
  289.             throw convertHibernateAccessException(ex);
  290.         }

  291.         return issues;

  292.     }

  293.     @SuppressWarnings("unchecked")
  294.     public List<Issue> findByComponent(Integer componentId) {

  295.         final List<Issue> issues;

  296.         try {
  297.             final Query query = getSession().getNamedQuery(
  298.                     "IssuesByComponentQuery");
  299.             query.setInteger("componentId", componentId);
  300.             issues = query.list();
  301.         } catch (HibernateException ex) {
  302.             throw convertHibernateAccessException(ex);
  303.         }

  304.         return issues;

  305.     }

  306.     public Long countByComponent(Integer componentId) {

  307.         final Long count;

  308.         try {
  309.             final Query query = getSession().getNamedQuery(
  310.                     "IssueCountByComponentQuery");
  311.             query.setInteger("componentId", componentId);
  312.             count = (Long) query.uniqueResult();
  313.         } catch (HibernateException ex) {
  314.             throw convertHibernateAccessException(ex);
  315.         }

  316.         return count;

  317.     }

  318.     @SuppressWarnings("unchecked")
  319.     public List<Issue> findByVersion(Integer versionId) {

  320.         final List<Issue> issues;

  321.         try {
  322.             final Query query = getSession().getNamedQuery(
  323.                     "IssuesByVersionQuery");
  324.             query.setInteger("versionId", versionId);
  325.             issues = query.list();
  326.         } catch (HibernateException ex) {
  327.             throw convertHibernateAccessException(ex);
  328.         }

  329.         return issues;

  330.     }

  331.     public Long countByVersion(Integer versionId) {

  332.         final Long count;

  333.         try {
  334.             final Query query = getSession().getNamedQuery(
  335.                     "IssueCountByVersionQuery");
  336.             query.setInteger("versionId", versionId);
  337.             count = (Long) query.uniqueResult();
  338.         } catch (HibernateException ex) {
  339.             throw convertHibernateAccessException(ex);
  340.         }

  341.         return count;

  342.     }

  343.     public Date latestModificationDate(Integer projectId) {

  344.         final Date lastModifiedDate;

  345.         try {
  346.             final Query query = getSession().getNamedQuery(
  347.                     "MaxIssueModificationDateQuery");
  348.             query.setInteger("projectId", projectId);
  349.             lastModifiedDate = (Date) query.uniqueResult();
  350.         } catch (HibernateException ex) {
  351.             throw convertHibernateAccessException(ex);
  352.         }

  353.         return lastModifiedDate;

  354.     }

  355.     public List<Issue> findNextIssues(Integer issueId) {
  356.         List<Issue> issue;
  357.         try {
  358.             final Query query = getSession().getNamedQuery(
  359.                     "FindNextIssues");
  360.             query.setInteger("issueId", issueId);
  361.             issue = query.list();
  362.         } catch (HibernateException ex) {
  363.             throw convertHibernateAccessException(ex);
  364.         }
  365.         return issue;
  366.     }
  367.     public List<Issue> findPreviousIssues(Integer issueId) {
  368.         List<Issue> issue;
  369.         try {
  370.             final Query query = getSession().getNamedQuery(
  371.                     "FindPreviousIssues");
  372.             query.setInteger("issueId", issueId);
  373.             issue = query.list();
  374.         } catch (HibernateException ex) {
  375.             throw convertHibernateAccessException(ex);
  376.         }
  377.         return issue;
  378.     }

  379.     /**
  380.      * It doens't really make sense for this method to receive projectDAO, it's just a quick
  381.      * fix for the fact that IssueSearchQuery handles ids and not objects
  382.      */
  383.     @SuppressWarnings("unchecked")
  384.     public List<Issue> query(
  385.             IssueSearchQuery searchQuery,
  386.             final User user,
  387.             final Map<Integer, Set<PermissionType>> userPermissions) {

  388.         Criteria criteria = getSession().createCriteria(Issue.class);

  389.         // projects
  390.         Collection<Project> projects = Collections.checkedCollection((Collection<Project>) getProjectsObjects(searchQuery), Project.class);

  391.         if (projects.size() > 0) {
  392.             criteria.add(Restrictions.in("project", projects));
  393.         }

  394.         // severities
  395.         if (searchQuery.getSeverities().size() > 0) {
  396.             criteria.add(Restrictions.in("severity", searchQuery.getSeverities()));
  397.         }

  398.         // status
  399.         if (searchQuery.getStatuses().size() > 0) {
  400.             criteria.add(Restrictions.in("status", searchQuery.getStatuses()));
  401.         }

  402.         // componentes
  403.         if (searchQuery.getComponents().size() > 0) {
  404.             criteria.createCriteria("components").add(Restrictions.in("id", searchQuery.getComponents()));
  405.         }

  406.         // versions
  407.         if (searchQuery.getVersions().size() > 0) {
  408.             criteria.createCriteria("versions").add(Restrictions.in("id", searchQuery.getVersions()));
  409.         }

  410.         // creator
  411.         if (searchQuery.getCreator() != null) {
  412.             criteria.add(Restrictions.eq("creator", searchQuery.getCreator()));
  413.         }

  414.         // owner
  415.         if (searchQuery.getOwner() != null) {
  416.             criteria.add(Restrictions.eq("owner", searchQuery.getOwner()));
  417.         }

  418.         // description and history
  419.         if (searchQuery.getText() != null && !searchQuery.getText().equals("")) {
  420.             criteria.createAlias("history", "history").
  421.                     add(Restrictions.or(
  422.                             Restrictions.ilike("description", "%" + searchQuery.getText() + "%"),
  423.                             Restrictions.ilike("history.description", "%" + searchQuery.getText() + "%")
  424.                     ));
  425.         }

  426.         // resolution
  427.         if (searchQuery.getResolution() != null) {
  428.             criteria.add(Restrictions.eq("resolution", searchQuery.getResolution() + "%"));
  429.         }

  430.         // resolution
  431.         if (searchQuery.getTargetVersion() != null) {
  432.             criteria.add(Restrictions.eq("targetVersion.id", searchQuery.getTargetVersion()));
  433.         }


  434.         // sort
  435.         String order = searchQuery.getOrderBy();
  436.         if (!"id".equals(order)) {
  437.             if ("sev".equals(order)) {
  438.                 criteria.addOrder(order("severity", true));
  439.             } else if ("proj".equals(order)) {
  440.                 criteria.addOrder(order("project", true)).addOrder(order("status", false));
  441.             } else if ("owner".equals(order)) {
  442.                 criteria.addOrder(order("owner", true)).addOrder(order("status", false));
  443.             } else if ("lm".equals(order)) {
  444.                 criteria.addOrder(order("lastModifiedDate", true));
  445.             } else {
  446.                 criteria.addOrder(order("status", true));
  447.             }
  448.         }
  449.         criteria.addOrder(order("id", true));

  450.         List<Issue> list = Collections.checkedList(Criteria.DISTINCT_ROOT_ENTITY.transformList(criteria.list()), Issue.class);

  451.         // filter for permission
  452.         list = new LinkedList<Issue>(Collections.checkedCollection(CollectionUtils.select(list, new Predicate() {
  453.             public boolean evaluate(Object arg0) {
  454.                 return IssueUtilities.canViewIssue((Issue) arg0, user, userPermissions);
  455.             }
  456.         }), Issue.class));


  457.         return list;

  458.     }

  459.     // from the list of project ids this objects has, return a list of
  460.     // projects
  461.     public Collection<?> getProjectsObjects(final IssueSearchQuery query) {
  462.         return CollectionUtils.collect(query.getProjects(), new Transformer() {
  463.             public Object transform(Object arg0) {
  464.                 return projectDAO.findByPrimaryKey((Integer) arg0);
  465.             }
  466.         });
  467.     }
  468.     Order order(String propertyName, boolean asc) {
  469.         return asc ? Order.asc(propertyName) : Order.desc(propertyName);
  470.     }

  471.     public ProjectDAO getProjectDAO() {
  472.         return projectDAO;
  473.     }

  474.     public void setProjectDAO(ProjectDAO projectDAO) {
  475.         this.projectDAO = projectDAO;
  476.     }

  477.     /**
  478.      * {@inheritDoc}
  479.      */
  480.     @SuppressWarnings("unchecked")
  481.     public List<Issue> findByTargetVersion(Integer versionId) {

  482.         try {
  483.             final Query query = getSession().getNamedQuery("FindByTargetVersion");
  484.             query.setInteger("versionId", versionId);
  485.             return query.list();
  486.         } catch (HibernateException ex) {
  487.             throw convertHibernateAccessException(ex);
  488.         }


  489.     }


  490. }