com.atlassian.greenhopper.web.rapid.chart
Class IssueCycleTimeCollector

java.lang.Object
  extended by com.atlassian.greenhopper.service.charts.AbstractIssueHistoryStatusCallback
      extended by com.atlassian.greenhopper.web.rapid.chart.IssueCycleTimeCollector
All Implemented Interfaces:
ChangeHistoryCallback<com.atlassian.jira.issue.status.Status>, IssueStatusHistoryCallback

public class IssueCycleTimeCollector
extends AbstractIssueHistoryStatusCallback

Calculates the raw data needed for the Control Chart. There are two things we're interested in: Time the issue spent in each column, and when it last left the column.

The collector runs over the Lucene change history and buffers the result data, from where it's later transferred into a REST template. There is some timezone conversion involved still which is slightly out of scope for this, and the REST data structure isn't easy to work with, but if it becomes a memory proplem (which I rather doubt for a report, load is not going to be that high), we could switch to a streaming solution that fills the REST template directly.

Author:
ahennecke

Nested Class Summary
static class IssueCycleTimeCollector.IssueTimesResult
          Result data in a shape that can be easily set in the REST template
 
Field Summary
static long DEFAULT_LEAVE_TIME
           
 
Fields inherited from class com.atlassian.greenhopper.service.charts.AbstractIssueHistoryStatusCallback
log
 
Constructor Summary
IssueCycleTimeCollector(java.util.List<Column> columns, java.util.Map<com.atlassian.jira.issue.status.Status,Column> columnsByStatus, org.joda.time.DateTime now, WorkRateData rateData)
           
 
Method Summary
 void after(com.atlassian.jira.issue.status.Status status)
          After one status is done, we're taking all the collected change data (now sorted by change time) and compute the result data.
 void changedFrom(java.lang.Long issueId, java.lang.String issueKey, org.joda.time.DateTime changeTime, com.atlassian.jira.issue.status.Status changedFromStatus)
          changed away from a status that is in the current column.
 void changedTo(java.lang.Long issueId, java.lang.String issueKey, org.joda.time.DateTime changeTime, com.atlassian.jira.issue.status.Status changedToStatus)
          changed to a status that is in the current column.
 java.util.Set<java.lang.String> getIssueKeys()
           
 IssueCycleTimeCollector.IssueTimesResult getIssueTimes(java.lang.String issueKey)
           
 org.joda.time.DateTime getNow()
           
 java.util.Collection<com.atlassian.jira.issue.status.Status> getStatuses()
           
 
Methods inherited from class com.atlassian.greenhopper.service.charts.AbstractIssueHistoryStatusCallback
before
 
Methods inherited from class java.lang.Object
clone, equals, finalize, getClass, hashCode, notify, notifyAll, toString, wait, wait, wait
 

Field Detail

DEFAULT_LEAVE_TIME

public static final long DEFAULT_LEAVE_TIME
See Also:
Constant Field Values
Constructor Detail

IssueCycleTimeCollector

public IssueCycleTimeCollector(java.util.List<Column> columns,
                               java.util.Map<com.atlassian.jira.issue.status.Status,Column> columnsByStatus,
                               org.joda.time.DateTime now,
                               WorkRateData rateData)
Method Detail

changedFrom

public void changedFrom(java.lang.Long issueId,
                        java.lang.String issueKey,
                        org.joda.time.DateTime changeTime,
                        com.atlassian.jira.issue.status.Status changedFromStatus)
changed away from a status that is in the current column. That can be a change inside the column as well, we don't know that at this point.

Specified by:
changedFrom in interface ChangeHistoryCallback<com.atlassian.jira.issue.status.Status>
Overrides:
changedFrom in class AbstractIssueHistoryStatusCallback
changeTime - : time when the change was performed, in UTC
changedFromStatus - : the old value the issue has changed from (e.g. old status or version ID)

changedTo

public void changedTo(java.lang.Long issueId,
                      java.lang.String issueKey,
                      org.joda.time.DateTime changeTime,
                      com.atlassian.jira.issue.status.Status changedToStatus)
changed to a status that is in the current column.

Specified by:
changedTo in interface ChangeHistoryCallback<com.atlassian.jira.issue.status.Status>
Overrides:
changedTo in class AbstractIssueHistoryStatusCallback
changeTime - : time when the change was performed, in UTC
changedToStatus - : the new value (e.g. Status or fix version ID) the issue has changed to

after

public void after(com.atlassian.jira.issue.status.Status status)
After one status is done, we're taking all the collected change data (now sorted by change time) and compute the result data. This helps reducing memory

Specified by:
after in interface ChangeHistoryCallback<com.atlassian.jira.issue.status.Status>
Overrides:
after in class AbstractIssueHistoryStatusCallback

getStatuses

public java.util.Collection<com.atlassian.jira.issue.status.Status> getStatuses()
Returns:
The statuses to query for. Callbacks will be for each status in the collection, for all issues according to getQuery(), in the order of the collection.

getIssueKeys

public java.util.Set<java.lang.String> getIssueKeys()
Returns:
all the issues that we've gathered data for

getIssueTimes

public IssueCycleTimeCollector.IssueTimesResult getIssueTimes(java.lang.String issueKey)
Returns:
the data per issue and column, in the correct format for the chart JS (array where column position denotes index)

getNow

public org.joda.time.DateTime getNow()


Copyright © 2007-2014 Atlassian. All Rights Reserved.