/src/main/java/com/stygian/jira/plugins/listeners/DueDateUpdatedEventListener.java
Java | 154 lines | 136 code | 15 blank | 3 comment | 31 complexity | 750c7651023919ae013ddcb355bffff0 MD5 | raw file
- package com.stygian.jira.plugins.listeners;
- import com.atlassian.jira.bc.issue.IssueService;
- import com.atlassian.jira.component.ComponentAccessor;
- import com.atlassian.jira.datetime.DateTimeFormatterFactory;
- import com.atlassian.jira.event.issue.IssueEvent;
- import com.atlassian.jira.event.type.EventType;
- import com.atlassian.jira.issue.CustomFieldManager;
- import com.atlassian.jira.issue.Issue;
- import com.atlassian.jira.issue.IssueInputParameters;
- import com.atlassian.jira.issue.changehistory.ChangeHistory;
- import com.atlassian.jira.issue.changehistory.ChangeHistoryManager;
- import com.atlassian.jira.issue.fields.CustomField;
- import com.atlassian.jira.issue.history.ChangeItemBean;
- import com.atlassian.jira.issue.util.DefaultIssueChangeHolder;
- import com.atlassian.jira.user.ApplicationUser;
- import com.atlassian.plugin.spring.scanner.annotation.imports.JiraImport;
- import org.joda.time.DateTime;
- import org.joda.time.Days;
- import org.slf4j.Logger;
- import org.slf4j.LoggerFactory;
- import org.springframework.beans.factory.DisposableBean;
- import org.springframework.beans.factory.InitializingBean;
- import org.springframework.beans.factory.annotation.Autowired;
- import org.springframework.stereotype.Component;
- import com.atlassian.event.api.EventListener;
- import com.atlassian.event.api.EventPublisher;
- import java.time.Instant;
- import java.time.temporal.ChronoUnit;
- import java.util.ArrayList;
- import java.util.Collection;
- import java.util.Date;
- import java.sql.Timestamp;
- @Component
- public class DueDateUpdatedEventListener implements InitializingBean, DisposableBean {
- private static final Logger log = LoggerFactory.getLogger(DueDateUpdatedEventListener.class);
- @JiraImport
- private final EventPublisher eventPublisher;
- IssueService issueService = ComponentAccessor.getIssueService();
- IssueInputParameters issueInputParameters = issueService.newIssueInputParameters();
- DateTimeFormatterFactory dateTimeFormatterFactory = ComponentAccessor.getComponent(DateTimeFormatterFactory.class);
- DefaultIssueChangeHolder issueChangeHolder = new DefaultIssueChangeHolder();
- IssueService.UpdateValidationResult updateValidationResult = null;
- CustomFieldManager customFieldManager = ComponentAccessor.getCustomFieldManager();
- @Autowired
- public DueDateUpdatedEventListener(EventPublisher eventPublisher) {
- super();
- this.eventPublisher = eventPublisher;
- }
- @Override
- public void afterPropertiesSet() throws Exception {
- log.info("Enabling Due Date Indicator Plugin");
- eventPublisher.register(this);
- }
- @Override
- public void destroy() throws Exception {
- log.info("Disabling Due Date Indicator plugin");
- eventPublisher.unregister(this);
- }
- @EventListener
- public void onIssueEvent(IssueEvent issueEvent) {
- ChangeHistoryManager changeHistoryManager = ComponentAccessor.getChangeHistoryManager();
- Long eventTypeId = issueEvent.getEventTypeId();
- Issue issue = issueEvent.getIssue();
- Collection<CustomField> fieldsToUpdate = findDueDateIndicatorFields(customFieldManager.getCustomFieldObjects(issue));
- if (eventTypeId.equals(EventType.ISSUE_CREATED_ID)
- || eventTypeId.equals(EventType.ISSUE_UPDATED_ID)) {
- log.info("Issue Listener from Due Date Indivator Plugin");
- if(issueEvent.getChangeLog() != null && issueEvent.getChangeLog().getLong("id") != null){
- ChangeHistory history = changeHistoryManager.getChangeHistoryById(issueEvent.getChangeLog().getLong("id"));
- for (ChangeItemBean changeItem : history.getChangeItemBeans() ) {
- if(changeItem.getField().contains("duedate")){
- log.info("Due date has been updated. Custom field will be updated.");
- //implement logic here to update due date
- if(issue.getResolution() == null)
- {
- for (CustomField field : fieldsToUpdate) {
- String valueToSet = null;
- if (changeItem.getTo() != null){
- Instant t1 = Instant.now();
- Instant t2 = Instant.ofEpochMilli(issue.getDueDate().getTime());
- valueToSet = Long.toString(ChronoUnit.MILLIS.between(t1, t2));
- }
- issueInputParameters.addCustomFieldValue(field.getIdAsLong(), valueToSet);
- updateValidationResult = issueService.validateUpdate(ComponentAccessor.getJiraAuthenticationContext().getLoggedInUser(), issue.getId(), issueInputParameters);
- updateIssue(updateValidationResult);
- }
- }
- }
- }
- }
- }
- if(eventTypeId.equals(EventType.ISSUE_RESOLVED_ID)
- || eventTypeId.equals(EventType.ISSUE_CLOSED_ID)
- || eventTypeId.equals(EventType.ISSUE_GENERICEVENT_ID)){
- //Set Over Due field value to null if issue has been resolved
- if(issueEvent.getChangeLog() != null && issueEvent.getChangeLog().getLong("id") != null){
- ChangeHistory history = changeHistoryManager.getChangeHistoryById(issueEvent.getChangeLog().getLong("id"));
- for (ChangeItemBean changeItem : history.getChangeItemBeans() ) {
- if(changeItem.getField().contains("resolution")){
- log.info("Resolution been updated. Custom field will be updated.");
- //implement logic here to update due date
- for (CustomField field : fieldsToUpdate) {
- String valueToSet = null;
- if (changeItem.getTo() == null){
- Instant t1 = Instant.now();
- Instant t2 = Instant.ofEpochMilli(issue.getDueDate().getTime());
- valueToSet = Long.toString(ChronoUnit.MILLIS.between(t1, t2));
- }
- issueInputParameters.addCustomFieldValue(field.getIdAsLong(), valueToSet);
- updateValidationResult = issueService.validateUpdate(ComponentAccessor.getJiraAuthenticationContext().getLoggedInUser(), issue.getId(), issueInputParameters);
- updateIssue(updateValidationResult);
- }
- }
- }
- }
- }
- }
- private void updateIssue(IssueService.UpdateValidationResult updateValidationResult){
- if (updateValidationResult.isValid()) {
- IssueService.IssueResult updateResult = issueService.update(ComponentAccessor.getJiraAuthenticationContext().getLoggedInUser(), updateValidationResult);
- if (!updateResult.isValid()) {
- log.info("ISSUE has NOT been updated. Errors: {}\n", updateResult.getErrorCollection().toString());
- } else {
- log.info("ISSUE has been updated.\n");
- }
- } else {
- log.info("ISSUE has NOT been updated. Errors: {}\n", updateValidationResult.getErrorCollection().toString());
- }
- }
- private Collection<CustomField> findDueDateIndicatorFields(Collection<CustomField> fields){
- Collection<CustomField> found = new ArrayList<CustomField>();
- for(CustomField field:fields){
- if(field.getCustomFieldType().getKey().equalsIgnoreCase("com.stygian.jira.plugins.overdue:over-due-custom-field")){
- found.add(field);
- }
- }
- return found;
- }
- }