import com.atlassian.jira.component.ComponentAccessor
import com.atlassian.jira.issue.IssueManager
import com.atlassian.jira.issue.CustomFieldManager
import com.atlassian.jira.project.version.VersionManager
import com.atlassian.jira.project.version.Version
import com.atlassian.jira.issue.Issue
import com.atlassian.jira.security.JiraAuthenticationContext;
import com.atlassian.jira.event.type.EventDispatchOption;
import com.atlassian.jira.bc.issue.search.SearchService;
import com.atlassian.jira.issue.search.SearchProvider;
import com.atlassian.jira.jql.parser.JqlQueryParser;
import com.atlassian.jira.bc.issue.IssueService;
import com.atlassian.jira.user.ApplicationUser;
import com.atlassian.jira.web.bean.PagerFilter;
import com.atlassian.jira.issue.MutableIssue;
import com.atlassian.jira.user.util.UserUtil;
import com.atlassian.jira.util.ImportUtils;
import groovy.transform.Field;
import com.atlassian.jira.workflow.WorkflowTransitionUtilImpl;
import com.atlassian.jira.issue.index.IssueIndexingService;
import com.atlassian.jira.workflow.WorkflowTransitionUtil;
import com.opensymphony.workflow.loader.ActionDescriptor;
import com.opensymphony.workflow.loader.StepDescriptor;
import com.atlassian.jira.workflow.WorkflowManager;
import com.opensymphony.workflow.WorkflowContext;
import com.atlassian.jira.workflow.JiraWorkflow;
import com.atlassian.jira.util.ErrorCollection;
import com.atlassian.jira.util.JiraUtils;
import com.atlassian.jira.issue.DocumentIssueImpl
import com.atlassian.jira.workflow.IssueWorkflowManager
@field boolean writeDebugLogs = true;
@field ApplicationUser user = ComponentAccessor.getJiraAuthenticationContext().getLoggedInUser();
@field SearchService searchService = ComponentAccessor.getComponent(SearchService.class);
@field IssueManager issueManager = ComponentAccessor.getIssueManager();
@field UserUtil userUtil = ComponentAccessor.getUserUtil();
@field IssueIndexingService issueIndexingService = ComponentAccessor.getComponent(IssueIndexingService);
@field WorkflowManager workflowManager = ComponentAccessor.getComponent(WorkflowManager);
def issue = event.issue
def relDateField = ComponentAccessor.getCustomFieldManager().getCustomFieldObjectsByName('Release Date').first()
def startDateField = ComponentAccessor.getCustomFieldManager().getCustomFieldObjectsByName('Start Date').first()
def versNameField = ComponentAccessor.getCustomFieldManager().getCustomFieldObjectsByName('Version Name').first()
def actionField = ComponentAccessor.getCustomFieldManager().getCustomFieldObjectsByName('Action').first()
def versManager = ComponentAccessor.getVersionManager()
def actionValue = issue.getCustomFieldValue(actionField) as String
def startDateValue = issue.getCustomFieldValue(startDateField) as Date
def relDateValue = issue.getCustomFieldValue(relDateField) as Date
def versNameValue = issue.getCustomFieldValue(versNameField) as String
def projId = issue.getProjectId()
def versionList = issue.getFixVersions()
MutableIssue mutIssue
if (actionValue == 'Create')
{
versManager.createVersion(versNameValue, startDateValue, relDateValue, issue.description, projId, null, false)
}
if (actionValue == 'Update')
{
versionList.each
{
if (issue.description || versNameValue)
{
def updateDesc = issue.description ? issue.description : it.getDescription()
def updateVersName = versNameValue ? versNameValue : it.getName()
it = versManager.editVersionDetails(it, updateVersName, updateDesc)
versManager.update(it)
}
if (relDateValue)
{
it = versManager.editVersionReleaseDate(it, relDateValue)
versManager.update(it)
}
if (startDateValue)
{
it = versManager.editVersionStartDate(it, startDateValue)
versManager.update(it)
}
}
}
if (actionValue == 'Release')
{
versManager.releaseVersions(versionList, true)
versionList.each
{
def issuesInVersion = versManager.getIssuesWithFixVersion(it)
issuesInVersion.each
{
def item = issueManager.getIssueObject(it.getKey());
mutIssue = (MutableIssue) item
tryTransitionIssue(mutIssue, "Done")
}
}
}
int getTransitionIdByName(MutableIssue issue, String transitionName)
{
writeLog("Trying to get transition ID for " + transitionName)
def issueWorkflow = ComponentAccessor.getComponentOfType(IssueWorkflowManager.class);
Collection<ActionDescriptor> actions = issueWorkflow.getAvailableActions(issue, user);
for (action in actions)
{
def stepName = action.getName();
if (stepName != transitionName)
{
writeLog(stepName + " did not match " + transitionName)
continue;
}
writeLog("Found " + stepName)
return action.getId();
}
writeLog("didn't find any step name match")
if (issue.status.name != "Done")
{
issue.setFixVersions(null)
ComponentAccessor.getIssueManager().updateIssue(user, issue, EventDispatchOption.DO_NOT_DISPATCH, false)
reindexIssue(issue)
}
return -1;
}
void tryTransitionIssue(MutableIssue issue, String transitionName)
{
writeLog("Trying to transition issue")
def actionId = getTransitionIdByName(issue, transitionName);
if (actionId <= 0)
{
return;
}
def workflowTransitionUtil = (WorkflowTransitionUtil) JiraUtils.loadComponent(WorkflowTransitionUtilImpl.class);
Map<String, String> params = new HashMap<String, String>();
workflowTransitionUtil.setUserkey(user.getKey());
workflowTransitionUtil.setAction(actionId);
workflowTransitionUtil.setIssue(issue);
workflowTransitionUtil.setParams(params);
def errs = workflowTransitionUtil.validate();
if (hasErrors(errs))
{
return;
}
workflowTransitionUtil.progress();
def commentManager = ComponentAccessor.getCommentManager()
def commentBody = "Issue has been transitioned to ${transitionName} because the sprint was started"
commentManager.create(issue, user, commentBody, false)
reindexIssue(issue);
}
void reindexIssue(Issue issue)
{
boolean wasIndexing = ImportUtils.isIndexIssues();
ImportUtils.setIndexIssues(true);
issueIndexingService.reIndex(issueManager.getIssueObject(issue.id));
ImportUtils.setIndexIssues(wasIndexing);
}
boolean hasErrors(ErrorCollection errs)
{
if (errs == null)
{
return false;
}
int errCount = 0;
def errMaps = errs.getErrors();
def errMsgs = errs.getErrorMessages();
if (errMsgs != null)
{
errCount = errCount + errMsgs.size();
}
if (errMaps != null)
{
errCount = errCount + errMaps.size();
}
if (errCount == 0)
{
return false;
}
for(errMsg in errMsgs)
{
log.error(errMsg);
}
for(errMap in errMaps)
{
log.error("Field ${errMap.key} Error: ${errMap.value}");
}
return true;
}
void writeLog(String note)
{
writeLog(note, writeDebugLogs);
}
void writeLog(String note, boolean write)
{
if (!write)
{
return;
}
log.error(note);
}