void validateAndPopulateParamsForWorkflowTransition( ApplicationUser user, MutableIssue issue, IssueInputParameters issueInputParameters, Map<String, Object> fieldValuesHolder, OperationContext operationContext, ErrorCollection errorCollection, I18nHelper i18n, FieldScreenRenderer fieldScreenRenderer, int workflowActionId) { String currentIssueStatus = issue.getStatusObject().getId(); try { // JRA-40310: When making a workflow transition, we want to make validations and check permissions in the new status of the issue, not the old one String nextIssueStatus = workflowManager.getNextStatusIdForAction(issue, workflowActionId); issue.setStatusId(nextIssueStatus); validateAndPopulateParams(user, issue, issueInputParameters, fieldValuesHolder, operationContext, errorCollection, i18n, fieldScreenRenderer); } finally { issue.setStatusId(currentIssueStatus); } }
public void execute(Map transientVars, Map args, PropertySet ps) throws StoreException { MutableIssue issue = (MutableIssue) transientVars.get("issue"); WorkflowEntry entry = (WorkflowEntry) transientVars.get("entry"); SimpleStep step = (SimpleStep) ((WorkflowStore) transientVars.get("store")).findCurrentSteps(entry.getId()).get(0); WorkflowDescriptor descriptor = (WorkflowDescriptor) transientVars.get("descriptor"); StepDescriptor stepDescriptor = descriptor.getStep(step.getStepId()); Status oldStatus = issue.getStatus(); Status newStatus = ComponentAccessor.getConstantsManager().getStatus((String) stepDescriptor.getMetaAttributes().get("jira.status.id")); // Update issue issue.setStatusId(newStatus.getId()); // Generate status change item List changeItems = (List) transientVars.get("changeItems"); if (changeItems == null) { changeItems = new LinkedList(); } String from = null; String fromString = null; if (oldStatus != null) { from = oldStatus.getId(); fromString = oldStatus.getName(); } String to = newStatus.getId(); String toString = newStatus.getName(); changeItems.add(new ChangeItemBean(ChangeItemBean.STATIC_FIELD, IssueFieldConstants.STATUS, from, fromString, to, toString)); transientVars.put("changeItems", changeItems); }
private void updateStatus(MutableIssue issue, String fieldValue, List changeItems) { Status oldStatus = issue.getStatusObject(); issue.setStatusId(fieldValue); Status newStatus = issue.getStatusObject(); if (!Objects.equal(oldStatus, newStatus)) { if (oldStatus != null) { changeItems.add(new ChangeItemBean(ChangeItemBean.STATIC_FIELD, IssueFieldConstants.STATUS, oldStatus.getId(), oldStatus.getName(), newStatus.getId(), newStatus.getName())); } else { changeItems.add(new ChangeItemBean(ChangeItemBean.STATIC_FIELD, IssueFieldConstants.STATUS, null, null, newStatus.getId(), newStatus.getName())); } } }
/** * Migrates given issue to new workflow and sets new status on it. * * @param issue issue to migrate * @param newWorkflow new workflow * @param status new status * @throws WorkflowException if migration fails */ public void migrateIssueToWorkflow(MutableIssue issue, JiraWorkflow newWorkflow, Status status) throws WorkflowException { final GenericValue issueGV = issue.getGenericValue(); migrateIssueToWorkflow(issueGV, newWorkflow, status != null ? ((StatusImpl) status).getGenericValue() : null); issue.setWorkflowId(issueGV.getLong("workflowId")); issue.setStatusId(issueGV.getString("status")); }
WorkflowDescriptor descriptor = (WorkflowDescriptor) transientVars.get("descriptor"); StepDescriptor stepDescriptor = descriptor.getStep(step.getStepId()); issue.setStatusId((String) stepDescriptor.getMetaAttributes().get("jira.status.id"));
/** * Get the issue with updated Issue type and status. * Subclasses can over-ride if they need to set their own fields. * E.g Issue to sub-task conversion sets the new parent issue. * Security level remains intact. * * @return Cloned issue with updated issue ype and status */ protected MutableIssue getTargetIssueObjectWithSecurityLevel() { final ConvertIssueBean bean = getBean(); MutableIssue targetIssue = issueManager.getIssueObject(getIssue().getId()); targetIssue = issueFactory.cloneIssueNoParent(targetIssue); targetIssue.setIssueTypeId(bean.getIssueType()); if (bean.getTargetStatusId() != null) { targetIssue.setStatusId(bean.getTargetStatusId()); } return targetIssue; }
private List migrateSubTask(final Issue originalSubtask, final MutableIssue targetSubtask) throws GenericEntityException { ArrayList subTaskChangeItems = new ArrayList(); // update the target status if the original status is not valid in the target workflow if (!isTaskStatusValid(targetSubtask.getIssueTypeId(), targetSubtask.getStatusObject().getId())) { // Retrieve target status of subtask in new workflow from moveissuebean String subTaskTypeKey = getPrefixTaskStatusId(targetSubtask.getIssueTypeId(), targetSubtask.getStatusObject().getId()); Map taskTargetStatusMap = getMoveIssueBean().getTaskTargetStatusHolder(); targetSubtask.setStatusId((String) taskTargetStatusMap.get(subTaskTypeKey)); subTaskChangeItems.add(new ChangeItemBean(ChangeItemBean.STATIC_FIELD, IssueFieldConstants.STATUS, originalSubtask.getStatusObject().getId(), originalSubtask.getStatusObject().getName(), targetSubtask.getStatusObject().getId(), targetSubtask.getStatusObject().getName())); } // Migrate the subtask to the new status in the target workflow and create a changelog if (!isWorkflowMatch(originalSubtask.getIssueTypeId(), targetSubtask.getIssueTypeId())) { migrateIssueToWorkflow(targetSubtask, originalSubtask.getIssueTypeId(), getWorkflowForType(getTargetPid(), targetSubtask.getIssueTypeId()), targetSubtask.getStatus()); subTaskChangeItems.add(new ChangeItemBean(ChangeItemBean.STATIC_FIELD, "Workflow", originalSubtask.getWorkflowId().toString(), getWorkflowManager().getWorkflow(originalSubtask.getGenericValue()).getName(), targetSubtask.getWorkflowId().toString(), getWorkflowForType(getTargetPid(), targetSubtask.getIssueTypeId()).getName())); } return subTaskChangeItems; }