Clover Coverage Report - itracker
Coverage timestamp: Tue May 1 2012 16:42:12 CEST
146   439   58   3.48
30   302   0.4   42
42     1.38  
1    
 
 
  ProjectServiceImpl       Line # 49 146 58 0% 0.0
 
No Tests
 
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   
19    package org.itracker.services.implementations;
20   
21    import java.util.ArrayList;
22    import java.util.Arrays;
23    import java.util.Collection;
24    import java.util.Date;
25    import java.util.HashSet;
26    import java.util.Iterator;
27    import java.util.List;
28    import java.util.Locale;
29    import java.util.Set;
30   
31    import org.apache.log4j.Logger;
32    import org.itracker.model.Component;
33    import org.itracker.model.CustomField;
34    import org.itracker.model.Issue;
35    import org.itracker.model.Project;
36    import org.itracker.model.ProjectScript;
37    import org.itracker.model.User;
38    import org.itracker.model.Version;
39    import org.itracker.persistence.dao.ComponentDAO;
40    import org.itracker.persistence.dao.CustomFieldDAO;
41    import org.itracker.persistence.dao.IssueDAO;
42    import org.itracker.persistence.dao.ProjectDAO;
43    import org.itracker.persistence.dao.ProjectScriptDAO;
44    import org.itracker.persistence.dao.UserDAO;
45    import org.itracker.persistence.dao.VersionDAO;
46    import org.itracker.services.ProjectService;
47    import org.itracker.services.util.IssueUtilities;
48   
 
