PageRenderTime 41ms CodeModel.GetById 15ms RepoModel.GetById 0ms app.codeStats 0ms

/jira-project/jira-components/jira-core/src/main/java/com/atlassian/jira/web/action/issue/LinkExistingIssue.java

https://bitbucket.org/ahmed_bilal_360factors/jira7-core
Java | 207 lines | 164 code | 31 blank | 12 comment | 24 complexity | 8a80048ea23060974cd0667ba8645f69 MD5 | raw file
Possible License(s): Apache-2.0
  1. package com.atlassian.jira.web.action.issue;
  2. import com.atlassian.jira.bc.issue.comment.CommentService;
  3. import com.atlassian.jira.bc.issue.link.IssueLinkService;
  4. import com.atlassian.jira.component.ComponentAccessor;
  5. import com.atlassian.jira.config.SubTaskManager;
  6. import com.atlassian.jira.event.issue.IssueEventBundleFactory;
  7. import com.atlassian.jira.event.issue.IssueEventManager;
  8. import com.atlassian.jira.exception.IssueNotFoundException;
  9. import com.atlassian.jira.exception.IssuePermissionException;
  10. import com.atlassian.jira.issue.IssueManager;
  11. import com.atlassian.jira.issue.MutableIssue;
  12. import com.atlassian.jira.issue.fields.FieldManager;
  13. import com.atlassian.jira.issue.fields.screen.FieldScreenRendererFactory;
  14. import com.atlassian.jira.issue.link.IssueLinkDisplayHelper;
  15. import com.atlassian.jira.issue.link.IssueLinkManager;
  16. import com.atlassian.jira.issue.link.IssueLinkType;
  17. import com.atlassian.jira.issue.link.IssueLinkTypeManager;
  18. import com.atlassian.jira.security.roles.ProjectRoleManager;
  19. import com.atlassian.jira.security.xsrf.RequiresXsrfCheck;
  20. import com.atlassian.jira.user.UserHistoryManager;
  21. import com.atlassian.jira.user.util.UserUtil;
  22. import com.atlassian.plugin.webresource.WebResourceManager;
  23. import java.util.ArrayList;
  24. import java.util.Collection;
  25. import java.util.List;
  26. import static com.atlassian.jira.user.UserHistoryItem.ISSUELINKTYPE;
  27. import static java.lang.String.valueOf;
  28. /**
  29. * This action is only used by jelly. It is not shown on the user interface.
  30. *
  31. * @deprecated Since v5.0.
  32. */
  33. public class LinkExistingIssue extends AbstractIssueLinkAction {
  34. private String[] linkKey;
  35. private String linkDesc;
  36. private Collection<String> linkDescs;
  37. private IssueLinkType issueLinkType;
  38. final private List<MutableIssue> issues = new ArrayList<MutableIssue>();
  39. private final IssueLinkManager issueLinkManager;
  40. private final IssueLinkTypeManager issueLinkTypeManager;
  41. private final IssueLinkService issueLinkService;
  42. private final IssueLinkDisplayHelper issueLinkDisplayHelper;
  43. private final UserHistoryManager userHistoryManager;
  44. public LinkExistingIssue(
  45. final IssueLinkManager issueLinkManager,
  46. final IssueLinkTypeManager issueLinkTypeManager,
  47. final SubTaskManager subTaskManager,
  48. final FieldManager fieldManager,
  49. final FieldScreenRendererFactory fieldScreenRendererFactory,
  50. final ProjectRoleManager projectRoleManager,
  51. final CommentService commentService,
  52. final UserHistoryManager userHistoryManager,
  53. final IssueLinkService issueLinkService,
  54. final UserUtil userUtil,
  55. final IssueEventManager issueEventManager,
  56. final IssueEventBundleFactory issueEventBundleFactory) {
  57. super(subTaskManager, fieldScreenRendererFactory, fieldManager, projectRoleManager, commentService, userUtil, null, null, issueEventManager, issueEventBundleFactory);
  58. this.issueLinkManager = issueLinkManager;
  59. this.issueLinkTypeManager = issueLinkTypeManager;
  60. this.issueLinkService = issueLinkService;
  61. this.userHistoryManager = userHistoryManager;
  62. this.issueLinkDisplayHelper = new IssueLinkDisplayHelper(userHistoryManager, getLoggedInUser());
  63. ComponentAccessor.getComponent(WebResourceManager.class).requireResource("jira.webresources:jira-fields");
  64. }
  65. @Override
  66. public boolean isValidToView() {
  67. return super.isValidToView()
  68. && !getLinkDescs().isEmpty();
  69. }
  70. protected void doValidation() {
  71. try {
  72. // Validate comment and permissions
  73. super.doValidation();
  74. if (linkKey != null && linkKey.length > 0) {
  75. for (String key : linkKey) {
  76. final MutableIssue issue = ComponentAccessor.getComponent(IssueManager.class).getIssueObject(key);
  77. if (issue == null) {
  78. addError("linkKey", getText("linkissue.error.notexist", key));
  79. } else if (key.equals(getIssue().getString("key"))) {
  80. addError("linkKey", getText("linkissue.error.selflink"));
  81. } else {
  82. issues.add(issue);
  83. }
  84. }
  85. } else {
  86. addError("linkKey", getText("linkissue.error.keyrequired"));
  87. }
  88. if (!getLinkDescs().contains(linkDesc)) {
  89. addError("linkDesc", getText("linkissue.error.invalidlinkdesc"));
  90. } else if (getIssueLinkType().isSystemLinkType()) {
  91. // Check that the chosen link type is not a system link type.
  92. // This should not happen - the system should not present a user with the description
  93. // of a system link type to chose
  94. addError("linkDesc", getText("linkissue.error.systemlink"));
  95. }
  96. } catch (IssueNotFoundException e) {
  97. // Do nothing as error added above
  98. } catch (IssuePermissionException e) {
  99. // Do nothing as error added above
  100. }
  101. }
  102. public String doDefault() throws Exception {
  103. try {
  104. getIssueObject();
  105. } catch (IssueNotFoundException e) {
  106. // Error is added above
  107. return ERROR;
  108. } catch (IssuePermissionException e) {
  109. return ERROR;
  110. }
  111. return super.doDefault();
  112. }
  113. @RequiresXsrfCheck
  114. protected String doExecute() {
  115. IssueLinkType linkType = getIssueLinkType();
  116. for (final MutableIssue issue : issues) {
  117. linkIssue(linkType, issue);
  118. }
  119. createAndDispatchComment();
  120. return returnComplete(getRedirectUrl());
  121. }
  122. private void linkIssue(IssueLinkType linkType, MutableIssue destinationIssue) {
  123. try {
  124. if (linkDesc.equals(linkType.getOutward())) {
  125. issueLinkManager.createIssueLink(getIssue().getLong("id"), destinationIssue.getId(), linkType.getId(), null, getLoggedInUser());
  126. } else {
  127. issueLinkManager.createIssueLink(destinationIssue.getId(), getIssue().getLong("id"), linkType.getId(), null, getLoggedInUser());
  128. }
  129. userHistoryManager.addItemToHistory(ISSUELINKTYPE, getLoggedInUser(), valueOf(linkType.getId()), linkDesc);
  130. } catch (Exception e) {
  131. log.error("Error occurred creating link: " + e, e);
  132. addErrorMessage(getText("admin.errors.issues.an.error.occured", e));
  133. }
  134. }
  135. private IssueLinkType getIssueLinkType() {
  136. if (issueLinkType == null) {
  137. for (IssueLinkType linkType : issueLinkTypeManager.getIssueLinkTypes()) {
  138. if (linkDesc.equals(linkType.getOutward()) || linkDesc.equals(linkType.getInward())) {
  139. issueLinkType = linkType;
  140. break;
  141. }
  142. }
  143. }
  144. return issueLinkType;
  145. }
  146. @SuppressWarnings("unused")
  147. public String[] getLinkKey() {
  148. return linkKey;
  149. }
  150. @SuppressWarnings("unused")
  151. public void setLinkKey(String[] linkKey) {
  152. this.linkKey = linkKey;
  153. }
  154. @SuppressWarnings("unused")
  155. public String getLinkDesc() {
  156. return linkDesc;
  157. }
  158. @SuppressWarnings("unused")
  159. public void setLinkDesc(String linkDesc) {
  160. this.linkDesc = linkDesc;
  161. }
  162. public Collection getLinkDescs() {
  163. if (linkDescs == null) {
  164. linkDescs = issueLinkDisplayHelper.getSortedIssueLinkTypes(issueLinkService.getIssueLinkTypes());
  165. }
  166. return linkDescs;
  167. }
  168. @SuppressWarnings("unused")
  169. public String getLastUsedLinkType() {
  170. return issueLinkDisplayHelper.getLastUsedLinkType();
  171. }
  172. @SuppressWarnings("unused")
  173. public List<MutableIssue> getCurrentValue() {
  174. return issues;
  175. }
  176. }