PageRenderTime 45ms CodeModel.GetById 18ms RepoModel.GetById 0ms app.codeStats 0ms

/src/main/java/com/valiantys/jira/plugins/icio/business/impl/SubTaskCloneManagerImpl.java

https://bitbucket.org/valiantys-dev/jicio
Java | 255 lines | 219 code | 19 blank | 17 comment | 19 complexity | ea0084cc47b7e81b0dbcc8dc9e260227 MD5 | raw file
  1. package com.valiantys.jira.plugins.icio.business.impl;
  2. import java.io.File;
  3. import java.sql.Timestamp;
  4. import java.util.ArrayList;
  5. import java.util.Collection;
  6. import java.util.HashMap;
  7. import java.util.Iterator;
  8. import java.util.List;
  9. import java.util.Map;
  10. import org.apache.log4j.Logger;
  11. import com.atlassian.crowd.embedded.api.User;
  12. import com.atlassian.jira.bc.issue.IssueService;
  13. import com.atlassian.jira.bc.issue.IssueService.CreateValidationResult;
  14. import com.atlassian.jira.bc.issue.link.IssueLinkService;
  15. import com.atlassian.jira.bc.issue.link.IssueLinkService.AddIssueLinkValidationResult;
  16. import com.atlassian.jira.config.SubTaskManager;
  17. import com.atlassian.jira.exception.CreateException;
  18. import com.atlassian.jira.issue.AttachmentManager;
  19. import com.atlassian.jira.issue.Issue;
  20. import com.atlassian.jira.issue.IssueInputParameters;
  21. import com.atlassian.jira.issue.IssueManager;
  22. import com.atlassian.jira.issue.attachment.Attachment;
  23. import com.atlassian.jira.issue.link.Direction;
  24. import com.atlassian.jira.issue.link.IssueLink;
  25. import com.atlassian.jira.issue.link.IssueLinkManager;
  26. import com.atlassian.jira.issue.link.IssueLinkTypeManager;
  27. import com.atlassian.jira.project.version.Version;
  28. import com.atlassian.jira.util.AttachmentUtils;
  29. import com.atlassian.jira.web.util.AttachmentException;
  30. import com.valiantys.jira.plugins.icio.business.SubTaskCloneManager;
  31. public class SubTaskCloneManagerImpl implements SubTaskCloneManager {
  32. private final static Logger LOG = Logger
  33. .getLogger(SubTaskCloneManager.class);
  34. private final IssueManager issueManager;
  35. private final IssueLinkManager issueLinkManager;
  36. private final IssueLinkService issueLinkService;
  37. private final IssueLinkTypeManager issueLinkTypeManager;
  38. private final IssueService issueService;
  39. private final AttachmentManager attachmentManager;
  40. private final SubTaskManager subTaskManager;
  41. private User user;
  42. /**
  43. * Map<old issue, cloned issue>
  44. */
  45. private Map<Issue, Issue> clonedSubTasks;
  46. public SubTaskCloneManagerImpl(IssueManager issueManager,
  47. IssueLinkManager issueLinkManager,
  48. IssueLinkTypeManager issueLinkTypeManager,
  49. IssueService issueService, AttachmentManager attachmentManager,
  50. SubTaskManager subTaskManager,
  51. final IssueLinkService issueLinkService) {
  52. this.issueManager = issueManager;
  53. this.issueLinkManager = issueLinkManager;
  54. this.issueLinkTypeManager = issueLinkTypeManager;
  55. this.issueService = issueService;
  56. this.attachmentManager = attachmentManager;
  57. this.subTaskManager = subTaskManager;
  58. this.issueLinkService = issueLinkService;
  59. }
  60. public Map<Issue, Issue> createSubTask(Issue originalIssue,
  61. Issue clonedIssue, List<Long> selectedSubTasks, User user) {
  62. this.user = user;
  63. clonedSubTasks = new HashMap<Issue, Issue>();
  64. Collection<Issue> subTasks = originalIssue.getSubTaskObjects();
  65. for (Issue subTask : subTasks) {
  66. Issue newSubTask = null;
  67. if (selectedSubTasks.contains(subTask.getId())) {
  68. try {
  69. Issue clonedSubTaskIssue = createIssue(clonedIssue, subTask);
  70. if (clonedSubTaskIssue != null) {
  71. newSubTask = issueManager.createIssueObject(user,
  72. clonedSubTaskIssue);
  73. try {
  74. subTaskManager.createSubTaskIssueLink(clonedIssue,
  75. newSubTask, user);
  76. createAttachment(subTask, newSubTask);
  77. } catch (CreateException e) {
  78. e.printStackTrace();
  79. }
  80. }
  81. } catch (CreateException e) {
  82. e.printStackTrace();
  83. }
  84. }
  85. clonedSubTasks.put(subTask, newSubTask);
  86. }
  87. return clonedSubTasks;
  88. }
  89. /**
  90. * Create a new issue with the same fields as the parameter subTask issue
  91. *
  92. * @param parentIssue
  93. * @param subTask
  94. * @return the new issue
  95. */
  96. private Issue createIssue(Issue parentIssue, Issue subTask) {
  97. IssueInputParameters parameters = populateParameters(subTask,
  98. parentIssue);
  99. CreateValidationResult createValidationResult = issueService
  100. .validateSubTaskCreate(user, parentIssue.getId(), parameters);
  101. if (createValidationResult.getErrorCollection().hasAnyErrors()) {
  102. LOG.error(createValidationResult.getErrorCollection());
  103. }
  104. return createValidationResult.getIssue();
  105. }
  106. /**
  107. * Create all the attachments in the clonedIssue with the attachments
  108. * already present in the original issue
  109. *
  110. * @param originalIssue
  111. * @param clonedIssue
  112. */
  113. private void createAttachment(Issue originalIssue, Issue clonedIssue) {
  114. List<Attachment> attachments = this.attachmentManager
  115. .getAttachments(originalIssue);
  116. for (Attachment attachment : attachments) {
  117. File attachmentFile = AttachmentUtils.getAttachmentFile(attachment);
  118. if ((attachmentFile.exists()) && (attachmentFile.canRead())) {
  119. try {
  120. this.attachmentManager.createAttachmentCopySourceFile(
  121. attachmentFile, attachment.getFilename(),
  122. attachment.getMimetype(), user.getName(),
  123. clonedIssue, new HashMap<String, Object>(),
  124. new Timestamp(System.currentTimeMillis()));
  125. } catch (AttachmentException e) {
  126. LOG.warn(
  127. new StringBuilder()
  128. .append("Could not clone attachment with id '")
  129. .append(attachment.getId())
  130. .append("' and file path '")
  131. .append(attachmentFile.getAbsolutePath())
  132. .append("' for issue with id '")
  133. .append(clonedIssue.getId())
  134. .append("' and key '")
  135. .append(clonedIssue.getKey()).append("'.")
  136. .toString(), e);
  137. }
  138. } else {
  139. LOG.warn(new StringBuilder()
  140. .append("Could not clone attachment with id '")
  141. .append(attachment.getId())
  142. .append("' and file path '")
  143. .append(attachmentFile.getAbsolutePath())
  144. .append("' for issue with id '")
  145. .append(clonedIssue.getId())
  146. .append("' and key '")
  147. .append(clonedIssue.getKey())
  148. .append("', ")
  149. .append("because the file path ")
  150. .append((attachmentFile.exists()) ? "is not readable."
  151. : "does not exist.").toString());
  152. }
  153. }
  154. }
  155. private IssueInputParameters populateParameters(Issue subTask,
  156. Issue parentIssue) {
  157. IssueInputParameters parameters = issueService
  158. .newIssueInputParameters();
  159. parameters.setIssueTypeId(subTask.getIssueTypeObject().getId());
  160. parameters.setProjectId(subTask.getProjectObject().getId());
  161. parameters.setSummary(subTask.getSummary());
  162. parameters.setAssigneeId(parentIssue.getAssigneeId());
  163. parameters.setDescription(subTask.getDescription());
  164. parameters.setPriorityId(subTask.getPriorityObject().getId());
  165. parameters.setReporterId(subTask.getReporterId());
  166. parameters.setStatusId(subTask.getStatusObject().getId());
  167. parameters.setSecurityLevelId(subTask.getSecurityLevelId());
  168. parameters.setEnvironment(subTask.getEnvironment());
  169. Long[] fixVersions = new Long[subTask.getFixVersions().size()];
  170. Iterator<Version> it = subTask.getFixVersions().iterator();
  171. int i = 0;
  172. while (it.hasNext()) {
  173. fixVersions[i] = it.next().getId();
  174. i++;
  175. }
  176. parameters.setFixVersionIds(fixVersions);
  177. Long[] affectedVersions = new Long[subTask.getAffectedVersions().size()];
  178. Iterator<Version> ite = subTask.getAffectedVersions().iterator();
  179. int j = 0;
  180. while (ite.hasNext()) {
  181. affectedVersions[j] = ite.next().getId();
  182. j++;
  183. }
  184. parameters.setAffectedVersionIds(affectedVersions);
  185. Long[] componentIds = new Long[subTask.getComponentObjects().size()];
  186. Iterator<Version> iterator = subTask.getAffectedVersions().iterator();
  187. int k = 0;
  188. while (iterator.hasNext()) {
  189. componentIds[k] = iterator.next().getId();
  190. k++;
  191. }
  192. parameters.setComponentIds(componentIds);
  193. return parameters;
  194. }
  195. public void createLinks() {
  196. if (clonedSubTasks == null || clonedSubTasks.isEmpty()) {
  197. return;
  198. }
  199. for (Map.Entry<Issue, Issue> clonedSubTask : clonedSubTasks.entrySet()) {
  200. Issue oldIssue = clonedSubTask.getKey();
  201. List<IssueLink> outwardIssueLinks = issueLinkManager
  202. .getOutwardLinks(clonedSubTask.getKey().getId());
  203. List<IssueLink> inwardIssueLinks = issueLinkManager
  204. .getInwardLinks(clonedSubTask.getKey().getId());
  205. Long parentId = clonedSubTask.getKey().getParentId();
  206. Long cloneIssueId = clonedSubTask.getValue() != null ? clonedSubTask
  207. .getValue().getId() : clonedSubTask.getKey().getId();
  208. createLinksOnOrigionalIssue(inwardIssueLinks, outwardIssueLinks,
  209. issueManager.getIssueObject(cloneIssueId));
  210. }
  211. }
  212. public void createLinksOnOrigionalIssue(List<IssueLink> inwardIssueLinks,
  213. List<IssueLink> outwardIssueLinks, Issue cloneIssueId) {
  214. List<String> issueKeys = null;
  215. for (IssueLink issueLink : outwardIssueLinks) {
  216. Issue destinationIssue = issueLink.getDestinationObject();
  217. issueKeys = new ArrayList<String>();
  218. issueKeys.add(destinationIssue.getKey());
  219. AddIssueLinkValidationResult result = issueLinkService
  220. .validateAddIssueLinks(user, cloneIssueId,
  221. issueLink.getLinkTypeId(), Direction.OUT,
  222. issueKeys, false);
  223. issueLinkService.addIssueLinks(user, result);
  224. }
  225. for (IssueLink issueLink : inwardIssueLinks) {
  226. Issue sourceIssue = issueLink.getSourceObject();
  227. issueKeys = new ArrayList<String>();
  228. issueKeys.add(sourceIssue.getKey());
  229. AddIssueLinkValidationResult result = issueLinkService
  230. .validateAddIssueLinks(user, cloneIssueId,
  231. issueLink.getLinkTypeId(), Direction.IN, issueKeys,
  232. false);
  233. issueLinkService.addIssueLinks(user, result);
  234. }
  235. }
  236. }