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

Events 在事件处理程序(Jira 7.x)中获取以前的问题状态,events,event-handling,jira-plugin,Events,Event Handling,Jira Plugin,我有一个Jira插件,需要监听IssueEvents并响应各种状态转换(如“to Do->in Progress”,“in Progress->Done”等)。在大多数情况下,执行此操作需要了解当前和以前的问题状态。但是,没有明显的API可以从IssueEvent获取后一位信息 我的设置相当简单: @Named("myEventListener") public class JiraChangeListener implements InitializingBean, DisposableBea

我有一个Jira插件,需要监听
IssueEvent
s并响应各种状态转换(如“to Do->in Progress”,“in Progress->Done”等)。在大多数情况下,执行此操作需要了解当前和以前的问题状态。但是,没有明显的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版本并不重要。

找到了一些有用的信息,并将以下内容放在一起:

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();
}
私有字符串getPreviousStatusId(问题问题,问题事件){
试一试{
GenericValue changeLog=event.getChangeLog();
HashMap字段=新的HashMap();
fields.put(“group”,changeLog.get(“id”);
列表更改=changeLog.internalDelegator.findByAnd(“更改项”,字段);
for(GenericValue changeVal:changes){
字符串字段=changeVal.getString(“字段”);
如果(“状态”。等于(字段)){
返回changeVal.getString(“oldvalue”);
}
}
}
捕获(例外e){
e、 printStackTrace();
}
//如果“状态”字段没有更改(或我们出错),只需返回问题的当前状态即可
返回问题。getStatusId();
}
工作起来很有魅力