View Javadoc

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  	// private String linkKey;
56  	// private String linkDesc;
57  	// private List linkDescs;
58  	//
59  	// private IssueLinkType issueLinkType;
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  		// Collection issueLinks = getIssueLinkManager().getIssueLinks(issueLinkTypeId);
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 	 * @return Proposed LinkSchemeEntity
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(); // validate comment
123 		} catch (IssueNotFoundException e) {
124 			// Do nothing as error added above
125 		} catch (IssuePermissionException e) {
126 			// Do nothing as error added above
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 			// Reset the fields as comment has been persisted to the db.
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 	// protected String doExecute() throws Exception {
250 	// IssueLinkType linkType = getIssueLinkType();
251 	//
252 	// final Collection keys = getKeys(linkKey);
253 	// boolean addLocalComment = true;
254 	// for (Iterator iterator = keys.iterator(); iterator.hasNext();) {
255 	// String key = (String) iterator.next();
256 	// MutableIssue destinationIssue = ManagerFactory.getIssueManager().getIssueObject(key);
257 	// linkIssue(linkType, destinationIssue, addLocalComment);
258 	// addLocalComment = false;
259 	// }
260 	//
261 	// return getRedirect("/browse/" + getIssue().getString("key"));
262 	// }
263 
264 	// private IssueLinkType getIssueLinkType() {
265 	// if (issueLinkType == null) {
266 	// Collection linkTypes = issueLinkTypeManager.getIssueLinkTypes();
267 	// for (Iterator iterator = linkTypes.iterator(); iterator.hasNext();) {
268 	// IssueLinkType linkType = (IssueLinkType) iterator.next();
269 	// if (linkDesc.equals(linkType.getOutward()) || linkDesc.equals(linkType.getInward())) {
270 	// issueLinkType = linkType;
271 	// break;
272 	// }
273 	// }
274 	// }
275 	//
276 	// return issueLinkType;
277 	// }
278 
279 	// private Collection getKeys(String keys) {
280 	// if (!TextUtils.stringSet(keys)) {
281 	// return Collections.EMPTY_LIST;
282 	// }
283 	//
284 	// Collection keyCol = new ArrayList();
285 	// StringTokenizer tokenizer = new StringTokenizer(keys, ", \t\n\r\f", false);
286 	// while (tokenizer.hasMoreTokens()) {
287 	// keyCol.add(tokenizer.nextToken());
288 	// }
289 	// return keyCol;
290 	// }
291 	//
292 	// public String getLinkKey() {
293 	// return linkKey;
294 	// }
295 	//
296 	// public void setLinkKey(String linkKey) {
297 	// this.linkKey = linkKey;
298 	// }
299 	//
300 	// public List getLinkDescs() {
301 	// if (linkDescs == null) {
302 	// Collection linkTypes = issueLinkTypeManager.getIssueLinkTypes();
303 	//
304 	// linkDescs = new ArrayList();
305 	// for (Iterator iterator = linkTypes.iterator(); iterator.hasNext();) {
306 	// IssueLinkType issueLinkType = (IssueLinkType) iterator.next();
307 	// linkDescs.add(issueLinkType.getOutward());
308 	// linkDescs.add(issueLinkType.getInward());
309 	// }
310 	// }
311 	//
312 	// return linkDescs;
313 	// }
314 	//
315 	// public void setLinkDescs(List linkDescs) {
316 	// this.linkDescs = linkDescs;
317 	// }
318 
319 }