You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.

MetricsPage.java 6.2KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180
  1. /*
  2. * Copyright 2011 gitblit.com.
  3. *
  4. * Licensed under the Apache License, Version 2.0 (the "License");
  5. * you may not use this file except in compliance with the License.
  6. * You may obtain a copy of the License at
  7. *
  8. * http://www.apache.org/licenses/LICENSE-2.0
  9. *
  10. * Unless required by applicable law or agreed to in writing, software
  11. * distributed under the License is distributed on an "AS IS" BASIS,
  12. * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
  13. * See the License for the specific language governing permissions and
  14. * limitations under the License.
  15. */
  16. package com.gitblit.wicket.pages;
  17. import java.awt.Color;
  18. import java.awt.Dimension;
  19. import java.text.MessageFormat;
  20. import java.text.SimpleDateFormat;
  21. import java.util.ArrayList;
  22. import java.util.Calendar;
  23. import java.util.Collections;
  24. import java.util.Comparator;
  25. import java.util.List;
  26. import org.apache.wicket.PageParameters;
  27. import org.apache.wicket.markup.html.basic.Label;
  28. import org.eclipse.jgit.lib.Repository;
  29. import org.wicketstuff.googlecharts.Chart;
  30. import org.wicketstuff.googlecharts.ChartAxis;
  31. import org.wicketstuff.googlecharts.ChartAxisType;
  32. import org.wicketstuff.googlecharts.ChartProvider;
  33. import org.wicketstuff.googlecharts.ChartType;
  34. import org.wicketstuff.googlecharts.IChartData;
  35. import org.wicketstuff.googlecharts.LineStyle;
  36. import org.wicketstuff.googlecharts.MarkerType;
  37. import org.wicketstuff.googlecharts.ShapeMarker;
  38. import com.gitblit.models.Metric;
  39. import com.gitblit.utils.MetricUtils;
  40. import com.gitblit.utils.TimeUtils;
  41. import com.gitblit.wicket.WicketUtils;
  42. public class MetricsPage extends RepositoryPage {
  43. public MetricsPage(PageParameters params) {
  44. super(params);
  45. Repository r = getRepository();
  46. add(new Label("branchTitle", objectId));
  47. Metric metricsTotal = null;
  48. List<Metric> metrics = MetricUtils.getDateMetrics(r, objectId, true, null);
  49. metricsTotal = metrics.remove(0);
  50. if (metricsTotal == null) {
  51. add(new Label("branchStats", ""));
  52. } else {
  53. add(new Label("branchStats",
  54. MessageFormat.format("{0} commits and {1} tags in {2}", metricsTotal.count,
  55. metricsTotal.tag, TimeUtils.duration(metricsTotal.duration))));
  56. }
  57. insertLinePlot("commitsChart", metrics);
  58. insertBarPlot("dayOfWeekChart", getDayOfWeekMetrics(r, objectId));
  59. insertPieChart("authorsChart", getAuthorMetrics(r, objectId));
  60. }
  61. private void insertLinePlot(String wicketId, List<Metric> metrics) {
  62. if ((metrics != null) && (metrics.size() > 0)) {
  63. IChartData data = WicketUtils.getChartData(metrics);
  64. ChartProvider provider = new ChartProvider(new Dimension(500, 100), ChartType.LINE,
  65. data);
  66. ChartAxis dateAxis = new ChartAxis(ChartAxisType.BOTTOM);
  67. dateAxis.setLabels(new String[] { metrics.get(0).name,
  68. metrics.get(metrics.size() / 2).name, metrics.get(metrics.size() - 1).name });
  69. provider.addAxis(dateAxis);
  70. ChartAxis commitAxis = new ChartAxis(ChartAxisType.LEFT);
  71. commitAxis.setLabels(new String[] { "",
  72. String.valueOf((int) WicketUtils.maxValue(metrics)) });
  73. provider.addAxis(commitAxis);
  74. provider.setLineStyles(new LineStyle[] { new LineStyle(2, 4, 0), new LineStyle(0, 4, 1) });
  75. provider.addShapeMarker(new ShapeMarker(MarkerType.CIRCLE, Color.BLUE, 1, -1, 5));
  76. add(new Chart(wicketId, provider));
  77. } else {
  78. add(WicketUtils.newBlankImage(wicketId));
  79. }
  80. }
  81. private void insertBarPlot(String wicketId, List<Metric> metrics) {
  82. if ((metrics != null) && (metrics.size() > 0)) {
  83. IChartData data = WicketUtils.getChartData(metrics);
  84. ChartProvider provider = new ChartProvider(new Dimension(500, 100),
  85. ChartType.BAR_VERTICAL_SET, data);
  86. ChartAxis dateAxis = new ChartAxis(ChartAxisType.BOTTOM);
  87. List<String> labels = new ArrayList<String>();
  88. for (Metric metric : metrics) {
  89. labels.add(metric.name);
  90. }
  91. dateAxis.setLabels(labels.toArray(new String[labels.size()]));
  92. provider.addAxis(dateAxis);
  93. ChartAxis commitAxis = new ChartAxis(ChartAxisType.LEFT);
  94. commitAxis.setLabels(new String[] { "",
  95. String.valueOf((int) WicketUtils.maxValue(metrics)) });
  96. provider.addAxis(commitAxis);
  97. add(new Chart(wicketId, provider));
  98. } else {
  99. add(WicketUtils.newBlankImage(wicketId));
  100. }
  101. }
  102. private void insertPieChart(String wicketId, List<Metric> metrics) {
  103. if ((metrics != null) && (metrics.size() > 0)) {
  104. IChartData data = WicketUtils.getChartData(metrics);
  105. List<String> labels = new ArrayList<String>();
  106. for (Metric metric : metrics) {
  107. labels.add(metric.name);
  108. }
  109. ChartProvider provider = new ChartProvider(new Dimension(500, 200), ChartType.PIE, data);
  110. provider.setPieLabels(labels.toArray(new String[labels.size()]));
  111. add(new Chart(wicketId, provider));
  112. } else {
  113. add(WicketUtils.newBlankImage(wicketId));
  114. }
  115. }
  116. private List<Metric> getDayOfWeekMetrics(Repository repository, String objectId) {
  117. List<Metric> list = MetricUtils.getDateMetrics(repository, objectId, false, "E");
  118. SimpleDateFormat sdf = new SimpleDateFormat("E");
  119. Calendar cal = Calendar.getInstance();
  120. List<Metric> sorted = new ArrayList<Metric>();
  121. int firstDayOfWeek = cal.getFirstDayOfWeek();
  122. int dayOfWeek = cal.get(Calendar.DAY_OF_WEEK);
  123. // rewind date to first day of week
  124. cal.add(Calendar.DATE, firstDayOfWeek - dayOfWeek);
  125. for (int i = 0; i < 7; i++) {
  126. String day = sdf.format(cal.getTime());
  127. for (Metric metric : list) {
  128. if (metric.name.equals(day)) {
  129. sorted.add(metric);
  130. list.remove(metric);
  131. break;
  132. }
  133. }
  134. cal.add(Calendar.DATE, 1);
  135. }
  136. return sorted;
  137. }
  138. private List<Metric> getAuthorMetrics(Repository repository, String objectId) {
  139. List<Metric> authors = MetricUtils.getAuthorMetrics(repository, objectId, true);
  140. Collections.sort(authors, new Comparator<Metric>() {
  141. @Override
  142. public int compare(Metric o1, Metric o2) {
  143. if (o1.count > o2.count) {
  144. return -1;
  145. } else if (o1.count < o2.count) {
  146. return 1;
  147. }
  148. return 0;
  149. }
  150. });
  151. if (authors.size() > 10) {
  152. return authors.subList(0, 9);
  153. }
  154. return authors;
  155. }
  156. @Override
  157. protected String getPageName() {
  158. return getString("gb.metrics");
  159. }
  160. }