/src/main/java/com/google/ie/common/builder/ProjectBuilder.java

http://thoughtsite.googlecode.com/ · Java · 180 lines · 95 code · 15 blank · 70 comment · 16 complexity · 2b7438ec4d8b2d6a7f46719d98c52513 MD5 · raw file

  1. /* Copyright 2010 Google Inc.
  2. *
  3. * Licensed under the Apache License, Version 2.0 (the "License");
  4. * you may not use this file except in compliance with the License.
  5. * You may obtain a copy of the License at
  6. *
  7. * http://www.apache.org/licenses/LICENSE-2.0
  8. *
  9. * Unless required by applicable law or agreed to in writing, software
  10. * distributed under the License is distributed on an "AS IS" BASIS.
  11. * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
  12. * See the License for the specific language governing permissions and
  13. * limitations under the License
  14. */
  15. package com.google.ie.common.builder;
  16. import com.google.ie.business.domain.Developer;
  17. import com.google.ie.business.domain.Project;
  18. import com.google.ie.business.domain.User;
  19. import com.google.ie.business.service.DeveloperService;
  20. import com.google.ie.business.service.ProjectService;
  21. import com.google.ie.business.service.UserService;
  22. import com.google.ie.common.comparator.ProjectCreationDateComparator;
  23. import com.google.ie.dto.ProjectDetail;
  24. import com.google.ie.dto.RetrievalInfo;
  25. import org.apache.commons.lang.StringUtils;
  26. import org.apache.log4j.Logger;
  27. import org.springframework.beans.factory.annotation.Autowired;
  28. import org.springframework.stereotype.Component;
  29. import java.util.ArrayList;
  30. import java.util.Collections;
  31. import java.util.HashSet;
  32. import java.util.Iterator;
  33. import java.util.List;
  34. import java.util.Set;
  35. /**
  36. * This will be used for converting the complex project dto
  37. * for different request flows like getProjectsForUser, getProjects.
  38. *
  39. * @author gmaurya
  40. */
  41. @Component
  42. public class ProjectBuilder {
  43. /**
  44. * logger for logging error and data.
  45. */
  46. private static final Logger LOGGER = Logger.getLogger(ProjectBuilder.class);
  47. private static final int ZERO = 0;
  48. @Autowired
  49. private ProjectService projectService;
  50. @Autowired
  51. private UserService userService;
  52. @Autowired
  53. private DeveloperService developerService;
  54. /**
  55. * Retrieves the list of Projects created by a user.
  56. *
  57. * @param user the User object.
  58. * @param retrievalInfo the idea list retrieval information.
  59. * @return Returns the list of ProjectDetail objects.
  60. */
  61. public List<ProjectDetail> getProjectsForUser(User user, RetrievalInfo retrievalInfo) {
  62. List<ProjectDetail> projectDtoList = null;
  63. Set<String> projectKeys = new HashSet<String>();
  64. /* Get developers having with the specific user key */
  65. LOGGER.debug("User key =" + user.getUserKey());
  66. List<Developer> developers = developerService.getDeveloperByUserKey(user.getUserKey(),
  67. retrievalInfo);
  68. /* Get the Set of project keys associated with the developers */
  69. Iterator<Developer> iterator = developers.iterator();
  70. while (iterator.hasNext()) {
  71. Developer developer = iterator.next();
  72. if (!StringUtils.isBlank(developer.getProjectKey())) {
  73. Project proj = projectService.getProjectById(developer.getProjectKey());
  74. if (!proj.getStatus().equals(Project.STATUS_DELETED))
  75. projectKeys.add(developer.getProjectKey());
  76. }
  77. }
  78. LOGGER.debug("Project keys =" + projectKeys.toString());
  79. /* Get Project list by Set of project keys. */
  80. List<Project> projects = projectService.getProjects(projectKeys, retrievalInfo);
  81. Collections.sort(projects, new ProjectCreationDateComparator());
  82. /* Convert them into ProjectDetails. */
  83. if (projects != null && projects.size() > ZERO) {
  84. LOGGER.debug("Project size =" + projects.size());
  85. projectDtoList = convertToProjectDetailList(projects, true, false, true);
  86. }
  87. return projectDtoList;
  88. }
  89. /**
  90. * Get the detail of a project.
  91. *
  92. * @param projectKey the key of the project
  93. * @return {@link ProjectDetail} object containing details
  94. */
  95. public ProjectDetail getProjectDetail(String projectKey) {
  96. Project project = projectService.getProjectById(projectKey);
  97. return convertToProjectDetail(project, true, true);
  98. }
  99. /**
  100. * Converts the list of {@link Project} objects into list of
  101. * {@link ProjectDetail} objects.
  102. *
  103. * @param projectList the list of Project objects to be transformed into
  104. * ProjectDetail.
  105. * @param addUser flag that specifies whether the User object
  106. * associated with the project is to be fetched or not
  107. * @param addDevelopers flag that specifies whether the Developer objects
  108. * associated with the project are to be fetched or not
  109. * @return the list of ProjectDetail.
  110. */
  111. public List<ProjectDetail> convertToProjectDetailList(List<Project> projectList,
  112. boolean addUser, boolean addDevelopers, boolean trimLongFields) {
  113. List<ProjectDetail> projectDtoList = new ArrayList<ProjectDetail>();
  114. ProjectDetail projectDto = null;
  115. for (Project project : projectList) {
  116. if (trimLongFields) {
  117. shortenFields(project);
  118. }
  119. projectDto = convertToProjectDetail(project, addUser, addDevelopers);
  120. projectDtoList.add(projectDto);
  121. }
  122. return projectDtoList;
  123. }
  124. /**
  125. * Shortens the length of title and description fields
  126. *
  127. * @param project
  128. */
  129. private void shortenFields(Project project) {
  130. if (null != project) {
  131. /* 50 chars for title */
  132. project.setName(StringUtils.abbreviate(project.getName(), 50));
  133. /* 150 chars for description */
  134. project.setDescription(StringUtils.abbreviate(project.getDescription(),
  135. 150));
  136. }
  137. }
  138. /**
  139. * Converts the the Project object to ProjectDetail object and populate data
  140. * of developer,user and project.
  141. *
  142. * @param project the Project object to be transformed into IdeaDetail.
  143. * @param addUser flag that specifies whether the User object
  144. * associated with the project is to be fetched or not
  145. * @param addDeveloper flag that specifies whether the Developer objects
  146. * associated with the project are to be fetched or not
  147. * @return the list of IdeaDetail.
  148. */
  149. public ProjectDetail convertToProjectDetail(Project project,
  150. boolean addUser, boolean addDeveloper) {
  151. ProjectDetail projectDetail = new ProjectDetail();
  152. projectDetail.setProject(project);
  153. if (addUser && project != null) {
  154. User user = userService.getUserByPrimaryKey(project.getCreatorKey());
  155. projectDetail.setUser(user);
  156. }
  157. if (addDeveloper && project != null) {
  158. projectDetail
  159. .setDevelopers(developerService.getDevelopersByProjectKey(project
  160. .getKey()));
  161. }
  162. projectDetail.setDeveloperCount(projectDetail.getDevelopers().size());
  163. return projectDetail;
  164. }
  165. }