/src/main/java/com/dionetechnology/jira/plugins/multicascadeselect/admin/EditMultiCascadeSelectOptions.java

https://bitbucket.org/ram_tandukar/multi-cascade-select · Java · 221 lines · 155 code · 54 blank · 12 comment · 18 complexity · 5d17f62510fc94fb2b9f98b1b0209a13 MD5 · raw file

  1. package com.dionetechnology.jira.plugins.multicascadeselect.admin;
  2. import java.util.ArrayList;
  3. import java.util.Arrays;
  4. import java.util.Collection;
  5. import java.util.HashMap;
  6. import java.util.Iterator;
  7. import java.util.LinkedList;
  8. import java.util.List;
  9. import java.util.Map;
  10. import java.util.Set;
  11. import java.util.TreeMap;
  12. import webwork.action.Action;
  13. import webwork.action.ActionContext;
  14. import com.atlassian.jira.config.managedconfiguration.ManagedConfigurationItemService;
  15. import com.atlassian.jira.issue.Issue;
  16. import com.atlassian.jira.issue.IssueImpl;
  17. import com.atlassian.jira.issue.IssueManager;
  18. import com.atlassian.jira.issue.customfields.MultipleSettableCustomFieldType;
  19. import com.atlassian.jira.issue.customfields.impl.CascadingSelectCFType;
  20. import com.atlassian.jira.issue.customfields.manager.OptionsManager;
  21. import com.atlassian.jira.issue.customfields.option.Option;
  22. import com.atlassian.jira.issue.customfields.option.OptionUtils;
  23. import com.atlassian.jira.issue.customfields.option.Options;
  24. import com.atlassian.jira.issue.customfields.view.CustomFieldParams;
  25. import com.atlassian.jira.issue.fields.config.FieldConfig;
  26. import com.atlassian.jira.security.xsrf.RequiresXsrfCheck;
  27. import com.atlassian.jira.user.util.UserUtil;
  28. import com.atlassian.jira.web.action.admin.customfields.AbstractEditConfigurationItemAction;
  29. import com.atlassian.jira.web.action.admin.customfields.EditCustomFieldDefaults;
  30. import com.atlassian.sal.api.websudo.WebSudoRequired;
  31. import com.dionetechnology.jira.plugins.multicascadeselect.MutableOption;
  32. import com.dionetechnology.jira.plugins.multicascadeselect.ao.MultiCSCFEntity;
  33. import com.dionetechnology.jira.plugins.multicascadeselect.ao.MultiCSCFMapping;
  34. import com.dionetechnology.jira.plugins.multicascadeselect.ao.MultiCascadeSelectService;
  35. import com.opensymphony.util.TextUtils;
  36. /**
  37. * Forked from https://github.com/sourcesense/jira-multi-level-cascade-select
  38. */
  39. @WebSudoRequired
  40. public class EditMultiCascadeSelectOptions extends EditCustomFieldMultiCascadeSelectOptions {
  41. // ------------------------------------------------------------------------------------------------------
  42. // Properties
  43. private String value;
  44. private String assignee;
  45. private String selectedValue;
  46. private Map customFieldValuesHolder = new HashMap();
  47. private Options options;
  48. // ----------------------------------------------------------------------------------------------------
  49. // Dependencies
  50. private final IssueManager issueManager;
  51. private final MultiCascadeSelectService multiCascadeSelectService;
  52. private final OptionsManager optionsManager;
  53. private final UserUtil userUtil;
  54. // ----------------------------------------------------------------------------------------------------
  55. // Constructors
  56. public EditMultiCascadeSelectOptions(UserUtil userUtil, IssueManager issueManager, ManagedConfigurationItemService managedConfigurationItemService, MultiCascadeSelectService multiCascadeSelectService, OptionsManager optionsManager) {
  57. super(userUtil, issueManager, managedConfigurationItemService, multiCascadeSelectService, optionsManager);
  58. this.issueManager = issueManager;
  59. this.userUtil = userUtil;
  60. this.optionsManager = optionsManager;
  61. this.multiCascadeSelectService = multiCascadeSelectService;
  62. }
  63. // --------------------------------------------------------------------------------------------------
  64. // Action Methods
  65. @Override
  66. public String doDefault() throws Exception {
  67. setReturnUrl(null);
  68. if (!(getCustomField().getCustomFieldType() instanceof MultipleSettableCustomFieldType))
  69. addErrorMessage(getText("admin.errors.customfields.cannot.set.options", "'" + getCustomField().getCustomFieldType().getName() + "'"));
  70. EditCustomFieldDefaults.populateDefaults(getFieldConfig(), customFieldValuesHolder);
  71. return super.doDefault();
  72. }
  73. public String doEdit() throws Exception
  74. {
  75. setValue(getValue());
  76. return "edit";
  77. }
  78. @RequiresXsrfCheck
  79. public String doUpdate() throws Exception
  80. {
  81. if (!TextUtils.stringSet(value))
  82. {
  83. addError("value", getText("admin.errors.customfields.invalid.select.list.value"));
  84. return ERROR;
  85. }
  86. Options options = getOptions();
  87. Option duplicateOption = options.getOptionForValue(value, getSelectedParentOptionId());
  88. if (duplicateOption != null && !getSelectedOption().getOptionId().equals(duplicateOption.getOptionId()))
  89. {
  90. addError("value", getText("admin.errors.customfields.value.already.exists"));
  91. return ERROR;
  92. }
  93. // add error handling - check if valid user
  94. if (TextUtils.stringSet(assignee)&&!userUtil.userExists(assignee))
  95. {
  96. addError("assignee", getText("User Does not Exist!"));
  97. return ERROR;
  98. }
  99. getOptions().setValue(getSelectedOption(), value);
  100. MultiCSCFMapping mapping = multiCascadeSelectService.getMapping(getSelectedOption().getOptionId());
  101. if (TextUtils.stringSet(assignee)&&userUtil.userExists(assignee))
  102. {
  103. if (mapping != null) {
  104. multiCascadeSelectService.updateMapping(mapping.getID(), assignee);
  105. } else {
  106. multiCascadeSelectService.addMapping(getFieldConfig().getId(), getCustomField().getIdAsLong(), getSelectedOption().getOptionId(), getSelectedParentOptionId(), assignee);
  107. }
  108. } else {
  109. if(assignee==null||assignee.equals("")){
  110. if (mapping != null) {
  111. multiCascadeSelectService.removeMapping(getFieldConfig().getId(), getCustomField().getIdAsLong(),mapping.getID());
  112. }
  113. }
  114. }
  115. return redirectToView();
  116. }
  117. public MultiCSCFMapping getAssigneeMapping(String option) {
  118. return multiCascadeSelectService.getMapping(Long.valueOf(option));
  119. }
  120. public String doControllerEdit() throws Exception
  121. {
  122. setValue(getControllerValue());
  123. return "controlleredit";
  124. }
  125. @RequiresXsrfCheck
  126. public String doControllerUpdate() throws Exception
  127. {
  128. if (!TextUtils.stringSet(value))
  129. {
  130. addError("value", getText("admin.errors.customfields.invalid.select.list.value"));
  131. return ERROR;
  132. }
  133. Option selectedoption;
  134. for (Option option : getOptions().getRootOptions())
  135. {
  136. selectedoption = getOptions().getOptionForValue(selectedValue, option.getOptionId());
  137. log.debug("value"+value);
  138. Option duplicateOption = getOptions().getOptionForValue(value, option.getOptionId());
  139. if (duplicateOption != null)
  140. {
  141. addError("value", getText("admin.errors.customfields.value.already.exists"));
  142. return ERROR;
  143. }
  144. getOptions().setValue(selectedoption, value);
  145. }
  146. multiCascadeSelectService.update(getControllerId(), value);
  147. return redirectToView();
  148. }
  149. public String getValue() {
  150. return value;
  151. }
  152. public void setValue(String value) {
  153. this.value = value;
  154. }
  155. public String getAssignee() {
  156. return assignee;
  157. }
  158. public void setAssignee(String assignee) {
  159. this.assignee = assignee;
  160. }
  161. public String getSelectedValue() {
  162. return selectedValue;
  163. }
  164. public void setSelectedValue(String selectedValue) {
  165. this.selectedValue = selectedValue;
  166. }
  167. }