New example… remember, to add watchers to the ticket, the ticket must be created previously
package example.CloneAndLinkAndAddWatchers import com.atlassian.jira.event.issue.AbstractIssueEventListener import com.atlassian.jira.event.issue.IssueEvent import com.atlassian.jira.user.util.UserUtil import com.atlassian.jira.ComponentManager import com.atlassian.jira.component.ComponentAccessor import com.atlassian.jira.issue.link.IssueLink import com.atlassian.jira.util.ImportUtils import com.atlassian.crowd.embedded.api.User; import com.opensymphony.workflow.WorkflowContext import org.apache.log4j.Category import com.atlassian.jira.issue.customfields.CustomFieldType import com.atlassian.jira.issue.CustomFieldManager import com.atlassian.jira.issue.fields.CustomField import com.atlassian.jira.issue.IssueManager import com.atlassian.jira.project.ProjectManager import com.atlassian.jira.project.Project import com.atlassian.jira.issue.IssueFactory; import com.atlassian.jira.ComponentManager import com.atlassian.jira.project.ProjectManager import com.atlassian.jira.issue.IssueManager import org.ofbiz.core.entity.GenericValue import com.atlassian.jira.issue.watchers.WatcherManager class TaskVersionListener extends AbstractIssueEventListener { Category log = Category.getInstance(TaskVersionListener.class) @Override void workflowEvent(IssueEvent event) { log.setLevel(org.apache.log4j.Level.DEBUG) def issue = event.getIssue() if ( issue.getIssueTypeId() == "XXXXX" ) { // The Issue Type to catch in the Listener def projectName = "YYYYY" //Target project name def issueMgr = ComponentManager.getInstance().getIssueManager() def projectMgr = ComponentManager.getInstance().getProjectManager() String currentUser = event.getUser().getName(); User currentUserObj = ComponentAccessor.getJiraAuthenticationContext().getLoggedInUser(); ComponentManager componentManager=ComponentManager.getInstance() CustomFieldManager customFieldManager = componentManager.getCustomFieldManager() log.debug "IF ISSUE IS TYPE XXXXX CLONE ISSUE TO PROJECT YYYYY WITH SAME FIELDS, ETC" def issueFactory = ComponentManager.getInstance().getIssueFactory() def newissue = issueFactory.getIssue() newissue.setSummary (issue.summary) newissue.setProject (projectMgr.getProjectByName(projectName)) newissue.setIssueTypeId("JJJJ") //The ID of the target Issue Type newissue.description = issue.description newissue.reporter = issue.getReporter() //Set the Project Lead of the target project as assignee of the new ticket def project = projectMgr.getProjectObjByName(projectName) newissue.setAssigneeId(project.getLeadUserKey()) //Copy the fields that you want def cf = null; //ZZZZZ (list) cf = customFieldManager.getCustomFieldObjects(issue).find {it.name == 'ZZZZZ'} newissue.setCustomFieldValue(cf, issue.getCustomFieldValue(cf)) //YYYYYY (date) another way to obtain the custom field cf = customFieldManager.getCustomFieldObject("customfield_NNNNN"); newissue.setCustomFieldValue(cf, issue.getCustomFieldValue(cf)) //XXXXXX (text, numeric, ...) cf = customFieldManager.getCustomFieldObjects(issue).find {it.name == 'XXXXX'} newissue.setCustomFieldValue(cf, issue.getCustomFieldValue(cf)) def params = ["issue":newissue] def subTask = issueMgr.createIssue(currentUserObj, params) def linkMgr = ComponentManager.getInstance().getIssueLinkManager() linkMgr.createIssueLink (newissue.id, issue.id, Long.parseLong("ZZZZZ"),Long.valueOf(1), currentUserObj) //ZZZZZ is the id of the type of link //The watchers must be added once the issue is SAVED (created) project = projectMgr.getProjectObjByName("JJJJJJ") //project to add lead as watcher in the target project WatcherManager watcherManager = componentManager.getWatcherManager() watcherManager.startWatching(project.getLeadUser(), newissue) } } }