我有一个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版本的支持不是问题。
答案 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();
}
像魅力一样。