49    public class ProjectServiceImpl implements ProjectService {
50   
51    //TODO: Cleanup this file, go through all issues, todos, etc.
52    //TODO: Add Javadocs here: document this whole class.
53   
54    private static final Logger logger = Logger.getLogger(ProjectService.class);
55   
56    private ComponentDAO componentDAO;
57    private CustomFieldDAO customFieldDAO;
58    private ProjectDAO projectDAO;
59    private ProjectScriptDAO projectScriptDAO;
60    private UserDAO userDAO;
61    private VersionDAO versionDAO;
62    private IssueDAO issueDAO;
63   
 
64  0 toggle public ProjectServiceImpl(ComponentDAO componentDAO,
65    CustomFieldDAO customFieldDAO, ProjectDAO projectDAO,
66    ProjectScriptDAO projectScriptDAO, UserDAO userDAO,
67    VersionDAO versionDAO, IssueDAO issueDAO) {
68  0 this.componentDAO = componentDAO;
69  0 this.customFieldDAO = customFieldDAO;
70  0 this.projectDAO = projectDAO;
71  0 this.projectScriptDAO = projectScriptDAO;
72  0 this.userDAO = userDAO;
73  0 this.versionDAO = versionDAO;
74  0 this.issueDAO = issueDAO;
75    }
76   
 
77  0 toggle public Project getProject(Integer projectId) {
78  0 Project project = projectDAO.findByPrimaryKey(projectId);
79  0 return project;
80    }
81   
 
82  0 toggle public List<Project> getAllProjects() {
83  0 return projectDAO.findAll();
84    }
85   
 
86  0 toggle public List<Project> getAllAvailableProjects() {
87  0 List<Project> projects = projectDAO.findAllAvailable();
88  0 return projects;
89    }
90   
 
91  0 toggle public List<Project> getListOfAllAvailableProjects() {
92  0 return getAllAvailableProjects();
93    }
94   
 
95  0 toggle public Component updateProjectComponent(Component component) {
96    // component.setLastModifiedDate(new Date());
97  0 componentDAO.saveOrUpdate(component);
98  0 return component;
99    }
100   
 
101  0 toggle public Component addProjectComponent(Integer projectId, Component component) {
102  0 Project project = projectDAO.findByPrimaryKey(projectId);
103   
104  0 component.setCreateDate(new Date());
105  0 component.setProject(project);
106   
107  0 List<Component> components = project.getComponents();
108  0 components.add(component);
109   
110  0 componentDAO.save(component);
111   
112  0 return component;
113    }
114   
 
115  0 toggle public boolean removeProjectComponent(Integer projectId, Integer componentId) {
116   
117  0 Component component = componentDAO.findById(componentId);
118  0 if(component == null) {
119  0 return false; //component doesn't exist
120    }
121   
122  0 if(!component.getProject().getId().equals(projectId)) {
123    //throw new ProjectException("the component doesn't belong to the project specified");
124  0 return false;
125    }
126   
127  0 componentDAO.delete(component);
128   
129  0 return true;
130   
131    }
132   
 
133  0 toggle public Component getProjectComponent(Integer componentId) {
134   
135  0 Component component = componentDAO.findById(componentId);
136   
137  0 return component;
138   
139    }
140   
 
141  0 toggle public Version addProjectVersion(Integer projectId, Version version) {
142  0 version.setCreateDate(new Date());
143   
144  0 Project project = projectDAO.findByPrimaryKey(projectId);
145  0 version.setProject(project);
146   
147  0 Collection<Version> versions = project.getVersions();
148  0 versions.add(version);
149  0 versionDAO.save(version);
150   
151  0 return version;
152   
153    }
154   
 
155  0 toggle public boolean removeProjectVersion(Integer projectId, Integer versionId) {
156   
157  0 Version version = versionDAO.findByPrimaryKey(versionId);
158  0 if (version == null) {
159  0 return false; // version doesn't exist
160    }
161   
162  0 if (!version.getProject().getId().equals(projectId)) {
163    // throw new
164    // ProjectException("the component doesn't belong to the project specified");
165  0 return false;
166    }
167   
168  0 List<Issue> issues = issueDAO.findByTargetVersion(version.getId());
169  0 Iterator<Issue> iterator = issues.iterator();
170  0 while (iterator.hasNext()) {
171  0 Issue issue = (Issue) iterator.next();
172  0 issue.setTargetVersion(null);
173  0 issueDAO.save(issue);
174    }
175   
176  0 issues = issueDAO.findByVersion(version.getId());
177  0 iterator = issues.iterator();
178  0 while (iterator.hasNext()) {
179  0 Issue issue = (Issue) iterator.next();
180  0 if (issue.getVersions().remove(version)) {
181  0 issueDAO.save(issue);
182    }
183    }
184   
185  0 versionDAO.delete(version);
186  0 return true;
187    }
188   
 
189  0 toggle public Version updateProjectVersion(Version version) {
190  0 versionDAO.saveOrUpdate(version);
191  0 return version;
192    }
193   
 
194  0 toggle public Version getProjectVersion(Integer versionId) {
195  0 Version version = versionDAO.findByPrimaryKey(versionId);
196   
197  0 return version;
198   
199    }
200   
 
201  0 toggle public List<User> getProjectOwners(Integer projectId) {
202  0 Project project = projectDAO.findByPrimaryKey(projectId);
203  0 List<User> users = project.getOwners();
204  0 return users;
205    }
206   
 
207  0 toggle public boolean setProjectOwners(Project project,
208    Set<Integer> setOfNewOwnerIds) {
209  0 if (null == project) {
210  0 logger.warn("setProjectOwners, project was null");
211  0 throw new IllegalArgumentException("Project must not be null.");
212    }
213  0 if (null == setOfNewOwnerIds) {
214  0 setOfNewOwnerIds = new HashSet<Integer>(0);
215    }
216   
217  0 List<User> owners = new ArrayList<User>(setOfNewOwnerIds.size());
218  0 if (!setOfNewOwnerIds.isEmpty()) {
219   
220  0 for (Iterator<Integer> iterator = setOfNewOwnerIds.iterator(); iterator
221    .hasNext();) {
222  0 Integer ownerId = iterator.next();
223  0 User owner = userDAO.findByPrimaryKey(ownerId);
224  0 owners.add(owner);
225    }
226    }
227  0 project.setOwners(owners);
228   
229  0 return true;
230    }
231   
 
232  0 toggle public List<CustomField> getProjectFields(Integer projectId) {
233  0 return getProjectFields(projectId, null);
234    }
235   
236    /**
237    * TODO: implement Locale-aware ProjectFields.
238    */
 
239  0 toggle public List<CustomField> getProjectFields(Integer projectId, Locale locale) {
240   
241  0 Project project = projectDAO.findByPrimaryKey(projectId);
242  0 List<CustomField> fields = project.getCustomFields();
243   
244  0 return fields;
245    }
246   
 
247  0 toggle public boolean setProjectFields(Project project,
248    Set<Integer> setOfNewsFieldIds) {
249  0 List<CustomField> fields;
250  0 fields = project.getCustomFields();
251  0 fields.clear();
252   
253  0 if (setOfNewsFieldIds != null && !setOfNewsFieldIds.isEmpty()) {
254  0 for (Iterator<Integer> iterator = setOfNewsFieldIds.iterator(); iterator
255    .hasNext();) {
256  0 Integer fieldId = iterator.next();
257  0 CustomField field = customFieldDAO.findByPrimaryKey(fieldId);
258  0 fields.add(field);
259    }
260    }
261  0 return true;
262    }
263   
 
264  0 toggle public ProjectScript getProjectScript(Integer scriptId) {
265  0 ProjectScript projectScript = this.projectScriptDAO
266    .findByPrimaryKey(scriptId);
267  0 return projectScript;
268   
269    }
270   
 
271  0 toggle public List<ProjectScript> getProjectScripts() {
272  0 List<ProjectScript> projectScripts = this.projectScriptDAO.findAll();
273  0 return projectScripts;
274    }
275   
 
276  0 toggle public ProjectScript addProjectScript(Integer projectId,
277    ProjectScript projectScript) {
278  0 ProjectScript addprojectScript = new ProjectScript();
279  0 addprojectScript.setId(projectScript.getId());
280  0 addprojectScript.setFieldId(projectScript.getFieldId());
281  0 addprojectScript.setPriority(projectScript.getPriority());
282  0 addprojectScript.setProject(projectScript.getProject());
283  0 addprojectScript.setScript(projectScript.getScript());
284    // addprojectScript.setCreateDate(new Date());
285    // addprojectScript.setLastModifiedDate(addprojectScript.getCreateDate());
286  0 this.projectScriptDAO.save(addprojectScript);
287   
288  0 return addprojectScript;
289   
290    }
291   
 
292  0 toggle public boolean removeProjectScript(Integer projectId, Integer scriptId) {
293    // Project project = projectDAO.findByPrimaryKey(projectId);
294  0 ProjectScript script = projectScriptDAO.findByPrimaryKey(scriptId);
295  0 this.projectScriptDAO.delete(script);
296    // TODO: check this: why is this comment "script.remove()" there? Which
297    // type is expected in Collection<T> scripts?
298    // (WorkflowsScript? ProjectScript? Do you understand this? - I would
299    // say ProjectScript)
300    // Collection<ProjectScript> scripts = project.getScripts();
301    // scripts.remove(script);
302   
303    // script.remove();
304   
305  0 return true;
306   
307    }
308   
 
309  0 toggle public ProjectScript updateProjectScript(ProjectScript projectScript) {
310  0 ProjectScript editprojectScript = projectScriptDAO
311    .findByPrimaryKey(projectScript.getId());
312  0 editprojectScript.setId(projectScript.getId());
313  0 editprojectScript.setFieldId(projectScript.getFieldId());
314  0 editprojectScript.setPriority(projectScript.getPriority());
315  0 editprojectScript.setProject(projectScript.getProject());
316  0 editprojectScript.setScript(projectScript.getScript());
317    // editprojectScript.setCreateDate(projectScript.getCreateDate());
318    // editprojectScript.setLastModifiedDate(new Date());
319   
320  0 this.projectScriptDAO.saveOrUpdate(editprojectScript);
321   
322  0 return editprojectScript;
323    }
324   
 
325  0 toggle public Long getTotalNumberIssuesByProject(Integer projectId) {
326  0 return issueDAO.countByProject(projectId);
327    }
328   
 
329  0 toggle public Long countIssuesByVersion(Integer versionId) {
330  0 return issueDAO.countByVersion(versionId);
331   
332    }
333   
 
334  0 toggle public Long countIssuesByComponent(Integer componentId) {
335  0 return issueDAO.countByComponent(componentId);
336    }
337   
 
338  0 toggle public Long[] getProjectStats(Integer projectId) {
339  0 final Long[] issueStats = new Long[2];
340   
341  0 Long openIssuesCount = issueDAO.countByProjectAndLowerStatus(projectId,
342    IssueUtilities.STATUS_RESOLVED);
343   
344  0 issueStats[0] = openIssuesCount;
345   
346  0 Long resolvedIssuesCount = issueDAO.countByProjectAndHigherStatus(
347    projectId, IssueUtilities.STATUS_RESOLVED);
348  0 issueStats[1] = resolvedIssuesCount;
349   
350  0 return issueStats;
351    }
352   
353    //TODO: Decide if this code is really needed and document for what
 
354  0 toggle @SuppressWarnings("unused")
355    private IssueDAO getIssueDAO() {
356  0 return issueDAO;
357    }
358   
 
359  0 toggle private ProjectDAO getProjectDAO() {
360  0 return projectDAO;
361    }
362   
363    //TODO: Decide if this code is really needed and document for what
 
364  0 toggle @SuppressWarnings("unused")
365    private ComponentDAO getComponentDAO() {
366  0 return componentDAO;
367    }
368   
369    //TODO: Decide if this code is really needed and document for what
 
370  0 toggle @SuppressWarnings("unused")
371    private CustomFieldDAO getCustomFieldDAO() {
372  0 return this.customFieldDAO;
373    }
374   
375    //TODO: Decide if this code is really needed and document for what
 
376  0 toggle @SuppressWarnings("unused")
377    private ProjectScriptDAO getProjectScriptDAO() {
378  0 return this.projectScriptDAO;
379    }
380   
381    //TODO: Decide if this code is really needed and document for what
 
382  0 toggle @SuppressWarnings("unused")
383    private VersionDAO getVersionDAO() {
384  0 return this.versionDAO;
385    }
386   
 
387  0 toggle private UserDAO getUserDAO() {
388  0 return this.userDAO;
389    }
390   
 
391  0 toggle public List<CustomField> getListOfProjectFields(Integer projectId) {
392  0 throw new UnsupportedOperationException();
393    }
394   
 
395  0 toggle public List<User> getListOfProjectOwners(Integer projectId) {
396  0 throw new UnsupportedOperationException();
397    }
398   
 
399  0 toggle public Long getTotalNumberOpenIssuesByProject(Integer projectId) {
400  0 return issueDAO.countByProjectAndLowerStatus(projectId,
401    IssueUtilities.STATUS_RESOLVED);
402    }
403   
 
404  0 toggle public Long getTotalNumberResolvedIssuesByProject(Integer projectId) {
405  0 return issueDAO.countByProjectAndHigherStatus(projectId,
406    IssueUtilities.STATUS_RESOLVED);
407    }
408   
 
409  0 toggle public Date getLatestIssueUpdatedDateByProjectId(Integer projectId) {
410  0 return issueDAO.latestModificationDate(projectId);
411    }
412   
 
413  0 toggle public Project createProject(Project project, Integer userId) {
414  0 User user = getUserDAO().findByPrimaryKey(userId);
415  0 project.setOwners(Arrays.asList(new User[]{ user }));
416  0 getProjectDAO().save(project);
417   
418  0 return project;
419    }
 
420  0 toggle public Project updateProject(Project project, Integer userId) {
421  0 User user = getUserDAO().findByPrimaryKey(userId);
422   
423  0 getProjectDAO().saveOrUpdate(project);
424   
425  0 return project;
426    }
427   
 
428  0 toggle public Boolean isUniqueProjectName(String projectName,
429    Integer updatedProjectId) {
430  0 Project project = getProjectDAO().findByName(projectName);
431  0 if (project != null) {
432    // validate that the returned project is not the updated one.
433  0 if (!project.getId().equals(updatedProjectId)) {
434  0 return false;
435    }
436    }
437  0 return true;
438    }
439    }