PageRenderTime 47ms CodeModel.GetById 17ms RepoModel.GetById 0ms app.codeStats 0ms

/src/main/java/com/topmanage/jiraplugins/projecttemplates/ProjectCloner.java

https://bitbucket.org/topmanage/tm-project-templates
Java | 574 lines | 403 code | 142 blank | 29 comment | 47 complexity | 38b3773504e16c7ae1c3778495ff42b9 MD5 | raw file
Possible License(s): Apache-2.0
  1. ///Some parts of this code were ported from the following open source groovy scripts:
  2. ///https://bitbucket.org/jamieechlin/scriptrunner-public/src/be2bcb817137/src/main/resources/com/onresolve/jira/groovy/canned/admin/CopyProject.groovy
  3. ///https://bitbucket.org/jamieechlin/scriptrunner-public/src/be2bcb8171373d2cc4348b6bd7204d51b301c5ec/src/main/resources/com/onresolve/jira/groovy/canned/workflow/postfunctions/CloneIssue.groovy
  4. package com.topmanage.jiraplugins.projecttemplates;
  5. import java.util.ArrayList;
  6. import java.util.HashMap;
  7. import java.util.List;
  8. import java.util.Map;
  9. import org.slf4j.Logger;
  10. import org.slf4j.LoggerFactory;
  11. import com.atlassian.jira.avatar.Avatar;
  12. import com.atlassian.jira.avatar.AvatarManager;
  13. import com.atlassian.jira.bc.issue.IssueService;
  14. import com.atlassian.jira.bc.issue.search.SearchService;
  15. import com.atlassian.jira.bc.project.ProjectCreationData;
  16. import com.atlassian.jira.bc.project.ProjectService;
  17. import com.atlassian.jira.bc.project.component.ProjectComponent;
  18. import com.atlassian.jira.bc.project.component.ProjectComponentManager;
  19. import com.atlassian.jira.bc.projectroles.ProjectRoleService;
  20. import com.atlassian.jira.config.SubTaskManager;
  21. import com.atlassian.jira.exception.CreateException;
  22. import com.atlassian.jira.issue.CustomFieldManager;
  23. import com.atlassian.jira.issue.Issue;
  24. import com.atlassian.jira.issue.IssueFactory;
  25. import com.atlassian.jira.issue.IssueFieldConstants;
  26. import com.atlassian.jira.issue.IssueManager;
  27. import com.atlassian.jira.issue.MutableIssue;
  28. import com.atlassian.jira.issue.context.JiraContextNode;
  29. import com.atlassian.jira.issue.context.manager.JiraContextTreeManager;
  30. import com.atlassian.jira.issue.customfields.CustomFieldUtils;
  31. import com.atlassian.jira.issue.fields.CustomField;
  32. import com.atlassian.jira.issue.fields.FieldManager;
  33. import com.atlassian.jira.issue.fields.config.FieldConfig;
  34. import com.atlassian.jira.issue.fields.config.FieldConfigScheme;
  35. import com.atlassian.jira.issue.fields.config.manager.FieldConfigManager;
  36. import com.atlassian.jira.issue.fields.config.manager.FieldConfigSchemeManager;
  37. import com.atlassian.jira.issue.fields.config.manager.IssueTypeSchemeManager;
  38. import com.atlassian.jira.issue.fields.layout.field.FieldConfigurationScheme;
  39. import com.atlassian.jira.issue.fields.layout.field.FieldLayoutManager;
  40. import com.atlassian.jira.issue.fields.screen.issuetype.IssueTypeScreenSchemeManager;
  41. import com.atlassian.jira.issue.index.IndexException;
  42. import com.atlassian.jira.issue.index.IssueIndexingService;
  43. import com.atlassian.jira.issue.label.Label;
  44. import com.atlassian.jira.issue.label.LabelManager;
  45. import com.atlassian.jira.issue.search.SearchException;
  46. import com.atlassian.jira.issue.search.SearchRequest;
  47. import com.atlassian.jira.issue.search.SearchResults;
  48. import com.atlassian.jira.issue.security.IssueSecuritySchemeManager;
  49. import com.atlassian.jira.jql.builder.JqlQueryBuilder;
  50. import com.atlassian.jira.notification.NotificationSchemeManager;
  51. import com.atlassian.jira.permission.PermissionSchemeManager;
  52. import com.atlassian.jira.project.Project;
  53. import com.atlassian.jira.project.ProjectCategory;
  54. import com.atlassian.jira.project.ProjectManager;
  55. import com.atlassian.jira.project.version.Version;
  56. import com.atlassian.jira.project.version.VersionManager;
  57. import com.atlassian.jira.security.roles.ProjectRole;
  58. import com.atlassian.jira.security.roles.ProjectRoleActors;
  59. import com.atlassian.jira.security.roles.RoleActor;
  60. import com.atlassian.jira.user.ApplicationUser;
  61. import com.atlassian.jira.user.util.UserManager;
  62. import com.atlassian.jira.util.ErrorCollection;
  63. //import com.atlassian.jira.security.roles.actor.GroupRoleActorFactory;
  64. //import com.atlassian.jira.security.roles.actor.UserRoleActorFactory;
  65. import com.atlassian.jira.util.ImportUtils;
  66. import com.atlassian.jira.util.SimpleErrorCollection;
  67. import com.atlassian.jira.web.bean.PagerFilter;
  68. import com.atlassian.jira.workflow.WorkflowSchemeManager;
  69. import com.atlassian.query.Query;
  70. import com.atlassian.query.order.SortOrder;
  71. import com.atlassian.templaterenderer.TemplateRenderer;
  72. import com.google.inject.internal.Lists;
  73. public class ProjectCloner {
  74. private static final Logger LOGGER = LoggerFactory.getLogger(ProjectCloner.class);
  75. private IssueService issueService;
  76. private ProjectService projectService;
  77. private SearchService searchService;
  78. private TemplateRenderer templateRenderer;
  79. private ProjectManager projectManager;
  80. private AvatarManager avatarManager;
  81. private PermissionSchemeManager permissionSchemeManager;
  82. private NotificationSchemeManager notificationSchemeManager;
  83. private IssueSecuritySchemeManager issueSecuritySchemeManager;
  84. private VersionManager versionManager;
  85. private ProjectComponentManager projectComponentManager;
  86. private JiraContextTreeManager jiraContextTreeManager;
  87. private FieldConfigSchemeManager fieldConfigSchemeManager;
  88. private IssueTypeSchemeManager issueTypeSchemeManager;
  89. private FieldManager fieldManager;
  90. private WorkflowSchemeManager workflowSchemeManager;
  91. private FieldLayoutManager fieldLayoutManager;
  92. private IssueTypeScreenSchemeManager issueTypeScreenSchemeManager;
  93. private CustomFieldManager customFieldManager;
  94. private FieldConfigManager fieldConfigManager;
  95. private ProjectRoleService projectRoleService;
  96. private IssueManager issueManager;
  97. private IssueFactory issueFactory;
  98. private ImportUtils importUtils;
  99. private LabelManager labelManager;
  100. private SubTaskManager subTaskManager;
  101. private UserManager jiraUserManager;
  102. private static final String LIST_BROWSER_TEMPLATE = "/templates/list.vm";
  103. private static final String NEW_BROWSER_TEMPLATE = "/templates/new.vm";
  104. private static final String EDIT_BROWSER_TEMPLATE = "/templates/edit.vm";
  105. private IssueIndexingService issueIndexingService;
  106. public ProjectCloner(IssueService issueService, ProjectService projectService,
  107. SearchService searchService,
  108. com.atlassian.jira.user.util.UserManager jiraUserManager,
  109. TemplateRenderer templateRenderer, ProjectManager projectManager,
  110. AvatarManager avatarManager, PermissionSchemeManager permissionSchemeManager,
  111. NotificationSchemeManager notificationSchemeManager, IssueSecuritySchemeManager issueSecuritySchemeManager,
  112. VersionManager versionManager, ProjectComponentManager projectComponentManager,
  113. IssueTypeSchemeManager issueTypeSchemeManager,
  114. FieldConfigSchemeManager fieldConfigSchemeManager, FieldManager fieldManager,
  115. WorkflowSchemeManager workflowSchemeManager, FieldLayoutManager fieldLayoutManager,
  116. IssueTypeScreenSchemeManager issueTypeScreenSchemeManager, CustomFieldManager customFieldManager,
  117. FieldConfigManager fieldConfigManager, ProjectRoleService projectRoleService,
  118. JiraContextTreeManager jiraContextTreeManager, IssueManager issueManager,
  119. IssueFactory issueFactory, IssueIndexingService issueIndexingService,
  120. ImportUtils importUtils, LabelManager labelManager, SubTaskManager subTaskManager) {
  121. this.issueService = issueService;
  122. this.projectService = projectService;
  123. this.searchService = searchService;
  124. this.templateRenderer = templateRenderer;
  125. this.jiraUserManager = jiraUserManager;
  126. this.projectManager = projectManager;
  127. this.avatarManager = avatarManager;
  128. this.permissionSchemeManager = permissionSchemeManager;
  129. this.notificationSchemeManager = notificationSchemeManager;
  130. this.issueSecuritySchemeManager = issueSecuritySchemeManager;
  131. this.versionManager = versionManager;
  132. this.projectComponentManager = projectComponentManager;
  133. this.jiraContextTreeManager = jiraContextTreeManager;
  134. this.issueTypeSchemeManager = issueTypeSchemeManager;
  135. this.fieldConfigSchemeManager = fieldConfigSchemeManager;
  136. this.fieldManager = fieldManager;
  137. this.workflowSchemeManager = workflowSchemeManager;
  138. this.fieldLayoutManager = fieldLayoutManager;
  139. this.issueTypeScreenSchemeManager = issueTypeScreenSchemeManager;
  140. this.customFieldManager = customFieldManager;
  141. this.fieldConfigManager = fieldConfigManager;
  142. this.projectRoleService = projectRoleService;
  143. this.issueManager = issueManager;
  144. this.issueFactory = issueFactory;
  145. this.issueIndexingService = issueIndexingService;
  146. this.importUtils = importUtils;
  147. this.labelManager = labelManager;
  148. this.subTaskManager = subTaskManager;
  149. }
  150. public Project PerformClone(String sourceProjectKey, String newProjectKey, String newProjectName, ProjectCategory newProjectCategory,
  151. boolean copyComponentes, boolean copyVersions, boolean copyIssues,
  152. ApplicationUser currentUser, String projectLead) throws ProjectCreationException{
  153. Project srcProject = projectManager.getProjectObjByKey(sourceProjectKey);
  154. //GenericValue srcProjectGV = srcProject.getGenericValue();
  155. Avatar srcProjectAvatar = srcProject.getAvatar();
  156. String lead = null;
  157. if (projectLead == null){
  158. lead = srcProject.getLeadUserName();
  159. }else{
  160. lead = projectLead;
  161. }
  162. ProjectCreationData data = new ProjectCreationData.Builder()
  163. .withType(srcProject.getProjectTypeKey())
  164. .withName(newProjectName)
  165. .withKey(newProjectKey)
  166. .withDescription(srcProject.getDescription())
  167. .withUrl(srcProject.getUrl())
  168. .withAssigneeType(srcProject.getAssigneeType())
  169. .withLead(jiraUserManager.getUserByName(lead))
  170. .withAvatarId(srcProjectAvatar.isSystemAvatar() ? srcProjectAvatar.getId() : avatarManager.getDefaultAvatarId(Avatar.Type.PROJECT))
  171. .build();
  172. final ProjectService.CreateProjectValidationResult result =
  173. projectService.validateCreateProject(currentUser, data);
  174. //Check if validation passed and send proper response if it did not
  175. if (!result.isValid()){
  176. ProjectCreationException e = new ProjectCreationException();
  177. ErrorCollection errorCollection = result.getErrorCollection();
  178. e.errors = errorCollection.getErrorMessages();
  179. throw e;
  180. }
  181. final Project newprojectObj = projectService.createProject(result);
  182. final ProjectService.UpdateProjectSchemesValidationResult schemesResult =
  183. projectService.validateUpdateProjectSchemes(
  184. currentUser,
  185. permissionSchemeManager.getSchemeFor(srcProject) == null ? null : permissionSchemeManager.getSchemeFor(srcProject).getId(),
  186. notificationSchemeManager.getSchemeFor(srcProject) == null ? null : notificationSchemeManager.getSchemeFor(srcProject).getId(),
  187. issueSecuritySchemeManager.getSchemeFor(srcProject) == null ? null : issueSecuritySchemeManager.getSchemeFor(srcProject).getId());
  188. projectService.updateProjectSchemes(schemesResult, newprojectObj);
  189. //Copy versions
  190. for (Version version : srcProject.getVersions()){
  191. if (!version.isArchived()){
  192. try {
  193. versionManager.createVersion(
  194. version.getName(),
  195. version.getReleaseDate(),
  196. version.getDescription(),
  197. newprojectObj.getId(),
  198. null);
  199. } catch (CreateException e) {
  200. LOGGER.error("Cannot copy versions", e);
  201. ProjectCreationException ex = new ProjectCreationException();
  202. ex.errors = Lists.newArrayList(e.getMessage());
  203. throw ex;
  204. }
  205. }
  206. }
  207. //Copy components
  208. for (ProjectComponent projectComponent : projectComponentManager.findAllForProject(srcProject.getId())){
  209. projectComponentManager.create(
  210. projectComponent.getName(),
  211. projectComponent.getDescription(),
  212. projectComponent.getLead(),
  213. projectComponent.getAssigneeType(),
  214. newprojectObj.getId());
  215. }
  216. //Issue type scheme
  217. FieldConfigScheme issueTypeScheme = issueTypeSchemeManager.getConfigScheme(srcProject);
  218. if (issueTypeScheme != issueTypeSchemeManager.getDefaultIssueTypeScheme()){
  219. List<Long> projectIds = issueTypeScheme.getAssociatedProjectIds();
  220. List<Long> newListWithIds = new ArrayList<Long>();
  221. for (Long id : projectIds){
  222. newListWithIds.add(id);
  223. }
  224. newListWithIds.add(newprojectObj.getId());
  225. Long[] projectIdsLong = ConvertLongListToArray(newListWithIds);
  226. List<JiraContextNode> contexts = CustomFieldUtils.buildJiraIssueContexts
  227. (false,null,projectIdsLong,jiraContextTreeManager);
  228. fieldConfigSchemeManager.updateFieldConfigScheme
  229. (issueTypeScheme,contexts,fieldManager.getConfigurableField(IssueFieldConstants.ISSUE_TYPE));
  230. }
  231. //Workflow Scheme
  232. if (workflowSchemeManager.getSchemeFor(srcProject) != workflowSchemeManager.getDefaultSchemeObject()){
  233. workflowSchemeManager.addSchemeToProject(newprojectObj,workflowSchemeManager.getSchemeFor(srcProject));
  234. }
  235. Project newprojectGV = newprojectObj;
  236. //Field Config/Layout Scheme
  237. FieldConfigurationScheme srcProjectFieldLayout = fieldLayoutManager.getFieldConfigurationScheme(srcProject);
  238. if (srcProjectFieldLayout != null){
  239. fieldLayoutManager.addSchemeAssociation(newprojectGV,srcProjectFieldLayout.getId());
  240. }
  241. //Issue Type Screen Scheme
  242. issueTypeScreenSchemeManager.addSchemeAssociation
  243. (newprojectObj, issueTypeScreenSchemeManager.getIssueTypeScreenScheme(srcProject));
  244. //Project Category
  245. projectManager.setProjectCategory(newprojectObj, newProjectCategory);
  246. //CustomFields
  247. for (CustomField customField : customFieldManager.getCustomFieldObjects()){
  248. for (FieldConfigScheme fieldConfigScheme : fieldConfigSchemeManager.getConfigSchemesForField(customField)){
  249. if (!fieldConfigScheme.isGlobal()){
  250. for (Project project : fieldConfigScheme.getAssociatedProjectObjects()){
  251. if (project.getId() == srcProject.getId()){
  252. Long fcsId = fieldConfigScheme.getId();
  253. FieldConfigScheme cfConfigScheme = fieldConfigSchemeManager.getFieldConfigScheme(fcsId);
  254. FieldConfigScheme.Builder cfSchemeBuilder = new FieldConfigScheme.Builder(cfConfigScheme);
  255. FieldConfig config = fieldConfigManager.getFieldConfig(fcsId);
  256. HashMap<String, FieldConfig> configs = new HashMap<String, FieldConfig>();
  257. for (String issueTypeId : fieldConfigScheme.getAssociatedIssueTypeIds()){
  258. configs.put(issueTypeId, config);
  259. }
  260. cfSchemeBuilder.setConfigs(configs);
  261. cfConfigScheme = cfSchemeBuilder.toFieldConfigScheme();
  262. List<Long> projectIdList = fieldConfigScheme.getAssociatedProjectIds();
  263. projectIdList.add(newprojectGV.getId());
  264. List<JiraContextNode> contexts = CustomFieldUtils.buildJiraIssueContexts(false,
  265. null,
  266. projectIdList.toArray(new Long[projectIdList.size()]),
  267. jiraContextTreeManager);
  268. fieldConfigSchemeManager.updateFieldConfigScheme
  269. (cfConfigScheme, contexts, customFieldManager.getCustomFieldObject(customField.getId()));
  270. }
  271. }
  272. }
  273. }
  274. }
  275. customFieldManager.refresh();
  276. //Project Roles
  277. SimpleErrorCollection errorCollection = new SimpleErrorCollection();
  278. for (ProjectRole projectRole : projectRoleService.getProjectRoles(currentUser, errorCollection)){
  279. ProjectRoleActors projectRoleActors = projectRoleService.getProjectRoleActors(currentUser, projectRole, srcProject, errorCollection);
  280. //String[] actorCategories = {UserRoleActorFactory.TYPE, GroupRoleActorFactory.TYPE};
  281. String[] actorCategories = {"atlassian-user-role-actor", "atlassian-group-role-actor"};
  282. for (String actorFactoryType : actorCategories){
  283. List<String> newProjectRoleActors = new ArrayList<String>();
  284. for (RoleActor actor : projectRoleActors.getRoleActorsByType(actorFactoryType)){
  285. newProjectRoleActors.add(actor.getParameter());
  286. }
  287. projectRoleService.addActorsToProjectRole(currentUser, newProjectRoleActors, projectRole, newprojectObj, actorFactoryType, errorCollection);
  288. }
  289. }
  290. //Copy Issues
  291. JqlQueryBuilder builder = JqlQueryBuilder.newBuilder();
  292. Query query = builder.where().project(srcProject.getId()).endWhere().orderBy().issueKey(SortOrder.ASC).endOrderBy().buildQuery();
  293. SearchRequest searchRequest = new SearchRequest(query);
  294. SearchResults results;
  295. try {
  296. results = searchService.search(currentUser, searchRequest.getQuery(), PagerFilter.getUnlimitedFilter());
  297. for (Issue documentIssue : results.getIssues()) {
  298. Issue issue = issueManager.getIssueObject(documentIssue.getId());
  299. //Clone issues
  300. if (issue != null){
  301. Issue theNewParent = null;
  302. //Clone non sub tasks
  303. if (issue.getParentObject() == null){
  304. theNewParent = CloneIssue(issue, newprojectObj, currentUser, null, lead);
  305. }
  306. //Clone Subtasks
  307. for (Issue subTask : issue.getSubTaskObjects()){
  308. Issue theNewIssue = CloneIssue(subTask, newprojectObj, currentUser, issue, lead);
  309. subTaskManager.createSubTaskIssueLink(theNewParent, theNewIssue, currentUser);
  310. }
  311. }
  312. }
  313. } catch (SearchException e) {
  314. LOGGER.error("Cannot search issues", e);
  315. ProjectCreationException ex = new ProjectCreationException();
  316. ex.errors = Lists.newArrayList(e.getMessage());
  317. throw ex;
  318. } catch (CreateException e) {
  319. LOGGER.error("Cannot create issue", e);
  320. ProjectCreationException ex = new ProjectCreationException();
  321. ex.errors = Lists.newArrayList(e.getMessage());
  322. throw ex;
  323. }
  324. return newprojectObj;
  325. }
  326. private Issue CloneIssue(Issue issue, Project destinationProject, ApplicationUser currentUser, Issue parentIssue, String assignee) throws ProjectCreationException{
  327. MutableIssue newIssue = issueFactory.getIssue();
  328. newIssue.setProjectObject(destinationProject);
  329. copySystemFieldValues(issue, newIssue, parentIssue, assignee);
  330. copyCustomFieldValues(issue, newIssue);
  331. try {
  332. Issue newIssueCreated = issueManager.createIssueObject(jiraUserManager.getUserByName(assignee), newIssue);
  333. reindexIssue(newIssueCreated);
  334. copyLabels(issue,newIssue,currentUser);
  335. return newIssueCreated;
  336. } catch (CreateException e) {
  337. LOGGER.error("Cannot create issue", e);
  338. ProjectCreationException ex = new ProjectCreationException();
  339. ex.errors = Lists.newArrayList(e.getMessage());
  340. throw ex;
  341. }
  342. }
  343. private void copyLabels(Issue issue, MutableIssue newIssue, ApplicationUser user){
  344. for (Label label : issue.getLabels() ){
  345. labelManager.addLabel(user, newIssue.getId(), label.getLabel(), false);
  346. }
  347. }
  348. private void reindexIssue(Issue issue) throws ProjectCreationException{
  349. try {
  350. Boolean wasIndexing = ImportUtils.isIndexIssues();
  351. ImportUtils.setIndexIssues(true);
  352. issueIndexingService.reIndex(issue);
  353. ImportUtils.setIndexIssues(wasIndexing);
  354. } catch (IndexException e) {
  355. LOGGER.error("Cannot reindex issue", e);
  356. ProjectCreationException ex = new ProjectCreationException();
  357. ex.errors = Lists.newArrayList(e.getMessage());
  358. throw ex;
  359. }
  360. }
  361. private void copyCustomFieldValues(Issue issue, MutableIssue newIssue){
  362. List<CustomField> newIssueCustomFields = customFieldManager.getCustomFieldObjects(newIssue);
  363. List<CustomField> issueCustomFields = customFieldManager.getCustomFieldObjects(issue);
  364. for (CustomField cf : issueCustomFields){
  365. if (newIssueCustomFields.contains(cf)){
  366. newIssue.setCustomFieldValue(cf, cf.getValue(issue));
  367. }
  368. }
  369. }
  370. private void copySystemFieldValues(Issue issue, MutableIssue newIssue, Issue parentIssue, String assignee){
  371. String[] systemFields = {"issueTypeId", "projectId", "summary", "assigneeId", "fixVersions", "affectedVersions",
  372. "reporterId", "environment", "description", "priorityId", "dueDate", "originalEstimate", "components",
  373. "securityLevel"
  374. };
  375. //Components
  376. List<ProjectComponent> newComponents = new ArrayList<ProjectComponent>();
  377. for (ProjectComponent component : issue.getComponentObjects()){
  378. ProjectComponent destComponent = projectComponentManager.findByComponentName(newIssue.getProjectObject().getId(), component.getName());
  379. newComponents.add(destComponent);
  380. }
  381. newIssue.setComponent(newComponents);
  382. //AffectedVersions
  383. List<Version> newVersions = new ArrayList<Version>();
  384. for (Version version : issue.getAffectedVersions()){
  385. Version newVersion = versionManager.getVersion(newIssue.getProjectObject().getId(), version.getName());
  386. newVersions.add(newVersion);
  387. }
  388. newIssue.setAffectedVersions(newVersions);
  389. //Fix Versions
  390. List<Version> newFixVersions = new ArrayList<Version>();
  391. for (Version fixVersion : issue.getFixVersions()){
  392. Version newFixVersion = versionManager.getVersion(newIssue.getProjectObject().getId(), fixVersion.getName());
  393. newFixVersions.add(newFixVersion);
  394. }
  395. newIssue.setFixVersions(newFixVersions);
  396. //Security Level
  397. Long securityLevelId = issue.getSecurityLevelId();
  398. if (securityLevelId != null){
  399. if (issueSecuritySchemeManager.getSchemeFor(issue.getProjectObject()) == issueSecuritySchemeManager.getSchemeFor(newIssue.getProjectObject())){
  400. newIssue.setSecurityLevelId(securityLevelId);
  401. }
  402. }
  403. //All the others
  404. newIssue.setIssueTypeId(issue.getIssueTypeObject().getId());
  405. newIssue.setIssueTypeObject(issue.getIssueTypeObject());
  406. newIssue.setSummary(issue.getSummary());
  407. newIssue.setReporterId(issue.getReporterId());
  408. newIssue.setEnvironment(issue.getEnvironment());
  409. newIssue.setDescription(issue.getDescription());
  410. newIssue.setPriorityId(issue.getPriorityObject().getId());
  411. newIssue.setDueDate(issue.getDueDate());
  412. newIssue.setOriginalEstimate(issue.getOriginalEstimate());
  413. //Define issue asignee
  414. if (assignee == null){
  415. newIssue.setAssigneeId(newIssue.getAssigneeId());
  416. }else{
  417. newIssue.setAssignee(jiraUserManager.getUser(assignee));
  418. }
  419. //Define as a subtask if parent object is defined
  420. //Set parent task if one was defined
  421. if (parentIssue != null) {
  422. newIssue.setParentObject(issue);
  423. }
  424. }
  425. private Long[] ConvertLongListToArray(List<Long> values) {
  426. Long[] result = new Long[values.size()];
  427. int i = 0;
  428. for (Long l : values)
  429. result[i++] = l;
  430. return result;
  431. }
  432. }