2016-09-02 3 views
1

У меня есть плагин Jira, которому необходимо прослушать IssueEvent s и ответить на различные переходы статуса (как в разделе «Делать -> Выполняется», «Выполняется» -> Готово "и т. Д.). В большинстве случаев выполнение этого требует знания как текущего, так и предыдущего статуса выпуска. Однако нет очевидного API для получения последнего бита информации из IssueEvent.Получить статус предыдущей версии в обработчике событий (Jira 7.x)

Моя установка довольно проста:

@Named("myEventListener") 
public class JiraChangeListener implements InitializingBean, DisposableBean { 
    @ComponentImport 
    private final EventPublisher eventPublisher; 

    @ComponentImport 
    private final CustomFieldManager fieldManager; 

    @ComponentImport 
    private final IssueManager issueManager; 

    @Inject 
    public JiraChangeListener(EventPublisher publisher, CustomFieldManager fieldManager, IssueManager issueManager) { 
     this.eventPublisher = publisher; 
     this.fieldManager = fieldManager; 
     this.issueManager = issueManager; 
    } 

    @EventListener 
    public void onIssueEvent(IssueEvent event) { 
     Issue issue = event.getIssue(); 
     long eventType = event.getEventTypeId(); 
     String issueStatus = issue.getStatusId(); //the *current* issue status 

     //[read various internal plugin settings] 

     //now handle the event  
     if (eventType == EventType.ISSUE_CREATED_ID) { 
      //triggered upon creation; we don't need the old status here 
      if (apiAvailable && issueStatus.equals(triggerStatus)) { 
       //we can do stuff (apiAvailable) and we should do stuff (issueStatus == triggerStatus) 
       doStuff(issue); 
      } 
     } 
     else if (eventType == EventType.ISSUE_GENERICEVENT_ID) { 
      //triggered upon any status transition (and possibly other actions); 
      //need to see if the status has actually been modified 
      String oldStatus = [???]; //FIXME: need to get the previous status here 
      boolean statusChanged = ! issueStatus.equals(oldStatus); 
      if (apiAvailable && statusChanged && issueStatus.equals(triggerStatus)) { 
       //we can do stuff (apiAvailable && statusChanged) and we should do stuff (issueStatus == triggerStatus) 
       doStuff(issue); 
      } 
     } 
    } 
} 

Так что единственный улов с линией, которая идет:

String oldStatus = [???]; 

Что правильный способ программно получить предыдущее состояние этого вопроса, либо иным образом определить, что событие получено , потому что статус вопроса изменился?

Обратите внимание, что я работаю с Jira 7.x. Поддержка предыдущих версий Jira не вызывает беспокойства.

ответ

1

Найдено некоторую полезную информацию here, и поставить следующие вместе:

private String getPreviousStatusId(Issue issue, IssueEvent event) { 
    try { 
     GenericValue changeLog = event.getChangeLog(); 

     HashMap<String, Object> fields = new HashMap<String,Object>(); 
     fields.put("group", changeLog.get("id")); 

     List<GenericValue> changes = changeLog.internalDelegator.findByAnd("ChangeItem", fields); 
     for(GenericValue changeVal : changes){ 
      String field = changeVal.getString("field"); 
      if ("status".equals(field)) { 
       return changeVal.getString("oldvalue"); 
      } 
     } 
    } 
    catch(Exception e) { 
     e.printStackTrace(); 
    } 

    //if no changes were made to the 'status' field (or we errored out), just return the issue's current status 
    return issue.getStatusId(); 
} 

работает как шарм.

Смежные вопросы