在事件处理程序中获取先前的问题状态(Jira 7.x)

时间:2016-09-02 05:43:28

标签: events event-handling jira-plugin

我有一个Jira插件需要收听IssueEvent并响应各种状态转换(如“待办事项 - >正在进行中”,“正在进行中 - >完成”等) 。在大多数情况下,执行此操作需要了解当前和先前的问题状态。但是,没有明显的API可以从IssueEvent获取后一部分信息。

我的设置非常简单:

@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 个答案:

答案 0 :(得分: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();
}

像魅力一样。

相关问题