PageRenderTime 29ms CodeModel.GetById 1ms RepoModel.GetById 0ms app.codeStats 0ms

/jira-project/jira-components/jira-core/src/main/java/com/atlassian/jira/web/action/admin/issuetypes/pro/SelectIssueTypeSchemeForProject.java

https://bitbucket.org/ahmed_bilal_360factors/jira7-core
Java | 294 lines | 232 code | 47 blank | 15 comment | 44 complexity | 0bcd2137a6d5e661c7268ce46c4950a2 MD5 | raw file
Possible License(s): Apache-2.0
  1. package com.atlassian.jira.web.action.admin.issuetypes.pro;
  2. import com.atlassian.collectors.CollectorsUtil;
  3. import com.atlassian.core.util.collection.EasyList;
  4. import com.atlassian.jira.bulkedit.operation.BulkMoveOperation;
  5. import com.atlassian.jira.component.ComponentAccessor;
  6. import com.atlassian.jira.config.ConstantsManager;
  7. import com.atlassian.jira.entity.WithFunctions;
  8. import com.atlassian.jira.issue.IssueConstant;
  9. import com.atlassian.jira.issue.IssueManager;
  10. import com.atlassian.jira.issue.fields.FieldManager;
  11. import com.atlassian.jira.issue.fields.config.FieldConfigScheme;
  12. import com.atlassian.jira.issue.fields.config.manager.FieldConfigSchemeManager;
  13. import com.atlassian.jira.issue.fields.config.manager.IssueTypeSchemeManager;
  14. import com.atlassian.jira.issue.fields.option.IssueConstantOption;
  15. import com.atlassian.jira.issue.fields.option.OptionSetManager;
  16. import com.atlassian.jira.issue.fields.option.ProjectOption;
  17. import com.atlassian.jira.issue.issuetype.IssueType;
  18. import com.atlassian.jira.issue.search.SearchException;
  19. import com.atlassian.jira.issue.search.SearchProvider;
  20. import com.atlassian.jira.project.Project;
  21. import com.atlassian.jira.project.ProjectManager;
  22. import com.atlassian.jira.security.xsrf.RequiresXsrfCheck;
  23. import com.atlassian.jira.util.ExceptionUtil;
  24. import com.atlassian.jira.web.action.admin.issuetypes.IssueTypeManageableOption;
  25. import com.atlassian.query.Query;
  26. import com.atlassian.sal.api.websudo.WebSudoRequired;
  27. import com.google.common.collect.Iterables;
  28. import com.google.common.collect.Lists;
  29. import org.apache.commons.collections.CollectionUtils;
  30. import org.apache.commons.collections.Predicate;
  31. import org.apache.commons.collections.Transformer;
  32. import org.apache.commons.collections.map.ListOrderedMap;
  33. import java.util.ArrayList;
  34. import java.util.Collection;
  35. import java.util.List;
  36. import java.util.Map;
  37. import java.util.stream.Collectors;
  38. @WebSudoRequired
  39. public class SelectIssueTypeSchemeForProject extends AssociateIssueTypeSchemes {
  40. // ------------------------------------------------------------------------------------------------------- Constants
  41. private static final String CREATE_SCHEME = "createScheme";
  42. private static final String CHOOSE_SCHEME = "chooseScheme";
  43. private static final String CHOOSE_PROJECT = "chooseProject";
  44. // ------------------------------------------------------------------------------------------------- Type Properties
  45. private Long projectId;
  46. private String createType;
  47. private Long sameAsProjectId;
  48. private String[] selectedOptions;
  49. // ----------------------------------------------------------------------------------------------- Cached Properties
  50. private long subTaskCount = -1;
  51. private long standardIssuesCount = -1;
  52. // ---------------------------------------------------------------------------------------------------- Dependencies
  53. // ---------------------------------------------------------------------------------------------------- Constructors
  54. public SelectIssueTypeSchemeForProject(FieldConfigSchemeManager configSchemeManager,
  55. IssueTypeSchemeManager issueTypeSchemeManager, FieldManager fieldManager, OptionSetManager optionSetManager,
  56. IssueTypeManageableOption manageableOptionType, BulkMoveOperation bulkMoveOperation,
  57. SearchProvider searchProvider, ProjectManager projectManager, IssueManager issueManager) {
  58. super(configSchemeManager, issueTypeSchemeManager, fieldManager, optionSetManager, manageableOptionType,
  59. bulkMoveOperation, searchProvider, projectManager, issueManager);
  60. }
  61. // -------------------------------------------------------------------------------------------------- Action Methods
  62. public String doDefault() throws Exception {
  63. FieldConfigScheme currentScheme = getCurrentIssueTypeScheme();
  64. if (currentScheme != null) {
  65. setSchemeId(currentScheme.getId());
  66. }
  67. setCreateType(CHOOSE_SCHEME);
  68. return INPUT;
  69. }
  70. protected void doValidation() {
  71. if (CREATE_SCHEME.equals(getCreateType())) {
  72. FieldConfigScheme existingAutoCreatedScheme = getExistingAutoCreatedScheme();
  73. if (existingAutoCreatedScheme != null) {
  74. addErrorMessage(getText("admin.errors.already.an.issue.type.scheme.with.that.name"));
  75. }
  76. // Validate that you've chosen the minimum
  77. if (getSelectedOptions() != null) {
  78. boolean hasNormalIssueType = false;
  79. boolean hasSubTaskIssueType = false;
  80. for (int i = 0; i < getSelectedOptions().length; i++) {
  81. String id = getSelectedOptions()[i];
  82. IssueType issueType = ComponentAccessor.getConstantsManager().getIssueTypeObject(id);
  83. if (!issueType.isSubTask()) {
  84. hasNormalIssueType = true;
  85. } else {
  86. hasSubTaskIssueType = true;
  87. }
  88. }
  89. if (!hasNormalIssueType) {
  90. addError("selectedOptions", getText("admin.errors.must.select.at.least.one.standard.issue.type"));
  91. }
  92. try {
  93. if (!hasSubTaskIssueType && getSubTaskIssues() > 0) {
  94. addError("selectedOptions", getText("admin.errors.project.has.subtasks", "" + getSubTaskIssues()));
  95. }
  96. } catch (SearchException e) {
  97. addErrorMessage(getText("admin.projects.issuetypescheme.error.sever", ExceptionUtil.getExceptionAsHtml(e)));
  98. }
  99. } else {
  100. addError("selectedOptions", getText("admin.errors.must.select.at.least.one.standard.issue.type"));
  101. }
  102. } else if (CHOOSE_PROJECT.equals(getCreateType())) {
  103. if (sameAsProjectId == null) {
  104. addError("sameAsProjectId", getText("admin.projects.issuetypescheme.error.must.select.project"));
  105. }
  106. }
  107. }
  108. @RequiresXsrfCheck
  109. protected String doExecute() throws Exception {
  110. // If is create scheme then create it!
  111. if (CREATE_SCHEME.equals(getCreateType())) {
  112. FieldConfigScheme createdScheme = issueTypeSchemeManager.create(getDefaultNameForNewScheme(), "", EasyList.build(getSelectedOptions()));
  113. setConfigScheme(createdScheme);
  114. } else if (CHOOSE_PROJECT.equals(getCreateType())) {
  115. FieldConfigScheme schemeOfSelectedProject = configSchemeManager.getFieldConfigScheme(sameAsProjectId);
  116. setConfigScheme(schemeOfSelectedProject);
  117. }
  118. // Sets the value of the config scheme
  119. if (getCurrentIssueTypeScheme().equals(getConfigScheme())) {
  120. return getRedirect("/plugins/servlet/project-config/" + getProject().getKey() + "/issuetypes");
  121. } else if (getConfigScheme().isGlobal()) { // If the target scheme is global..
  122. // We need to remove from the old config
  123. setConfigScheme(getCurrentIssueTypeScheme());
  124. FieldConfigScheme configScheme = getConfigScheme();
  125. final List<Project> projectsList = Lists.newArrayList(configScheme.getAssociatedProjectObjects());
  126. projectsList.remove(getProject());
  127. setProjects(projectsList);
  128. String result = super.doExecute(false);
  129. if (result.equals(super.NO_REDIRECT)) {
  130. return getRedirect("/plugins/servlet/project-config/" + getProject().getKey() + "/issuetypes");
  131. } else {
  132. return result;
  133. }
  134. } else {
  135. // Sets the value of the projects
  136. FieldConfigScheme configScheme = getConfigScheme();
  137. final List<Project> projectsList;
  138. List<Project> associatedProjects = configScheme.getAssociatedProjectObjects();
  139. if (associatedProjects != null && !associatedProjects.isEmpty()) {
  140. projectsList = new ArrayList(associatedProjects);
  141. } else {
  142. projectsList = new ArrayList(1);
  143. }
  144. projectsList.add(getProject());
  145. Long[] projectIds = Lists.newArrayList(Iterables.transform(projectsList, WithFunctions.getId())).toArray(new Long[projectsList.size()]);
  146. setProjects(projectIds);
  147. String result = super.doExecute(false);
  148. if (result.equals(super.NO_REDIRECT)) {
  149. return getRedirect("/plugins/servlet/project-config/" + getProject().getKey() + "/issuetypes");
  150. } else {
  151. return result;
  152. }
  153. }
  154. }
  155. // --------------------------------------------------------------------------------------------- View Helper Methods
  156. public Project getProject() {
  157. return projectManager.getProjectObj(getProjectId());
  158. }
  159. public FieldConfigScheme getCurrentIssueTypeScheme() {
  160. return issueTypeSchemeManager.getConfigScheme(getProject());
  161. }
  162. // --------------------------------------------------------------------------------------------- View Helper Methods
  163. public Collection getAllProjects() {
  164. return CollectionUtils.select(super.getAllProjects(), new Predicate() {
  165. public boolean evaluate(Object object) {
  166. ProjectOption projectOption = (ProjectOption) object;
  167. return !getProjectId().toString().equals(projectOption.getId());
  168. }
  169. });
  170. }
  171. public List getAllSchemes() {
  172. return issueTypeSchemeManager.getAllSchemes();
  173. }
  174. public FieldConfigScheme getConfigSchemeForProject(String project) {
  175. return issueTypeSchemeManager.getConfigScheme(projectManager.getProjectObjByName(project));
  176. }
  177. public Map getTypeOptions() throws Exception {
  178. ListOrderedMap typeOptions = new ListOrderedMap();
  179. typeOptions.put(CHOOSE_SCHEME, getText("admin.projects.issuetypescheme.radio1"));
  180. if (!getAllProjects().isEmpty()) {
  181. typeOptions.put(CHOOSE_PROJECT, getText("admin.projects.issuetypescheme.radio2"));
  182. }
  183. typeOptions.put(CREATE_SCHEME, getText("admin.projects.issuetypescheme.radio4"));
  184. return typeOptions;
  185. }
  186. public String getDefaultNameForNewScheme() {
  187. return getText("admin.projects.issuetypescheme.new.issue.type", getProject().getName());
  188. }
  189. public Collection<IssueConstantOption> getAllOptions() {
  190. final String fieldId = getManageableOption().getFieldId();
  191. final Collection<? extends IssueConstant> constants = ComponentAccessor.getConstantsManager().getConstantObjects(fieldId);
  192. if (constants == null) {
  193. return new ArrayList<>();
  194. }
  195. return constants.stream()
  196. .map(IssueConstantOption::new)
  197. .collect(CollectorsUtil.toNewArrayListWithSizeOf(constants));
  198. }
  199. public long getSubTaskIssues() throws SearchException {
  200. if (subTaskCount == -1) {
  201. Query query = getQuery(EasyList.build(getProjectId()), EasyList.build(ConstantsManager.ALL_SUB_TASK_ISSUE_TYPES));
  202. subTaskCount = searchProvider.searchCount(query, getLoggedInUser());
  203. }
  204. return subTaskCount;
  205. }
  206. public long getStandardIssues() throws SearchException {
  207. if (standardIssuesCount == -1) {
  208. Query query = getQuery(EasyList.build(getProjectId()), EasyList.build(ConstantsManager.ALL_STANDARD_ISSUE_TYPES));
  209. standardIssuesCount = searchProvider.searchCount(query, getLoggedInUser());
  210. }
  211. return standardIssuesCount;
  212. }
  213. public FieldConfigScheme getExistingAutoCreatedScheme() {
  214. Collection c = CollectionUtils.select(issueTypeSchemeManager.getAllSchemes(), new FieldConfigPredicate(null, getDefaultNameForNewScheme()));
  215. if (c != null && !c.isEmpty()) {
  216. return (FieldConfigScheme) c.iterator().next();
  217. } else {
  218. return null;
  219. }
  220. }
  221. // -------------------------------------------------------------------------------------- Basic accessors & mutators
  222. public Long getProjectId() {
  223. return projectId;
  224. }
  225. public void setProjectId(Long projectId) {
  226. this.projectId = projectId;
  227. }
  228. public String getCreateType() {
  229. return createType;
  230. }
  231. public void setCreateType(String createType) {
  232. this.createType = createType;
  233. }
  234. public Long getSameAsProjectId() {
  235. return sameAsProjectId;
  236. }
  237. public void setSameAsProjectId(Long sameAsProjectId) {
  238. this.sameAsProjectId = sameAsProjectId;
  239. }
  240. public String[] getSelectedOptions() {
  241. return selectedOptions;
  242. }
  243. public void setSelectedOptions(String[] selectedOptions) {
  244. this.selectedOptions = selectedOptions;
  245. }
  246. // -------------------------------------------------------------------------------------------------- Private helper
  247. }