ProjectServiceImpl.java

  1. /*
  2.  * This software was designed and created by Jason Carroll.
  3.  * Copyright (c) 2002, 2003, 2004 Jason Carroll.
  4.  * The author can be reached at jcarroll@cowsultants.com
  5.  * ITracker website: http://www.cowsultants.com
  6.  * ITracker forums: http://www.cowsultants.com/phpBB/index.php
  7.  *
  8.  * This program is free software; you can redistribute it and/or modify
  9.  * it only under the terms of the GNU General Public License as published by
  10.  * the Free Software Foundation; either version 2 of the License, or
  11.  * (at your option) any later version.
  12.  *
  13.  * This program is distributed in the hope that it will be useful,
  14.  * but WITHOUT ANY WARRANTY; without even the implied warranty of
  15.  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
  16.  * GNU General Public License for more details.
  17.  */

  18. package org.itracker.services.implementations;

  19. import org.apache.log4j.Logger;
  20. import org.itracker.model.*;
  21. import org.itracker.model.util.IssueUtilities;
  22. import org.itracker.persistence.dao.*;
  23. import org.itracker.services.ProjectService;

  24. import java.util.*;

  25. public class ProjectServiceImpl implements ProjectService {

  26.     //TODO: Cleanup this file, go through all issues, todos, etc.
  27.     //TODO: Add Javadocs here: document this whole class.

  28.     private static final Logger logger = Logger.getLogger(ProjectService.class);

  29.     private ComponentDAO componentDAO;
  30.     private CustomFieldDAO customFieldDAO;
  31.     private ProjectDAO projectDAO;
  32.     private ProjectScriptDAO projectScriptDAO;
  33.     private UserDAO userDAO;
  34.     private VersionDAO versionDAO;
  35.     private IssueDAO issueDAO;

  36.     public ProjectServiceImpl(ComponentDAO componentDAO,
  37.                               CustomFieldDAO customFieldDAO, ProjectDAO projectDAO,
  38.                               ProjectScriptDAO projectScriptDAO, UserDAO userDAO,
  39.                               VersionDAO versionDAO, IssueDAO issueDAO) {
  40.         this.componentDAO = componentDAO;
  41.         this.customFieldDAO = customFieldDAO;
  42.         this.projectDAO = projectDAO;
  43.         this.projectScriptDAO = projectScriptDAO;
  44.         this.userDAO = userDAO;
  45.         this.versionDAO = versionDAO;
  46.         this.issueDAO = issueDAO;
  47.     }

  48.     public Project getProject(Integer projectId) {
  49.         Project project = getProjectDAO().findByPrimaryKey(projectId);
  50.         return project;
  51.     }

  52.     public List<Project> getAllProjects() {
  53.         return getProjectDAO().findAll();
  54.     }

  55.     public List<Project> getAllAvailableProjects() {
  56.         List<Project> projects = getProjectDAO().findAllAvailable();
  57.         return projects;
  58.     }

  59.     public List<Project> getListOfAllAvailableProjects() {
  60.         return getAllAvailableProjects();
  61.     }

  62.     public Component updateProjectComponent(Component component) {
  63.         getComponentDAO().saveOrUpdate(component);
  64.         return component;
  65.     }

  66.     public Component addProjectComponent(Integer projectId, Component component) {
  67.         Project project = getProjectDAO().findByPrimaryKey(projectId);

  68.         component.setProject(project);
  69.         project.getComponents().add(component);
  70.         getComponentDAO().save(component);
  71.         getProjectDAO().save(project);

  72.         return component;
  73.     }

  74.     public boolean removeProjectComponent(Integer projectId, Integer componentId) {

  75.         Component component = getComponentDAO().findById(componentId);
  76.         if (component == null) {
  77.             return false; //component doesn't exist
  78.         }

  79.         if (!component.getProject().getId().equals(projectId)) {
  80.             return false;
  81.         }

  82.         getComponentDAO().delete(component);

  83.         return true;

  84.     }

  85.     public Component getProjectComponent(Integer componentId) {

  86.         Component component = getComponentDAO().findById(componentId);

  87.         return component;

  88.     }

  89.     public Version addProjectVersion(Integer projectId, Version version) {
  90.         version.setCreateDate(new Date());

  91.         Project project = getProjectDAO().findByPrimaryKey(projectId);
  92.         version.setProject(project);

  93.         Collection<Version> versions = project.getVersions();
  94.         versions.add(version);
  95.         getVersionDAO().save(version);

  96.         return version;

  97.     }

  98.     public boolean removeProjectVersion(Integer projectId, Integer versionId) {

  99.         Version version = getVersionDAO().findByPrimaryKey(versionId);
  100.         if (version == null) {
  101.             return false; // version doesn't exist
  102.         }

  103.         if (!version.getProject().getId().equals(projectId)) {
  104.             return false;
  105.         }

  106.         List<Issue> issues = getIssueDAO().findByTargetVersion(version.getId());
  107.         Iterator<Issue> iterator = issues.iterator();
  108.         while (iterator.hasNext()) {
  109.             Issue issue = (Issue) iterator.next();
  110.             issue.setTargetVersion(null);
  111.             getIssueDAO().save(issue);
  112.         }

  113.         issues = getIssueDAO().findByVersion(version.getId());
  114.         iterator = issues.iterator();
  115.         while (iterator.hasNext()) {
  116.             Issue issue = (Issue) iterator.next();
  117.             if (issue.getVersions().remove(version)) {
  118.                 getIssueDAO().save(issue);
  119.             }
  120.         }

  121.         getVersionDAO().delete(version);
  122.         return true;
  123.     }

  124.     public Version updateProjectVersion(Version version) {
  125.         getVersionDAO().saveOrUpdate(version);
  126.         return version;
  127.     }

  128.     public Version getProjectVersion(Integer versionId) {
  129.         Version version = getVersionDAO().findByPrimaryKey(versionId);

  130.         return version;

  131.     }

  132.     public List<User> getProjectOwners(Integer projectId) {
  133.         Project project = getProjectDAO().findByPrimaryKey(projectId);
  134.         List<User> users = project.getOwners();
  135.         return users;
  136.     }

  137.     public boolean setProjectOwners(Project project,
  138.                                     Set<Integer> setOfNewOwnerIds) {
  139.         if (null == project) {
  140.             logger.warn("setProjectOwners, project was null");
  141.             throw new IllegalArgumentException("Project must not be null.");
  142.         }
  143.         if (null == setOfNewOwnerIds) {
  144.             setOfNewOwnerIds = new HashSet<Integer>(0);
  145.         }

  146.         List<User> owners = new ArrayList<User>(setOfNewOwnerIds.size());
  147.         if (!setOfNewOwnerIds.isEmpty()) {

  148.             for (Iterator<Integer> iterator = setOfNewOwnerIds.iterator(); iterator
  149.                     .hasNext(); ) {
  150.                 Integer ownerId = iterator.next();
  151.                 User owner = getUserDAO().findByPrimaryKey(ownerId);
  152.                 owners.add(owner);
  153.             }
  154.         }
  155.         project.setOwners(owners);

  156.         return true;
  157.     }

  158.     public List<CustomField> getProjectFields(Integer projectId) {
  159.         return getProjectFields(projectId, null);
  160.     }

  161.     /**
  162.      * TODO: implement Locale-aware ProjectFields.
  163.      */
  164.     public List<CustomField> getProjectFields(Integer projectId, Locale locale) {

  165.         Project project = projectDAO.findByPrimaryKey(projectId);
  166.         List<CustomField> fields = project.getCustomFields();

  167.         return fields;
  168.     }

  169.     public boolean setProjectFields(Project project,
  170.                                     Set<Integer> setOfNewsFieldIds) {
  171.         List<CustomField> fields;
  172.         fields = project.getCustomFields();
  173.         fields.clear();

  174.         if (setOfNewsFieldIds != null && !setOfNewsFieldIds.isEmpty()) {
  175.             for (Iterator<Integer> iterator = setOfNewsFieldIds.iterator(); iterator
  176.                     .hasNext(); ) {
  177.                 Integer fieldId = iterator.next();
  178.                 CustomField field = customFieldDAO.findByPrimaryKey(fieldId);
  179.                 fields.add(field);
  180.             }
  181.         }
  182.         return true;
  183.     }

  184.     public ProjectScript getProjectScript(Integer scriptId) {
  185.         ProjectScript projectScript = this.projectScriptDAO
  186.                 .findByPrimaryKey(scriptId);
  187.         return projectScript;

  188.     }

  189.     public List<ProjectScript> getProjectScripts() {
  190.         List<ProjectScript> projectScripts = this.projectScriptDAO.findAll();
  191.         return projectScripts;
  192.     }

  193.     public ProjectScript addProjectScript(Integer projectId,
  194.                                           ProjectScript projectScript) {
  195.         ProjectScript addprojectScript = new ProjectScript();
  196.         addprojectScript.setId(projectScript.getId());
  197.         addprojectScript.setFieldId(projectScript.getFieldId());
  198.         addprojectScript.setFieldType(projectScript.getFieldType());
  199.         addprojectScript.setPriority(projectScript.getPriority());
  200.         addprojectScript.setProject(projectScript.getProject());
  201.         addprojectScript.setScript(projectScript.getScript());
  202.         this.projectScriptDAO.save(addprojectScript);

  203.         return addprojectScript;

  204.     }

  205.     public boolean removeProjectScript(Integer projectId, Integer scriptId) {
  206.         ProjectScript script = projectScriptDAO.findByPrimaryKey(scriptId);
  207.         this.projectScriptDAO.delete(script);


  208.         return true;

  209.     }

  210.     public ProjectScript updateProjectScript(ProjectScript projectScript) {
  211.         ProjectScript editprojectScript = projectScriptDAO
  212.                 .findByPrimaryKey(projectScript.getId());
  213.         editprojectScript.setId(projectScript.getId());
  214.         editprojectScript.setFieldId(projectScript.getFieldId());
  215.         editprojectScript.setPriority(projectScript.getPriority());
  216.         editprojectScript.setProject(projectScript.getProject());
  217.         editprojectScript.setScript(projectScript.getScript());

  218.         this.projectScriptDAO.saveOrUpdate(editprojectScript);

  219.         return editprojectScript;
  220.     }

  221.     public Long getTotalNumberIssuesByProject(Integer projectId) {
  222.         return issueDAO.countByProject(projectId);
  223.     }

  224.     public Long countIssuesByVersion(Integer versionId) {
  225.         return issueDAO.countByVersion(versionId);

  226.     }

  227.     public Long countIssuesByComponent(Integer componentId) {
  228.         return issueDAO.countByComponent(componentId);
  229.     }

  230.     public Long[] getProjectStats(Integer projectId) {
  231.         final Long[] issueStats = new Long[2];

  232.         Long openIssuesCount = issueDAO.countByProjectAndLowerStatus(projectId,
  233.                 IssueUtilities.STATUS_RESOLVED);

  234.         issueStats[0] = openIssuesCount;

  235.         Long resolvedIssuesCount = issueDAO.countByProjectAndHigherStatus(
  236.                 projectId, IssueUtilities.STATUS_RESOLVED);
  237.         issueStats[1] = resolvedIssuesCount;

  238.         return issueStats;
  239.     }

  240.     //TODO: Decide if this code is really needed and document for what
  241.     @SuppressWarnings("unused")
  242.     private IssueDAO getIssueDAO() {
  243.         return issueDAO;
  244.     }

  245.     private ProjectDAO getProjectDAO() {
  246.         return projectDAO;
  247.     }

  248.     private ComponentDAO getComponentDAO() {
  249.         return componentDAO;
  250.     }

  251.     private CustomFieldDAO getCustomFieldDAO() {
  252.         return this.customFieldDAO;
  253.     }

  254.     private ProjectScriptDAO getProjectScriptDAO() {
  255.         return this.projectScriptDAO;
  256.     }

  257.     private VersionDAO getVersionDAO() {
  258.         return this.versionDAO;
  259.     }

  260.     private UserDAO getUserDAO() {
  261.         return this.userDAO;
  262.     }

  263.     public List<CustomField> getListOfProjectFields(Integer projectId) {
  264.         throw new UnsupportedOperationException();
  265.     }

  266.     public List<User> getListOfProjectOwners(Integer projectId) {
  267.         throw new UnsupportedOperationException();
  268.     }

  269.     public Long getTotalNumberOpenIssuesByProject(Integer projectId) {
  270.         return issueDAO.countByProjectAndLowerStatus(projectId,
  271.                 IssueUtilities.STATUS_RESOLVED);
  272.     }

  273.     public Long getTotalNumberResolvedIssuesByProject(Integer projectId) {
  274.         return issueDAO.countByProjectAndHigherStatus(projectId,
  275.                 IssueUtilities.STATUS_RESOLVED);
  276.     }

  277.     public Date getLatestIssueUpdatedDateByProjectId(Integer projectId) {
  278.         return issueDAO.latestModificationDate(projectId);
  279.     }

  280.     public Project createProject(Project project, Integer userId) {
  281.         project.setId(null);
  282.         User user = getUserDAO().findByPrimaryKey(userId);
  283.         project.setOwners(Arrays.asList(new User[]{user}));
  284.         getProjectDAO().save(project);

  285.         return project;
  286.     }

  287.     public Project updateProject(Project project, Integer userId) {
  288.         User user = getUserDAO().findByPrimaryKey(userId);

  289.         getProjectDAO().saveOrUpdate(project);

  290.         return project;
  291.     }

  292.     public Boolean isUniqueProjectName(String projectName,
  293.                                        Integer updatedProjectId) {
  294.         Project project = getProjectDAO().findByName(projectName);
  295.         if (project != null) {
  296.             // validate that the returned project is not the updated one.
  297.             if (!project.getId().equals(updatedProjectId)) {
  298.                 return false;
  299.             }
  300.         }
  301.         return true;
  302.     }
  303. }