2016-09-02 1 views
1

Ich habe ein Jira-Plugin, das auf IssueEvent s hören und auf verschiedene Statusübergänge reagieren muss (wie in "Zu erledigen -> In Bearbeitung", "In Bearbeitung -> Fertig "usw.). In den meisten Fällen müssen dazu sowohl der aktuelle als auch der vorherige Ausgabestatus bekannt sein. Allerdings gibt es keine offensichtliche API, um das letzte bisschen Information von der IssueEvent zu bekommen.Erhalte den vorherigen Ausgabestatus im Event-Handler (Jira 7.x)

Mein Setup ist ziemlich einfach:

@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); 
      } 
     } 
    } 
} 

So ist der einzige Haken ist, mit der Zeile, die sagt:

String oldStatus = [???]; 

Was die richtige Art und Weise ist programmatisch die Ausgabe der vorherigen Status zu erhalten, oder auf andere Weise identifizieren, dass das Ereignis empfangen wurde weil der Status des Problems geändert hat?

Beachten Sie, dass ich mit Jira 7.x arbeite. Die Unterstützung für frühere Jira-Versionen ist kein Problem.

Antwort

1

Gefunden einige hilfreiche Informationen here und zusammen folgendes gesagt:

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(); 
} 

Arbeiten wie ein Charme.

Verwandte Themen