PageRenderTime 42ms CodeModel.GetById 21ms RepoModel.GetById 0ms app.codeStats 0ms

/src/main/java/com/atlassian/plugins/tutorial/jira/reports/CreationReport.java

https://bitbucket.org/atlassian_tutorial/jira-report-plugin
Java | 128 lines | 115 code | 11 blank | 2 comment | 16 complexity | 8f16d3f0deeb4b355b61e364c2204303 MD5 | raw file
Possible License(s): Apache-2.0
  1. package com.atlassian.plugins.tutorial.jira.reports;
  2. import com.atlassian.core.util.DateUtils;
  3. import com.atlassian.jira.datetime.DateTimeFormatter;
  4. import com.atlassian.jira.datetime.DateTimeFormatterFactory;
  5. import com.atlassian.jira.datetime.DateTimeStyle;
  6. import com.atlassian.jira.issue.search.SearchException;
  7. import com.atlassian.jira.issue.search.SearchProvider;
  8. import com.atlassian.jira.jql.builder.JqlQueryBuilder;
  9. import com.atlassian.jira.plugin.report.impl.AbstractReport;
  10. import com.atlassian.jira.project.ProjectManager;
  11. import com.atlassian.jira.user.ApplicationUser;
  12. import com.atlassian.jira.util.ParameterUtils;
  13. import com.atlassian.jira.web.action.ProjectActionSupport;
  14. import com.atlassian.plugin.spring.scanner.annotation.component.Scanned;
  15. import com.atlassian.plugin.spring.scanner.annotation.imports.JiraImport;
  16. import com.atlassian.query.Query;
  17. import org.apache.log4j.Logger;
  18. import java.util.ArrayList;
  19. import java.util.Collection;
  20. import java.util.Date;
  21. import java.util.HashMap;
  22. import java.util.List;
  23. import java.util.Map;
  24. @Scanned
  25. public class CreationReport extends AbstractReport {
  26. private static final Logger log = Logger.getLogger(CreationReport.class);
  27. private static final int MAX_HEIGHT = 360;
  28. private long maxCount = 0;
  29. private Collection<Long> openIssuesCounts = new ArrayList<>();
  30. private Collection<String> formattedDates = new ArrayList<>();
  31. @JiraImport
  32. private final SearchProvider searchProvider;
  33. @JiraImport
  34. private final ProjectManager projectManager;
  35. private final DateTimeFormatter formatter;
  36. private Date startDate;
  37. private Date endDate;
  38. private Long interval;
  39. private Long projectId;
  40. public CreationReport(SearchProvider searchProvider, ProjectManager projectManager,
  41. @JiraImport DateTimeFormatterFactory dateTimeFormatterFactory) {
  42. this.searchProvider = searchProvider;
  43. this.projectManager = projectManager;
  44. this.formatter = dateTimeFormatterFactory.formatter().withStyle(DateTimeStyle.DATE).forLoggedInUser();
  45. }
  46. public String generateReportHtml(ProjectActionSupport action, Map params) throws Exception {
  47. //action.getLoggedInUser() since Jira 7.0.
  48. //getLoggedInApplicationUser() since Jira 5.2
  49. fillIssuesCounts(startDate, endDate, interval, action.getLoggedInUser(), projectId);
  50. List<Number> issueBarHeights = new ArrayList<>();
  51. if (maxCount > 0) {
  52. openIssuesCounts.forEach(issueCount ->
  53. issueBarHeights.add((issueCount.floatValue() / maxCount) * MAX_HEIGHT)
  54. );
  55. }
  56. Map<String, Object> velocityParams = new HashMap<>();
  57. velocityParams.put("startDate", formatter.format(startDate));
  58. velocityParams.put("endDate", formatter.format(endDate));
  59. velocityParams.put("openCount", openIssuesCounts);
  60. velocityParams.put("issueBarHeights", issueBarHeights);
  61. velocityParams.put("dates", formattedDates);
  62. velocityParams.put("maxHeight", MAX_HEIGHT);
  63. velocityParams.put("projectName", projectManager.getProjectObj(projectId).getName());
  64. velocityParams.put("interval", interval);
  65. return descriptor.getHtml("view", velocityParams);
  66. }
  67. private long getOpenIssueCount(ApplicationUser user, Date startDate, Date endDate, Long projectId) throws SearchException {
  68. JqlQueryBuilder queryBuilder = JqlQueryBuilder.newBuilder();
  69. Query query = queryBuilder.where().createdBetween(startDate, endDate).and().project(projectId).buildQuery();
  70. return searchProvider.searchCount(query, user);
  71. }
  72. private void fillIssuesCounts(Date startDate, Date endDate, Long interval, ApplicationUser user, Long projectId) throws SearchException {
  73. long intervalValue = interval * DateUtils.DAY_MILLIS;
  74. Date newStartDate;
  75. long count;
  76. while (startDate.before(endDate)) {
  77. newStartDate = new Date(startDate.getTime() + intervalValue);
  78. if (newStartDate.after(endDate))
  79. count = getOpenIssueCount(user, startDate, endDate, projectId);
  80. else
  81. count = getOpenIssueCount(user, startDate, newStartDate, projectId);
  82. if (maxCount < count)
  83. maxCount = count;
  84. openIssuesCounts.add(count);
  85. formattedDates.add(formatter.format(startDate));
  86. startDate = newStartDate;
  87. }
  88. }
  89. public void validate(ProjectActionSupport action, Map params) {
  90. try {
  91. startDate = formatter.parse(ParameterUtils.getStringParam(params, "startDate"));
  92. } catch (IllegalArgumentException e) {
  93. action.addError("startDate", action.getText("report.issuecreation.startdate.required"));
  94. log.error("Exception while parsing startDate");
  95. }
  96. try {
  97. endDate = formatter.parse(ParameterUtils.getStringParam(params, "endDate"));
  98. } catch (IllegalArgumentException e) {
  99. action.addError("endDate", action.getText("report.issuecreation.enddate.required"));
  100. log.error("Exception while parsing endDate");
  101. }
  102. interval = ParameterUtils.getLongParam(params, "interval");
  103. projectId = ParameterUtils.getLongParam(params, "selectedProjectId");
  104. if (interval == null || interval <= 0) {
  105. action.addError("interval", action.getText("report.issuecreation.interval.invalid"));
  106. log.error("Invalid interval");
  107. }
  108. if (projectId == null || projectManager.getProjectObj(projectId) == null){
  109. action.addError("selectedProjectId", action.getText("report.issuecreation.projectid.invalid"));
  110. log.error("Invalid projectId");
  111. }
  112. if (startDate != null && endDate != null && endDate.before(startDate)) {
  113. action.addError("endDate", action.getText("report.issuecreation.before.startdate"));
  114. log.error("Invalid dates: start date should be before end date");
  115. }
  116. }
  117. }