PageRenderTime 26ms CodeModel.GetById 34ms RepoModel.GetById 0ms app.codeStats 0ms

/src/main/java/com/stygian/jira/plugins/listeners/DueDateUpdatedEventListener.java

https://bitbucket.org/bhushan154/due-date-indicator
Java | 154 lines | 136 code | 15 blank | 3 comment | 31 complexity | 750c7651023919ae013ddcb355bffff0 MD5 | raw file
  1. package com.stygian.jira.plugins.listeners;
  2. import com.atlassian.jira.bc.issue.IssueService;
  3. import com.atlassian.jira.component.ComponentAccessor;
  4. import com.atlassian.jira.datetime.DateTimeFormatterFactory;
  5. import com.atlassian.jira.event.issue.IssueEvent;
  6. import com.atlassian.jira.event.type.EventType;
  7. import com.atlassian.jira.issue.CustomFieldManager;
  8. import com.atlassian.jira.issue.Issue;
  9. import com.atlassian.jira.issue.IssueInputParameters;
  10. import com.atlassian.jira.issue.changehistory.ChangeHistory;
  11. import com.atlassian.jira.issue.changehistory.ChangeHistoryManager;
  12. import com.atlassian.jira.issue.fields.CustomField;
  13. import com.atlassian.jira.issue.history.ChangeItemBean;
  14. import com.atlassian.jira.issue.util.DefaultIssueChangeHolder;
  15. import com.atlassian.jira.user.ApplicationUser;
  16. import com.atlassian.plugin.spring.scanner.annotation.imports.JiraImport;
  17. import org.joda.time.DateTime;
  18. import org.joda.time.Days;
  19. import org.slf4j.Logger;
  20. import org.slf4j.LoggerFactory;
  21. import org.springframework.beans.factory.DisposableBean;
  22. import org.springframework.beans.factory.InitializingBean;
  23. import org.springframework.beans.factory.annotation.Autowired;
  24. import org.springframework.stereotype.Component;
  25. import com.atlassian.event.api.EventListener;
  26. import com.atlassian.event.api.EventPublisher;
  27. import java.time.Instant;
  28. import java.time.temporal.ChronoUnit;
  29. import java.util.ArrayList;
  30. import java.util.Collection;
  31. import java.util.Date;
  32. import java.sql.Timestamp;
  33. @Component
  34. public class DueDateUpdatedEventListener implements InitializingBean, DisposableBean {
  35. private static final Logger log = LoggerFactory.getLogger(DueDateUpdatedEventListener.class);
  36. @JiraImport
  37. private final EventPublisher eventPublisher;
  38. IssueService issueService = ComponentAccessor.getIssueService();
  39. IssueInputParameters issueInputParameters = issueService.newIssueInputParameters();
  40. DateTimeFormatterFactory dateTimeFormatterFactory = ComponentAccessor.getComponent(DateTimeFormatterFactory.class);
  41. DefaultIssueChangeHolder issueChangeHolder = new DefaultIssueChangeHolder();
  42. IssueService.UpdateValidationResult updateValidationResult = null;
  43. CustomFieldManager customFieldManager = ComponentAccessor.getCustomFieldManager();
  44. @Autowired
  45. public DueDateUpdatedEventListener(EventPublisher eventPublisher) {
  46. super();
  47. this.eventPublisher = eventPublisher;
  48. }
  49. @Override
  50. public void afterPropertiesSet() throws Exception {
  51. log.info("Enabling Due Date Indicator Plugin");
  52. eventPublisher.register(this);
  53. }
  54. @Override
  55. public void destroy() throws Exception {
  56. log.info("Disabling Due Date Indicator plugin");
  57. eventPublisher.unregister(this);
  58. }
  59. @EventListener
  60. public void onIssueEvent(IssueEvent issueEvent) {
  61. ChangeHistoryManager changeHistoryManager = ComponentAccessor.getChangeHistoryManager();
  62. Long eventTypeId = issueEvent.getEventTypeId();
  63. Issue issue = issueEvent.getIssue();
  64. Collection<CustomField> fieldsToUpdate = findDueDateIndicatorFields(customFieldManager.getCustomFieldObjects(issue));
  65. if (eventTypeId.equals(EventType.ISSUE_CREATED_ID)
  66. || eventTypeId.equals(EventType.ISSUE_UPDATED_ID)) {
  67. log.info("Issue Listener from Due Date Indivator Plugin");
  68. if(issueEvent.getChangeLog() != null && issueEvent.getChangeLog().getLong("id") != null){
  69. ChangeHistory history = changeHistoryManager.getChangeHistoryById(issueEvent.getChangeLog().getLong("id"));
  70. for (ChangeItemBean changeItem : history.getChangeItemBeans() ) {
  71. if(changeItem.getField().contains("duedate")){
  72. log.info("Due date has been updated. Custom field will be updated.");
  73. //implement logic here to update due date
  74. if(issue.getResolution() == null)
  75. {
  76. for (CustomField field : fieldsToUpdate) {
  77. String valueToSet = null;
  78. if (changeItem.getTo() != null){
  79. Instant t1 = Instant.now();
  80. Instant t2 = Instant.ofEpochMilli(issue.getDueDate().getTime());
  81. valueToSet = Long.toString(ChronoUnit.MILLIS.between(t1, t2));
  82. }
  83. issueInputParameters.addCustomFieldValue(field.getIdAsLong(), valueToSet);
  84. updateValidationResult = issueService.validateUpdate(ComponentAccessor.getJiraAuthenticationContext().getLoggedInUser(), issue.getId(), issueInputParameters);
  85. updateIssue(updateValidationResult);
  86. }
  87. }
  88. }
  89. }
  90. }
  91. }
  92. if(eventTypeId.equals(EventType.ISSUE_RESOLVED_ID)
  93. || eventTypeId.equals(EventType.ISSUE_CLOSED_ID)
  94. || eventTypeId.equals(EventType.ISSUE_GENERICEVENT_ID)){
  95. //Set Over Due field value to null if issue has been resolved
  96. if(issueEvent.getChangeLog() != null && issueEvent.getChangeLog().getLong("id") != null){
  97. ChangeHistory history = changeHistoryManager.getChangeHistoryById(issueEvent.getChangeLog().getLong("id"));
  98. for (ChangeItemBean changeItem : history.getChangeItemBeans() ) {
  99. if(changeItem.getField().contains("resolution")){
  100. log.info("Resolution been updated. Custom field will be updated.");
  101. //implement logic here to update due date
  102. for (CustomField field : fieldsToUpdate) {
  103. String valueToSet = null;
  104. if (changeItem.getTo() == null){
  105. Instant t1 = Instant.now();
  106. Instant t2 = Instant.ofEpochMilli(issue.getDueDate().getTime());
  107. valueToSet = Long.toString(ChronoUnit.MILLIS.between(t1, t2));
  108. }
  109. issueInputParameters.addCustomFieldValue(field.getIdAsLong(), valueToSet);
  110. updateValidationResult = issueService.validateUpdate(ComponentAccessor.getJiraAuthenticationContext().getLoggedInUser(), issue.getId(), issueInputParameters);
  111. updateIssue(updateValidationResult);
  112. }
  113. }
  114. }
  115. }
  116. }
  117. }
  118. private void updateIssue(IssueService.UpdateValidationResult updateValidationResult){
  119. if (updateValidationResult.isValid()) {
  120. IssueService.IssueResult updateResult = issueService.update(ComponentAccessor.getJiraAuthenticationContext().getLoggedInUser(), updateValidationResult);
  121. if (!updateResult.isValid()) {
  122. log.info("ISSUE has NOT been updated. Errors: {}\n", updateResult.getErrorCollection().toString());
  123. } else {
  124. log.info("ISSUE has been updated.\n");
  125. }
  126. } else {
  127. log.info("ISSUE has NOT been updated. Errors: {}\n", updateValidationResult.getErrorCollection().toString());
  128. }
  129. }
  130. private Collection<CustomField> findDueDateIndicatorFields(Collection<CustomField> fields){
  131. Collection<CustomField> found = new ArrayList<CustomField>();
  132. for(CustomField field:fields){
  133. if(field.getCustomFieldType().getKey().equalsIgnoreCase("com.stygian.jira.plugins.overdue:over-due-custom-field")){
  134. found.add(field);
  135. }
  136. }
  137. return found;
  138. }
  139. }