@Override public void validate( final ErrorCollection errors, final BulkMoveOperation bulkMoveOperation, final ApplicationUser applicationUser) { if (!regularIssues.isEmpty() && regularOptions.isEmpty()) { errors.addErrorMessage( authenticationContext .getI18nHelper() .getText("admin.errors.bean.issues.affected", "" + regularIssues.size())); } if (!subTaskIssues.isEmpty() && subTaskOptions.isEmpty()) { errors.addErrorMessage( authenticationContext .getI18nHelper() .getText("admin.errors.bean.subtasks.affected", "" + subTaskIssues.size())); } // Validate permission Set entries = bulkEditBeans.entrySet(); for (final Object entry1 : entries) { Map.Entry entry = (Map.Entry) entry1; IssueContext issueContext = (IssueContext) entry.getKey(); BulkEditBean bulkEditBean = (BulkEditBean) entry.getValue(); if (!bulkMoveOperation.canPerform(bulkEditBean, applicationUser)) { errors.addErrorMessage( authenticationContext .getI18nHelper() .getText( "admin.errors.bean.no.permission", issueContext.getProject().getString("name"), issueContext.getIssueTypeObject().getName())); } } }
/** * Initialises this MultiBulkMoveBean given a list of issues. * * <p>If this MultiBulkMoveBean links a BulkEditBean with parent issues to BulkEditBeans with * subtasks, then include the parent BulkEditBean in the parentBulkEditBean parameter. Otherwise * you can pass null. * * @param issues Issues for this MultiBulkMoveBean. * @param parentBulkEditBean If this MultiBulkMoveBean represents subtasks, then this is the * BulkEditBean that contains the parents of the subtasks, otherwise null. */ public void initFromIssues(List issues, BulkEditBean parentBulkEditBean) { // Ensure that the order is kept issuesInContext = (ListOrderedMap) ListOrderedMap.decorate(new MultiHashMap()); regularIssues = new ListOrderedMap(); subTaskIssues = new ArrayList<Issue>(); // First pass stores att the for (final Object issue2 : issues) { MutableIssue issue = (MutableIssue) issue2; if (!issue.isSubTask()) { regularIssues.put(issue.getId(), issue); } else { subTaskIssues.add(issue); } } // Split it up by context, also check special rule that you can't move sub tasks & its parent // all in the same go for (final Object issue1 : issues) { MutableIssue issue = (MutableIssue) issue1; // NOTE: we only do this for the bulk move operation, this is likely the correct behavior for // the // bulk move operation but I am certain that it is not correct for the bulk migrate operation // JRA-10244. // In bulk move the wizard will prompt the user with subtask information once it has collected // the project // information about the parent issues, this is not need in the the issue type scheme // migration since you // will never be changing the project // TODO: Why test for operation name? if (BulkMigrateOperation.OPERATION_NAME.equals(operationName) && issue.isSubTask() && regularIssues.containsKey(issue.getParentId())) { log.info( "Sub issue: " + issue.getKey() + " : discarded since parent was also present in the bulk move"); subTasksDiscarded++; } else { issuesInContext.put( new IssueContextImpl(issue.getProjectObject(), issue.getIssueTypeObject()), issue); } } // Set the bulk edit bean.. sort the keys by project bulkEditBeans = new ListOrderedMap(); List keys = new ArrayList(issuesInContext.keySet()); Collections.sort(keys); for (final Object key : keys) { IssueContext context = (IssueContext) key; Collection issuesForContext = (Collection) issuesInContext.get(context); BulkEditBean bulkEditBean = new BulkEditBeanImpl(issueManager); bulkEditBean.initSelectedIssues(issuesForContext); bulkEditBean.setOperationName(operationName); bulkEditBean.setTargetProject(context.getProjectObject()); bulkEditBean.setTargetIssueTypeId( context.getIssueTypeObject() != null ? context.getIssueTypeObject().getId() : null); // Set the Parent BulkEditBean - used by subtask BulkEditBean's to get to the new version of // the subtask's parents. bulkEditBean.setParentBulkEditBean(parentBulkEditBean); bulkEditBeans.put(context, bulkEditBean); } }