/src/main/java/com/redradishtech/jira/ccmailer/util/CustomFieldHelperBean.java
Java | 139 lines | 107 code | 13 blank | 19 comment | 16 complexity | a4125b11aed799a13ab1d79e7af32fe3 MD5 | raw file
- package com.redradishtech.jira.ccmailer.util;
- import com.atlassian.jira.ComponentManager;
- import com.atlassian.jira.event.issue.IssueEventDispatcher;
- import com.atlassian.jira.event.type.EventType;
- import com.atlassian.jira.issue.CustomFieldManager;
- import com.atlassian.jira.issue.Issue;
- import com.atlassian.jira.issue.ModifiedValue;
- import com.atlassian.jira.issue.MutableIssue;
- import com.atlassian.jira.issue.fields.CustomField;
- import com.atlassian.jira.issue.history.ChangeItemBean;
- import com.atlassian.jira.issue.index.IndexException;
- import com.atlassian.jira.issue.util.DefaultIssueChangeHolder;
- import com.atlassian.jira.issue.util.IssueChangeHolder;
- import org.apache.log4j.Logger;
- import org.slf4j.MDC;
- import javax.annotation.Nullable;
- import javax.mail.Address;
- import javax.mail.internet.InternetAddress;
- import javax.validation.constraints.NotNull;
- import java.util.HashSet;
- import java.util.List;
- import java.util.Set;
- /**
- * Utility for getting and setting a text custom field composed of a set of comma-separated values.
- */
- public class CustomFieldHelperBean
- {
- private CustomFieldManager customFieldManager;
- private Logger log;
- public CustomFieldHelperBean(CustomFieldManager customFieldManager, Logger log)
- {
- this.customFieldManager = customFieldManager;
- this.log = log;
- }
- /**
- * @param idOrName Custom field ID or name (case-sensitive)
- * @return CustomField or null if none corresponds to the given id/name.
- */
- public @Nullable
- CustomField lookupCustomField(String idOrName)
- {
- assert idOrName != null;
- CustomField ret = null;
- try
- {
- Long ccCustomFieldID = Long.parseLong(idOrName);
- ret = customFieldManager.getCustomFieldObject(ccCustomFieldID);
- } catch (NumberFormatException nfe)
- {
- for (CustomField cf : customFieldManager.getCustomFieldObjects())
- {
- if (cf == null)
- {
- log.error("Custom field "+idOrName+" unexpectedly null");
- }
- if (idOrName.equals(cf.getName())) ret = cf;
- }
- if (ret == null)
- log.error("Invalid custom field name or ID: '" + idOrName);
- }
- return ret;
- }
- /**
- * Merges in a set of new values into the semicolon-separated list for the custom field.
- *
- * @param issue
- * @param cf
- * @param newVals
- */
- public void addCustomFieldValueSet(MutableIssue issue, CustomField cf, Set<Address> newVals)
- {
- changeCustomFieldValueSet(issue, cf, newVals, true);
- }
- public void removeCustomFieldValueSet(MutableIssue issue, CustomField cf, Set<Address> oldVals)
- {
- changeCustomFieldValueSet(issue, cf, oldVals, false);
- }
- public @NotNull
- HashSet<InternetAddress> getCustomFieldValueSet(@NotNull Issue issue, @NotNull CustomField cf)
- {
- MDC.put("issue", issue.getKey());
- MDC.put("cf", cf.getId());
- String cfVal = (String) issue.getCustomFieldValue(cf);
- return CCFieldHelper.split(cfVal);
- }
- // ------------------------------------------------------------------
- // Private methods
- // ------------------------------------------------------------------
- private void changeCustomFieldValueSet(@NotNull MutableIssue issue, @NotNull CustomField cf, Set<Address> vals, boolean toBeAdded)
- {
- MDC.put("issue", issue.getKey());
- MDC.put("cf", cf.getId());
- Set<Address> currentCFValues = new HashSet<Address>();
- currentCFValues.addAll(getCustomFieldValueSet(issue, cf));
- if (toBeAdded) currentCFValues.addAll(vals);
- else currentCFValues.removeAll(vals);
- // Not serialize our new list to a comma-separated string
- StringBuffer buf = new StringBuffer();
- int count = 0;
- for (Address addr : currentCFValues)
- {
- buf.append(addr);
- if (++count != currentCFValues.size()) buf.append(", ");
- }
- IssueChangeHolder changeHolder = new DefaultIssueChangeHolder();
- cf.updateValue(null, issue, new ModifiedValue(issue.getCustomFieldValue(cf), buf.toString()), changeHolder);
- List changeItems = changeHolder.getChangeItems();
- if (!changeItems.isEmpty())
- {
- // reindex and flush caches
- try
- {
- ComponentManager.getInstance().getIndexManager().reIndex(issue);
- } catch (IndexException e)
- {
- log.error("Error reindexing " + issue.getKey() + ": " + e, e);
- }
- IssueEventDispatcher.dispatchEvent(EventType.ISSUE_UPDATED_ID, issue, null, false);
- ChangeItemBean change = (ChangeItemBean) changeItems.get(0);
- if (!(change.getFromString() == null && "".equals(change.getToString())))
- log.debug("Updated " + cf.getName() + " custom field: " + change);
- }
- MDC.remove("cf");
- MDC.remove("issue");
- }
- }