1 package com.atlassian.jira.web.action.issue;
2
3 import java.util.ArrayList;
4 import java.util.Collection;
5 import java.util.Iterator;
6 import java.util.List;
7
8 import org.apache.commons.collections.CollectionUtils;
9 import org.apache.commons.collections.ListUtils;
10 import org.ofbiz.core.entity.GenericValue;
11
12 import com.atlassian.jira.bc.issue.comment.CommentService;
13 import com.atlassian.jira.config.SubTaskManager;
14 import com.atlassian.jira.exception.IssueNotFoundException;
15 import com.atlassian.jira.exception.IssuePermissionException;
16 import com.atlassian.jira.issue.Issue;
17 import com.atlassian.jira.issue.fields.FieldManager;
18 import com.atlassian.jira.issue.fields.screen.FieldScreenRendererFactory;
19 import com.atlassian.jira.issue.link.CreateAndLinkIssueHelper;
20 import com.atlassian.jira.issue.link.IssueLink;
21 import com.atlassian.jira.issue.link.IssueLinkManager;
22 import com.atlassian.jira.issue.link.IssueLinkTypeManager;
23 import com.atlassian.jira.issue.link.LinkCollection;
24 import com.atlassian.jira.issue.link.LinkSchemeEntity;
25 import com.atlassian.jira.issue.link.LinkSchemeManager;
26 import com.atlassian.jira.security.Permissions;
27 import com.atlassian.jira.security.roles.ProjectRoleManager;
28 import com.atlassian.jira.web.action.admin.link.scheme.LinkSchemeHelper;
29
30 public class CreateAndLinkIssue extends AbstractCommentableIssue {
31
32
33 private static final long serialVersionUID = 1L;
34
35 private String linkTypeId;
36
37 private String destIssueTypeId;
38
39 private String targetIssueId;
40
41 private String targetIssueKey;
42
43 private LinkCollection linkCollection;
44
45 protected LinkSchemeManager linkSchemeManager;
46
47 protected CreateAndLinkIssueHelper createAndLinkIssueHelper;
48
49 protected LinkSchemeHelper linkSchemeHelper;
50
51 protected LinkSchemeEntity linkSchemeEntity;
52
53 private Issue targetIssue;
54
55
56
57
58
59
60
61 protected IssueLinkTypeManager issueLinkTypeManager;
62
63 public CreateAndLinkIssue(IssueLinkManager issueLinkManager, IssueLinkTypeManager issueLinkTypeManager, SubTaskManager subTaskManager, FieldScreenRendererFactory fieldScreenRendererFactory,
64 FieldManager fieldManager, ProjectRoleManager projectRoleManager, CommentService commentService, LinkSchemeManager linkSchemeManager, CreateAndLinkIssueHelper createAndLinkIssueHelper,
65 LinkSchemeHelper linkSchemeHelper) {
66 super(issueLinkManager, subTaskManager, fieldScreenRendererFactory, fieldManager, projectRoleManager, commentService);
67 this.linkSchemeManager = linkSchemeManager;
68 this.linkSchemeHelper = linkSchemeHelper;
69 this.createAndLinkIssueHelper = createAndLinkIssueHelper;
70 }
71
72 public String doDefault() throws Exception {
73 String returnCode = super.doDefault();
74
75 if (!isHasIssuePermission(Permissions.LINK_ISSUE, getIssue())) {
76 addErrorMessage(getText("linkissue.error.nopermission"));
77 }
78
79 if (!invalidInput()) {
80 validateParams();
81 }
82
83 if (invalidInput()) {
84 return ERROR;
85 }
86
87
88 return returnCode;
89 }
90
91 protected void validateParams() throws Exception {
92 Issue issue = getIssueObject();
93 if (issue == null) {
94 addErrorMessage(getText("not.existing.issue"));
95 } else {
96 List projectLinkSchemes = linkSchemeManager.getSchemes(issue.getProjectObject().getGenericValue());
97 if (!(projectLinkSchemes.isEmpty())) {
98 GenericValue scheme = (GenericValue) projectLinkSchemes.get(0);
99 List linkSchemeEntities = linkSchemeManager.getLinkSchemeEntities(scheme, getIssueObject().getIssueTypeObject().getId(), getLinkTypeId(), getDestIssueTypeId());
100 if (linkSchemeEntities.isEmpty()) {
101 addErrorMessage(getText("link.proposed.is.not.valid.in.linkscheme"));
102 }
103 }
104 }
105 }
106
107
108
109
110 protected LinkSchemeEntity getLinkSchemeEntity() {
111 LinkSchemeEntity linkSchemeEntity = null;
112 linkSchemeEntity = new LinkSchemeEntity(getIssueObject().getIssueTypeObject().getId(), getLinkTypeId(), getDestIssueTypeId());
113 return linkSchemeEntity;
114 }
115
116 protected void doValidation() {
117 try {
118 if (!isHasIssuePermission(Permissions.LINK_ISSUE, getIssue())) {
119 addErrorMessage(getText("linkissue.error.nopermission"));
120 }
121
122 super.doValidation();
123 } catch (IssueNotFoundException e) {
124
125 } catch (IssuePermissionException e) {
126
127 }
128 }
129
130 public String doLink() {
131 targetIssue = getIssueManager().getIssueObject(Long.valueOf(getTargetIssueId()));
132 return doLinkIssue();
133 }
134
135 public String doLinkOther() {
136 targetIssue = getIssueManager().getIssueObject(getTargetIssueKey());
137 return doLinkIssue();
138 }
139
140 public void validateCreateLink() {
141
142 }
143
144 public String doCreateAndLink() {
145
146 return SUCCESS;
147 }
148
149 protected String doLinkIssue() {
150 String returnCode;
151 try {
152 if (targetIssue != null) {
153 setDestIssueTypeId(targetIssue.getIssueTypeObject().getId());
154 validateParams();
155 if (!invalidInput()) {
156 linkIssue();
157 }
158 returnCode = getRedirect("/browse/" + getIssue().getString("key"));
159 } else {
160 addErrorMessage(getText("linkissue.error.unknown.issue"));
161 returnCode = ERROR;
162 }
163 } catch (Exception e) {
164 e.printStackTrace();
165 returnCode = ERROR;
166 }
167 return returnCode;
168 }
169
170 protected void linkIssue() {
171 try {
172 Long sourceId = getIssueObject().getId();
173 Long issueLinkTypeId = Long.valueOf(getLinkTypeId());
174 Long destinationId = targetIssue.getId();
175 IssueLink issueLink = getIssueLinkManager().getIssueLink(sourceId, destinationId, issueLinkTypeId);
176 if (issueLink == null) {
177 getIssueLinkManager().createIssueLink(sourceId, destinationId, issueLinkTypeId, null, getRemoteUser());
178 } else {
179 addError(getIssueManager().getIssueObject(destinationId).getKey(), getText("linkissue.error.link.already.created"));
180 }
181
182 getIssueObject().resetModifiedFields();
183 } catch (Exception e) {
184 log.error("Error occurred creating link: " + e, e);
185 addErrorMessage(getText("admin.errors.issues.an.error.occured", e));
186 }
187 }
188
189 public List getLinkableIssues() {
190 List linkableIssues = createAndLinkIssueHelper.getLinkableIssues(getIssueObject(), getLinkSchemeEntity());
191 List outwardLinks = getIssueLinkManager().getOutwardLinks(getIssueObject().getId());
192 List alreadyLinked = new ArrayList();
193 for (Iterator itOutward = outwardLinks.iterator(); itOutward.hasNext();) {
194 IssueLink issueLink = (IssueLink) itOutward.next();
195 if (issueLink.getLinkTypeId().toString().equals(getLinkTypeId())) {
196 for (Iterator itLinkable = linkableIssues.iterator(); itLinkable.hasNext();) {
197 Issue linkableIssue = (Issue) itLinkable.next();
198 Issue linkedIssue = issueLink.getDestinationObject();
199 if (linkableIssue.getKey().equals(linkedIssue.getKey())) {
200 alreadyLinked.add(linkableIssue);
201 }
202 }
203 }
204 }
205 linkableIssues.removeAll(alreadyLinked);
206 return linkableIssues;
207 }
208
209 public String getLinkTypeId() {
210 return linkTypeId;
211 }
212
213 public void setLinkTypeId(String linkTypeId) {
214 this.linkTypeId = linkTypeId;
215 }
216
217 public String getDestIssueTypeId() {
218 return destIssueTypeId;
219 }
220
221 public void setDestIssueTypeId(String destIssueTypeId) {
222 this.destIssueTypeId = destIssueTypeId;
223 }
224
225 public LinkSchemeHelper getLinkSchemeHelper() {
226 return linkSchemeHelper;
227 }
228
229 public String getTargetIssueId() {
230 return targetIssueId;
231 }
232
233 public void setTargetIssueId(String targetIssueId) {
234 this.targetIssueId = targetIssueId;
235 }
236
237 public String getTargetIssueKey() {
238 return targetIssueKey;
239 }
240
241 public void setTargetIssueKey(String targetIssueKey) {
242 this.targetIssueKey = targetIssueKey;
243 }
244
245 public Issue getTargetIssue() {
246 return targetIssue;
247 }
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
266
267
268
269
270
271
272
273
274
275
276
277
278
279
280
281
282
283
284
285
286
287
288
289
290
291
292
293
294
295
296
297
298
299
300
301
302
303
304
305
306
307
308
309
310
311
312
313
314
315
316
317
318
319 }