PageRenderTime 46ms CodeModel.GetById 23ms RepoModel.GetById 0ms app.codeStats 0ms

/src/main/java/com/redradishtech/jira/ccmailer/util/CustomFieldHelperBean.java

https://bitbucket.org/redradish/ccmailer-44x
Java | 139 lines | 107 code | 13 blank | 19 comment | 16 complexity | a4125b11aed799a13ab1d79e7af32fe3 MD5 | raw file
  1. package com.redradishtech.jira.ccmailer.util;
  2. import com.atlassian.jira.ComponentManager;
  3. import com.atlassian.jira.event.issue.IssueEventDispatcher;
  4. import com.atlassian.jira.event.type.EventType;
  5. import com.atlassian.jira.issue.CustomFieldManager;
  6. import com.atlassian.jira.issue.Issue;
  7. import com.atlassian.jira.issue.ModifiedValue;
  8. import com.atlassian.jira.issue.MutableIssue;
  9. import com.atlassian.jira.issue.fields.CustomField;
  10. import com.atlassian.jira.issue.history.ChangeItemBean;
  11. import com.atlassian.jira.issue.index.IndexException;
  12. import com.atlassian.jira.issue.util.DefaultIssueChangeHolder;
  13. import com.atlassian.jira.issue.util.IssueChangeHolder;
  14. import org.apache.log4j.Logger;
  15. import org.slf4j.MDC;
  16. import javax.annotation.Nullable;
  17. import javax.mail.Address;
  18. import javax.mail.internet.InternetAddress;
  19. import javax.validation.constraints.NotNull;
  20. import java.util.HashSet;
  21. import java.util.List;
  22. import java.util.Set;
  23. /**
  24. * Utility for getting and setting a text custom field composed of a set of comma-separated values.
  25. */
  26. public class CustomFieldHelperBean
  27. {
  28. private CustomFieldManager customFieldManager;
  29. private Logger log;
  30. public CustomFieldHelperBean(CustomFieldManager customFieldManager, Logger log)
  31. {
  32. this.customFieldManager = customFieldManager;
  33. this.log = log;
  34. }
  35. /**
  36. * @param idOrName Custom field ID or name (case-sensitive)
  37. * @return CustomField or null if none corresponds to the given id/name.
  38. */
  39. public @Nullable
  40. CustomField lookupCustomField(String idOrName)
  41. {
  42. assert idOrName != null;
  43. CustomField ret = null;
  44. try
  45. {
  46. Long ccCustomFieldID = Long.parseLong(idOrName);
  47. ret = customFieldManager.getCustomFieldObject(ccCustomFieldID);
  48. } catch (NumberFormatException nfe)
  49. {
  50. for (CustomField cf : customFieldManager.getCustomFieldObjects())
  51. {
  52. if (cf == null)
  53. {
  54. log.error("Custom field "+idOrName+" unexpectedly null");
  55. }
  56. if (idOrName.equals(cf.getName())) ret = cf;
  57. }
  58. if (ret == null)
  59. log.error("Invalid custom field name or ID: '" + idOrName);
  60. }
  61. return ret;
  62. }
  63. /**
  64. * Merges in a set of new values into the semicolon-separated list for the custom field.
  65. *
  66. * @param issue
  67. * @param cf
  68. * @param newVals
  69. */
  70. public void addCustomFieldValueSet(MutableIssue issue, CustomField cf, Set<Address> newVals)
  71. {
  72. changeCustomFieldValueSet(issue, cf, newVals, true);
  73. }
  74. public void removeCustomFieldValueSet(MutableIssue issue, CustomField cf, Set<Address> oldVals)
  75. {
  76. changeCustomFieldValueSet(issue, cf, oldVals, false);
  77. }
  78. public @NotNull
  79. HashSet<InternetAddress> getCustomFieldValueSet(@NotNull Issue issue, @NotNull CustomField cf)
  80. {
  81. MDC.put("issue", issue.getKey());
  82. MDC.put("cf", cf.getId());
  83. String cfVal = (String) issue.getCustomFieldValue(cf);
  84. return CCFieldHelper.split(cfVal);
  85. }
  86. // ------------------------------------------------------------------
  87. // Private methods
  88. // ------------------------------------------------------------------
  89. private void changeCustomFieldValueSet(@NotNull MutableIssue issue, @NotNull CustomField cf, Set<Address> vals, boolean toBeAdded)
  90. {
  91. MDC.put("issue", issue.getKey());
  92. MDC.put("cf", cf.getId());
  93. Set<Address> currentCFValues = new HashSet<Address>();
  94. currentCFValues.addAll(getCustomFieldValueSet(issue, cf));
  95. if (toBeAdded) currentCFValues.addAll(vals);
  96. else currentCFValues.removeAll(vals);
  97. // Not serialize our new list to a comma-separated string
  98. StringBuffer buf = new StringBuffer();
  99. int count = 0;
  100. for (Address addr : currentCFValues)
  101. {
  102. buf.append(addr);
  103. if (++count != currentCFValues.size()) buf.append(", ");
  104. }
  105. IssueChangeHolder changeHolder = new DefaultIssueChangeHolder();
  106. cf.updateValue(null, issue, new ModifiedValue(issue.getCustomFieldValue(cf), buf.toString()), changeHolder);
  107. List changeItems = changeHolder.getChangeItems();
  108. if (!changeItems.isEmpty())
  109. {
  110. // reindex and flush caches
  111. try
  112. {
  113. ComponentManager.getInstance().getIndexManager().reIndex(issue);
  114. } catch (IndexException e)
  115. {
  116. log.error("Error reindexing " + issue.getKey() + ": " + e, e);
  117. }
  118. IssueEventDispatcher.dispatchEvent(EventType.ISSUE_UPDATED_ID, issue, null, false);
  119. ChangeItemBean change = (ChangeItemBean) changeItems.get(0);
  120. if (!(change.getFromString() == null && "".equals(change.getToString())))
  121. log.debug("Updated " + cf.getName() + " custom field: " + change);
  122. }
  123. MDC.remove("cf");
  124. MDC.remove("issue");
  125. }
  126. }